home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Enigma Amiga Life 110
/
EnigmaAmiga110CD.iso
/
indispensabili
/
utility
/
apdf
/
xpdf-0.80
/
xpdf
/
aoutputdev.h
< prev
next >
Wrap
C/C++ Source or Header
|
1999-05-19
|
9KB
|
309 lines
//========================================================================
//
// AOutputDev.h
//
// adapted from XOutputDev.h - Copyright 1996 Derek B. Noonburg
//
// changes are copyright 1999 Emmanuel Lesueur
//
//========================================================================
#ifndef AOUTPUTDEV_H
#define AOUTPUTDEV_H
#ifdef __GNUC__
#pragma interface
#endif
#include <stddef.h>
#include <math.h>
#if defined(__SASC) && defined(_M68000)
# include <m68881.h>
#endif
#include "config.h"
#include "OutputDev.h"
#include "AGfx.h"
class GString;
class GfxColor;
class GfxFont;
class GfxSubpath;
class TextPage;
struct RGBColor;
//------------------------------------------------------------------------
// Constants
//------------------------------------------------------------------------
static const int maxRGBCube=8; // max size of RGB color cube
static const int numTmpPoints=256; // number of XPoints in temporary array
static const int numTmpSubpaths=16; // number of elements in temporary arrays
// for fill/clip
static const int penColor=0;
static const int paperColor=1;
static const int WindingRule=0;
static const int EvenOddRule=1;
//------------------------------------------------------------------------
// Misc types
//------------------------------------------------------------------------
enum CapStyle {
CapButt, CapRound, CapProjecting
};
enum JoinStyle {
JoinMiter, JoinRound, JoinBevel
};
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;
//------------------------------------------------------------------------
// ColorTable
//------------------------------------------------------------------------
class ColorTable {
public:
ColorTable() : num(0),entries(NULL), maxEntries(0) {}
~ColorTable() { gfree(entries); }
Gulong find(Gulong) const;
Gulong find_rgb(Gulong n) const;
Gulong add(Gulong);
void clear() { num = 0; }
private:
ColorTable(const ColorTable&);
ColorTable& operator = (const ColorTable&);
Gulong num;
struct entry {
Gulong n;
Gulong val;
};
entry* entries;
Gulong maxEntries;
};
//------------------------------------------------------------------------
// AOutputFont
//------------------------------------------------------------------------
class AOutputFont {
public:
// Constructor.
AOutputFont(AGfx&, GfxFont *gfxFont, double m11, double m12,
double m21, double m22);
// Destructor.
~AOutputFont();
// 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 &&
fabs(mat11-m11) + fabs(mat12-m12) + fabs(mat21-m21) +
fabs(mat22-m22) < 0.01; }
// Get font.
int getTextFont() { 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; }
static void reset() { xFontCount=0; }
private:
AGfx& gfx;
Ref id;
double mat11, mat12, mat21, mat22;
int xFont;
static int xFontCount;
GBool hex; // subsetted font with hex char codes
Gushort map[256];
Guchar revMap[256];
};
//------------------------------------------------------------------------
// AOutputFontCache
//------------------------------------------------------------------------
class AOutputFontCache {
public:
// Constructor.
AOutputFontCache(AGfx&);
// Destructor.
~AOutputFontCache();
// Get a font. This creates a new font if necessary.
AOutputFont *getFont(GfxFont *gfxFont, double m11, double m12,
double m21, double m22);
private:
AOutputFont * // fonts in reverse-LRU order
fonts[fontCacheSize];
int numFonts; // number of valid entries
AGfx& gfx;
};
//------------------------------------------------------------------------
// AOutputDev
//------------------------------------------------------------------------
class AOutputDev: public OutputDev {
public:
// Constructor.
AOutputDev(AGfx& g1, Guint depth1, ColorMap* colormap1);
// Destructor.
virtual ~AOutputDev();
// Check if file was successfully created.
virtual GBool isOk() { return gTrue; }
//---- 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);
private:
AGfx& gfx;
ColorMap *colormap;
Guint depth; // pixmap depth
int flatness; // line flatness
double lineWidth;
CapStyle capStyle;
JoinStyle joinStyle;
Gulong strokeColor;
Gulong fillColor;
Gulong curColor;
Gulong linkColor;
ColorTable colorTable;
Gulong colorMask;
GBool trueColor; // set if using a TrueColor visual
int rMul, gMul, bMul; // RGB multipliers (for TrueColor)
int rShift, gShift, bShift; // RGB shifts (for TrueColor)
GfxFont *gfxFont; // current PDF font
AOutputFont *font; // current font
AOutputFontCache *fontCache; // font cache
TextPage *text; // text from the current page
PArea<double> clipRegion;
array<PArea<double> > clipStack;
void updateLineAttrs(GfxState *state, GBool updateDash);
void doFill(GfxState *state, int rule);
void doClip(GfxState *state, int rule);
void installClip();
PArea<double> convertPath(GfxState *state);
Polygon<double> convertSubpath(GfxState *state, GfxSubpath *subpath);
void doCurve(Polygon<double>&,
double x0, double y0, double x1, double y1,
double x2, double y2, double x3, double y3);
Gulong findColor(GfxColor *color);
Gulong findColor(RGBColor *x, RGBColor *err);
};
#endif