summaryrefslogtreecommitdiff
path: root/source/pdf
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2016-06-30 15:21:56 +0200
committerTor Andersson <tor.andersson@artifex.com>2016-07-06 13:34:37 +0200
commit255776a778b519183d6935ff0cb4b766644fa830 (patch)
tree16c2d411870b31cc25a2941d90ca862c10083667 /source/pdf
parentb644ed1360d0e47c03a637bbc568000d57d0cdbf (diff)
downloadmupdf-255776a778b519183d6935ff0cb4b766644fa830.tar.xz
pdf: Drop generation number from public interfaces.
The generation number is only needed for decryption, and is assumed to be zero or irrelevant for all other uses. Store the original object number and generation in the xref slot, so that we can decrypt them even when the objects have been renumbered, without needing to pass the original object number around through the stream loading APIs.
Diffstat (limited to 'source/pdf')
-rw-r--r--source/pdf/pdf-annot-edit.c4
-rw-r--r--source/pdf/pdf-annot.c4
-rw-r--r--source/pdf/pdf-appearance.c4
-rw-r--r--source/pdf/pdf-cmap-load.c2
-rw-r--r--source/pdf/pdf-colorspace.c6
-rw-r--r--source/pdf/pdf-crypt.c4
-rw-r--r--source/pdf/pdf-field.c2
-rw-r--r--source/pdf/pdf-font.c9
-rw-r--r--source/pdf/pdf-form.c2
-rw-r--r--source/pdf/pdf-function.c14
-rw-r--r--source/pdf/pdf-graft.c2
-rw-r--r--source/pdf/pdf-image.c9
-rw-r--r--source/pdf/pdf-interpret.c5
-rw-r--r--source/pdf/pdf-parse.c2
-rw-r--r--source/pdf/pdf-repair.c22
-rw-r--r--source/pdf/pdf-resources.c2
-rw-r--r--source/pdf/pdf-shade.c14
-rw-r--r--source/pdf/pdf-store.c7
-rw-r--r--source/pdf/pdf-stream.c111
-rw-r--r--source/pdf/pdf-type3.c2
-rw-r--r--source/pdf/pdf-write.c41
-rw-r--r--source/pdf/pdf-xref.c82
22 files changed, 164 insertions, 186 deletions
diff --git a/source/pdf/pdf-annot-edit.c b/source/pdf/pdf-annot-edit.c
index 7cd344a4..e09a6129 100644
--- a/source/pdf/pdf-annot-edit.c
+++ b/source/pdf/pdf-annot-edit.c
@@ -54,9 +54,7 @@ pdf_update_annot(fz_context *ctx, pdf_document *doc, pdf_annot *annot)
n = NULL;
- if (hp->num == pdf_to_num(ctx, obj)
- && hp->gen == pdf_to_gen(ctx, obj)
- && (hp->state & HOTSPOT_POINTER_DOWN))
+ if (hp->num == pdf_to_num(ctx, obj) && (hp->state & HOTSPOT_POINTER_DOWN))
{
n = pdf_dict_get(ctx, ap, PDF_NAME_D); /* down state */
}
diff --git a/source/pdf/pdf-annot.c b/source/pdf/pdf-annot.c
index efae4cd3..a81108dc 100644
--- a/source/pdf/pdf-annot.c
+++ b/source/pdf/pdf-annot.c
@@ -564,9 +564,7 @@ pdf_load_annots(fz_context *ctx, pdf_document *doc, pdf_page *page, pdf_obj *ann
if (!keep_annot)
break;
- if (hp->num == pdf_to_num(ctx, obj)
- && hp->gen == pdf_to_gen(ctx, obj)
- && (hp->state & HOTSPOT_POINTER_DOWN))
+ if (hp->num == pdf_to_num(ctx, obj) && (hp->state & HOTSPOT_POINTER_DOWN))
{
n = pdf_dict_get(ctx, ap, PDF_NAME_D); /* down state */
}
diff --git a/source/pdf/pdf-appearance.c b/source/pdf/pdf-appearance.c
index 8773ac05..029b131d 100644
--- a/source/pdf/pdf-appearance.c
+++ b/source/pdf/pdf-appearance.c
@@ -778,7 +778,7 @@ static int get_matrix(fz_context *ctx, pdf_document *doc, pdf_xobject *form, int
pdf_lexbuf lbuf;
fz_stream *str;
- str = pdf_open_stream(ctx, doc, pdf_to_num(ctx, form->contents), pdf_to_gen(ctx, form->contents));
+ str = pdf_open_stream(ctx, doc, pdf_to_num(ctx, form->contents));
pdf_lexbuf_init(ctx, &lbuf, PDF_LEXBUF_SMALL);
@@ -1041,7 +1041,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, doc, pdf_to_num(ctx, form->contents), pdf_to_gen(ctx, form->contents));
+ str_outer = pdf_open_stream(ctx, doc, pdf_to_num(ctx, form->contents));
len = fz_buffer_storage(ctx, fzbuf, &buf);
str_inner = fz_open_memory(ctx, buf, len);
diff --git a/source/pdf/pdf-cmap-load.c b/source/pdf/pdf-cmap-load.c
index 06359242..58b3dae6 100644
--- a/source/pdf/pdf-cmap-load.c
+++ b/source/pdf/pdf-cmap-load.c
@@ -37,7 +37,7 @@ pdf_load_embedded_cmap(fz_context *ctx, pdf_document *doc, pdf_obj *stmobj)
fz_try(ctx)
{
- file = pdf_open_stream(ctx, doc, pdf_to_num(ctx, stmobj), pdf_to_gen(ctx, stmobj));
+ file = pdf_open_stream(ctx, doc, pdf_to_num(ctx, stmobj));
cmap = pdf_load_cmap(ctx, file);
obj = pdf_dict_get(ctx, stmobj, PDF_NAME_WMode);
diff --git a/source/pdf/pdf-colorspace.c b/source/pdf/pdf-colorspace.c
index 8bec2707..081ceaaf 100644
--- a/source/pdf/pdf-colorspace.c
+++ b/source/pdf/pdf-colorspace.c
@@ -100,7 +100,7 @@ load_separation(fz_context *ctx, pdf_document *doc, pdf_obj *array)
{
tint = pdf_load_function(ctx, doc, tintobj, n, base->n);
/* RJW: fz_drop_colorspace(ctx, base);
- * "cannot load tint function (%d %d R)", pdf_to_num(ctx, tintobj), pdf_to_gen(ctx, tintobj) */
+ * "cannot load tint function (%d 0 R)", pdf_to_num(ctx, tintobj) */
sep = fz_malloc_struct(ctx, struct separation);
sep->base = base;
@@ -168,7 +168,7 @@ load_indexed(fz_context *ctx, pdf_document *doc, pdf_obj *array)
fz_try(ctx)
{
- file = pdf_open_stream(ctx, doc, pdf_to_num(ctx, lookupobj), pdf_to_gen(ctx, lookupobj));
+ file = pdf_open_stream(ctx, doc, pdf_to_num(ctx, lookupobj));
i = (int)fz_read(ctx, file, lookup, n);
if (i < n)
memset(lookup+i, 0, n-i);
@@ -303,7 +303,7 @@ pdf_load_colorspace_imp(fz_context *ctx, pdf_document *doc, pdf_obj *obj)
}
}
- fz_throw(ctx, FZ_ERROR_GENERIC, "syntaxerror: could not parse color space (%d %d R)", pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj));
+ fz_throw(ctx, FZ_ERROR_GENERIC, "syntaxerror: could not parse color space (%d 0 R)", pdf_to_num(ctx, obj));
}
fz_colorspace *
diff --git a/source/pdf/pdf-crypt.c b/source/pdf/pdf-crypt.c
index d9c34d7f..b17c2a71 100644
--- a/source/pdf/pdf-crypt.c
+++ b/source/pdf/pdf-crypt.c
@@ -290,7 +290,7 @@ pdf_parse_crypt_filter(fz_context *ctx, pdf_crypt_filter *cf, pdf_crypt *crypt,
int is_stdcf = (!is_identity && pdf_name_eq(ctx, name, PDF_NAME_StdCF));
if (!is_identity && !is_stdcf)
- fz_throw(ctx, FZ_ERROR_GENERIC, "Crypt Filter not Identity or StdCF (%d %d R)", pdf_to_num(ctx, crypt->cf), pdf_to_gen(ctx, crypt->cf));
+ fz_throw(ctx, FZ_ERROR_GENERIC, "Crypt Filter not Identity or StdCF (%d 0 R)", pdf_to_num(ctx, crypt->cf));
cf->method = PDF_CRYPT_NONE;
cf->length = crypt->length;
@@ -324,7 +324,7 @@ pdf_parse_crypt_filter(fz_context *ctx, pdf_crypt_filter *cf, pdf_crypt *crypt,
cf->length = pdf_to_int(ctx, obj);
}
else if (!is_identity)
- fz_throw(ctx, FZ_ERROR_GENERIC, "cannot parse crypt filter (%d %d R)", pdf_to_num(ctx, crypt->cf), pdf_to_gen(ctx, crypt->cf));
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot parse crypt filter (%d 0 R)", pdf_to_num(ctx, crypt->cf));
/* the length for crypt filters is supposed to be in bytes not bits */
if (cf->length < 40)
diff --git a/source/pdf/pdf-field.c b/source/pdf/pdf-field.c
index 046e3428..53853ced 100644
--- a/source/pdf/pdf-field.c
+++ b/source/pdf/pdf-field.c
@@ -33,7 +33,7 @@ char *pdf_get_string_or_stream(fz_context *ctx, pdf_document *doc, pdf_obj *obj)
}
else if (pdf_is_stream(ctx, obj))
{
- stmbuf = pdf_load_stream(ctx, doc, pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj));
+ stmbuf = pdf_load_stream(ctx, doc, pdf_to_num(ctx, obj));
len = fz_buffer_storage(ctx, stmbuf, (unsigned char **)&buf);
}
diff --git a/source/pdf/pdf-font.c b/source/pdf/pdf-font.c
index 7e15a287..cc6c68ed 100644
--- a/source/pdf/pdf-font.c
+++ b/source/pdf/pdf-font.c
@@ -411,7 +411,7 @@ pdf_load_embedded_font(fz_context *ctx, pdf_document *doc, pdf_font_desc *fontde
{
fz_buffer *buf;
- buf = pdf_load_stream(ctx, doc, pdf_to_num(ctx, stmref), pdf_to_gen(ctx, stmref));
+ buf = pdf_load_stream(ctx, doc, pdf_to_num(ctx, stmref));
fz_try(ctx)
fontdesc->font = fz_new_font_from_buffer(ctx, fontname, buf, 0, 1);
fz_always(ctx)
@@ -867,9 +867,8 @@ pdf_load_simple_font(fz_context *ctx, pdf_document *doc, pdf_obj *dict)
static int
hail_mary_make_hash_key(fz_context *ctx, fz_store_hash *hash, void *key_)
{
- hash->u.i.i0 = 0;
- hash->u.i.i1 = 0;
- hash->u.i.ptr = NULL;
+ hash->u.pi.i = 0;
+ hash->u.pi.ptr = NULL;
return 1;
}
@@ -1021,7 +1020,7 @@ load_cid_font(fz_context *ctx, pdf_document *doc, pdf_obj *dict, pdf_obj *encodi
fz_buffer *buf;
size_t z;
- buf = pdf_load_stream(ctx, doc, pdf_to_num(ctx, cidtogidmap), pdf_to_gen(ctx, cidtogidmap));
+ buf = pdf_load_stream(ctx, doc, pdf_to_num(ctx, cidtogidmap));
fontdesc->cid_to_gid_len = (buf->len) / 2;
fontdesc->cid_to_gid = fz_malloc_array(ctx, fontdesc->cid_to_gid_len, sizeof(unsigned short));
diff --git a/source/pdf/pdf-form.c b/source/pdf/pdf-form.c
index 09b51d24..6889e07f 100644
--- a/source/pdf/pdf-form.c
+++ b/source/pdf/pdf-form.c
@@ -624,7 +624,6 @@ int pdf_pass_event(fz_context *ctx, pdf_document *doc, pdf_page *page, pdf_ui_ev
doc->focus_obj = pdf_keep_obj(ctx, annot->obj);
hp->num = pdf_to_num(ctx, annot->obj);
- hp->gen = pdf_to_gen(ctx, annot->obj);
hp->state = HOTSPOT_POINTER_DOWN;
changed = 1;
/* Execute the down and focus actions */
@@ -638,7 +637,6 @@ int pdf_pass_event(fz_context *ctx, pdf_document *doc, pdf_page *page, pdf_ui_ev
changed = 1;
hp->num = 0;
- hp->gen = 0;
hp->state = 0;
if (annot)
diff --git a/source/pdf/pdf-function.c b/source/pdf/pdf-function.c
index 979e9ec9..6de7bfc0 100644
--- a/source/pdf/pdf-function.c
+++ b/source/pdf/pdf-function.c
@@ -833,7 +833,7 @@ parse_code(fz_context *ctx, pdf_function *func, fz_stream *stream, int *codeptr,
}
static void
-load_postscript_func(fz_context *ctx, pdf_document *doc, pdf_function *func, pdf_obj *dict, int num, int gen)
+load_postscript_func(fz_context *ctx, pdf_document *doc, pdf_function *func, pdf_obj *dict, int num)
{
fz_stream *stream = NULL;
int codeptr;
@@ -848,7 +848,7 @@ load_postscript_func(fz_context *ctx, pdf_document *doc, pdf_function *func, pdf
fz_try(ctx)
{
- stream = pdf_open_stream(ctx, doc, num, gen);
+ stream = pdf_open_stream(ctx, doc, num);
tok = pdf_lex(ctx, stream, &buf);
if (tok != PDF_TOK_OPEN_BRACE)
@@ -906,7 +906,7 @@ eval_postscript_func(fz_context *ctx, pdf_function *func, const float *in, float
#define MAX_SAMPLE_FUNCTION_SIZE (100 << 20)
static void
-load_sample_func(fz_context *ctx, pdf_document *doc, pdf_function *func, pdf_obj *dict, int num, int gen)
+load_sample_func(fz_context *ctx, pdf_document *doc, pdf_function *func, pdf_obj *dict, int num)
{
fz_stream *stream;
pdf_obj *obj;
@@ -984,7 +984,7 @@ load_sample_func(fz_context *ctx, pdf_document *doc, pdf_function *func, pdf_obj
func->u.sa.samples = fz_malloc_array(ctx, samplecount, sizeof(float));
func->base.size += samplecount * sizeof(float);
- stream = pdf_open_stream(ctx, doc, num, gen);
+ stream = pdf_open_stream(ctx, doc, num);
fz_try(ctx)
{
@@ -1661,7 +1661,7 @@ pdf_load_function(fz_context *ctx, pdf_document *doc, pdf_obj *dict, int in, int
switch (func->type)
{
case SAMPLE:
- load_sample_func(ctx, doc, func, dict, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
+ load_sample_func(ctx, doc, func, dict, pdf_to_num(ctx, dict));
break;
case EXPONENTIAL:
@@ -1673,11 +1673,11 @@ pdf_load_function(fz_context *ctx, pdf_document *doc, pdf_obj *dict, int in, int
break;
case POSTSCRIPT:
- load_postscript_func(ctx, doc, func, dict, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
+ load_postscript_func(ctx, doc, func, dict, pdf_to_num(ctx, dict));
break;
default:
- fz_throw(ctx, FZ_ERROR_GENERIC, "unknown function type (%d %d R)", pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
+ fz_throw(ctx, FZ_ERROR_GENERIC, "unknown function type (%d 0 R)", pdf_to_num(ctx, dict));
}
pdf_store_item(ctx, dict, func, func->base.size);
diff --git a/source/pdf/pdf-graft.c b/source/pdf/pdf-graft.c
index 758addde..d7cb8b42 100644
--- a/source/pdf/pdf-graft.c
+++ b/source/pdf/pdf-graft.c
@@ -112,7 +112,7 @@ pdf_graft_object(fz_context *ctx, pdf_document *dst, pdf_document *src, pdf_obj
ref = pdf_new_indirect(ctx, dst, new_num, 0);
if (pdf_is_stream(ctx, obj_ref))
{
- buffer = pdf_load_raw_stream(ctx, src, src_num, 0);
+ buffer = pdf_load_raw_stream(ctx, src, src_num);
pdf_update_stream(ctx, dst, ref, buffer, 1);
}
}
diff --git a/source/pdf/pdf-image.c b/source/pdf/pdf-image.c
index 3bba27ad..50d29e93 100644
--- a/source/pdf/pdf-image.c
+++ b/source/pdf/pdf-image.c
@@ -156,11 +156,8 @@ pdf_load_image_imp(fz_context *ctx, pdf_document *doc, pdf_obj *rdb, pdf_obj *di
/* Do we load from a ref, or do we load an inline stream? */
if (cstm == NULL)
{
- /* Just load the compressed image data now and we can
- * decode it on demand. */
- int num = pdf_to_num(ctx, dict);
- int gen = pdf_to_gen(ctx, dict);
- buffer = pdf_load_compressed_stream(ctx, doc, num, gen);
+ /* Just load the compressed image data now and we can decode it on demand. */
+ buffer = pdf_load_compressed_stream(ctx, doc, pdf_to_num(ctx, dict));
image = fz_new_image_from_compressed_buffer(ctx, w, h, bpc, colorspace, 96, 96, interpolate, imagemask, decode, use_colorkey ? colorkey : NULL, buffer, mask);
image->invert_cmyk_jpeg = 0;
}
@@ -224,7 +221,7 @@ pdf_load_jpx(fz_context *ctx, pdf_document *doc, pdf_obj *dict, int forcemask)
fz_var(colorspace);
fz_var(mask);
- buf = pdf_load_stream(ctx, doc, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
+ buf = pdf_load_stream(ctx, doc, pdf_to_num(ctx, dict));
/* FIXME: We can't handle decode arrays for indexed images currently */
fz_try(ctx)
diff --git a/source/pdf/pdf-interpret.c b/source/pdf/pdf-interpret.c
index 6ad384f3..af5a0ed5 100644
--- a/source/pdf/pdf-interpret.c
+++ b/source/pdf/pdf-interpret.c
@@ -137,7 +137,6 @@ pdf_is_hidden_ocg(fz_context *ctx, pdf_ocg_descriptor *desc, pdf_obj *rdb, const
/* An Optional Content Group */
int default_value = 0;
int num = pdf_to_num(ctx, ocg);
- int gen = pdf_to_gen(ctx, ocg);
int len = desc->len;
int i;
pdf_obj *es;
@@ -145,7 +144,7 @@ pdf_is_hidden_ocg(fz_context *ctx, pdf_ocg_descriptor *desc, pdf_obj *rdb, const
/* by default an OCG is visible, unless it's explicitly hidden */
for (i = 0; i < len; i++)
{
- if (desc->ocgs[i].num == num && desc->ocgs[i].gen == gen)
+ if (desc->ocgs[i].num == num)
{
default_value = desc->ocgs[i].state == 0;
break;
@@ -438,7 +437,7 @@ pdf_process_extgstate(fz_context *ctx, pdf_processor *proc, pdf_csi *csi, pdf_ob
group = pdf_dict_get(ctx, obj, PDF_NAME_G);
if (!group)
- fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load softmask xobject (%d %d R)", pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj));
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load softmask xobject (%d 0 R)", pdf_to_num(ctx, obj));
xobj = pdf_load_xobject(ctx, csi->doc, group);
fz_try(ctx)
diff --git a/source/pdf/pdf-parse.c b/source/pdf/pdf-parse.c
index cfedd67b..db1c4293 100644
--- a/source/pdf/pdf-parse.c
+++ b/source/pdf/pdf-parse.c
@@ -67,7 +67,7 @@ pdf_to_utf8(fz_context *ctx, pdf_document *doc, pdf_obj *src)
}
else if (pdf_is_stream(ctx, src))
{
- stmbuf = pdf_load_stream(ctx, doc, pdf_to_num(ctx, src), pdf_to_gen(ctx, src));
+ stmbuf = pdf_load_stream(ctx, doc, pdf_to_num(ctx, src));
srclen = fz_buffer_storage(ctx, stmbuf, (unsigned char **)&srcptr);
}
else
diff --git a/source/pdf/pdf-repair.c b/source/pdf/pdf-repair.c
index b0c56be0..fdb48fe9 100644
--- a/source/pdf/pdf-repair.c
+++ b/source/pdf/pdf-repair.c
@@ -193,7 +193,7 @@ atobjend:
}
static void
-pdf_repair_obj_stm(fz_context *ctx, pdf_document *doc, int num, int gen)
+pdf_repair_obj_stm(fz_context *ctx, pdf_document *doc, int stm_num)
{
pdf_obj *obj;
fz_stream *stm = NULL;
@@ -207,13 +207,13 @@ pdf_repair_obj_stm(fz_context *ctx, pdf_document *doc, int num, int gen)
fz_try(ctx)
{
- obj = pdf_load_object(ctx, doc, num, gen);
+ obj = pdf_load_object(ctx, doc, stm_num);
count = pdf_to_int(ctx, pdf_dict_get(ctx, obj, PDF_NAME_N));
pdf_drop_obj(ctx, obj);
- stm = pdf_open_stream(ctx, doc, num, gen);
+ stm = pdf_open_stream(ctx, doc, stm_num);
for (i = 0; i < count; i++)
{
@@ -221,7 +221,7 @@ pdf_repair_obj_stm(fz_context *ctx, pdf_document *doc, int num, int gen)
tok = pdf_lex(ctx, stm, &buf);
if (tok != PDF_TOK_INT)
- fz_throw(ctx, FZ_ERROR_GENERIC, "corrupt object stream (%d %d R)", num, gen);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "corrupt object stream (%d 0 R)", stm_num);
n = buf.i;
if (n < 0)
@@ -236,8 +236,9 @@ pdf_repair_obj_stm(fz_context *ctx, pdf_document *doc, int num, int gen)
}
entry = pdf_get_populating_xref_entry(ctx, doc, n);
- entry->ofs = num;
+ entry->ofs = stm_num;
entry->gen = i;
+ entry->num = n;
entry->stm_ofs = 0;
pdf_drop_obj(ctx, entry->obj);
entry->obj = NULL;
@@ -245,7 +246,7 @@ pdf_repair_obj_stm(fz_context *ctx, pdf_document *doc, int num, int gen)
tok = pdf_lex(ctx, stm, &buf);
if (tok != PDF_TOK_INT)
- fz_throw(ctx, FZ_ERROR_GENERIC, "corrupt object stream (%d %d R)", num, gen);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "corrupt object stream (%d 0 R)", stm_num);
}
}
fz_always(ctx)
@@ -509,6 +510,7 @@ pdf_repair_xref(fz_context *ctx, pdf_document *doc)
entry->type = 'f';
entry->ofs = 0;
entry->gen = 0;
+ entry->num = 0;
entry->stm_ofs = 0;
}
@@ -519,13 +521,14 @@ pdf_repair_xref(fz_context *ctx, pdf_document *doc)
entry->type = 'n';
entry->ofs = list[i].ofs;
entry->gen = list[i].gen;
+ entry->num = list[i].num;
entry->stm_ofs = list[i].stm_ofs;
/* correct stream length for unencrypted documents */
if (!encrypt && list[i].stm_len >= 0)
{
- dict = pdf_load_object(ctx, doc, list[i].num, list[i].gen);
+ dict = pdf_load_object(ctx, doc, list[i].num);
length = pdf_new_int(ctx, doc, list[i].stm_len);
pdf_dict_put(ctx, dict, PDF_NAME_Length, length);
@@ -539,6 +542,7 @@ pdf_repair_xref(fz_context *ctx, pdf_document *doc)
entry->type = 'f';
entry->ofs = 0;
entry->gen = 65535;
+ entry->num = 0;
entry->stm_ofs = 0;
next = 0;
@@ -651,11 +655,11 @@ pdf_repair_obj_stms(fz_context *ctx, pdf_document *doc)
if (entry->stm_ofs)
{
- dict = pdf_load_object(ctx, doc, i, 0);
+ dict = pdf_load_object(ctx, doc, i);
fz_try(ctx)
{
if (pdf_name_eq(ctx, pdf_dict_get(ctx, dict, PDF_NAME_Type), PDF_NAME_ObjStm))
- pdf_repair_obj_stm(ctx, doc, i, 0);
+ pdf_repair_obj_stm(ctx, doc, i);
}
fz_catch(ctx)
{
diff --git a/source/pdf/pdf-resources.c b/source/pdf/pdf-resources.c
index b66c0a23..07fc873f 100644
--- a/source/pdf/pdf-resources.c
+++ b/source/pdf/pdf-resources.c
@@ -64,7 +64,7 @@ res_image_init(fz_context *ctx, pdf_document *doc, pdf_res_table *table)
len = pdf_count_objects(ctx, doc);
for (k = 1; k < len; k++)
{
- obj = pdf_load_object(ctx, doc, k, 0);
+ obj = pdf_load_object(ctx, doc, k);
type = pdf_dict_get(ctx, obj, PDF_NAME_Subtype);
if (pdf_name_eq(ctx, type, PDF_NAME_Image))
{
diff --git a/source/pdf/pdf-shade.c b/source/pdf/pdf-shade.c
index b8e138c0..7815b3ce 100644
--- a/source/pdf/pdf-shade.c
+++ b/source/pdf/pdf-shade.c
@@ -256,7 +256,7 @@ pdf_load_type4_shade(fz_context *ctx, pdf_document *doc, fz_shade *shade, pdf_ob
if (funcs > 0)
pdf_sample_shade_function(ctx, shade, funcs, func, shade->u.m.c0[0], shade->u.m.c1[0]);
- shade->buffer = pdf_load_compressed_stream(ctx, doc, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
+ shade->buffer = pdf_load_compressed_stream(ctx, doc, pdf_to_num(ctx, dict));
}
static void
@@ -268,7 +268,7 @@ pdf_load_type5_shade(fz_context *ctx, pdf_document *doc, fz_shade *shade, pdf_ob
if (funcs > 0)
pdf_sample_shade_function(ctx, shade, funcs, func, shade->u.m.c0[0], shade->u.m.c1[0]);
- shade->buffer = pdf_load_compressed_stream(ctx, doc, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
+ shade->buffer = pdf_load_compressed_stream(ctx, doc, pdf_to_num(ctx, dict));
}
/* Type 6 & 7 -- Patch mesh shadings */
@@ -282,7 +282,7 @@ pdf_load_type6_shade(fz_context *ctx, pdf_document *doc, fz_shade *shade, pdf_ob
if (funcs > 0)
pdf_sample_shade_function(ctx, shade, funcs, func, shade->u.m.c0[0], shade->u.m.c1[0]);
- shade->buffer = pdf_load_compressed_stream(ctx, doc, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
+ shade->buffer = pdf_load_compressed_stream(ctx, doc, pdf_to_num(ctx, dict));
}
static void
@@ -294,7 +294,7 @@ pdf_load_type7_shade(fz_context *ctx, pdf_document *doc, fz_shade *shade, pdf_ob
if (funcs > 0)
pdf_sample_shade_function(ctx, shade, funcs, func, shade->u.m.c0[0], shade->u.m.c1[0]);
- shade->buffer = pdf_load_compressed_stream(ctx, doc, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
+ shade->buffer = pdf_load_compressed_stream(ctx, doc, pdf_to_num(ctx, dict));
}
/* Load all of the shading dictionary parameters, then switch on the shading type. */
@@ -361,7 +361,7 @@ pdf_load_shading_dict(fz_context *ctx, pdf_document *doc, pdf_obj *dict, const f
func[0] = pdf_load_function(ctx, doc, obj, in, out);
if (!func[0])
- fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load shading function (%d %d R)", pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj));
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load shading function (%d 0 R)", pdf_to_num(ctx, obj));
}
else if (pdf_is_array(ctx, obj))
{
@@ -387,13 +387,13 @@ pdf_load_shading_dict(fz_context *ctx, pdf_document *doc, pdf_obj *dict, const f
{
func[i] = pdf_load_function(ctx, doc, pdf_array_get(ctx, obj, i), in, out);
if (!func[i])
- fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load shading function (%d %d R)", pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj));
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load shading function (%d 0 R)", pdf_to_num(ctx, obj));
}
}
else if (type < 4)
{
/* Functions are compulsory for types 1,2,3 */
- fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load shading function (%d %d R)", pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj));
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load shading function (%d 0 R)", pdf_to_num(ctx, obj));
}
shade->type = type;
diff --git a/source/pdf/pdf-store.c b/source/pdf/pdf-store.c
index 7be7eafe..fa5cf76e 100644
--- a/source/pdf/pdf-store.c
+++ b/source/pdf/pdf-store.c
@@ -7,9 +7,8 @@ pdf_make_hash_key(fz_context *ctx, fz_store_hash *hash, void *key_)
if (!pdf_is_indirect(ctx, key))
return 0;
- hash->u.i.i0 = pdf_to_num(ctx, key);
- hash->u.i.i1 = pdf_to_gen(ctx, key);
- hash->u.i.ptr = pdf_get_indirect_document(ctx, key);
+ hash->u.pi.i = pdf_to_num(ctx, key);
+ hash->u.pi.ptr = pdf_get_indirect_document(ctx, key);
return 1;
}
@@ -37,7 +36,7 @@ pdf_print_key(fz_context *ctx, fz_output *out, void *key_)
pdf_obj *key = (pdf_obj *)key_;
if (pdf_is_indirect(ctx, key))
- fz_printf(ctx, out, "(%d %d R) ", pdf_to_num(ctx, key), pdf_to_gen(ctx, key));
+ fz_printf(ctx, out, "(%d 0 R) ", pdf_to_num(ctx, key));
else
pdf_print_obj(ctx, out, key, 0);
}
diff --git a/source/pdf/pdf-stream.c b/source/pdf/pdf-stream.c
index 6e64ae63..f54c2f91 100644
--- a/source/pdf/pdf-stream.c
+++ b/source/pdf/pdf-stream.c
@@ -4,14 +4,14 @@
* Check if an object is a stream or not.
*/
int
-pdf_obj_num_is_stream(fz_context *ctx, pdf_document *doc, int num, int gen)
+pdf_obj_num_is_stream(fz_context *ctx, pdf_document *doc, int num)
{
pdf_xref_entry *entry;
if (num <= 0 || num >= pdf_xref_len(ctx, doc))
return 0;
- entry = pdf_cache_object(ctx, doc, num, gen);
+ entry = pdf_cache_object(ctx, doc, num);
return entry->stm_ofs != 0 || entry->stm_buf;
}
@@ -21,7 +21,7 @@ pdf_is_stream(fz_context *ctx, pdf_obj *obj)
{
pdf_document *doc = pdf_get_bound_document(ctx, obj);
int num = pdf_obj_parent_num(ctx, obj);
- return pdf_obj_num_is_stream(ctx, doc, num, 0);
+ return pdf_obj_num_is_stream(ctx, doc, num);
}
/*
@@ -68,7 +68,7 @@ pdf_load_jbig2_globals(fz_context *ctx, pdf_document *doc, pdf_obj *dict)
fz_try(ctx)
{
- buf = pdf_load_stream(ctx, doc, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
+ buf = pdf_load_stream(ctx, doc, pdf_to_num(ctx, dict));
globals = fz_load_jbig2_globals(ctx, buf);
pdf_store_item(ctx, dict, globals, buf->len);
}
@@ -251,16 +251,26 @@ build_filter_chain(fz_context *ctx, fz_stream *chain, pdf_document *doc, pdf_obj
* orig_num and orig_gen are used purely to seed the encryption.
*/
static fz_stream *
-pdf_open_raw_filter(fz_context *ctx, fz_stream *chain, pdf_document *doc, pdf_obj *stmobj, int num, int orig_num, int orig_gen, fz_off_t offset)
+pdf_open_raw_filter(fz_context *ctx, fz_stream *chain, pdf_document *doc, pdf_obj *stmobj, int num, int *orig_num, int *orig_gen, fz_off_t offset)
{
+ pdf_xref_entry *x = NULL;
int hascrypt;
int len;
if (num > 0 && num < pdf_xref_len(ctx, doc))
{
- pdf_xref_entry *entry = pdf_get_xref_entry(ctx, doc, num);
- if (entry->stm_buf)
- return fz_open_buffer(ctx, entry->stm_buf);
+ x = pdf_get_xref_entry(ctx, doc, num);
+ *orig_num = x->num;
+ *orig_gen = x->gen;
+ if (x->stm_buf)
+ return fz_open_buffer(ctx, x->stm_buf);
+ }
+ else
+ {
+ /* We only end up here when called from pdf_open_stream_with_offset to parse new format XRef sections. */
+ /* New style XRef sections must have generation number 0. */
+ *orig_num = num;
+ *orig_gen = 0;
}
/* don't close chain when we close this filter */
@@ -271,7 +281,7 @@ pdf_open_raw_filter(fz_context *ctx, fz_stream *chain, pdf_document *doc, pdf_ob
hascrypt = pdf_stream_has_crypt(ctx, stmobj);
if (doc->crypt && !hascrypt)
- chain = pdf_open_crypt(ctx, chain, doc->crypt, orig_num, orig_gen);
+ chain = pdf_open_crypt(ctx, chain, doc->crypt, *orig_num, *orig_gen);
return chain;
}
@@ -281,15 +291,16 @@ pdf_open_raw_filter(fz_context *ctx, fz_stream *chain, pdf_document *doc, pdf_ob
* to stream length and decrypting.
*/
static fz_stream *
-pdf_open_filter(fz_context *ctx, pdf_document *doc, fz_stream *chain, pdf_obj *stmobj, int num, int orig_num, int orig_gen, fz_off_t offset, fz_compression_params *imparams)
+pdf_open_filter(fz_context *ctx, pdf_document *doc, fz_stream *chain, pdf_obj *stmobj, int num, fz_off_t offset, fz_compression_params *imparams)
{
pdf_obj *filters;
pdf_obj *params;
+ int orig_num, orig_gen;
filters = pdf_dict_geta(ctx, stmobj, PDF_NAME_Filter, PDF_NAME_F);
params = pdf_dict_geta(ctx, stmobj, PDF_NAME_DecodeParms, PDF_NAME_DP);
- chain = pdf_open_raw_filter(ctx, chain, doc, stmobj, num, orig_num, orig_gen, offset);
+ chain = pdf_open_raw_filter(ctx, chain, doc, stmobj, num, &orig_num, &orig_gen, offset);
fz_var(chain);
@@ -371,39 +382,34 @@ pdf_load_compressed_inline_image(fz_context *ctx, pdf_document *doc, pdf_obj *di
* Open a stream for reading the raw (compressed but decrypted) data.
*/
fz_stream *
-pdf_open_raw_stream(fz_context *ctx, pdf_document *doc, int num, int gen)
-{
- return pdf_open_raw_renumbered_stream(ctx, doc, num, gen, num, gen);
-}
-
-fz_stream *
-pdf_open_raw_renumbered_stream(fz_context *ctx, pdf_document *doc, int num, int gen, int orig_num, int orig_gen)
+pdf_open_raw_stream(fz_context *ctx, pdf_document *doc, int num)
{
pdf_xref_entry *x;
+ int orig_num, orig_gen;
if (num <= 0 || num >= pdf_xref_len(ctx, doc))
- fz_throw(ctx, FZ_ERROR_GENERIC, "object id out of range (%d %d R)", num, gen);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "object id out of range (%d 0 R)", num);
- x = pdf_cache_object(ctx, doc, num, gen);
+ x = pdf_cache_object(ctx, doc, num);
if (x->stm_ofs == 0)
fz_throw(ctx, FZ_ERROR_GENERIC, "object is not a stream");
- return pdf_open_raw_filter(ctx, doc->file, doc, x->obj, num, orig_num, orig_gen, x->stm_ofs);
+ return pdf_open_raw_filter(ctx, doc->file, doc, x->obj, num, &orig_num, &orig_gen, x->stm_ofs);
}
static fz_stream *
-pdf_open_image_stream(fz_context *ctx, pdf_document *doc, int num, int gen, int orig_num, int orig_gen, fz_compression_params *params)
+pdf_open_image_stream(fz_context *ctx, pdf_document *doc, int num, fz_compression_params *params)
{
pdf_xref_entry *x;
if (num <= 0 || num >= pdf_xref_len(ctx, doc))
- fz_throw(ctx, FZ_ERROR_GENERIC, "object id out of range (%d %d R)", num, gen);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "object id out of range (%d 0 R)", num);
- x = pdf_cache_object(ctx, doc, num, gen);
+ x = pdf_cache_object(ctx, doc, num);
if (x->stm_ofs == 0 && x->stm_buf == NULL)
fz_throw(ctx, FZ_ERROR_GENERIC, "object is not a stream");
- return pdf_open_filter(ctx, doc, doc->file, x->obj, num, orig_num, orig_gen, x->stm_ofs, params);
+ return pdf_open_filter(ctx, doc, doc->file, x->obj, num, x->stm_ofs, params);
}
/*
@@ -412,51 +418,45 @@ pdf_open_image_stream(fz_context *ctx, pdf_document *doc, int num, int gen, int
* Using doc->file while a stream is open is a Bad idea.
*/
fz_stream *
-pdf_open_stream(fz_context *ctx, pdf_document *doc, int num, int gen)
+pdf_open_stream(fz_context *ctx, pdf_document *doc, int num)
{
- return pdf_open_image_stream(ctx, doc, num, gen, num, gen, NULL);
+ return pdf_open_image_stream(ctx, doc, num, NULL);
}
fz_stream *
-pdf_open_stream_with_offset(fz_context *ctx, pdf_document *doc, int num, int gen, pdf_obj *dict, fz_off_t stm_ofs)
+pdf_open_stream_with_offset(fz_context *ctx, pdf_document *doc, int num, pdf_obj *dict, fz_off_t stm_ofs)
{
if (stm_ofs == 0)
fz_throw(ctx, FZ_ERROR_GENERIC, "object is not a stream");
-
- return pdf_open_filter(ctx, doc, doc->file, dict, num, num, gen, stm_ofs, NULL);
+ return pdf_open_filter(ctx, doc, doc->file, dict, num, stm_ofs, NULL);
}
/*
* Load raw (compressed but decrypted) contents of a stream into buf.
*/
fz_buffer *
-pdf_load_raw_stream(fz_context *ctx, pdf_document *doc, int num, int gen)
-{
- return pdf_load_raw_renumbered_stream(ctx, doc, num, gen, num, gen);
-}
-
-fz_buffer *
-pdf_load_raw_renumbered_stream(fz_context *ctx, pdf_document *doc, int num, int gen, int orig_num, int orig_gen)
+pdf_load_raw_stream(fz_context *ctx, pdf_document *doc, int num)
{
fz_stream *stm;
pdf_obj *dict;
int len;
fz_buffer *buf;
+ pdf_xref_entry *x;
if (num > 0 && num < pdf_xref_len(ctx, doc))
{
- pdf_xref_entry *entry = pdf_get_xref_entry(ctx, doc, num);
- if (entry->stm_buf)
- return fz_keep_buffer(ctx, entry->stm_buf);
+ x = pdf_get_xref_entry(ctx, doc, num);
+ if (x->stm_buf)
+ return fz_keep_buffer(ctx, x->stm_buf);
}
- dict = pdf_load_object(ctx, doc, num, gen);
+ dict = pdf_load_object(ctx, doc, num);
len = pdf_to_int(ctx, pdf_dict_get(ctx, dict, PDF_NAME_Length));
pdf_drop_obj(ctx, dict);
- stm = pdf_open_raw_renumbered_stream(ctx, doc, num, gen, orig_num, orig_gen);
+ stm = pdf_open_raw_stream(ctx, doc, num);
buf = fz_read_all(ctx, stm, len);
@@ -534,7 +534,7 @@ can_reuse_buffer(fz_context *ctx, pdf_xref_entry *entry, fz_compression_params *
}
static fz_buffer *
-pdf_load_image_stream(fz_context *ctx, pdf_document *doc, int num, int gen, int orig_num, int orig_gen, fz_compression_params *params, int *truncated)
+pdf_load_image_stream(fz_context *ctx, pdf_document *doc, int num, fz_compression_params *params, int *truncated)
{
fz_stream *stm = NULL;
pdf_obj *dict, *obj;
@@ -552,7 +552,7 @@ pdf_load_image_stream(fz_context *ctx, pdf_document *doc, int num, int gen, int
return fz_keep_buffer(ctx, entry->stm_buf);
}
- dict = pdf_load_object(ctx, doc, num, gen);
+ dict = pdf_load_object(ctx, doc, num);
len = pdf_to_int(ctx, pdf_dict_get(ctx, dict, PDF_NAME_Length));
obj = pdf_dict_get(ctx, dict, PDF_NAME_Filter);
@@ -563,7 +563,7 @@ pdf_load_image_stream(fz_context *ctx, pdf_document *doc, int num, int gen, int
pdf_drop_obj(ctx, dict);
- stm = pdf_open_image_stream(ctx, doc, num, gen, orig_num, orig_gen, params);
+ stm = pdf_open_image_stream(ctx, doc, num, params);
fz_try(ctx)
{
@@ -588,25 +588,25 @@ pdf_load_image_stream(fz_context *ctx, pdf_document *doc, int num, int gen, int
* Load uncompressed contents of a stream into buf.
*/
fz_buffer *
-pdf_load_stream(fz_context *ctx, pdf_document *doc, int num, int gen)
+pdf_load_stream(fz_context *ctx, pdf_document *doc, int num)
{
- return pdf_load_image_stream(ctx, doc, num, gen, num, gen, NULL, NULL);
+ return pdf_load_image_stream(ctx, doc, num, NULL, NULL);
}
fz_buffer *
-pdf_load_renumbered_stream(fz_context *ctx, pdf_document *doc, int num, int gen, int orig_num, int orig_gen, int *truncated)
+pdf_load_stream_truncated(fz_context *ctx, pdf_document *doc, int num, int *truncated)
{
- return pdf_load_image_stream(ctx, doc, num, gen, orig_num, orig_gen, NULL, truncated);
+ return pdf_load_image_stream(ctx, doc, num, NULL, truncated);
}
fz_compressed_buffer *
-pdf_load_compressed_stream(fz_context *ctx, pdf_document *doc, int num, int gen)
+pdf_load_compressed_stream(fz_context *ctx, pdf_document *doc, int num)
{
fz_compressed_buffer *bc = fz_malloc_struct(ctx, fz_compressed_buffer);
fz_try(ctx)
{
- bc->buffer = pdf_load_image_stream(ctx, doc, num, gen, num, gen, &bc->params, NULL);
+ bc->buffer = pdf_load_image_stream(ctx, doc, num, &bc->params, NULL);
}
fz_catch(ctx)
{
@@ -631,7 +631,7 @@ pdf_open_object_array(fz_context *ctx, pdf_document *doc, pdf_obj *list)
pdf_obj *obj = pdf_array_get(ctx, list, i);
fz_try(ctx)
{
- fz_concat_push(ctx, stm, pdf_open_stream(ctx, doc, pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj)));
+ fz_concat_push(ctx, stm, pdf_open_stream(ctx, doc, pdf_to_num(ctx, obj)));
}
fz_catch(ctx)
{
@@ -647,15 +647,14 @@ pdf_open_object_array(fz_context *ctx, pdf_document *doc, pdf_obj *list)
fz_stream *
pdf_open_contents_stream(fz_context *ctx, pdf_document *doc, pdf_obj *obj)
{
- int num, gen;
+ int num;
if (pdf_is_array(ctx, obj))
return pdf_open_object_array(ctx, doc, obj);
num = pdf_to_num(ctx, obj);
- gen = pdf_to_gen(ctx, obj);
if (pdf_is_stream(ctx, obj))
- return pdf_open_image_stream(ctx, doc, num, gen, num, gen, NULL);
+ return pdf_open_image_stream(ctx, doc, num, NULL);
- fz_throw(ctx, FZ_ERROR_GENERIC, "pdf object stream missing (%d %d R)", num, gen);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "pdf object stream missing (%d 0 R)", num);
}
diff --git a/source/pdf/pdf-type3.c b/source/pdf/pdf-type3.c
index 908c4354..8eeebd19 100644
--- a/source/pdf/pdf-type3.c
+++ b/source/pdf/pdf-type3.c
@@ -160,7 +160,7 @@ pdf_load_type3_font(fz_context *ctx, pdf_document *doc, pdf_obj *rdb, pdf_obj *d
obj = pdf_dict_gets(ctx, charprocs, estrings[i]);
if (pdf_is_stream(ctx, obj))
{
- fontdesc->font->t3procs[i] = pdf_load_stream(ctx, doc, pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj));
+ fontdesc->font->t3procs[i] = pdf_load_stream(ctx, doc, pdf_to_num(ctx, obj));
fontdesc->size += fontdesc->font->t3procs[i]->cap;
fontdesc->size += 0; // TODO: display list size calculation
}
diff --git a/source/pdf/pdf-write.c b/source/pdf/pdf-write.c
index 1dce7235..aa801b3e 100644
--- a/source/pdf/pdf-write.c
+++ b/source/pdf/pdf-write.c
@@ -68,7 +68,6 @@ struct pdf_write_state_s
int *errors;
/* The following extras are required for linearization */
int *rev_renumber_map;
- int *rev_gen_list;
int start;
fz_off_t first_xref_offset;
fz_off_t main_xref_offset;
@@ -520,7 +519,6 @@ objects_dump(fz_context *ctx, pdf_document *doc, pdf_write_state *opts)
static pdf_obj *markref(fz_context *ctx, pdf_document *doc, pdf_write_state *opts, pdf_obj *obj, int *duff)
{
int num = pdf_to_num(ctx, obj);
- int gen = pdf_to_gen(ctx, obj);
if (num <= 0 || num >= pdf_xref_len(ctx, doc))
{
@@ -536,7 +534,7 @@ static pdf_obj *markref(fz_context *ctx, pdf_document *doc, pdf_write_state *opt
/* Bake in /Length in stream objects */
fz_try(ctx)
{
- if (pdf_obj_num_is_stream(ctx, doc, num, gen))
+ if (pdf_obj_num_is_stream(ctx, doc, num))
{
pdf_obj *len = pdf_dict_get(ctx, obj, PDF_NAME_Length);
if (pdf_is_indirect(ctx, len))
@@ -653,13 +651,13 @@ static void removeduplicateobjs(fz_context *ctx, pdf_document *doc, pdf_write_st
/*
* Comparing stream objects data contents would take too long.
*
- * pdf_is_stream calls pdf_cache_object and ensures
+ * pdf_obj_num_is_stream calls pdf_cache_object and ensures
* that the xref table has the objects loaded.
*/
fz_try(ctx)
{
- streama = pdf_obj_num_is_stream(ctx, doc, num, 0);
- streamb = pdf_obj_num_is_stream(ctx, doc, other, 0);
+ streama = pdf_obj_num_is_stream(ctx, doc, num);
+ streamb = pdf_obj_num_is_stream(ctx, doc, other);
differ = streama || streamb;
if (streama && streamb && opts->do_garbage >= 4)
differ = 0;
@@ -695,8 +693,8 @@ static void removeduplicateobjs(fz_context *ctx, pdf_document *doc, pdf_write_st
{
unsigned char *dataa, *datab;
size_t lena, lenb;
- sa = pdf_load_raw_renumbered_stream(ctx, doc, num, 0, num, 0);
- sb = pdf_load_raw_renumbered_stream(ctx, doc, other, 0, other, 0);
+ sa = pdf_load_raw_stream(ctx, doc, num);
+ sb = pdf_load_raw_stream(ctx, doc, other);
lena = fz_buffer_storage(ctx, sa, &dataa);
lenb = fz_buffer_storage(ctx, sb, &datab);
if (lena == lenb && memcmp(dataa, datab, lena) == 0)
@@ -758,7 +756,6 @@ static void compactxref(fz_context *ctx, pdf_document *doc, pdf_write_state *opt
else if (opts->renumber_map[num] == num)
{
opts->rev_renumber_map[newnum] = opts->rev_renumber_map[num];
- opts->rev_gen_list[newnum] = opts->rev_gen_list[num];
opts->renumber_map[num] = newnum++;
}
/* Otherwise it's used, and moved. We know that it must have
@@ -1159,7 +1156,6 @@ add_linearization_objs(fz_context *ctx, pdf_document *doc, pdf_write_state *opts
opts->renumber_map[params_num] = params_num;
opts->rev_renumber_map[params_num] = params_num;
opts->gen_list[params_num] = 0;
- opts->rev_gen_list[params_num] = 0;
pdf_dict_put_drop(ctx, params_obj, PDF_NAME_Linearized, pdf_new_real(ctx, doc, 1.0));
opts->linear_l = pdf_new_int(ctx, doc, INT_MIN);
pdf_dict_put(ctx, params_obj, PDF_NAME_L, opts->linear_l);
@@ -1187,7 +1183,6 @@ add_linearization_objs(fz_context *ctx, pdf_document *doc, pdf_write_state *opts
opts->renumber_map[hint_num] = hint_num;
opts->rev_renumber_map[hint_num] = hint_num;
opts->gen_list[hint_num] = 0;
- opts->rev_gen_list[hint_num] = 0;
pdf_dict_put_drop(ctx, hint_obj, PDF_NAME_P, pdf_new_int(ctx, doc, 0));
opts->hints_s = pdf_new_int(ctx, doc, INT_MIN);
pdf_dict_put(ctx, hint_obj, PDF_NAME_S, opts->hints_s);
@@ -1400,7 +1395,6 @@ linearize(fz_context *ctx, pdf_document *doc, pdf_write_state *opts)
int n = pdf_xref_len(ctx, doc) + 2;
int *reorder;
int *rev_renumber_map;
- int *rev_gen_list;
opts->page_object_lists = page_objects_list_create(ctx);
@@ -1428,7 +1422,6 @@ linearize(fz_context *ctx, pdf_document *doc, pdf_write_state *opts)
/* Allocate/init the structures used for renumbering the objects */
reorder = fz_calloc(ctx, n, sizeof(int));
rev_renumber_map = fz_calloc(ctx, n, sizeof(int));
- rev_gen_list = fz_calloc(ctx, n, sizeof(int));
for (i = 0; i < n; i++)
{
reorder[i] = i;
@@ -1454,12 +1447,9 @@ linearize(fz_context *ctx, pdf_document *doc, pdf_write_state *opts)
{
opts->renumber_map[reorder[i]] = i;
rev_renumber_map[i] = opts->rev_renumber_map[reorder[i]];
- rev_gen_list[i] = opts->rev_gen_list[reorder[i]];
}
fz_free(ctx, opts->rev_renumber_map);
- fz_free(ctx, opts->rev_gen_list);
opts->rev_renumber_map = rev_renumber_map;
- opts->rev_gen_list = rev_gen_list;
fz_free(ctx, reorder);
/* Apply the renumber_map */
@@ -1511,7 +1501,7 @@ static void preloadobjstms(fz_context *ctx, pdf_document *doc)
{
if (pdf_get_xref_entry(ctx, doc, num)->type == 'o')
{
- obj = pdf_load_object(ctx, doc, num, 0);
+ obj = pdf_load_object(ctx, doc, num);
pdf_drop_obj(ctx, obj);
}
}
@@ -1641,10 +1631,8 @@ static void copystream(fz_context *ctx, pdf_document *doc, pdf_write_state *opts
fz_buffer *buf, *tmp;
pdf_obj *newlen;
pdf_obj *obj;
- int orig_num = opts->rev_renumber_map[num];
- int orig_gen = opts->rev_gen_list[num];
- buf = pdf_load_raw_renumbered_stream(ctx, doc, num, gen, orig_num, orig_gen);
+ buf = pdf_load_raw_stream(ctx, doc, num);
obj = pdf_copy_dict(ctx, obj_orig);
@@ -1687,11 +1675,9 @@ static void expandstream(fz_context *ctx, pdf_document *doc, pdf_write_state *op
fz_buffer *buf, *tmp;
pdf_obj *newlen;
pdf_obj *obj;
- int orig_num = opts->rev_renumber_map[num];
- int orig_gen = opts->rev_gen_list[num];
int truncated = 0;
- buf = pdf_load_renumbered_stream(ctx, doc, num, gen, orig_num, orig_gen, (opts->continue_on_error ? &truncated : NULL));
+ buf = pdf_load_stream_truncated(ctx, doc, num, (opts->continue_on_error ? &truncated : NULL));
if (truncated && opts->errors)
(*opts->errors)++;
@@ -1802,7 +1788,7 @@ static void writeobject(fz_context *ctx, pdf_document *doc, pdf_write_state *opt
fz_try(ctx)
{
- obj = pdf_load_object(ctx, doc, num, gen);
+ obj = pdf_load_object(ctx, doc, num);
}
fz_catch(ctx)
{
@@ -1838,7 +1824,7 @@ static void writeobject(fz_context *ctx, pdf_document *doc, pdf_write_state *opt
}
entry = pdf_get_xref_entry(ctx, doc, num);
- if (!pdf_obj_num_is_stream(ctx, doc, num, gen))
+ if (!pdf_obj_num_is_stream(ctx, doc, num))
{
fz_printf(ctx, opts->out, "%d %d obj\n", num, gen);
pdf_print_obj(ctx, opts->out, obj, opts->do_tight);
@@ -2516,7 +2502,7 @@ make_hint_stream(fz_context *ctx, pdf_document *doc, pdf_write_state *opts)
fz_try(ctx)
{
make_page_offset_hints(ctx, doc, opts, buf);
- pdf_update_stream(ctx, doc, pdf_load_object(ctx, doc, pdf_xref_len(ctx, doc)-1, 0), buf, 0);
+ pdf_update_stream(ctx, doc, pdf_load_object(ctx, doc, pdf_xref_len(ctx, doc)-1), buf, 0);
opts->hintstream_len = (int)buf->len;
fz_drop_buffer(ctx, buf);
}
@@ -2716,7 +2702,6 @@ static void initialise_write_state(fz_context *ctx, pdf_document *doc, const pdf
opts->gen_list = fz_calloc(ctx, xref_len + 3, sizeof(int));
opts->renumber_map = fz_malloc_array(ctx, xref_len + 3, sizeof(int));
opts->rev_renumber_map = fz_malloc_array(ctx, xref_len + 3, sizeof(int));
- opts->rev_gen_list = fz_malloc_array(ctx, xref_len + 3, sizeof(int));
opts->continue_on_error = in_opts->continue_on_error;
opts->errors = in_opts->errors;
@@ -2726,7 +2711,6 @@ static void initialise_write_state(fz_context *ctx, pdf_document *doc, const pdf
opts->ofs_list[num] = 0;
opts->renumber_map[num] = num;
opts->rev_renumber_map[num] = num;
- opts->rev_gen_list[num] = pdf_get_xref_entry(ctx, doc, num)->gen;
}
}
@@ -2738,7 +2722,6 @@ static void finalise_write_state(fz_context *ctx, pdf_write_state *opts)
fz_free(ctx, opts->gen_list);
fz_free(ctx, opts->renumber_map);
fz_free(ctx, opts->rev_renumber_map);
- fz_free(ctx, opts->rev_gen_list);
pdf_drop_obj(ctx, opts->linear_l);
pdf_drop_obj(ctx, opts->linear_h0);
pdf_drop_obj(ctx, opts->linear_h1);
diff --git a/source/pdf/pdf-xref.c b/source/pdf/pdf-xref.c
index 17de3f60..54dbc4b6 100644
--- a/source/pdf/pdf-xref.c
+++ b/source/pdf/pdf-xref.c
@@ -99,6 +99,7 @@ static void pdf_resize_xref(fz_context *ctx, pdf_document *doc, int newlen)
sub->table[i].type = 0;
sub->table[i].ofs = 0;
sub->table[i].gen = 0;
+ sub->table[i].num = 0;
sub->table[i].stm_ofs = 0;
sub->table[i].stm_buf = NULL;
sub->table[i].obj = NULL;
@@ -826,9 +827,10 @@ pdf_read_old_xref(fz_context *ctx, pdf_document *doc, pdf_lexbuf *buf)
entry->ofs = fz_atoo(s);
entry->gen = fz_atoi(s + 11);
+ entry->num = (int)i;
entry->type = s[17];
if (s[17] != 'f' && s[17] != 'n' && s[17] != 'o')
- fz_throw(ctx, FZ_ERROR_GENERIC, "unexpected xref type: %#x (%d %d R)", s[17], (int)i, entry->gen);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "unexpected xref type: %#x (%d %d R)", s[17], entry->num, entry->gen);
}
}
}
@@ -879,6 +881,7 @@ pdf_read_new_xref_section(fz_context *ctx, pdf_document *doc, fz_stream *stm, fz
entry->type = t == 0 ? 'f' : t == 1 ? 'n' : t == 2 ? 'o' : 0;
entry->ofs = w1 ? b : 0;
entry->gen = w2 ? c : 0;
+ entry->num = i;
}
}
@@ -918,13 +921,13 @@ pdf_read_new_xref(fz_context *ctx, pdf_document *doc, pdf_lexbuf *buf)
obj = pdf_dict_get(ctx, trailer, PDF_NAME_Size);
if (!obj)
- fz_throw(ctx, FZ_ERROR_GENERIC, "xref stream missing Size entry (%d %d R)", num, gen);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "xref stream missing Size entry (%d 0 R)", num);
size = pdf_to_int(ctx, obj);
obj = pdf_dict_get(ctx, trailer, PDF_NAME_W);
if (!obj)
- fz_throw(ctx, FZ_ERROR_GENERIC, "xref stream missing W entry (%d %d R)", num, gen);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "xref stream missing W entry (%d R)", num);
w0 = pdf_to_int(ctx, pdf_array_get(ctx, obj, 0));
w1 = pdf_to_int(ctx, pdf_array_get(ctx, obj, 1));
w2 = pdf_to_int(ctx, pdf_array_get(ctx, obj, 2));
@@ -942,7 +945,7 @@ pdf_read_new_xref(fz_context *ctx, pdf_document *doc, pdf_lexbuf *buf)
index = pdf_dict_get(ctx, trailer, PDF_NAME_Index);
- stm = pdf_open_stream_with_offset(ctx, doc, num, gen, trailer, stm_ofs);
+ stm = pdf_open_stream_with_offset(ctx, doc, num, trailer, stm_ofs);
if (!index)
{
@@ -961,6 +964,7 @@ pdf_read_new_xref(fz_context *ctx, pdf_document *doc, pdf_lexbuf *buf)
entry = pdf_get_populating_xref_entry(ctx, doc, num);
entry->ofs = ofs;
entry->gen = gen;
+ entry->num = num;
entry->stm_ofs = stm_ofs;
pdf_drop_obj(ctx, entry->obj);
entry->obj = pdf_keep_obj(ctx, trailer);
@@ -1159,6 +1163,7 @@ pdf_load_xref(fz_context *ctx, pdf_document *doc, pdf_lexbuf *buf)
{
entry->type = 'f';
entry->gen = 65535;
+ entry->num = 0;
}
/* broken pdfs where first object is not free */
else if (entry->type != 'f')
@@ -1300,10 +1305,9 @@ pdf_ocg_set_config(fz_context *ctx, pdf_document *doc, int config)
{
pdf_obj *o = pdf_array_get(ctx, obj, i);
int n = pdf_to_num(ctx, o);
- int g = pdf_to_gen(ctx, o);
for (j=0; j < len; j++)
{
- if (desc->ocgs[j].num == n && desc->ocgs[j].gen == g)
+ if (desc->ocgs[j].num == n)
{
desc->ocgs[j].state = 1;
break;
@@ -1317,10 +1321,9 @@ pdf_ocg_set_config(fz_context *ctx, pdf_document *doc, int config)
{
pdf_obj *o = pdf_array_get(ctx, obj, i);
int n = pdf_to_num(ctx, o);
- int g = pdf_to_gen(ctx, o);
for (j=0; j < len; j++)
{
- if (desc->ocgs[j].num == n && desc->ocgs[j].gen == g)
+ if (desc->ocgs[j].num == n)
{
desc->ocgs[j].state = 0;
break;
@@ -1370,7 +1373,6 @@ pdf_read_ocg(fz_context *ctx, pdf_document *doc)
{
pdf_obj *o = pdf_array_get(ctx, ocg, i);
desc->ocgs[i].num = pdf_to_num(ctx, o);
- desc->ocgs[i].gen = pdf_to_gen(ctx, o);
desc->ocgs[i].state = 1;
}
doc->ocg = desc;
@@ -1481,7 +1483,7 @@ pdf_init_document(fz_context *ctx, pdf_document *doc)
fz_try(ctx)
{
- dict = pdf_load_object(ctx, doc, i, 0);
+ dict = pdf_load_object(ctx, doc, i);
}
fz_catch(ctx)
{
@@ -1640,7 +1642,7 @@ pdf_print_xref(fz_context *ctx, pdf_document *doc)
*/
static pdf_xref_entry *
-pdf_load_obj_stm(fz_context *ctx, pdf_document *doc, int num, int gen, pdf_lexbuf *buf, int target)
+pdf_load_obj_stm(fz_context *ctx, pdf_document *doc, int num, pdf_lexbuf *buf, int target)
{
fz_stream *stm = NULL;
pdf_obj *objstm = NULL;
@@ -1661,7 +1663,7 @@ pdf_load_obj_stm(fz_context *ctx, pdf_document *doc, int num, int gen, pdf_lexbu
fz_try(ctx)
{
- objstm = pdf_load_object(ctx, doc, num, gen);
+ objstm = pdf_load_object(ctx, doc, num);
count = pdf_to_int(ctx, pdf_dict_get(ctx, objstm, PDF_NAME_N));
first = pdf_to_int(ctx, pdf_dict_get(ctx, objstm, PDF_NAME_First));
@@ -1674,17 +1676,17 @@ pdf_load_obj_stm(fz_context *ctx, pdf_document *doc, int num, int gen, pdf_lexbu
numbuf = fz_calloc(ctx, count, sizeof(*numbuf));
ofsbuf = fz_calloc(ctx, count, sizeof(*ofsbuf));
- stm = pdf_open_stream(ctx, doc, num, gen);
+ stm = pdf_open_stream(ctx, doc, num);
for (i = 0; i < count; i++)
{
tok = pdf_lex(ctx, stm, buf);
if (tok != PDF_TOK_INT)
- fz_throw(ctx, FZ_ERROR_GENERIC, "corrupt object stream (%d %d R)", num, gen);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "corrupt object stream (%d 0 R)", num);
numbuf[i] = buf->i;
tok = pdf_lex(ctx, stm, buf);
if (tok != PDF_TOK_INT)
- fz_throw(ctx, FZ_ERROR_GENERIC, "corrupt object stream (%d %d R)", num, gen);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "corrupt object stream (%d 0 R)", num);
ofsbuf[i] = buf->i;
}
@@ -1863,7 +1865,8 @@ pdf_obj_read(fz_context *ctx, pdf_document *doc, fz_off_t *offset, int *nump, pd
DEBUGMESS((ctx, "Successfully read object %d @ %d", num, numofs));
}
entry->type = 'n';
- entry->gen = 0;
+ entry->gen = gen; // XXX: was 0
+ entry->num = num;
entry->ofs = numofs;
entry->stm_ofs = stmofs;
}
@@ -1895,7 +1898,7 @@ pdf_load_hinted_page(fz_context *ctx, pdf_document *doc, int pagenum)
fz_try(ctx)
{
int num = doc->hint_page[pagenum].number;
- pdf_obj *page = pdf_load_object(ctx, doc, num, 0);
+ pdf_obj *page = pdf_load_object(ctx, doc, num);
if (pdf_name_eq(ctx, PDF_NAME_Page, pdf_dict_get(ctx, page, PDF_NAME_Type)))
{
/* We have found the page object! */
@@ -1985,7 +1988,7 @@ read_hinted_object(fz_context *ctx, pdf_document *doc, int num)
}
pdf_xref_entry *
-pdf_cache_object(fz_context *ctx, pdf_document *doc, int num, int gen)
+pdf_cache_object(fz_context *ctx, pdf_document *doc, int num)
{
pdf_xref_entry *x;
int rnum, rgen, try_repair;
@@ -1993,7 +1996,7 @@ pdf_cache_object(fz_context *ctx, pdf_document *doc, int num, int gen)
fz_var(try_repair);
if (num <= 0 || num >= pdf_xref_len(ctx, doc))
- fz_throw(ctx, FZ_ERROR_GENERIC, "object out of range (%d %d R); xref size %d", num, gen, pdf_xref_len(ctx, doc));
+ fz_throw(ctx, FZ_ERROR_GENERIC, "object out of range (%d 0 R); xref size %d", num, pdf_xref_len(ctx, doc));
object_updated:
try_repair = 0;
@@ -2029,6 +2032,7 @@ object_updated:
x->type = 'f';
x->ofs = -1;
x->gen = 0;
+ x->num = 0;
x->stm_ofs = 0;
x->obj = NULL;
try_repair = (doc->repair_attempted == 0);
@@ -2044,25 +2048,25 @@ object_updated:
fz_catch(ctx)
{
if (rnum == num)
- fz_throw(ctx, FZ_ERROR_GENERIC, "cannot parse object (%d %d R)", num, gen);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot parse object (%d 0 R)", num);
else
- fz_throw(ctx, FZ_ERROR_GENERIC, "found object (%d %d R) instead of (%d %d R)", rnum, rgen, num, gen);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "found object (%d 0 R) instead of (%d 0 R)", rnum, num);
}
goto object_updated;
}
if (doc->crypt)
- pdf_crypt_obj(ctx, doc->crypt, x->obj, num, gen);
+ pdf_crypt_obj(ctx, doc->crypt, x->obj, x->num, x->gen);
}
else if (x->type == 'o')
{
if (!x->obj)
{
- x = pdf_load_obj_stm(ctx, doc, x->ofs, 0, &doc->lexbuf.base, num);
+ x = pdf_load_obj_stm(ctx, doc, x->ofs, &doc->lexbuf.base, num);
if (x == NULL)
- fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load object stream containing object (%d %d R)", num, gen);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load object stream containing object (%d 0 R)", num);
if (!x->obj)
- fz_throw(ctx, FZ_ERROR_GENERIC, "object (%d %d R) was not found in its object stream", num, gen);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "object (%d 0 R) was not found in its object stream", num);
}
}
else if (doc->hint_obj_offsets && read_hinted_object(ctx, doc, num))
@@ -2071,11 +2075,11 @@ object_updated:
}
else if (doc->file_length && doc->linear_pos < doc->file_length)
{
- fz_throw(ctx, FZ_ERROR_TRYLATER, "cannot find object in xref (%d %d R) - not loaded yet?", num, gen);
+ fz_throw(ctx, FZ_ERROR_TRYLATER, "cannot find object in xref (%d 0 R) - not loaded yet?", num);
}
else
{
- fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find object in xref (%d %d R)", num, gen);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find object in xref (%d 0 R)", num);
}
pdf_set_obj_parent(ctx, x->obj, num);
@@ -2083,9 +2087,9 @@ object_updated:
}
pdf_obj *
-pdf_load_object(fz_context *ctx, pdf_document *doc, int num, int gen)
+pdf_load_object(fz_context *ctx, pdf_document *doc, int num)
{
- pdf_xref_entry *entry = pdf_cache_object(ctx, doc, num, gen);
+ pdf_xref_entry *entry = pdf_cache_object(ctx, doc, num);
assert(entry->obj != NULL);
return pdf_keep_obj(ctx, entry->obj);
}
@@ -2095,7 +2099,6 @@ pdf_resolve_indirect(fz_context *ctx, pdf_obj *ref)
{
int sanity = 10;
int num;
- int gen;
pdf_xref_entry *entry;
while (pdf_is_indirect(ctx, ref))
@@ -2104,7 +2107,7 @@ pdf_resolve_indirect(fz_context *ctx, pdf_obj *ref)
if (--sanity == 0)
{
- fz_warn(ctx, "too many indirections (possible indirection cycle involving %d %d R)", num, gen);
+ fz_warn(ctx, "too many indirections (possible indirection cycle involving %d 0 R)", num);
return NULL;
}
@@ -2112,22 +2115,21 @@ pdf_resolve_indirect(fz_context *ctx, pdf_obj *ref)
if (!doc)
return NULL;
num = pdf_to_num(ctx, ref);
- gen = pdf_to_gen(ctx, ref);
- if (num <= 0 || gen < 0)
+ if (num <= 0)
{
- fz_warn(ctx, "invalid indirect reference (%d %d R)", num, gen);
+ fz_warn(ctx, "invalid indirect reference (%d 0 R)", num);
return NULL;
}
fz_try(ctx)
{
- entry = pdf_cache_object(ctx, doc, num, gen);
+ entry = pdf_cache_object(ctx, doc, num);
}
fz_catch(ctx)
{
fz_rethrow_if(ctx, FZ_ERROR_TRYLATER);
- fz_warn(ctx, "cannot load object (%d %d R) into cache", num, gen);
+ fz_warn(ctx, "cannot load object (%d 0 R) into cache", num);
return NULL;
}
@@ -2155,6 +2157,7 @@ pdf_create_object(fz_context *ctx, pdf_document *doc)
entry->type = 'f';
entry->ofs = -1;
entry->gen = 0;
+ entry->num = num;
entry->stm_ofs = 0;
entry->stm_buf = NULL;
entry->obj = NULL;
@@ -2180,6 +2183,7 @@ pdf_delete_object(fz_context *ctx, pdf_document *doc, int num)
x->type = 'f';
x->ofs = 0;
x->gen += 1;
+ x->num = 0;
x->stm_ofs = 0;
x->stm_buf = NULL;
x->obj = NULL;
@@ -2361,7 +2365,7 @@ pdf_open_document(fz_context *ctx, const char *filename)
}
static void
-pdf_load_hints(fz_context *ctx, pdf_document *doc, int objnum, int gennum)
+pdf_load_hints(fz_context *ctx, pdf_document *doc, int objnum)
{
fz_stream *stream = NULL;
pdf_obj *dict;
@@ -2383,7 +2387,7 @@ pdf_load_hints(fz_context *ctx, pdf_document *doc, int objnum, int gennum)
int least_shared_group_len, shared_group_len_num_bits;
int max_object_num = pdf_xref_len(ctx, doc);
- stream = pdf_open_stream(ctx, doc, objnum, gennum);
+ stream = pdf_open_stream(ctx, doc, objnum);
dict = pdf_get_xref_entry(ctx, doc, objnum)->obj;
if (dict == NULL || !pdf_is_dict(ctx, dict))
fz_throw(ctx, FZ_ERROR_GENERIC, "malformed hint object");
@@ -2604,7 +2608,7 @@ pdf_load_hint_object(fz_context *ctx, pdf_document *doc)
if (tok != PDF_TOK_OBJ)
break;
(void)pdf_repair_obj(ctx, doc, buf, &tmpofs, NULL, NULL, NULL, &page, &tmpofs, NULL);
- pdf_load_hints(ctx, doc, num, gen);
+ pdf_load_hints(ctx, doc, num);
}
}
fz_always(ctx)