summaryrefslogtreecommitdiff
path: root/Build/source/libs/poppler/poppler-0.33.0/poppler/Linearization.cc
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/poppler/poppler-0.33.0/poppler/Linearization.cc')
-rw-r--r--Build/source/libs/poppler/poppler-0.33.0/poppler/Linearization.cc222
1 files changed, 222 insertions, 0 deletions
diff --git a/Build/source/libs/poppler/poppler-0.33.0/poppler/Linearization.cc b/Build/source/libs/poppler/poppler-0.33.0/poppler/Linearization.cc
new file mode 100644
index 00000000000..33331d1af37
--- /dev/null
+++ b/Build/source/libs/poppler/poppler-0.33.0/poppler/Linearization.cc
@@ -0,0 +1,222 @@
+//========================================================================
+//
+// Linearization.cc
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright 2010, 2012 Hib Eris <hib@hiberis.nl>
+//
+//========================================================================
+
+#include "Linearization.h"
+#include "Parser.h"
+#include "Lexer.h"
+
+//------------------------------------------------------------------------
+// Linearization
+//------------------------------------------------------------------------
+
+Linearization::Linearization (BaseStream *str)
+{
+ Parser *parser;
+ Object obj1, obj2, obj3, obj5;
+
+ linDict.initNull();
+
+ str->reset();
+ obj1.initNull();
+ parser = new Parser(NULL,
+ new Lexer(NULL, str->makeSubStream(str->getStart(), gFalse, 0, &obj1)),
+ gFalse);
+ parser->getObj(&obj1);
+ parser->getObj(&obj2);
+ parser->getObj(&obj3);
+ parser->getObj(&linDict);
+ if (obj1.isInt() && obj2.isInt() && obj3.isCmd("obj") && linDict.isDict()) {
+ linDict.dictLookup("Linearized", &obj5);
+ if (!(obj5.isNum() && obj5.getNum() > 0)) {
+ linDict.free();
+ linDict.initNull();
+ }
+ obj5.free();
+ }
+ obj3.free();
+ obj2.free();
+ obj1.free();
+ delete parser;
+}
+
+Linearization:: ~Linearization()
+{
+ linDict.free();
+}
+
+Guint Linearization::getLength()
+{
+ if (!linDict.isDict()) return 0;
+
+ int length;
+ if (linDict.getDict()->lookupInt("L", NULL, &length) &&
+ length > 0) {
+ return length;
+ } else {
+ error(errSyntaxWarning, -1, "Length in linearization table is invalid");
+ return 0;
+ }
+}
+
+Guint Linearization::getHintsOffset()
+{
+ int hintsOffset;
+
+ Object obj1, obj2;
+ if (linDict.isDict() &&
+ linDict.dictLookup("H", &obj1)->isArray() &&
+ obj1.arrayGetLength()>=2 &&
+ obj1.arrayGet(0, &obj2)->isInt() &&
+ obj2.getInt() > 0) {
+ hintsOffset = obj2.getInt();
+ } else {
+ error(errSyntaxWarning, -1, "Hints table offset in linearization table is invalid");
+ hintsOffset = 0;
+ }
+ obj2.free();
+ obj1.free();
+
+ return hintsOffset;
+}
+
+Guint Linearization::getHintsLength()
+{
+ int hintsLength;
+
+ Object obj1, obj2;
+ if (linDict.isDict() &&
+ linDict.dictLookup("H", &obj1)->isArray() &&
+ obj1.arrayGetLength()>=2 &&
+ obj1.arrayGet(1, &obj2)->isInt() &&
+ obj2.getInt() > 0) {
+ hintsLength = obj2.getInt();
+ } else {
+ error(errSyntaxWarning, -1, "Hints table length in linearization table is invalid");
+ hintsLength = 0;
+ }
+ obj2.free();
+ obj1.free();
+
+ return hintsLength;
+}
+
+Guint Linearization::getHintsOffset2()
+{
+ int hintsOffset2 = 0; // default to 0
+
+ Object obj1, obj2;
+ if (linDict.isDict() &&
+ linDict.dictLookup("H", &obj1)->isArray() &&
+ obj1.arrayGetLength()>=4) {
+ if (obj1.arrayGet(2, &obj2)->isInt() &&
+ obj2.getInt() > 0) {
+ hintsOffset2 = obj2.getInt();
+ } else {
+ error(errSyntaxWarning, -1, "Second hints table offset in linearization table is invalid");
+ hintsOffset2 = 0;
+ }
+ }
+ obj2.free();
+ obj1.free();
+
+ return hintsOffset2;
+}
+
+Guint Linearization::getHintsLength2()
+{
+ int hintsLength2 = 0; // default to 0
+
+ Object obj1, obj2;
+ if (linDict.isDict() &&
+ linDict.dictLookup("H", &obj1)->isArray() &&
+ obj1.arrayGetLength()>=4) {
+ if (obj1.arrayGet(3, &obj2)->isInt() &&
+ obj2.getInt() > 0) {
+ hintsLength2 = obj2.getInt();
+ } else {
+ error(errSyntaxWarning, -1, "Second hints table length in linearization table is invalid");
+ hintsLength2 = 0;
+ }
+ }
+ obj2.free();
+ obj1.free();
+
+ return hintsLength2;
+}
+
+int Linearization::getObjectNumberFirst()
+{
+ int objectNumberFirst = 0;
+ if (linDict.isDict() &&
+ linDict.getDict()->lookupInt("O", NULL, &objectNumberFirst) &&
+ objectNumberFirst > 0) {
+ return objectNumberFirst;
+ } else {
+ error(errSyntaxWarning, -1, "Object number of first page in linearization table is invalid");
+ return 0;
+ }
+}
+
+Guint Linearization::getEndFirst()
+{
+ int pageEndFirst = 0;
+ if (linDict.isDict() &&
+ linDict.getDict()->lookupInt("E", NULL, &pageEndFirst) &&
+ pageEndFirst > 0) {
+ return pageEndFirst;
+ } else {
+ error(errSyntaxWarning, -1, "First page end offset in linearization table is invalid");
+ return 0;
+ }
+}
+
+int Linearization::getNumPages()
+{
+ int numPages = 0;
+ if (linDict.isDict() &&
+ linDict.getDict()->lookupInt("N", NULL, &numPages) &&
+ numPages > 0) {
+ return numPages;
+ } else {
+ error(errSyntaxWarning, -1, "Page count in linearization table is invalid");
+ return 0;
+ }
+}
+
+Guint Linearization::getMainXRefEntriesOffset()
+{
+ int mainXRefEntriesOffset = 0;
+ if (linDict.isDict() &&
+ linDict.getDict()->lookupInt("T", NULL, &mainXRefEntriesOffset) &&
+ mainXRefEntriesOffset > 0) {
+ return mainXRefEntriesOffset;
+ } else {
+ error(errSyntaxWarning, -1, "Main Xref offset in linearization table is invalid");
+ return 0;
+ }
+}
+
+int Linearization::getPageFirst()
+{
+ int pageFirst = 0; // Optional, defaults to 0.
+
+ if (linDict.isDict()) {
+ linDict.getDict()->lookupInt("P", NULL, &pageFirst);
+ }
+
+ if ((pageFirst < 0) || (pageFirst > getNumPages())) {
+ error(errSyntaxWarning, -1, "First page in linearization table is invalid");
+ return 0;
+ }
+
+ return pageFirst;
+}
+
+