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

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

First import

File size: 3.6 KB
Line 
1//========================================================================
2//
3// SplashFTFontEngine.cc
4//
5//========================================================================
6
7#include <config.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 <stdio.h>
16#include <unistd.h>
17#include "goo/gmem.h"
18#include "goo/GooString.h"
19#include "goo/gfile.h"
20#include "fofi/FoFiTrueType.h"
21#include "fofi/FoFiType1C.h"
22#include "SplashFTFontFile.h"
23#include "SplashFTFontEngine.h"
24
25#ifdef VMS
26#if (__VMS_VER < 70000000)
27extern "C" int unlink(char *filename);
28#endif
29#endif
30
31//------------------------------------------------------------------------
32
33static void fileWrite(void *stream, char *data, int len) {
34  fwrite(data, 1, len, (FILE *)stream);
35}
36
37//------------------------------------------------------------------------
38// SplashFTFontEngine
39//------------------------------------------------------------------------
40
41SplashFTFontEngine::SplashFTFontEngine(GBool aaA, FT_Library libA) {
42  FT_Int major, minor, patch;
43
44  aa = aaA;
45  lib = libA;
46
47  // as of FT 2.1.8, CID fonts are indexed by CID instead of GID
48  FT_Library_Version(lib, &major, &minor, &patch);
49  useCIDs = major > 2 ||
50            (major == 2 && (minor > 1 || (minor == 1 && patch > 7)));
51}
52
53SplashFTFontEngine *SplashFTFontEngine::init(GBool aaA) {
54  FT_Library libA;
55
56  if (FT_Init_FreeType(&libA)) {
57    return NULL;
58  }
59  return new SplashFTFontEngine(aaA, libA);
60}
61
62SplashFTFontEngine::~SplashFTFontEngine() {
63  FT_Done_FreeType(lib);
64}
65
66SplashFontFile *SplashFTFontEngine::loadType1Font(SplashFontFileID *idA,
67                                                  SplashFontSrc *src,
68                                                  char **enc) {
69  return SplashFTFontFile::loadType1Font(this, idA, src, enc);
70}
71
72SplashFontFile *SplashFTFontEngine::loadType1CFont(SplashFontFileID *idA,
73                                                   SplashFontSrc *src,
74                                                   char **enc) {
75  return SplashFTFontFile::loadType1Font(this, idA, src, enc);
76}
77
78SplashFontFile *SplashFTFontEngine::loadCIDFont(SplashFontFileID *idA,
79                                                SplashFontSrc *src) {
80  FoFiType1C *ff;
81  Gushort *cidToGIDMap;
82  int nCIDs;
83  SplashFontFile *ret;
84
85  // check for a CFF font
86  if (useCIDs) {
87    cidToGIDMap = NULL;
88    nCIDs = 0;
89  } else {
90    if (src->isFile) {
91      ff = FoFiType1C::load(src->fileName->getCString());
92    } else {
93      ff = new FoFiType1C(src->buf, src->bufLen, gFalse);
94    }
95    if (ff) {
96    cidToGIDMap = ff->getCIDToGIDMap(&nCIDs);
97    delete ff;
98  } else {
99    cidToGIDMap = NULL;
100    nCIDs = 0;
101  }
102  }
103  ret = SplashFTFontFile::loadCIDFont(this, idA, src, cidToGIDMap, nCIDs);
104  if (!ret) {
105    gfree(cidToGIDMap);
106  }
107  return ret;
108}
109
110SplashFontFile *SplashFTFontEngine::loadTrueTypeFont(SplashFontFileID *idA,
111                                                     SplashFontSrc *src,
112                                                     Gushort *codeToGID,
113                                                     int codeToGIDLen,
114                                                     int faceIndex) {
115#if 0
116  FoFiTrueType *ff;
117  GooString *tmpFileName;
118  FILE *tmpFile;
119  SplashFontFile *ret;
120
121  if (!(ff = FoFiTrueType::load(fileName, faceIndex))) {
122    return NULL;
123  }
124  tmpFileName = NULL;
125  if (!openTempFile(&tmpFileName, &tmpFile, "wb", NULL)) {
126    delete ff;
127    return NULL;
128  }
129  ff->writeTTF(&fileWrite, tmpFile);
130  delete ff;
131  fclose(tmpFile);
132  ret = SplashFTFontFile::loadTrueTypeFont(this, idA,
133                                           tmpFileName->getCString(),
134                                           gTrue, codeToGID, codeToGIDLen,
135                                           faceIndex);
136  if (ret) {
137    if (deleteFile) {
138      unlink(fileName);
139    }
140  } else {
141    unlink(tmpFileName->getCString());
142  }
143  delete tmpFileName;
144  return ret;
145#else
146  SplashFontFile *ret;
147  ret = SplashFTFontFile::loadTrueTypeFont(this, idA, src,
148                                           codeToGID, codeToGIDLen,
149                                           faceIndex);
150  return ret;
151#endif
152}
153
154#endif // HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
Note: See TracBrowser for help on using the repository browser.