Bug 328585 – Need to know if a layout has unknown glyphs Patch from
authorBehdad Esfahbod <behdad@gnome.org>
Tue, 16 Jan 2007 20:03:40 +0000 (20:03 +0000)
committerBehdad Esfahbod <behdad@src.gnome.org>
Tue, 16 Jan 2007 20:03:40 +0000 (20:03 +0000)
2007-01-16  Behdad Esfahbod  <behdad@gnome.org>

        Bug 328585 – Need to know if a layout has unknown glyphs
        Patch from LingNing Zhang

        * pango/pango-layout-private.h:
        * pango/pango-layout.c (pango_layout_init), (pango_layout_copy),
        (pango_layout_get_unknown_glyphs_count),
        (pango_layout_clear_lines):
        * pango/pango-layout.h:
        New public function:

                pango_layout_get_unknown_glyphs_count()

        * pango/pango.def:
        * docs/tmpl/layout.sgml:
        * docs/pango-sections.txt:
        Update.

svn path=/trunk/; revision=2162

ChangeLog
docs/pango-sections.txt
docs/tmpl/layout.sgml
pango/pango-layout-private.h
pango/pango-layout.c
pango/pango-layout.h
pango/pango.def

index 1c1ba01..d037e8b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,24 @@
 2007-01-16  Behdad Esfahbod  <behdad@gnome.org>
 
+       Bug 328585 – Need to know if a layout has unknown glyphs
+       Patch from LingNing Zhang
+
+       * pango/pango-layout-private.h:
+       * pango/pango-layout.c (pango_layout_init), (pango_layout_copy),
+       (pango_layout_get_unknown_glyphs_count),
+       (pango_layout_clear_lines):
+       * pango/pango-layout.h:
+       New public function:
+
+               pango_layout_get_unknown_glyphs_count()
+
+       * pango/pango.def:
+       * docs/tmpl/layout.sgml:
+       * docs/pango-sections.txt:
+       Update.
+
+2007-01-16  Behdad Esfahbod  <behdad@gnome.org>
+
        Part of Bug 326693 – PangoLayouts should be query-able about their
        effective properties (width / wrapped / ellipsized / etc)
 
index 541dadc..fc47f61 100644 (file)
@@ -469,6 +469,7 @@ pango_layout_get_single_paragraph_mode
 PangoAlignment
 PANGO_TYPE_ALIGNMENT
 
+pango_layout_get_unknown_glyphs_count
 pango_layout_get_log_attrs
 
 pango_layout_index_to_pos
index 32b89c0..524cbbc 100644 (file)
@@ -424,6 +424,15 @@ The #GObject type for #PangoAlignment.
 
 
 
+<!-- ##### FUNCTION pango_layout_get_unknown_glyphs_count ##### -->
+<para>
+
+</para>
+
+@layout: 
+@Returns: 
+
+
 <!-- ##### FUNCTION pango_layout_get_log_attrs ##### -->
 <para>
 
index c3def00..6751ae6 100644 (file)
@@ -44,6 +44,8 @@ struct _PangoLayout
   int indent;                  /* amount by which first line should be shorter */
   int spacing;                 /* spacing between lines */
 
+  int unknown_glyphs_count;    /* number of unknown glyphs */
+
   guint justify : 1;
   guint alignment : 2;
 
index c95e9e2..e6e4d8c 100644 (file)
@@ -197,6 +197,7 @@ pango_layout_init (PangoLayout *layout)
   layout->lines = NULL;
 
   layout->tab_width = -1;
+  layout->unknown_glyphs_count = -1;
 
   layout->wrap = PANGO_WRAP_WORD;
   layout->is_wrapped = FALSE;
@@ -307,8 +308,10 @@ pango_layout_copy (PangoLayout *src)
     layout->tabs = pango_tab_array_copy (src->tabs);
   layout->wrap = src->wrap;  
   layout->ellipsize = src->ellipsize;
+
+  layout->unknown_glyphs_count = -1;
   
-  /* is_wrapped, is_ellipsized, log_attrs, lines
+  /* unknown_glyphs_count, is_wrapped, is_ellipsized, log_attrs, lines
    * fields are updated by check_lines */
 
   return layout;
@@ -1059,6 +1062,59 @@ pango_layout_set_markup_with_accel (PangoLayout    *layout,
 }
 
 /**
+ * pango_layout_get_unknown_glyphs_count:
+ * @layout: a #PangoLayout
+ * 
+ * Counts the number unknown glyphs in @layout.  That is, zero if
+ * glyphs for all characters in the layout text were found, or more
+ * than zero otherwise.
+ *
+ * Return value: The number of unknown glyphs in @layout.
+ *
+ * Since: 1.16
+ */
+int
+pango_layout_get_unknown_glyphs_count (PangoLayout *layout)
+{
+    PangoLayoutLine *line;
+    PangoLayoutRun *run;
+    GSList *lines_list;
+    GSList *runs_list;
+    int i, count = 0;
+
+    g_return_val_if_fail (PANGO_IS_LAYOUT (layout), 0);
+
+    pango_layout_check_lines (layout);
+
+    if (layout->unknown_glyphs_count >= 0)
+      return layout->unknown_glyphs_count;
+
+    lines_list = layout->lines;
+    while (lines_list)
+      {
+        line = lines_list->data;
+        runs_list = line->runs;
+
+        while (runs_list)
+          {
+            run = runs_list->data;
+
+            for (i = 0; i < run->glyphs->num_glyphs; i++)
+              {
+                if (run->glyphs->glyphs[i].glyph & PANGO_GLYPH_UNKNOWN_FLAG)
+                    count++;
+              }
+
+            runs_list = runs_list->next;
+          }
+        lines_list = lines_list->next;
+      }
+
+    layout->unknown_glyphs_count = count;
+    return count;
+}
+
+/**
  * pango_layout_context_changed:
  * @layout: a #PangoLayout
  * 
@@ -2538,6 +2594,8 @@ pango_layout_clear_lines (PangoLayout *layout)
       g_free (layout->log_attrs);
       layout->log_attrs = NULL;
     }
+
+  layout->unknown_glyphs_count = -1;
   layout->logical_rect_cached = FALSE;
   layout->ink_rect_cached = FALSE;
   layout->is_ellipsized = FALSE;
index a1d24ea..47b4394 100644 (file)
@@ -156,7 +156,9 @@ void               pango_layout_set_ellipsize (PangoLayout        *layout,
 PangoEllipsizeMode pango_layout_get_ellipsize (PangoLayout        *layout);
 gboolean           pango_layout_is_ellipsized (PangoLayout        *layout);
 
-void           pango_layout_context_changed (PangoLayout    *layout);
+int      pango_layout_get_unknown_glyphs_count (PangoLayout    *layout);
+
+void     pango_layout_context_changed (PangoLayout    *layout);
 
 void     pango_layout_get_log_attrs (PangoLayout    *layout,
                                     PangoLogAttr  **attrs,
@@ -207,6 +209,7 @@ PangoLayoutLine *pango_layout_get_line_readonly    (PangoLayout    *layout,
 GSList *         pango_layout_get_lines            (PangoLayout    *layout);
 GSList *         pango_layout_get_lines_readonly   (PangoLayout    *layout);
 
+
 #define PANGO_TYPE_LAYOUT_LINE (pango_layout_line_get_type ())
 
 GType    pango_layout_line_get_type     (void) G_GNUC_CONST;
index e038044..da6b078 100644 (file)
@@ -234,6 +234,7 @@ EXPORTS
        pango_layout_get_tabs
        pango_layout_get_text
        pango_layout_get_type
+       pango_layout_get_unknown_glyphs_count
        pango_layout_get_width
        pango_layout_get_wrap
        pango_layout_index_to_line_x