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/pangoft2-render.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/pangoft2-render.c')
-rw-r--r-- | pango/pangoft2-render.c | 58 |
1 files changed, 43 insertions, 15 deletions
diff --git a/pango/pangoft2-render.c b/pango/pangoft2-render.c index ef052efa..5bf98a20 100644 --- a/pango/pangoft2-render.c +++ b/pango/pangoft2-render.c @@ -100,9 +100,10 @@ pango_ft2_free_rendered_glyph (PangoFT2RenderedGlyph *rendered) } static PangoFT2RenderedGlyph * -pango_ft2_font_render_box_glyph (int width, - int height, - int top) +pango_ft2_font_render_box_glyph (int width, + int height, + int top, + gboolean invalid) { PangoFT2RenderedGlyph *box; int i, j, offset1, offset2, line_width; @@ -150,14 +151,38 @@ pango_ft2_font_render_box_glyph (int width, } } + if (invalid) + { + /* XXX This may scrabble memory. Didn't check close enough */ + int inc = PANGO_SCALE * MAX (width - line_width, 0) / (height + 1); + offset1 = PANGO_SCALE; + offset2 = PANGO_SCALE * MAX (width - line_width - 1, 0) ; + for (i = box->bitmap.pitch; + i < (box->bitmap.rows - 1) * box->bitmap.pitch; + i += box->bitmap.pitch) + { + for (j = 0; j < line_width; j++) + { + box->bitmap.buffer[PANGO_PIXELS (offset1) + i + j] = 0xff; + box->bitmap.buffer[PANGO_PIXELS (offset2) + i + j] = 0xff; + } + offset1 += inc; + offset2 -= inc; + } + + } + return box; } static PangoFT2RenderedGlyph * pango_ft2_font_render_glyph (PangoFont *font, - int glyph_index) + PangoGlyph glyph_index) { FT_Face face; + gboolean invalid_input; + + invalid_input = glyph_index == PANGO_GLYPH_INVALID_INPUT || (glyph_index & ~PANGO_GLYPH_UNKNOWN_FLAG) > 0x10FFFF; if (glyph_index & PANGO_GLYPH_UNKNOWN_FLAG) { @@ -173,7 +198,8 @@ pango_ft2_font_render_glyph (PangoFont *font, box = pango_ft2_font_render_box_glyph (PANGO_PIXELS (metrics->approximate_char_width), PANGO_PIXELS (metrics->ascent + metrics->descent), - PANGO_PIXELS (metrics->ascent)); + PANGO_PIXELS (metrics->ascent), + invalid_input); pango_font_metrics_unref (metrics); return box; @@ -207,7 +233,8 @@ pango_ft2_font_render_glyph (PangoFont *font, generic_box: return pango_ft2_font_render_box_glyph (PANGO_UNKNOWN_GLYPH_WIDTH, PANGO_UNKNOWN_GLYPH_HEIGHT, - PANGO_UNKNOWN_GLYPH_HEIGHT); + PANGO_UNKNOWN_GLYPH_HEIGHT, + invalid_input); } } @@ -231,16 +258,17 @@ pango_ft2_renderer_draw_glyph (PangoRenderer *renderer, if (glyph & PANGO_GLYPH_UNKNOWN_FLAG) { - glyph = pango_ft2_get_unknown_glyph (font); - if (glyph == PANGO_GLYPH_EMPTY) - { - /* No unknown glyph found for the font, draw a box */ + /* Since we don't draw hexbox for FT2 renderer, + * unifiy the rendered bitmap in the cache by converting + * all missing glyphs to either INVALID_INPUT or UNKNOWN_FLAG. + */ - /* Since we only draw an empty box for FT2 renderer, - * we unify the rendered bitmaps in the cache. - */ - glyph = PANGO_GLYPH_UNKNOWN_FLAG; - } + gunichar wc = glyph & (~PANGO_GLYPH_UNKNOWN_FLAG); + + if (G_UNLIKELY (glyph == PANGO_GLYPH_INVALID_INPUT || wc > 0x10FFFF)) + glyph = PANGO_GLYPH_INVALID_INPUT; + else + glyph = PANGO_GLYPH_UNKNOWN_FLAG; } rendered_glyph = _pango_ft2_font_get_cache_glyph_data (font, glyph); |