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

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

First import

File size: 2.6 KB
Line 
1//========================================================================
2//
3// SplashT1FontFile.cc
4//
5//========================================================================
6
7#include <config.h>
8
9#if HAVE_T1LIB_H
10
11#ifdef USE_GCC_PRAGMAS
12#pragma implementation
13#endif
14
15#include <string.h>
16#include <t1lib.h>
17#include "goo/gmem.h"
18#include "SplashT1FontEngine.h"
19#include "SplashT1Font.h"
20#include "SplashT1FontFile.h"
21
22//------------------------------------------------------------------------
23// SplashT1FontFile
24//------------------------------------------------------------------------
25
26SplashFontFile *SplashT1FontFile::loadType1Font(SplashT1FontEngine *engineA,
27                                                SplashFontFileID *idA,
28                                                SplashFontSrc *src,
29                                                char **encA) {
30  int t1libIDA;
31  char **encTmp;
32  char *encStrTmp;
33  int encStrSize;
34  char *encPtr;
35  int i;
36  GString *fileNameA;
37  SplashFontSrc *newsrc = NULL;
38  SplashFontFile *ff;
39
40  if (! src->isFile) {
41    GString *tmpFileName;
42    FILE *tmpFile;
43    if (!openTempFile(&tmpFileName, &tmpFile, "wb", NULL))
44      return NULL;
45    fwrite(src->buf, 1, src->bufLen, tmpFile);
46    fclose(tmpFile);
47    newsrc = new SplashFontSrc;
48    newsrc->setFile(tmpFileName, gTrue);
49    src = newsrc;
50    delete tmpFileName;
51  }
52  fileNameA = src->fileName;
53  // load the font file
54  if ((t1libIDA = T1_AddFont(fileNameA)) < 0) {
55    if (newsrc)
56      delete newsrc;
57    return NULL;
58  }
59  T1_LoadFont(t1libIDA);
60
61  // reencode it
62  encStrSize = 0;
63  for (i = 0; i < 256; ++i) {
64    if (encA[i]) {
65      encStrSize += strlen(encA[i]) + 1;
66    }
67  }
68  encTmp = (char **)gmallocn(257, sizeof(char *));
69  encStrTmp = (char *)gmallocn(encStrSize, sizeof(char));
70  encPtr = encStrTmp;
71  for (i = 0; i < 256; ++i) {
72    if (encA[i]) {
73      strcpy(encPtr, encA[i]);
74      encTmp[i] = encPtr;
75      encPtr += strlen(encPtr) + 1;
76    } else {
77      encTmp[i] = ".notdef";
78    }
79  }
80  encTmp[256] = "custom";
81  T1_ReencodeFont(t1libIDA, encTmp);
82
83  ff = new SplashT1FontFile(engineA, idA, src,
84                              t1libIDA, encTmp, encStrTmp);
85  if (newsrc)
86    newsrc->unref();
87  return ff;
88}
89
90SplashT1FontFile::SplashT1FontFile(SplashT1FontEngine *engineA,
91                                   SplashFontFileID *idA,
92                                   SplashFontSrc *srcA,
93                                   int t1libIDA, char **encA, char *encStrA):
94  SplashFontFile(idA, srcA)
95{
96  engine = engineA;
97  t1libID = t1libIDA;
98  enc = encA;
99  encStr = encStrA;
100}
101
102SplashT1FontFile::~SplashT1FontFile() {
103  gfree(encStr);
104  gfree(enc);
105  T1_DeleteFont(t1libID);
106}
107
108SplashFont *SplashT1FontFile::makeFont(SplashCoord *mat) {
109  SplashFont *font;
110
111  font = new SplashT1Font(this, mat);
112  font->initCache();
113  return font;
114}
115
116#endif // HAVE_T1LIB_H
Note: See TracBrowser for help on using the repository browser.