/src/xpdf-4.04/splash/SplashFTFontFile.cc
Line | Count | Source (jump to first uncovered line) |
1 | | //======================================================================== |
2 | | // |
3 | | // SplashFTFontFile.cc |
4 | | // |
5 | | // Copyright 2003-2013 Glyph & Cog, LLC |
6 | | // |
7 | | //======================================================================== |
8 | | |
9 | | #include <aconf.h> |
10 | | |
11 | | #if HAVE_FREETYPE_H |
12 | | |
13 | | #ifdef USE_GCC_PRAGMAS |
14 | | #pragma implementation |
15 | | #endif |
16 | | |
17 | | #include "gmem.h" |
18 | | #include "gmempp.h" |
19 | | #include "GString.h" |
20 | | #include "SplashFTFontEngine.h" |
21 | | #include "SplashFTFont.h" |
22 | | #include "SplashFTFontFile.h" |
23 | | |
24 | | //------------------------------------------------------------------------ |
25 | | // SplashFTFontFile |
26 | | //------------------------------------------------------------------------ |
27 | | |
28 | | SplashFontFile *SplashFTFontFile::loadType1Font(SplashFTFontEngine *engineA, |
29 | | SplashFontFileID *idA, |
30 | | SplashFontType fontTypeA, |
31 | | #if LOAD_FONTS_FROM_MEM |
32 | | GString *fontBufA, |
33 | | #else |
34 | | char *fileNameA, |
35 | | GBool deleteFileA, |
36 | | #endif |
37 | 0 | const char **encA) { |
38 | 0 | FT_Face faceA; |
39 | 0 | int *codeToGIDA; |
40 | 0 | const char *name; |
41 | 0 | int i; |
42 | |
|
43 | | #if LOAD_FONTS_FROM_MEM |
44 | | if (FT_New_Memory_Face(engineA->lib, (FT_Byte *)fontBufA->getCString(), |
45 | | fontBufA->getLength(), 0, &faceA)) { |
46 | | #else |
47 | 0 | if (FT_New_Face(engineA->lib, fileNameA, 0, &faceA)) { |
48 | 0 | #endif |
49 | 0 | return NULL; |
50 | 0 | } |
51 | 0 | codeToGIDA = (int *)gmallocn(256, sizeof(int)); |
52 | 0 | for (i = 0; i < 256; ++i) { |
53 | 0 | codeToGIDA[i] = 0; |
54 | 0 | if ((name = encA[i])) { |
55 | 0 | codeToGIDA[i] = (int)FT_Get_Name_Index(faceA, (char *)name); |
56 | 0 | } |
57 | 0 | } |
58 | |
|
59 | 0 | return new SplashFTFontFile(engineA, idA, fontTypeA, |
60 | | #if LOAD_FONTS_FROM_MEM |
61 | | fontBufA, |
62 | | #else |
63 | 0 | fileNameA, deleteFileA, |
64 | 0 | #endif |
65 | 0 | faceA, codeToGIDA, 256); |
66 | 0 | } |
67 | | |
68 | | SplashFontFile *SplashFTFontFile::loadCIDFont(SplashFTFontEngine *engineA, |
69 | | SplashFontFileID *idA, |
70 | | SplashFontType fontTypeA, |
71 | | #if LOAD_FONTS_FROM_MEM |
72 | | GString *fontBufA, |
73 | | #else |
74 | | char *fileNameA, |
75 | | GBool deleteFileA, |
76 | | #endif |
77 | | int *codeToGIDA, |
78 | 0 | int codeToGIDLenA) { |
79 | 0 | FT_Face faceA; |
80 | |
|
81 | | #if LOAD_FONTS_FROM_MEM |
82 | | if (FT_New_Memory_Face(engineA->lib, (FT_Byte *)fontBufA->getCString(), |
83 | | fontBufA->getLength(), 0, &faceA)) { |
84 | | #else |
85 | 0 | if (FT_New_Face(engineA->lib, fileNameA, 0, &faceA)) { |
86 | 0 | #endif |
87 | 0 | return NULL; |
88 | 0 | } |
89 | | |
90 | 0 | return new SplashFTFontFile(engineA, idA, fontTypeA, |
91 | | #if LOAD_FONTS_FROM_MEM |
92 | | fontBufA, |
93 | | #else |
94 | 0 | fileNameA, deleteFileA, |
95 | 0 | #endif |
96 | 0 | faceA, codeToGIDA, codeToGIDLenA); |
97 | 0 | } |
98 | | |
99 | | SplashFontFile *SplashFTFontFile::loadTrueTypeFont(SplashFTFontEngine *engineA, |
100 | | SplashFontFileID *idA, |
101 | | SplashFontType fontTypeA, |
102 | | #if LOAD_FONTS_FROM_MEM |
103 | | GString *fontBufA, |
104 | | #else |
105 | | char *fileNameA, |
106 | | GBool deleteFileA, |
107 | | #endif |
108 | | int fontNum, |
109 | | int *codeToGIDA, |
110 | 0 | int codeToGIDLenA) { |
111 | 0 | FT_Face faceA; |
112 | |
|
113 | | #if LOAD_FONTS_FROM_MEM |
114 | | if (FT_New_Memory_Face(engineA->lib, (FT_Byte *)fontBufA->getCString(), |
115 | | fontBufA->getLength(), fontNum, &faceA)) { |
116 | | #else |
117 | 0 | if (FT_New_Face(engineA->lib, fileNameA, fontNum, &faceA)) { |
118 | 0 | #endif |
119 | 0 | return NULL; |
120 | 0 | } |
121 | | |
122 | 0 | return new SplashFTFontFile(engineA, idA, fontTypeA, |
123 | | #if LOAD_FONTS_FROM_MEM |
124 | | fontBufA, |
125 | | #else |
126 | 0 | fileNameA, deleteFileA, |
127 | 0 | #endif |
128 | 0 | faceA, codeToGIDA, codeToGIDLenA); |
129 | 0 | } |
130 | | |
131 | | SplashFTFontFile::SplashFTFontFile(SplashFTFontEngine *engineA, |
132 | | SplashFontFileID *idA, |
133 | | SplashFontType fontTypeA, |
134 | | #if LOAD_FONTS_FROM_MEM |
135 | | GString *fontBufA, |
136 | | #else |
137 | | char *fileNameA, GBool deleteFileA, |
138 | | #endif |
139 | | FT_Face faceA, |
140 | | int *codeToGIDA, int codeToGIDLenA): |
141 | | #if LOAD_FONTS_FROM_MEM |
142 | | SplashFontFile(idA, fontTypeA, fontBufA) |
143 | | #else |
144 | | SplashFontFile(idA, fontTypeA, fileNameA, deleteFileA) |
145 | | #endif |
146 | 0 | { |
147 | 0 | engine = engineA; |
148 | 0 | face = faceA; |
149 | 0 | codeToGID = codeToGIDA; |
150 | 0 | codeToGIDLen = codeToGIDLenA; |
151 | 0 | } |
152 | | |
153 | 0 | SplashFTFontFile::~SplashFTFontFile() { |
154 | 0 | if (face) { |
155 | 0 | FT_Done_Face(face); |
156 | 0 | } |
157 | 0 | if (codeToGID) { |
158 | 0 | gfree(codeToGID); |
159 | 0 | } |
160 | 0 | } |
161 | | |
162 | | SplashFont *SplashFTFontFile::makeFont(SplashCoord *mat, |
163 | 0 | SplashCoord *textMat) { |
164 | 0 | SplashFont *font; |
165 | |
|
166 | 0 | font = new SplashFTFont(this, mat, textMat); |
167 | 0 | font->initCache(); |
168 | 0 | return font; |
169 | 0 | } |
170 | | |
171 | | #endif // HAVE_FREETYPE_H |