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