浏览代码

LibGfx+FontEditor: Account for raw width when painting glyphs

Fixes hidden glyphs being painted in editor and map, and '?'
subsitute glyphs being overdrawn in the system.
thankyouverycool 4 年之前
父节点
当前提交
cc7744f6ca

+ 1 - 1
Userland/Applications/FontEditor/GlyphEditorWidget.cpp

@@ -147,7 +147,7 @@ void GlyphEditorWidget::paint_event(GUI::PaintEvent& event)
     for (int y = 0; y < font().glyph_height(); ++y) {
     for (int y = 0; y < font().glyph_height(); ++y) {
         for (int x = 0; x < font().max_glyph_width(); ++x) {
         for (int x = 0; x < font().max_glyph_width(); ++x) {
             Gfx::IntRect rect { x * m_scale, y * m_scale, m_scale, m_scale };
             Gfx::IntRect rect { x * m_scale, y * m_scale, m_scale, m_scale };
-            if (x >= font().glyph_width(m_glyph)) {
+            if (x >= font().raw_glyph_width(m_glyph)) {
                 painter.fill_rect(rect, palette().threed_shadow1());
                 painter.fill_rect(rect, palette().threed_shadow1());
             } else {
             } else {
                 if (bitmap.bit_at(x, y))
                 if (bitmap.bit_at(x, y))

+ 2 - 1
Userland/Applications/FontEditor/GlyphMapWidget.cpp

@@ -98,7 +98,8 @@ void GlyphMapWidget::paint_event(GUI::PaintEvent& event)
             font().glyph_height());
             font().glyph_height());
         if (glyph == m_selected_glyph) {
         if (glyph == m_selected_glyph) {
             painter.fill_rect(outer_rect, is_focused() ? palette().selection() : palette().inactive_selection());
             painter.fill_rect(outer_rect, is_focused() ? palette().selection() : palette().inactive_selection());
-            painter.draw_glyph(inner_rect.location(), glyph, is_focused() ? palette().selection_text() : palette().inactive_selection_text());
+            if (m_font->contains_glyph(glyph))
+                painter.draw_glyph(inner_rect.location(), glyph, is_focused() ? palette().selection_text() : palette().inactive_selection_text());
         } else if (m_font->contains_glyph(glyph)) {
         } else if (m_font->contains_glyph(glyph)) {
             painter.fill_rect(outer_rect, palette().base());
             painter.fill_rect(outer_rect, palette().base());
             painter.draw_glyph(inner_rect.location(), glyph, palette().base_text());
             painter.draw_glyph(inner_rect.location(), glyph, palette().base_text());

+ 6 - 2
Userland/Libraries/LibGfx/BitmapFont.cpp

@@ -241,8 +241,12 @@ Glyph BitmapFont::glyph(u32 code_point) const
 
 
 int BitmapFont::glyph_or_emoji_width(u32 code_point) const
 int BitmapFont::glyph_or_emoji_width(u32 code_point) const
 {
 {
-    if (code_point < m_glyph_count)
-        return glyph_width(code_point);
+    if (code_point < m_glyph_count) {
+        if (m_glyph_widths[code_point] > 0)
+            return glyph_width(code_point);
+        else
+            return glyph_width('?');
+    }
 
 
     if (m_fixed_width)
     if (m_fixed_width)
         return m_glyph_width;
         return m_glyph_width;