Coverage Report

Created: 2023-09-25 06:41

/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