diff options
Diffstat (limited to 'xpdf/PDFCore.h')
-rw-r--r-- | xpdf/PDFCore.h | 357 |
1 files changed, 357 insertions, 0 deletions
diff --git a/xpdf/PDFCore.h b/xpdf/PDFCore.h new file mode 100644 index 0000000..accf19d --- /dev/null +++ b/xpdf/PDFCore.h @@ -0,0 +1,357 @@ +//======================================================================== +// +// PDFCore.h +// +// Copyright 2004-2014 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" +#include "DisplayState.h" +#include "TextOutputDev.h" + +class GString; +class GList; +class SplashBitmap; +class SplashPattern; +class BaseStream; +class PDFDoc; +class Links; +class LinkDest; +class LinkAction; +class Annot; +class Annots; +class AcroFormField; +class TextPage; +class HighlightFile; +class OptionalContentGroup; +class TileMap; +class TileCache; +class TileCompositor; +class PDFCore; + +//------------------------------------------------------------------------ +// PDFHistory +//------------------------------------------------------------------------ + +struct PDFHistory { +#ifdef _WIN32 + wchar_t *fileName; +#else + GString *fileName; +#endif + int page; +}; + +#define pdfHistorySize 50 + +//------------------------------------------------------------------------ +// SelectMode +//------------------------------------------------------------------------ + +enum SelectMode { + selectModeBlock, + selectModeLinear +}; + +//------------------------------------------------------------------------ +// FindResult +//------------------------------------------------------------------------ + +struct FindResult { + FindResult(int pageA, double xMinA, double yMinA, double xMaxA, double yMaxA) + : page(pageA), xMin(xMinA), yMin(yMinA), xMax(xMaxA), yMax(yMaxA) {} + int page; + double xMin, yMin, xMax, yMax; +}; + +//------------------------------------------------------------------------ +// PDFCore +//------------------------------------------------------------------------ + +class PDFCore { +public: + + PDFCore(SplashColorMode colorMode, int bitmapRowPad, + GBool reverseVideo, SplashColorPtr paperColor); + 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); + + // Reload the current file. This only works if the PDF was loaded + // via a file. Returns pdfOk or error code. + virtual int reload(); + + // 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; if + // <scrollToBottom> is set, the window is vertically scrolled to the + // bottom; otherwise, no scrolling is done. If <addToHist> is set, + // this page change is added to the history list. + virtual void displayPage(int page, GBool scrollToTop, + GBool scrollToBottom, GBool addToHist = gTrue); + + // Display a link destination. + virtual void displayDest(LinkDest *dest); + + // Called before any update is started. + virtual void startUpdate(); + + // Called after any update is complete. Subclasses can check for + // changes in the display parameters here. + virtual void finishUpdate(GBool addToHist, GBool checkForChangedFile); + + //----- 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, GBool snapToPage = gFalse); + virtual void scrollUpPrevPage(int nLines = 16); + virtual void scrollDown(int nLines = 16, GBool snapToPage = gFalse); + virtual void scrollDownNextPage(int nLines = 16); + virtual void scrollPageUp(); + virtual void scrollPageDown(); + virtual void scrollTo(int x, int y, GBool snapToPage = gFalse); + virtual void scrollToLeftEdge(); + virtual void scrollToRightEdge(); + virtual void scrollToTopEdge(); + virtual void scrollToBottomEdge(); + virtual void scrollToTopLeft(); + virtual void scrollToBottomRight(); + // Scroll so that (page, x, y) is centered in the window. + virtual void scrollToCentered(int page, double x, double y); + virtual void setZoom(double zoom); + virtual void zoomToRect(int page, double ulx, double uly, + double lrx, double lry); + virtual void zoomCentered(double zoom); + virtual void zoomToCurrentWidth(); + virtual void setRotate(int rotate); + virtual void setDisplayMode(DisplayMode mode); + virtual void setOCGState(OptionalContentGroup *ocg, GBool ocgState); + + //----- selection + + // Selection mode. + SelectMode getSelectMode() { return selectMode; } + void setSelectMode(SelectMode mode); + + // Selection color. + SplashColorPtr getSelectionColor(); + void setSelectionColor(SplashColor color); + + // Modify the selection. These functions use device coordinates. + void setSelection(int page, int x0, int y0, int x1, int y1); + void setLinearSelection(int page, TextPosition *pos0, TextPosition *pos1); + void clearSelection(); + void startSelectionDrag(int pg, int x, int y); + void moveSelectionDrag(int pg, int x, int y); + void finishSelectionDrag(); + void selectWord(int pg, int x, int y); + void selectLine(int pg, int x, int y); + + // Retrieve the current selection. This function uses user + // coordinates. Returns false if there is no selection. + GBool getSelection(int *pg, double *ulx, double *uly, + double *lrx, double *lry); + GBool hasSelection(); + + // Text extraction. + void setTextExtractionMode(TextOutputMode mode); + GBool getDiscardDiagonalText(); + void setDiscardDiagonalText(GBool discard); + GString *extractText(int pg, double xMin, double yMin, + double xMax, double yMax); + GString *getSelectedText(); + + //----- find + + virtual GBool find(char *s, GBool caseSensitive, GBool next, GBool backward, + GBool wholeWord, GBool onePageOnly); + virtual GBool findU(Unicode *u, int len, GBool caseSensitive, + GBool next, GBool backward, GBool wholeWord, + GBool onePageOnly); + GList *findAll(Unicode *u, int len, GBool caseSensitive, + GBool wholeWord, int firstPage, int lastPage); + + + //----- coordinate conversion + + // user space: per-page, 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); + GBool cvtUserToWindow(int pg, double xy, double yu, int *xw, int *yw); + void cvtUserToDev(int pg, double xu, double yu, int *xd, int *yd); + GBool cvtDevToWindow(int pg, int xd, int yd, int *xw, int *yw); + void cvtDevToUser(int pg, int xd, int yd, double *xu, double *yu); + void getWindowPageRange(int x, int y, int w, int h, + int *firstPage, int *lastPage); + + //----- password dialog + + virtual GString *getPassword() { return NULL; } + + //----- misc access + + PDFDoc *getDoc() { return doc; } + int getPageNum(); + int getMidPageNum(); + double getZoom(); + double getZoomDPI(int page); + int getRotate(); + DisplayMode getDisplayMode(); + virtual void setPaperColor(SplashColorPtr paperColor); + virtual void setMatteColor(SplashColorPtr matteColor); + virtual void setReverseVideo(GBool reverseVideo); + GBool canGoBack() { return historyBLen > 1; } + GBool canGoForward() { return historyFLen > 0; } + int getScrollX(); + int getScrollY(); + int getWindowWidth(); + int getWindowHeight(); + virtual void setBusyCursor(GBool busy) = 0; + LinkAction *findLink(int pg, double x, double y); + Annot *findAnnot(int pg, double x, double y); + int findAnnotIdx(int pg, double x, double y); + Annot *getAnnot(int idx); + AcroFormField *findFormField(int pg, double x, double y); + int findFormFieldIdx(int pg, double x, double y); + AcroFormField *getFormField(int idx); + GBool overText(int pg, double x, double y); + void forceRedraw(); + void setTileDoneCbk(void (*cbk)(void *data), void *data); + +protected: + + //--- calls from PDFCore subclass + + // Set the window size (when the window is resized). + void setWindowSize(int winWidthA, int winHeightA); + + // Get the current window bitmap. If <wholeWindow> is true, the + // full window is being redrawn -- this is used to end incremental + // updates when the rasterization is done. + SplashBitmap *getWindowBitmap(GBool wholeWindow); + + // Returns true if the last call to getWindowBitmap() returned a + // finished bitmap; or false if the bitmap was still being + // rasterized. + GBool isBitmapFinished() { return bitmapFinished; } + + // This should be called periodically (typically every ~0.1 seconds) + // to do incremental updates. If an update is required, it will + // trigger a call to invalidate(). + virtual void tick(); + + //--- callbacks to PDFCore subclass + + // Invalidate the specified rectangle (in window coordinates). + virtual void invalidate(int x, int y, int w, int h) = 0; + + // Update the scrollbars. + virtual void updateScrollbars() = 0; + + // This returns true if the PDF file has changed on disk (if it can + // be checked). + virtual GBool checkForNewFile() { return gFalse; } + + // This is called just before a PDF file is loaded. + virtual void preLoad() {} + + // This is called just after a PDF file is loaded. + virtual void postLoad() {} + + //--- internal + + int loadFile2(PDFDoc *newDoc); + void addToHistory(); + void clearPage(); + void loadLinks(int pg); + void loadAnnots(int pg); + void loadText(int pg); + void getSelectionBBox(int *wxMin, int *wyMin, int *wxMax, int *wyMax); + void getSelectRectListBBox(GList *rects, int *wxMin, int *wyMin, + int *wxMax, int *wyMax); + void checkInvalidate(int x, int y, int w, int h); + void invalidateWholeWindow(); + + PDFDoc *doc; + + int linksPage; // cached links for one page + Links *links; + + int annotsPage; // cached annotations for one page + Annots *annots; + + int textPage; // cached extracted text for one page + double textDPI; + int textRotate; + TextOutputControl textOutCtrl; + TextPage *text; + + DisplayState *state; + TileMap *tileMap; + TileCache *tileCache; + TileCompositor *tileCompositor; + GBool bitmapFinished; + + SelectMode selectMode; + int selectPage; // page of current selection + int selectStartX, // for block mode: start point of current + selectStartY; // selection, in device coords + TextPosition selectStartPos; // for linear mode: start position of + // current selection + + 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 +}; + +#endif |