READ_ULONG (stream, nRecords);
sub14->nRecords = nRecords;
OTF_MALLOC (sub14->Records, nRecords, "(EncodingSubtable14-Records)");
- for (i = 0; i < sub14->nRecords; i++)
+ for (i = 0; i < sub14->nRecords; i++)
{
unsigned varSelector=0, defaultUVSOffset, nonDefaultUVSOffset;
READ_ULONG (stream, nonDefaultUVSOffset);
sub14->Records[i].nonDefaultUVSOffset = nonDefaultUVSOffset;
}
- for (i = 0; i < sub14->nRecords; i++)
+ for (i = 0; i < sub14->nRecords; i++)
{
OTF_VariationSelectorRecord *record = &sub14->Records[i];
unsigned defaultUVSOffset = record->defaultUVSOffset;
unsigned nonDefaultUVSOffset = record->nonDefaultUVSOffset;
- if (defaultUVSOffset)
+ if (defaultUVSOffset)
{
unsigned numUnicodeValueRanges;
SEEK_STREAM (stream, offset+defaultUVSOffset);
READ_ULONG (stream, numUnicodeValueRanges);
record->numUnicodeValueRanges = numUnicodeValueRanges;
- OTF_MALLOC (record->unicodeValueRanges,
+ OTF_MALLOC (record->unicodeValueRanges,
numUnicodeValueRanges,
"(EncodingSubtable14-Records-unicodeValueRanges)");
for (j = 0; j < numUnicodeValueRanges; j++)
{
- OTF_UnicodeValueRange *unicodeValueRange
+ OTF_UnicodeValueRange *unicodeValueRange
= &record->unicodeValueRanges[j];
unsigned startUnicodeValue;
char additionalCount;
= (unsigned short) additionalCount;
}
}
- if (nonDefaultUVSOffset)
+ if (nonDefaultUVSOffset)
{
unsigned numUVSMappings;
cmap->EncodingRecord[i].subtable.format = format;
if (format == 14)
{
- READ_ULONG (stream, cmap->EncodingRecord[i].subtable.length);
+ READ_ULONG (stream, cmap->EncodingRecord[i].subtable.length);
cmap->EncodingRecord[i].subtable.language = 0;
}
else
{
unsigned off;
unsigned rest = 2 * (segCount - j);
-
+
READ_USHORT (stream, off);
if (off == 0)
sub4->segments[j].idRangeOffset = 0xFFFF;
count = read_glyph_ids (otf, stream, &reverse_chain->Substitute, 0, -1);
if (count <= 0)
return -1;
- reverse_chain->GlyphCount = count;
+ reverse_chain->GlyphCount = count;
return 0;
}
OTF_Tag gsub_tag = OTF_tag ("GSUB");
OTF_Tag gpos_tag = OTF_tag ("GPOS");
OTF_Stream *stream = make_stream ("Offset Table");
+ unsigned char ttctag[4];
if (! stream)
return -1;
internal_data->header_stream = stream;
- /* Size of Offset Table is 12 bytes. */
- if (setup_stream (stream, fp, 0, 12) < 0)
+ /* Size of Offset Table is 12 bytes. Size of TTC header
+ (including only the an offset of the first font) is 16. */
+ if (setup_stream (stream, fp, 0, 16) < 0)
return -1;
+ READ_BYTES (stream, ttctag, 4);
+ if (memcmp (ttctag, "ttcf", 4) == 0)
+ {
+ /* This is a TrueType Collection file. We extract the first font. */
+ unsigned version, numfonts, offset;
+ READ_ULONG (stream, version);
+ READ_ULONG (stream, numfonts);
+ READ_ULONG (stream, offset); /* Offset of the first font. */
+ if (setup_stream (stream, fp, offset, 12) < 0)
+ return -1;
+ }
+ else
+ SEEK_STREAM (stream, 0L);
if (read_offset_table (otf, stream, &otf->offset_table) < 0)
return -1;
-
/* Size of each Table Directory is 16 bytes. */
- if (setup_stream (stream, fp, 12, 16 * otf->offset_table.numTables) < 0)
+ if (setup_stream (stream, fp, stream->pos,
+ 16 * otf->offset_table.numTables) < 0)
return -1;
OTF_CALLOC (otf->table_dirs, otf->offset_table.numTables,
if (len < 4
|| ext[0] != '.'
- || (ext[1] != 'O' && ext[1] != 'T' && ext[1] != 'o' && ext[1] != 't')
- || (ext[2] != 'T' && ext[2] != 't')
- || (ext[3] != 'F' && ext[3] != 'f'))
+ || (strncasecmp (ext + 1, "otf", 3)
+ && strncasecmp (ext + 1, "ttf", 3)
+ && strncasecmp (ext + 1, "ttc", 3)))
OTF_ERROR (OTF_ERROR_FILE, otf_name);
fp = fopen (otf_name, "r");
if (! fp)
if (! otf)
OTF_ERROR (OTF_ERROR_MEMORY, "body allocation");
otf->filename = NULL;
-
+
internal_data = calloc (1, sizeof (OTF_InternalData));
if (! internal_data)
OTF_ERROR (OTF_ERROR_MEMORY, " (InternalData");
{
OTF_InternalData *internal_data = (OTF_InternalData *) otf->internal_data;
OTF_ApplicationData *app_data = internal_data->app_data;
-
+
for (; app_data; app_data = app_data->next)
if (strcmp (app_data->id, id) == 0)
return app_data->data;