1 //========================================================================
5 // This file is licensed under the GPLv2 or later
7 // Copyright 2010, 2012 Hib Eris <hib@hiberis.nl>
8 // Copyright 2015 Jason Crain <jason@aquaticape.us>
10 //========================================================================
12 #include "Linearization.h"
16 //------------------------------------------------------------------------
18 //------------------------------------------------------------------------
20 Linearization::Linearization (BaseStream
*str
)
23 Object obj1
, obj2
, obj3
, obj5
;
29 parser
= new Parser(NULL
,
30 new Lexer(NULL
, str
->makeSubStream(str
->getStart(), gFalse
, 0, &obj1
)),
32 parser
->getObj(&obj1
);
33 parser
->getObj(&obj2
);
34 parser
->getObj(&obj3
);
35 parser
->getObj(&linDict
);
36 if (obj1
.isInt() && obj2
.isInt() && obj3
.isCmd("obj") && linDict
.isDict()) {
37 linDict
.dictLookup("Linearized", &obj5
);
38 if (!(obj5
.isNum() && obj5
.getNum() > 0)) {
50 Linearization:: ~Linearization()
55 Guint
Linearization::getLength()
57 if (!linDict
.isDict()) return 0;
60 if (linDict
.getDict()->lookupInt("L", NULL
, &length
) &&
64 error(errSyntaxWarning
, -1, "Length in linearization table is invalid");
69 Guint
Linearization::getHintsOffset()
74 if (linDict
.isDict() &&
75 linDict
.dictLookup("H", &obj1
)->isArray() &&
76 obj1
.arrayGetLength()>=2 &&
77 obj1
.arrayGet(0, &obj2
)->isInt() &&
79 hintsOffset
= obj2
.getInt();
81 error(errSyntaxWarning
, -1, "Hints table offset in linearization table is invalid");
90 Guint
Linearization::getHintsLength()
95 if (linDict
.isDict() &&
96 linDict
.dictLookup("H", &obj1
)->isArray() &&
97 obj1
.arrayGetLength()>=2 &&
98 obj1
.arrayGet(1, &obj2
)->isInt() &&
100 hintsLength
= obj2
.getInt();
102 error(errSyntaxWarning
, -1, "Hints table length in linearization table is invalid");
111 Guint
Linearization::getHintsOffset2()
113 int hintsOffset2
= 0; // default to 0
116 if (linDict
.isDict() &&
117 linDict
.dictLookup("H", &obj1
)->isArray() &&
118 obj1
.arrayGetLength()>=4) {
119 if (obj1
.arrayGet(2, &obj2
)->isInt() &&
121 hintsOffset2
= obj2
.getInt();
123 error(errSyntaxWarning
, -1, "Second hints table offset in linearization table is invalid");
133 Guint
Linearization::getHintsLength2()
135 int hintsLength2
= 0; // default to 0
138 if (linDict
.isDict() &&
139 linDict
.dictLookup("H", &obj1
)->isArray() &&
140 obj1
.arrayGetLength()>=4) {
141 if (obj1
.arrayGet(3, &obj2
)->isInt() &&
143 hintsLength2
= obj2
.getInt();
145 error(errSyntaxWarning
, -1, "Second hints table length in linearization table is invalid");
155 int Linearization::getObjectNumberFirst()
157 int objectNumberFirst
= 0;
158 if (linDict
.isDict() &&
159 linDict
.getDict()->lookupInt("O", NULL
, &objectNumberFirst
) &&
160 objectNumberFirst
> 0) {
161 return objectNumberFirst
;
163 error(errSyntaxWarning
, -1, "Object number of first page in linearization table is invalid");
168 Guint
Linearization::getEndFirst()
170 int pageEndFirst
= 0;
171 if (linDict
.isDict() &&
172 linDict
.getDict()->lookupInt("E", NULL
, &pageEndFirst
) &&
176 error(errSyntaxWarning
, -1, "First page end offset in linearization table is invalid");
181 int Linearization::getNumPages()
184 if (linDict
.isDict() &&
185 linDict
.getDict()->lookupInt("N", NULL
, &numPages
) &&
189 error(errSyntaxWarning
, -1, "Page count in linearization table is invalid");
194 Guint
Linearization::getMainXRefEntriesOffset()
196 int mainXRefEntriesOffset
= 0;
197 if (linDict
.isDict() &&
198 linDict
.getDict()->lookupInt("T", NULL
, &mainXRefEntriesOffset
) &&
199 mainXRefEntriesOffset
> 0) {
200 return mainXRefEntriesOffset
;
202 error(errSyntaxWarning
, -1, "Main Xref offset in linearization table is invalid");
207 int Linearization::getPageFirst()
209 int pageFirst
= 0; // Optional, defaults to 0.
211 if (linDict
.isDict()) {
212 linDict
.getDict()->lookupInt("P", NULL
, &pageFirst
);
215 if ((pageFirst
< 0) || (pageFirst
>= getNumPages())) {
216 error(errSyntaxWarning
, -1, "First page in linearization table is invalid");