/
vTech
/
FcApps
Обзор
Документация
Войти
/
vTech
/
FcApps
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/FcUI_Raster_Primitive.h
207 строк
7 KB
vTech
alpha_00
03 дек 2025, 17:45
03 дек 2025, 17:45
ab8382d
Код
Авторство
О чём код?
#ifndef _FCUI_RASTER_PRIMITIVE_H_ #define _FCUI_RASTER_PRIMITIVE_H_ #include "FcUI_Raster_Line.h" #include "FcUI_Raster_Curve2.h" enum { FCUI_RASTER_PRIMITIVE_ONCURVE = 1, FCUI_RASTER_PRIMITIVE_OFFCURVE = 2, }; typedef struct FcUI_Raster_Primitive_pixelPoints_t { size_t mNumberContour; size_t mOffsetPoint; size_t mOffsetStartContour; size_t mOffsetEndContour; size_t mCurrOnOffPoint; ////FcVec2i64_t mPrev1Prev0Curr[3]; size_t mEndContour[512]; uint8_t mFlags[512]; FcVec2i64_t mPoints[512]; }FcUI_Raster_Primitive_pixelPoints_t; //FCUIDEF void FcUI_Raster_Curve2_2t(uint8_t(*mImage)[4], // size_t width, size_t height, // ptrdiff_t x0, ptrdiff_t y0, // ptrdiff_t x1, ptrdiff_t y1, // ptrdiff_t x2, ptrdiff_t y2, // const uint8_t mDefaultColor[4]); FCUIDEF void FcUI_Raster_Line_2t(uint8_t(*mImage)[4], size_t width, size_t height, ptrdiff_t x0, ptrdiff_t y0, ptrdiff_t x1, ptrdiff_t y1, const uint8_t mDefaultColor[4]); FCUIDEF void FcUI_Raster_Primitive_pixelPoints(FcUI_Raster_Primitive_pixelPoints_t* pPixel) { pPixel->mOffsetEndContour = 0; pPixel->mNumberContour = 0; pPixel->mOffsetStartContour = 1; pPixel->mOffsetPoint = 0; pPixel->mCurrOnOffPoint = FCUI_RASTER_PRIMITIVE_ONCURVE; pPixel->mEndContour[0] = 0; pPixel->mFlags[0] = 0; pPixel->mPoints[0] = FcVec2i64(0, 0); //pPixel->mPrev1Prev0Curr[0] = FcVec2i64(0, 0); } FCUIDEF void FcUI_Raster_Primitive_addOffPoint_lc2(FcUI_Raster_Primitive_pixelPoints_t* pVectorField, FcVec2i64_t mData); FCUIDEF void FcUI_Raster_Primitive_addOnPoint_lc2(FcUI_Raster_Primitive_pixelPoints_t* pVectorField, FcVec2i64_t mData); FCUIDEF void FcUI_Raster_Primitive_addOffPoint_lc2(FcUI_Raster_Primitive_pixelPoints_t* pVectorField, FcVec2i64_t mData) { size_t i; if (!pVectorField) goto gError; if (!(pVectorField->mCurrOnOffPoint & FCUI_RASTER_PRIMITIVE_OFFCURVE)) goto gChange; pVectorField->mCurrOnOffPoint &= FCUI_RASTER_PRIMITIVE_ONCURVE; i = pVectorField->mOffsetPoint ? pVectorField->mEndContour[pVectorField->mOffsetEndContour] : 0; if (pVectorField->mPoints[i].m[0] == mData.m[0] && pVectorField->mPoints[i].m[1] == mData.m[1]) { pVectorField->mEndContour[pVectorField->mOffsetEndContour] = pVectorField->mOffsetPoint; pVectorField->mOffsetEndContour++; pVectorField->mEndContour[pVectorField->mOffsetEndContour] = pVectorField->mOffsetPoint + 1; pVectorField->mCurrOnOffPoint &= FCUI_RASTER_PRIMITIVE_ONCURVE; } pVectorField->mPoints[pVectorField->mOffsetPoint] = mData; pVectorField->mFlags[pVectorField->mOffsetPoint] = FCUI_RASTER_PRIMITIVE_OFFCURVE; //pVectorField->mPrev1Prev0Curr[0] = pVectorField->mPrev1Prev0Curr[1]; //pVectorField->mPrev1Prev0Curr[1] = pVectorField->mPrev1Prev0Curr[2]; //pVectorField->mPrev1Prev0Curr[2] = mData; //pVectorField->mEndContour[pVectorField->mOffsetEndContour]++; pVectorField->mOffsetPoint = min(511, pVectorField->mOffsetPoint + 1); gError: return; gChange: FcUI_Raster_Primitive_addOnPoint_lc2(pVectorField, mData); } FCUIDEF void FcUI_Raster_Primitive_addOnPoint_lc2(FcUI_Raster_Primitive_pixelPoints_t* pVectorField, FcVec2i64_t mData) { size_t i; if (!pVectorField) goto gError; pVectorField->mCurrOnOffPoint = FCUI_RASTER_PRIMITIVE_OFFCURVE | FCUI_RASTER_PRIMITIVE_ONCURVE; i = pVectorField->mOffsetPoint ? pVectorField->mEndContour[pVectorField->mOffsetEndContour] : 0; if (pVectorField->mPoints[i].m[0] == mData.m[0] && pVectorField->mPoints[i].m[1] == mData.m[1]) { pVectorField->mEndContour[pVectorField->mOffsetEndContour] = pVectorField->mOffsetPoint; pVectorField->mOffsetEndContour++; pVectorField->mEndContour[pVectorField->mOffsetEndContour] = pVectorField->mOffsetPoint + 1; pVectorField->mCurrOnOffPoint &= FCUI_RASTER_PRIMITIVE_ONCURVE; } pVectorField->mPoints[pVectorField->mOffsetPoint] = mData; pVectorField->mFlags[pVectorField->mOffsetPoint] = FCUI_RASTER_PRIMITIVE_ONCURVE; //pVectorField->mPrev1Prev0Curr[0] = pVectorField->mPrev1Prev0Curr[1]; //pVectorField->mPrev1Prev0Curr[1] = pVectorField->mPrev1Prev0Curr[2]; //pVectorField->mPrev1Prev0Curr[2] = mData; //pVectorField->mEndContour[pVectorField->mOffsetEndContour]++; pVectorField->mOffsetPoint = min(511, pVectorField->mOffsetPoint + 1); gError: return; } FCUIDEF void FcUI_Raster_Primitive_drawPoints_lc2(FcImage_RGBA_t* pImage, FcUI_Raster_Primitive_pixelPoints_t* pVectorField) { uint8_t (*pColor)[4]; uint8_t mColorOn[4] = { 0, 64, 255, 255 }; uint8_t mColorOff[4] = { 0, 192, 96, 255 }; size_t i, j, x, y; if (!pVectorField || !pImage) goto gError; for (i = 0; i <= pVectorField->mOffsetPoint; i++) { for (y = pVectorField->mPoints[i].m[1] - 4; y <= pVectorField->mPoints[i].m[1] + 4; y++) for (x = pVectorField->mPoints[i].m[0] - 4; x <= pVectorField->mPoints[i].m[0] + 4; x++) { pColor = (pVectorField->mFlags[i] & FCUI_RASTER_PRIMITIVE_ONCURVE) ? &mColorOn : &mColorOff; if (y < pImage->mHeight && x < pImage->mWidth) for (j = 0; j < 4; j++) pImage->mData[y * pImage->mWidth + x][j] = (*pColor)[j]; } } gError: return; } FCUIDEF void FcUI_Raster_Primitive_lc2(FcImage_RGBA_t* pImage, FcUI_Raster_Primitive_pixelPoints_t* pVectorField) { size_t i, j, id; uint8_t mColorUp[4] = { 255, 255, 0, 255 }; uint8_t mColorDown[4] = { 255, 0, 255, 255 }; uint8_t(*pColor)[4]; if (!pVectorField || !pImage) goto gError; for (j = i = id = 0; i + 1 < pVectorField->mOffsetPoint; id++) { if (i == pVectorField->mEndContour[j]) j++, i++; if (pVectorField->mFlags[i + 0] == FCUI_RASTER_PRIMITIVE_ONCURVE && pVectorField->mFlags[i + 1] == FCUI_RASTER_PRIMITIVE_ONCURVE) { mColorUp[0] = id; mColorDown[0] = id; pColor = pVectorField->mPoints[i + 0].m[1] < pVectorField->mPoints[i + 1].m[1] ? &mColorUp : &mColorDown; FcUI_Raster_Line_2t(pImage->mData, pImage->mWidth, pImage->mHeight, pVectorField->mPoints[i + 0].m[0], pVectorField->mPoints[i + 0].m[1], pVectorField->mPoints[i + 1].m[0], pVectorField->mPoints[i + 1].m[1], *pColor); i++; } else if ( pVectorField->mFlags[i + 0] == FCUI_RASTER_PRIMITIVE_ONCURVE && pVectorField->mFlags[i + 1] == FCUI_RASTER_PRIMITIVE_OFFCURVE && pVectorField->mFlags[i + 2] == FCUI_RASTER_PRIMITIVE_ONCURVE) { mColorUp[0] = id; mColorDown[0] = id; FcUI_Raster_Curve2_2t(pImage->mData, pImage->mWidth, pImage->mHeight, pVectorField->mPoints[i + 0].m[0], pVectorField->mPoints[i + 0].m[1], pVectorField->mPoints[i + 1].m[0], pVectorField->mPoints[i + 1].m[1], pVectorField->mPoints[i + 2].m[0], pVectorField->mPoints[i + 2].m[1], mColorDown, mColorUp); i += 2; } else { i++; } } gError: return; } FCUIDEF void FcUI_Raster_Primitive_filling_lc2(FcImage_RGBA_t* pImage, FcUI_Raster_Primitive_pixelPoints_t* pVectorField) { size_t i, j, x, y, mID, mCurrColor; ptrdiff_t mDraw; uint8_t mColor[4] = { 255, 255, 255, 255 }; if (!pVectorField || !pImage) goto gError; for (y = 0; y < pImage->mHeight; y++) { mDraw = 0; for (x = 0; x < pImage->mWidth; x++) { if (pImage->mData[y * pImage->mWidth + x][1]) { mDraw += 1; while (pImage->mData[y * pImage->mWidth + x][1]) x++; } if (pImage->mData[y * pImage->mWidth + x][2]) { mDraw -= 1; while (pImage->mData[y * pImage->mWidth + x][2]) x++; } if (mDraw != 0){ pImage->mData[y * pImage->mWidth + x][0] = mColor[0]; pImage->mData[y * pImage->mWidth + x][1] = mColor[1]; pImage->mData[y * pImage->mWidth + x][2] = mColor[2]; pImage->mData[y * pImage->mWidth + x][3] = mColor[3]; } } } gError: return; } #endif //_FCUI_RASTER_PRIMITIVE_H_