summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2018-06-13 11:48:07 +0200
committerTor Andersson <tor.andersson@artifex.com>2018-06-22 16:23:34 +0200
commit7d2407571d8c8851b67af5ddd0429467c7048b16 (patch)
treec7c128a56f3a6768b783c1b805c122b26f54ba07 /source
parent61f58980aa353dda3bdb9b563b87cd0e8741d0f0 (diff)
downloadmupdf-7d2407571d8c8851b67af5ddd0429467c7048b16.tar.xz
Remember the md5 digest in the fz_font struct.
Diffstat (limited to 'source')
-rw-r--r--source/fitz/font-imp.h4
-rw-r--r--source/fitz/font.c12
-rw-r--r--source/pdf/pdf-font.c6
-rw-r--r--source/pdf/pdf-resources.c15
4 files changed, 23 insertions, 14 deletions
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)