23#include "GlobalParams.h"
32class XOutputFontCache;
39class DisplayFontParam;
41class CharCodeToUnicode;
49#if FREETYPE2 && (HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H)
55#if !FREETYPE2 && (HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H)
67#define numTmpPoints 256
68#define numTmpSubpaths 16
87 XOutputFont(Ref *idA, double m11OrigA, double m12OrigA,
88 double m21OrigA, double m22OrigA,
89 double m11A, double m12A, double m21A, double m22A,
90 Display *displayA, XOutputDev *xOutA);
92 virtual ~XOutputFont();
95 GBool matches(Ref *idA, double m11OrigA, double m12OrigA,
96 double m21OrigA, double m22OrigA)
97 { return id.num == idA->num && id.gen == idA->gen &&
98 m11Orig == m11OrigA && m12Orig == m12OrigA &&
99 m21Orig == m21OrigA && m22Orig == m22OrigA; }
102 virtual GBool isOk() = 0;
105 virtual void updateGC(GC gc) = 0;
108 virtual void drawChar(GfxState *state, Pixmap pixmap, int w, int h,
110 double x, double y, double dx, double dy,
111 CharCode c, Unicode *u, int uLen) = 0;
115 virtual GBool hasGetCharPath() { return gFalse; }
118 virtual void getCharPath(GfxState *state,
119 CharCode c, Unicode *u, int ulen);
124 double m11Orig, m12Orig,
126 double m11, m12, m21, m22;
137class XOutputT1Font: public XOutputFont {
140 XOutputT1Font(Ref *idA, T1FontFile *fontFileA,
141 double m11OrigA, double m12OrigA,
142 double m21OrigA, double m22OrigA,
143 double m11A, double m12A,
144 double m21A, double m22A,
145 Display *displayA, XOutputDev *xOutA);
147 virtual ~XOutputT1Font();
150 virtual GBool isOk();
153 virtual void updateGC(GC gc);
156 virtual void drawChar(GfxState *state, Pixmap pixmap, int w, int h,
158 double x, double y, double dx, double dy,
159 CharCode c, Unicode *u, int uLen);
163 virtual GBool hasGetCharPath() { return gTrue; }
166 virtual void getCharPath(GfxState *state,
167 CharCode c, Unicode *u, int ulen);
171 T1FontFile *fontFile;
176#if FREETYPE2 && (HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H)
181class XOutputFTFont: public XOutputFont {
184 XOutputFTFont(Ref *idA, FTFontFile *fontFileA,
185 double m11OrigA, double m12OrigA,
186 double m21OrigA, double m22OrigA,
187 double m11A, double m12A,
188 double m21A, double m22A,
189 Display *displayA, XOutputDev *xOutA);
191 virtual ~XOutputFTFont();
194 virtual GBool isOk();
197 virtual void updateGC(GC gc);
200 virtual void drawChar(GfxState *state, Pixmap pixmap, int w, int h,
202 double x, double y, double dx, double dy,
203 CharCode c, Unicode *u, int uLen);
207 virtual GBool hasGetCharPath() { return gTrue; }
210 virtual void getCharPath(GfxState *state,
211 CharCode c, Unicode *u, int ulen);
215 FTFontFile *fontFile;
220#if !FREETYPE2 && (HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H)
225class XOutputTTFont: public XOutputFont {
228 XOutputTTFont(Ref *idA, TTFontFile *fontFileA,
229 double m11OrigA, double m12OrigA,
230 double m21OrigA, double m22OrigA,
231 double m11A, double m12A,
232 double m21A, double m22A,
233 Display *displayA, XOutputDev *xOutA);
235 virtual ~XOutputTTFont();
238 virtual GBool isOk();
241 virtual void updateGC(GC gc);
244 virtual void drawChar(GfxState *state, Pixmap pixmap, int w, int h,
246 double x, double y, double dx, double dy,
247 CharCode c, Unicode *u, int uLen);
251 TTFontFile *fontFile;
260class XOutputServer8BitFont: public XOutputFont {
263 XOutputServer8BitFont(Ref *idA, GString *xlfdFmt,
264 UnicodeMap *xUMapA, CharCodeToUnicode *fontUMap,
265 double m11OrigA, double m12OrigA,
266 double m21OrigA, double m22OrigA,
267 double m11A, double m12A, double m21A, double m22A,
268 Display *displayA, XOutputDev *xOutA);
270 virtual ~XOutputServer8BitFont();
273 virtual GBool isOk();
276 virtual void updateGC(GC gc);
279 virtual void drawChar(GfxState *state, Pixmap pixmap, int w, int h,
281 double x, double y, double dx, double dy,
282 CharCode c, Unicode *u, int uLen);
295class XOutputServer16BitFont: public XOutputFont {
298 XOutputServer16BitFont(Ref *idA, GString *xlfdFmt,
299 UnicodeMap *xUMapA, CharCodeToUnicode *fontUMap,
300 double m11OrigA, double m12OrigA,
301 double m21OrigA, double m22OrigA,
302 double m11A, double m12A, double m21A, double m22A,
303 Display *displayA, XOutputDev *xOutA);
305 virtual ~XOutputServer16BitFont();
308 virtual GBool isOk();
311 virtual void updateGC(GC gc);
314 virtual void drawChar(GfxState *state, Pixmap pixmap, int w, int h,
316 double x, double y, double dx, double dy,
317 CharCode c, Unicode *u, int uLen);
330class XOutputT1FontFile {
332 XOutputT1FontFile( int numA, int genA, GBool substA,
333 T1FontFile *fontFileA, GString *tmpFileNameA)
334 { num = numA; gen = genA; subst = substA;
335 fontFile = fontFileA; tmpFileName = tmpFileNameA; }
336 ~XOutputT1FontFile();
339 T1FontFile *fontFile;
340 GString *tmpFileName;
344#if FREETYPE2 && (HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H)
345class XOutputFTFontFile {
347 XOutputFTFontFile( int numA, int genA, GBool substA,
348 FTFontFile *fontFileA, GString *tmpFileNameA)
349 { num = numA; gen = genA; subst = substA;
350 fontFile = fontFileA; tmpFileName = tmpFileNameA; }
351 ~XOutputFTFontFile();
354 FTFontFile *fontFile;
355 GString *tmpFileName;
359#if !FREETYPE2 && (HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H)
360class XOutputTTFontFile {
362 XOutputTTFontFile( int numA, int genA, GBool substA,
363 TTFontFile *fontFileA, GString *tmpFileNameA)
364 { num = numA; gen = genA; subst = substA;
365 fontFile = fontFileA; tmpFileName = tmpFileNameA; }
366 ~XOutputTTFontFile();
369 TTFontFile *fontFile;
370 GString *tmpFileName;
374class XOutputFontCache {
378 XOutputFontCache(Display *displayA, Guint depthA,
380 FontRastControl t1libControlA,
381 FontRastControl freetypeControlA);
387 void startDoc( int screenNum, Visual *visual,
388 Colormap colormap, GBool trueColor,
389 int rMul, int gMul, int bMul,
390 int rShift, int gShift, int bShift,
391 Gulong *colors, int numColors);
394 XOutputFont *getFont(XRef *xref, GfxFont *gfxFont, double m11, double m12,
395 double m21, double m22);
401 XOutputFont *tryGetFont(XRef *xref, DisplayFontParam *dfp, GfxFont *gfxFont,
402 double m11Orig, double m12Orig,
403 double m21Orig, double m22Orig,
404 double m11, double m12, double m21, double m22,
407 XOutputFont *tryGetT1Font(XRef *xref, GfxFont *gfxFont,
408 double m11, double m12, double m21, double m22);
409 XOutputFont *tryGetT1FontFromFile(XRef *xref, GString *fileName,
410 GBool deleteFile, GfxFont *gfxFont,
411 double m11Orig, double m12Orig,
412 double m21Orig, double m22Orig,
413 double m11, double m12,
414 double m21, double m22, GBool subst);
416#if FREETYPE2 && (HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H)
417 XOutputFont *tryGetFTFont(XRef *xref, GfxFont *gfxFont,
418 double m11, double m12, double m21, double m22);
419 XOutputFont *tryGetFTFontFromFile(XRef *xref, GString *fileName,
420 GBool deleteFile, GfxFont *gfxFont,
421 double m11Orig, double m12Orig,
422 double m21Orig, double m22Orig,
423 double m11, double m12,
424 double m21, double m22, GBool subst);
426#if !FREETYPE2 && (HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H)
427 XOutputFont *tryGetTTFont(XRef *xref, GfxFont *gfxFont,
428 double m11, double m12, double m21, double m22);
429 XOutputFont *tryGetTTFontFromFile(XRef *xref, GString *fileName,
430 GBool deleteFile, GfxFont *gfxFont,
431 double m11Orig, double m12Orig,
432 double m21Orig, double m22Orig,
433 double m11, double m12,
434 double m21, double m22, GBool subst);
436 XOutputFont *tryGetServerFont(GString *xlfd, GString *encodingName,
438 double m11Orig, double m12Orig,
439 double m21Orig, double m22Orig,
440 double m11, double m12,
441 double m21, double m22);
448 fonts[xOutFontCacheSize];
452 FontRastControl t1libControl;
453 T1FontEngine *t1Engine;
458#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
462#if FREETYPE2 && (HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H)
463 FTFontEngine *ftEngine;
467#if !FREETYPE2 && (HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H)
468 TTFontEngine *ttEngine;
489class XOutputDev: public OutputDev {
493 XOutputDev(Display *displayA, int screenNumA,
494 Visual *visualA, Colormap colormapA,
495 GBool reverseVideoA, unsigned long paperColorA,
496 GBool installCmap, int rgbCubeSize,
500 virtual ~XOutputDev();
506 virtual GBool upsideDown() { return gTrue; }
509 virtual GBool useDrawChar() { return gTrue; }
513 virtual GBool interpretType3Chars() { return gTrue; }
518 virtual void startPage( int pageNum, GfxState *state);
521 virtual void endPage();
524 virtual void drawLink(Link *link, Catalog *catalog);
527 virtual void saveState(GfxState *state);
528 virtual void restoreState(GfxState *state);
531 virtual void updateAll(GfxState *state);
532 virtual void updateCTM(GfxState *state, double m11, double m12,
533 double m21, double m22, double m31, double m32);
534 virtual void updateLineDash(GfxState *state);
535 virtual void updateFlatness(GfxState *state);
536 virtual void updateLineJoin(GfxState *state);
537 virtual void updateLineCap(GfxState *state);
538 virtual void updateMiterLimit(GfxState *state);
539 virtual void updateLineWidth(GfxState *state);
540 virtual void updateFillColor(GfxState *state);
541 virtual void updateStrokeColor(GfxState *state);
544 virtual void updateFont(GfxState *state);
547 virtual void stroke(GfxState *state);
548 virtual void fill(GfxState *state);
549 virtual void eoFill(GfxState *state);
552 virtual void clip(GfxState *state);
553 virtual void eoClip(GfxState *state);
556 virtual void beginString(GfxState *state, GString *s);
557 virtual void endString(GfxState *state);
558 virtual void drawChar(GfxState *state, double x, double y,
559 double dx, double dy,
560 double originX, double originY,
561 CharCode code, Unicode *u, int uLen);
562 virtual GBool beginType3Char(GfxState *state,
563 CharCode code, Unicode *u, int uLen);
564 virtual void endType3Char(GfxState *state);
567 virtual void drawImageMask(GfxState *state, Object *ref, Stream *str,
568 int width, int height, GBool invert,
570 virtual void drawImage(GfxState *state, Object *ref, Stream *str,
571 int width, int height, GfxImageColorMap *colorMap,
572 int *maskColors, GBool inlineImg);
575 virtual void type3D0(GfxState *state, double wx, double wy);
576 virtual void type3D1(GfxState *state, double wx, double wy,
577 double llx, double lly, double urx, double ury);
582 void startDoc(XRef *xrefA);
589 GBool findText(Unicode *s, int len, GBool top, GBool bottom,
590 int *xMin, int *yMin, int *xMax, int *yMax);
593 GString *getText( int xMin, int yMin, int xMax, int yMax);
595 GBool isReverseVideo() { return reverseVideo; }
598 void setPixmap(Pixmap pixmapA, int pixmapWA, int pixmapHA)
599 { pixmap = pixmapA; pixmapW = pixmapWA; pixmapH = pixmapHA; }
602 Pixmap getPixmap() { return pixmap; }
603 int getPixmapWidth() { return pixmapW; }
604 int getPixmapHeight() { return pixmapH; }
605 Display *getDisplay() { return display; }
606 Guint getDepth() { return depth; }
608 Gulong findColor(GfxRGB *rgb);
616 int pixmapW, pixmapH;
626 int rMul, gMul, bMul;
627 int rShift, gShift, bShift;
629 colors[maxRGBCube * maxRGBCube * maxRGBCube];
630 unsigned long paperColor;
635 tmpPoints[numTmpPoints];
637 tmpLengths[numTmpSubpaths];
639 tmpRects[numTmpSubpaths];
642 XOutputFontCache *fontCache;
644 t3FontCache[xOutT3FontCacheSize];
646 T3GlyphStack *t3GlyphStack;
651 void updateLineAttrs(GfxState *state, GBool updateDash);
652 void doFill(GfxState *state, int rule);
653 void doClip(GfxState *state, int rule);
654 int convertPath(GfxState *state, XPoint **points, int *size,
655 int *numPoints, int **lengths, GBool fillHack);
656 void convertSubpath(GfxState *state, GfxSubpath *subpath,
657 XPoint **points, int *size, int *n);
658 void doCurve(XPoint **points, int *size, int *k,
659 double x0, double y0, double x1, double y1,
660 double x2, double y2, double x3, double y3);
661 void addPoint(XPoint **points, int *size, int *k, int x, int y);
662 void drawType3Glyph(T3FontCache *t3Font,
663 T3FontCacheTag *tag, Guchar *data,
664 double x, double y, GfxRGB *color);
665 Gulong findColor(GfxRGB *x, GfxRGB *err);
|