Skip to content

Commit 2f8afdc

Browse files
committed
Disable harfbuzz for color fonts.
1 parent 10afd07 commit 2f8afdc

File tree

2 files changed

+30
-6
lines changed

2 files changed

+30
-6
lines changed

src/_util.cpp

+25-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#include "_raqm.h"
44

5+
#include FT_TRUETYPE_TABLES_H
56
#include <regex>
67
#include <stack>
78

@@ -33,7 +34,8 @@ ITER_CAIRO_OPTIONAL_API(DEFINE_API)
3334

3435
// Other useful values.
3536
std::unordered_map<std::string, cairo_font_face_t*> FONT_CACHE{};
36-
cairo_user_data_key_t const REFS_KEY{}, STATE_KEY{}, FT_KEY{}, FEATURES_KEY{};
37+
cairo_user_data_key_t const
38+
REFS_KEY{}, STATE_KEY{}, FT_KEY{}, FEATURES_KEY{}, IS_COLOR_FONT_KEY{};
3739
py::object RC_PARAMS{py::none{}},
3840
PIXEL_MARKER{py::none{}},
3941
UNIT_CIRCLE{py::none{}};
@@ -611,6 +613,26 @@ cairo_font_face_t* font_face_from_path(std::string pathspec)
611613
[](void* ptr) -> void {
612614
delete static_cast<std::vector<std::string>*>(ptr);
613615
});
616+
// FIXME[harfbuzz] (#2428) Disable raqm for color fonts.
617+
auto n_tables = FT_ULong{}, table_length = FT_ULong{};
618+
FT_CHECK(FT_Sfnt_Table_Info, ft_face, 0, nullptr, &n_tables);
619+
for (auto i = FT_ULong{}; i < n_tables; ++i) {
620+
auto tag = FT_ULong{};
621+
FT_CHECK(
622+
FT_Sfnt_Table_Info, ft_face, i, &tag, &table_length);
623+
if (tag == FT_MAKE_TAG('C', 'O', 'L', 'R')
624+
|| tag == FT_MAKE_TAG('C', 'P', 'A', 'L')
625+
|| tag == FT_MAKE_TAG('C', 'B', 'D', 'T')
626+
|| tag == FT_MAKE_TAG('C', 'B', 'L', 'C')
627+
|| tag == FT_MAKE_TAG('s', 'b', 'i', 'x')
628+
|| tag == FT_MAKE_TAG('S', 'V', 'G', ' ')) {
629+
CAIRO_CLEANUP_CHECK(
630+
{ cairo_font_face_destroy(font_face); },
631+
cairo_font_face_set_user_data,
632+
font_face, &detail::IS_COLOR_FONT_KEY, font_face, nullptr);
633+
break;
634+
}
635+
}
614636
}
615637
return font_face;
616638
}
@@ -671,7 +693,8 @@ GlyphsAndClusters text_to_glyphs_and_clusters(cairo_t* cr, std::string s)
671693
{
672694
auto const& scaled_font = cairo_get_scaled_font(cr);
673695
auto gac = GlyphsAndClusters{};
674-
if (has_raqm()) {
696+
if (has_raqm()
697+
&& !cairo_font_face_get_user_data(cairo_get_font_face(cr), &detail::IS_COLOR_FONT_KEY)) {
675698
auto const& ft_face = cairo_ft_scaled_font_lock_face(scaled_font);
676699
auto const& scaled_font_unlock_cleanup =
677700
std::unique_ptr<

src/_util.h

+5-4
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,11 @@ extern void (*cairo_ps_surface_dsc_comment)(cairo_surface_t*, char const*);
6868
// Other useful values.
6969
extern std::unordered_map<std::string, cairo_font_face_t*> FONT_CACHE;
7070
extern cairo_user_data_key_t const
71-
REFS_KEY, // cairo_t -> kept alive Python objects.
72-
STATE_KEY, // cairo_t -> additional state.
73-
FT_KEY, // cairo_font_face_t -> FT_Face.
74-
FEATURES_KEY; // cairo_font_face_t -> OpenType features.
71+
REFS_KEY, // cairo_t -> kept alive Python objects.
72+
STATE_KEY, // cairo_t -> additional state.
73+
FT_KEY, // cairo_font_face_t -> FT_Face.
74+
FEATURES_KEY, // cairo_font_face_t -> OpenType features.
75+
IS_COLOR_FONT_KEY; // cairo_font_face_t -> non-null if a color font.
7576
extern py::object RC_PARAMS;
7677
extern py::object PIXEL_MARKER;
7778
extern py::object UNIT_CIRCLE;

0 commit comments

Comments
 (0)