mirror of
https://github.com/wiiu-env/libgui.git
synced 2025-01-12 00:09:07 +01:00
Add more checks an mutexes
This commit is contained in:
parent
b00fa46da6
commit
f3a3492fcd
@ -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);
|
||||||
|
@ -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;
|
||||||
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);
|
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);
|
||||||
|
|
||||||
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);
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user