mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-08-01 05:39:11 +00:00
LibGfx: Join ScaledFont into Font
Since ScaledFont is the only class inherited from Font we could simply merge them.
This commit is contained in:
parent
16e883a9a3
commit
8e2d1559ec
Notes:
github-actions[bot]
2025-04-21 07:52:41 +00:00
Author: https://github.com/kalenikaliaksandr
Commit: 8e2d1559ec
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/4409
18 changed files with 166 additions and 234 deletions
|
@ -13,9 +13,8 @@ set(SOURCES
|
||||||
Font/Font.cpp
|
Font/Font.cpp
|
||||||
Font/FontData.cpp
|
Font/FontData.cpp
|
||||||
Font/FontDatabase.cpp
|
Font/FontDatabase.cpp
|
||||||
|
Font/FontSkia.cpp
|
||||||
Font/PathFontProvider.cpp
|
Font/PathFontProvider.cpp
|
||||||
Font/ScaledFont.cpp
|
|
||||||
Font/ScaledFontSkia.cpp
|
|
||||||
Font/Typeface.cpp
|
Font/Typeface.cpp
|
||||||
Font/TypefaceSkia.cpp
|
Font/TypefaceSkia.cpp
|
||||||
Font/WOFF/Loader.cpp
|
Font/WOFF/Loader.cpp
|
||||||
|
|
|
@ -1,15 +1,108 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2023, MacDue <macdue@dueutil.tech>
|
* Copyright (c) 2023, MacDue <macdue@dueutil.tech>
|
||||||
|
* Copyright (c) 2025, Aliaksandr Kalenik <kalenik.aliaksandr@gmail.com>
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: BSD-2-Clause
|
* SPDX-License-Identifier: BSD-2-Clause
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <AK/TypeCasts.h>
|
||||||
|
#include <AK/Utf8View.h>
|
||||||
#include <LibGfx/Font/Font.h>
|
#include <LibGfx/Font/Font.h>
|
||||||
#include <LibGfx/Font/FontDatabase.h>
|
#include <LibGfx/Font/FontDatabase.h>
|
||||||
|
#include <LibGfx/Font/TypefaceSkia.h>
|
||||||
|
#include <LibGfx/TextLayout.h>
|
||||||
|
|
||||||
|
#include <core/SkFont.h>
|
||||||
|
#include <core/SkFontMetrics.h>
|
||||||
|
#include <core/SkFontTypes.h>
|
||||||
|
|
||||||
#include <harfbuzz/hb.h>
|
#include <harfbuzz/hb.h>
|
||||||
|
|
||||||
namespace Gfx {
|
namespace Gfx {
|
||||||
|
|
||||||
|
Font::Font(NonnullRefPtr<Typeface const> typeface, float point_width, float point_height, unsigned dpi_x, unsigned dpi_y)
|
||||||
|
: m_typeface(move(typeface))
|
||||||
|
, m_point_width(point_width)
|
||||||
|
, m_point_height(point_height)
|
||||||
|
{
|
||||||
|
float const units_per_em = m_typeface->units_per_em();
|
||||||
|
m_x_scale = (point_width * dpi_x) / (POINTS_PER_INCH * units_per_em);
|
||||||
|
m_y_scale = (point_height * dpi_y) / (POINTS_PER_INCH * units_per_em);
|
||||||
|
|
||||||
|
m_pixel_size = m_point_height * (DEFAULT_DPI / POINTS_PER_INCH);
|
||||||
|
m_pixel_size_rounded_up = static_cast<int>(ceilf(m_pixel_size));
|
||||||
|
|
||||||
|
auto const* sk_typeface = as<TypefaceSkia>(*m_typeface).sk_typeface();
|
||||||
|
SkFont const font { sk_ref_sp(sk_typeface), m_pixel_size };
|
||||||
|
|
||||||
|
SkFontMetrics skMetrics;
|
||||||
|
font.getMetrics(&skMetrics);
|
||||||
|
|
||||||
|
FontPixelMetrics metrics;
|
||||||
|
metrics.size = font.getSize();
|
||||||
|
metrics.x_height = skMetrics.fXHeight;
|
||||||
|
metrics.advance_of_ascii_zero = font.measureText("0", 1, SkTextEncoding::kUTF8);
|
||||||
|
metrics.ascent = -skMetrics.fAscent;
|
||||||
|
metrics.descent = skMetrics.fDescent;
|
||||||
|
metrics.line_gap = skMetrics.fLeading;
|
||||||
|
|
||||||
|
m_pixel_metrics = metrics;
|
||||||
|
}
|
||||||
|
|
||||||
|
ScaledFontMetrics Font::metrics() const
|
||||||
|
{
|
||||||
|
SkFontMetrics sk_metrics;
|
||||||
|
skia_font(1).getMetrics(&sk_metrics);
|
||||||
|
|
||||||
|
ScaledFontMetrics metrics;
|
||||||
|
metrics.ascender = -sk_metrics.fAscent;
|
||||||
|
metrics.descender = sk_metrics.fDescent;
|
||||||
|
metrics.line_gap = sk_metrics.fLeading;
|
||||||
|
metrics.x_height = sk_metrics.fXHeight;
|
||||||
|
return metrics;
|
||||||
|
}
|
||||||
|
|
||||||
|
float Font::width(StringView view) const { return measure_text_width(Utf8View(view), *this, {}); }
|
||||||
|
float Font::width(Utf8View const& view) const { return measure_text_width(view, *this, {}); }
|
||||||
|
|
||||||
|
float Font::glyph_width(u32 code_point) const
|
||||||
|
{
|
||||||
|
auto string = String::from_code_point(code_point);
|
||||||
|
return measure_text_width(Utf8View(string), *this, {});
|
||||||
|
}
|
||||||
|
|
||||||
|
NonnullRefPtr<Font> Font::scaled_with_size(float point_size) const
|
||||||
|
{
|
||||||
|
if (point_size == m_point_height && point_size == m_point_width)
|
||||||
|
return *const_cast<Font*>(this);
|
||||||
|
return m_typeface->font(point_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
NonnullRefPtr<Font> Font::with_size(float point_size) const
|
||||||
|
{
|
||||||
|
return scaled_with_size(point_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
Gfx::FontPixelMetrics Font::pixel_metrics() const
|
||||||
|
{
|
||||||
|
return m_pixel_metrics;
|
||||||
|
}
|
||||||
|
|
||||||
|
float Font::pixel_size() const
|
||||||
|
{
|
||||||
|
return m_pixel_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Font::pixel_size_rounded_up() const
|
||||||
|
{
|
||||||
|
return m_pixel_size_rounded_up;
|
||||||
|
}
|
||||||
|
|
||||||
|
float Font::point_size() const
|
||||||
|
{
|
||||||
|
return m_point_height;
|
||||||
|
}
|
||||||
|
|
||||||
Font::~Font()
|
Font::~Font()
|
||||||
{
|
{
|
||||||
if (m_harfbuzz_font)
|
if (m_harfbuzz_font)
|
||||||
|
|
|
@ -1,17 +1,19 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2020, Stephan Unverwerth <s.unverwerth@serenityos.org>
|
* Copyright (c) 2020, Stephan Unverwerth <s.unverwerth@serenityos.org>
|
||||||
|
* Copyright (c) 2023, MacDue <macdue@dueutil.tech>
|
||||||
* Copyright (c) 2023, Andreas Kling <andreas@ladybird.org>
|
* Copyright (c) 2023, Andreas Kling <andreas@ladybird.org>
|
||||||
|
* Copyright (c) 2025, Aliaksandr Kalenik <kalenik.aliaksandr@gmail.com>
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: BSD-2-Clause
|
* SPDX-License-Identifier: BSD-2-Clause
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <AK/RefCounted.h>
|
#include <AK/FlyString.h>
|
||||||
#include <AK/RefPtr.h>
|
#include <LibGfx/Font/Font.h>
|
||||||
#include <AK/String.h>
|
#include <LibGfx/Font/Typeface.h>
|
||||||
#include <AK/Types.h>
|
|
||||||
|
|
||||||
|
class SkFont;
|
||||||
struct hb_font_t;
|
struct hb_font_t;
|
||||||
|
|
||||||
namespace Gfx {
|
namespace Gfx {
|
||||||
|
@ -48,50 +50,51 @@ enum FontWidth {
|
||||||
|
|
||||||
constexpr float text_shaping_resolution = 64;
|
constexpr float text_shaping_resolution = 64;
|
||||||
|
|
||||||
class Typeface;
|
|
||||||
|
|
||||||
class Font : public RefCounted<Font> {
|
class Font : public RefCounted<Font> {
|
||||||
public:
|
public:
|
||||||
virtual ~Font();
|
Font(NonnullRefPtr<Typeface const>, float point_width, float point_height, unsigned dpi_x = DEFAULT_DPI, unsigned dpi_y = DEFAULT_DPI);
|
||||||
|
ScaledFontMetrics metrics() const;
|
||||||
|
~Font();
|
||||||
|
|
||||||
virtual FontPixelMetrics pixel_metrics() const = 0;
|
float point_size() const;
|
||||||
|
float pixel_size() const;
|
||||||
|
int pixel_size_rounded_up() const;
|
||||||
|
Gfx::FontPixelMetrics pixel_metrics() const;
|
||||||
|
u8 slope() const { return m_typeface->slope(); }
|
||||||
|
u16 weight() const { return m_typeface->weight(); }
|
||||||
|
bool contains_glyph(u32 code_point) const { return m_typeface->glyph_id_for_code_point(code_point) > 0; }
|
||||||
|
float glyph_width(u32 code_point) const;
|
||||||
|
u32 glyph_id_for_code_point(u32 code_point) const { return m_typeface->glyph_id_for_code_point(code_point); }
|
||||||
|
float preferred_line_height() const { return metrics().height() + metrics().line_gap; }
|
||||||
|
int x_height() const { return m_point_height; } // FIXME: Read from font
|
||||||
|
u8 baseline() const { return m_point_height; } // FIXME: Read from font
|
||||||
|
float width(StringView) const;
|
||||||
|
float width(Utf8View const&) const;
|
||||||
|
FlyString const& family() const { return m_typeface->family(); }
|
||||||
|
|
||||||
virtual u8 slope() const = 0;
|
NonnullRefPtr<Font> scaled_with_size(float point_size) const;
|
||||||
|
NonnullRefPtr<Font> with_size(float point_size) const;
|
||||||
|
|
||||||
// Font point size (distance between ascender and descender).
|
Typeface const& typeface() const { return m_typeface; }
|
||||||
virtual float point_size() const = 0;
|
|
||||||
|
|
||||||
// Font pixel size (distance between ascender and descender).
|
SkFont skia_font(float scale) const;
|
||||||
virtual float pixel_size() const = 0;
|
|
||||||
|
|
||||||
// Font pixel size, rounded up to the nearest integer.
|
|
||||||
virtual int pixel_size_rounded_up() const = 0;
|
|
||||||
|
|
||||||
virtual u16 weight() const = 0;
|
|
||||||
virtual bool contains_glyph(u32 code_point) const = 0;
|
|
||||||
|
|
||||||
virtual u32 glyph_id_for_code_point(u32 code_point) const = 0;
|
|
||||||
virtual float glyph_width(u32 code_point) const = 0;
|
|
||||||
virtual int x_height() const = 0;
|
|
||||||
virtual float preferred_line_height() const = 0;
|
|
||||||
|
|
||||||
virtual u8 baseline() const = 0;
|
|
||||||
|
|
||||||
virtual float width(StringView) const = 0;
|
|
||||||
virtual float width(Utf8View const&) const = 0;
|
|
||||||
|
|
||||||
virtual FlyString const& family() const = 0;
|
|
||||||
|
|
||||||
virtual NonnullRefPtr<Font> with_size(float point_size) const = 0;
|
|
||||||
|
|
||||||
Font const& bold_variant() const;
|
Font const& bold_variant() const;
|
||||||
hb_font_t* harfbuzz_font() const;
|
hb_font_t* harfbuzz_font() const;
|
||||||
|
|
||||||
virtual Typeface const& typeface() const = 0;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
mutable RefPtr<Gfx::Font const> m_bold_variant;
|
mutable RefPtr<Font const> m_bold_variant;
|
||||||
mutable hb_font_t* m_harfbuzz_font { nullptr };
|
mutable hb_font_t* m_harfbuzz_font { nullptr };
|
||||||
|
|
||||||
|
NonnullRefPtr<Typeface const> m_typeface;
|
||||||
|
float m_x_scale { 0.0f };
|
||||||
|
float m_y_scale { 0.0f };
|
||||||
|
float m_point_width { 0.0f };
|
||||||
|
float m_point_height { 0.0f };
|
||||||
|
FontPixelMetrics m_pixel_metrics;
|
||||||
|
|
||||||
|
float m_pixel_size { 0.0f };
|
||||||
|
int m_pixel_size_rounded_up { 0 };
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,14 +5,14 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <AK/TypeCasts.h>
|
#include <AK/TypeCasts.h>
|
||||||
#include <LibGfx/Font/ScaledFont.h>
|
#include <LibGfx/Font/Font.h>
|
||||||
#include <LibGfx/Font/TypefaceSkia.h>
|
#include <LibGfx/Font/TypefaceSkia.h>
|
||||||
|
|
||||||
#include <core/SkFont.h>
|
#include <core/SkFont.h>
|
||||||
|
|
||||||
namespace Gfx {
|
namespace Gfx {
|
||||||
|
|
||||||
SkFont ScaledFont::skia_font(float scale) const
|
SkFont Font::skia_font(float scale) const
|
||||||
{
|
{
|
||||||
auto const& sk_typeface = as<TypefaceSkia>(*m_typeface).sk_typeface();
|
auto const& sk_typeface = as<TypefaceSkia>(*m_typeface).sk_typeface();
|
||||||
auto sk_font = SkFont { sk_ref_sp(sk_typeface), pixel_size() * scale };
|
auto sk_font = SkFont { sk_ref_sp(sk_typeface), pixel_size() * scale };
|
|
@ -7,8 +7,8 @@
|
||||||
#include <AK/Format.h>
|
#include <AK/Format.h>
|
||||||
#include <AK/LexicalPath.h>
|
#include <AK/LexicalPath.h>
|
||||||
#include <LibCore/Resource.h>
|
#include <LibCore/Resource.h>
|
||||||
|
#include <LibGfx/Font/Font.h>
|
||||||
#include <LibGfx/Font/PathFontProvider.h>
|
#include <LibGfx/Font/PathFontProvider.h>
|
||||||
#include <LibGfx/Font/ScaledFont.h>
|
|
||||||
#include <LibGfx/Font/WOFF/Loader.h>
|
#include <LibGfx/Font/WOFF/Loader.h>
|
||||||
|
|
||||||
namespace Gfx {
|
namespace Gfx {
|
||||||
|
@ -60,7 +60,7 @@ RefPtr<Gfx::Font> PathFontProvider::get_font(FlyString const& family, float poin
|
||||||
return nullptr;
|
return nullptr;
|
||||||
for (auto const& typeface : it->value) {
|
for (auto const& typeface : it->value) {
|
||||||
if (typeface->weight() == weight && typeface->width() == width && typeface->slope() == slope)
|
if (typeface->weight() == weight && typeface->width() == width && typeface->slope() == slope)
|
||||||
return typeface->scaled_font(point_size);
|
return typeface->font(point_size);
|
||||||
}
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,102 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2022, the SerenityOS developers.
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-2-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <AK/TypeCasts.h>
|
|
||||||
#include <AK/Utf8View.h>
|
|
||||||
#include <LibGfx/Font/ScaledFont.h>
|
|
||||||
#include <LibGfx/Font/TypefaceSkia.h>
|
|
||||||
#include <LibGfx/TextLayout.h>
|
|
||||||
|
|
||||||
#include <core/SkFont.h>
|
|
||||||
#include <core/SkFontMetrics.h>
|
|
||||||
#include <core/SkFontTypes.h>
|
|
||||||
|
|
||||||
namespace Gfx {
|
|
||||||
|
|
||||||
ScaledFont::ScaledFont(NonnullRefPtr<Typeface const> typeface, float point_width, float point_height, unsigned dpi_x, unsigned dpi_y)
|
|
||||||
: m_typeface(move(typeface))
|
|
||||||
, m_point_width(point_width)
|
|
||||||
, m_point_height(point_height)
|
|
||||||
{
|
|
||||||
float const units_per_em = m_typeface->units_per_em();
|
|
||||||
m_x_scale = (point_width * dpi_x) / (POINTS_PER_INCH * units_per_em);
|
|
||||||
m_y_scale = (point_height * dpi_y) / (POINTS_PER_INCH * units_per_em);
|
|
||||||
|
|
||||||
m_pixel_size = m_point_height * (DEFAULT_DPI / POINTS_PER_INCH);
|
|
||||||
m_pixel_size_rounded_up = static_cast<int>(ceilf(m_pixel_size));
|
|
||||||
|
|
||||||
auto const* sk_typeface = as<TypefaceSkia>(*m_typeface).sk_typeface();
|
|
||||||
SkFont const font { sk_ref_sp(sk_typeface), m_pixel_size };
|
|
||||||
|
|
||||||
SkFontMetrics skMetrics;
|
|
||||||
font.getMetrics(&skMetrics);
|
|
||||||
|
|
||||||
FontPixelMetrics metrics;
|
|
||||||
metrics.size = font.getSize();
|
|
||||||
metrics.x_height = skMetrics.fXHeight;
|
|
||||||
metrics.advance_of_ascii_zero = font.measureText("0", 1, SkTextEncoding::kUTF8);
|
|
||||||
metrics.ascent = -skMetrics.fAscent;
|
|
||||||
metrics.descent = skMetrics.fDescent;
|
|
||||||
metrics.line_gap = skMetrics.fLeading;
|
|
||||||
|
|
||||||
m_pixel_metrics = metrics;
|
|
||||||
}
|
|
||||||
|
|
||||||
ScaledFontMetrics ScaledFont::metrics() const
|
|
||||||
{
|
|
||||||
SkFontMetrics sk_metrics;
|
|
||||||
skia_font(1).getMetrics(&sk_metrics);
|
|
||||||
|
|
||||||
ScaledFontMetrics metrics;
|
|
||||||
metrics.ascender = -sk_metrics.fAscent;
|
|
||||||
metrics.descender = sk_metrics.fDescent;
|
|
||||||
metrics.line_gap = sk_metrics.fLeading;
|
|
||||||
metrics.x_height = sk_metrics.fXHeight;
|
|
||||||
return metrics;
|
|
||||||
}
|
|
||||||
|
|
||||||
float ScaledFont::width(StringView view) const { return measure_text_width(Utf8View(view), *this, {}); }
|
|
||||||
float ScaledFont::width(Utf8View const& view) const { return measure_text_width(view, *this, {}); }
|
|
||||||
|
|
||||||
float ScaledFont::glyph_width(u32 code_point) const
|
|
||||||
{
|
|
||||||
auto string = String::from_code_point(code_point);
|
|
||||||
return measure_text_width(Utf8View(string), *this, {});
|
|
||||||
}
|
|
||||||
|
|
||||||
NonnullRefPtr<ScaledFont> ScaledFont::scaled_with_size(float point_size) const
|
|
||||||
{
|
|
||||||
if (point_size == m_point_height && point_size == m_point_width)
|
|
||||||
return *const_cast<ScaledFont*>(this);
|
|
||||||
return m_typeface->scaled_font(point_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
NonnullRefPtr<Font> ScaledFont::with_size(float point_size) const
|
|
||||||
{
|
|
||||||
return scaled_with_size(point_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
Gfx::FontPixelMetrics ScaledFont::pixel_metrics() const
|
|
||||||
{
|
|
||||||
return m_pixel_metrics;
|
|
||||||
}
|
|
||||||
|
|
||||||
float ScaledFont::pixel_size() const
|
|
||||||
{
|
|
||||||
return m_pixel_size;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ScaledFont::pixel_size_rounded_up() const
|
|
||||||
{
|
|
||||||
return m_pixel_size_rounded_up;
|
|
||||||
}
|
|
||||||
|
|
||||||
float ScaledFont::point_size() const
|
|
||||||
{
|
|
||||||
return m_point_height;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,59 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2022, the SerenityOS developers.
|
|
||||||
* Copyright (c) 2023, Andreas Kling <andreas@ladybird.org>
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-2-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <AK/FlyString.h>
|
|
||||||
#include <LibGfx/Font/Font.h>
|
|
||||||
#include <LibGfx/Font/Typeface.h>
|
|
||||||
|
|
||||||
class SkFont;
|
|
||||||
|
|
||||||
namespace Gfx {
|
|
||||||
|
|
||||||
class ScaledFont final : public Gfx::Font {
|
|
||||||
public:
|
|
||||||
ScaledFont(NonnullRefPtr<Typeface const>, float point_width, float point_height, unsigned dpi_x = DEFAULT_DPI, unsigned dpi_y = DEFAULT_DPI);
|
|
||||||
ScaledFontMetrics metrics() const;
|
|
||||||
|
|
||||||
// ^Gfx::Font
|
|
||||||
virtual float point_size() const override;
|
|
||||||
virtual float pixel_size() const override;
|
|
||||||
virtual int pixel_size_rounded_up() const override;
|
|
||||||
virtual Gfx::FontPixelMetrics pixel_metrics() const override;
|
|
||||||
virtual u8 slope() const override { return m_typeface->slope(); }
|
|
||||||
virtual u16 weight() const override { return m_typeface->weight(); }
|
|
||||||
virtual bool contains_glyph(u32 code_point) const override { return m_typeface->glyph_id_for_code_point(code_point) > 0; }
|
|
||||||
virtual float glyph_width(u32 code_point) const override;
|
|
||||||
virtual u32 glyph_id_for_code_point(u32 code_point) const override { return m_typeface->glyph_id_for_code_point(code_point); }
|
|
||||||
virtual float preferred_line_height() const override { return metrics().height() + metrics().line_gap; }
|
|
||||||
virtual int x_height() const override { return m_point_height; } // FIXME: Read from font
|
|
||||||
virtual u8 baseline() const override { return m_point_height; } // FIXME: Read from font
|
|
||||||
virtual float width(StringView) const override;
|
|
||||||
virtual float width(Utf8View const&) const override;
|
|
||||||
virtual FlyString const& family() const override { return m_typeface->family(); }
|
|
||||||
|
|
||||||
virtual NonnullRefPtr<ScaledFont> scaled_with_size(float point_size) const;
|
|
||||||
virtual NonnullRefPtr<Font> with_size(float point_size) const override;
|
|
||||||
|
|
||||||
virtual Typeface const& typeface() const override { return m_typeface; }
|
|
||||||
|
|
||||||
SkFont skia_font(float scale) const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
NonnullRefPtr<Typeface const> m_typeface;
|
|
||||||
float m_x_scale { 0.0f };
|
|
||||||
float m_y_scale { 0.0f };
|
|
||||||
float m_point_width { 0.0f };
|
|
||||||
float m_point_height { 0.0f };
|
|
||||||
Gfx::FontPixelMetrics m_pixel_metrics;
|
|
||||||
|
|
||||||
float m_pixel_size { 0.0f };
|
|
||||||
int m_pixel_size_rounded_up { 0 };
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
#include <harfbuzz/hb.h>
|
#include <harfbuzz/hb.h>
|
||||||
|
|
||||||
#include <LibGfx/Font/ScaledFont.h>
|
#include <LibGfx/Font/Font.h>
|
||||||
#include <LibGfx/Font/Typeface.h>
|
#include <LibGfx/Font/Typeface.h>
|
||||||
#include <LibGfx/Font/TypefaceSkia.h>
|
#include <LibGfx/Font/TypefaceSkia.h>
|
||||||
|
|
||||||
|
@ -40,21 +40,21 @@ Typeface::~Typeface()
|
||||||
hb_blob_destroy(m_harfbuzz_blob);
|
hb_blob_destroy(m_harfbuzz_blob);
|
||||||
}
|
}
|
||||||
|
|
||||||
NonnullRefPtr<ScaledFont> Typeface::scaled_font(float point_size) const
|
NonnullRefPtr<Font> Typeface::font(float point_size) const
|
||||||
{
|
{
|
||||||
auto it = m_scaled_fonts.find(point_size);
|
auto it = m_fonts.find(point_size);
|
||||||
if (it != m_scaled_fonts.end())
|
if (it != m_fonts.end())
|
||||||
return *it->value;
|
return *it->value;
|
||||||
|
|
||||||
// FIXME: It might be nice to have a global cap on the number of fonts we cache
|
// FIXME: It might be nice to have a global cap on the number of fonts we cache
|
||||||
// instead of doing it at the per-Typeface level like this.
|
// instead of doing it at the per-Typeface level like this.
|
||||||
constexpr size_t max_cached_font_size_count = 128;
|
constexpr size_t max_cached_font_size_count = 128;
|
||||||
if (m_scaled_fonts.size() > max_cached_font_size_count)
|
if (m_fonts.size() > max_cached_font_size_count)
|
||||||
m_scaled_fonts.remove(m_scaled_fonts.begin());
|
m_fonts.remove(m_fonts.begin());
|
||||||
|
|
||||||
auto scaled_font = adopt_ref(*new ScaledFont(*this, point_size, point_size));
|
auto font = adopt_ref(*new Font(*this, point_size, point_size));
|
||||||
m_scaled_fonts.set(point_size, scaled_font);
|
m_fonts.set(point_size, font);
|
||||||
return scaled_font;
|
return font;
|
||||||
}
|
}
|
||||||
|
|
||||||
hb_face_t* Typeface::harfbuzz_typeface() const
|
hb_face_t* Typeface::harfbuzz_typeface() const
|
||||||
|
|
|
@ -20,7 +20,7 @@ struct hb_face_t;
|
||||||
|
|
||||||
namespace Gfx {
|
namespace Gfx {
|
||||||
|
|
||||||
class ScaledFont;
|
class Font;
|
||||||
|
|
||||||
struct ScaledFontMetrics {
|
struct ScaledFontMetrics {
|
||||||
float ascender { 0 };
|
float ascender { 0 };
|
||||||
|
@ -50,7 +50,7 @@ public:
|
||||||
virtual u16 width() const = 0;
|
virtual u16 width() const = 0;
|
||||||
virtual u8 slope() const = 0;
|
virtual u8 slope() const = 0;
|
||||||
|
|
||||||
[[nodiscard]] NonnullRefPtr<ScaledFont> scaled_font(float point_size) const;
|
[[nodiscard]] NonnullRefPtr<Font> font(float point_size) const;
|
||||||
|
|
||||||
hb_face_t* harfbuzz_typeface() const;
|
hb_face_t* harfbuzz_typeface() const;
|
||||||
|
|
||||||
|
@ -61,9 +61,9 @@ protected:
|
||||||
virtual unsigned ttc_index() const = 0;
|
virtual unsigned ttc_index() const = 0;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
OwnPtr<Gfx::FontData> m_font_data;
|
OwnPtr<FontData> m_font_data;
|
||||||
|
|
||||||
mutable HashMap<float, NonnullRefPtr<ScaledFont>> m_scaled_fonts;
|
mutable HashMap<float, NonnullRefPtr<Font>> m_fonts;
|
||||||
mutable hb_blob_t* m_harfbuzz_blob { nullptr };
|
mutable hb_blob_t* m_harfbuzz_blob { nullptr };
|
||||||
mutable hb_face_t* m_harfbuzz_face { nullptr };
|
mutable hb_face_t* m_harfbuzz_face { nullptr };
|
||||||
};
|
};
|
||||||
|
|
|
@ -17,7 +17,6 @@ class Emoji;
|
||||||
class Font;
|
class Font;
|
||||||
class ImageDecoder;
|
class ImageDecoder;
|
||||||
struct FontPixelMetrics;
|
struct FontPixelMetrics;
|
||||||
class ScaledFont;
|
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
class Line;
|
class Line;
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
#define AK_DONT_REPLACE_STD
|
#define AK_DONT_REPLACE_STD
|
||||||
|
|
||||||
#include <AK/TypeCasts.h>
|
#include <AK/TypeCasts.h>
|
||||||
#include <LibGfx/Font/ScaledFont.h>
|
#include <LibGfx/Font/Font.h>
|
||||||
#include <LibGfx/PathSkia.h>
|
#include <LibGfx/PathSkia.h>
|
||||||
#include <LibGfx/Rect.h>
|
#include <LibGfx/Rect.h>
|
||||||
#include <LibGfx/SkiaUtils.h>
|
#include <LibGfx/SkiaUtils.h>
|
||||||
|
@ -137,11 +137,11 @@ void PathImplSkia::cubic_bezier_curve_to(FloatPoint c1, FloatPoint c2, FloatPoin
|
||||||
|
|
||||||
void PathImplSkia::text(Utf8View string, Font const& font)
|
void PathImplSkia::text(Utf8View string, Font const& font)
|
||||||
{
|
{
|
||||||
SkTextUtils::GetPath(string.as_string().characters_without_null_termination(), string.as_string().length(), SkTextEncoding::kUTF8, last_point().x(), last_point().y(), as<ScaledFont>(font).skia_font(1), m_path.ptr());
|
SkTextUtils::GetPath(string.as_string().characters_without_null_termination(), string.as_string().length(), SkTextEncoding::kUTF8, last_point().x(), last_point().y(), font.skia_font(1), m_path.ptr());
|
||||||
}
|
}
|
||||||
NonnullOwnPtr<PathImpl> PathImplSkia::place_text_along(Utf8View text, Font const& font) const
|
NonnullOwnPtr<PathImpl> PathImplSkia::place_text_along(Utf8View text, Font const& font) const
|
||||||
{
|
{
|
||||||
auto sk_font = as<ScaledFont>(font).skia_font(1);
|
auto sk_font = font.skia_font(1);
|
||||||
size_t const text_length = text.length();
|
size_t const text_length = text.length();
|
||||||
SkScalar x = 0;
|
SkScalar x = 0;
|
||||||
SkScalar y = 0;
|
SkScalar y = 0;
|
||||||
|
|
|
@ -21,7 +21,6 @@
|
||||||
#include <LibGfx/Font/FontDatabase.h>
|
#include <LibGfx/Font/FontDatabase.h>
|
||||||
#include <LibGfx/Font/FontStyleMapping.h>
|
#include <LibGfx/Font/FontStyleMapping.h>
|
||||||
#include <LibGfx/Font/FontWeight.h>
|
#include <LibGfx/Font/FontWeight.h>
|
||||||
#include <LibGfx/Font/ScaledFont.h>
|
|
||||||
#include <LibGfx/Font/Typeface.h>
|
#include <LibGfx/Font/Typeface.h>
|
||||||
#include <LibGfx/Font/WOFF/Loader.h>
|
#include <LibGfx/Font/WOFF/Loader.h>
|
||||||
#include <LibGfx/Font/WOFF2/Loader.h>
|
#include <LibGfx/Font/WOFF2/Loader.h>
|
||||||
|
@ -236,7 +235,7 @@ RefPtr<Gfx::Font const> FontLoader::font_with_point_size(float point_size)
|
||||||
start_loading_next_url();
|
start_loading_next_url();
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
return m_vector_font->scaled_font(point_size);
|
return m_vector_font->font(point_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FontLoader::start_loading_next_url()
|
void FontLoader::start_loading_next_url()
|
||||||
|
@ -304,7 +303,7 @@ struct StyleComputer::MatchingFontCandidate {
|
||||||
return font_list;
|
return font_list;
|
||||||
}
|
}
|
||||||
|
|
||||||
font_list->add(loader_or_typeface.get<Gfx::Typeface const*>()->scaled_font(point_size));
|
font_list->add(loader_or_typeface.get<Gfx::Typeface const*>()->font(point_size));
|
||||||
return font_list;
|
return font_list;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -150,8 +150,8 @@ public:
|
||||||
bool can_contain_boxes_with_position_absolute() const;
|
bool can_contain_boxes_with_position_absolute() const;
|
||||||
|
|
||||||
Gfx::Font const& first_available_font() const;
|
Gfx::Font const& first_available_font() const;
|
||||||
Gfx::Font const& scaled_font(PaintContext&) const;
|
Gfx::Font const& font(PaintContext&) const;
|
||||||
Gfx::Font const& scaled_font(float scale_factor) const;
|
Gfx::Font const& font(float scale_factor) const;
|
||||||
|
|
||||||
CSS::ImmutableComputedValues const& computed_values() const;
|
CSS::ImmutableComputedValues const& computed_values() const;
|
||||||
|
|
||||||
|
@ -315,12 +315,12 @@ inline Gfx::Font const& Node::first_available_font() const
|
||||||
return parent()->first_available_font();
|
return parent()->first_available_font();
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Gfx::Font const& Node::scaled_font(PaintContext& context) const
|
inline Gfx::Font const& Node::font(PaintContext& context) const
|
||||||
{
|
{
|
||||||
return scaled_font(context.device_pixels_per_css_pixel());
|
return font(context.device_pixels_per_css_pixel());
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Gfx::Font const& Node::scaled_font(float scale_factor) const
|
inline Gfx::Font const& Node::font(float scale_factor) const
|
||||||
{
|
{
|
||||||
auto const& font = first_available_font();
|
auto const& font = first_available_font();
|
||||||
return font.with_size(font.point_size() * scale_factor);
|
return font.with_size(font.point_size() * scale_factor);
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
|
|
||||||
#include <AK/Debug.h>
|
#include <AK/Debug.h>
|
||||||
#include <LibGfx/BoundingBox.h>
|
#include <LibGfx/BoundingBox.h>
|
||||||
#include <LibGfx/Font/ScaledFont.h>
|
#include <LibGfx/Font/Font.h>
|
||||||
#include <LibGfx/Path.h>
|
#include <LibGfx/Path.h>
|
||||||
#include <LibGfx/TextLayout.h>
|
#include <LibGfx/TextLayout.h>
|
||||||
#include <LibWeb/Layout/BlockFormattingContext.h>
|
#include <LibWeb/Layout/BlockFormattingContext.h>
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
#include <gpu/ganesh/SkSurfaceGanesh.h>
|
#include <gpu/ganesh/SkSurfaceGanesh.h>
|
||||||
#include <pathops/SkPathOps.h>
|
#include <pathops/SkPathOps.h>
|
||||||
|
|
||||||
#include <LibGfx/Font/ScaledFont.h>
|
#include <LibGfx/Font/Font.h>
|
||||||
#include <LibGfx/PainterSkia.h>
|
#include <LibGfx/PainterSkia.h>
|
||||||
#include <LibGfx/PathSkia.h>
|
#include <LibGfx/PathSkia.h>
|
||||||
#include <LibGfx/SkiaUtils.h>
|
#include <LibGfx/SkiaUtils.h>
|
||||||
|
@ -77,7 +77,7 @@ void DisplayListPlayerSkia::flush()
|
||||||
|
|
||||||
void DisplayListPlayerSkia::draw_glyph_run(DrawGlyphRun const& command)
|
void DisplayListPlayerSkia::draw_glyph_run(DrawGlyphRun const& command)
|
||||||
{
|
{
|
||||||
auto const& gfx_font = static_cast<Gfx::ScaledFont const&>(command.glyph_run->font());
|
auto const& gfx_font = command.glyph_run->font();
|
||||||
auto sk_font = gfx_font.skia_font(command.scale);
|
auto sk_font = gfx_font.skia_font(command.scale);
|
||||||
|
|
||||||
auto glyph_count = command.glyph_run->glyphs().size();
|
auto glyph_count = command.glyph_run->glyphs().size();
|
||||||
|
|
|
@ -70,7 +70,7 @@ void MarkerPaintable::paint(PaintContext& context, PaintPhase phase) const
|
||||||
if (auto text = layout_box().text(); text.has_value()) {
|
if (auto text = layout_box().text(); text.has_value()) {
|
||||||
// FIXME: This should use proper text layout logic!
|
// FIXME: This should use proper text layout logic!
|
||||||
// This does not line up with the text in the <li> element which looks very sad :(
|
// This does not line up with the text in the <li> element which looks very sad :(
|
||||||
context.display_list_recorder().draw_text(device_enclosing.to_type<int>(), *text, layout_box().scaled_font(context), Gfx::TextAlignment::Center, color);
|
context.display_list_recorder().draw_text(device_enclosing.to_type<int>(), *text, layout_box().font(context), Gfx::TextAlignment::Center, color);
|
||||||
} else if (auto const* counter_style = layout_box().list_style_type().get_pointer<CSS::CounterStyleNameKeyword>()) {
|
} else if (auto const* counter_style = layout_box().list_style_type().get_pointer<CSS::CounterStyleNameKeyword>()) {
|
||||||
switch (*counter_style) {
|
switch (*counter_style) {
|
||||||
case CSS::CounterStyleNameKeyword::Square:
|
case CSS::CounterStyleNameKeyword::Square:
|
||||||
|
|
|
@ -118,7 +118,7 @@ MediaPaintable::Components MediaPaintable::compute_control_bar_components(PaintC
|
||||||
auto display_time = human_readable_digital_time(round(media_element.layout_display_time({})));
|
auto display_time = human_readable_digital_time(round(media_element.layout_display_time({})));
|
||||||
auto duration = human_readable_digital_time(isnan(media_element.duration()) ? 0 : round(media_element.duration()));
|
auto duration = human_readable_digital_time(isnan(media_element.duration()) ? 0 : round(media_element.duration()));
|
||||||
components.timestamp = String::formatted("{} / {}", display_time, duration).release_value_but_fixme_should_propagate_errors();
|
components.timestamp = String::formatted("{} / {}", display_time, duration).release_value_but_fixme_should_propagate_errors();
|
||||||
components.timestamp_font = layout_node().scaled_font(context);
|
components.timestamp_font = layout_node().font(context);
|
||||||
|
|
||||||
auto timestamp_size = DevicePixels { static_cast<DevicePixels::Type>(ceilf(components.timestamp_font->width(components.timestamp))) };
|
auto timestamp_size = DevicePixels { static_cast<DevicePixels::Type>(ceilf(components.timestamp_font->width(components.timestamp))) };
|
||||||
if (timestamp_size <= remaining_rect.width()) {
|
if (timestamp_size <= remaining_rect.width()) {
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <AK/GenericShorthands.h>
|
#include <AK/GenericShorthands.h>
|
||||||
#include <LibGfx/Font/ScaledFont.h>
|
#include <LibGfx/Font/Font.h>
|
||||||
#include <LibUnicode/CharacterTypes.h>
|
#include <LibUnicode/CharacterTypes.h>
|
||||||
#include <LibWeb/CSS/SystemColor.h>
|
#include <LibWeb/CSS/SystemColor.h>
|
||||||
#include <LibWeb/DOM/Document.h>
|
#include <LibWeb/DOM/Document.h>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue