From ee90e7f95b4f8d53e2e2496bfd2006565b7a0dea Mon Sep 17 00:00:00 2001 From: Redacted Date: Thu, 29 May 2025 22:58:25 -0400 Subject: [PATCH] Fix measure string. --- include/JGL/types/FontCache.h | 6 +-- main.cpp | 16 +++++--- src/renderer/OpenGL/TextRendering.cpp | 7 +++- src/types/Font.cpp | 57 +++++++-------------------- src/types/FontCache.cpp | 4 +- 5 files changed, 35 insertions(+), 55 deletions(-) diff --git a/include/JGL/types/FontCache.h b/include/JGL/types/FontCache.h index 01a52c7..8d7a0e1 100644 --- a/include/JGL/types/FontCache.h +++ b/include/JGL/types/FontCache.h @@ -22,11 +22,11 @@ private: std::array texcoords; public: int x2offset = 0, y2offset = 0, w = 0, h = 0; - float advanceX = 0, advanceY = 0; + float advanceX = 0, advanceY = 0, ascent = 0, descent = 0; //CachedGlyph(GLuint texture_id, char c); - CachedGlyph(char c, std::array texcoords, float x2o, float y2o, float w, float h, float advX, float advY); - char getCharacter() const; + CachedGlyph(char c, std::array texcoords, float x2o, float y2o, float w, float h, float advX, float advY, float asc, float desc); + [[nodiscard]] char getCharacter() const; [[nodiscard]] std::array getTexCoords() const; }; diff --git a/main.cpp b/main.cpp index 0fffe2d..fa88421 100644 --- a/main.cpp +++ b/main.cpp @@ -113,6 +113,7 @@ Texture* image; Texture* image_mask; RenderTarget* j2d_render_target; Shader* shader; +Vector2 result; class JGLDemoWindow : public ReWindow::OpenGLWindow { @@ -140,6 +141,7 @@ public: shader = new Shader(std::filesystem::path("assets/shader_programs/test_vertex.glsl"), std::filesystem::path("assets/shader_programs/test_fragment.glsl"), {{"a_vertex_position", 0}, {"a_instance_position", 1}, {"a_instance_size", 2}, {"a_instance_color", 3}}); + result = Jupiteroid.MeasureString("The quick black fox jumps over the lazy dog.", 16); for (unsigned int i = 0; i < 100; i++) rect_instances.emplace_back(Colors::Red, Vector2(420, 420), Vector2(20, 20)); } @@ -207,6 +209,7 @@ public: J2D::FillRoundedRect(Colors::Purples::BlueViolet, {300, 52}, {100, 100}, 8, 4); J2D::FillCircle(Colors::White, {52, 204}, 50, 24); J2D::OutlineCircle(Colors::White, {153, 204}, 50, 24); + auto box = JGL::Fonts::Jupiteroid.MeasureString("Hello g", 16); J2D::FillChamferRect(Colors::Reds::LightSalmon, {150, 400}, {64, 64}, 5); J2D::OutlineRoundedRect(Colors::Reds::LightCoral, {250, 350}, {128, 128}, 10, 2); @@ -214,12 +217,13 @@ public: J2D::FillGradientTriangle(Color4(Colors::Red), Color4(Colors::Green), Color4(Colors::Blue), {{0, 275}, {0, 375}, {100, 375}}); J2D::OutlineTriangle(Colors::Blue, {{100, 275}, {0, 275}, {100, 375}}); J2D::DrawGradientLine(Colors::Red, Colors::Blue, {105, 375}, {200, 275}, 2); - auto result = Jupiteroid.MeasureString("Jupiteroid Font", 16); + J2D::DrawString(Colors::Green, "The quick black fox jumps over the lazy dog.", 0, 20, 1, 16); + J2D::OutlineRect(Colors::Red, {0, 20}, result, 1); - J2D::DrawString(Colors::Green, "Jupteroid Font", 0.f, 0, 1.f, 16, Jupiteroid); - J2D::DrawString(Colors::White, "Position: " + std::to_string(camera->position.x) + " " + std::to_string(camera->position.y) + " " + std::to_string(camera->position.z), 0, 16, 1,16, Jupiteroid); - J2D::DrawString(Colors::White, "ViewAngle: " + std::to_string(camera->angle.x) + " " + std::to_string(camera->angle.y) + " " + std::to_string(camera->angle.z), 0, 33, 1,16, Jupiteroid); - J2D::DrawString(Colors::White, "Framerate: " + std::to_string((int) fps), 0, 48, 1, 16, Jupiteroid); + //J2D::DrawString(Colors::Green, "Jupteroid Font", 0.f, 0, 1.f, 16, Jupiteroid); + //J2D::DrawString(Colors::White, "Position: " + std::to_string(camera->position.x) + " " + std::to_string(camera->position.y) + " " + std::to_string(camera->position.z), 0, 16, 1,16, Jupiteroid); + //J2D::DrawString(Colors::White, "ViewAngle: " + std::to_string(camera->angle.x) + " " + std::to_string(camera->angle.y) + " " + std::to_string(camera->angle.z), 0, 33, 1,16, Jupiteroid); + //J2D::DrawString(Colors::White, "Framerate: " + std::to_string((int) fps), 0, 48, 1, 16, Jupiteroid); std::array polygon = {Vector2(200, 400), {220, 420}, {220, 430}, {230, 410}, {200, 400}}; J2D::OutlinePolygon(Colors::White, polygon.data(), polygon.size()); J2D::DrawCubicBezierCurve(Colors::Blues::CornflowerBlue, @@ -239,7 +243,7 @@ public: J2D::Begin(nullptr, nullptr, true); J2D::DrawRenderTarget(j2d_render_target, {0, 0}); - J2D::DrawSprite(image, image_mask, {0, 0}, 0.25, {0.5, 0.5}, {1,1}); + //J2D::DrawSprite(image, image_mask, {0, 0}, 0.25, {0.5, 0.5}, {1,1}); J2D::End(); } diff --git a/src/renderer/OpenGL/TextRendering.cpp b/src/renderer/OpenGL/TextRendering.cpp index 6e4556c..bfdf2d5 100644 --- a/src/renderer/OpenGL/TextRendering.cpp +++ b/src/renderer/OpenGL/TextRendering.cpp @@ -86,7 +86,10 @@ namespace JGL { u1, v0 }; - cachedFont->appendGlyph(new CachedGlyph((char)charcode, texcoords, g->bitmap_left, g->bitmap_top, g->bitmap.width, g->bitmap.rows, (g->advance.x >> 6), (g->advance.y >> 6))); + float ascent = font.face->size->metrics.ascender / 64.0f; + float descent = -font.face->size->metrics.descender / 64.0f; + + cachedFont->appendGlyph(new CachedGlyph((char) charcode, texcoords, g->bitmap_left, g->bitmap_top, g->bitmap.width, g->bitmap.rows, (g->advance.x >> 6), (g->advance.y >> 6), ascent, descent)); xoffset += g->bitmap.width; charcode = FT_Get_Next_Char(font.face, charcode, &gindex); @@ -134,7 +137,7 @@ namespace JGL { continue; x2 = x + glyph->x2offset * scale; - y2 = y - glyph->y2offset * scale; // Adjust y-coordinate + y2 = y - glyph->y2offset * scale; w = glyph->w * scale; h = glyph->h * scale; x += glyph->advanceX * scale; diff --git a/src/types/Font.cpp b/src/types/Font.cpp index 309498e..216e396 100644 --- a/src/types/Font.cpp +++ b/src/types/Font.cpp @@ -108,61 +108,32 @@ namespace JGL { return Font(path); } - Vector2 Font::MeasureString(const std::string &text, unsigned int ptSize) { - Vector2 extents = Vector2(0,0); - bool font_of_size_in_cache = false; + Vector2 Font::MeasureString(const std::string& text, unsigned int ptSize) { + Vector2 extents = Vector2::Zero; - for(const auto& f : fontCache.getFonts()) { - if (f->getFontSize() == ptSize) { - font_of_size_in_cache = true; - break; + for(auto& f : fontCache.getFonts()) { + if (f->getFontIndex() == this->index) { + for (const char &c: text) { + auto glyph = f->getGlyph(c); + extents.x += glyph->advanceX; + extents.y = glyph->ascent + glyph->descent; + } + return extents; } } - if (font_of_size_in_cache) { - CachedFont* font; - - for (auto* f: fontCache.getFonts()) - if (f->getFontSize() == ptSize) - font = f; - - for (const char& c : text) - extents.x += font->getGlyph(c)->advanceX; - - extents.y = ptSize; - return extents; - } - - jlog::Warning("Measuring a font size that is not cached, Defaulting to Jupiteroid."); - FT_Set_Pixel_Sizes(Fonts::Jupiteroid.face, ptSize, ptSize); - + // No cache + FT_Set_Pixel_Sizes(this->face, ptSize, ptSize); for (const char& c : text) { - // TODO: Fix segfault - //FT_GlyphSlot slot = Fonts::Jupiteroid.face->glyph; - //auto glyph_index = FT_Get_Char_Index(Fonts::Jupiteroid.face, c); FT_GlyphSlot slot = face->glyph; auto glyph_index = FT_Get_Char_Index(this->face, c); - - //auto error = FT_Load_Glyph(Fonts::Jupiteroid.face, glyph_index, FT_LOAD_DEFAULT); auto error = FT_Load_Glyph(this->face, glyph_index, FT_LOAD_DEFAULT); if (error) continue; - - Vector2 advance = {static_cast(slot->advance.x >> 6), - static_cast(slot->advance.y >> 6)}; - - - extents += advance; - - // Gives smaller results than we'd want. - if (extents.y < slot->metrics.height / 64) - extents.y = slot->metrics.height / 64; - - // Just fucking hardcode it, we know the glyph height is roughly always the ptSize anyway. - if (extents.y < ptSize) - extents.y = ptSize; + extents.x += static_cast(slot->advance.x >> 6); + extents.y = (face->size->metrics.ascender / 64.0f) + (-face->size->metrics.descender / 64.0f); } return extents; } diff --git a/src/types/FontCache.cpp b/src/types/FontCache.cpp index 4ccbbde..6a42216 100644 --- a/src/types/FontCache.cpp +++ b/src/types/FontCache.cpp @@ -10,7 +10,7 @@ std::array CachedGlyph::getTexCoords() const { return texcoords; } -CachedGlyph::CachedGlyph(char c, std::array texcoords, float x2offset, float y2offset, float w, float h, float advanceX, float advanceY) { +CachedGlyph::CachedGlyph(char c, std::array texcoords, float x2offset, float y2offset, float w, float h, float advanceX, float advanceY, float asc, float desc) { character = c; this->x2offset = x2offset; this->y2offset = y2offset; @@ -19,6 +19,8 @@ CachedGlyph::CachedGlyph(char c, std::array texcoords, float x2offs this->advanceX = advanceX; this->advanceY = advanceY; this->texcoords = texcoords; + this->ascent = asc; + this->descent = desc; } void JGL::CachedFont::appendGlyph(JGL::CachedGlyph* glyph) {