|
本帖最后由 laotang365 于 2014-10-10 15:28 编辑
本帖以map_software_fill为例,分析S5PV210裸机例程中GUI代码实现。- bool_t map_software_fill(struct surface_t * surface,
- struct rect_t * rect, u32_t c, enum blend_mode mode)//用色彩 c 填充目标矩形区域
- {
- struct rect_t clipped;
- if (!surface)
- return FALSE;
- if (!surface->pixels)
- return FALSE;
- if (surface->info.bits_per_pixel < 8)
- return FALSE;
- if (rect)
- {
- if (!rect_intersect(rect, &surface->clip, &clipped))//用clip修正目标矩形,clip其实就是全屏幕,修正后防止rect超出屏幕范围,FALSE则说明矩形不在屏幕内
- {
- return TRUE;//矩形不在屏幕内,返回TRUE
- }
- rect = &clipped;//在屏幕内,得到修正后的矩形
- }
- else
- {
- rect = &surface->clip;//rect为0则填充全屏幕
- }
- if(mode == BLEND_MODE_REPLACE)//替换方式
- {
- software_fill_replace(surface, rect, c);
- }
- else if(mode == BLEND_MODE_ALPHA)//透明叠加方式
- {
- software_fill_alpha(surface, rect, c);
- }
- else
- {
- return FALSE;
- }
- return TRUE;
- }
复制代码 先看software_fill_replace(surface, rect, c);
按bytes_per_pixel(1,2,3,4 byte)不同对应4个函数,没啥好说的。
重点在于software_fill_alpha(surface, rect, c);- static inline void software_fill_alpha(struct surface_t * surface,
- struct rect_t * rect, u32_t c)
- {
- struct color_t dcol, scol;//color_t结构体有4个成员:r,g,b,a,其中a表示alpha
- struct color_t col;
- u32_t dc;
- u8_t alpha;//透明度
- u32_t x, y, w, h;
- s32_t i, j;
- unmap_pixel_color(&surface->info, c, &scol);//按照pixel_info像素格式将色彩c填入col中,其实格式在初始化时已经确定为8 8 8 8 = A B G R
- alpha = scol.a;
- if(alpha == 0xff)//透明度%100,图层不透明
- {
- software_fill_replace(surface, rect, c);//直接填充,返回
- return;
- }
- if(alpha == 0)//完全透明,不需填充
- return;
- x = rect->x;
- y = rect->y;
- w = rect->w;
- h = rect->h;
- //下面又是按bytes_per_pixel不同分四种情况,我只看第四种bytes_per_pixel = 4
- switch (surface->info.bytes_per_pixel)
- {
- case 1:
- {
- u8_t * p = (u8_t *)surface_sw_get_pointer(surface, x, y);
- u32_t skip = surface->pitch - w;
- for(j = 0; j < h; j++)
- {
- for(i = 0; i < w; i++)
- {
- unmap_pixel_color(&surface->info, *p, &dcol);
- col.r = (((scol.r - dcol.r) * alpha) >> 8) + dcol.r;
- col.g = (((scol.g - dcol.g) * alpha) >> 8) + dcol.g;
- col.b = (((scol.b - dcol.b) * alpha) >> 8) + dcol.b;
- col.a = (((scol.a - dcol.a) * alpha) >> 8) + dcol.a;
- *p = map_pixel_color(&surface->info, &col);
- p++;
- }
- p += skip;
- }
- break;
- }
- case 2:
- {
- u16_t * p = (u16_t *)surface_sw_get_pointer(surface, x, y);
- u32_t skip = (surface->pitch - 2 * w) / 2;
- for(j = 0; j < h; j++)
- {
- for(i = 0; i < w; i++)
- {
- unmap_pixel_color(&surface->info, *p, &dcol);
- col.r = (((scol.r - dcol.r) * alpha) >> 8) + dcol.r;
- col.g = (((scol.g - dcol.g) * alpha) >> 8) + dcol.g;
- col.b = (((scol.b - dcol.b) * alpha) >> 8) + dcol.b;
- col.a = (((scol.a - dcol.a) * alpha) >> 8) + dcol.a;
- *p = map_pixel_color(&surface->info, &col);
- p++;
- }
- p += skip;
- }
- break;
- }
- case 3:
- {
- for(j = 0; j < h; j++)
- {
- for(i = 0; i < w; i++)
- {
- dc = surface_sw_get_pixel(surface, x + i, y + j);
- unmap_pixel_color(&surface->info, dc, &dcol);
- col.r = (((scol.r - dcol.r) * alpha) >> 8) + dcol.r;
- col.g = (((scol.g - dcol.g) * alpha) >> 8) + dcol.g;
- col.b = (((scol.b - dcol.b) * alpha) >> 8) + dcol.b;
- col.a = (((scol.a - dcol.a) * alpha) >> 8) + dcol.a;
- dc = map_pixel_color(&surface->info, &col);
- surface_sw_set_pixel(surface, x + i, y + j, dc);
- }
- }
- break;
- }
- case 4:
- {
- u32_t * p = (u32_t *)surface_sw_get_pointer(surface, x, y);//获取矩形起点的地址
- u32_t skip = (surface->pitch - 4 * w) / 4;//计算非矩形区域的宽度,即填充到边缘时应跳过的地址长度,单位为32bit双字,
- for(j = 0; j < h; j++)
- {
- for(i = 0; i < w; i++)
- {
- unmap_pixel_color(&surface->info, *p, &dcol);//取出目的地址的色彩信息到dcol
- //alpha为8bit,可以这样计算:col.r = (scol.r - dcol.r) * (alpha /256) + dcol.r
- //当alpha为最大值0xff即255时, 近似:col.r = scol.r,相当于不填充。当当alpha为0时, 近似:col.r = dcol.r,相当于完全覆盖。
- col.r = (((scol.r - dcol.r) * alpha) >> 8) + dcol.r;
- col.g = (((scol.g - dcol.g) * alpha) >> 8) + dcol.g;
- col.b = (((scol.b - dcol.b) * alpha) >> 8) + dcol.b;
- col.a = (((scol.a - dcol.a) * alpha) >> 8) + dcol.a;
- *p = map_pixel_color(&surface->info, &col);
- p++;
- }
- p += skip;
- }
- break;
- }
- default:
- break;
- }
- }
复制代码 还差一个函数没看懂:map_software_scale,干嘛用的,求解释
稍微吐槽一下,九鼎给的代码注释真是太少了(几乎没有~~),好歹给个函数功能说明啊... |
|