九鼎创展论坛中文版English
登录 | 立即注册 设为首页收藏本站 切换到宽版
查看: 3502|回复: 5
打印 上一主题 下一主题

map_software_fill函数

[复制链接]
跳转到指定楼层
楼主
发表于 2014-10-10 11:13:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 laotang365 于 2014-10-10 15:28 编辑

本帖以map_software_fill为例,分析S5PV210裸机例程中GUI代码实现。
  1. bool_t map_software_fill(struct surface_t * surface,
  2.                 struct rect_t * rect, u32_t c, enum blend_mode mode)//用色彩 c 填充目标矩形区域
  3. {
  4.         struct rect_t clipped;

  5.         if (!surface)
  6.                 return FALSE;

  7.         if (!surface->pixels)
  8.                 return FALSE;

  9.         if (surface->info.bits_per_pixel < 8)
  10.                 return FALSE;

  11.         if (rect)
  12.         {
  13.                 if (!rect_intersect(rect, &surface->clip, &clipped))//用clip修正目标矩形,clip其实就是全屏幕,修正后防止rect超出屏幕范围,FALSE则说明矩形不在屏幕内
  14.                 {
  15.                         return TRUE;//矩形不在屏幕内,返回TRUE
  16.                 }
  17.                 rect = &clipped;//在屏幕内,得到修正后的矩形
  18.         }
  19.         else
  20.         {
  21.                 rect = &surface->clip;//rect为0则填充全屏幕
  22.         }

  23.         if(mode == BLEND_MODE_REPLACE)//替换方式
  24.         {
  25.                 software_fill_replace(surface, rect, c);
  26.         }
  27.         else if(mode == BLEND_MODE_ALPHA)//透明叠加方式
  28.         {
  29.                 software_fill_alpha(surface, rect, c);
  30.         }
  31.         else
  32.         {
  33.                 return FALSE;
  34.         }

  35.         return TRUE;
  36. }
复制代码
先看software_fill_replace(surface, rect, c);
按bytes_per_pixel(1,2,3,4 byte)不同对应4个函数,没啥好说的。
重点在于software_fill_alpha(surface, rect, c);
  1. static inline void software_fill_alpha(struct surface_t * surface,
  2.                 struct rect_t * rect, u32_t c)
  3. {
  4.         struct color_t dcol, scol;//color_t结构体有4个成员:r,g,b,a,其中a表示alpha
  5.         struct color_t col;
  6.         u32_t dc;
  7.         u8_t alpha;//透明度
  8.         u32_t x, y, w, h;
  9.         s32_t i, j;

  10.         unmap_pixel_color(&surface->info, c, &scol);//按照pixel_info像素格式将色彩c填入col中,其实格式在初始化时已经确定为8 8 8 8 = A B G R
  11.         alpha = scol.a;

  12.         if(alpha == 0xff)//透明度%100,图层不透明
  13.         {
  14.                 software_fill_replace(surface, rect, c);//直接填充,返回
  15.                 return;
  16.         }

  17.         if(alpha == 0)//完全透明,不需填充
  18.                 return;

  19.         x = rect->x;
  20.         y = rect->y;
  21.         w = rect->w;
  22.         h = rect->h;
  23.         //下面又是按bytes_per_pixel不同分四种情况,我只看第四种bytes_per_pixel = 4
  24.         switch (surface->info.bytes_per_pixel)
  25.         {
  26.         case 1:
  27.         {
  28.                 u8_t * p = (u8_t *)surface_sw_get_pointer(surface, x, y);
  29.                 u32_t skip = surface->pitch - w;

  30.                 for(j = 0; j < h; j++)
  31.                 {
  32.                         for(i = 0; i < w; i++)
  33.                         {
  34.                                 unmap_pixel_color(&surface->info, *p, &dcol);

  35.                                 col.r = (((scol.r - dcol.r) * alpha) >> 8) + dcol.r;
  36.                                 col.g = (((scol.g - dcol.g) * alpha) >> 8) + dcol.g;
  37.                                 col.b = (((scol.b - dcol.b) * alpha) >> 8) + dcol.b;
  38.                                 col.a = (((scol.a - dcol.a) * alpha) >> 8) + dcol.a;

  39.                                 *p = map_pixel_color(&surface->info, &col);
  40.                                 p++;
  41.                         }
  42.                         p += skip;
  43.                 }

  44.                 break;
  45.         }

  46.         case 2:
  47.         {
  48.                 u16_t * p = (u16_t *)surface_sw_get_pointer(surface, x, y);
  49.                 u32_t skip = (surface->pitch - 2 * w) / 2;

  50.                 for(j = 0; j < h; j++)
  51.                 {
  52.                         for(i = 0; i < w; i++)
  53.                         {
  54.                                 unmap_pixel_color(&surface->info, *p, &dcol);

  55.                                 col.r = (((scol.r - dcol.r) * alpha) >> 8) + dcol.r;
  56.                                 col.g = (((scol.g - dcol.g) * alpha) >> 8) + dcol.g;
  57.                                 col.b = (((scol.b - dcol.b) * alpha) >> 8) + dcol.b;
  58.                                 col.a = (((scol.a - dcol.a) * alpha) >> 8) + dcol.a;

  59.                                 *p = map_pixel_color(&surface->info, &col);
  60.                                 p++;
  61.                         }
  62.                         p += skip;
  63.                 }

  64.                 break;
  65.         }

  66.         case 3:
  67.         {
  68.                 for(j = 0; j < h; j++)
  69.                 {
  70.                         for(i = 0; i < w; i++)
  71.                         {
  72.                                 dc = surface_sw_get_pixel(surface, x + i, y + j);
  73.                                 unmap_pixel_color(&surface->info, dc, &dcol);

  74.                                 col.r = (((scol.r - dcol.r) * alpha) >> 8) + dcol.r;
  75.                                 col.g = (((scol.g - dcol.g) * alpha) >> 8) + dcol.g;
  76.                                 col.b = (((scol.b - dcol.b) * alpha) >> 8) + dcol.b;
  77.                                 col.a = (((scol.a - dcol.a) * alpha) >> 8) + dcol.a;

  78.                                 dc = map_pixel_color(&surface->info, &col);
  79.                                 surface_sw_set_pixel(surface, x + i, y + j, dc);
  80.                         }
  81.                 }
  82.                 break;
  83.         }

  84.         case 4:
  85.         {
  86.                 u32_t * p = (u32_t *)surface_sw_get_pointer(surface, x, y);//获取矩形起点的地址
  87.                 u32_t skip = (surface->pitch - 4 * w) / 4;//计算非矩形区域的宽度,即填充到边缘时应跳过的地址长度,单位为32bit双字,

  88.                 for(j = 0; j < h; j++)
  89.                 {
  90.                         for(i = 0; i < w; i++)
  91.                         {
  92.                                 unmap_pixel_color(&surface->info, *p, &dcol);//取出目的地址的色彩信息到dcol
  93.                                 //alpha为8bit,可以这样计算:col.r =  (scol.r - dcol.r) * (alpha /256) + dcol.r
  94.                                 //当alpha为最大值0xff即255时, 近似:col.r = scol.r,相当于不填充。当当alpha为0时, 近似:col.r = dcol.r,相当于完全覆盖。
  95.                                 col.r = (((scol.r - dcol.r) * alpha) >> 8) + dcol.r;
  96.                                 col.g = (((scol.g - dcol.g) * alpha) >> 8) + dcol.g;
  97.                                 col.b = (((scol.b - dcol.b) * alpha) >> 8) + dcol.b;
  98.                                 col.a = (((scol.a - dcol.a) * alpha) >> 8) + dcol.a;

  99.                                 *p = map_pixel_color(&surface->info, &col);
  100.                                 p++;
  101.                         }
  102.                         p += skip;
  103.                 }
  104.                 break;
  105.         }

  106.         default:
  107.                 break;
  108.         }
  109. }
复制代码
还差一个函数没看懂:map_software_scale,干嘛用的,求解释
稍微吐槽一下,九鼎给的代码注释真是太少了(几乎没有~~),好歹给个函数功能说明啊...
回复

使用道具 举报

沙发
发表于 2014-11-25 14:07:30 | 只看该作者
map_software_scale,实现surface缩放功能
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2014-11-25 14:14:07 | 只看该作者
jjj 发表于 2014-11-25 14:07
map_software_scale,实现surface缩放功能

楼上正解,谢谢
回复 支持 反对

使用道具 举报

地板
发表于 2014-11-25 19:50:13 | 只看该作者
裸机maps相关的api函数中,其实还有一个关键函数没有实现,transform对surface进行矩阵变换,有了这个接口,就可以对surface对象做各种特效处理了。因为xboot后面利用了高质量的开源2D图形库Cairo,火狐浏览器的渲染组件就是基于此库,包括GTK。所以,就没有继续完善此编程接口了,对于裸机已经足够了,但是对于未来支持GUI的xboot来说,就远远不够了,引入高质量的图形库,才是正道
回复 支持 反对

使用道具 举报

5#
 楼主| 发表于 2014-11-27 17:36:54 | 只看该作者
jjj 发表于 2014-11-25 19:50
裸机maps相关的api函数中,其实还有一个关键函数没有实现,transform对surface进行矩阵变换,有了这个接口, ...

楼上正解,谢谢军哥,裸机maps代码是参考自什么库呢?
回复 支持 反对

使用道具 举报

6#
发表于 2014-11-28 15:38:25 | 只看该作者
这个图形操作相关的API借鉴了GRUB的实现,其实GRUB里面有很多代码可以值得阅读,比如只读型虚拟文件系统框架,基于字符界面的TUI框架等等
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳市九鼎创展科技官方论坛 ( 粤ICP备11028681号-2  

GMT+8, 2024-11-22 17:52 , Processed in 0.019828 second(s), 16 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表