diff options
-rw-r--r-- | include/mupdf/fitz/font.h | 2 | ||||
-rw-r--r-- | include/mupdf/pdf/resource.h | 2 | ||||
-rw-r--r-- | source/fitz/font-imp.h | 4 | ||||
-rw-r--r-- | source/fitz/font.c | 12 | ||||
-rw-r--r-- | source/pdf/pdf-font.c | 6 | ||||
-rw-r--r-- | source/pdf/pdf-resources.c | 15 |
6 files changed, 26 insertions, 15 deletions
diff --git a/include/mupdf/fitz/font.h b/include/mupdf/fitz/font.h index 85904b02..aa6d4dd5 100644 --- a/include/mupdf/fitz/font.h +++ b/include/mupdf/fitz/font.h @@ -593,6 +593,8 @@ void fz_get_glyph_name(fz_context *ctx, fz_font *font, int glyph, char *buf, int float fz_font_ascender(fz_context *ctx, fz_font *font); float fz_font_descender(fz_context *ctx, fz_font *font); +void fz_font_digest(fz_context *ctx, fz_font *font, unsigned char digest[16]); + /* Internal functions for our Harfbuzz integration to work around the lack of thread safety. diff --git a/include/mupdf/pdf/resource.h b/include/mupdf/pdf/resource.h index 2febc8b7..b6a2a4b5 100644 --- a/include/mupdf/pdf/resource.h +++ b/include/mupdf/pdf/resource.h @@ -20,7 +20,7 @@ void pdf_empty_store(fz_context *ctx, pdf_document *doc); enum { PDF_SIMPLE_FONT_RESOURCE=1, PDF_CID_FONT_RESOURCE=2, PDF_CJK_FONT_RESOURCE=3 }; enum { PDF_SIMPLE_ENCODING_LATIN, PDF_SIMPLE_ENCODING_GREEK, PDF_SIMPLE_ENCODING_CYRILLIC }; -pdf_obj *pdf_find_font_resource(fz_context *ctx, pdf_document *doc, int type, int encoding, fz_buffer *item, unsigned char md5[16]); +pdf_obj *pdf_find_font_resource(fz_context *ctx, pdf_document *doc, int type, int encoding, fz_font *item, unsigned char md5[16]); pdf_obj *pdf_insert_font_resource(fz_context *ctx, pdf_document *doc, unsigned char md5[16], pdf_obj *obj); pdf_obj *pdf_find_image_resource(fz_context *ctx, pdf_document *doc, fz_image *item, unsigned char md5[16]); pdf_obj *pdf_insert_image_resource(fz_context *ctx, pdf_document *doc, unsigned char md5[16], pdf_obj *obj); diff --git a/source/fitz/font-imp.h b/source/fitz/font-imp.h index 74a25ccf..f121923c 100644 --- a/source/fitz/font-imp.h +++ b/source/fitz/font-imp.h @@ -39,6 +39,10 @@ struct fz_font_s /* cached encoding lookup */ uint16_t *encoding_cache[256]; + + /* cached md5sum for caching */ + int has_digest; + unsigned char digest[16]; }; #endif diff --git a/source/fitz/font.c b/source/fitz/font.c index 2075306e..c39174ee 100644 --- a/source/fitz/font.c +++ b/source/fitz/font.c @@ -1814,3 +1814,15 @@ fz_shaper_data_t *fz_font_shaper_data(fz_context *ctx, fz_font *font) { return font ? &font->shaper_data : NULL; } + +void fz_font_digest(fz_context *ctx, fz_font *font, unsigned char digest[16]) +{ + if (!font->buffer) + fz_throw(ctx, FZ_ERROR_GENERIC, "no font file for digest"); + if (!font->has_digest) + { + fz_md5_buffer(ctx, font->buffer, font->digest); + font->has_digest = 1; + } + memcpy(digest, font->digest, 16); +} diff --git a/source/pdf/pdf-font.c b/source/pdf/pdf-font.c index 72e2a971..f600fc1b 100644 --- a/source/pdf/pdf-font.c +++ b/source/pdf/pdf-font.c @@ -2010,7 +2010,7 @@ pdf_add_cid_font(fz_context *ctx, pdf_document *doc, fz_font *font) pdf_obj *dfonts = NULL; unsigned char digest[16]; - fref = pdf_find_font_resource(ctx, doc, PDF_CID_FONT_RESOURCE, 0, font->buffer, digest); + fref = pdf_find_font_resource(ctx, doc, PDF_CID_FONT_RESOURCE, 0, font, digest); if (fref) return fref; @@ -2087,7 +2087,7 @@ pdf_add_simple_font(fz_context *ctx, pdf_document *doc, fz_font *font, int encod const char **enc; unsigned char digest[16]; - fref = pdf_find_font_resource(ctx, doc, PDF_SIMPLE_FONT_RESOURCE, encoding, font->buffer, digest); + fref = pdf_find_font_resource(ctx, doc, PDF_SIMPLE_FONT_RESOURCE, encoding, font, digest); if (fref) return fref; @@ -2199,7 +2199,7 @@ pdf_add_cjk_font(fz_context *ctx, pdf_document *doc, fz_font *fzfont, int script if (serif) flags |= PDF_FD_SERIF; - fref = pdf_find_font_resource(ctx, doc, PDF_CJK_FONT_RESOURCE, script, fzfont->buffer, digest); + fref = pdf_find_font_resource(ctx, doc, PDF_CJK_FONT_RESOURCE, script, fzfont, digest); if (fref) return fref; diff --git a/source/pdf/pdf-resources.c b/source/pdf/pdf-resources.c index 55d6603e..82991f6e 100644 --- a/source/pdf/pdf-resources.c +++ b/source/pdf/pdf-resources.c @@ -109,24 +109,17 @@ pdf_insert_image_resource(fz_context *ctx, pdf_document *doc, unsigned char dige * it may be more problematic. */ pdf_obj * -pdf_find_font_resource(fz_context *ctx, pdf_document *doc, int type, int encoding, fz_buffer *item, unsigned char digest[16]) +pdf_find_font_resource(fz_context *ctx, pdf_document *doc, int type, int encoding, fz_font *item, unsigned char digest[16]) { - fz_md5 state; - unsigned char *data; - size_t size; pdf_obj *res; if (!doc->resources.fonts) doc->resources.fonts = fz_new_hash_table(ctx, 4096, 16, -1, pdf_drop_obj_as_void); - size = fz_buffer_storage(ctx, item, &data); + fz_font_digest(ctx, item, digest); - /* Create md5 and see if we have the item in our table */ - fz_md5_init(&state); - fz_md5_update(&state, (unsigned char*)&type, sizeof type); - fz_md5_update(&state, (unsigned char*)&encoding, sizeof encoding); - fz_md5_update(&state, data, size); - fz_md5_final(&state, digest); + digest[0] += type; + digest[1] += encoding; res = fz_hash_find(ctx, doc->resources.fonts, digest); if (res) |