Lines 233-242
Link Here
|
233 |
// FoFiTrueType |
233 |
// FoFiTrueType |
234 |
//------------------------------------------------------------------------ |
234 |
//------------------------------------------------------------------------ |
235 |
|
235 |
|
236 |
FoFiTrueType *FoFiTrueType::make(char *fileA, int lenA) { |
236 |
FoFiTrueType *FoFiTrueType::make(char *fileA, int lenA, int faceIndexA) { |
237 |
FoFiTrueType *ff; |
237 |
FoFiTrueType *ff; |
238 |
|
238 |
|
239 |
ff = new FoFiTrueType(fileA, lenA, gFalse); |
239 |
ff = new FoFiTrueType(fileA, lenA, gFalse, faceIndexA); |
240 |
if (!ff->parsedOk) { |
240 |
if (!ff->parsedOk) { |
241 |
delete ff; |
241 |
delete ff; |
242 |
return NULL; |
242 |
return NULL; |
Lines 244-250
Link Here
|
244 |
return ff; |
244 |
return ff; |
245 |
} |
245 |
} |
246 |
|
246 |
|
247 |
FoFiTrueType *FoFiTrueType::load(char *fileName) { |
247 |
FoFiTrueType *FoFiTrueType::load(char *fileName, int faceIndexA) { |
248 |
FoFiTrueType *ff; |
248 |
FoFiTrueType *ff; |
249 |
char *fileA; |
249 |
char *fileA; |
250 |
int lenA; |
250 |
int lenA; |
Lines 252-258
Link Here
|
252 |
if (!(fileA = FoFiBase::readFile(fileName, &lenA))) { |
252 |
if (!(fileA = FoFiBase::readFile(fileName, &lenA))) { |
253 |
return NULL; |
253 |
return NULL; |
254 |
} |
254 |
} |
255 |
ff = new FoFiTrueType(fileA, lenA, gTrue); |
255 |
ff = new FoFiTrueType(fileA, lenA, gTrue, faceIndexA); |
256 |
if (!ff->parsedOk) { |
256 |
if (!ff->parsedOk) { |
257 |
delete ff; |
257 |
delete ff; |
258 |
return NULL; |
258 |
return NULL; |
Lines 260-266
Link Here
|
260 |
return ff; |
260 |
return ff; |
261 |
} |
261 |
} |
262 |
|
262 |
|
263 |
FoFiTrueType::FoFiTrueType(char *fileA, int lenA, GBool freeFileDataA): |
263 |
FoFiTrueType::FoFiTrueType(char *fileA, int lenA, GBool freeFileDataA, int faceIndexA): |
264 |
FoFiBase(fileA, lenA, freeFileDataA) |
264 |
FoFiBase(fileA, lenA, freeFileDataA) |
265 |
{ |
265 |
{ |
266 |
tables = NULL; |
266 |
tables = NULL; |
Lines 269-274
Link Here
|
269 |
nCmaps = 0; |
269 |
nCmaps = 0; |
270 |
nameToGID = NULL; |
270 |
nameToGID = NULL; |
271 |
parsedOk = gFalse; |
271 |
parsedOk = gFalse; |
|
|
272 |
faceIndex = faceIndexA; |
272 |
|
273 |
|
273 |
parse(); |
274 |
parse(); |
274 |
} |
275 |
} |
Lines 1262-1279
Link Here
|
1262 |
return checksum; |
1263 |
return checksum; |
1263 |
} |
1264 |
} |
1264 |
|
1265 |
|
|
|
1266 |
#define toTag(a,b,c,d) (((unsigned int)(a)<<24) | ((unsigned int)(b)<<16) | ((unsigned int)(c)<<8) | (d)) |
1267 |
|
1265 |
void FoFiTrueType::parse() { |
1268 |
void FoFiTrueType::parse() { |
1266 |
int pos, i, j; |
1269 |
int pos, i, j; |
|
|
1270 |
unsigned int head; |
1267 |
|
1271 |
|
1268 |
parsedOk = gTrue; |
1272 |
parsedOk = gTrue; |
1269 |
|
1273 |
|
|
|
1274 |
pos = 0; |
1270 |
// read the table directory |
1275 |
// read the table directory |
1271 |
nTables = getU16BE(4, &parsedOk); |
1276 |
head = getU32BE(pos, &parsedOk); |
|
|
1277 |
if (! parsedOk) |
1278 |
return; |
1279 |
if (head == toTag('t','t','c','f')) { |
1280 |
/* TTC font */ |
1281 |
unsigned int tableDir; |
1282 |
int dircount; |
1283 |
|
1284 |
dircount = getU32BE(8, &parsedOk); |
1285 |
if (!parsedOk) |
1286 |
return; |
1287 |
if (! dircount) { |
1288 |
parsedOk = gFalse; |
1289 |
return; |
1290 |
} |
1291 |
|
1292 |
if (faceIndex >= dircount) |
1293 |
faceIndex = 0; |
1294 |
pos = getU32BE(12 + faceIndex * 4, &parsedOk); |
1295 |
if (! parsedOk) |
1296 |
return; |
1297 |
} |
1298 |
|
1299 |
pos += 4; |
1300 |
nTables = getU16BE(pos, &parsedOk); |
1272 |
if (!parsedOk) { |
1301 |
if (!parsedOk) { |
1273 |
return; |
1302 |
return; |
1274 |
} |
1303 |
} |
|
|
1304 |
|
1305 |
pos += 8; |
1275 |
tables = (TrueTypeTable *)gmalloc(nTables * sizeof(TrueTypeTable)); |
1306 |
tables = (TrueTypeTable *)gmalloc(nTables * sizeof(TrueTypeTable)); |
1276 |
pos = 12; |
|
|
1277 |
for (i = 0; i < nTables; ++i) { |
1307 |
for (i = 0; i < nTables; ++i) { |
1278 |
tables[i].tag = getU32BE(pos, &parsedOk); |
1308 |
tables[i].tag = getU32BE(pos, &parsedOk); |
1279 |
tables[i].checksum = getU32BE(pos + 4, &parsedOk); |
1309 |
tables[i].checksum = getU32BE(pos + 4, &parsedOk); |