1 //========================================================================
2 //
3 // SplashFTFontFile.cc
4 //
5 //========================================================================
6 
7 #include <aconf.h>
8 
9 #if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
10 
11 #ifdef USE_GCC_PRAGMAS
12 #pragma implementation
13 #endif
14 
15 #include "gmem.h"
16 #include "SplashFTFontEngine.h"
17 #include "SplashFTFont.h"
18 #include "SplashFTFontFile.h"
19 
20 //------------------------------------------------------------------------
21 // SplashFTFontFile
22 //------------------------------------------------------------------------
23 
loadType1Font(SplashFTFontEngine * engineA,SplashFontFileID * idA,char * fileNameA,GBool deleteFileA,char ** encA)24 SplashFontFile *SplashFTFontFile::loadType1Font(SplashFTFontEngine *engineA,
25 						SplashFontFileID *idA,
26 						char *fileNameA,
27 						GBool deleteFileA,
28 						char **encA) {
29   FT_Face faceA;
30   Gushort *codeToGIDA;
31   char *name;
32   int i;
33 
34   if (FT_New_Face(engineA->lib, fileNameA, 0, &faceA)) {
35     return NULL;
36   }
37   codeToGIDA = (Gushort *)gmallocn(256, sizeof(int));
38   for (i = 0; i < 256; ++i) {
39     codeToGIDA[i] = 0;
40     if ((name = encA[i])) {
41       codeToGIDA[i] = (Gushort)FT_Get_Name_Index(faceA, name);
42     }
43   }
44 
45   return new SplashFTFontFile(engineA, idA, fileNameA, deleteFileA,
46 			      faceA, codeToGIDA, 256, gFalse);
47 }
48 
loadCIDFont(SplashFTFontEngine * engineA,SplashFontFileID * idA,char * fileNameA,GBool deleteFileA,Gushort * codeToGIDA,int codeToGIDLenA)49 SplashFontFile *SplashFTFontFile::loadCIDFont(SplashFTFontEngine *engineA,
50 					      SplashFontFileID *idA,
51 					      char *fileNameA,
52 					      GBool deleteFileA,
53 					      Gushort *codeToGIDA,
54 					      int codeToGIDLenA) {
55   FT_Face faceA;
56 
57   if (FT_New_Face(engineA->lib, fileNameA, 0, &faceA)) {
58     return NULL;
59   }
60 
61   return new SplashFTFontFile(engineA, idA, fileNameA, deleteFileA,
62 			      faceA, codeToGIDA, codeToGIDLenA, gFalse);
63 }
64 
loadTrueTypeFont(SplashFTFontEngine * engineA,SplashFontFileID * idA,char * fileNameA,GBool deleteFileA,Gushort * codeToGIDA,int codeToGIDLenA)65 SplashFontFile *SplashFTFontFile::loadTrueTypeFont(SplashFTFontEngine *engineA,
66 						   SplashFontFileID *idA,
67 						   char *fileNameA,
68 						   GBool deleteFileA,
69 						   Gushort *codeToGIDA,
70 						   int codeToGIDLenA) {
71   FT_Face faceA;
72 
73   if (FT_New_Face(engineA->lib, fileNameA, 0, &faceA)) {
74     return NULL;
75   }
76 
77   return new SplashFTFontFile(engineA, idA, fileNameA, deleteFileA,
78 			      faceA, codeToGIDA, codeToGIDLenA, gTrue);
79 }
80 
SplashFTFontFile(SplashFTFontEngine * engineA,SplashFontFileID * idA,char * fileNameA,GBool deleteFileA,FT_Face faceA,Gushort * codeToGIDA,int codeToGIDLenA,GBool trueTypeA)81 SplashFTFontFile::SplashFTFontFile(SplashFTFontEngine *engineA,
82 				   SplashFontFileID *idA,
83 				   char *fileNameA, GBool deleteFileA,
84 				   FT_Face faceA,
85 				   Gushort *codeToGIDA, int codeToGIDLenA,
86 				   GBool trueTypeA):
87   SplashFontFile(idA, fileNameA, deleteFileA)
88 {
89   engine = engineA;
90   face = faceA;
91   codeToGID = codeToGIDA;
92   codeToGIDLen = codeToGIDLenA;
93   trueType = trueTypeA;
94 }
95 
~SplashFTFontFile()96 SplashFTFontFile::~SplashFTFontFile() {
97   if (face) {
98     FT_Done_Face(face);
99   }
100   if (codeToGID) {
101     gfree(codeToGID);
102   }
103 }
104 
makeFont(SplashCoord * mat,SplashCoord * textMat)105 SplashFont *SplashFTFontFile::makeFont(SplashCoord *mat,
106 				       SplashCoord *textMat) {
107   SplashFont *font;
108 
109   font = new SplashFTFont(this, mat, textMat);
110   font->initCache();
111   return font;
112 }
113 
114 #endif // HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
115