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.
321 lines
10 KiB
321 lines
10 KiB
//========================================================================
|
|
//
|
|
// PDFCore.h
|
|
//
|
|
// Copyright 2004 Glyph & Cog, LLC
|
|
//
|
|
//========================================================================
|
|
|
|
#ifndef PDFCORE_H
|
|
#define PDFCORE_H
|
|
|
|
#include <aconf.h>
|
|
|
|
#ifdef USE_GCC_PRAGMAS
|
|
#pragma interface
|
|
#endif
|
|
|
|
#include <stdlib.h>
|
|
#include "SplashTypes.h"
|
|
#include "CharTypes.h"
|
|
|
|
class GString;
|
|
class GList;
|
|
class SplashBitmap;
|
|
class SplashPattern;
|
|
class BaseStream;
|
|
class PDFDoc;
|
|
class Links;
|
|
class LinkDest;
|
|
class LinkAction;
|
|
class TextPage;
|
|
class HighlightFile;
|
|
class CoreOutputDev;
|
|
class PDFCore;
|
|
|
|
//------------------------------------------------------------------------
|
|
// zoom factor
|
|
//------------------------------------------------------------------------
|
|
|
|
#define zoomPage -1
|
|
#define zoomWidth -2
|
|
#define defZoom 125
|
|
|
|
//------------------------------------------------------------------------
|
|
|
|
|
|
//------------------------------------------------------------------------
|
|
|
|
// Number of pixels of matte color between pages in continuous mode.
|
|
#define continuousModePageSpacing 3
|
|
|
|
//------------------------------------------------------------------------
|
|
// PDFCorePage
|
|
//------------------------------------------------------------------------
|
|
|
|
class PDFCorePage {
|
|
public:
|
|
|
|
PDFCorePage(int pageA, int wA, int hA, int tileWA, int tileHA);
|
|
~PDFCorePage();
|
|
|
|
int page;
|
|
GList *tiles; // cached tiles [PDFCoreTile]
|
|
int xDest, yDest; // position of upper-left corner
|
|
// in the drawing area
|
|
int w, h; // size of whole page bitmap
|
|
int tileW, tileH; // size of tiles
|
|
Links *links; // hyperlinks for this page
|
|
TextPage *text; // extracted text
|
|
};
|
|
|
|
//------------------------------------------------------------------------
|
|
// PDFCoreTile
|
|
//------------------------------------------------------------------------
|
|
|
|
class PDFCoreTile {
|
|
public:
|
|
|
|
PDFCoreTile(int xDestA, int yDestA);
|
|
virtual ~PDFCoreTile();
|
|
|
|
int xMin, yMin, xMax, yMax;
|
|
int xDest, yDest;
|
|
Guint edges;
|
|
SplashBitmap *bitmap;
|
|
double ctm[6]; // coordinate transform matrix:
|
|
// default user space -> device space
|
|
double ictm[6]; // inverse CTM
|
|
};
|
|
|
|
#define pdfCoreTileTopEdge 0x01
|
|
#define pdfCoreTileBottomEdge 0x02
|
|
#define pdfCoreTileLeftEdge 0x04
|
|
#define pdfCoreTileRightEdge 0x08
|
|
#define pdfCoreTileTopSpace 0x10
|
|
#define pdfCoreTileBottomSpace 0x20
|
|
|
|
//------------------------------------------------------------------------
|
|
// PDFHistory
|
|
//------------------------------------------------------------------------
|
|
|
|
struct PDFHistory {
|
|
GString *fileName;
|
|
int page;
|
|
};
|
|
|
|
#define pdfHistorySize 50
|
|
|
|
|
|
//------------------------------------------------------------------------
|
|
// PDFCore
|
|
//------------------------------------------------------------------------
|
|
|
|
class PDFCore {
|
|
public:
|
|
|
|
PDFCore(SplashColorMode colorModeA, int bitmapRowPadA,
|
|
GBool reverseVideoA, SplashColorPtr paperColorA,
|
|
GBool incrementalUpdate);
|
|
virtual ~PDFCore();
|
|
|
|
//----- loadFile / displayPage / displayDest
|
|
|
|
// Load a new file. Returns pdfOk or error code.
|
|
virtual int loadFile(GString *fileName, GString *ownerPassword = NULL,
|
|
GString *userPassword = NULL);
|
|
|
|
#ifdef WIN32
|
|
// Load a new file. Returns pdfOk or error code.
|
|
virtual int loadFile(wchar_t *fileName, int fileNameLen,
|
|
GString *ownerPassword = NULL,
|
|
GString *userPassword = NULL);
|
|
#endif
|
|
|
|
// Load a new file, via a Stream instead of a file name. Returns
|
|
// pdfOk or error code.
|
|
virtual int loadFile(BaseStream *stream, GString *ownerPassword = NULL,
|
|
GString *userPassword = NULL);
|
|
|
|
// Load an already-created PDFDoc object.
|
|
virtual void loadDoc(PDFDoc *docA);
|
|
|
|
// Clear out the current document, if any.
|
|
virtual void clear();
|
|
|
|
// Same as clear(), but returns the PDFDoc object instead of
|
|
// deleting it.
|
|
virtual PDFDoc *takeDoc(GBool redraw);
|
|
|
|
// Display (or redisplay) the specified page. If <scrollToTop> is
|
|
// set, the window is vertically scrolled to the top; otherwise, no
|
|
// scrolling is done. If <addToHist> is set, this page change is
|
|
// added to the history list.
|
|
virtual void displayPage(int topPageA, double zoomA, int rotateA,
|
|
GBool scrollToTop, GBool addToHist);
|
|
|
|
// Display a link destination.
|
|
virtual void displayDest(LinkDest *dest, double zoomA, int rotateA,
|
|
GBool addToHist);
|
|
|
|
// Update the display, given the specified parameters.
|
|
virtual void update(int topPageA, int scrollXA, int scrollYA,
|
|
double zoomA, int rotateA, GBool force, GBool addToHist);
|
|
|
|
//----- page/position changes
|
|
|
|
virtual GBool gotoNextPage(int inc, GBool top);
|
|
virtual GBool gotoPrevPage(int dec, GBool top, GBool bottom);
|
|
virtual GBool gotoNamedDestination(GString *dest);
|
|
virtual GBool goForward();
|
|
virtual GBool goBackward();
|
|
virtual void scrollLeft(int nCols = 16);
|
|
virtual void scrollRight(int nCols = 16);
|
|
virtual void scrollUp(int nLines = 16);
|
|
virtual void scrollUpPrevPage(int nLines = 16);
|
|
virtual void scrollDown(int nLines = 16);
|
|
virtual void scrollDownNextPage(int nLines = 16);
|
|
virtual void scrollPageUp();
|
|
virtual void scrollPageDown();
|
|
virtual void scrollTo(int x, int y);
|
|
virtual void scrollToLeftEdge();
|
|
virtual void scrollToRightEdge();
|
|
virtual void scrollToTopEdge();
|
|
virtual void scrollToBottomEdge();
|
|
virtual void scrollToTopLeft();
|
|
virtual void scrollToBottomRight();
|
|
virtual void zoomToRect(int pg, double ulx, double uly,
|
|
double lrx, double lry);
|
|
virtual void zoomCentered(double zoomA);
|
|
virtual void zoomToCurrentWidth();
|
|
virtual void setContinuousMode(GBool cm);
|
|
|
|
//----- selection
|
|
|
|
// Current selected region.
|
|
void setSelection(int newSelectPage,
|
|
int newSelectULX, int newSelectULY,
|
|
int newSelectLRX, int newSelectLRY);
|
|
void moveSelection(int pg, int x, int y);
|
|
GBool getSelection(int *pg, double *ulx, double *uly,
|
|
double *lrx, double *lry);
|
|
|
|
// Text extraction.
|
|
GString *extractText(int pg, double xMin, double yMin,
|
|
double xMax, double yMax);
|
|
|
|
//----- find
|
|
|
|
virtual GBool find(char *s, GBool caseSensitive, GBool next, GBool backward,
|
|
GBool onePageOnly);
|
|
virtual GBool findU(Unicode *u, int len, GBool caseSensitive,
|
|
GBool next, GBool backward, GBool onePageOnly);
|
|
|
|
|
|
//----- coordinate conversion
|
|
|
|
// user space: per-pace, as defined by PDF file; unit = point
|
|
// device space: (0,0) is upper-left corner of a page; unit = pixel
|
|
// window space: (0,0) is upper-left corner of drawing area; unit = pixel
|
|
|
|
GBool cvtWindowToUser(int xw, int yw, int *pg, double *xu, double *yu);
|
|
GBool cvtWindowToDev(int xw, int yw, int *pg, int *xd, int *yd);
|
|
void cvtUserToWindow(int pg, double xy, double yu, int *xw, int *yw);
|
|
void cvtUserToDev(int pg, double xu, double yu, int *xd, int *yd);
|
|
void cvtDevToWindow(int pg, int xd, int yd, int *xw, int *yw);
|
|
void cvtDevToUser(int pg, int xd, int yd, double *xu, double *yu);
|
|
|
|
//----- misc access
|
|
|
|
PDFDoc *getDoc() { return doc; }
|
|
int getPageNum() { return topPage; }
|
|
double getZoom() { return zoom; }
|
|
double getZoomDPI() { return dpi; }
|
|
int getRotate() { return rotate; }
|
|
GBool getContinuousMode() { return continuousMode; }
|
|
virtual void setReverseVideo(GBool reverseVideoA);
|
|
GBool canGoBack() { return historyBLen > 1; }
|
|
GBool canGoForward() { return historyFLen > 0; }
|
|
int getScrollX() { return scrollX; }
|
|
int getScrollY() { return scrollY; }
|
|
int getDrawAreaWidth() { return drawAreaWidth; }
|
|
int getDrawAreaHeight() { return drawAreaHeight; }
|
|
virtual void setBusyCursor(GBool busy) = 0;
|
|
LinkAction *findLink(int pg, double x, double y);
|
|
|
|
protected:
|
|
|
|
int loadFile2(PDFDoc *newDoc);
|
|
void addPage(int pg, int rot);
|
|
void needTile(PDFCorePage *page, int x, int y);
|
|
void xorRectangle(int pg, int x0, int y0, int x1, int y1,
|
|
SplashPattern *pattern, PDFCoreTile *oneTile = NULL);
|
|
int loadHighlightFile(HighlightFile *hf, SplashColorPtr color,
|
|
SplashColorPtr selectColor, GBool selectable);
|
|
PDFCorePage *findPage(int pg);
|
|
static void redrawCbk(void *data, int x0, int y0, int x1, int y1,
|
|
GBool composited);
|
|
void redrawWindow(int x, int y, int width, int height,
|
|
GBool needUpdate);
|
|
virtual PDFCoreTile *newTile(int xDestA, int yDestA);
|
|
virtual void updateTileData(PDFCoreTile *tileA, int xSrc, int ySrc,
|
|
int width, int height, GBool composited);
|
|
virtual void redrawRect(PDFCoreTile *tileA, int xSrc, int ySrc,
|
|
int xDest, int yDest, int width, int height,
|
|
GBool composited) = 0;
|
|
void clippedRedrawRect(PDFCoreTile *tile, int xSrc, int ySrc,
|
|
int xDest, int yDest, int width, int height,
|
|
int xClip, int yClip, int wClip, int hClip,
|
|
GBool needUpdate, GBool composited = gTrue);
|
|
virtual void updateScrollbars() = 0;
|
|
virtual GBool checkForNewFile() { return gFalse; }
|
|
|
|
PDFDoc *doc; // current PDF file
|
|
GBool continuousMode; // false for single-page mode, true for
|
|
// continuous mode
|
|
int drawAreaWidth, // size of the PDF display area
|
|
drawAreaHeight;
|
|
double maxUnscaledPageW, // maximum unscaled page size
|
|
maxUnscaledPageH;
|
|
int maxPageW; // maximum page width (only used in
|
|
// continuous mode)
|
|
int totalDocH; // total document height (only used in
|
|
// continuous mode)
|
|
int *pageY; // top coordinates for each page (only used
|
|
// in continuous mode)
|
|
int topPage; // page at top of window
|
|
int scrollX, scrollY; // offset from top left corner of topPage
|
|
// to top left corner of window
|
|
double zoom; // current zoom level, in percent of 72 dpi
|
|
double dpi; // current zoom level, in DPI
|
|
int rotate; // current page rotation
|
|
|
|
int selectPage; // page number of current selection
|
|
int selectULX, // coordinates of current selection,
|
|
selectULY, // in device space -- (ULX==LRX || ULY==LRY)
|
|
selectLRX, // means there is no selection
|
|
selectLRY;
|
|
GBool dragging; // set while selection is being dragged
|
|
GBool lastDragLeft; // last dragged selection edge was left/right
|
|
GBool lastDragTop; // last dragged selection edge was top/bottom
|
|
|
|
PDFHistory // page history queue
|
|
history[pdfHistorySize];
|
|
int historyCur; // currently displayed page
|
|
int historyBLen; // number of valid entries backward from
|
|
// current entry
|
|
int historyFLen; // number of valid entries forward from
|
|
// current entry
|
|
|
|
|
|
GList *pages; // cached pages [PDFCorePage]
|
|
PDFCoreTile *curTile; // tile currently being rasterized
|
|
PDFCorePage *curPage; // page to which curTile belongs
|
|
|
|
SplashColor paperColor;
|
|
CoreOutputDev *out;
|
|
|
|
friend class PDFCoreTile;
|
|
};
|
|
|
|
#endif
|
|
|