1 //========================================================================
2 //
3 // SplashFontEngine.h
4 //
5 // Copyright 2003-2013 Glyph & Cog, LLC
6 //
7 //========================================================================
8 
9 #ifndef SPLASHFONTENGINE_H
10 #define SPLASHFONTENGINE_H
11 
12 #include <aconf.h>
13 
14 #ifdef USE_GCC_PRAGMAS
15 #pragma interface
16 #endif
17 
18 #include "gtypes.h"
19 class GString;
20 class GList;
21 
22 class SplashFTFontEngine;
23 class SplashDTFontEngine;
24 class SplashDT4FontEngine;
25 class SplashFontFile;
26 class SplashFontFileID;
27 class SplashFont;
28 
29 //------------------------------------------------------------------------
30 
31 #define splashFontCacheSize 16
32 
33 #if HAVE_FREETYPE_H
34 #define splashFTNoHinting (1 << 0)
35 #endif
36 
37 //------------------------------------------------------------------------
38 // SplashFontEngine
39 //------------------------------------------------------------------------
40 
41 class SplashFontEngine {
42 public:
43 
44   // Create a font engine.
45   SplashFontEngine(
46 #if HAVE_FREETYPE_H
47 		   GBool enableFreeType,
48 		   Guint freeTypeFlags,
49 #endif
50 		   GBool aa);
51 
52   ~SplashFontEngine();
53 
54   // Get a font file from the cache.  Returns NULL if there is no
55   // matching entry in the cache.
56   SplashFontFile *getFontFile(SplashFontFileID *id);
57 
58   // Returns true if [id] refers to a bad font file, i.e., if one of
59   // the loadXXXFont functions has returned NULL for that ID.
60   GBool checkForBadFontFile(SplashFontFileID *id);
61 
62   // Load fonts - these create new SplashFontFile objects.
63   SplashFontFile *loadType1Font(SplashFontFileID *idA,
64 #if LOAD_FONTS_FROM_MEM
65 				GString *fontBuf,
66 #else
67 				char *fileName, GBool deleteFile,
68 #endif
69 				const char **enc);
70   SplashFontFile *loadType1CFont(SplashFontFileID *idA,
71 #if LOAD_FONTS_FROM_MEM
72 				 GString *fontBuf,
73 #else
74 				 char *fileName, GBool deleteFile,
75 #endif
76 				 int *codeToGID, const char **enc);
77   SplashFontFile *loadOpenTypeT1CFont(SplashFontFileID *idA,
78 #if LOAD_FONTS_FROM_MEM
79 				      GString *fontBuf,
80 #else
81 				      char *fileName, GBool deleteFile,
82 #endif
83 				      int *codeToGID, const char **enc);
84   SplashFontFile *loadCIDFont(SplashFontFileID *idA,
85 #if LOAD_FONTS_FROM_MEM
86 			      GString *fontBuf,
87 #else
88 			      char *fileName, GBool deleteFile,
89 #endif
90 			      int *codeToGID, int codeToGIDLen);
91   SplashFontFile *loadOpenTypeCFFFont(SplashFontFileID *idA,
92 #if LOAD_FONTS_FROM_MEM
93 				      GString *fontBuf,
94 #else
95 				      char *fileName, GBool deleteFile,
96 #endif
97 				      int *codeToGID, int codeToGIDLen);
98   SplashFontFile *loadTrueTypeFont(SplashFontFileID *idA,
99 #if LOAD_FONTS_FROM_MEM
100 				   GString *fontBuf,
101 #else
102 				   char *fileName, GBool deleteFile,
103 #endif
104 				   int fontNum,
105 				   int *codeToGID, int codeToGIDLen,
106 				   char *fontName);
107 
108   // Get a font - this does a cache lookup first, and if not found,
109   // creates a new SplashFont object and adds it to the cache.  The
110   // matrix, mat = textMat * ctm:
111   //    [ mat[0] mat[1] ]
112   //    [ mat[2] mat[3] ]
113   // specifies the font transform in PostScript style:
114   //    [x' y'] = [x y] * mat
115   // Note that the Splash y axis points downward.
116   SplashFont *getFont(SplashFontFile *fontFile,
117 		      SplashCoord *textMat, SplashCoord *ctm);
118 
119 private:
120 
121   SplashFont *fontCache[splashFontCacheSize];
122   GList *badFontFiles;		// [SplashFontFileID]
123 
124 #if HAVE_FREETYPE_H
125   SplashFTFontEngine *ftEngine;
126 #endif
127 };
128 
129 #endif
130