summaryrefslogtreecommitdiff
path: root/fitz/obj_simple.c
diff options
context:
space:
mode:
Diffstat (limited to 'fitz/obj_simple.c')
-rw-r--r--fitz/obj_simple.c139
1 files changed, 81 insertions, 58 deletions
diff --git a/fitz/obj_simple.c b/fitz/obj_simple.c
index 031e55ee..bfc3ecb2 100644
--- a/fitz/obj_simple.c
+++ b/fitz/obj_simple.c
@@ -1,8 +1,8 @@
-#include "fitz_base.h"
-#include "fitz_stream.h"
+#include "fitz.h"
+#include "mupdf.h"
-extern void fz_droparray(fz_obj *array);
-extern void fz_dropdict(fz_obj *dict);
+extern void fz_freearray(fz_obj *array);
+extern void fz_freedict(fz_obj *dict);
#define NEWOBJ(KIND,SIZE) \
fz_obj *o; \
@@ -61,11 +61,13 @@ fz_newname(fz_obj **op, char *str)
}
fz_error
-fz_newindirect(fz_obj **op, int objid, int genid)
+fz_newindirect(fz_obj **op, int num, int gen, pdf_xref *xref)
{
NEWOBJ(FZ_INDIRECT, sizeof (fz_obj));
- o->u.r.oid = objid;
- o->u.r.gid = genid;
+ o->u.r.num = num;
+ o->u.r.gen = gen;
+ o->u.r.xref = xref;
+ o->u.r.obj = nil;
return fz_okay;
}
@@ -84,79 +86,90 @@ fz_dropobj(fz_obj *o)
if (--o->refs == 0)
{
if (o->kind == FZ_ARRAY)
- fz_droparray(o);
+ {
+ fz_freearray(o);
+ }
else if (o->kind == FZ_DICT)
- fz_dropdict(o);
+ {
+ fz_freedict(o);
+ }
+ else if (o->kind == FZ_INDIRECT)
+ {
+ if (o->u.r.obj)
+ fz_dropobj(o->u.r.obj);
+ fz_free(o);
+ }
else
+ {
fz_free(o);
+ }
}
}
-int
-fz_isnull(fz_obj *obj)
+int fz_isindirect(fz_obj *obj)
{
+ return obj ? obj->kind == FZ_INDIRECT : 0;
+}
+
+int fz_isnull(fz_obj *obj)
+{
+ obj = fz_resolveindirect(obj);
return obj ? obj->kind == FZ_NULL : 0;
}
-int
-fz_isbool(fz_obj *obj)
+int fz_isbool(fz_obj *obj)
{
+ obj = fz_resolveindirect(obj);
return obj ? obj->kind == FZ_BOOL : 0;
}
-int
-fz_isint(fz_obj *obj)
+int fz_isint(fz_obj *obj)
{
+ obj = fz_resolveindirect(obj);
return obj ? obj->kind == FZ_INT : 0;
}
-int
-fz_isreal(fz_obj *obj)
+int fz_isreal(fz_obj *obj)
{
+ obj = fz_resolveindirect(obj);
return obj ? obj->kind == FZ_REAL : 0;
}
-int
-fz_isstring(fz_obj *obj)
+int fz_isstring(fz_obj *obj)
{
+ obj = fz_resolveindirect(obj);
return obj ? obj->kind == FZ_STRING : 0;
}
-int
-fz_isname(fz_obj *obj)
+int fz_isname(fz_obj *obj)
{
+ obj = fz_resolveindirect(obj);
return obj ? obj->kind == FZ_NAME : 0;
}
-int
-fz_isarray(fz_obj *obj)
+int fz_isarray(fz_obj *obj)
{
+ obj = fz_resolveindirect(obj);
return obj ? obj->kind == FZ_ARRAY : 0;
}
-int
-fz_isdict(fz_obj *obj)
+int fz_isdict(fz_obj *obj)
{
+ obj = fz_resolveindirect(obj);
return obj ? obj->kind == FZ_DICT : 0;
}
-int
-fz_isindirect(fz_obj *obj)
-{
- return obj ? obj->kind == FZ_INDIRECT : 0;
-}
-
-int
-fz_tobool(fz_obj *obj)
+int fz_tobool(fz_obj *obj)
{
+ obj = fz_resolveindirect(obj);
if (fz_isbool(obj))
return obj->u.b;
return 0;
}
-int
-fz_toint(fz_obj *obj)
+int fz_toint(fz_obj *obj)
{
+ obj = fz_resolveindirect(obj);
if (fz_isint(obj))
return obj->u.i;
if (fz_isreal(obj))
@@ -164,9 +177,9 @@ fz_toint(fz_obj *obj)
return 0;
}
-float
-fz_toreal(fz_obj *obj)
+float fz_toreal(fz_obj *obj)
{
+ obj = fz_resolveindirect(obj);
if (fz_isreal(obj))
return obj->u.f;
if (fz_isint(obj))
@@ -174,53 +187,63 @@ fz_toreal(fz_obj *obj)
return 0;
}
-char *
-fz_toname(fz_obj *obj)
+char *fz_toname(fz_obj *obj)
{
+ obj = fz_resolveindirect(obj);
if (fz_isname(obj))
return obj->u.n;
return "";
}
-char *
-fz_tostrbuf(fz_obj *obj)
+char *fz_tostrbuf(fz_obj *obj)
{
+ obj = fz_resolveindirect(obj);
if (fz_isstring(obj))
return obj->u.s.buf;
return "";
}
-int
-fz_tostrlen(fz_obj *obj)
+int fz_tostrlen(fz_obj *obj)
{
+ obj = fz_resolveindirect(obj);
if (fz_isstring(obj))
return obj->u.s.len;
return 0;
}
-int
-fz_tonum(fz_obj *obj)
+int fz_tonum(fz_obj *obj)
{
if (fz_isindirect(obj))
- return obj->u.r.oid;
+ return obj->u.r.num;
return 0;
}
-int
-fz_togen(fz_obj *obj)
+int fz_togen(fz_obj *obj)
{
if (fz_isindirect(obj))
- return obj->u.r.gid;
+ return obj->u.r.gen;
return 0;
}
-fz_error
-fz_newnamefromstring(fz_obj **op, fz_obj *str)
+fz_obj *fz_resolveindirect(fz_obj *ref)
{
- NEWOBJ(FZ_NAME, offsetof(fz_obj, u.n) + fz_tostrlen(str) + 1);
- memcpy(o->u.n, fz_tostrbuf(str), fz_tostrlen(str));
- o->u.n[fz_tostrlen(str)] = '\0';
- return fz_okay;
+ int error;
+
+ if (fz_isindirect(ref))
+ {
+ if (!ref->u.r.obj && ref->u.r.xref)
+ {
+ error = pdf_loadobject(&ref->u.r.obj, ref->u.r.xref, fz_tonum(ref), fz_togen(ref));
+ if (error)
+ {
+ fz_catch(error, "cannot resolve reference (%d %d R); ignoring error", fz_tonum(ref), fz_togen(ref));
+ ref->u.r.obj = fz_keepobj(ref);
+ }
+ }
+ return ref->u.r.obj;
+ }
+
+ return ref;
}
int
@@ -249,9 +272,9 @@ fz_objcmp(fz_obj *a, fz_obj *b)
return strcmp(a->u.n, b->u.n);
case FZ_INDIRECT:
- if (a->u.r.oid == b->u.r.oid)
- return a->u.r.gid - b->u.r.gid;
- return a->u.r.oid - b->u.r.oid;
+ if (a->u.r.num == b->u.r.num)
+ return a->u.r.gen - b->u.r.gen;
+ return a->u.r.num - b->u.r.num;
case FZ_ARRAY:
if (a->u.a.len != b->u.a.len)