Files
Yajbir Singh f1b860b25c
Some checks failed
check / markdownlint (push) Has been cancelled
check / spellchecker (push) Has been cancelled
updated
2025-12-11 19:03:17 +05:30

358 lines
11 KiB
C++

//========================================================================
//
// 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