Add more checks an mutexes

This commit is contained in:
Maschell 2020-08-16 14:14:00 +02:00
parent b00fa46da6
commit f3a3492fcd
3 changed files with 26 additions and 8 deletions

View File

@ -138,7 +138,7 @@ private:
uint16_t cacheGlyphDataComplete(int16_t pixelSize); uint16_t cacheGlyphDataComplete(int16_t pixelSize);
void loadGlyphData(FT_Bitmap *bmp, ftgxCharData *charData); bool loadGlyphData(FT_Bitmap *bmp, ftgxCharData *charData);
void copyTextureToFramebuffer(CVideo *pVideo, GX2Texture *tex, int16_t screenX, int16_t screenY, int16_t screenZ, const glm::vec4 &color, const float &textBlur, const float &colorBlurIntensity, const glm::vec4 &blurColor, void copyTextureToFramebuffer(CVideo *pVideo, GX2Texture *tex, int16_t screenX, int16_t screenY, int16_t screenZ, const glm::vec4 &color, const float &textBlur, const float &colorBlurIntensity, const glm::vec4 &blurColor,
const float &superSamplingScale); const float &superSamplingScale);

View File

@ -36,7 +36,9 @@ FreeTypeGX::FreeTypeGX(const uint8_t *fontBuffer, FT_Long bufferSize, bool lastF
GX2InitSampler(&ftSampler, GX2_TEX_CLAMP_MODE_CLAMP_BORDER, GX2_TEX_XY_FILTER_MODE_LINEAR); GX2InitSampler(&ftSampler, GX2_TEX_CLAMP_MODE_CLAMP_BORDER, GX2_TEX_XY_FILTER_MODE_LINEAR);
FT_Init_FreeType(&ftLibrary); FT_Init_FreeType(&ftLibrary);
faceMutex.lock();
if (lastFace) { if (lastFace) {
FT_New_Memory_Face(ftLibrary, (FT_Byte *) fontBuffer, bufferSize, -1, &ftFace); FT_New_Memory_Face(ftLibrary, (FT_Byte *) fontBuffer, bufferSize, -1, &ftFace);
faceIndex = ftFace->num_faces - 1; // Use the last face faceIndex = ftFace->num_faces - 1; // Use the last face
FT_Done_Face(ftFace); FT_Done_Face(ftFace);
@ -45,6 +47,7 @@ FreeTypeGX::FreeTypeGX(const uint8_t *fontBuffer, FT_Long bufferSize, bool lastF
FT_New_Memory_Face(ftLibrary, (FT_Byte *) fontBuffer, bufferSize, faceIndex, &ftFace); FT_New_Memory_Face(ftLibrary, (FT_Byte *) fontBuffer, bufferSize, faceIndex, &ftFace);
ftKerningEnabled = FT_HAS_KERNING(ftFace); ftKerningEnabled = FT_HAS_KERNING(ftFace);
faceMutex.unlock();
} }
/** /**
@ -52,7 +55,10 @@ FreeTypeGX::FreeTypeGX(const uint8_t *fontBuffer, FT_Long bufferSize, bool lastF
*/ */
FreeTypeGX::~FreeTypeGX() { FreeTypeGX::~FreeTypeGX() {
unloadFont(); unloadFont();
faceMutex.lock();
FT_Done_Face(ftFace); FT_Done_Face(ftFace);
faceMutex.unlock();
FT_Done_FreeType(ftLibrary); FT_Done_FreeType(ftLibrary);
} }
@ -225,9 +231,17 @@ ftgxCharData *FreeTypeGX::cacheGlyphData(wchar_t charCode, int16_t pixelSize) {
//! Initialize texture //! Initialize texture
charData->texture = new GX2Texture; charData->texture = new GX2Texture;
if (charData->texture) {
GX2InitTexture(charData->texture, textureWidth, textureHeight, 1, 0, GX2_SURFACE_FORMAT_UNORM_R5_G5_B5_A1, GX2_SURFACE_DIM_TEXTURE_2D, GX2_TILE_MODE_LINEAR_ALIGNED); GX2InitTexture(charData->texture, textureWidth, textureHeight, 1, 0, GX2_SURFACE_FORMAT_UNORM_R5_G5_B5_A1, GX2_SURFACE_DIM_TEXTURE_2D, GX2_TILE_MODE_LINEAR_ALIGNED);
loadGlyphData(glyphBitmap, charData); if (!loadGlyphData(glyphBitmap, charData)) {
delete charData->texture;
ftData->ftgxCharMap.erase(charCode);
charData = NULL;
}
} else {
charData = NULL;
}
faceMutex.unlock(); faceMutex.unlock();
fontDataMutex.unlock(); fontDataMutex.unlock();
return charData; return charData;
@ -268,10 +282,10 @@ uint16_t FreeTypeGX::cacheGlyphDataComplete(int16_t pixelSize) {
* @param charData A pointer to an allocated ftgxCharData structure whose data represent that of the last rendered glyph. * @param charData A pointer to an allocated ftgxCharData structure whose data represent that of the last rendered glyph.
*/ */
void FreeTypeGX::loadGlyphData(FT_Bitmap *bmp, ftgxCharData *charData) { bool FreeTypeGX::loadGlyphData(FT_Bitmap *bmp, ftgxCharData *charData) {
charData->texture->surface.image = (uint8_t *) memalign(charData->texture->surface.alignment, charData->texture->surface.imageSize); charData->texture->surface.image = (uint8_t *) memalign(charData->texture->surface.alignment, charData->texture->surface.imageSize);
if (!charData->texture->surface.image) { if (!charData->texture->surface.image) {
return; return false;
} }
memset(charData->texture->surface.image, 0x00, charData->texture->surface.imageSize); memset(charData->texture->surface.image, 0x00, charData->texture->surface.imageSize);
@ -287,6 +301,7 @@ void FreeTypeGX::loadGlyphData(FT_Bitmap *bmp, ftgxCharData *charData) {
} }
} }
GX2Invalidate(GX2_INVALIDATE_MODE_CPU_TEXTURE, charData->texture->surface.image, charData->texture->surface.imageSize); GX2Invalidate(GX2_INVALIDATE_MODE_CPU_TEXTURE, charData->texture->surface.image, charData->texture->surface.imageSize);
return true;
} }
/** /**
@ -387,9 +402,12 @@ uint16_t FreeTypeGX::drawText(CVideo *video, int16_t x, int16_t y, int16_t z, co
if (glyphData != NULL) { if (glyphData != NULL) {
if (ftKerningEnabled && i > 0) { if (ftKerningEnabled && i > 0) {
fontDataMutex.lock();
faceMutex.lock();
FT_Get_Kerning(ftFace, fontData[pixelSize].ftgxCharMap[text[i - 1]].glyphIndex, glyphData->glyphIndex, FT_KERNING_DEFAULT, &pairDelta); FT_Get_Kerning(ftFace, fontData[pixelSize].ftgxCharMap[text[i - 1]].glyphIndex, glyphData->glyphIndex, FT_KERNING_DEFAULT, &pairDelta);
faceMutex.unlock();
fontDataMutex.unlock();
x_pos += (pairDelta.x >> 6); x_pos += (pairDelta.x >> 6);
} }
copyTextureToFramebuffer(video, glyphData->texture, x_pos + glyphData->renderOffsetX + x_offset, y + glyphData->renderOffsetY - y_offset, z, color, textBlur, colorBlurIntensity, blurColor, superSamplingScale); copyTextureToFramebuffer(video, glyphData->texture, x_pos + glyphData->renderOffsetX + x_offset, y + glyphData->renderOffsetY - y_offset, z, color, textBlur, colorBlurIntensity, blurColor, superSamplingScale);

View File

@ -190,7 +190,7 @@ void GuiText::setTextf(const char *format, ...) {
} }
int32_t max_len = strlen(format) + 8192; int32_t max_len = strlen(format) + 8192;
char *tmp = new char[max_len]; char *tmp = new(std::nothrow) char[max_len];
va_list va; va_list va;
va_start(va, format); va_start(va, format);
if ((vsnprintf(tmp, max_len, format, va) >= 0) && tmp) { if ((vsnprintf(tmp, max_len, format, va) >= 0) && tmp) {
@ -476,7 +476,7 @@ void GuiText::scrollText(uint32_t frameCount) {
void GuiText::wrapText() { void GuiText::wrapText() {
textMutex.lock(); textMutex.lock();
if (textDyn.size() > 0) { if (!text || textDyn.size() > 0) {
textMutex.unlock(); textMutex.unlock();
return; return;
} }