void TextLayer_Init( LCUI_TextLayer *layer ) { layer->max_width = 0; layer->max_height = 0; layer->offset_x = 0; layer->offset_y = 0; layer->new_offset_x = 0; layer->new_offset_y = 0; layer->insert_x = 0; layer->insert_y = 0; layer->is_mulitiline_mode = FALSE; layer->is_autowrap_mode = FALSE; layer->is_using_style_tags = FALSE; layer->is_using_buffer = TRUE; layer->text_align = TEXT_ALIGN_LEFT; layer->row_list.max_rows = 0; layer->row_list.rows = 0; layer->row_list.rowdata = NULL; TextStyle_Init( &layer->text_style ); TaskData_Init( &layer->task ); DirtyRectList_Init( &layer->dirty_rect ); Graph_Init( &layer->graph ); TextRowList_InsertNewRow( &layer->row_list, 0 ); layer->graph.color_type = COLOR_TYPE_ARGB; }
/** 清除已记录的无效矩形 */ void TextLayer_ClearInvalidRect( LCUI_TextLayer *layer ) { int n; LCUI_Rect *rect_ptr; LCUI_Graph invalid_graph; if( !layer->is_using_buffer ) { DirtyRectList_Destroy( &layer->dirty_rect ); DirtyRectList_Init( &layer->dirty_rect ); return; } n = LinkedList_GetTotal( &layer->dirty_rect ); LinkedList_Goto( &layer->dirty_rect, 0 ); while(n--) { rect_ptr = (LCUI_Rect*)LinkedList_Get( &layer->dirty_rect ); Graph_Quote( &invalid_graph, &layer->graph, rect_ptr ); Graph_FillAlpha( &invalid_graph, 0 ); LinkedList_ToNext( &layer->dirty_rect ); } DirtyRectList_Destroy( &layer->dirty_rect ); DirtyRectList_Init( &layer->dirty_rect ); }
/** 更新各种图形元素的显示 */ static void LCUIDisplay_Update(void) { int i, n, j, m; LCUI_Rect *p_rect; SurfaceRecord *p_sr; LCUI_DirtyRectList rlist; LCUI_PaintContext paint; DirtyRectList_Init( &rlist ); n = LinkedList_GetTotal( &display.surfaces ); /* 遍历当前的 surface 记录列表 */ for( i=0; i<n; ++i ) { LinkedList_Goto( &display.surfaces, i ); p_sr = (SurfaceRecord*) LinkedList_Get( &display.surfaces ); if( !p_sr->widget || !p_sr->surface || !Surface_IsReady(p_sr->surface) ) { continue; } /* 更新表面 */ Surface_Update( p_sr->surface ); /* 收集无效区域记录 */ Widget_ProcInvalidArea( p_sr->widget, &rlist ); m = LinkedList_GetTotal( &rlist ); DEBUG_MSG("proc invalid area, m = %d\n", m); LinkedList_Goto( &rlist, 0 ); /* 在 surface 上逐个重绘无效区域 */ for( j=0; j<m; ++j ) { p_rect = (LCUI_Rect*)LinkedList_Get( &rlist ); paint = Surface_BeginPaint( p_sr->surface, p_rect ); DEBUG_MSG( "[%s]: render rect: (%d,%d,%d,%d), %d\n", p_sr->widget->type, paint->rect.left, paint->rect.top, paint->rect.w, paint->rect.h, j ); Widget_Render( p_sr->widget, paint ); Surface_EndPaint( p_sr->surface, paint ); LinkedList_Delete( &rlist ); } if( m > 0 ) { Surface_Present( p_sr->surface ); } } LinkedList_Destroy( &rlist ); }
/** 构造函数 */ static void $(Init)( LCUI_Widget widget ) { widget->style.z_index = 0; widget->style.x.type = SVT_NONE; widget->style.y.type = SVT_NONE; widget->style.width.type = SVT_AUTO; widget->style.height.type = SVT_AUTO; widget->style.box_sizing = CONTENT_BOX; widget->style.opacity = 1.0; widget->style.margin.top.px = 0; widget->style.margin.right.px = 0; widget->style.margin.bottom.px = 0; widget->style.margin.left.px = 0; widget->style.margin.top.type = SVT_PX; widget->style.margin.right.type = SVT_PX; widget->style.margin.bottom.type = SVT_PX; widget->style.margin.left.type = SVT_PX; widget->style.padding.top.px = 0; widget->style.padding.right.px = 0; widget->style.padding.bottom.px = 0; widget->style.padding.left.px = 0; widget->style.padding.top.type = SVT_PX; widget->style.padding.right.type = SVT_PX; widget->style.padding.bottom.type = SVT_PX; widget->style.padding.left.type = SVT_PX; widget->event = LCUIEventBox_Create(); memset( &widget->base, 0, sizeof(widget->base)); widget->parent = NULL; widget->title = NULL; widget->event = LCUIEventBox_Create(); Widget_InitTaskBox( widget ); Background_Init( &widget->style.background ); BoxShadow_Init( &widget->style.shadow ); Border_Init( &widget->style.border ); LinkedList_Init( &widget->children, sizeof(struct LCUI_WidgetFull) ); LinkedList_Init( &widget->children_show, 0 ); LinkedList_SetDestroyFunc( &widget->children, $(OnDestroy) ); LinkedList_SetDataNeedFree( &widget->children, TRUE ); LinkedList_SetDataNeedFree( &widget->children_show, FALSE ); DirtyRectList_Init( &widget->dirty_rects ); Graph_Init( &widget->graph ); }