1 //========================================================================
2 //
3 // SplashFont.h
4 //
5 //========================================================================
6 
7 //========================================================================
8 //
9 // Modified under the Poppler project - http://poppler.freedesktop.org
10 //
11 // All changes made under the Poppler project to this file are licensed
12 // under GPL version 2 or later
13 //
14 // Copyright (C) 2007-2008 Albert Astals Cid <aacid@kde.org>
15 //
16 // To see a description of the changes please see the Changelog file that
17 // came with your tarball or type make ChangeLog if you are building from git
18 //
19 //========================================================================
20 
21 #ifndef SPLASHFONT_H
22 #define SPLASHFONT_H
23 
24 #ifdef USE_GCC_PRAGMAS
25 #pragma interface
26 #endif
27 
28 #include "goo/gtypes.h"
29 #include "SplashTypes.h"
30 #include "SplashClip.h"
31 
32 struct SplashGlyphBitmap;
33 struct SplashFontCacheTag;
34 class SplashFontFile;
35 class SplashPath;
36 
37 //------------------------------------------------------------------------
38 
39 // Fractional positioning uses this many bits to the right of the
40 // decimal points.
41 #define splashFontFractionBits 2
42 #define splashFontFraction     (1 << splashFontFractionBits)
43 #define splashFontFractionMul \
44                        ((SplashCoord)1 / (SplashCoord)splashFontFraction)
45 
46 //------------------------------------------------------------------------
47 // SplashFont
48 //------------------------------------------------------------------------
49 
50 class SplashFont {
51 public:
52 
53   SplashFont(SplashFontFile *fontFileA, SplashCoord *matA,
54 	     SplashCoord *textMatA, GBool aaA);
55 
56   // This must be called after the constructor, so that the subclass
57   // constructor has a chance to compute the bbox.
58   void initCache();
59 
60   virtual ~SplashFont();
61 
getFontFile()62   SplashFontFile *getFontFile() { return fontFile; }
63 
64   // Return true if <this> matches the specified font file and matrix.
matches(SplashFontFile * fontFileA,SplashCoord * matA,SplashCoord * textMatA)65   GBool matches(SplashFontFile *fontFileA, SplashCoord *matA,
66 		SplashCoord *textMatA) {
67     return fontFileA == fontFile &&
68            matA[0] == mat[0] && matA[1] == mat[1] &&
69            matA[2] == mat[2] && matA[3] == mat[3] &&
70            textMatA[0] == textMat[0] && textMatA[1] == textMat[1] &&
71            textMatA[2] == textMat[2] && textMatA[3] == textMat[3];
72   }
73 
74   // Get a glyph - this does a cache lookup first, and if not found,
75   // creates a new bitmap and adds it to the cache.  The <xFrac> and
76   // <yFrac> values are splashFontFractionBits bits each, representing
77   // the numerators of fractions in [0, 1), where the denominator is
78   // splashFontFraction = 1 << splashFontFractionBits.  Subclasses
79   // should override this to zero out xFrac and/or yFrac if they don't
80   // support fractional coordinates.
81   virtual GBool getGlyph(int c, int xFrac, int yFrac,
82 			 SplashGlyphBitmap *bitmap, int x0, int y0, SplashClip *clip, SplashClipResult *clipRes);
83 
84   // Rasterize a glyph.  The <xFrac> and <yFrac> values are the same
85   // as described for getGlyph.
86   virtual GBool makeGlyph(int c, int xFrac, int yFrac,
87 			  SplashGlyphBitmap *bitmap, int x0, int y0, SplashClip *clip, SplashClipResult *clipRes) = 0;
88 
89   // Return the path for a glyph.
90   virtual SplashPath *getGlyphPath(int c) = 0;
91 
92   // Return the advance of a glyph. (in 0..1 range)
93   // < 0 means not known
getGlyphAdvance(int c)94   virtual double getGlyphAdvance(int c) { return -1; }
95 
96   // Return the font transform matrix.
getMatrix()97   SplashCoord *getMatrix() { return mat; }
98 
99   // Return the glyph bounding box.
getBBox(int * xMinA,int * yMinA,int * xMaxA,int * yMaxA)100   void getBBox(int *xMinA, int *yMinA, int *xMaxA, int *yMaxA)
101     { *xMinA = xMin; *yMinA = yMin; *xMaxA = xMax; *yMaxA = yMax; }
102 
103 protected:
104 
105   SplashFontFile *fontFile;
106   SplashCoord mat[4];		// font transform matrix
107 				//   (text space -> device space)
108   SplashCoord textMat[4];	// text transform matrix
109 				//   (text space -> user space)
110   GBool aa;			// anti-aliasing
111   int xMin, yMin, xMax, yMax;	// glyph bounding box
112   Guchar *cache;		// glyph bitmap cache
113   SplashFontCacheTag *		// cache tags
114     cacheTags;
115   int glyphW, glyphH;		// size of glyph bitmaps
116   int glyphSize;		// size of glyph bitmaps, in bytes
117   int cacheSets;		// number of sets in cache
118   int cacheAssoc;		// cache associativity (glyphs per set)
119 };
120 
121 #endif
122