/** 创建一个事件容器实例 */ 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; }
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 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; }