static void AsyncLoadImage( LCUI_Widget widget, const char *path ) { ImageCache cache; LCUI_Task task = {0}; LCUI_Style *s = &widget->cached_style->sheet[key_background_image]; if( !is_inited ) { RBTree_Init( &images ); RBTree_Init( &refs ); RBTree_OnJudge( &refs, OnCompareWidget ); RBTree_OnJudge( &images, OnComparePath ); RBTree_OnDestroy( &refs, free ); RBTree_OnDestroy( &images, OnDestroyCache ); is_inited = TRUE; } if( s->is_valid && s->type == SVT_STRING ) { cache = RBTree_CustomGetData( &images, s->string ); if( cache ) { DelRef( widget, cache ); } } cache = RBTree_CustomGetData( &images, path ); if( cache ) { AddRef( widget, cache ); Graph_Quote( &widget->computed_style.background.image, &cache->image, NULL ); Widget_AddTask( widget, WTT_BODY ); return; } task.func = ExecLoadImage; task.arg[0] = widget; task.arg[1] = strdup( path ); LCUI_AddTask( &task ); }
size_t Widget_GetInvalidArea( LCUI_Widget w, LinkedList *rects ) { LCUI_RectGroup group; if( !w || w == LCUIWidget_GetRoot() ) { LinkedList_Concat( rects, &self.rects ); return (size_t)rects->length; } group = RBTree_CustomGetData( &self.groups, w ); if( group ) { LinkedList_Concat( rects, &group->rects ); } return (size_t)rects->length; }
LCUI_BOOL Widget_InvalidateArea( LCUI_Widget widget, LCUI_RectF *in_rect, int box_type ) { int mode; LCUI_Rect area; LCUI_RectF rect; LCUI_Widget w = widget; LCUI_Widget root = LCUIWidget_GetRoot(); LCUI_RectGroup group; if( !w ) { w = root; } mode = LCUIDisplay_GetMode(); Widget_AdjustArea( w, in_rect, &rect, box_type ); rect.x += w->box.graph.x; rect.y += w->box.graph.y; while( w && w->parent ) { LCUIRectF_ValidateArea( &rect, w->parent->box.padding.width, w->parent->box.padding.height ); if( rect.width <= 0 || rect.height <= 0 ) { return FALSE; } if( mode != LCDM_SEAMLESS && w->parent == root ) { break; } w = w->parent; rect.x += w->box.padding.x; rect.y += w->box.padding.y; } RectFToInvalidArea( &rect, &area ); if( mode != LCDM_SEAMLESS ) { RectList_Add( &self.rects, &area ); return TRUE; } group = RBTree_CustomGetData( &self.groups, w ); if( !group ) { group = NEW( LCUI_RectGroupRec, 1 ); group->widget = w; LinkedList_Init( &group->rects ); RBTree_CustomInsert( &self.groups, w, group ); } return RectList_Add( &group->rects, &area ) == 0; }