Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/pdf/xpdf/Page.cc
diff options
context:
space:
mode:
authorArturo Espinosa <unammx@src.gnome.org>1999-04-17 02:59:58 (GMT)
committer Arturo Espinosa <unammx@src.gnome.org>1999-04-17 02:59:58 (GMT)
commitd9f9a6449f377b4c933b75d57541b19c6d088994 (patch)
tree04f7f0c54447ef792fbf83bc5039174f4681b3bb /pdf/xpdf/Page.cc
Initial revision
Diffstat (limited to 'pdf/xpdf/Page.cc')
-rw-r--r--pdf/xpdf/Page.cc214
1 files changed, 214 insertions, 0 deletions
diff --git a/pdf/xpdf/Page.cc b/pdf/xpdf/Page.cc
new file mode 100644
index 0000000..d09170a
--- /dev/null
+++ b/pdf/xpdf/Page.cc
@@ -0,0 +1,214 @@
+//========================================================================
+//
+// Page.cc
+//
+// Copyright 1996 Derek B. Noonburg
+//
+//========================================================================
+
+#ifdef __GNUC__
+#pragma implementation
+#endif
+
+#include <stddef.h>
+#include "Object.h"
+#include "Array.h"
+#include "Dict.h"
+#include "XRef.h"
+#include "OutputDev.h"
+#ifndef PDF_PARSER_ONLY
+#include "Gfx.h"
+#endif
+#include "Error.h"
+
+#include "Params.h"
+#include "Page.h"
+
+//------------------------------------------------------------------------
+// PageAttrs
+//------------------------------------------------------------------------
+
+PageAttrs::PageAttrs(PageAttrs *attrs, Dict *dict) {
+ Object obj1, obj2;
+ double w, h;
+
+ // get old/default values
+ if (attrs) {
+ x1 = attrs->x1;
+ y1 = attrs->y1;
+ x2 = attrs->x2;
+ y2 = attrs->y2;
+ cropX1 = attrs->cropX1;
+ cropY1 = attrs->cropY1;
+ cropX2 = attrs->cropX2;
+ cropY2 = attrs->cropY2;
+ rotate = attrs->rotate;
+ attrs->resources.copy(&resources);
+ } else {
+ // set default MediaBox to 8.5" x 11" -- this shouldn't be necessary
+ // but some (non-compliant) PDF files don't specify a MediaBox
+ x1 = 0;
+ y1 = 0;
+ x2 = 612;
+ y2 = 792;
+ cropX1 = cropY1 = cropX2 = cropY2 = 0;
+ rotate = 0;
+ resources.initNull();
+ }
+
+ // media box
+ dict->lookup("MediaBox", &obj1);
+ if (obj1.isArray() && obj1.arrayGetLength() == 4) {
+ obj1.arrayGet(0, &obj2);
+ if (obj2.isNum())
+ x1 = obj2.getNum();
+ obj2.free();
+ obj1.arrayGet(1, &obj2);
+ if (obj2.isNum())
+ y1 = obj2.getNum();
+ obj2.free();
+ obj1.arrayGet(2, &obj2);
+ if (obj2.isNum())
+ x2 = obj2.getNum();
+ obj2.free();
+ obj1.arrayGet(3, &obj2);
+ if (obj2.isNum())
+ y2 = obj2.getNum();
+ obj2.free();
+ }
+ obj1.free();
+
+ // crop box
+ dict->lookup("CropBox", &obj1);
+ if (obj1.isArray() && obj1.arrayGetLength() == 4) {
+ obj1.arrayGet(0, &obj2);
+ if (obj2.isNum())
+ cropX1 = obj2.getNum();
+ obj2.free();
+ obj1.arrayGet(1, &obj2);
+ if (obj2.isNum())
+ cropY1 = obj2.getNum();
+ obj2.free();
+ obj1.arrayGet(2, &obj2);
+ if (obj2.isNum())
+ cropX2 = obj2.getNum();
+ obj2.free();
+ obj1.arrayGet(3, &obj2);
+ if (obj2.isNum())
+ cropY2 = obj2.getNum();
+ obj2.free();
+
+ // if the MediaBox is excessively larger than the CropBox,
+ // just use the CropBox
+ w = 0.25 * (cropX2 - cropX1);
+ h = 0.25 * (cropY2 - cropY1);
+ if (cropX1 - x1 > w || x2 - cropX2 > w ||
+ cropY1 - y1 > h || y2 - cropY2 > h) {
+ x1 = cropX1;
+ x2 = cropX2;
+ y1 = cropY1;
+ y2 = cropY2;
+ }
+ } else {
+ cropX1 = cropX2 = cropY1 = cropY2 = 0;
+ }
+ obj1.free();
+
+ // rotate
+ dict->lookup("Rotate", &obj1);
+ if (obj1.isInt())
+ rotate = obj1.getInt();
+ obj1.free();
+ while (rotate < 0)
+ rotate += 360;
+ while (rotate >= 360)
+ rotate -= 360;
+
+ // resource dictionary
+ dict->lookup("Resources", &obj1);
+ if (obj1.isDict()) {
+ resources.free();
+ obj1.copy(&resources);
+ }
+ obj1.free();
+}
+
+PageAttrs::~PageAttrs() {
+ resources.free();
+}
+
+//------------------------------------------------------------------------
+// Page
+//------------------------------------------------------------------------
+
+Page::Page(int num1, Dict *pageDict, PageAttrs *attrs1) {
+
+ ok = gTrue;
+ num = num1;
+
+ // get attributes
+ attrs = attrs1;
+
+ // annotations
+ pageDict->lookupNF("Annots", &annots);
+ if (!(annots.isRef() || annots.isArray() || annots.isNull())) {
+ error(-1, "Page annotations object (page %d) is wrong type (%s)",
+ num, annots.getTypeName());
+ annots.free();
+ goto err2;
+ }
+
+ // contents
+ pageDict->lookupNF("Contents", &contents);
+ if (!(contents.isRef() || contents.isArray() ||
+ contents.isNull())) {
+ error(-1, "Page contents object (page %d) is wrong type (%s)",
+ num, contents.getTypeName());
+ contents.free();
+ goto err1;
+ }
+
+ return;
+
+ err2:
+ annots.initNull();
+ err1:
+ contents.initNull();
+ ok = gFalse;
+}
+
+Page::~Page() {
+ delete attrs;
+ annots.free();
+ contents.free();
+}
+
+void Page::display(OutputDev *out, int dpi, int rotate) {
+#ifndef PDF_PARSER_ONLY
+ Gfx *gfx;
+ Object obj;
+
+ if (printCommands) {
+ printf("***** MediaBox = ll:%g,%g ur:%g,%g\n",
+ getX1(), getY1(), getX2(), getY2());
+ if (isCropped()) {
+ printf("***** CropBox = ll:%g,%g ur:%g,%g\n",
+ getCropX1(), getCropY1(), getCropX2(), getCropY2());
+ }
+ printf("***** Rotate = %d\n", attrs->getRotate());
+ }
+ rotate += getRotate();
+ if (rotate >= 360)
+ rotate -= 360;
+ else if (rotate < 0)
+ rotate += 360;
+ gfx = new Gfx(out, num, attrs->getResourceDict(),
+ dpi, getX1(), getY1(), getX2(), getY2(), isCropped(),
+ getCropX1(), getCropY1(), getCropX2(), getCropY2(), rotate);
+ contents.fetch(&obj);
+ if (!obj.isNull())
+ gfx->display(&obj);
+ obj.free();
+ delete gfx;
+#endif
+}