summaryrefslogtreecommitdiff
path: root/source/pdf/pdf-xobject.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/pdf/pdf-xobject.c')
-rw-r--r--source/pdf/pdf-xobject.c58
1 files changed, 21 insertions, 37 deletions
diff --git a/source/pdf/pdf-xobject.c b/source/pdf/pdf-xobject.c
index e38be70e..4fcea897 100644
--- a/source/pdf/pdf-xobject.c
+++ b/source/pdf/pdf-xobject.c
@@ -16,9 +16,6 @@ static void
pdf_drop_xobject_imp(fz_context *ctx, fz_storable *xobj_)
{
pdf_xobject *xobj = (pdf_xobject *)xobj_;
-
- if (xobj->colorspace)
- fz_drop_colorspace(ctx, xobj->colorspace);
pdf_drop_obj(ctx, xobj->obj);
fz_free(ctx, xobj);
}
@@ -28,7 +25,7 @@ pdf_xobject_size(pdf_xobject *xobj)
{
if (xobj == NULL)
return 0;
- return sizeof(*xobj) + (xobj->colorspace ? xobj->colorspace->size : 0);
+ return sizeof(*xobj);
}
pdf_obj *
@@ -74,54 +71,42 @@ int pdf_xobject_transparency(fz_context *ctx, pdf_xobject *xobj)
return 0;
}
+fz_colorspace *
+pdf_xobject_colorspace(fz_context *ctx, pdf_xobject *xobj)
+{
+ pdf_obj *group = pdf_dict_get(ctx, xobj->obj, PDF_NAME_Group);
+ if (group)
+ {
+ pdf_obj *cs = pdf_dict_get(ctx, group, PDF_NAME_CS);
+ if (cs)
+ {
+ fz_colorspace *colorspace = NULL;
+ fz_try(ctx)
+ colorspace = pdf_load_colorspace(ctx, pdf_get_bound_document(ctx, xobj->obj), cs);
+ fz_catch(ctx)
+ fz_warn(ctx, "cannot load xobject colorspace");
+ return colorspace;
+ }
+ }
+ return NULL;
+}
+
pdf_xobject *
pdf_load_xobject(fz_context *ctx, pdf_document *doc, pdf_obj *dict)
{
pdf_xobject *form;
- pdf_obj *obj;
if ((form = pdf_find_item(ctx, pdf_drop_xobject_imp, dict)) != NULL)
- {
return form;
- }
form = fz_malloc_struct(ctx, pdf_xobject);
FZ_INIT_STORABLE(form, 1, pdf_drop_xobject_imp);
- form->colorspace = NULL;
form->obj = NULL;
form->iteration = 0;
/* Store item immediately, to avoid possible recursion if objects refer back to this one */
pdf_store_item(ctx, dict, form, pdf_xobject_size(form));
- fz_try(ctx)
- {
- obj = pdf_dict_get(ctx, dict, PDF_NAME_Group);
- if (obj)
- {
- pdf_obj *attrs = obj;
-
- obj = pdf_dict_get(ctx, attrs, PDF_NAME_CS);
- if (obj)
- {
- fz_try(ctx)
- {
- form->colorspace = pdf_load_colorspace(ctx, doc, obj);
- }
- fz_catch(ctx)
- {
- fz_warn(ctx, "cannot load xobject colorspace");
- }
- }
- }
- }
- fz_catch(ctx)
- {
- pdf_remove_item(ctx, pdf_drop_xobject_imp, dict);
- pdf_drop_xobject(ctx, form);
- fz_rethrow(ctx);
- }
-
form->obj = pdf_keep_obj(ctx, dict);
return form;
@@ -163,7 +148,6 @@ pdf_new_xobject(fz_context *ctx, pdf_document *doc, const fz_rect *bbox, const f
form = fz_malloc_struct(ctx, pdf_xobject);
FZ_INIT_STORABLE(form, 1, pdf_drop_xobject_imp);
- form->colorspace = NULL;
form->obj = NULL;
form->iteration = 0;