31
32
//------------------------------------------------------------------------
34
//------------------------------------------------------------------------
36
void PDFRectangle::clipTo(PDFRectangle *rect) {
39
} else if (x1 > rect->x2) {
44
} else if (x2 > rect->x2) {
49
} else if (y1 > rect->y2) {
54
} else if (y2 > rect->y2) {
59
//------------------------------------------------------------------------
33
61
//------------------------------------------------------------------------
75
103
readBox(dict, "ArtBox", &artBox);
105
// clip all other boxes to the media box
106
cropBox.clipTo(&mediaBox);
107
bleedBox.clipTo(&mediaBox);
108
trimBox.clipTo(&mediaBox);
109
artBox.clipTo(&mediaBox);
78
112
dict->lookup("Rotate", &obj1);
79
113
if (obj1.isInt()) {
250
Links *Page::getLinks(Catalog *catalog) {
254
links = new Links(getAnnots(&obj), catalog->getBaseURI());
216
259
void Page::display(OutputDev *out, double hDPI, double vDPI,
217
260
int rotate, GBool useMediaBox, GBool crop,
218
Links *links, Catalog *catalog,
261
GBool printing, Catalog *catalog,
219
262
GBool (*abortCheckCbk)(void *data),
220
263
void *abortCheckCbkData) {
221
264
displaySlice(out, hDPI, vDPI, rotate, useMediaBox, crop,
222
-1, -1, -1, -1, links, catalog,
265
-1, -1, -1, -1, printing, catalog,
223
266
abortCheckCbk, abortCheckCbkData);
226
269
void Page::displaySlice(OutputDev *out, double hDPI, double vDPI,
227
270
int rotate, GBool useMediaBox, GBool crop,
228
271
int sliceX, int sliceY, int sliceW, int sliceH,
229
Links *links, Catalog *catalog,
272
GBool printing, Catalog *catalog,
230
273
GBool (*abortCheckCbk)(void *data),
231
274
void *abortCheckCbkData) {
232
275
#ifndef PDF_PARSER_ONLY
233
PDFRectangle *mediaBox, *cropBox, *baseBox;
276
PDFRectangle *mediaBox, *cropBox;
234
277
PDFRectangle box;
238
280
Annots *annotList;
284
if (!out->checkPageSlice(this, hDPI, vDPI, rotate, useMediaBox, crop,
285
sliceX, sliceY, sliceW, sliceH,
287
abortCheckCbk, abortCheckCbkData)) {
242
291
rotate += getRotate();
243
292
if (rotate >= 360) {
249
mediaBox = getMediaBox();
298
makeBox(hDPI, vDPI, rotate, useMediaBox, out->upsideDown(),
299
sliceX, sliceY, sliceW, sliceH, &box, &crop);
250
300
cropBox = getCropBox();
251
if (sliceW >= 0 && sliceH >= 0) {
252
baseBox = useMediaBox ? mediaBox : cropBox;
256
if (out->upsideDown()) {
257
box.x1 = baseBox->x1 + ky * sliceY;
258
box.x2 = baseBox->x1 + ky * (sliceY + sliceH);
260
box.x1 = baseBox->x2 - ky * (sliceY + sliceH);
261
box.x2 = baseBox->x2 - ky * sliceY;
263
box.y1 = baseBox->y1 + kx * sliceX;
264
box.y2 = baseBox->y1 + kx * (sliceX + sliceW);
265
} else if (rotate == 180) {
266
box.x1 = baseBox->x2 - kx * (sliceX + sliceW);
267
box.x2 = baseBox->x2 - kx * sliceX;
268
if (out->upsideDown()) {
269
box.y1 = baseBox->y1 + ky * sliceY;
270
box.y2 = baseBox->y1 + ky * (sliceY + sliceH);
272
box.y1 = baseBox->y2 - ky * (sliceY + sliceH);
273
box.y2 = baseBox->y2 - ky * sliceY;
275
} else if (rotate == 270) {
276
if (out->upsideDown()) {
277
box.x1 = baseBox->x2 - ky * (sliceY + sliceH);
278
box.x2 = baseBox->x2 - ky * sliceY;
280
box.x1 = baseBox->x1 + ky * sliceY;
281
box.x2 = baseBox->x1 + ky * (sliceY + sliceH);
283
box.y1 = baseBox->y2 - kx * (sliceX + sliceW);
284
box.y2 = baseBox->y2 - kx * sliceX;
286
box.x1 = baseBox->x1 + kx * sliceX;
287
box.x2 = baseBox->x1 + kx * (sliceX + sliceW);
288
if (out->upsideDown()) {
289
box.y1 = baseBox->y2 - ky * (sliceY + sliceH);
290
box.y2 = baseBox->y2 - ky * sliceY;
292
box.y1 = baseBox->y1 + ky * sliceY;
293
box.y2 = baseBox->y1 + ky * (sliceY + sliceH);
296
} else if (useMediaBox) {
303
302
if (globalParams->getPrintCommands()) {
303
mediaBox = getMediaBox();
304
304
printf("***** MediaBox = ll:%g,%g ur:%g,%g\n",
305
305
mediaBox->x1, mediaBox->y1, mediaBox->x2, mediaBox->y2);
306
306
printf("***** CropBox = ll:%g,%g ur:%g,%g\n",
325
for (i = 0; i < links->getNumLinks(); ++i) {
326
link = links->getLink(i);
327
out->drawLink(link, catalog);
323
annotList = new Annots(xref, catalog, getAnnots(&obj));
325
acroForm = catalog->getAcroForm()->isDict() ?
326
catalog->getAcroForm()->getDict() : NULL;
328
if (acroForm->lookup("NeedAppearances", &obj)) {
329
if (obj.isBool() && obj.getBool()) {
330
annotList->generateAppearances(acroForm);
333
// draw non-link annotations
334
annotList = new Annots(xref, catalog, annots.fetch(xref, &obj));
336
335
if (annotList->getNumAnnots() > 0) {
337
336
if (globalParams->getPrintCommands()) {
338
337
printf("***** Annotations\n");
340
339
for (i = 0; i < annotList->getNumAnnots(); ++i) {
341
annotList->getAnnot(i)->draw(gfx);
340
annotList->getAnnot(i)->draw(gfx, printing);
350
void Page::makeBox(double hDPI, double vDPI, int rotate,
351
GBool useMediaBox, GBool upsideDown,
352
double sliceX, double sliceY, double sliceW, double sliceH,
353
PDFRectangle *box, GBool *crop) {
354
PDFRectangle *mediaBox, *cropBox, *baseBox;
357
mediaBox = getMediaBox();
358
cropBox = getCropBox();
359
if (sliceW >= 0 && sliceH >= 0) {
360
baseBox = useMediaBox ? mediaBox : cropBox;
365
box->x1 = baseBox->x1 + ky * sliceY;
366
box->x2 = baseBox->x1 + ky * (sliceY + sliceH);
368
box->x1 = baseBox->x2 - ky * (sliceY + sliceH);
369
box->x2 = baseBox->x2 - ky * sliceY;
371
box->y1 = baseBox->y1 + kx * sliceX;
372
box->y2 = baseBox->y1 + kx * (sliceX + sliceW);
373
} else if (rotate == 180) {
374
box->x1 = baseBox->x2 - kx * (sliceX + sliceW);
375
box->x2 = baseBox->x2 - kx * sliceX;
377
box->y1 = baseBox->y1 + ky * sliceY;
378
box->y2 = baseBox->y1 + ky * (sliceY + sliceH);
380
box->y1 = baseBox->y2 - ky * (sliceY + sliceH);
381
box->y2 = baseBox->y2 - ky * sliceY;
383
} else if (rotate == 270) {
385
box->x1 = baseBox->x2 - ky * (sliceY + sliceH);
386
box->x2 = baseBox->x2 - ky * sliceY;
388
box->x1 = baseBox->x1 + ky * sliceY;
389
box->x2 = baseBox->x1 + ky * (sliceY + sliceH);
391
box->y1 = baseBox->y2 - kx * (sliceX + sliceW);
392
box->y2 = baseBox->y2 - kx * sliceX;
394
box->x1 = baseBox->x1 + kx * sliceX;
395
box->x2 = baseBox->x1 + kx * (sliceX + sliceW);
397
box->y1 = baseBox->y2 - ky * (sliceY + sliceH);
398
box->y2 = baseBox->y2 - ky * sliceY;
400
box->y1 = baseBox->y1 + ky * sliceY;
401
box->y2 = baseBox->y1 + ky * (sliceY + sliceH);
404
} else if (useMediaBox) {
412
void Page::processLinks(OutputDev *out, Catalog *catalog) {
416
links = getLinks(catalog);
417
for (i = 0; i < links->getNumLinks(); ++i) {
418
out->processLink(links->getLink(i), catalog);
351
423
void Page::getDefaultCTM(double *ctm, double hDPI, double vDPI,
352
int rotate, GBool upsideDown) {
424
int rotate, GBool useMediaBox, GBool upsideDown) {
359
431
} else if (rotate < 0) {
362
state = new GfxState(hDPI, vDPI, getMediaBox(), rotate, upsideDown);
434
state = new GfxState(hDPI, vDPI,
435
useMediaBox ? getMediaBox() : getCropBox(),
363
437
for (i = 0; i < 6; ++i) {
364
438
ctm[i] = state->getCTM()[i];