You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdegraphics/kpdf/xpdf/xpdf/Page.h

260 lines
7.2 KiB

//========================================================================
//
// Page.h
//
// Copyright 1996-2003 Glyph & Cog, LLC
//
//========================================================================
#ifndef PAGE_H
#define PAGE_H
#include <aconf.h>
#ifdef USE_GCC_PRAGMAS
#pragma interface
#endif
#include "Object.h"
class Dict;
class XRef;
class OutputDev;
class Links;
class Catalog;
//------------------------------------------------------------------------
class PDFRectangle {
public:
double x1, y1, x2, y2;
PDFRectangle() { x1 = y1 = x2 = y2 = 0; }
PDFRectangle(double x1A, double y1A, double x2A, double y2A)
{ x1 = x1A; y1 = y1A; x2 = x2A; y2 = y2A; }
GBool isValid() { return x1 != 0 || y1 != 0 || x2 != 0 || y2 != 0; }
void clipTo(PDFRectangle *rect);
};
//------------------------------------------------------------------------
// PageAttrs
//------------------------------------------------------------------------
class PageAttrs {
public:
// Construct a new PageAttrs object by merging a dictionary
// (of type Pages or Page) into another PageAttrs object. If
// <attrs> is NULL, uses defaults.
PageAttrs(PageAttrs *attrs, Dict *dict);
// Destructor.
~PageAttrs();
// Accessors.
PDFRectangle *getMediaBox() { return &mediaBox; }
PDFRectangle *getCropBox() { return &cropBox; }
GBool isCropped() { return haveCropBox; }
PDFRectangle *getBleedBox() { return &bleedBox; }
PDFRectangle *getTrimBox() { return &trimBox; }
PDFRectangle *getArtBox() { return &artBox; }
int getRotate() { return rotate; }
GString *getLastModified()
{ return lastModified.isString()
? lastModified.getString() : (GString *)NULL; }
Dict *getBoxColorInfo()
{ return boxColorInfo.isDict() ? boxColorInfo.getDict() : (Dict *)NULL; }
Dict *getGroup()
{ return group.isDict() ? group.getDict() : (Dict *)NULL; }
Stream *getMetadata()
{ return metadata.isStream() ? metadata.getStream() : (Stream *)NULL; }
Dict *getPieceInfo()
{ return pieceInfo.isDict() ? pieceInfo.getDict() : (Dict *)NULL; }
Dict *getSeparationInfo()
{ return separationInfo.isDict()
? separationInfo.getDict() : (Dict *)NULL; }
Dict *getResourceDict()
{ return resources.isDict() ? resources.getDict() : (Dict *)NULL; }
private:
GBool readBox(Dict *dict, char *key, PDFRectangle *box);
PDFRectangle mediaBox;
PDFRectangle cropBox;
GBool haveCropBox;
PDFRectangle bleedBox;
PDFRectangle trimBox;
PDFRectangle artBox;
int rotate;
Object lastModified;
Object boxColorInfo;
Object group;
Object metadata;
Object pieceInfo;
Object separationInfo;
Object resources;
};
//------------------------------------------------------------------------
// PageTransition
//------------------------------------------------------------------------
class PageTransition {
public:
enum Type {
Replace,
Split,
Blinds,
Box,
Wipe,
Dissolve,
Glitter,
Fly,
Push,
Cover,
Uncover,
Fade
};
enum Alignment {
Horizontal,
Vertical
};
enum Direction {
Inward,
Outward
};
// Construct a new PageTransition object from a page dictionary.
PageTransition( Dict *dict );
// Destructor
~PageTransition();
// Get type of the transition.
Type getType() const { return type; }
// Get duration of the transition in seconds.
int getDuration() const { return duration; }
// Get dimension in which the transition effect
// occurs.
Alignment getAlignment() const { return alignment; }
// Get direction of motion of the transition effect.
Direction getDirection() const { return direction; }
// Get direction in which the transition effect moves.
int getAngle() const { return angle; }
// Get starting or ending scale.
double getScale() const { return scale; }
// Returns true if the area to be flown is rectangular and
// opaque.
GBool isRectangular() const { return rectangular; }
private:
Type type;
int duration;
Alignment alignment;
Direction direction;
int angle;
double scale;
GBool rectangular;
};
//------------------------------------------------------------------------
// Page
//------------------------------------------------------------------------
class Page {
public:
// Constructor.
Page(XRef *xrefA, int numA, Dict *pageDict, PageAttrs *attrsA);
// Destructor.
~Page();
// Is page valid?
GBool isOk() { return ok; }
// Get page parameters.
int getNum() { return num; }
PDFRectangle *getMediaBox() { return attrs->getMediaBox(); }
PDFRectangle *getCropBox() { return attrs->getCropBox(); }
GBool isCropped() { return attrs->isCropped(); }
double getMediaWidth()
{ return attrs->getMediaBox()->x2 - attrs->getMediaBox()->x1; }
double getMediaHeight()
{ return attrs->getMediaBox()->y2 - attrs->getMediaBox()->y1; }
double getCropWidth()
{ return attrs->getCropBox()->x2 - attrs->getCropBox()->x1; }
double getCropHeight()
{ return attrs->getCropBox()->y2 - attrs->getCropBox()->y1; }
PDFRectangle *getBleedBox() { return attrs->getBleedBox(); }
PDFRectangle *getTrimBox() { return attrs->getTrimBox(); }
PDFRectangle *getArtBox() { return attrs->getArtBox(); }
int getRotate() { return attrs->getRotate(); }
GString *getLastModified() { return attrs->getLastModified(); }
Dict *getBoxColorInfo() { return attrs->getBoxColorInfo(); }
Dict *getGroup() { return attrs->getGroup(); }
Stream *getMetadata() { return attrs->getMetadata(); }
Dict *getPieceInfo() { return attrs->getPieceInfo(); }
Dict *getSeparationInfo() { return attrs->getSeparationInfo(); }
// Get resource dictionary.
Dict *getResourceDict() { return attrs->getResourceDict(); }
// Get annotations array.
Object *getAnnots(Object *obj) { return annots.fetch(xref, obj); }
// Return a list of links.
Links *getLinks(Catalog *catalog);
// Get contents.
Object *getContents(Object *obj) { return contents.fetch(xref, obj); }
// Get transition information.
PageTransition *getTransition() const { return transition; }
// Display a page.
void display(OutputDev *out, double hDPI, double vDPI,
int rotate, GBool useMediaBox, GBool crop,
GBool printing, Catalog *catalog,
GBool (*abortCheckCbk)(void *data) = NULL,
void *abortCheckCbkData = NULL);
// Display part of a page.
void displaySlice(OutputDev *out, double hDPI, double vDPI,
int rotate, GBool useMediaBox, GBool crop,
int sliceX, int sliceY, int sliceW, int sliceH,
GBool printing, Catalog *catalog,
GBool (*abortCheckCbk)(void *data) = NULL,
void *abortCheckCbkData = NULL);
void makeBox(double hDPI, double vDPI, int rotate,
GBool useMediaBox, GBool upsideDown,
double sliceX, double sliceY, double sliceW, double sliceH,
PDFRectangle *box, GBool *crop);
void processLinks(OutputDev *out, Catalog *catalog);
// Get the page's default CTM.
void getDefaultCTM(double *ctm, double hDPI, double vDPI,
int rotate, GBool useMediaBox, GBool upsideDown);
private:
XRef *xref; // the xref table for this PDF file
int num; // page number
PageAttrs *attrs; // page attributes
PageTransition *transition; // page transition
Object annots; // annotations array
Object contents; // page contents
GBool ok; // true if page is valid
};
#endif