diff options
author | Tor Andersson <tor.andersson@artifex.com> | 2017-05-25 12:10:47 +0200 |
---|---|---|
committer | Tor Andersson <tor.andersson@artifex.com> | 2017-05-25 13:53:39 +0200 |
commit | 0287ff8ba2779274914f0509c9325f881c6634f2 (patch) | |
tree | 7513d9a174002387a0a2a5395c7428a92f64a159 /source/fitz/font.c | |
parent | 32599868df1b3ecd553a0c1bc3e2521dd11b288a (diff) | |
download | mupdf-0287ff8ba2779274914f0509c9325f881c6634f2.tar.xz |
Update Type 3 font bbox with glyph bboxes if the former is invalid.
Fix for bug 697943.
Set the initial replacement font bbox to the empty rectangle for type3 fonts,
and let the type3 glyph loading initialize by taking the union of all glyph
bboxes.
Set the replacement font bbox for non-Type3 fonts to the unit rectangle.
Also remove unused flag from fz_font struct.
Diffstat (limited to 'source/fitz/font.c')
-rw-r--r-- | source/fitz/font.c | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/source/fitz/font.c b/source/fitz/font.c index ebf66f45..65e06f43 100644 --- a/source/fitz/font.c +++ b/source/fitz/font.c @@ -64,7 +64,6 @@ fz_new_font(fz_context *ctx, const char *name, int use_glyph_bbox, int glyph_cou font->glyph_count = glyph_count; - font->flags.use_glyph_bbox = !!use_glyph_bbox; if (use_glyph_bbox && glyph_count <= MAX_BBOX_TABLE_SIZE) { font->bbox_table = fz_malloc_array(ctx, glyph_count, sizeof(fz_rect)); @@ -171,12 +170,17 @@ fz_set_font_bbox(fz_context *ctx, fz_font *font, float xmin, float ymin, float x { if (xmin >= xmax || ymin >= ymax) { - /* Invalid bbox supplied. It would be prohibitively slow to - * measure the true one, so make one up. */ - font->bbox.x0 = -1; - font->bbox.y0 = -1; - font->bbox.x1 = 2; - font->bbox.y1 = 2; + /* Invalid bbox supplied. */ + if (font->t3procs) + { + /* For type3 fonts we use the union of all the glyphs' bboxes. */ + font->bbox = fz_empty_rect; + } + else + { + /* For other fonts it would be prohibitively slow to measure the true one, so make one up. */ + font->bbox = fz_unit_rect; + } font->flags.invalid_bbox = 1; } else @@ -1168,6 +1172,10 @@ fz_bound_t3_glyph(fz_context *ctx, fz_font *font, int gid) { fz_rethrow(ctx); } + + /* Update font bbox with glyph's computed bbox if the font bbox is invalid */ + if (font->flags.invalid_bbox) + fz_union_rect(&font->bbox, &font->bbox_table[gid]); } void @@ -1225,6 +1233,11 @@ fz_prepare_t3_glyph(fz_context *ctx, fz_font *font, int gid, int nested_depth) fz_bound_t3_glyph(ctx, font, gid); } } + else + { + /* No bbox has been defined for this glyph, so compute it. */ + fz_bound_t3_glyph(ctx, font, gid); + } } void |