/
vTech
/
FcApps
Обзор
Документация
Войти
/
vTech
/
FcApps
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
FcLibs/FcUI/src/FcUI_Object/FcUI_Object_Button.h
165 строк
5 KB
vTech
alpha_00
03 дек 2025, 17:45
03 дек 2025, 17:45
ab8382d
Код
Авторство
О чём код?
#ifndef _FCUI_OBJECT_BUTTON_H_ #define _FCUI_OBJECT_BUTTON_H_ #include "FcUI_Setting.h" #include "FcUI_Error.h" #include "FcUI_Config/FcUI_Config_Setting.h" #include "FcUI_Algo/FcUI_Rectangle.h" enum { FCUI_BUTTON_DEFAULT, FCUI_BUTTON_PRESSED }; typedef struct _FcUI_Object_Button_t { size_t mID; size_t mType; ptrdiff_t mX; ptrdiff_t mY; size_t mWidth; size_t mHeight; size_t mFontHeight; uint32_t mDefaultColor; uint32_t mSelectColor; uint32_t mTextColor; TCHAR mText[36]; FCUICALLBACKPROC mCallback; void* mData; }FcUI_Object_Button_t; typedef struct _FcUI_Button_t { size_t mID; size_t mType; size_t mStatus; ptrdiff_t mX; ptrdiff_t mY; size_t mWidth; size_t mHeight; size_t mFontHeight; uint32_t mDefaultColor; uint32_t mSelectColor; uint32_t mTextColor; TCHAR mText[36]; FCUICALLBACKPROC mCallback; void* mData; }FcUI_Button_t; FCUIDEF FcUI_Error_t FcUI_Button(FcUI_Object_Button_t* pObject, FcUI_Button_t* pButton) { size_t i; FcUI_Error_t mError; mError = FCUI_ERROR_NOERROR; FCUISAFECALL(mError, (pObject && pButton), FCUI_ERROR_PARAMETERS); pButton->mID = pObject->mID; pButton->mX = pObject->mX; pButton->mY = pObject->mY; pButton->mWidth = pObject->mWidth; pButton->mHeight = pObject->mHeight; pButton->mFontHeight = pObject->mFontHeight ? pObject->mFontHeight : pObject->mHeight; pButton->mStatus = FCUI_BUTTON_DEFAULT; pButton->mDefaultColor = pObject->mDefaultColor; pButton->mSelectColor = pObject->mSelectColor; pButton->mTextColor = pObject->mTextColor; for (i = 0; i < min(sizeof(pObject->mText), sizeof(pButton->mText)) - 1; i++) pButton->mText[i] = pObject->mText[i]; pButton->mText[i] = 0; pButton->mCallback = pObject->mCallback; pButton->mData = pObject->mData; gError: return mError; } FCUIDEF size_t FcUI_Button_Rectangle_Array_v2f_GL_0(FcUI_Button_t* pButton, FcUI_Font_t* pFont, FcUI_View_Vertex_Array_Info_GL0_t* pData) { size_t i, j, mRectangleCounter, mStartX, mStartY, mSymbolStartX, mSymbolStartY, mWidth, mHeight, mAW; FcFont_Metrics_u mMetrics; size_t mImageWidth, mImageHeight; bool mFind; uint8_t mColor[4]; float (*mVertex)[6][3][4]; struct { ptrdiff_t x0, x1, y0, y1; } mBBOX; FCUISAFECALL(mRectangleCounter, (pButton && pFont), 0); for (mRectangleCounter = 1; pButton->mText[mRectangleCounter - 1]; mRectangleCounter++); FCUISAFECALL(mRectangleCounter, (pData), mRectangleCounter); mVertex = pData->mVertex; mStartX = pButton->mX - pButton->mWidth / 2; mStartY = pButton->mY - pButton->mHeight / 2; mImageWidth = FcUI_Font_getAtlas_Image(pFont)->mWidth; mImageHeight = FcUI_Font_getAtlas_Image(pFont)->mHeight; mColor[0] = (pButton->mDefaultColor >> 0) & 0xff; mColor[1] = (pButton->mDefaultColor >> 8) & 0xff; mColor[2] = (pButton->mDefaultColor >> 16) & 0xff; mColor[3] = (pButton->mDefaultColor >> 24) & 0xff; _FcUI_RectangleGL_Array_vct_i_v4f(mVertex + pData->mOffsetVertex, 0, 0, 0, 0, 0, 0, mStartX, mStartY, pButton->mWidth, pButton->mHeight, mColor); pData->mOffsetVertex += 1; mColor[0] = (pButton->mTextColor >> 0) & 0xff; mColor[1] = (pButton->mTextColor >> 8) & 0xff; mColor[2] = (pButton->mTextColor >> 16) & 0xff; mColor[3] = 0; for (i = j = 0; i < pButton->mText[i]; i++) j += FcFont_getAdvanceWidth(FcUI_Font_getFont(pFont), &mMetrics, mStartX, mStartY, pButton->mFontHeight, pButton->mText[i]); mBBOX.x1 = mStartX + pButton->mWidth; mBBOX.y1 = mStartY + pButton->mHeight; mStartX += max(0, (pButton->mWidth - j)) / 2; mStartY += max(0, (pButton->mHeight - pButton->mFontHeight)) / 2; mBBOX.x0 = mStartX; mBBOX.y0 = mStartY; for (i = 0; pButton->mText[i]; i++) { mAW = FcFont_getAdvanceWidth(FcUI_Font_getFont(pFont), &mMetrics, mStartX, mStartY, pButton->mFontHeight, pButton->mText[i]); if (mStartX + mAW >= mBBOX.x1) { mStartX = mBBOX.x0; mStartY -= pButton->mFontHeight; } if (mStartY + pButton->mFontHeight > mBBOX.y1) { break; } if (FcUI_Font_Atlas_GlyphFind(pFont, pButton->mText[i], &mSymbolStartX, &mSymbolStartY, &mWidth, &mHeight)) { _FcUI_RectangleGL_Array_vct_i_v4f(mVertex + pData->mOffsetVertex, mSymbolStartX, mSymbolStartY, mWidth, mHeight, mImageWidth, mImageHeight, mStartX, mStartY, mAW, pButton->mFontHeight, mColor); pData->mOffsetVertex += 1; } mStartX += mAW; } gError: return mRectangleCounter; } FCUIDEF size_t FcUI_Button_getNumberRectangle_Array(FcUI_Button_t* pButton, FcUI_Font_t* pFont, FcUI_Config_Setting_e config) { switch (config) { case FCUI_CONFIG_GRAPHICS_GL_0: return FcUI_Button_Rectangle_Array_v2f_GL_0(pButton, pFont, NULL); case FCUI_CONFIG_NONE: default: break; } return 0; } FCUIDEF size_t FcUI_Button_setDataRectangle_Array(FcUI_Button_t* pButton, FcUI_Font_t* pFont, FcUI_View_Vertex_Info_t* pInfo) { switch (pInfo->mType) { case FCUI_CONFIG_GRAPHICS_GL_0: return FcUI_Button_Rectangle_Array_v2f_GL_0(pButton, pFont, &pInfo->mData.mGLArray0); case FCUI_CONFIG_NONE: default: break; } return 0; } #endif //_FCUI_OBJECT_BUTTON_H_