home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Enigma Amiga Life 110
/
EnigmaAmiga110CD.iso
/
indispensabili
/
utility
/
apdf
/
xpdf-0.80
/
xpdf
/
xoutputdev.h
< prev
next >
Wrap
C/C++ Source or Header
|
1998-11-27
|
9KB
|
285 lines
//========================================================================
//
// XOutputDev.h
//
// Copyright 1996 Derek B. Noonburg
//
//========================================================================
#ifndef XOUTPUTDEV_H
#define XOUTPUTDEV_H
#ifdef __GNUC__
#pragma interface
#endif
#include <stddef.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include "config.h"
#include "OutputDev.h"
class GString;
class GfxColor;
class GfxFont;
class GfxSubpath;
class TextPage;
struct RGBColor;
//------------------------------------------------------------------------
// Constants
//------------------------------------------------------------------------
#define maxRGBCube 8 // max size of RGB color cube
#define numTmpPoints 256 // number of XPoints in temporary array
#define numTmpSubpaths 16 // number of elements in temporary arrays
// for fill/clip
//------------------------------------------------------------------------
// Misc types
//------------------------------------------------------------------------
struct BoundingRect {
short xMin, xMax; // min/max x values
short yMin, yMax; // min/max y values
};
struct RGBColor {
double r, g, b;
};
//------------------------------------------------------------------------
// Parameters
//------------------------------------------------------------------------
// Install a private colormap.
extern GBool installCmap;
// Size of RGB color cube.
extern int rgbCubeSize;
//------------------------------------------------------------------------
// XOutputFont
//------------------------------------------------------------------------
class XOutputFont {
public:
// Constructor.
XOutputFont(GfxFont *gfxFont, double m11, double m12,
double m21, double m22, Display *display1);
// Destructor.
~XOutputFont();
// Does this font match the ID, size, and angle?
GBool matches(Ref id1, double m11, double m12, double m21, double m22)
{ return id.num == id1.num && id.gen == id1.gen &&
mat11 == m11 && mat12 == m12 && mat21 == m21 && mat22 == m22; }
// Get X font.
XFontStruct *getXFont() { return xFont; }
// Get character mapping.
Gushort mapChar(Guchar c) { return map[c]; }
// Reverse map a character.
Guchar revMapChar(Gushort c) { return revMap[c]; }
// Does this font use hex char codes?
GBool isHex() { return hex; }
private:
Ref id;
double mat11, mat12, mat21, mat22;
Display *display;
XFontStruct *xFont;
GBool hex; // subsetted font with hex char codes
Gushort map[256];
Guchar revMap[256];
};
//------------------------------------------------------------------------
// XOutputFontCache
//------------------------------------------------------------------------
class XOutputFontCache {
public:
// Constructor.
XOutputFontCache(Display *display1);
// Destructor.
~XOutputFontCache();
// Get a font. This creates a new font if necessary.
XOutputFont *getFont(GfxFont *gfxFont, double m11, double m12,
double m21, double m22);
private:
Display *display; // X display pointer
XOutputFont * // fonts in reverse-LRU order
fonts[fontCacheSize];
int numFonts; // number of valid entries
};
//------------------------------------------------------------------------
// XOutputState
//------------------------------------------------------------------------
struct XOutputState {
GC strokeGC;
GC fillGC;
Region clipRegion;
XOutputState *next;
};
//------------------------------------------------------------------------
// XOutputDev
//------------------------------------------------------------------------
class XOutputDev: public OutputDev {
public:
// Constructor.
XOutputDev(Display *display1, Pixmap pixmap1, Guint depth1,
Colormap colormap, unsigned long paperColor);
// Destructor.
virtual ~XOutputDev();
//---- get info about output device
// Does this device use upside-down coordinates?
// (Upside-down means (0,0) is the top left corner of the page.)
virtual GBool upsideDown() { return gTrue; }
// Does this device use drawChar() or drawString()?
virtual GBool useDrawChar() { return gTrue; }
//----- initialization and control
// Start a page.
virtual void startPage(int pageNum, GfxState *state);
// End a page.
virtual void endPage();
//----- link borders
virtual void drawLinkBorder(double x1, double y1, double x2, double y2,
double w);
//----- save/restore graphics state
virtual void saveState(GfxState *state);
virtual void restoreState(GfxState *state);
//----- update graphics state
virtual void updateAll(GfxState *state);
virtual void updateCTM(GfxState *state, double m11, double m12,
double m21, double m22, double m31, double m32);
virtual void updateLineDash(GfxState *state);
virtual void updateFlatness(GfxState *state);
virtual void updateLineJoin(GfxState *state);
virtual void updateLineCap(GfxState *state);
virtual void updateMiterLimit(GfxState *state);
virtual void updateLineWidth(GfxState *state);
virtual void updateFillColor(GfxState *state);
virtual void updateStrokeColor(GfxState *state);
//----- update text state
virtual void updateFont(GfxState *state);
//----- path painting
virtual void stroke(GfxState *state);
virtual void fill(GfxState *state);
virtual void eoFill(GfxState *state);
//----- path clipping
virtual void clip(GfxState *state);
virtual void eoClip(GfxState *state);
//----- text drawing
virtual void beginString(GfxState *state, GString *s);
virtual void endString(GfxState *state);
virtual void drawChar(GfxState *state, double x, double y,
double dx, double dy, Guchar c);
virtual void drawChar16(GfxState *state, double x, double y,
double dx, double dy, int c);
//----- image drawing
virtual void drawImageMask(GfxState *state, Stream *str,
int width, int height, GBool invert,
GBool inlineImg);
virtual void drawImage(GfxState *state, Stream *str, int width,
int height, GfxImageColorMap *colorMap,
GBool inlineImg);
//----- special access
// Find a string. If <top> is true, starts looking at <xMin>,<yMin>;
// otherwise starts looking at top of page. If <bottom> is true,
// stops looking at <xMax>,<yMax>; otherwise stops looking at bottom
// of page. If found, sets the text bounding rectange and returns
// true; otherwise returns false.
GBool findText(char *s, GBool top, GBool bottom,
int *xMin, int *yMin, int *xMax, int *yMax);
// Get the text which is inside the specified rectangle.
GString *getText(int xMin, int yMin, int xMax, int yMax);
protected:
// Update pixmap ID after a page change.
void setPixmap(Pixmap pixmap1, int pixmapW1, int pixmapH1)
{ pixmap = pixmap1; pixmapW = pixmapW1; pixmapH = pixmapH1; }
private:
Display *display; // X display pointer
int screenNum; // X screen number
Pixmap pixmap; // pixmap to draw into
int pixmapW, pixmapH; // size of pixmap
Guint depth; // pixmap depth
int flatness; // line flatness
GC paperGC; // GC for background
GC strokeGC; // GC with stroke color
GC fillGC; // GC with fill color
Region clipRegion; // clipping region
GBool trueColor; // set if using a TrueColor visual
int rMul, gMul, bMul; // RGB multipliers (for TrueColor)
int rShift, gShift, bShift; // RGB shifts (for TrueColor)
Gulong // color cube
colors[maxRGBCube * maxRGBCube * maxRGBCube];
int numColors; // size of color cube
XPoint // temporary points array
tmpPoints[numTmpPoints];
int // temporary arrays for fill/clip
tmpLengths[numTmpSubpaths];
BoundingRect
tmpRects[numTmpSubpaths];
GfxFont *gfxFont; // current PDF font
XOutputFont *font; // current font
XOutputFontCache *fontCache; // font cache
XOutputState *save; // stack of saved states
TextPage *text; // text from the current page
void updateLineAttrs(GfxState *state, GBool updateDash);
void doFill(GfxState *state, int rule);
void doClip(GfxState *state, int rule);
int convertPath(GfxState *state, XPoint **points, int *size,
int *numPoints, int **lengths, GBool fillHack);
void convertSubpath(GfxState *state, GfxSubpath *subpath,
XPoint **points, int *size, int *n);
void doCurve(XPoint **points, int *size, int *k,
double x0, double y0, double x1, double y1,
double x2, double y2, double x3, double y3);
void addPoint(XPoint **points, int *size, int *k, int x, int y);
Gulong findColor(GfxColor *color);
Gulong findColor(RGBColor *x, RGBColor *err);
};
#endif