forked from LadybirdBrowser/ladybird
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
LibGfx: Move FontDatabase internals to SystemFontProvider interface
This will be the first step is making better use of system libraries like fontconfig and CoreText to load system fonts for use by the UI process and the CSS style computer.
- Loading branch information
Showing
11 changed files
with
174 additions
and
89 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
/* | ||
* Copyright (c) 2024, Andrew Kaster <[email protected]> | ||
* | ||
* SPDX-License-Identifier: BSD-2-Clause | ||
*/ | ||
|
||
#include <AK/Format.h> | ||
#include <AK/LexicalPath.h> | ||
#include <LibCore/Resource.h> | ||
#include <LibGfx/Font/PathFontProvider.h> | ||
#include <LibGfx/Font/ScaledFont.h> | ||
#include <LibGfx/Font/WOFF/Loader.h> | ||
|
||
namespace Gfx { | ||
|
||
PathFontProvider::PathFontProvider() = default; | ||
PathFontProvider::~PathFontProvider() = default; | ||
|
||
void PathFontProvider::load_all_fonts_from_uri(StringView uri) | ||
{ | ||
auto root_or_error = Core::Resource::load_from_uri(uri); | ||
if (root_or_error.is_error()) { | ||
if (root_or_error.error().is_errno() && root_or_error.error().code() == ENOENT) { | ||
return; | ||
} | ||
dbgln("PathFontProvider::load_all_fonts_from_uri('{}'): {}", uri, root_or_error.error()); | ||
return; | ||
} | ||
auto root = root_or_error.release_value(); | ||
|
||
root->for_each_descendant_file([this](Core::Resource const& resource) -> IterationDecision { | ||
auto uri = resource.uri(); | ||
auto path = LexicalPath(uri.bytes_as_string_view()); | ||
if (path.has_extension(".ttf"sv) || path.has_extension(".ttc"sv)) { | ||
// FIXME: What about .otf | ||
if (auto font_or_error = Typeface::try_load_from_resource(resource); !font_or_error.is_error()) { | ||
auto font = font_or_error.release_value(); | ||
auto& family = m_typeface_by_family.ensure(font->family(), [] { | ||
return Vector<NonnullRefPtr<Typeface>> {}; | ||
}); | ||
family.append(font); | ||
} | ||
} else if (path.has_extension(".woff"sv)) { | ||
if (auto font_or_error = WOFF::try_load_from_resource(resource); !font_or_error.is_error()) { | ||
auto font = font_or_error.release_value(); | ||
auto& family = m_typeface_by_family.ensure(font->family(), [] { | ||
return Vector<NonnullRefPtr<Typeface>> {}; | ||
}); | ||
family.append(font); | ||
} | ||
} | ||
return IterationDecision::Continue; | ||
}); | ||
} | ||
|
||
RefPtr<Gfx::Font> PathFontProvider::get_font(FlyString const& family, float point_size, unsigned weight, unsigned width, unsigned slope) | ||
{ | ||
auto it = m_typeface_by_family.find(family); | ||
if (it == m_typeface_by_family.end()) | ||
return nullptr; | ||
for (auto const& typeface : it->value) { | ||
if (typeface->weight() == weight && typeface->width() == width && typeface->slope() == slope) | ||
return typeface->scaled_font(point_size); | ||
} | ||
return nullptr; | ||
} | ||
|
||
void PathFontProvider::for_each_typeface_with_family_name(FlyString const& family_name, Function<void(Typeface const&)> callback) | ||
{ | ||
auto it = m_typeface_by_family.find(family_name); | ||
if (it == m_typeface_by_family.end()) | ||
return; | ||
for (auto const& typeface : it->value) { | ||
callback(*typeface); | ||
} | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
/* | ||
* Copyright (c) 2024, Andrew Kaster <[email protected]> | ||
* | ||
* SPDX-License-Identifier: BSD-2-Clause | ||
*/ | ||
|
||
#pragma once | ||
|
||
#include <AK/FlyString.h> | ||
#include <AK/Function.h> | ||
#include <AK/HashMap.h> | ||
#include <AK/OwnPtr.h> | ||
#include <LibGfx/Font/FontDatabase.h> | ||
#include <LibGfx/Font/Typeface.h> | ||
|
||
namespace Gfx { | ||
|
||
class PathFontProvider final : public SystemFontProvider { | ||
AK_MAKE_NONCOPYABLE(PathFontProvider); | ||
AK_MAKE_NONMOVABLE(PathFontProvider); | ||
|
||
public: | ||
PathFontProvider(); | ||
virtual ~PathFontProvider() override; | ||
|
||
void set_name_but_fixme_should_create_custom_system_font_provider(String name) { m_name = move(name); } | ||
|
||
void load_all_fonts_from_uri(StringView); | ||
|
||
virtual RefPtr<Gfx::Font> get_font(FlyString const& family, float point_size, unsigned weight, unsigned width, unsigned slope) override; | ||
virtual void for_each_typeface_with_family_name(FlyString const& family_name, Function<void(Typeface const&)>) override; | ||
virtual StringView name() const override { return m_name.bytes_as_string_view(); } | ||
|
||
private: | ||
HashMap<FlyString, Vector<NonnullRefPtr<Typeface>>, AK::ASCIICaseInsensitiveFlyStringTraits> m_typeface_by_family; | ||
String m_name { "Path"_string }; | ||
}; | ||
|
||
} |
Oops, something went wrong.