From 5b387ffec1b62e8c0dafd64ae9759410595d80e3 Mon Sep 17 00:00:00 2001 From: Maschell Date: Thu, 13 Aug 2020 13:26:45 +0200 Subject: [PATCH] Implement the internal scaling as SSAA --- include/gui/FreeTypeGX.h | 5 ++-- include/gui/GuiText.h | 8 ++++++- source/gui/FreeTypeGX.cpp | 20 +++++++--------- source/gui/GuiText.cpp | 49 +++++++++++++++++++-------------------- 4 files changed, 43 insertions(+), 39 deletions(-) diff --git a/include/gui/FreeTypeGX.h b/include/gui/FreeTypeGX.h index 7d9d30f..75dccdc 100644 --- a/include/gui/FreeTypeGX.h +++ b/include/gui/FreeTypeGX.h @@ -139,7 +139,7 @@ private: void 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, - const float &internalRenderingScale); + const float &superSamplingScale); public: FreeTypeGX(const uint8_t *fontBuffer, FT_Long bufferSize, bool lastFace = false); @@ -147,7 +147,8 @@ public: ~FreeTypeGX(); uint16_t drawText(CVideo *pVideo, int16_t x, int16_t y, int16_t z, const wchar_t *text, int16_t pixelSize, const glm::vec4 &color, - uint16_t textStyling, uint16_t textWidth, const float &textBlur, const float &colorBlurIntensity, const glm::vec4 &blurColor, const float &internalRenderingScale); + uint16_t textStyling, uint16_t textWidth, const float &textBlur, const float &colorBlurIntensity, const glm::vec4 &blurColor, const float &superSamplingScale); + uint16_t getWidth(const wchar_t *text, int16_t pixelSize); diff --git a/include/gui/GuiText.h b/include/gui/GuiText.h index 1bc8d32..f3f58e9 100644 --- a/include/gui/GuiText.h +++ b/include/gui/GuiText.h @@ -106,6 +106,11 @@ public: } //!Get fontsize + + void setSSAA(int32_t ssaa) { + this->internalSSAA = ssaa; + }; + int32_t getFontSize() { return size; }; @@ -142,6 +147,7 @@ public: }; protected: static FreeTypeGX *presentFont; + static int32_t presetSSAA; static int32_t presetSize; static int32_t presetMaxWidth; static float presetInternalRenderingScale; @@ -178,7 +184,7 @@ protected: float blurGlowIntensity; float blurAlpha; glm::vec4 blurGlowColor; - float internalRenderingScale; + int32_t internalSSAA; }; #endif diff --git a/source/gui/FreeTypeGX.cpp b/source/gui/FreeTypeGX.cpp index b558790..47003b8 100644 --- a/source/gui/FreeTypeGX.cpp +++ b/source/gui/FreeTypeGX.cpp @@ -344,10 +344,8 @@ int16_t FreeTypeGX::getStyleOffsetHeight(int16_t format, uint16_t pixelSize) { */ uint16_t FreeTypeGX::drawText(CVideo *video, int16_t x, int16_t y, int16_t z, const wchar_t *text, int16_t pixelSize, const glm::vec4 &color, uint16_t textStyle, uint16_t textWidth, const float &textBlur, const float &colorBlurIntensity, - const glm::vec4 &blurColor, const float &internalRenderingScale) { - if (!text) { - return 0; - } + const glm::vec4 &blurColor, const float &superSamplingScale) { + if (!text) { return 0; } uint16_t fullTextWidth = (textWidth > 0) ? textWidth : getWidth(text, pixelSize); uint16_t x_pos = x, printed = 0; @@ -371,7 +369,7 @@ uint16_t FreeTypeGX::drawText(CVideo *video, int16_t x, int16_t y, int16_t z, co 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, internalRenderingScale); + copyTextureToFramebuffer(video, glyphData->texture, x_pos + glyphData->renderOffsetX + x_offset, y + glyphData->renderOffsetY - y_offset, z, color, textBlur, colorBlurIntensity, blurColor, superSamplingScale); x_pos += glyphData->glyphAdvanceX; ++printed; @@ -506,15 +504,15 @@ void FreeTypeGX::getOffset(const wchar_t *text, int16_t pixelSize, uint16_t widt * @param color Color to apply to the texture. */ void FreeTypeGX::copyTextureToFramebuffer(CVideo *pVideo, GX2Texture *texture, int16_t x, int16_t y, int16_t z, const glm::vec4 &color, const float &defaultBlur, const float &blurIntensity, const glm::vec4 &blurColor, - const float &internalRenderingScale) { + const float &superSamplingScale) { static const float imageAngle = 0.0f; - static const float blurScale = (2.0f / (internalRenderingScale)); + static const float blurScale = (2.0f); - float offsetLeft = blurScale * ((float) x + 0.5f * (float) texture->surface.width) * (float) pVideo->getWidthScaleFactor(); - float offsetTop = blurScale * ((float) y - 0.5f * (float) texture->surface.height) * (float) pVideo->getHeightScaleFactor(); + float offsetLeft = blurScale * (1.0f / superSamplingScale) * ((float) x + 0.5f * (float) texture->surface.width) * (float) pVideo->getWidthScaleFactor(); + float offsetTop = blurScale * (1.0f / superSamplingScale) * ((float) y - 0.5f * (float) texture->surface.height) * (float) pVideo->getHeightScaleFactor(); - float widthScale = blurScale * (float) texture->surface.width * pVideo->getWidthScaleFactor(); - float heightScale = blurScale * (float) texture->surface.height * pVideo->getHeightScaleFactor(); + float widthScale = blurScale * (1.0f / superSamplingScale) * (float) texture->surface.width * pVideo->getWidthScaleFactor(); + float heightScale = blurScale * (1.0f / superSamplingScale) * (float) texture->surface.height * pVideo->getHeightScaleFactor(); glm::vec3 positionOffsets(offsetLeft, offsetTop, (float) z); diff --git a/source/gui/GuiText.cpp b/source/gui/GuiText.cpp index fa83328..c523bef 100644 --- a/source/gui/GuiText.cpp +++ b/source/gui/GuiText.cpp @@ -19,8 +19,8 @@ #include FreeTypeGX *GuiText::presentFont = NULL; +int32_t GuiText::presetSSAA = 2; int32_t GuiText::presetSize = 28; -float GuiText::presetInternalRenderingScale = 2.0f; //Lets render the font at the doubled size. This make it even smoother! int32_t GuiText::presetMaxWidth = 0xFFFF; int32_t GuiText::presetAlignment = ALIGN_CENTER | ALIGN_MIDDLE; GX2ColorF32 GuiText::presetColor = (GX2ColorF32) { @@ -43,6 +43,7 @@ GuiText::GuiText() { alpha = presetColor.a; alignment = presetAlignment; maxWidth = presetMaxWidth; + internalSSAA = presetSSAA; wrapMode = 0; textWidth = 0; font = presentFont; @@ -54,7 +55,6 @@ GuiText::GuiText() { blurGlowIntensity = 0.0f; blurAlpha = 0.0f; blurGlowColor = glm::vec4(0.0f); - internalRenderingScale = presetInternalRenderingScale; } GuiText::GuiText(const char *t, int32_t s, const glm::vec4 &c) { @@ -65,6 +65,7 @@ GuiText::GuiText(const char *t, int32_t s, const glm::vec4 &c) { alpha = c[3]; alignment = ALIGN_CENTER | ALIGN_MIDDLE; maxWidth = presetMaxWidth; + internalSSAA = presetSSAA; wrapMode = 0; textWidth = 0; font = presentFont; @@ -76,7 +77,6 @@ GuiText::GuiText(const char *t, int32_t s, const glm::vec4 &c) { blurGlowIntensity = 0.0f; blurAlpha = 0.0f; blurGlowColor = glm::vec4(0.0f); - internalRenderingScale = presetInternalRenderingScale; if (t) { text = FreeTypeGX::charToWideChar(t); @@ -96,6 +96,7 @@ GuiText::GuiText(const wchar_t *t, int32_t s, const glm::vec4 &c) { alpha = c[3]; alignment = ALIGN_CENTER | ALIGN_MIDDLE; maxWidth = presetMaxWidth; + internalSSAA = presetSSAA; wrapMode = 0; textWidth = 0; font = presentFont; @@ -107,7 +108,6 @@ GuiText::GuiText(const wchar_t *t, int32_t s, const glm::vec4 &c) { blurGlowIntensity = 0.0f; blurAlpha = 0.0f; blurGlowColor = glm::vec4(0.0f); - internalRenderingScale = presetInternalRenderingScale; if (t) { text = new(std::nothrow) wchar_t[wcslen(t) + 1]; @@ -132,6 +132,7 @@ GuiText::GuiText(const char *t) { alpha = presetColor.a; alignment = presetAlignment; maxWidth = presetMaxWidth; + internalSSAA = presetSSAA; wrapMode = 0; textWidth = 0; font = presentFont; @@ -143,7 +144,6 @@ GuiText::GuiText(const char *t) { blurGlowIntensity = 0.0f; blurAlpha = 0.0f; blurGlowColor = glm::vec4(0.0f); - internalRenderingScale = presetInternalRenderingScale; if (t) { text = FreeTypeGX::charToWideChar(t); @@ -511,21 +511,16 @@ void GuiText::draw(CVideo *pVideo) { color[3] = getAlpha(); blurGlowColor[3] = blurAlpha * getAlpha(); - float finalRenderingScale = 2.0f * internalRenderingScale; + auto internalRenderingScale = internalSSAA == 0 ? 1 : internalSSAA << 1; - int32_t newSize = size * getScale() * finalRenderingScale; - int32_t normal_size = size * getScale(); + int32_t normal_size = currentSize * getScale(); + int32_t internalRenderingSize = normal_size * internalRenderingScale; - if (newSize != currentSize) { - currentSize = normal_size; + auto textWidth = font->getWidth(text, normal_size); - if (text) { - textWidth = font->getWidth(text, normal_size); - } - } + float x_pos = getCenterX() * internalRenderingScale; + float y_pos = getCenterY() * internalRenderingScale; - float x_pos = getCenterX() * finalRenderingScale; - float y_pos = getCenterY() * finalRenderingScale; if (maxWidth > 0 && maxWidth <= textWidth) { if (wrapMode == DOTTED) { // text dotted @@ -537,23 +532,26 @@ void GuiText::draw(CVideo *pVideo) { textDynWidth.resize(textDyn.size()); for (uint32_t i = 0; i < textDynWidth.size(); i++) { - textDynWidth[i] = font->getWidth(textDyn[i], newSize); + textDynWidth[i] = font->getWidth(textDyn[i], internalRenderingSize); } } if (textDyn.size() > 0) { - font->drawText(pVideo, x_pos, y_pos, getDepth(), textDyn[textDyn.size() - 1], newSize, color, alignment, textDynWidth[textDyn.size() - 1], defaultBlur, blurGlowIntensity, blurGlowColor, finalRenderingScale); + font->drawText(pVideo, x_pos, y_pos, getDepth(), textDyn[textDyn.size() - 1], internalRenderingSize, color, alignment, textDynWidth[textDyn.size() - 1], defaultBlur, blurGlowIntensity, blurGlowColor, internalRenderingScale); } + return; } else if (wrapMode == SCROLL_HORIZONTAL) { scrollText(pVideo->getFrameCount()); if (textDyn.size() > 0) { - font->drawText(pVideo, x_pos, y_pos, getDepth(), textDyn[textDyn.size() - 1], newSize, color, alignment, maxWidth * finalRenderingScale, defaultBlur, blurGlowIntensity, blurGlowColor, finalRenderingScale); + font->drawText(pVideo, x_pos, y_pos, getDepth(), textDyn[textDyn.size() - 1], internalRenderingSize, color, alignment, maxWidth * internalRenderingScale * getScale(), defaultBlur, blurGlowIntensity, blurGlowColor, + internalRenderingScale); } + return; } else if (wrapMode == WRAP) { - int32_t lineheight = newSize + 6; + int32_t lineheight = internalRenderingSize + 6; int32_t yoffset = 0; int32_t voffset = 0; @@ -565,7 +563,7 @@ void GuiText::draw(CVideo *pVideo) { textDynWidth.resize(textDyn.size()); for (uint32_t i = 0; i < textDynWidth.size(); i++) { - textDynWidth[i] = font->getWidth(textDyn[i], newSize); + textDynWidth[i] = font->getWidth(textDyn[i], internalRenderingSize); } } @@ -574,12 +572,13 @@ void GuiText::draw(CVideo *pVideo) { } for (uint32_t i = 0; i < textDyn.size(); i++) { - font->drawText(pVideo, x_pos, y_pos + voffset + yoffset, getDepth(), textDyn[i], newSize, color, alignment, textDynWidth[i], defaultBlur, blurGlowIntensity, blurGlowColor, finalRenderingScale); + font->drawText(pVideo, x_pos, y_pos + y_offset + voffset, getDepth(), textDyn[i], internalRenderingSize, color, alignment, textDynWidth[i], defaultBlur, blurGlowIntensity, blurGlowColor, internalRenderingScale); yoffset -= lineheight; } + return; } - } else { - uint16_t newtextWidth = font->getWidth(text, newSize); - font->drawText(pVideo, x_pos, y_pos, getDepth(), text, newSize, color, alignment, newtextWidth, defaultBlur, blurGlowIntensity, blurGlowColor, finalRenderingScale); } + auto newTextWidth = font->getWidth(text, internalRenderingSize); + font->drawText(pVideo, x_pos, y_pos, getDepth(), text, internalRenderingSize, color, alignment, newTextWidth, defaultBlur, blurGlowIntensity, blurGlowColor, internalRenderingScale); + textMutex.unlock(); }