diff options
author | Behdad Esfahbod <behdad@gnome.org> | 2007-12-10 08:31:33 +0000 |
---|---|---|
committer | Behdad Esfahbod <behdad@src.gnome.org> | 2007-12-10 08:31:33 +0000 |
commit | f4fad0c741636d017aefd76d58e271466696cc6f (patch) | |
tree | 2e77cb9df99173cd841609f5ccdb4a40136dcd21 /pango/pango-context.c | |
parent | ed7f7ab40893d20bab5a221cc95cfcba965cd93e (diff) | |
download | pango-f4fad0c741636d017aefd76d58e271466696cc6f.tar.gz |
Bug 478914 – Use something invalid instead of '?' when validating input
2007-12-10 Behdad Esfahbod <behdad@gnome.org>
Bug 478914 – Use something invalid instead of '?' when validating
input text
* pango/pango-layout.c (pango_layout_set_text): Set invalid input
bytes to -1, which gives a unichar value of -1, and eventually a
glyph value of -1, aka PANGO_GLYPH_INVALID_INPUT.
* pango/fonts.c (pango_font_get_glyph_extents),
(pango_font_get_metrics), (pango_font_get_font_map):
* pango/modules.c (build_map):
* pango/pango-context.c (get_script), (get_shaper_and_font),
(string_from_script), (itemize_state_process_run):
* pango/pango-coverage.c (pango_coverage_get):
* pango/pango-impl-utils.h:
* pango/pango-utils.c:
* pango/pangocairo-font.c (pango_cairo_font_get_scaled_font),
(_pango_cairo_font_private_get_hex_box_info),
(_pango_cairo_font_private_get_glyph_extents_missing):
* pango/pangocairo-private.h:
* pango/pangocairo-render.c (_pango_cairo_renderer_draw_frame),
(_pango_cairo_renderer_draw_box_glyph),
(_pango_cairo_renderer_draw_unknown_glyph):
* pango/pangofc-fontmap.c (pango_fc_font_map_get_patterns):
* pango/pangoft2-private.h:
* pango/pangoft2-render.c (pango_ft2_font_render_box_glyph),
(pango_ft2_font_render_glyph), (pango_ft2_renderer_draw_glyph):
* pango/pangoft2.c (pango_ft2_font_get_face),
(pango_ft2_font_get_glyph_extents):
* pango/pangox.c (pango_x_find_subfont), (pango_x_render):
* pango/pangoxft-font.c (_pango_xft_font_get_mini_font),
(get_glyph_extents_missing), (pango_xft_font_get_font):
* pango/pangoxft-private.h:
* pango/pangoxft-render.c (get_total_matrix), (draw_box),
(_pango_xft_renderer_draw_box_glyph),
(_pango_xft_renderer_draw_unknown_glyph),
(pango_xft_renderer_draw_glyphs):
* pango/shape.c (pango_shape):
Render PANGO_GLYPH_INVALID_INPUT to a single-width box with a cross
inside. Also cleanup spewed warnings and warn at the source, where
we fail to find a shaper, instead of at every location that we see
a NULL font.
* pango/pango-font.h:
* docs/pango-sections.txt:
* docs/tmpl/glyphs.sgml:
New public macro:
PANGO_GLYPH_INVALID_INPUT
svn path=/trunk/; revision=2519
Diffstat (limited to 'pango/pango-context.c')
-rw-r--r-- | pango/pango-context.c | 70 |
1 files changed, 55 insertions, 15 deletions
diff --git a/pango/pango-context.c b/pango/pango-context.c index 6f588191..1da56fd2 100644 --- a/pango/pango-context.c +++ b/pango/pango-context.c @@ -1094,6 +1094,21 @@ get_base_font (ItemizeState *state) return state->base_font; } +static PangoScript +get_script (ItemizeState *state) +{ + /* Always use a basic shaper for vertical layout (ie, east/west gravity) + * as none of our script shapers support vertical shaping right now. + * + * XXX Should move the knowledge into the shaper interface. + */ + + if (PANGO_GRAVITY_IS_VERTICAL (state->resolved_gravity)) + return PANGO_SCRIPT_COMMON; + else + return state->script; +} + static gboolean get_shaper_and_font (ItemizeState *state, gunichar wc, @@ -1108,20 +1123,8 @@ get_shaper_and_font (ItemizeState *state, return *shape_engine != NULL; if (!state->exact_engines && !state->fallback_engines) - { - /* Always use a basic shaper for vertical layout (ie, east/west gravity) - * as we do not support vertical shaping as of now. - */ - PangoScript script; - - if (PANGO_GRAVITY_IS_VERTICAL (state->resolved_gravity)) - script = PANGO_SCRIPT_COMMON; - else - script = state->script; - - get_engines (state->context, state->derived_lang, script, - &state->exact_engines, &state->fallback_engines); - } + get_engines (state->context, state->derived_lang, get_script (state), + &state->exact_engines, &state->fallback_engines); info.lang = state->derived_lang; info.wc = wc; @@ -1289,6 +1292,21 @@ itemize_state_update_for_new_run (ItemizeState *state) } } +static const char * +string_from_script (PangoScript script) +{ + static GEnumClass *class = NULL; + GEnumValue *value; + if (!class) + class = g_type_class_ref (PANGO_TYPE_SCRIPT); + + value = g_enum_get_value (class, script); + if (!value) + return string_from_script (PANGO_SCRIPT_INVALID_CODE); + + return value->value_nick; +} + static void itemize_state_process_run (ItemizeState *state) { @@ -1351,8 +1369,30 @@ itemize_state_process_run (ItemizeState *state) PangoEngineShape *shape_engine; PangoFont *font; - if (!get_shaper_and_font (state, ' ', &shape_engine, &font)) + if (G_UNLIKELY (!get_shaper_and_font (state, ' ', &shape_engine, &font))) { + /* If no shaper was found, warn only once per fontmap/script pair */ + PangoFontMap *fontmap = state->context->font_map; + const char *script_name = string_from_script (get_script (state)); + + if (!g_object_get_data (G_OBJECT (fontmap), script_name)) + { + const char *what; + if (shape_engine == NULL) + what = "shape engine"; + else if (font == NULL) + what = "font"; + else + what = "nothing (oops!)"; + + g_warning ("failed to find shape engine, expect ugly output. engine-type='%s', script='%s'", + pango_font_map_get_shape_engine_type (fontmap), + script_name); + + g_object_set_data_full (G_OBJECT (fontmap), script_name, + GINT_TO_POINTER (1), NULL); + } + shape_engine = _pango_get_fallback_shaper (); font = NULL; } |