diff options
author | Arturo 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) |
commit | d9f9a6449f377b4c933b75d57541b19c6d088994 (patch) | |
tree | 04f7f0c54447ef792fbf83bc5039174f4681b3bb /pdf/xpdf/Page.cc |
Initial revision
Diffstat (limited to 'pdf/xpdf/Page.cc')
-rw-r--r-- | pdf/xpdf/Page.cc | 214 |
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 +} |