summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/mupdf/pdf/annot.h8
-rw-r--r--include/mupdf/pdf/interpret.h4
-rw-r--r--include/mupdf/pdf/resource.h28
-rw-r--r--platform/x11/pdfapp.c3
-rw-r--r--source/pdf/pdf-annot.c28
-rw-r--r--source/pdf/pdf-appearance.c67
-rw-r--r--source/pdf/pdf-form.c19
-rw-r--r--source/pdf/pdf-interpret.c82
-rw-r--r--source/pdf/pdf-op-buffer.c2
-rw-r--r--source/pdf/pdf-op-filter.c4
-rw-r--r--source/pdf/pdf-op-run.c38
-rw-r--r--source/pdf/pdf-xobject.c108
12 files changed, 115 insertions, 276 deletions
diff --git a/include/mupdf/pdf/annot.h b/include/mupdf/pdf/annot.h
index 13111aab..2dd47f27 100644
--- a/include/mupdf/pdf/annot.h
+++ b/include/mupdf/pdf/annot.h
@@ -107,10 +107,10 @@ struct pdf_annot_s
pdf_page *page;
pdf_obj *obj;
- pdf_xobject *ap;
+ pdf_obj *ap;
- int ap_iteration;
- int dirty;
+ int needs_new_ap;
+ int has_new_ap;
pdf_annot *next;
};
@@ -245,7 +245,5 @@ void pdf_set_free_text_details(fz_context *ctx, pdf_annot *annot, fz_point *pos,
pdf_annot *pdf_new_annot(fz_context *ctx, pdf_page *page);
void pdf_dirty_annot(fz_context *ctx, pdf_annot *annot);
-void pdf_clean_annot(fz_context *ctx, pdf_annot *annot);
-int pdf_annot_is_dirty(fz_context *ctx, pdf_annot *annot);
#endif
diff --git a/include/mupdf/pdf/interpret.h b/include/mupdf/pdf/interpret.h
index cbe1d665..4854caac 100644
--- a/include/mupdf/pdf/interpret.h
+++ b/include/mupdf/pdf/interpret.h
@@ -30,7 +30,7 @@ struct pdf_processor_s
void (*op_gs_BM)(fz_context *ctx, pdf_processor *proc, const char *blendmode);
void (*op_gs_ca)(fz_context *ctx, pdf_processor *proc, float alpha);
void (*op_gs_CA)(fz_context *ctx, pdf_processor *proc, float alpha);
- void (*op_gs_SMask)(fz_context *ctx, pdf_processor *proc, pdf_xobject *smask, pdf_obj *page_resources, float *bc, int luminosity);
+ void (*op_gs_SMask)(fz_context *ctx, pdf_processor *proc, pdf_obj *smask, pdf_obj *page_resources, float *bc, int luminosity);
void (*op_gs_end)(fz_context *ctx, pdf_processor *proc);
/* special graphics state */
@@ -113,7 +113,7 @@ struct pdf_processor_s
void (*op_BI)(fz_context *ctx, pdf_processor *proc, fz_image *image);
void (*op_sh)(fz_context *ctx, pdf_processor *proc, const char *name, fz_shade *shade);
void (*op_Do_image)(fz_context *ctx, pdf_processor *proc, const char *name, fz_image *image);
- void (*op_Do_form)(fz_context *ctx, pdf_processor *proc, const char *name, pdf_xobject *form, pdf_obj *page_resources);
+ void (*op_Do_form)(fz_context *ctx, pdf_processor *proc, const char *name, pdf_obj *form, pdf_obj *page_resources);
/* marked content */
void (*op_MP)(fz_context *ctx, pdf_processor *proc, const char *tag);
diff --git a/include/mupdf/pdf/resource.h b/include/mupdf/pdf/resource.h
index 5650a12a..85a9f786 100644
--- a/include/mupdf/pdf/resource.h
+++ b/include/mupdf/pdf/resource.h
@@ -76,29 +76,17 @@ void pdf_drop_pattern(fz_context *ctx, pdf_pattern *pat);
* XObject
*/
-typedef struct pdf_xobject_s pdf_xobject;
-
-struct pdf_xobject_s
-{
- fz_storable storable;
- pdf_obj *obj;
- int iteration;
-};
-
-pdf_xobject *pdf_load_xobject(fz_context *ctx, pdf_document *doc, pdf_obj *obj);
pdf_obj *pdf_new_xobject(fz_context *ctx, pdf_document *doc, const fz_rect *bbox, const fz_matrix *mat);
-pdf_xobject *pdf_keep_xobject(fz_context *ctx, pdf_xobject *xobj);
-void pdf_drop_xobject(fz_context *ctx, pdf_xobject *xobj);
-void pdf_update_xobject_contents(fz_context *ctx, pdf_document *doc, pdf_xobject *form, fz_buffer *buffer);
+void pdf_update_xobject_contents(fz_context *ctx, pdf_document *doc, pdf_obj *form, fz_buffer *buffer);
void pdf_update_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *annot);
-pdf_obj *pdf_xobject_resources(fz_context *ctx, pdf_xobject *xobj);
-fz_rect *pdf_xobject_bbox(fz_context *ctx, pdf_xobject *xobj, fz_rect *bbox);
-fz_matrix *pdf_xobject_matrix(fz_context *ctx, pdf_xobject *xobj, fz_matrix *matrix);
-int pdf_xobject_isolated(fz_context *ctx, pdf_xobject *xobj);
-int pdf_xobject_knockout(fz_context *ctx, pdf_xobject *xobj);
-int pdf_xobject_transparency(fz_context *ctx, pdf_xobject *xobj);
-fz_colorspace *pdf_xobject_colorspace(fz_context *ctx, pdf_xobject *xobj);
+pdf_obj *pdf_xobject_resources(fz_context *ctx, pdf_obj *xobj);
+fz_rect *pdf_xobject_bbox(fz_context *ctx, pdf_obj *xobj, fz_rect *bbox);
+fz_matrix *pdf_xobject_matrix(fz_context *ctx, pdf_obj *xobj, fz_matrix *matrix);
+int pdf_xobject_isolated(fz_context *ctx, pdf_obj *xobj);
+int pdf_xobject_knockout(fz_context *ctx, pdf_obj *xobj);
+int pdf_xobject_transparency(fz_context *ctx, pdf_obj *xobj);
+fz_colorspace *pdf_xobject_colorspace(fz_context *ctx, pdf_obj *xobj);
#endif
diff --git a/platform/x11/pdfapp.c b/platform/x11/pdfapp.c
index efa7f460..f038f945 100644
--- a/platform/x11/pdfapp.c
+++ b/platform/x11/pdfapp.c
@@ -808,7 +808,7 @@ static void pdfapp_updatepage(pdfapp_t *app)
for (pannot = pdf_first_annot(app->ctx, (pdf_page*)app->page); pannot; pannot = pdf_next_annot(app->ctx, pannot))
{
- if (pdf_annot_is_dirty(app->ctx, pannot))
+ if (pannot->has_new_ap)
{
fz_annot *annot = (fz_annot*)pannot;
fz_rect bounds;
@@ -826,6 +826,7 @@ static void pdfapp_updatepage(pdfapp_t *app)
fz_drop_device(app->ctx, idev);
fz_catch(app->ctx)
fz_rethrow(app->ctx);
+ pannot->has_new_ap = 0;
}
}
diff --git a/source/pdf/pdf-annot.c b/source/pdf/pdf-annot.c
index 7046ff18..3325c828 100644
--- a/source/pdf/pdf-annot.c
+++ b/source/pdf/pdf-annot.c
@@ -358,7 +358,7 @@ pdf_resolve_link(fz_context *ctx, pdf_document *doc, const char *uri, float *xp,
static void
pdf_drop_annot_imp(fz_context *ctx, pdf_annot *annot)
{
- pdf_drop_xobject(ctx, annot->ap);
+ pdf_drop_obj(ctx, annot->ap);
pdf_drop_obj(ctx, annot->obj);
}
@@ -496,11 +496,11 @@ pdf_load_annots(fz_context *ctx, pdf_page *page, pdf_obj *annots)
n = pdf_dict_get(ctx, n, as);
annot->ap = NULL;
+ annot->has_new_ap = 1;
if (pdf_is_stream(ctx, n))
{
- annot->ap = pdf_load_xobject(ctx, doc, n);
- annot->ap_iteration = annot->ap->iteration;
+ annot->ap = pdf_keep_obj(ctx, n);
}
else
fz_warn(ctx, "no appearance stream for annotation %d 0 R", pdf_to_num(ctx, annot->obj));
@@ -561,23 +561,7 @@ pdf_bound_annot(fz_context *ctx, pdf_annot *annot, fz_rect *rect)
void
pdf_dirty_annot(fz_context *ctx, pdf_annot *annot)
{
- if (annot)
- {
- annot->dirty = 1;
- if (annot->page && annot->page->doc)
- annot->page->doc->dirty = 1;
- }
-}
-
-void
-pdf_clean_annot(fz_context *ctx, pdf_annot *annot)
-{
- if (annot)
- annot->dirty = 0;
-}
-
-int
-pdf_annot_is_dirty(fz_context *ctx, pdf_annot *annot)
-{
- return annot ? annot->dirty: 0;
+ annot->needs_new_ap = 1;
+ if (annot->page && annot->page->doc)
+ annot->page->doc->dirty = 1;
}
diff --git a/source/pdf/pdf-appearance.c b/source/pdf/pdf-appearance.c
index 2355637f..49e932c3 100644
--- a/source/pdf/pdf-appearance.c
+++ b/source/pdf/pdf-appearance.c
@@ -778,13 +778,13 @@ static fz_buffer *create_text_appearance(fz_context *ctx, pdf_document *doc, con
return fzbuf;
}
-static int get_matrix(fz_context *ctx, pdf_document *doc, pdf_xobject *form, int q, fz_matrix *mt)
+static int get_matrix(fz_context *ctx, pdf_document *doc, pdf_obj *form, int q, fz_matrix *mt)
{
int found = 0;
pdf_lexbuf lbuf;
fz_stream *str;
- str = pdf_open_stream(ctx, form->obj);
+ str = pdf_open_stream(ctx, form);
pdf_lexbuf_init(ctx, &lbuf, PDF_LEXBUF_SMALL);
@@ -830,7 +830,7 @@ static int get_matrix(fz_context *ctx, pdf_document *doc, pdf_xobject *form, int
if (found)
{
fz_rect bbox;
- pdf_to_rect(ctx, pdf_dict_get(ctx, form->obj, PDF_NAME_BBox), &bbox);
+ pdf_to_rect(ctx, pdf_dict_get(ctx, form, PDF_NAME_BBox), &bbox);
switch (q)
{
@@ -967,18 +967,16 @@ static void copy_resources(fz_context *ctx, pdf_obj *dst, pdf_obj *src)
}
}
-static pdf_xobject *load_or_create_form(fz_context *ctx, pdf_document *doc, pdf_obj *obj, fz_rect *rect)
+static pdf_obj *load_or_create_form(fz_context *ctx, pdf_document *doc, pdf_obj *obj, fz_rect *rect)
{
pdf_obj *ap = NULL;
fz_matrix mat;
int rot;
pdf_obj *formobj = NULL;
- pdf_xobject *form = NULL;
fz_buffer *fzbuf = NULL;
int create_form = 0;
fz_var(formobj);
- fz_var(form);
fz_var(fzbuf);
fz_try(ctx)
{
@@ -1010,9 +1008,7 @@ static pdf_xobject *load_or_create_form(fz_context *ctx, pdf_document *doc, pdf_
pdf_update_stream(ctx, doc, formobj, fzbuf, 0);
}
- form = pdf_load_xobject(ctx, doc, formobj);
-
- copy_resources(ctx, pdf_xobject_resources(ctx, form), pdf_get_inheritable(ctx, doc, obj, PDF_NAME_DR));
+ copy_resources(ctx, pdf_xobject_resources(ctx, formobj), pdf_get_inheritable(ctx, doc, obj, PDF_NAME_DR));
}
fz_always(ctx)
{
@@ -1020,14 +1016,13 @@ static pdf_xobject *load_or_create_form(fz_context *ctx, pdf_document *doc, pdf_
}
fz_catch(ctx)
{
- pdf_drop_xobject(ctx, form);
fz_rethrow(ctx);
}
- return form;
+ return pdf_keep_obj(ctx, formobj);
}
-static void update_marked_content(fz_context *ctx, pdf_document *doc, pdf_xobject *form, fz_buffer *fzbuf)
+static void update_marked_content(fz_context *ctx, pdf_document *doc, pdf_obj *form, fz_buffer *fzbuf)
{
pdf_token tok;
pdf_lexbuf lbuf;
@@ -1048,7 +1043,7 @@ static void update_marked_content(fz_context *ctx, pdf_document *doc, pdf_xobjec
int first = 1;
newbuf = fz_new_buffer(ctx, 0);
- str_outer = pdf_open_stream(ctx, form->obj);
+ str_outer = pdf_open_stream(ctx, form);
len = fz_buffer_storage(ctx, fzbuf, &buf);
str_inner = fz_open_memory(ctx, buf, len);
@@ -1139,8 +1134,8 @@ static float get_border_width(fz_context *ctx, pdf_obj *obj)
void pdf_update_text_appearance(fz_context *ctx, pdf_document *doc, pdf_obj *obj, char *eventValue)
{
text_widget_info info;
- pdf_xobject *form = NULL;
fz_buffer *fzbuf = NULL;
+ pdf_obj *form = NULL;
fz_matrix tm;
fz_rect rect, form_bbox;
int has_tm;
@@ -1149,8 +1144,8 @@ void pdf_update_text_appearance(fz_context *ctx, pdf_document *doc, pdf_obj *obj
memset(&info, 0, sizeof(info));
fz_var(info);
- fz_var(form);
fz_var(fzbuf);
+ fz_var(form);
fz_var(text);
fz_try(ctx)
{
@@ -1171,7 +1166,6 @@ void pdf_update_text_appearance(fz_context *ctx, pdf_document *doc, pdf_obj *obj
fz_always(ctx)
{
fz_free(ctx, text);
- pdf_drop_xobject(ctx, form);
fz_drop_buffer(ctx, fzbuf);
font_info_fin(ctx, &info.font_rec);
}
@@ -1184,7 +1178,7 @@ void pdf_update_text_appearance(fz_context *ctx, pdf_document *doc, pdf_obj *obj
void pdf_update_listbox_appearance(fz_context *ctx, pdf_document *doc, pdf_obj *obj)
{
text_widget_info info;
- pdf_xobject *form = NULL;
+ pdf_obj *form = NULL;
fz_buffer *fzbuf = NULL;
fz_matrix tm;
fz_rect clip_rect;
@@ -1368,7 +1362,7 @@ void pdf_update_listbox_appearance(fz_context *ctx, pdf_document *doc, pdf_obj *
fz_free(ctx, opts);
fz_free(ctx, vals);
fz_free(ctx, sel_indices);
- pdf_drop_xobject(ctx, form);
+ pdf_drop_obj(ctx, form);
fz_drop_buffer(ctx, fzbuf);
font_info_fin(ctx, &info.font_rec);
}
@@ -1381,7 +1375,7 @@ void pdf_update_listbox_appearance(fz_context *ctx, pdf_document *doc, pdf_obj *
void pdf_update_combobox_appearance(fz_context *ctx, pdf_document *doc, pdf_obj *obj)
{
text_widget_info info;
- pdf_xobject *form = NULL;
+ pdf_obj *form = NULL;
fz_buffer *fzbuf = NULL;
fz_matrix tm;
fz_rect rect, form_bbox;
@@ -1418,7 +1412,7 @@ void pdf_update_combobox_appearance(fz_context *ctx, pdf_document *doc, pdf_obj
}
fz_always(ctx)
{
- pdf_drop_xobject(ctx, form);
+ pdf_drop_obj(ctx, form);
fz_drop_buffer(ctx, fzbuf);
font_info_fin(ctx, &info.font_rec);
}
@@ -1431,7 +1425,7 @@ void pdf_update_combobox_appearance(fz_context *ctx, pdf_document *doc, pdf_obj
void pdf_update_pushbutton_appearance(fz_context *ctx, pdf_document *doc, pdf_obj *obj)
{
fz_rect rect = fz_empty_rect;
- pdf_xobject *form = NULL;
+ pdf_obj *form = NULL;
fz_buffer *fzbuf = NULL;
pdf_obj *tobj = NULL;
font_info font_rec;
@@ -1524,7 +1518,7 @@ void pdf_update_pushbutton_appearance(fz_context *ctx, pdf_document *doc, pdf_ob
{
font_info_fin(ctx, &font_rec);
fz_drop_buffer(ctx, fzbuf);
- pdf_drop_xobject(ctx, form);
+ pdf_drop_obj(ctx, form);
}
fz_catch(ctx)
{
@@ -1586,7 +1580,6 @@ void pdf_set_annot_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *ann
{
pdf_obj *obj = annot->obj;
fz_device *dev = NULL;
- pdf_xobject *xobj = NULL;
fz_matrix page_ctm, inv_page_ctm;
pdf_obj *resources;
@@ -1641,14 +1634,8 @@ void pdf_set_annot_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *ann
fz_rethrow(ctx);
/* Mark the appearance as changed - required for partial update */
- xobj = pdf_load_xobject(ctx, doc, ap_obj);
- if (xobj)
- {
- xobj->iteration++;
- pdf_drop_xobject(ctx, xobj);
- }
-
- pdf_dirty_annot(ctx, annot);
+ annot->has_new_ap = 1;
+ annot->needs_new_ap = 0;
}
static fz_point *
@@ -2149,7 +2136,7 @@ void pdf_update_text_annot_appearance(fz_context *ctx, pdf_document *doc, pdf_an
/* Drop the cached xobject from the annotation structure to
* force a redraw on next pdf_update_page call */
- pdf_drop_xobject(ctx, annot->ap);
+ pdf_drop_obj(ctx, annot->ap);
annot->ap = NULL;
}
fz_always(ctx)
@@ -2433,7 +2420,7 @@ void pdf_set_signature_appearance(fz_context *ctx, pdf_document *doc, pdf_annot
/* Drop the cached xobject from the annotation structure to
* force a redraw on next pdf_update_page call */
- pdf_drop_xobject(ctx, annot->ap);
+ pdf_drop_obj(ctx, annot->ap);
annot->ap = NULL;
insert_signature_appearance_layers(ctx, doc, annot);
@@ -2565,21 +2552,13 @@ pdf_update_annot(fz_context *ctx, pdf_annot *annot)
if (!pdf_is_stream(ctx, n))
n = pdf_dict_get(ctx, n, as);
- pdf_drop_xobject(ctx, annot->ap);
+ pdf_drop_obj(ctx, annot->ap);
annot->ap = NULL;
if (pdf_is_stream(ctx, n))
{
- fz_try(ctx)
- {
- annot->ap = pdf_load_xobject(ctx, doc, n);
- annot->ap_iteration = annot->ap->iteration;
- }
- fz_catch(ctx)
- {
- fz_rethrow_if(ctx, FZ_ERROR_TRYLATER);
- fz_warn(ctx, "ignoring broken annotation");
- }
+ annot->ap = pdf_keep_obj(ctx, n);
}
+ annot->has_new_ap = 1;
}
}
diff --git a/source/pdf/pdf-form.c b/source/pdf/pdf-form.c
index bec1799a..f3d4e3c6 100644
--- a/source/pdf/pdf-form.c
+++ b/source/pdf/pdf-form.c
@@ -641,26 +641,9 @@ void pdf_update_page(fz_context *ctx, pdf_page *page)
{
pdf_annot *annot;
- /* Mark all dirty annots as clean */
- for (annot = page->annots; annot; annot = annot->next)
- pdf_clean_annot(ctx, annot);
-
- /* Flag all dirty annots */
for (annot = page->annots; annot; annot = annot->next)
{
- pdf_xobject *ap = pdf_keep_xobject(ctx, annot->ap);
- int ap_iteration = annot->ap_iteration;
-
- fz_try(ctx)
- {
- pdf_update_annot(ctx, annot);
- if ((ap != annot->ap || ap_iteration != annot->ap_iteration))
- pdf_dirty_annot(ctx, annot);
- }
- fz_always(ctx)
- pdf_drop_xobject(ctx, ap);
- fz_catch(ctx)
- fz_rethrow(ctx);
+ pdf_update_annot(ctx, annot);
}
}
diff --git a/source/pdf/pdf-interpret.c b/source/pdf/pdf-interpret.c
index 1c781b9e..c6833878 100644
--- a/source/pdf/pdf-interpret.c
+++ b/source/pdf/pdf-interpret.c
@@ -254,61 +254,46 @@ pdf_process_extgstate(fz_context *ctx, pdf_processor *proc, pdf_csi *csi, pdf_ob
{
if (pdf_is_dict(ctx, obj))
{
- pdf_xobject *xobj;
- pdf_obj *group, *s, *bc, *tr;
+ pdf_obj *xobj, *s, *bc, *tr;
float softmask_bc[FZ_MAX_COLORS];
fz_colorspace *colorspace;
int colorspace_n = 1;
int k, luminosity;
- fz_var(xobj);
+ xobj = pdf_dict_get(ctx, obj, PDF_NAME_G);
- group = pdf_dict_get(ctx, obj, PDF_NAME_G);
- xobj = pdf_load_xobject(ctx, csi->doc, group);
+ colorspace = pdf_xobject_colorspace(ctx, xobj);
+ if (colorspace)
+ colorspace_n = fz_colorspace_n(ctx, colorspace);
- fz_try(ctx)
- {
- colorspace = pdf_xobject_colorspace(ctx, xobj);
- if (colorspace)
- colorspace_n = fz_colorspace_n(ctx, colorspace);
+ /* Default background color is black. */
+ for (k = 0; k < colorspace_n; k++)
+ softmask_bc[k] = 0;
+ /* Which in CMYK means not all zeros! This should really be
+ * a test for subtractive color spaces, but this will have
+ * to do for now. */
+ if (fz_colorspace_is_cmyk(ctx, colorspace))
+ softmask_bc[3] = 1.0f;
+ fz_drop_colorspace(ctx, colorspace);
- /* Default background color is black. */
+ bc = pdf_dict_get(ctx, obj, PDF_NAME_BC);
+ if (pdf_is_array(ctx, bc))
+ {
for (k = 0; k < colorspace_n; k++)
- softmask_bc[k] = 0;
- /* Which in CMYK means not all zeros! This should really be
- * a test for subtractive color spaces, but this will have
- * to do for now. */
- if (fz_colorspace_is_cmyk(ctx, colorspace))
- softmask_bc[3] = 1.0f;
- fz_drop_colorspace(ctx, colorspace);
-
- bc = pdf_dict_get(ctx, obj, PDF_NAME_BC);
- if (pdf_is_array(ctx, bc))
- {
- for (k = 0; k < colorspace_n; k++)
- softmask_bc[k] = pdf_to_real(ctx, pdf_array_get(ctx, bc, k));
- }
+ softmask_bc[k] = pdf_to_real(ctx, pdf_array_get(ctx, bc, k));
+ }
- s = pdf_dict_get(ctx, obj, PDF_NAME_S);
- if (pdf_name_eq(ctx, s, PDF_NAME_Luminosity))
- luminosity = 1;
- else
- luminosity = 0;
+ s = pdf_dict_get(ctx, obj, PDF_NAME_S);
+ if (pdf_name_eq(ctx, s, PDF_NAME_Luminosity))
+ luminosity = 1;
+ else
+ luminosity = 0;
- tr = pdf_dict_get(ctx, obj, PDF_NAME_TR);
- if (tr && !pdf_name_eq(ctx, tr, PDF_NAME_Identity))
- fz_warn(ctx, "ignoring transfer function");
+ tr = pdf_dict_get(ctx, obj, PDF_NAME_TR);
+ if (tr && !pdf_name_eq(ctx, tr, PDF_NAME_Identity))
+ fz_warn(ctx, "ignoring transfer function");
- proc->op_gs_SMask(ctx, proc, xobj, csi->rdb, softmask_bc, luminosity);
- }
- fz_always(ctx)
- {
- pdf_drop_xobject(ctx, xobj);
- }
- fz_catch(ctx)
- {
- fz_rethrow(ctx);
- }
+ proc->op_gs_SMask(ctx, proc, xobj, csi->rdb, softmask_bc, luminosity);
}
else if (pdf_is_name(ctx, obj) && pdf_name_eq(ctx, obj, PDF_NAME_None))
{
@@ -344,16 +329,7 @@ pdf_process_Do(fz_context *ctx, pdf_processor *proc, pdf_csi *csi)
if (pdf_name_eq(ctx, subtype, PDF_NAME_Form))
{
if (proc->op_Do_form)
- {
- pdf_xobject *form = pdf_load_xobject(ctx, csi->doc, xobj);
-
- fz_try(ctx)
- proc->op_Do_form(ctx, proc, csi->name, form, csi->rdb);
- fz_always(ctx)
- pdf_drop_xobject(ctx, form);
- fz_catch(ctx)
- fz_rethrow(ctx);
- }
+ proc->op_Do_form(ctx, proc, csi->name, xobj, csi->rdb);
}
else if (pdf_name_eq(ctx, subtype, PDF_NAME_Image))
diff --git a/source/pdf/pdf-op-buffer.c b/source/pdf/pdf-op-buffer.c
index 95edea46..8774fd4f 100644
--- a/source/pdf/pdf-op-buffer.c
+++ b/source/pdf/pdf-op-buffer.c
@@ -727,7 +727,7 @@ pdf_out_Do_image(fz_context *ctx, pdf_processor *proc, const char *name, fz_imag
}
static void
-pdf_out_Do_form(fz_context *ctx, pdf_processor *proc, const char *name, pdf_xobject *xobj, pdf_obj *page_resources)
+pdf_out_Do_form(fz_context *ctx, pdf_processor *proc, const char *name, pdf_obj *xobj, pdf_obj *page_resources)
{
fz_output *out = ((pdf_output_processor*)proc)->out;
fz_write_printf(ctx, out, "/%s Do\n", name);
diff --git a/source/pdf/pdf-op-filter.c b/source/pdf/pdf-op-filter.c
index 237287fe..58fd129f 100644
--- a/source/pdf/pdf-op-filter.c
+++ b/source/pdf/pdf-op-filter.c
@@ -785,7 +785,7 @@ pdf_filter_gs_ca(fz_context *ctx, pdf_processor *proc, float alpha)
}
static void
-pdf_filter_gs_SMask(fz_context *ctx, pdf_processor *proc, pdf_xobject *smask, pdf_obj *page_resources, float *bc, int luminosity)
+pdf_filter_gs_SMask(fz_context *ctx, pdf_processor *proc, pdf_obj *smask, pdf_obj *page_resources, float *bc, int luminosity)
{
pdf_filter_processor *p = (pdf_filter_processor*)proc;
if (p->chain->op_gs_SMask)
@@ -1400,7 +1400,7 @@ pdf_filter_Do_image(fz_context *ctx, pdf_processor *proc, const char *name, fz_i
}
static void
-pdf_filter_Do_form(fz_context *ctx, pdf_processor *proc, const char *name, pdf_xobject *xobj, pdf_obj *page_resources)
+pdf_filter_Do_form(fz_context *ctx, pdf_processor *proc, const char *name, pdf_obj *xobj, pdf_obj *page_resources)
{
pdf_filter_processor *p = (pdf_filter_processor*)proc;
filter_flush(ctx, p, FLUSH_ALL);
diff --git a/source/pdf/pdf-op-run.c b/source/pdf/pdf-op-run.c
index f16d228b..305cd774 100644
--- a/source/pdf/pdf-op-run.c
+++ b/source/pdf/pdf-op-run.c
@@ -13,7 +13,7 @@
typedef struct pdf_material_s pdf_material;
typedef struct pdf_run_processor_s pdf_run_processor;
-static void pdf_run_xobject(fz_context *ctx, pdf_run_processor *proc, pdf_xobject *xobj, pdf_obj *page_resources, const fz_matrix *transform, int is_smask);
+static void pdf_run_xobject(fz_context *ctx, pdf_run_processor *proc, pdf_obj *xobj, pdf_obj *page_resources, const fz_matrix *transform, int is_smask);
enum
{
@@ -58,7 +58,7 @@ struct pdf_gstate_s
/* transparency */
int blendmode;
- pdf_xobject *softmask;
+ pdf_obj *softmask;
pdf_obj *softmask_resources;
fz_matrix softmask_ctm;
float softmask_bc[FZ_MAX_COLORS];
@@ -94,7 +94,7 @@ typedef struct softmask_save_s softmask_save;
struct softmask_save_s
{
- pdf_xobject *softmask;
+ pdf_obj *softmask;
pdf_obj *page_resources;
fz_matrix ctm;
};
@@ -103,7 +103,7 @@ static pdf_gstate *
begin_softmask(fz_context *ctx, pdf_run_processor *pr, softmask_save *save)
{
pdf_gstate *gstate = pr->gstate + pr->gtop;
- pdf_xobject *softmask = gstate->softmask;
+ pdf_obj *softmask = gstate->softmask;
fz_rect mask_bbox;
fz_matrix tos_save[2], save_ctm;
fz_matrix mask_matrix;
@@ -248,8 +248,8 @@ pdf_copy_pattern_gstate(fz_context *ctx, pdf_gstate *gs, const pdf_gstate *old)
pdf_drop_font(ctx, gs->text.font);
gs->text.font = pdf_keep_font(ctx, old->text.font);
- pdf_drop_xobject(ctx, gs->softmask);
- gs->softmask = pdf_keep_xobject(ctx, old->softmask);
+ pdf_drop_obj(ctx, gs->softmask);
+ gs->softmask = pdf_keep_obj(ctx, old->softmask);
fz_drop_stroke_state(ctx, gs->stroke_state);
gs->stroke_state = fz_keep_stroke_state(ctx, old->stroke_state);
@@ -277,7 +277,7 @@ pdf_keep_gstate(fz_context *ctx, pdf_gstate *gs)
if (gs->text.font)
pdf_keep_font(ctx, gs->text.font);
if (gs->softmask)
- pdf_keep_xobject(ctx, gs->softmask);
+ pdf_keep_obj(ctx, gs->softmask);
if (gs->softmask_resources)
pdf_keep_obj(ctx, gs->softmask_resources);
fz_keep_stroke_state(ctx, gs->stroke_state);
@@ -289,7 +289,7 @@ pdf_drop_gstate(fz_context *ctx, pdf_gstate *gs)
pdf_drop_material(ctx, &gs->stroke);
pdf_drop_material(ctx, &gs->fill);
pdf_drop_font(ctx, gs->text.font);
- pdf_drop_xobject(ctx, gs->softmask);
+ pdf_drop_obj(ctx, gs->softmask);
pdf_drop_obj(ctx, gs->softmask_resources);
fz_drop_stroke_state(ctx, gs->stroke_state);
}
@@ -385,7 +385,7 @@ pdf_show_pattern(fz_context *ctx, pdf_run_processor *pr, pdf_pattern *pat, pdf_g
/* don't apply soft masks to objects in the pattern as well */
if (gstate->softmask)
{
- pdf_drop_xobject(ctx, gstate->softmask);
+ pdf_drop_obj(ctx, gstate->softmask);
gstate->softmask = NULL;
}
@@ -1190,7 +1190,7 @@ pdf_set_pattern(fz_context *ctx, pdf_run_processor *pr, int what, pdf_pattern *p
}
static void
-pdf_run_xobject(fz_context *ctx, pdf_run_processor *proc, pdf_xobject *xobj, pdf_obj *page_resources, const fz_matrix *transform, int is_smask)
+pdf_run_xobject(fz_context *ctx, pdf_run_processor *proc, pdf_obj *xobj, pdf_obj *page_resources, const fz_matrix *transform, int is_smask)
{
pdf_run_processor *pr = (pdf_run_processor *)proc;
pdf_gstate *gstate = NULL;
@@ -1211,7 +1211,7 @@ pdf_run_xobject(fz_context *ctx, pdf_run_processor *proc, pdf_xobject *xobj, pdf
fz_default_colorspaces *saved_def_cs = NULL;
/* Avoid infinite recursion */
- if (xobj == NULL || pdf_mark_obj(ctx, xobj->obj))
+ if (xobj == NULL || pdf_mark_obj(ctx, xobj))
return;
fz_var(cleanup_state);
@@ -1300,12 +1300,12 @@ pdf_run_xobject(fz_context *ctx, pdf_run_processor *proc, pdf_xobject *xobj, pdf
if (pr->default_cs != saved_def_cs)
fz_set_default_colorspaces(ctx, pr->dev, pr->default_cs);
- doc = pdf_get_bound_document(ctx, xobj->obj);
+ doc = pdf_get_bound_document(ctx, xobj);
oldbot = pr->gbot;
pr->gbot = pr->gtop;
- pdf_process_contents(ctx, (pdf_processor*)pr, doc, resources, xobj->obj, NULL);
+ pdf_process_contents(ctx, (pdf_processor*)pr, doc, resources, xobj, NULL);
}
fz_always(ctx)
{
@@ -1378,7 +1378,7 @@ pdf_run_xobject(fz_context *ctx, pdf_run_processor *proc, pdf_xobject *xobj, pdf
while (oldtop < pr->gtop)
pdf_grestore(ctx, pr);
- pdf_unmark_obj(ctx, xobj->obj);
+ pdf_unmark_obj(ctx, xobj);
}
fz_catch(ctx)
{
@@ -1525,7 +1525,7 @@ static void pdf_run_gs_ca(fz_context *ctx, pdf_processor *proc, float alpha)
gstate->fill.alpha = fz_clamp(alpha, 0, 1);
}
-static void pdf_run_gs_SMask(fz_context *ctx, pdf_processor *proc, pdf_xobject *smask, pdf_obj *page_resources, float *bc, int luminosity)
+static void pdf_run_gs_SMask(fz_context *ctx, pdf_processor *proc, pdf_obj *smask, pdf_obj *page_resources, float *bc, int luminosity)
{
pdf_run_processor *pr = (pdf_run_processor *)proc;
pdf_gstate *gstate = pdf_flush_text(ctx, pr);
@@ -1533,7 +1533,7 @@ static void pdf_run_gs_SMask(fz_context *ctx, pdf_processor *proc, pdf_xobject *
if (gstate->softmask)
{
- pdf_drop_xobject(ctx, gstate->softmask);
+ pdf_drop_obj(ctx, gstate->softmask);
gstate->softmask = NULL;
pdf_drop_obj(ctx, gstate->softmask_resources);
gstate->softmask_resources = NULL;
@@ -1546,7 +1546,7 @@ static void pdf_run_gs_SMask(fz_context *ctx, pdf_processor *proc, pdf_xobject *
if (cs)
cs_n = fz_colorspace_n(ctx, cs);
gstate->softmask_ctm = gstate->ctm;
- gstate->softmask = pdf_keep_xobject(ctx, smask);
+ gstate->softmask = pdf_keep_obj(ctx, smask);
gstate->softmask_resources = pdf_keep_obj(ctx, page_resources);
for (i = 0; i < cs_n; ++i)
gstate->softmask_bc[i] = bc[i];
@@ -2000,7 +2000,7 @@ static void pdf_run_Do_image(fz_context *ctx, pdf_processor *proc, const char *n
pdf_show_image(ctx, pr, image);
}
-static void pdf_run_Do_form(fz_context *ctx, pdf_processor *proc, const char *name, pdf_xobject *xobj, pdf_obj *page_resources)
+static void pdf_run_Do_form(fz_context *ctx, pdf_processor *proc, const char *name, pdf_obj *xobj, pdf_obj *page_resources)
{
pdf_run_xobject(ctx, (pdf_run_processor*)proc, xobj, page_resources, &fz_identity, 0);
}
@@ -2074,7 +2074,7 @@ pdf_drop_run_processor(fz_context *ctx, pdf_processor *proc)
pdf_drop_material(ctx, &pr->gstate[0].fill);
pdf_drop_material(ctx, &pr->gstate[0].stroke);
pdf_drop_font(ctx, pr->gstate[0].text.font);
- pdf_drop_xobject(ctx, pr->gstate[0].softmask);
+ pdf_drop_obj(ctx, pr->gstate[0].softmask);
fz_drop_stroke_state(ctx, pr->gstate[0].stroke_state);
while (pr->gstate[0].clip_depth--)
diff --git a/source/pdf/pdf-xobject.c b/source/pdf/pdf-xobject.c
index bac856fd..975b3e76 100644
--- a/source/pdf/pdf-xobject.c
+++ b/source/pdf/pdf-xobject.c
@@ -1,71 +1,43 @@
#include "mupdf/fitz.h"
#include "mupdf/pdf.h"
-pdf_xobject *
-pdf_keep_xobject(fz_context *ctx, pdf_xobject *xobj)
-{
- return fz_keep_storable(ctx, &xobj->storable);
-}
-
-void
-pdf_drop_xobject(fz_context *ctx, pdf_xobject *xobj)
-{
- fz_drop_storable(ctx, &xobj->storable);
-}
-
-static void
-pdf_drop_xobject_imp(fz_context *ctx, fz_storable *xobj_)
-{
- pdf_xobject *xobj = (pdf_xobject *)xobj_;
- pdf_drop_obj(ctx, xobj->obj);
- fz_free(ctx, xobj);
-}
-
-static size_t
-pdf_xobject_size(pdf_xobject *xobj)
-{
- if (xobj == NULL)
- return 0;
- return sizeof(*xobj);
-}
-
pdf_obj *
-pdf_xobject_resources(fz_context *ctx, pdf_xobject *xobj)
+pdf_xobject_resources(fz_context *ctx, pdf_obj *xobj)
{
- return pdf_dict_get(ctx, xobj->obj, PDF_NAME_Resources);
+ return pdf_dict_get(ctx, xobj, PDF_NAME_Resources);
}
fz_rect *
-pdf_xobject_bbox(fz_context *ctx, pdf_xobject *xobj, fz_rect *bbox)
+pdf_xobject_bbox(fz_context *ctx, pdf_obj *xobj, fz_rect *bbox)
{
- return pdf_to_rect(ctx, pdf_dict_get(ctx, xobj->obj, PDF_NAME_BBox), bbox);
+ return pdf_to_rect(ctx, pdf_dict_get(ctx, xobj, PDF_NAME_BBox), bbox);
}
fz_matrix *
-pdf_xobject_matrix(fz_context *ctx, pdf_xobject *xobj, fz_matrix *matrix)
+pdf_xobject_matrix(fz_context *ctx, pdf_obj *xobj, fz_matrix *matrix)
{
- return pdf_to_matrix(ctx, pdf_dict_get(ctx, xobj->obj, PDF_NAME_Matrix), matrix);
+ return pdf_to_matrix(ctx, pdf_dict_get(ctx, xobj, PDF_NAME_Matrix), matrix);
}
-int pdf_xobject_isolated(fz_context *ctx, pdf_xobject *xobj)
+int pdf_xobject_isolated(fz_context *ctx, pdf_obj *xobj)
{
- pdf_obj *group = pdf_dict_get(ctx, xobj->obj, PDF_NAME_Group);
+ pdf_obj *group = pdf_dict_get(ctx, xobj, PDF_NAME_Group);
if (group)
return pdf_to_bool(ctx, pdf_dict_get(ctx, group, PDF_NAME_I));
return 0;
}
-int pdf_xobject_knockout(fz_context *ctx, pdf_xobject *xobj)
+int pdf_xobject_knockout(fz_context *ctx, pdf_obj *xobj)
{
- pdf_obj *group = pdf_dict_get(ctx, xobj->obj, PDF_NAME_Group);
+ pdf_obj *group = pdf_dict_get(ctx, xobj, PDF_NAME_Group);
if (group)
return pdf_to_bool(ctx, pdf_dict_get(ctx, group, PDF_NAME_K));
return 0;
}
-int pdf_xobject_transparency(fz_context *ctx, pdf_xobject *xobj)
+int pdf_xobject_transparency(fz_context *ctx, pdf_obj *xobj)
{
- pdf_obj *group = pdf_dict_get(ctx, xobj->obj, PDF_NAME_Group);
+ pdf_obj *group = pdf_dict_get(ctx, xobj, PDF_NAME_Group);
if (group)
if (pdf_name_eq(ctx, pdf_dict_get(ctx, group, PDF_NAME_S), PDF_NAME_Transparency))
return 1;
@@ -73,9 +45,9 @@ int pdf_xobject_transparency(fz_context *ctx, pdf_xobject *xobj)
}
fz_colorspace *
-pdf_xobject_colorspace(fz_context *ctx, pdf_xobject *xobj)
+pdf_xobject_colorspace(fz_context *ctx, pdf_obj *xobj)
{
- pdf_obj *group = pdf_dict_get(ctx, xobj->obj, PDF_NAME_Group);
+ pdf_obj *group = pdf_dict_get(ctx, xobj, PDF_NAME_Group);
if (group)
{
pdf_obj *cs = pdf_dict_get(ctx, group, PDF_NAME_CS);
@@ -92,43 +64,15 @@ pdf_xobject_colorspace(fz_context *ctx, pdf_xobject *xobj)
return NULL;
}
-pdf_xobject *
-pdf_load_xobject(fz_context *ctx, pdf_document *doc, pdf_obj *dict)
-{
- pdf_xobject *form;
-
- if (!pdf_is_stream(ctx, dict))
- fz_throw(ctx, FZ_ERROR_SYNTAX, "XObject must be a stream");
-
- 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->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));
-
- form->obj = pdf_keep_obj(ctx, dict);
-
- return form;
-}
-
pdf_obj *
pdf_new_xobject(fz_context *ctx, pdf_document *doc, const fz_rect *bbox, const fz_matrix *mat)
{
- int idict_num;
- pdf_obj *idict = NULL;
+ pdf_obj *form = NULL;
pdf_obj *dict = NULL;
- pdf_xobject *form = NULL;
pdf_obj *res = NULL;
pdf_obj *procset;
- fz_var(idict);
fz_var(dict);
- fz_var(form);
fz_var(res);
fz_try(ctx)
@@ -150,36 +94,22 @@ pdf_new_xobject(fz_context *ctx, pdf_document *doc, const fz_rect *bbox, const f
pdf_dict_put(ctx, dict, PDF_NAME_Subtype, PDF_NAME_Form);
pdf_dict_put(ctx, dict, PDF_NAME_Type, PDF_NAME_XObject);
- form = fz_malloc_struct(ctx, pdf_xobject);
- FZ_INIT_STORABLE(form, 1, pdf_drop_xobject_imp);
- form->obj = NULL;
- form->iteration = 0;
-
- idict_num = pdf_create_object(ctx, doc);
- pdf_update_object(ctx, doc, idict_num, dict);
- idict = pdf_new_indirect(ctx, doc, idict_num, 0);
-
- pdf_store_item(ctx, idict, form, pdf_xobject_size(form));
-
- form->obj = pdf_keep_obj(ctx, idict);
+ form = pdf_add_object(ctx, doc, dict);
}
fz_always(ctx)
{
pdf_drop_obj(ctx, dict);
pdf_drop_obj(ctx, res);
- pdf_drop_xobject(ctx, form);
}
fz_catch(ctx)
{
- pdf_drop_obj(ctx, idict);
fz_rethrow(ctx);
}
- return idict;
+ return form;
}
-void pdf_update_xobject_contents(fz_context *ctx, pdf_document *doc, pdf_xobject *form, fz_buffer *buffer)
+void pdf_update_xobject_contents(fz_context *ctx, pdf_document *doc, pdf_obj *form, fz_buffer *buffer)
{
- pdf_update_stream(ctx, doc, form->obj, buffer, 0);
- form->iteration ++;
+ pdf_update_stream(ctx, doc, form, buffer, 0);
}