MTK 中断

MTK 中断

MTK

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();

}

 

 

你可能感兴趣的:(UI,null,buffer,border,MTK,layer)