summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibWeb/FontCache.cpp
blob: 889ffe5699e11a0bb6311be6754ab5104410ee51 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/*
 * Copyright (c) 2018-2023, Andreas Kling <kling@serenityos.org>
 *
 * SPDX-License-Identifier: BSD-2-Clause
 */

#include <AK/DeprecatedFlyString.h>
#include <LibGfx/Font/Font.h>
#include <LibWeb/FontCache.h>

FontCache& FontCache::the()
{
    static FontCache cache;
    return cache;
}

RefPtr<Gfx::Font const> FontCache::get(FontSelector const& font_selector) const
{
    auto cached_font = m_fonts.get(font_selector);
    if (cached_font.has_value())
        return cached_font.value();
    return nullptr;
}

NonnullRefPtr<Gfx::Font const> FontCache::scaled_font(Gfx::Font const& font, float scale_factor)
{
    auto device_font_pt_size = font.point_size() * scale_factor;
    FontSelector font_selector = { FlyString::from_deprecated_fly_string(font.family()).release_value_but_fixme_should_propagate_errors(), device_font_pt_size, font.weight(), font.width(), font.slope() };
    if (auto cached_font = FontCache::the().get(font_selector)) {
        return *cached_font;
    }

    if (auto font_with_device_pt_size = font.with_size(device_font_pt_size)) {
        set(font_selector, *font_with_device_pt_size);
        return font_with_device_pt_size.release_nonnull();
    }

    return font;
}

void FontCache::set(FontSelector const& font_selector, NonnullRefPtr<Gfx::Font const> font)
{
    m_fonts.set(font_selector, move(font));
}