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

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

First import

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  src->unref();
130#endif
131
132  return fontFile;
133}
134
135SplashFontFile *SplashFontEngine::loadType1CFont(SplashFontFileID *idA,
136                                                 SplashFontSrc *src,
137                                                 char **enc) {
138  SplashFontFile *fontFile;
139
140  fontFile = NULL;
141#if HAVE_T1LIB_H
142  if (!fontFile && t1Engine) {
143    fontFile = t1Engine->loadType1CFont(idA, src, enc);
144  }
145#endif
146#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
147  if (!fontFile && ftEngine) {
148    fontFile = ftEngine->loadType1CFont(idA, src, enc);
149  }
150#endif
151
152#ifndef WIN32
153  // delete the (temporary) font file -- with Unix hard link
154  // semantics, this will remove the last link; otherwise it will
155  // return an error, leaving the file to be deleted later (if
156  // loadXYZFont failed, the file will always be deleted)
157  src->unref();
158#endif
159
160  return fontFile;
161}
162
163SplashFontFile *SplashFontEngine::loadCIDFont(SplashFontFileID *idA,
164                                              SplashFontSrc *src) {
165  SplashFontFile *fontFile;
166
167  fontFile = NULL;
168#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
169  if (!fontFile && ftEngine) {
170    fontFile = ftEngine->loadCIDFont(idA, src);
171  }
172#endif
173
174#ifndef WIN32
175  // delete the (temporary) font file -- with Unix hard link
176  // semantics, this will remove the last link; otherwise it will
177  // return an error, leaving the file to be deleted later (if
178  // loadXYZFont failed, the file will always be deleted)
179  src->unref();
180#endif
181
182  return fontFile;
183}
184
185SplashFontFile *SplashFontEngine::loadTrueTypeFont(SplashFontFileID *idA,
186                                                   SplashFontSrc *src,
187                                                   Gushort *codeToGID,
188                                                   int codeToGIDLen,
189                                                   int faceIndex) {
190  SplashFontFile *fontFile;
191
192  fontFile = NULL;
193#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
194  if (!fontFile && ftEngine) {
195    fontFile = ftEngine->loadTrueTypeFont(idA, src,
196                                        codeToGID, codeToGIDLen, faceIndex);
197  }
198#endif
199
200  if (!fontFile) {
201    gfree(codeToGID);
202  }
203
204#ifndef WIN32
205  // delete the (temporary) font file -- with Unix hard link
206  // semantics, this will remove the last link; otherwise it will
207  // return an error, leaving the file to be deleted later (if
208  // loadXYZFont failed, the file will always be deleted)
209  src->unref();
210#endif
211
212  return fontFile;
213}
214
215SplashFont *SplashFontEngine::getFont(SplashFontFile *fontFile,
216                                      SplashCoord *mat) {
217  SplashFont *font;
218  int i, j;
219
220  font = fontCache[0];
221  if (font && font->matches(fontFile, mat)) {
222    return font;
223  }
224  for (i = 1; i < splashFontCacheSize; ++i) {
225    font = fontCache[i];
226    if (font && font->matches(fontFile, mat)) {
227      for (j = i; j > 0; --j) {
228        fontCache[j] = fontCache[j-1];
229      }
230      fontCache[0] = font;
231      return font;
232    }
233  }
234  font = fontFile->makeFont(mat);
235  if (fontCache[splashFontCacheSize - 1]) {
236    delete fontCache[splashFontCacheSize - 1];
237  }
238  for (j = splashFontCacheSize - 1; j > 0; --j) {
239    fontCache[j] = fontCache[j-1];
240  }
241  fontCache[0] = font;
242  return font;
243}
Note: See TracBrowser for help on using the repository browser.