diff options
author | Robin Watts <robin.watts@artifex.com> | 2013-03-19 20:36:10 +0000 |
---|---|---|
committer | Robin Watts <robin.watts@artifex.com> | 2013-03-20 11:10:15 +0000 |
commit | 9e937ba0965bcf11948a9b3ea5eb6d700df65bc9 (patch) | |
tree | d7a71fd597a430dae01863ca2cf2a5e60643efa5 /fitz | |
parent | 604c7ffd2363c3fe9b222fb1f0a12a9e69f584c6 (diff) | |
download | mupdf-9e937ba0965bcf11948a9b3ea5eb6d700df65bc9.tar.xz |
Fix invalid font bboxes
The font bbox is wrong in some fonts, so any calculations we base
on that will be wrong; in particular this affects fz_bound_glyph.
We now spot an illegal bbox, and use a 'large' default.
Diffstat (limited to 'fitz')
-rw-r--r-- | fitz/res_font.c | 38 |
1 files changed, 26 insertions, 12 deletions
diff --git a/fitz/res_font.c b/fitz/res_font.c index a09c507b..edc8c054 100644 --- a/fitz/res_font.c +++ b/fitz/res_font.c @@ -131,10 +131,22 @@ fz_drop_font(fz_context *ctx, fz_font *font) void fz_set_font_bbox(fz_context *ctx, fz_font *font, float xmin, float ymin, float xmax, float ymax) { - font->bbox.x0 = xmin; - font->bbox.y0 = ymin; - font->bbox.x1 = xmax; - font->bbox.y1 = ymax; + 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; + } + else + { + font->bbox.x0 = xmin; + font->bbox.y0 = ymin; + font->bbox.x1 = xmax; + font->bbox.y1 = ymax; + } } /* @@ -282,10 +294,11 @@ fz_new_font_from_file(fz_context *ctx, char *name, char *path, int index, int us font = fz_new_font(ctx, name, use_glyph_bbox, face->num_glyphs); font->ft_face = face; - font->bbox.x0 = (float) face->bbox.xMin / face->units_per_EM; - font->bbox.y0 = (float) face->bbox.yMin / face->units_per_EM; - font->bbox.x1 = (float) face->bbox.xMax / face->units_per_EM; - font->bbox.y1 = (float) face->bbox.yMax / face->units_per_EM; + fz_set_font_bbox(ctx, font, + (float) face->bbox.xMin / face->units_per_EM, + (float) face->bbox.yMin / face->units_per_EM, + (float) face->bbox.xMax / face->units_per_EM, + (float) face->bbox.yMax / face->units_per_EM); return font; } @@ -313,10 +326,11 @@ fz_new_font_from_memory(fz_context *ctx, char *name, unsigned char *data, int le font = fz_new_font(ctx, name, use_glyph_bbox, face->num_glyphs); font->ft_face = face; - font->bbox.x0 = (float) face->bbox.xMin / face->units_per_EM; - font->bbox.y0 = (float) face->bbox.yMin / face->units_per_EM; - font->bbox.x1 = (float) face->bbox.xMax / face->units_per_EM; - font->bbox.y1 = (float) face->bbox.yMax / face->units_per_EM; + fz_set_font_bbox(ctx, font, + (float) face->bbox.xMin / face->units_per_EM, + (float) face->bbox.yMin / face->units_per_EM, + (float) face->bbox.xMax / face->units_per_EM, + (float) face->bbox.yMax / face->units_per_EM); return font; } |