source: trunk/poppler/mypoppler/splash/SplashFontEngine.cc @ 134

Last change on this file since 134 was 134, checked in by Eugene Romanenko, 15 years ago

poppler updated to version 0.5.4

File size: 5.6 KB
Line 
1//========================================================================
2//
3// SplashFontEngine.cc
4//
5//========================================================================
6
7#include <config.h>
8
9#ifdef USE_GCC_PRAGMAS
10#pragma implementation
11#endif
12
13#if HAVE_T1LIB_H
14#include <t1lib.h>
15#endif
16
17#include <stdlib.h>
18#include <stdio.h>
19#ifndef WIN32
20#  include <unistd.h>
21#endif
22#include "goo/gmem.h"
23#include "goo/GooString.h"
24#include "SplashT1FontEngine.h"
25#include "SplashFTFontEngine.h"
26#include "SplashFontFile.h"
27#include "SplashFontFileID.h"
28#include "SplashFont.h"
29#include "SplashFontEngine.h"
30
31#ifdef VMS
32#if (__VMS_VER < 70000000)
33extern "C" int unlink(char *filename);
34#endif
35#endif
36
37//------------------------------------------------------------------------
38// SplashFontEngine
39//------------------------------------------------------------------------
40
41SplashFontEngine::SplashFontEngine(
42#if HAVE_T1LIB_H
43                                   GBool enableT1lib,
44#endif
45#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
46                                   GBool enableFreeType,
47#endif
48                                   GBool aa) {
49  int i;
50
51  for (i = 0; i < splashFontCacheSize; ++i) {
52    fontCache[i] = NULL;
53  }
54
55#if HAVE_T1LIB_H
56  if (enableT1lib) {
57    t1Engine = SplashT1FontEngine::init(aa);
58  } else {
59    t1Engine = NULL;
60  }
61#endif
62#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
63  if (enableFreeType) {
64    ftEngine = SplashFTFontEngine::init(aa);
65  } else {
66    ftEngine = NULL;
67  }
68#endif
69}
70
71SplashFontEngine::~SplashFontEngine() {
72  int i;
73
74  for (i = 0; i < splashFontCacheSize; ++i) {
75    if (fontCache[i]) {
76      delete fontCache[i];
77    }
78  }
79
80#if HAVE_T1LIB_H
81  if (t1Engine) {
82    delete t1Engine;
83  }
84#endif
85#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
86  if (ftEngine) {
87    delete ftEngine;
88  }
89#endif
90}
91
92SplashFontFile *SplashFontEngine::getFontFile(SplashFontFileID *id) {
93  SplashFontFile *fontFile;
94  int i;
95
96  for (i = 0; i < splashFontCacheSize; ++i) {
97    if (fontCache[i]) {
98      fontFile = fontCache[i]->getFontFile();
99      if (fontFile && fontFile->getID()->matches(id)) {
100        return fontFile;
101      }
102    }
103  }
104  return NULL;
105}
106
107SplashFontFile *SplashFontEngine::loadType1Font(SplashFontFileID *idA,
108                                                SplashFontSrc *src,
109                                                char **enc) {
110  SplashFontFile *fontFile;
111
112  fontFile = NULL;
113#if HAVE_T1LIB_H
114  if (!fontFile && t1Engine) {
115    fontFile = t1Engine->loadType1Font(idA, src, enc);
116  }
117#endif
118#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
119  if (!fontFile && ftEngine) {
120    fontFile = ftEngine->loadType1Font(idA, src, enc);
121  }
122#endif
123
124#ifndef WIN32
125  // delete the (temporary) font file -- with Unix hard link
126  // semantics, this will remove the last link; otherwise it will
127  // return an error, leaving the file to be deleted later (if
128  // loadXYZFont failed, the file will always be deleted)
129  if (src->isFile)
130    src->unref();
131#endif
132
133  return fontFile;
134}
135
136SplashFontFile *SplashFontEngine::loadType1CFont(SplashFontFileID *idA,
137                                                 SplashFontSrc *src,
138                                                 char **enc) {
139  SplashFontFile *fontFile;
140
141  fontFile = NULL;
142#if HAVE_T1LIB_H
143  if (!fontFile && t1Engine) {
144    fontFile = t1Engine->loadType1CFont(idA, src, enc);
145  }
146#endif
147#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
148  if (!fontFile && ftEngine) {
149    fontFile = ftEngine->loadType1CFont(idA, src, enc);
150  }
151#endif
152
153#ifndef WIN32
154  // delete the (temporary) font file -- with Unix hard link
155  // semantics, this will remove the last link; otherwise it will
156  // return an error, leaving the file to be deleted later (if
157  // loadXYZFont failed, the file will always be deleted)
158  if (src->isFile)
159    src->unref();
160#endif
161
162  return fontFile;
163}
164
165SplashFontFile *SplashFontEngine::loadCIDFont(SplashFontFileID *idA,
166                                              SplashFontSrc *src) {
167  SplashFontFile *fontFile;
168
169  fontFile = NULL;
170#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
171  if (!fontFile && ftEngine) {
172    fontFile = ftEngine->loadCIDFont(idA, src);
173  }
174#endif
175
176#ifndef WIN32
177  // delete the (temporary) font file -- with Unix hard link
178  // semantics, this will remove the last link; otherwise it will
179  // return an error, leaving the file to be deleted later (if
180  // loadXYZFont failed, the file will always be deleted)
181  if (src->isFile)
182    src->unref();
183#endif
184
185  return fontFile;
186}
187
188SplashFontFile *SplashFontEngine::loadTrueTypeFont(SplashFontFileID *idA,
189                                                   SplashFontSrc *src,
190                                                   Gushort *codeToGID,
191                                                   int codeToGIDLen,
192                                                   int faceIndex) {
193  SplashFontFile *fontFile;
194
195  fontFile = NULL;
196#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
197  if (!fontFile && ftEngine) {
198    fontFile = ftEngine->loadTrueTypeFont(idA, src,
199                                        codeToGID, codeToGIDLen, faceIndex);
200  }
201#endif
202
203  if (!fontFile) {
204    gfree(codeToGID);
205  }
206
207#ifndef WIN32
208  // delete the (temporary) font file -- with Unix hard link
209  // semantics, this will remove the last link; otherwise it will
210  // return an error, leaving the file to be deleted later (if
211  // loadXYZFont failed, the file will always be deleted)
212  if (src->isFile)
213    src->unref();
214#endif
215
216  return fontFile;
217}
218
219SplashFont *SplashFontEngine::getFont(SplashFontFile *fontFile,
220                                      SplashCoord *mat) {
221  SplashFont *font;
222  int i, j;
223
224  font = fontCache[0];
225  if (font && font->matches(fontFile, mat)) {
226    return font;
227  }
228  for (i = 1; i < splashFontCacheSize; ++i) {
229    font = fontCache[i];
230    if (font && font->matches(fontFile, mat)) {
231      for (j = i; j > 0; --j) {
232        fontCache[j] = fontCache[j-1];
233      }
234      fontCache[0] = font;
235      return font;
236    }
237  }
238  font = fontFile->makeFont(mat);
239  if (fontCache[splashFontCacheSize - 1]) {
240    delete fontCache[splashFontCacheSize - 1];
241  }
242  for (j = splashFontCacheSize - 1; j > 0; --j) {
243    fontCache[j] = fontCache[j-1];
244  }
245  fontCache[0] = font;
246  return font;
247}
Note: See TracBrowser for help on using the repository browser.