aboutsummaryrefslogtreecommitdiff
path: root/xpdf/PDFCore.h
diff options
context:
space:
mode:
Diffstat (limited to 'xpdf/PDFCore.h')
-rw-r--r--xpdf/PDFCore.h357
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