diff options
-rw-r--r-- | include/mupdf/fitz/display-list.h | 9 | ||||
-rw-r--r-- | source/fitz/font.c | 11 | ||||
-rw-r--r-- | source/fitz/list-device.c | 5 |
3 files changed, 24 insertions, 1 deletions
diff --git a/include/mupdf/fitz/display-list.h b/include/mupdf/fitz/display-list.h index a7f7fa00..916ced70 100644 --- a/include/mupdf/fitz/display-list.h +++ b/include/mupdf/fitz/display-list.h @@ -107,4 +107,13 @@ fz_rect *fz_bound_display_list(fz_context *ctx, fz_display_list *list, fz_rect * */ fz_image *fz_new_image_from_display_list(fz_context *ctx, float w, float h, fz_display_list *list); +/* + Check for a display list being empty + + list: The list to check. + + Returns true if empty, false otherwise. +*/ +int fz_display_list_is_empty(fz_context *ctx, const fz_display_list *list); + #endif diff --git a/source/fitz/font.c b/source/fitz/font.c index 92642ec0..14c79aa9 100644 --- a/source/fitz/font.c +++ b/source/fitz/font.c @@ -1190,7 +1190,16 @@ fz_prepare_t3_glyph(fz_context *ctx, fz_font *font, int gid, int nested_depth) d1_rect = dev->d1_rect; fz_drop_device(ctx, dev); dev = NULL; - if (font->t3flags[gid] & FZ_DEVFLAG_BBOX_DEFINED) + if (fz_display_list_is_empty(ctx, font->t3lists[gid])) + { + /* If empty, no need for a huge bbox, especially as the logic + * in the 'else if' can make it huge. */ + font->bbox_table[gid].x0 = font->bbox.x0; + font->bbox_table[gid].y0 = font->bbox.y0; + font->bbox_table[gid].x1 = font->bbox.x0 + .00001; + font->bbox_table[gid].y1 = font->bbox.y0 + .00001; + } + else if (font->t3flags[gid] & FZ_DEVFLAG_BBOX_DEFINED) { assert(font->bbox_table != NULL); assert(font->glyph_count > gid); diff --git a/source/fitz/list-device.c b/source/fitz/list-device.c index c8b2ced5..ee722126 100644 --- a/source/fitz/list-device.c +++ b/source/fitz/list-device.c @@ -1380,6 +1380,11 @@ fz_bound_display_list(fz_context *ctx, fz_display_list *list, fz_rect *bounds) return bounds; } +int fz_display_list_is_empty(fz_context *ctx, const fz_display_list *list) +{ + return !list || list->len == 0; +} + void fz_run_display_list(fz_context *ctx, fz_display_list *list, fz_device *dev, const fz_matrix *top_ctm, const fz_rect *scissor, fz_cookie *cookie) { |