/
vTech
/
FcApps
Обзор
Документация
Войти
/
vTech
/
FcApps
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
FcLibs/FcUI/src/FcUI_Font.h
176 строк
7 KB
vTech
alpha_00
03 дек 2025, 17:45
03 дек 2025, 17:45
ab8382d
Код
Авторство
О чём код?
#ifndef _FCUI_FONT_H_ #define _FCUI_FONT_H_ #include "FcUI_Setting.h" #include "FcUI_Error.h" #include "FcUI_Object.h" #include "FcUI_Window.h" #include "FcUI_Algo/FcUI_Dictionary.h" #include "FcUI_Font/FcUI_Font_Config.h" #include "FcUI_Font/FcUI_Font_Basic.h" #include "FcUI_Font/FcUI_Font_SDF.h" #include "FcUI_Font/FcUI_Font_Curve2.h" FCUIDEF FcUI_Error_t FcUI_Font(FcUI_Font_t* pFont, FcUI_Window_t* pWindow, FcUI_Object_t* pObject); FCUIDEF FcImage_RGBA_t* FcUI_Font_getAtlas_Image(FcUI_Font_t* pFont); FCUIDEF size_t FcUI_Font_getAtlas_NumberObject(FcUI_Font_t* pFont); FCUIDEF FcFont_Atlas_Table_Data_t* FcUI_Font_getAtlas_GetTable(FcUI_Font_t* pFont); FCUIDEF FcUI_Error_t FcUI_Font_free(FcUI_Font_t* pFont); FCUIDEF FcUI_Error_t FcUI_Font(FcUI_Font_t* pFont, FcUI_Window_t* pWindow, FcUI_Object_t* pObject){ #define FCUI_ADD_DICTINARY_BASIC(mString, mOffset)\ if (mString[0]){for (j = 0; mString[j] && j < 256; j++);\ FCUISAFECALLF(mError, FcUI_Memory(&mText, (mOffset + j) * sizeof(TCHAR), sizeof(TCHAR))); \ FCUISAFECALL(mError, mText, FCUI_ERROR_OOM);\ FCUISAFECALLF(mError, FcUI_Memory_setData(mText, mOffset * sizeof(TCHAR), (uint8_t*)mString, j * sizeof(TCHAR)));\ mOffset += j;\ if (mText) { FCUISAFECALLF(mError, FcUI_Dictionary_1_TCHAR(&mDictionary, (TCHAR(*)[1])mText->mData)) }}; #define FCUI_OBJECT_ADD_DICTIONARY_BASIC(Object, objectType, mOffset)\ for (i = 0; m##objectType = FcUI_Object_get_##Object(pObject, i); i++) {\ for (j = 0; m##objectType->mText[j]; j++);\ FCUISAFECALLF(mError, FcUI_Memory(&mText, (mOffset + j + 1) * sizeof(TCHAR), sizeof(TCHAR))); \ FCUISAFECALL(mError, mText, FCUI_ERROR_OOM);\ FCUISAFECALLF(mError, FcUI_Memory_setData(mText, mOffset * sizeof(TCHAR), (uint8_t*)m##objectType->mText, j * sizeof(TCHAR)));\ mOffset += j;\ }\ if (mText) { mText->mData[mText->mSize - 1] = 0; FCUISAFECALLF(mError, FcUI_Dictionary_1_TCHAR(&mDictionary, (TCHAR(*)[1])mText->mData)) }; size_t i, j, mOffset; FcUI_Font_Config_t* mConfig; FcUI_Font_Config_t mFontSetting; FcUI_Button_t* mButton; FcUI_TextView_t* mTextView; FcUI_Dictionary_1_TCHAR_t mDictionary; FcUI_Memory_t* mText; FcFont_TrueType_systemFonts_t* mSystemFonts; FcUI_Error_t mError = FCUI_ERROR_NOERROR; mSystemFonts = NULL; mText = NULL; memset(&mDictionary, 0, sizeof(mDictionary)); FCUISAFECALL(mError, (pFont), FCUI_ERROR_PARAMETERS); if (pObject && (mConfig = FcUI_Object_get_font_config(pObject, 0))) { memcpy(&mFontSetting, FcUI_Object_get_font_config(pObject, 0), sizeof(*FcUI_Object_get_font_config(pObject, 0))); } else { mFontSetting.mType = FCUI_FONT_ATLAS_SDF; mFontSetting.mData.mBasic.mWidth = FcUI_Window_getClientWidth(pWindow); mFontSetting.mData.mBasic.mHeight = FcUI_Window_getClientWidth(pWindow); mFontSetting.mData.mBasic.mPixelHeight = 64; mFontSetting.mDictionary[0] = 0; mFontSetting.mFontName[0] = 0; } mError = FcFont(&pFont->mFont, mFontSetting.mFontName); if (mError == FCFONT_ERROR_THEFILEWASNOTOPENED) { FCUISAFECALLF(mError, FcFont_GetSystemFonts_malloc(&mSystemFonts)); for (i = 0; i < mSystemFonts->mNumberFonts; i++) { mError = FcFont(&pFont->mFont, mSystemFonts->mFont[i].data); if (mError) continue; i = mSystemFonts->mNumberFonts; } } switch (mFontSetting.mType){ default: case FCUI_FONT_NONE: break; case FCUI_FONT_ATLAS_SDF: mOffset = 0; FCUI_ADD_DICTINARY_BASIC(mFontSetting.mDictionary, mOffset); FCUI_OBJECT_ADD_DICTIONARY_BASIC(button, Button, mOffset); FCUI_OBJECT_ADD_DICTIONARY_BASIC(textView, TextView, mOffset); FCUISAFECALLF(mError, FcUI_Font_Basic_SDF(&pFont->mFont, &pFont->mFontType.mBasicSDF, &mFontSetting.mData.mBasic, &mDictionary)); pFont->mType = FCUI_FONT_ATLAS_SDF; break; case FCUI_FONT_ATLAS: mOffset = 0; FCUI_ADD_DICTINARY_BASIC(mFontSetting.mDictionary, mOffset); FCUI_OBJECT_ADD_DICTIONARY_BASIC(button, Button, mOffset); FCUI_OBJECT_ADD_DICTIONARY_BASIC(textView, TextView, mOffset); FCUISAFECALLF(mError, FcUI_Font_Basic(&pFont->mFont, &pFont->mFontType.mBasic, &mFontSetting.mData.mBasic, &mDictionary)); pFont->mType = FCUI_FONT_ATLAS; break; case FCUI_FONT_CURVE2: mOffset = 0; FCUISAFECALLF(mError, FcUI_Font_Curve2(&pFont->mFont, &pFont->mFontType.mCurve2, &mFontSetting.mData.mCurve2)); pFont->mType = FCUI_FONT_CURVE2; break; break; } gError: FcFont_GetSystemFonts_free(mSystemFonts); FcUI_Memory_free(&mText); return mError; //#undef FCUI_OBJECT_ADD_DICTIONARY_BASIC } FCUIDEF size_t FcUI_Font_getAtlas_NumberObject(FcUI_Font_t* pFont) { size_t mCount; FCUISAFECALL(mCount, pFont, 0); switch (pFont->mType) { case FCUI_FONT_ATLAS_SDF: mCount = pFont->mFontType.mBasicSDF.mSDF.mTable.mNumberGlyph; break; case FCUI_FONT_ATLAS: mCount = pFont->mFontType.mBasic.mAtlas.mTable.mNumberGlyph; break; default: case FCUI_FONT_NONE: case FCUI_FONT_CURVE2: mCount = 0; break; } gError: return mCount; } FCUIDEF FcFont_Atlas_Table_Data_t* FcUI_Font_getAtlas_GetTable(FcUI_Font_t* pFont) { FcFont_Atlas_Table_Data_t* mData; FCUISAFECALL(mData, pFont, 0); switch (pFont->mType) { case FCUI_FONT_ATLAS_SDF: mData = pFont->mFontType.mBasicSDF.mSDF.mTable.mTable; break; case FCUI_FONT_ATLAS: mData = pFont->mFontType.mBasic.mAtlas.mTable.mTable; break; default: case FCUI_FONT_NONE: case FCUI_FONT_CURVE2: mData = 0; break; } gError: return mData; } FCUIDEF FcUI_Error_t FcUI_Font_free(FcUI_Font_t* pFont){ FcUI_Error_t mError = FCUI_ERROR_NOERROR; FCUISAFECALL(mError, pFont, FCUI_ERROR_PARAMETERS); FcFont_free(&pFont->mFont); switch (pFont->mType){ default: case FCUI_FONT_NONE: break; case FCUI_FONT_ATLAS_SDF: FCUISAFECALLF(mError, FcUI_Font_Basic_SDF_free(&pFont->mFontType.mBasicSDF)); break; case FCUI_FONT_ATLAS: FCUISAFECALLF(mError, FcUI_Font_Basic_free(&pFont->mFontType.mBasic)); break; case FCUI_FONT_CURVE2: FCUISAFECALLF(mError, FcUI_Font_Curve2_free(&pFont->mFontType.mCurve2)); break; } gError: return mError; } #endif //_FCUI_FONT_H_