diff --git a/Userland/Libraries/LibPDF/Fonts/PDFFont.h b/Userland/Libraries/LibPDF/Fonts/PDFFont.h index ffa49a6da2..555701230d 100644 --- a/Userland/Libraries/LibPDF/Fonts/PDFFont.h +++ b/Userland/Libraries/LibPDF/Fonts/PDFFont.h @@ -41,7 +41,7 @@ public: virtual u32 char_code_to_code_point(u16 char_code) const = 0; virtual float get_char_width(u16 char_code) const = 0; - virtual void draw_glyph(Gfx::Painter& painter, Gfx::IntPoint point, float width, u32 char_code, Color color) = 0; + virtual void draw_glyph(Gfx::Painter& painter, Gfx::FloatPoint point, float width, u32 char_code, Color color) = 0; virtual bool is_standard_font() const { return m_is_standard_font; } virtual Type type() const = 0; diff --git a/Userland/Libraries/LibPDF/Fonts/PS1FontProgram.cpp b/Userland/Libraries/LibPDF/Fonts/PS1FontProgram.cpp index 9c0c698822..73344897d4 100644 --- a/Userland/Libraries/LibPDF/Fonts/PS1FontProgram.cpp +++ b/Userland/Libraries/LibPDF/Fonts/PS1FontProgram.cpp @@ -94,15 +94,16 @@ PDFErrorOr PS1FontProgram::create(ReadonlyBytes const& bytes, RefPtr PS1FontProgram::rasterize_glyph(u32 char_code, float width) +RefPtr PS1FontProgram::rasterize_glyph(u32 char_code, float width, Gfx::GlyphSubpixelOffset subpixel_offset) { auto path = build_char(char_code, width); auto bounding_box = path.bounding_box().size(); - u32 w = (u32)ceilf(bounding_box.width()) + 1; - u32 h = (u32)ceilf(bounding_box.height()) + 1; + u32 w = (u32)ceilf(bounding_box.width()) + 2; + u32 h = (u32)ceilf(bounding_box.height()) + 2; Gfx::PathRasterizer rasterizer(Gfx::IntSize(w, h)); + rasterizer.translate(subpixel_offset.to_float_point()); rasterizer.draw_path(path); return rasterizer.accumulate(); } diff --git a/Userland/Libraries/LibPDF/Fonts/PS1FontProgram.h b/Userland/Libraries/LibPDF/Fonts/PS1FontProgram.h index acbd554e35..ca660674aa 100644 --- a/Userland/Libraries/LibPDF/Fonts/PS1FontProgram.h +++ b/Userland/Libraries/LibPDF/Fonts/PS1FontProgram.h @@ -8,6 +8,7 @@ #include #include +#include #include #include @@ -20,7 +21,7 @@ class PS1FontProgram : public RefCounted { public: PDFErrorOr create(ReadonlyBytes const&, RefPtr, size_t cleartext_length, size_t encrypted_length); - RefPtr rasterize_glyph(u32 char_code, float width); + RefPtr rasterize_glyph(u32 char_code, float width, Gfx::GlyphSubpixelOffset); Gfx::Path build_char(u32 char_code, float width); RefPtr encoding() const { return m_encoding; } diff --git a/Userland/Libraries/LibPDF/Fonts/TrueTypeFont.cpp b/Userland/Libraries/LibPDF/Fonts/TrueTypeFont.cpp index 2d74810250..9c94329d43 100644 --- a/Userland/Libraries/LibPDF/Fonts/TrueTypeFont.cpp +++ b/Userland/Libraries/LibPDF/Fonts/TrueTypeFont.cpp @@ -68,7 +68,7 @@ float TrueTypeFont::get_char_width(u16 char_code) const return static_cast(width) / 1000.0f; } -void TrueTypeFont::draw_glyph(Gfx::Painter& painter, Gfx::IntPoint point, float, u32 char_code, Color color) +void TrueTypeFont::draw_glyph(Gfx::Painter& painter, Gfx::FloatPoint point, float, u32 char_code, Color color) { if (!m_data.font) return; diff --git a/Userland/Libraries/LibPDF/Fonts/TrueTypeFont.h b/Userland/Libraries/LibPDF/Fonts/TrueTypeFont.h index 333e62f524..b03a614a44 100644 --- a/Userland/Libraries/LibPDF/Fonts/TrueTypeFont.h +++ b/Userland/Libraries/LibPDF/Fonts/TrueTypeFont.h @@ -24,7 +24,7 @@ public: u32 char_code_to_code_point(u16 char_code) const override; float get_char_width(u16 char_code) const override; - void draw_glyph(Gfx::Painter&, Gfx::IntPoint, float, u32, Color) override; + void draw_glyph(Gfx::Painter&, Gfx::FloatPoint, float, u32, Color) override; Type type() const override { return PDFFont::Type::TrueType; } diff --git a/Userland/Libraries/LibPDF/Fonts/Type0Font.h b/Userland/Libraries/LibPDF/Fonts/Type0Font.h index 15a943dad3..f74751b956 100644 --- a/Userland/Libraries/LibPDF/Fonts/Type0Font.h +++ b/Userland/Libraries/LibPDF/Fonts/Type0Font.h @@ -27,7 +27,7 @@ public: u32 char_code_to_code_point(u16 char_code) const override; float get_char_width(u16 char_code) const override; - void draw_glyph(Gfx::Painter&, Gfx::IntPoint, float, u32, Color) override {}; + void draw_glyph(Gfx::Painter&, Gfx::FloatPoint, float, u32, Color) override {}; Type type() const override { return PDFFont::Type::Type0; } diff --git a/Userland/Libraries/LibPDF/Fonts/Type1Font.cpp b/Userland/Libraries/LibPDF/Fonts/Type1Font.cpp index e1beb93e6a..4fc4c8889e 100644 --- a/Userland/Libraries/LibPDF/Fonts/Type1Font.cpp +++ b/Userland/Libraries/LibPDF/Fonts/Type1Font.cpp @@ -76,23 +76,26 @@ float Type1Font::get_char_width(u16 char_code) const return static_cast(width) / 1000.0f; } -void Type1Font::draw_glyph(Gfx::Painter& painter, Gfx::IntPoint point, float width, u32 char_code, Color color) +void Type1Font::draw_glyph(Gfx::Painter& painter, Gfx::FloatPoint point, float width, u32 char_code, Color color) { if (!m_data.font_program) return; + auto translation = m_data.font_program->glyph_translation(char_code, width); + point = point.translated(translation); + + auto glyph_position = Gfx::GlyphRasterPosition::get_nearest_fit_for(point); + Gfx::GlyphIndexWithSubpixelOffset index { char_code, glyph_position.subpixel_offset }; RefPtr bitmap; - - auto maybe_bitmap = m_glyph_cache.get(char_code); + auto maybe_bitmap = m_glyph_cache.get(index); if (maybe_bitmap.has_value()) { bitmap = maybe_bitmap.value(); } else { - bitmap = m_data.font_program->rasterize_glyph(char_code, width); - m_glyph_cache.set(char_code, bitmap); + bitmap = m_data.font_program->rasterize_glyph(char_code, width, glyph_position.subpixel_offset); + m_glyph_cache.set(index, bitmap); } - auto translation = m_data.font_program->glyph_translation(char_code, width); - painter.blit_filtered(point.translated(translation.to_rounded()), *bitmap, bitmap->rect(), [color](Color pixel) -> Color { + painter.blit_filtered(glyph_position.blit_position, *bitmap, bitmap->rect(), [color](Color pixel) -> Color { return pixel.multiply(color); }); } diff --git a/Userland/Libraries/LibPDF/Fonts/Type1Font.h b/Userland/Libraries/LibPDF/Fonts/Type1Font.h index bd99befdd1..104d4ad954 100644 --- a/Userland/Libraries/LibPDF/Fonts/Type1Font.h +++ b/Userland/Libraries/LibPDF/Fonts/Type1Font.h @@ -6,6 +6,7 @@ #pragma once +#include #include #include @@ -27,13 +28,13 @@ public: u32 char_code_to_code_point(u16 char_code) const override; float get_char_width(u16 char_code) const override; - void draw_glyph(Gfx::Painter& painter, Gfx::IntPoint point, float width, u32 char_code, Color color) override; + void draw_glyph(Gfx::Painter& painter, Gfx::FloatPoint point, float width, u32 char_code, Color color) override; Type type() const override { return PDFFont::Type::Type1; } private: Data m_data; - HashMap> m_glyph_cache; + HashMap> m_glyph_cache; }; } diff --git a/Userland/Libraries/LibPDF/Renderer.cpp b/Userland/Libraries/LibPDF/Renderer.cpp index 6c8f434a42..c41f1ba124 100644 --- a/Userland/Libraries/LibPDF/Renderer.cpp +++ b/Userland/Libraries/LibPDF/Renderer.cpp @@ -747,7 +747,7 @@ void Renderer::show_text(DeprecatedString const& string) auto glyph_width = char_width * font_size; if (code_point != 0x20) - text_state().font->draw_glyph(m_painter, glyph_position.to_type(), glyph_width, char_code, state().paint_color); + text_state().font->draw_glyph(m_painter, glyph_position, glyph_width, char_code, state().paint_color); auto tx = glyph_width; tx += text_state().character_spacing;