/
vTech
/
FcApps
Обзор
Документация
Войти
/
vTech
/
FcApps
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
FcLibs/FcUI/src/FcUI_Object/FcUI_Object_TextView.h
276 строк
9 KB
vTech
alpha_00
03 дек 2025, 17:45
03 дек 2025, 17:45
ab8382d
Код
Авторство
О чём код?
#ifndef _FCUI_OBJECT_TEXTVIEW_H_ #define _FCUI_OBJECT_TEXTVIEW_H_ #include "FcUI_Setting.h" #include "FcUI_Error.h" #include "FcUI_Config/FcUI_Config_Setting.h" #include "FcUI_Algo/FcUI_Rectangle.h" enum{ FCUI_ACTIVITY_TEXTVIEW_DEFAULT, FCUI_ACTIVITY_TEXTVIEW_INPUT_ADD, FCUI_ACTIVITY_TEXTVIEW_INPUT_DEL, FCUI_ACTIVITY_TEXTVIEW_INPUT_MOVE, FCUI_ACTIVITY_TEXTVIEW_INPUT_CLOSE }; typedef size_t FcUI_Activity_TextView_GL0_t; typedef struct _FcUI_Object_TextView_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[256]; FCUICALLBACKPROC mCallback; void* mData; }FcUI_Object_TextView_t; typedef struct _FcUI_TextView_t { size_t mID; FcUI_Activity_TextView_GL0_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; uint32_t mTextCursorX; uint32_t mTextCursorY; uint32_t mTextOffset; uint32_t mMaxTextOffset; uint32_t mCurrTextOffset; TCHAR mText[256]; FCUICALLBACKPROC mCallback; size_t mOffsetVertexStart; size_t mOffsetVertexEnd; void* mData; }FcUI_TextView_t; FCUIDEF FcUI_Error_t FcUI_TextView(FcUI_Object_TextView_t* pObject, FcUI_TextView_t* pTextView); FCUIDEF FcUI_Error_t FcUI_TextView_changePosition(FcUI_TextView_t* pTextView, size_t x, size_t y); FCUIDEF FcUI_Error_t FcUI_TextView_appendSymbol(FcUI_TextView_t* pTextView, TCHAR symbol); FCUIDEF FcUI_Error_t FcUI_TextView_setText(FcUI_TextView_t* pTextView, TCHAR* pText); FCUIDEF FcUI_Error_t FcUI_TextView_deleteSymbol(FcUI_TextView_t* pTextView); FCUIDEF FcUI_Error_t FcUI_TextView(FcUI_Object_TextView_t* pObject, FcUI_TextView_t* pTextView) { size_t i; FcUI_Error_t mError = FCUI_ERROR_NOERROR; FCUISAFECALL(mError, (pObject && pTextView), FCUI_ERROR_PARAMETERS); pTextView->mID = pObject->mID; pTextView->mStatus = FCUI_ACTIVITY_TEXTVIEW_DEFAULT; pTextView->mX = pObject->mX; pTextView->mY = pObject->mY; pTextView->mWidth = pObject->mWidth; pTextView->mHeight = pObject->mHeight; pTextView->mFontHeight = min(pObject->mWidth, min(pObject->mFontHeight, pObject->mHeight)); pTextView->mDefaultColor = pObject->mDefaultColor; pTextView->mSelectColor = pObject->mSelectColor; pTextView->mTextColor = pObject->mTextColor; pTextView->mCallback = pObject->mCallback; pTextView->mData = pObject->mData; pTextView->mTextOffset = 0; pTextView->mTextCursorX = pObject->mX - pObject->mWidth / 2; pTextView->mTextCursorY = pObject->mY + pObject->mHeight / 2 - pTextView->mFontHeight; for (i = 0; i < 256 && pObject->mText[i]; i++) pTextView->mText[i] = pObject->mText[i]; pTextView->mMaxTextOffset = i; pTextView->mCurrTextOffset = i; pTextView->mText[i] = 0; pTextView->mTextOffset = i; gError: return mError; } FCUIDEF FcUI_Error_t FcUI_TextView_changePosition(FcUI_TextView_t* pTextView, size_t x, size_t y) { size_t j; FcUI_Error_t mError = FCUI_ERROR_NOERROR; FCUISAFECALL(mError, (pTextView), FCUI_ERROR_PARAMETERS); pTextView->mX = x; pTextView->mY = y; pTextView->mTextCursorX = pTextView->mX - pTextView->mWidth / 2; pTextView->mTextCursorY = pTextView->mY + pTextView->mHeight / 2 - pTextView->mFontHeight; gError: return mError; } FCUIDEF FcUI_Error_t FcUI_TextView_appendSymbol(FcUI_TextView_t* pTextView, TCHAR symbol) { size_t j; FcUI_Error_t mError = FCUI_ERROR_NOERROR; FCUISAFECALL(mError, (pTextView), FCUI_ERROR_PARAMETERS); j = pTextView->mTextOffset; pTextView->mText[j] = symbol; pTextView->mTextOffset = min(255, j + 1); pTextView->mText[pTextView->mTextOffset] = 0; gError: return mError; } FCUIDEF FcUI_Error_t FcUI_TextView_deleteSymbol(FcUI_TextView_t* pTextView){ ptrdiff_t j; FcUI_Error_t mError = FCUI_ERROR_NOERROR; FCUISAFECALL(mError, (pTextView), FCUI_ERROR_PARAMETERS); j = pTextView->mTextOffset; pTextView->mText[j] = 0; pTextView->mTextOffset = max(0, j - 1); gError: return mError; } FCUIDEF FcUI_Error_t FcUI_TextView_setText(FcUI_TextView_t* pTextView, TCHAR* pText) { size_t i; FcUI_Error_t mError = FCUI_ERROR_NOERROR; FCUISAFECALL(mError, (pTextView && pText), FCUI_ERROR_PARAMETERS); for (i = 0; i <= 255 && pText[i] && i < pTextView->mMaxTextOffset; i++) { pTextView->mText[i] = pText[i]; } for (; i < pTextView->mMaxTextOffset; i++) { pTextView->mText[i] = ' '; } pTextView->mCurrTextOffset = min(255, pTextView->mMaxTextOffset); gError: return mError; } FCUIDEF size_t FcUI_TextView_Rectangle_Array_appendSymbol_v2f_GL_0(FcUI_TextView_t* pTextView, FcUI_Font_t* pFont, FcUI_View_Vertex_Array_Info_GL0_t* pData) { return 0; } FCUIDEF size_t FcUI_TextView_Rectangle_Array_v2f_GL_0(FcUI_TextView_t* pTextView, 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, (pTextView&& pFont), 0); for (mRectangleCounter = 1; pTextView->mText[mRectangleCounter - 1]; mRectangleCounter++); FCUISAFECALL(mRectangleCounter, (pData), mRectangleCounter); mVertex = pData->mVertex; mStartX = pTextView->mX - pTextView->mWidth / 2; mStartY = pTextView->mY - pTextView->mHeight / 2; mImageWidth = FcUI_Font_getAtlas_Image(pFont)->mWidth; mImageHeight = FcUI_Font_getAtlas_Image(pFont)->mHeight; mColor[0] = (pTextView->mDefaultColor >> 0) & 0xff; mColor[1] = (pTextView->mDefaultColor >> 8) & 0xff; mColor[2] = (pTextView->mDefaultColor >> 16) & 0xff; mColor[3] = (pTextView->mDefaultColor >> 24) & 0xff; for (i = 0; i < mRectangleCounter; i++){ _FcUI_RectangleGL_Array_vct_i_v4f(mVertex + pData->mOffsetVertex + i, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, mColor); } _FcUI_RectangleGL_Array_vct_i_v4f(mVertex + pData->mOffsetVertex, 0, 0, 0, 0, 0, 0, mStartX, mStartY, pTextView->mWidth, pTextView->mHeight, mColor); pData->mOffsetVertex += 1; mColor[0] = (pTextView->mTextColor >> 0) & 0xff; mColor[1] = (pTextView->mTextColor >> 8) & 0xff; mColor[2] = (pTextView->mTextColor >> 16) & 0xff; mColor[3] = 0; mBBOX.x0 = mStartX; mBBOX.y0 = mStartY; mBBOX.x1 = mStartX + pTextView->mWidth; mBBOX.y1 = mStartY + pTextView->mHeight; mStartY = pTextView->mTextCursorY; mStartX = pTextView->mTextCursorX; for (i = 0; pTextView->mText[i]; i++) { mAW = FcFont_getAdvanceWidth(FcUI_Font_getFont(pFont), &mMetrics, mStartX, mStartY, pTextView->mFontHeight, pTextView->mText[i]); if (mStartX + mAW >= mBBOX.x1) { mStartX = mBBOX.x0; mStartY -= pTextView->mFontHeight; } if (mStartY + pTextView->mFontHeight > mBBOX.y1) { break; } if (FcUI_Font_Atlas_GlyphFind(pFont, pTextView->mText[i], &mSymbolStartX, &mSymbolStartY, &mWidth, &mHeight)) { _FcUI_RectangleGL_Array_vct_i_v4f(mVertex + pData->mOffsetVertex, mSymbolStartX, mSymbolStartY, mWidth, mHeight, mImageWidth, mImageHeight, mStartX, mStartY, mAW, pTextView->mFontHeight, mColor); pData->mOffsetVertex += 1; } mStartX += mAW; } for (; i < pTextView->mMaxTextOffset; i++) { mAW = FcFont_getAdvanceWidth(FcUI_Font_getFont(pFont), &mMetrics, mStartX, mStartY, pTextView->mFontHeight, ' '); if (mStartX + mAW >= mBBOX.x1) { mStartX = mBBOX.x0; mStartY -= pTextView->mFontHeight; } if (mStartY + pTextView->mFontHeight > mBBOX.y1) { break; } if (FcUI_Font_Atlas_GlyphFind(pFont, ' ', &mSymbolStartX, &mSymbolStartY, &mWidth, &mHeight)) { _FcUI_RectangleGL_Array_vct_i_v4f(mVertex + pData->mOffsetVertex, mSymbolStartX, mSymbolStartY, mWidth, mHeight, mImageWidth, mImageHeight, mStartX, mStartY, mAW, pTextView->mFontHeight, mColor); pData->mOffsetVertex += 1; } mStartX += mAW; } gError: return mRectangleCounter; } FCUIDEF size_t FcUI_TextView_getNumberRectangle_Array(FcUI_TextView_t* pTextView, FcUI_Font_t* pFont, FcUI_Config_Setting_e config) { switch (config) { case FCUI_CONFIG_GRAPHICS_GL_0: return FcUI_TextView_Rectangle_Array_v2f_GL_0(pTextView, pFont, NULL); case FCUI_CONFIG_NONE: default: break; } return 0; } FCUIDEF size_t FcUI_TextView_setDataRectangle_Array(FcUI_TextView_t* pTextView, FcUI_Font_t* pFont, FcUI_View_Vertex_Info_t* pInfo) { switch (pInfo->mType) { case FCUI_CONFIG_GRAPHICS_GL_0: return FcUI_TextView_Rectangle_Array_v2f_GL_0(pTextView, pFont, &pInfo->mData.mGLArray0); case FCUI_CONFIG_NONE: default: break; } return 0; } #endif //_FCUI_OBJECT_TEXTVIEW_H_