diff options
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.cc | 222 |
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; +} + + |