[pango/color-glyph: 1/2] shape: Mark color glyphs in glyphstrings




commit 54b0d3fd39f841ba8ebc9efa153bd23c9efb2c4c
Author: Matthias Clasen <mclasen redhat com>
Date:   Wed Sep 1 01:35:01 2021 -0400

    shape: Mark color glyphs in glyphstrings
    
    GTK needs this information to decide how to
    render the glyphs, so provide it.

 pango/pango-glyph.h |  6 ++++--
 pango/shape.c       | 43 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 47 insertions(+), 2 deletions(-)
---
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];
     }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]