MTK平台有个图层的概念。每个层的数据存放在不同的buffer中,这些buffer可以从LCD对应的寄存器中读出。具体的自己去查对应平台的规格书吧。
MTK的平台是你在blockwrite中通过STARTLCDTRANSFER打开这个寄存器对应的位,然后硬件把每一层图像中对应的像素点取出,然后通过硬件合成,把合成后的数据通过你在LCD_DATA_ADDR中设置的端口地址找到LCD接口,送入LCD中显示。
1,首先由应用建立一个layer,开一个存放LCD数据的BUFFER,然后把这个BUFFER的地址赋给LCD寄存器
gdi_layer_blt_ext() >> CONFIG_HARDWARE_LAYER >> config_lcd_layer_window()
{......
DRV_WriteReg32(lcd_layer_base_addr+0x0C,layer_data->frame_buffer_address);
}
这样数据源已经关联起来了,其实这里还会设置宽度和高度这些信息.
2,准备好数据源之后开始发指令进行DMA传输
gdi_layer_blt_ext() >> lcd_fb_update() >> MainLCD->BlockWrite()
{
START_LCD_TRANSFER
}
--------------------------------------------------------------------------------------
每个背景就是一个图形或图像填充起来的矩形,只要初始化结构提UI_filled_area,然后交由函数gui_draw_filled_area画出来即可。
typedef struct _UI_filled_area {
U32 flags; //总控制标志
PU8 b; //背景图像 gradient_color *gc; //递进颜色 color c; //背景色 color ac; //替换色 color border_color; //边框颜色 color shadow_color; //阴影颜色 UI_transparent_color_type transparent_color; //透明色 } UI_filled_area;
flags = 类型标志|边框标志|阴影标志;
颜色为背景
void EntryScreenInternet(void) { UI_filled_area filler = {0}; EntryNewScreen(SCR_INT_MAIN, NULL, EntryScreenInternet, NULL);
entry_full_screen(); clear_screen_with_color(gui_color(0, 255, 0));
filler.flags = UI_FILLED_AREA_TYPE_COLOR|UI_FILLED_AREA_BORDER|UI_FILLED_AREA_SHADOW; filler.c = UI_COLOR_GREY; filler.border_color = UI_COLOR_DARK_GREY; filler.shadow_color = UI_COLOR_3D_FILLER; gui_draw_filled_area(20, 20, 156, 150, &filler);
ShowCategoryInternet();
SetKeyHandler(GoBackHistory, KEY_RSK, KEY_EVENT_UP);
}
递进颜色为背景
void EntryScreenInternet(void) { UI_filled_area filler = {0}; static color g_color[3] = {{255, 0, 0},{0, 255, 0},{0, 0, 255}}; static U8 perc[2] = {30, 70}; gradient_color gc = {g_color, perc, 3}; EntryNewScreen(SCR_INT_MAIN, NULL, EntryScreenInternet, NULL);
entry_full_screen(); clear_screen_with_color(gui_color(0, 255, 0));
filler.flags = UI_FILLED_AREA_TYPE_GRADIENT_COLOR; filler.gc = &gc; gui_draw_filled_area(20, 20, 156, 150, &filler);
ShowCategoryInternet();
SetKeyHandler(GoBackHistory, KEY_RSK, KEY_EVENT_UP);
}
递进色需要用到一个结构体gradient_color, 其定义如下:
typedef struct _gradient_color { color *c; 颜色列表,数量由最后一个参数N决定 U8 *p; 百分比列表,个数为N-1,依次表示两个相邻
颜色递进宽度占整个宽度的百分比 U8 n; 颜色数量 } gradient_color;
如上例,总共有三个颜色红,绿,蓝,其中红绿递进所占的百分比为30%,绿蓝递进所占的百分比为70%
另外还有两个参数控制递进色的显示方式:
UI_FILLED_AREA_HORIZONTAL_FILL: 水平方式递进显示,此为默认方式,可以不用设。 UI_FILLED_AREA_VERTICAL_FILL:垂直方式递进显示,从上到下递进显示。
UI_FILLED_AREA_FLIP_FILL:反转显示,将递进色从右至左,或从下至上显示。
图形为背景
void EntryScreenInternet(void) { UI_filled_area filler = {0}; EntryNewScreen(SCR_INT_MAIN, NULL, EntryScreenInternet, NULL);
entry_full_screen(); //clear_screen(); clear_screen_with_color(gui_color(0, 255, 0));
filler.flags = UI_FILLED_AREA_TYPE_BITMAP; filler.b = GetImage(IMG_GLOBAL_SUB_MENU_BG); gui_draw_filled_area(20, 20, 156, 150, &filler);
ShowCategoryInternet();
SetKeyHandler(GoBackHistory, KEY_RSK, KEY_EVENT_UP);
}
纹理为背景
纹理就是不停的用一副图填充背景,直到填满为止
filler.flags = UI_FILLED_AREA_TYPE_TEXTURE; filler.b = GetImage(IMG_FLEXIBLE_TITLEBAR_BG); gui_draw_filled_area(20, 20, 156, 150, &filler);
3D效果背景
filler.flags = UI_FILLED_AREA_TYPE_3D_BORDER; filler.c = UI_COLOR_GREY; gui_draw_filled_area(20, 20, 156, 150, &filler);
还有两种3D效果的背景
UI_FILLED_AREA_TYPE_CUSTOM_FILL_TYPE1
UI_FILLED_AREA_TYPE_CUSTOM_FILL_TYPE2
百页窗及十字纹
flags 等效的图像函数
UI_FILLED_AREA_TYPE_CROSS_HATCH_COLOR gui_cross_hatch_fill_rectangle
UI_FILLED_AREA_TYPE_HATCH_COLOR gui_hatch_fill_rectangle
UI_FILLED_AREA_TYPE_ALTERNATE_CROSS_HATCH_COLOR gui_alternate_cross_hatch_fill_rectangle
UI_FILLED_AREA_TYPE_ALTERNATE_HATCH_COLOR gui_alternate_hatch_fill_rectangle
背景动画
gdi_handle my_anim; void EntryScreenInternet(void) { EntryNewScreen(SCR_INT_MAIN, NULL, EntryScreenInternet, NULL);
entry_full_screen(); clear_screen_with_color(gui_color(0, 255, 0));
gdi_anim_draw_id(0, 0, IMG_ID_PHNSET_ON_0, my_anim)
ShowCategoryInternet();
} |