/* * Copyright (c) 2018-2020, Andreas Kling * Copyright (c) 2021, sin-ack * Copyright (c) 2024-2025, Aliaksandr Kalenik * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include #include #include class SkTextBlob; namespace Gfx { struct DrawGlyph { FloatPoint position; size_t length_in_code_units { 0 }; float glyph_width { 0.0 }; u32 glyph_id { 0 }; }; class GlyphRun : public AtomicRefCounted { public: enum class TextType { Common, ContextDependent, EndPadding, Ltr, Rtl, }; GlyphRun(Vector&& glyphs, NonnullRefPtr font, TextType text_type, float width); ~GlyphRun(); [[nodiscard]] Font const& font() const { return m_font; } [[nodiscard]] TextType text_type() const { return m_text_type; } [[nodiscard]] Vector const& glyphs() const { return m_glyphs; } [[nodiscard]] Vector& glyphs() { return m_glyphs; } [[nodiscard]] bool is_empty() const { return m_glyphs.is_empty(); } [[nodiscard]] float width() const { return m_width; } [[nodiscard]] NonnullRefPtr slice(size_t start, size_t length) const; void ensure_text_blob(float scale) const; FloatRect cached_blob_bounds() const; SkTextBlob* cached_skia_text_blob() const; private: Vector m_glyphs; NonnullRefPtr m_font; TextType m_text_type; float m_width { 0 }; struct CachedTextBlob; mutable OwnPtr m_cached_text_blob; }; NonnullRefPtr shape_text(FloatPoint baseline_start, float letter_spacing, Utf16View const&, Gfx::Font const& font, GlyphRun::TextType); Vector> shape_text(FloatPoint baseline_start, Utf16View const&, FontCascadeList const&); float measure_text_width(Utf16View const&, Font const& font, float letter_spacing = 0.f); }