[gnome-characters] libgc: Revive Pango support functions



commit 8651aecc067c2209825249e4e3228b5c42038c2d
Author: Daiki Ueno <dueno src gnome org>
Date:   Sat Feb 14 13:48:10 2015 +0900

    libgc: Revive Pango support functions

 lib/gc.c |   52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 lib/gc.h |    9 +++++++++
 2 files changed, 61 insertions(+), 0 deletions(-)
---
diff --git a/lib/gc.c b/lib/gc.c
index 3473406..d91c1cb 100644
--- a/lib/gc.c
+++ b/lib/gc.c
@@ -10,6 +10,9 @@
 #include <unistr.h>
 #include "confusables.h"
 
+#define PANGO_ENABLE_ENGINE 1
+#include <pango/pangofc-font.h>
+
 static const uc_block_t *all_blocks;
 static size_t all_block_count;
 
@@ -709,3 +712,52 @@ gc_gtk_clipboard_get (void)
 {
   return gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
 }
+
+void
+gc_pango_layout_disable_fallback (PangoLayout *layout)
+{
+  PangoAttrList *attr_list;
+
+  attr_list = pango_attr_list_new ();
+  pango_attr_list_insert (attr_list, pango_attr_fallback_new (FALSE));
+  pango_layout_set_attributes (layout, attr_list);
+}
+
+gboolean
+gc_pango_context_font_has_glyph (PangoContext *context,
+                                 PangoFont    *font,
+                                 gunichar      uc)
+{
+  if (PANGO_IS_FC_FONT (font))
+    /* Fast path when the font is loaded as PangoFcFont.  */
+    {
+      PangoFcFont *fcfont = PANGO_FC_FONT (font);
+      return pango_fc_font_has_char (fcfont, uc);
+    }
+  else
+    /* Slow path performing actual rendering.  */
+    {
+      PangoLayout *layout;
+      GError *error;
+      gchar *utf8;
+      glong items_written;
+      int retval;
+
+      utf8 = g_ucs4_to_utf8 (&uc, 1, NULL, &items_written, &error);
+      if (!utf8)
+       {
+         g_printerr ("error in decoding: %s\n", error->message);
+         g_error_free (error);
+       }
+
+      layout = pango_layout_new (context);
+      gc_pango_layout_disable_fallback (layout);
+      pango_layout_set_text (layout, utf8, items_written);
+      g_free (utf8);
+
+      retval = pango_layout_get_unknown_glyphs_count (layout);
+      g_object_unref (layout);
+
+      return retval == 0;
+    }
+}
diff --git a/lib/gc.h b/lib/gc.h
index c784aa4..a735e11 100644
--- a/lib/gc.h
+++ b/lib/gc.h
@@ -64,6 +64,15 @@ gchar          *gc_character_name         (gunichar              uc);
 
 GtkClipboard   *gc_gtk_clipboard_get      (void);
 
+/* Pango support.  PangoAttrFallback is not accessible from GI.  */
+void            gc_pango_layout_disable_fallback
+                                          (PangoLayout          *layout);
+
+gboolean        gc_pango_context_font_has_glyph
+                                          (PangoContext         *context,
+                                          PangoFont            *font,
+                                          gunichar              uc);
+
 G_END_DECLS
 
 #endif /* __GC_H__ */


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