/** 创建一个事件容器实例 */ LCUI_EventBox $(Create)(void) { LCUI_EventBox box; box = NEW_ONE(struct LCUI_EventBoxRec_); box->event_id = 100; box->handler_id = 100; box->current = 0; RBTree_Init( &box->event_slot ); RBTree_Init( &box->event_name ); RBTree_Init( &box->event_handler ); RBTree_Init( &box->used_evnet_id ); RBTree_OnJudge( &box->event_name, CompareEventName ); RBTree_OnDestroy( &box->event_handler, DestroyEventHandler ); RBTree_OnDestroy( &box->event_slot, DestroyEventSlot ); RBTree_SetDataNeedFree( &box->event_handler, 0 ); RBTree_SetDataNeedFree( &box->event_name, 0 ); RBTree_SetDataNeedFree( &box->used_evnet_id, 0 ); LinkedList_Init( &box->events[0], sizeof(LCUI_Event) ); LinkedList_Init( &box->events[1], sizeof(LCUI_Event) ); LinkedList_SetDataNeedFree( &box->events[0], 1 ); LinkedList_SetDataNeedFree( &box->events[1], 1 ); LinkedList_SetDestroyFunc( &box->events[0], DestroyEvent ); LinkedList_SetDestroyFunc( &box->events[1], DestroyEvent ); return box; }
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 ); }
LCUI_API LCUI_FontBMP* FontLIB_AddFontBMP( wchar_t char_code, int font_id, int pixel_size, LCUI_FontBMP *fontbmp ) { LCUI_FontBMP *bmp_cache; LCUI_RBTree *tree_font, *tree_bmp; if( !fontlib.is_inited ) { return NULL; } /* 获取字符的字体信息集 */ tree_font = (LCUI_RBTree*) RBTree_GetData( &fontlib.bitmap_cache, char_code ); if( !tree_font ) { tree_font = (LCUI_RBTree*)malloc( sizeof(LCUI_RBTree) ); if( !tree_font ) { return NULL; } RBTree_Init( tree_font ); RBTree_SetDataNeedFree( tree_font, TRUE ); RBTree_OnDestroy( tree_font, FontLIB_DestroyTreeNode ); RBTree_Insert( &fontlib.bitmap_cache, char_code, tree_font ); } /* 当字体ID不大于0时,使用内置字体 */ if( font_id <= 0 ) { font_id = fontlib.incore_font->id; } /* 获取相应字体样式标识号的字体位图库 */ tree_bmp = (LCUI_RBTree*)RBTree_GetData( tree_font, font_id ); if( !tree_bmp ) { tree_bmp = (LCUI_RBTree*)malloc( sizeof(LCUI_RBTree) ); if( !tree_bmp ) { return NULL; } RBTree_Init( tree_bmp ); RBTree_OnDestroy( tree_bmp, FontLIB_DestroyFontBitmap ); RBTree_SetDataNeedFree( tree_bmp, TRUE ); RBTree_Insert( tree_font, font_id, tree_bmp ); } /* 在字体位图库中获取指定像素大小的字体位图 */ bmp_cache = (LCUI_FontBMP*)RBTree_GetData( tree_bmp, pixel_size ); if( !bmp_cache ) { bmp_cache = (LCUI_FontBMP*)malloc( sizeof(LCUI_FontBMP) ); if( !bmp_cache ) { return NULL; } RBTree_Insert( tree_bmp, pixel_size, bmp_cache ); } /* 拷贝数据至该空间内 */ memcpy( bmp_cache, fontbmp, sizeof(LCUI_FontBMP) ); return bmp_cache; }
void LCUI_InitKeyboard(void) { LCUIMutex_Init(&self.mutex); RBTree_Init(&self.state_tree); RBTree_OnDestroy(&self.state_tree, free); LCUI_BindEvent(LCUI_KEYDOWN, OnKeyboardEvent, NULL, NULL); LCUI_BindEvent(LCUI_KEYUP, OnKeyboardEvent, NULL, NULL); }
void LCUIWidget_InitRenderer( void ) { RBTree_Init( &self.groups ); RBTree_OnCompare( &self.groups, OnCompareGroup ); RBTree_OnDestroy( &self.groups, OnDestroyGroup ); LinkedList_Init( &self.rects ); self.active = TRUE; }
void FontLIB_Init( void ) { if( fontlib.is_inited ) { return; } RBTree_Init( &fontlib.bitmap_cache ); RBTree_Init( &fontlib.info_cache ); RBTree_OnDestroy( &fontlib.bitmap_cache, FontLIB_DestroyTreeNode ); RBTree_SetDataNeedFree( &fontlib.bitmap_cache, TRUE ); RBTree_SetDataNeedFree( &fontlib.info_cache, TRUE ); #ifdef LCUI_FONT_ENGINE_FREETYPE /* 当初始化库时发生了一个错误 */ if( FT_Init_FreeType(&fontlib.library) ) { _DEBUG_MSG("failed to initialize.\n"); return; } #else fontlib.library = NULL; #endif fontlib.is_inited = TRUE; }