summaryrefslogtreecommitdiff
path: root/source/pdf/pdf-resources.c
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2016-02-24 17:48:43 +0100
committerTor Andersson <tor.andersson@artifex.com>2016-02-29 15:53:04 +0100
commitfc9dbdec311d643fe020557f5aa0bde045b27186 (patch)
tree57affd2cc1310b0a596588b8c44135e38df6b804 /source/pdf/pdf-resources.c
parent2220ffb30ea8773102e9ca0bce4e3b7e31720627 (diff)
downloadmupdf-fc9dbdec311d643fe020557f5aa0bde045b27186.tar.xz
Remove pdf_res struct. Use pdf_obj indirect references directly.
Fix refcounting bugs.
Diffstat (limited to 'source/pdf/pdf-resources.c')
-rw-r--r--source/pdf/pdf-resources.c63
1 files changed, 19 insertions, 44 deletions
diff --git a/source/pdf/pdf-resources.c b/source/pdf/pdf-resources.c
index 192e5893..577a6cc1 100644
--- a/source/pdf/pdf-resources.c
+++ b/source/pdf/pdf-resources.c
@@ -4,7 +4,7 @@ static void
res_table_free(fz_context *ctx, pdf_res_table *table)
{
int i, n;
- pdf_res *res;
+ pdf_obj *res;
if (table == NULL)
return;
@@ -15,10 +15,7 @@ res_table_free(fz_context *ctx, pdf_res_table *table)
{
res = fz_hash_get_val(ctx, table->hash, i);
if (res)
- {
- pdf_drop_obj(ctx, res->obj);
- fz_free(ctx, res);
- }
+ pdf_drop_obj(ctx, res);
}
fz_drop_hash(ctx, table->hash);
}
@@ -83,10 +80,9 @@ res_image_init(fz_context *ctx, pdf_document *doc, pdf_res_table *table)
int len, k;
pdf_obj *obj;
pdf_obj *type;
- pdf_res *res = NULL;
+ pdf_obj *res = NULL;
fz_image *image = NULL;
unsigned char digest[16];
- int num = 0;
fz_var(obj);
fz_var(image);
@@ -107,15 +103,9 @@ res_image_init(fz_context *ctx, pdf_document *doc, pdf_res_table *table)
fz_drop_image(ctx, image);
image = NULL;
- /* Don't allow overwrites. Number the resources for pdfwrite */
+ /* Don't allow overwrites. */
if (fz_hash_find(ctx, table->hash, digest) == NULL)
- {
- res = fz_malloc(ctx, sizeof(pdf_res));
- res->num = num;
- res->obj = obj;
- num = num + 1;
fz_hash_insert(ctx, table->hash, digest, obj);
- }
}
else
{
@@ -126,23 +116,22 @@ res_image_init(fz_context *ctx, pdf_document *doc, pdf_res_table *table)
}
fz_always(ctx)
{
- table->count = num;
fz_drop_image(ctx, image);
pdf_drop_obj(ctx, obj);
}
fz_catch(ctx)
{
res_table_free(ctx, table);
- fz_rethrow_message(ctx, "image resources table failed to initialize");
+ fz_rethrow_message(ctx, "cannot initialize image resource table");
}
}
-static pdf_res *
+static pdf_obj *
res_image_search(fz_context *ctx, pdf_document *doc, pdf_res_table *table, void *item, unsigned char *digest)
{
fz_image *image = item;
fz_hash_table *hash = table->hash;
- pdf_res *res;
+ pdf_obj *res;
if (hash == NULL)
res_image_init(ctx, doc, doc->resources->image);
@@ -152,7 +141,7 @@ res_image_search(fz_context *ctx, pdf_document *doc, pdf_res_table *table, void
res_image_get_md5(ctx, image, digest);
res = fz_hash_find(ctx, hash, digest);
if (res)
- pdf_keep_obj(ctx, res->obj);
+ pdf_keep_obj(ctx, res);
return res;
}
@@ -178,12 +167,12 @@ res_font_get_md5(fz_context *ctx, fz_buffer *buffer, unsigned char *digest)
fz_md5_final(&state, digest);
}
-static pdf_res *
+static pdf_obj *
res_font_search(fz_context *ctx, pdf_document *doc, pdf_res_table *table, void *item, unsigned char digest[16])
{
fz_buffer *buffer = item;
fz_hash_table *hash = table->hash;
- pdf_res *res;
+ pdf_obj *res;
if (hash == NULL)
res_font_init(ctx, doc, doc->resources->font);
@@ -193,49 +182,35 @@ res_font_search(fz_context *ctx, pdf_document *doc, pdf_res_table *table, void *
res_font_get_md5(ctx, buffer, digest);
res = fz_hash_find(ctx, hash, digest);
if (res)
- pdf_keep_obj(ctx, res->obj);
+ pdf_keep_obj(ctx, res);
return res;
}
/* Accessible methods */
-pdf_res *
+pdf_obj *
pdf_find_resource(fz_context *ctx, pdf_document *doc, pdf_res_table *table, void *item, unsigned char md5[16])
{
return table->search(ctx, doc, table, item, md5);
}
-pdf_res *
+pdf_obj *
pdf_insert_resource(fz_context *ctx, pdf_res_table *table, void *key, pdf_obj *obj)
{
- void *result;
- pdf_res *res = NULL;
-
- fz_var(res);
+ pdf_obj *res;
fz_try(ctx)
{
- res = fz_malloc(ctx, sizeof(pdf_res));
- res->num = table->count + 1;
- res->obj = obj;
- result = fz_hash_insert(ctx, table->hash, key, (void*)res);
- if (result != NULL)
- {
- fz_free(ctx, res);
- fz_warn(ctx, "warning: hash already present");
- }
+ res = fz_hash_insert(ctx, table->hash, key, obj);
+ if (res != NULL)
+ fz_warn(ctx, "warning: resource already present");
else
- {
- table->count = table->count + 1;
- pdf_keep_obj(ctx, obj);
- result = res;
- }
+ res = pdf_keep_obj(ctx, obj);
}
fz_catch(ctx)
{
- fz_free(ctx, res);
fz_rethrow(ctx);
}
- return result;
+ return res;
}
void