новые иконки в OpenBoard
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.
 
 
 
 
 
 
OpenBoard/thirdparty/xpdf/xpdf-3.02/xpdf/PDFCore.h

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