#include "OutputDev.h"
#ifndef PDF_PARSER_ONLY
#include "Gfx.h"
+#include "GfxState.h"
#include "Annot.h"
#endif
#include "Error.h"
PageAttrs::PageAttrs(PageAttrs *attrs, Dict *dict) {
Object obj1;
- double w, h;
// get old/default values
if (attrs) {
cropBox = mediaBox;
}
- // if the MediaBox is excessively larger than the CropBox,
- // just use the CropBox
- limitToCropBox = gFalse;
- if (haveCropBox) {
- w = 0.25 * (cropBox.x2 - cropBox.x1);
- h = 0.25 * (cropBox.y2 - cropBox.y1);
- if ((cropBox.x1 - mediaBox.x1) + (mediaBox.x2 - cropBox.x2) > w ||
- (cropBox.y1 - mediaBox.y1) + (mediaBox.y2 - cropBox.y2) > h) {
- limitToCropBox = gTrue;
- }
- }
-
- /* if the crop box is larger than the media box, cut it down to
- media box size */
- if(haveCropBox &&
- mediaBox.x1 <= cropBox.x2 &&
- mediaBox.y1 <= cropBox.y2 &&
- cropBox.x1 <= mediaBox.x2 &&
- cropBox.y1 <= mediaBox.y2) {
- if(mediaBox.x1 >= cropBox.x1) cropBox.x1 = mediaBox.x1;
- if(mediaBox.y1 >= cropBox.y1) cropBox.y1 = mediaBox.y1;
- if(mediaBox.x2 <= cropBox.x2) cropBox.x2 = mediaBox.x2;
- if(mediaBox.y2 <= cropBox.y2) cropBox.y2 = mediaBox.y2;
- }
-
// other boxes
bleedBox = cropBox;
readBox(dict, "BleedBox", &bleedBox);
GBool PageAttrs::readBox(Dict *dict, char *key, PDFRectangle *box) {
PDFRectangle tmp;
+ double t;
Object obj1, obj2;
GBool ok;
}
obj2.free();
if (ok) {
+ if (tmp.x1 > tmp.x2) {
+ t = tmp.x1; tmp.x1 = tmp.x2; tmp.x2 = t;
+ }
+ if (tmp.y1 > tmp.y2) {
+ t = tmp.y1; tmp.y1 = tmp.y2; tmp.y2 = t;
+ }
*box = tmp;
}
} else {
}
void Page::display(OutputDev *out, double hDPI, double vDPI,
- int rotate, GBool crop,
+ int rotate, GBool useMediaBox, GBool crop,
Links *links, Catalog *catalog,
GBool (*abortCheckCbk)(void *data),
void *abortCheckCbkData) {
- displaySlice(out, hDPI, vDPI, rotate, crop, -1, -1, -1, -1, links, catalog,
+ displaySlice(out, hDPI, vDPI, rotate, useMediaBox, crop,
+ -1, -1, -1, -1, links, catalog,
abortCheckCbk, abortCheckCbkData);
}
void Page::displaySlice(OutputDev *out, double hDPI, double vDPI,
- int rotate, GBool crop,
+ int rotate, GBool useMediaBox, GBool crop,
int sliceX, int sliceY, int sliceW, int sliceH,
Links *links, Catalog *catalog,
GBool (*abortCheckCbk)(void *data),
void *abortCheckCbkData) {
#ifndef PDF_PARSER_ONLY
- PDFRectangle *mediaBox, *cropBox;
+ PDFRectangle *mediaBox, *cropBox, *baseBox;
PDFRectangle box;
Gfx *gfx;
Object obj;
rotate += 360;
}
- mediaBox = getBox();
+ mediaBox = getMediaBox();
+ cropBox = getCropBox();
if (sliceW >= 0 && sliceH >= 0) {
+ baseBox = useMediaBox ? mediaBox : cropBox;
kx = 72.0 / hDPI;
ky = 72.0 / vDPI;
if (rotate == 90) {
if (out->upsideDown()) {
- box.x1 = mediaBox->x1 + ky * sliceY;
- box.x2 = mediaBox->x1 + ky * (sliceY + sliceH);
+ box.x1 = baseBox->x1 + ky * sliceY;
+ box.x2 = baseBox->x1 + ky * (sliceY + sliceH);
} else {
- box.x1 = mediaBox->x2 - ky * (sliceY + sliceH);
- box.x2 = mediaBox->x2 - ky * sliceY;
+ box.x1 = baseBox->x2 - ky * (sliceY + sliceH);
+ box.x2 = baseBox->x2 - ky * sliceY;
}
- box.y1 = mediaBox->y1 + kx * sliceX;
- box.y2 = mediaBox->y1 + kx * (sliceX + sliceW);
+ box.y1 = baseBox->y1 + kx * sliceX;
+ box.y2 = baseBox->y1 + kx * (sliceX + sliceW);
} else if (rotate == 180) {
- box.x1 = mediaBox->x2 - kx * (sliceX + sliceW);
- box.x2 = mediaBox->x2 - kx * sliceX;
+ box.x1 = baseBox->x2 - kx * (sliceX + sliceW);
+ box.x2 = baseBox->x2 - kx * sliceX;
if (out->upsideDown()) {
- box.y1 = mediaBox->y1 + ky * sliceY;
- box.y2 = mediaBox->y1 + ky * (sliceY + sliceH);
+ box.y1 = baseBox->y1 + ky * sliceY;
+ box.y2 = baseBox->y1 + ky * (sliceY + sliceH);
} else {
- box.y1 = mediaBox->y2 - ky * (sliceY + sliceH);
- box.y2 = mediaBox->y2 - ky * sliceY;
+ box.y1 = baseBox->y2 - ky * (sliceY + sliceH);
+ box.y2 = baseBox->y2 - ky * sliceY;
}
} else if (rotate == 270) {
if (out->upsideDown()) {
- box.x1 = mediaBox->x2 - ky * (sliceY + sliceH);
- box.x2 = mediaBox->x2 - ky * sliceY;
+ box.x1 = baseBox->x2 - ky * (sliceY + sliceH);
+ box.x2 = baseBox->x2 - ky * sliceY;
} else {
- box.x1 = mediaBox->x1 + ky * sliceY;
- box.x2 = mediaBox->x1 + ky * (sliceY + sliceH);
+ box.x1 = baseBox->x1 + ky * sliceY;
+ box.x2 = baseBox->x1 + ky * (sliceY + sliceH);
}
- box.y1 = mediaBox->y2 - kx * (sliceX + sliceW);
- box.y2 = mediaBox->y2 - kx * sliceX;
+ box.y1 = baseBox->y2 - kx * (sliceX + sliceW);
+ box.y2 = baseBox->y2 - kx * sliceX;
} else {
- box.x1 = mediaBox->x1 + kx * sliceX;
- box.x2 = mediaBox->x1 + kx * (sliceX + sliceW);
+ box.x1 = baseBox->x1 + kx * sliceX;
+ box.x2 = baseBox->x1 + kx * (sliceX + sliceW);
if (out->upsideDown()) {
- box.y1 = mediaBox->y2 - ky * (sliceY + sliceH);
- box.y2 = mediaBox->y2 - ky * sliceY;
+ box.y1 = baseBox->y2 - ky * (sliceY + sliceH);
+ box.y2 = baseBox->y2 - ky * sliceY;
} else {
- box.y1 = mediaBox->y1 + ky * sliceY;
- box.y2 = mediaBox->y1 + ky * (sliceY + sliceH);
+ box.y1 = baseBox->y1 + ky * sliceY;
+ box.y2 = baseBox->y1 + ky * (sliceY + sliceH);
}
}
- } else {
+ } else if (useMediaBox) {
box = *mediaBox;
+ } else {
+ box = *cropBox;
+ crop = gFalse;
}
- cropBox = getCropBox();
if (globalParams->getPrintCommands()) {
printf("***** MediaBox = ll:%g,%g ur:%g,%g\n",
- box.x1, box.y1, box.x2, box.y2);
- if (isCropped()) {
- printf("***** CropBox = ll:%g,%g ur:%g,%g\n",
- cropBox->x1, cropBox->y1, cropBox->x2, cropBox->y2);
- }
+ mediaBox->x1, mediaBox->y1, mediaBox->x2, mediaBox->y2);
+ printf("***** CropBox = ll:%g,%g ur:%g,%g\n",
+ cropBox->x1, cropBox->y1, cropBox->x2, cropBox->y2);
printf("***** Rotate = %d\n", attrs->getRotate());
}
gfx = new Gfx(xref, out, num, attrs->getResourceDict(),
- hDPI, vDPI, &box, crop && isCropped(), cropBox, rotate,
- abortCheckCbk, abortCheckCbkData);
+ hDPI, vDPI, &box, crop ? cropBox : (PDFRectangle *)NULL,
+ rotate, abortCheckCbk, abortCheckCbkData);
contents.fetch(xref, &obj);
if (!obj.isNull()) {
gfx->saveState();
}
// draw non-link annotations
- annotList = new Annots(xref, annots.fetch(xref, &obj));
+ annotList = new Annots(xref, catalog, annots.fetch(xref, &obj));
obj.free();
if (annotList->getNumAnnots() > 0) {
if (globalParams->getPrintCommands()) {
delete gfx;
#endif
}
+
+void Page::getDefaultCTM(double *ctm, double hDPI, double vDPI,
+ int rotate, GBool upsideDown) {
+ GfxState *state;
+ int i;
+
+ rotate += getRotate();
+ if (rotate >= 360) {
+ rotate -= 360;
+ } else if (rotate < 0) {
+ rotate += 360;
+ }
+ state = new GfxState(hDPI, vDPI, getMediaBox(), rotate, upsideDown);
+ for (i = 0; i < 6; ++i) {
+ ctm[i] = state->getCTM()[i];
+ }
+ delete state;
+}