summaryrefslogtreecommitdiff
path: root/fitz
diff options
context:
space:
mode:
authorRobin Watts <robin.watts@artifex.com>2013-03-19 20:36:10 +0000
committerRobin Watts <robin.watts@artifex.com>2013-03-20 11:10:15 +0000
commit9e937ba0965bcf11948a9b3ea5eb6d700df65bc9 (patch)
treed7a71fd597a430dae01863ca2cf2a5e60643efa5 /fitz
parent604c7ffd2363c3fe9b222fb1f0a12a9e69f584c6 (diff)
downloadmupdf-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.c38
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;
}