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)
layout->lines = NULL;
layout->tab_width = -1;
+ layout->unknown_glyphs_count = -1;
layout->wrap = PANGO_WRAP_WORD;
layout->is_wrapped = FALSE;
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;
}
/**
+ * 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
*
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;
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,
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;