diff options
Diffstat (limited to 'pango')
-rw-r--r-- | pango/fonts.c | 13 | ||||
-rw-r--r-- | pango/pango-font-private.h | 1 | ||||
-rw-r--r-- | pango/pango-font.h | 2 | ||||
-rw-r--r-- | pango/pango-glyph.h | 6 | ||||
-rw-r--r-- | pango/shape.c | 43 |
5 files changed, 61 insertions, 4 deletions
diff --git a/pango/fonts.c b/pango/fonts.c index f144097d..d2fd4308 100644 --- a/pango/fonts.c +++ b/pango/fonts.c @@ -1737,6 +1737,14 @@ pango_font_default_has_char (PangoFont *font, return result != PANGO_COVERAGE_NONE; } +static PangoFontFace * +pango_font_default_get_face (PangoFont *font) +{ + PangoFontMap *map = pango_font_get_font_map (font); + + return PANGO_FONT_MAP_GET_CLASS (map)->get_face (map,font); +} + static void pango_font_class_init (PangoFontClass *class G_GNUC_UNUSED) { @@ -1751,6 +1759,7 @@ pango_font_class_init (PangoFontClass *class G_GNUC_UNUSED) pclass->is_hinted = pango_font_default_is_hinted; pclass->get_scale_factors = pango_font_default_get_scale_factors; pclass->has_char = pango_font_default_has_char; + pclass->get_face = pango_font_default_get_face; } static void @@ -1979,9 +1988,9 @@ pango_font_get_font_map (PangoFont *font) PangoFontFace * pango_font_get_face (PangoFont *font) { - PangoFontMap *map = pango_font_get_font_map (font); + PangoFontClassPrivate *pclass = PANGO_FONT_GET_CLASS_PRIVATE (font); - return PANGO_FONT_MAP_GET_CLASS (map)->get_face (map,font); + return pclass->get_face (font); } /** diff --git a/pango/pango-font-private.h b/pango/pango-font-private.h index 1f31f559..93ce27aa 100644 --- a/pango/pango-font-private.h +++ b/pango/pango-font-private.h @@ -44,6 +44,7 @@ typedef struct { gboolean (* has_char) (PangoFont *font, gunichar wc); + PangoFontFace * (* get_face) (PangoFont *font); } PangoFontClassPrivate; gboolean pango_font_is_hinted (PangoFont *font); diff --git a/pango/pango-font.h b/pango/pango-font.h index 6b78c2ed..d4bded86 100644 --- a/pango/pango-font.h +++ b/pango/pango-font.h @@ -664,6 +664,8 @@ PangoLanguage ** pango_font_get_languages (PangoFont *font); #endif #endif +G_DEFINE_AUTOPTR_CLEANUP_FUNC(PangoFontFamily, g_object_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC(PangoFontFace, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC(PangoFont, g_object_unref) G_END_DECLS diff --git a/pango/pango-glyph.h b/pango/pango-glyph.h index cd29b77a..fae7168c 100644 --- a/pango/pango-glyph.h +++ b/pango/pango-glyph.h @@ -89,16 +89,18 @@ struct _PangoGlyphGeometry * are always ordered in logical order, since visual order is meaningless; * that is, in Arabic text, accent glyphs follow the glyphs for the * base character.) + * @is_color: set if the the font will render this glyph with color. Since 1.50 * * A `PangoGlyphVisAttr` structure communicates information between * the shaping and rendering phases. * - * Currently, it contains only cluster start information. More attributes - * may be added in the future. + * Currently, it contains cluster start and color information. + * More attributes may be added in the future. */ struct _PangoGlyphVisAttr { guint is_cluster_start : 1; + guint is_color : 1; }; /* A single glyph diff --git a/pango/shape.c b/pango/shape.c index 62c0f025..30131dd5 100644 --- a/pango/shape.c +++ b/pango/shape.c @@ -30,6 +30,8 @@ #include "pango-font-private.h" +#include <hb-ot.h> + /* {{{ Harfbuzz shaping */ /* {{{{ Buffer handling */ @@ -335,6 +337,45 @@ find_text_transform (const PangoAnalysis *analysis) return PANGO_TEXT_TRANSFORM_NONE; } +static gboolean +glyph_has_color (hb_font_t *font, + hb_codepoint_t glyph) +{ + hb_face_t *face; + hb_blob_t *blob; + + face = hb_font_get_face (font); + + if (hb_ot_color_glyph_get_layers (face, glyph, 0, NULL, NULL) > 0) + return TRUE; + + if (hb_ot_color_has_png (face)) + { + blob = hb_ot_color_glyph_reference_png (font, glyph); + if (blob) + { + guint length = hb_blob_get_length (blob); + hb_blob_destroy (blob); + if (length > 0) + return TRUE; + } + } + + if (hb_ot_color_has_svg (face)) + { + blob = hb_ot_color_glyph_reference_svg (face, glyph); + if (blob) + { + guint length = hb_blob_get_length (blob); + hb_blob_destroy (blob); + if (length > 0) + return TRUE; + } + } + + return FALSE; +} + /* }}}} */ static void @@ -495,11 +536,13 @@ pango_hb_shape (const char *item_text, pango_glyph_string_set_size (glyphs, num_glyphs); infos = glyphs->glyphs; last_cluster = -1; + for (i = 0; i < num_glyphs; i++) { infos[i].glyph = hb_glyph->codepoint; glyphs->log_clusters[i] = hb_glyph->cluster - item_offset; infos[i].attr.is_cluster_start = glyphs->log_clusters[i] != last_cluster; + infos[i].attr.is_color = glyph_has_color (hb_font, hb_glyph->codepoint); hb_glyph++; last_cluster = glyphs->log_clusters[i]; } |