|
From: <md...@us...> - 2010-02-09 13:04:51
|
Revision: 8122
http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8122&view=rev
Author: mdboom
Date: 2010-02-09 13:04:44 +0000 (Tue, 09 Feb 2010)
Log Message:
-----------
Use a custom encoding containing all of the used glyphs when writing out a Postscript Type 3 font. This resolves a bug when converting Ps output containing non-standard characters (such as the minus sign) to Pdf using ps2pdf/gs 8.7 or later.
Modified Paths:
--------------
trunk/matplotlib/lib/matplotlib/backends/backend_ps.py
trunk/matplotlib/ttconv/pprdrv_tt.cpp
Modified: trunk/matplotlib/lib/matplotlib/backends/backend_ps.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_ps.py 2010-02-08 17:50:27 UTC (rev 8121)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_ps.py 2010-02-09 13:04:44 UTC (rev 8122)
@@ -396,7 +396,7 @@
imagecmd = "false 3 colorimage"
return h, w, bits, imagecmd
-
+
def draw_image(self, gc, x, y, im, dx=None, dy=None, transform=None):
"""
Draw the Image instance into the current axes; x is the
@@ -1110,6 +1110,14 @@
for c in chars:
gind = cmap.get(c) or 0
glyph_ids.append(gind)
+
+ fonttype = rcParams['ps.fonttype']
+
+ # Can not use more than 255 characters from a
+ # single font for Type 3
+ if len(glyph_ids) > 255:
+ fonttype = 42
+
# The ttf to ps (subsetting) support doesn't work for
# OpenType fonts that are Postscript inside (like the
# STIX fonts). This will simply turn that off to avoid
@@ -1118,7 +1126,7 @@
raise RuntimeError("OpenType CFF fonts can not be saved using the internal Postscript backend at this time.\nConsider using the Cairo backend.")
else:
fonttype = rcParams['ps.fonttype']
- convert_ttf_to_ps(font_filename, fh, rcParams['ps.fonttype'], glyph_ids)
+ convert_ttf_to_ps(font_filename, fh, fonttype, glyph_ids)
print >>fh, "end"
print >>fh, "%%EndProlog"
@@ -1394,7 +1402,7 @@
"""
paper_option = "-sPAPERSIZE=%s" % ptype
-
+
psfile = tmpfile + '.ps'
outfile = tmpfile + '.output'
dpi = rcParams['ps.distiller.res']
@@ -1436,7 +1444,7 @@
if eps: paper_option = "-dEPSCrop"
else: paper_option = "-sPAPERSIZE=%s" % ptype
-
+
command = 'ps2pdf -dAutoFilterColorImages=false \
-sColorImageFilter=FlateEncode %s "%s" "%s" > "%s"'% \
(paper_option, tmpfile, pdffile, outfile)
Modified: trunk/matplotlib/ttconv/pprdrv_tt.cpp
===================================================================
--- trunk/matplotlib/ttconv/pprdrv_tt.cpp 2010-02-08 17:50:27 UTC (rev 8121)
+++ trunk/matplotlib/ttconv/pprdrv_tt.cpp 2010-02-09 13:04:44 UTC (rev 8122)
@@ -58,10 +58,10 @@
ULONG val=0;
for(x=0; x<4; x++)
- {
- val *= 0x100;
- val += p[x];
- }
+ {
+ val *= 0x100;
+ val += p[x];
+ }
return val;
} /* end of ftohULONG() */
@@ -75,10 +75,10 @@
USHORT val=0;
for(x=0; x<2; x++)
- {
- val *= 0x100;
- val += p[x];
- }
+ {
+ val *= 0x100;
+ val += p[x];
+ }
return val;
} /* end of getUSHORT() */
@@ -120,38 +120,38 @@
ptr = font->offset_table + 12;
x=0;
while(TRUE)
- {
- if( strncmp((const char*)ptr,name,4) == 0 )
- {
- ULONG offset,length;
- BYTE *table;
+ {
+ if( strncmp((const char*)ptr,name,4) == 0 )
+ {
+ ULONG offset,length;
+ BYTE *table;
- offset = getULONG( ptr + 8 );
- length = getULONG( ptr + 12 );
- table = (BYTE*)calloc( sizeof(BYTE), length );
+ offset = getULONG( ptr + 8 );
+ length = getULONG( ptr + 12 );
+ table = (BYTE*)calloc( sizeof(BYTE), length );
- try {
+ try {
#ifdef DEBUG_TRUETYPE
- debug("Loading table \"%s\" from offset %d, %d bytes",name,offset,length);
+ debug("Loading table \"%s\" from offset %d, %d bytes",name,offset,length);
#endif
- if( fseek( font->file, (long)offset, SEEK_SET ) )
- throw TTException("TrueType font may be corrupt (reason 3)");
+ if( fseek( font->file, (long)offset, SEEK_SET ) )
+ throw TTException("TrueType font may be corrupt (reason 3)");
- if( fread(table,sizeof(BYTE),length,font->file) != (sizeof(BYTE) * length))
- throw TTException("TrueType font may be corrupt (reason 4)");
- } catch (TTException& ) {
- free(table);
- throw;
- }
- return table;
- }
+ if( fread(table,sizeof(BYTE),length,font->file) != (sizeof(BYTE) * length))
+ throw TTException("TrueType font may be corrupt (reason 4)");
+ } catch (TTException& ) {
+ free(table);
+ throw;
+ }
+ return table;
+ }
- x++;
- ptr += 16;
- if(x == font->numTables)
- throw TTException("TrueType font is missing table");
- }
+ x++;
+ ptr += 16;
+ if(x == font->numTables)
+ throw TTException("TrueType font is missing table");
+ }
} /* end of GetTable() */
@@ -165,12 +165,12 @@
void Read_name(struct TTFONT *font)
{
BYTE *table_ptr,*ptr2;
- int numrecords; /* Number of strings in this table */
- BYTE *strings; /* pointer to start of string storage */
+ int numrecords; /* Number of strings in this table */
+ BYTE *strings; /* pointer to start of string storage */
int x;
- int platform,encoding; /* Current platform id, encoding id, */
- int language,nameid; /* language id, name id, */
- int offset,length; /* offset and length of string. */
+ int platform,encoding; /* Current platform id, encoding id, */
+ int language,nameid; /* language id, name id, */
+ int offset,length; /* offset and length of string. */
#ifdef DEBUG_TRUETYPE
debug("Read_name()");
@@ -192,136 +192,136 @@
}
font->Copyright = font->Trademark = (char*)NULL;
- table_ptr = GetTable(font, "name"); /* pointer to table */
+ table_ptr = GetTable(font, "name"); /* pointer to table */
try {
- numrecords = getUSHORT( table_ptr + 2 ); /* number of names */
- strings = table_ptr + getUSHORT( table_ptr + 4 ); /* start of string storage */
+ numrecords = getUSHORT( table_ptr + 2 ); /* number of names */
+ strings = table_ptr + getUSHORT( table_ptr + 4 ); /* start of string storage */
ptr2 = table_ptr + 6;
for(x=0; x < numrecords; x++,ptr2+=12)
- {
- platform = getUSHORT(ptr2);
- encoding = getUSHORT(ptr2+2);
- language = getUSHORT(ptr2+4);
- nameid = getUSHORT(ptr2+6);
- length = getUSHORT(ptr2+8);
- offset = getUSHORT(ptr2+10);
+ {
+ platform = getUSHORT(ptr2);
+ encoding = getUSHORT(ptr2+2);
+ language = getUSHORT(ptr2+4);
+ nameid = getUSHORT(ptr2+6);
+ length = getUSHORT(ptr2+8);
+ offset = getUSHORT(ptr2+10);
#ifdef DEBUG_TRUETYPE
- debug("platform %d, encoding %d, language 0x%x, name %d, offset %d, length %d",
- platform,encoding,language,nameid,offset,length);
+ debug("platform %d, encoding %d, language 0x%x, name %d, offset %d, length %d",
+ platform,encoding,language,nameid,offset,length);
#endif
- /* Copyright notice */
- if( platform == 1 && nameid == 0 )
- {
- font->Copyright = (char*)calloc(sizeof(char),length+1);
- strncpy(font->Copyright,(const char*)strings+offset,length);
- font->Copyright[length]=(char)NULL;
- replace_newlines_with_spaces(font->Copyright);
+ /* Copyright notice */
+ if( platform == 1 && nameid == 0 )
+ {
+ font->Copyright = (char*)calloc(sizeof(char),length+1);
+ strncpy(font->Copyright,(const char*)strings+offset,length);
+ font->Copyright[length]=(char)NULL;
+ replace_newlines_with_spaces(font->Copyright);
#ifdef DEBUG_TRUETYPE
- debug("font->Copyright=\"%s\"",font->Copyright);
+ debug("font->Copyright=\"%s\"",font->Copyright);
#endif
- continue;
- }
+ continue;
+ }
- /* Font Family name */
- if( platform == 1 && nameid == 1 )
- {
- free(font->FamilyName);
- font->FamilyName = (char*)calloc(sizeof(char),length+1);
- strncpy(font->FamilyName,(const char*)strings+offset,length);
- font->FamilyName[length]=(char)NULL;
- replace_newlines_with_spaces(font->FamilyName);
+ /* Font Family name */
+ if( platform == 1 && nameid == 1 )
+ {
+ free(font->FamilyName);
+ font->FamilyName = (char*)calloc(sizeof(char),length+1);
+ strncpy(font->FamilyName,(const char*)strings+offset,length);
+ font->FamilyName[length]=(char)NULL;
+ replace_newlines_with_spaces(font->FamilyName);
#ifdef DEBUG_TRUETYPE
- debug("font->FamilyName=\"%s\"",font->FamilyName);
+ debug("font->FamilyName=\"%s\"",font->FamilyName);
#endif
- continue;
- }
+ continue;
+ }
- /* Font Family name */
- if( platform == 1 && nameid == 2 )
- {
- free(font->Style);
- font->Style = (char*)calloc(sizeof(char),length+1);
- strncpy(font->Style,(const char*)strings+offset,length);
- font->Style[length]=(char)NULL;
- replace_newlines_with_spaces(font->Style);
+ /* Font Family name */
+ if( platform == 1 && nameid == 2 )
+ {
+ free(font->Style);
+ font->Style = (char*)calloc(sizeof(char),length+1);
+ strncpy(font->Style,(const char*)strings+offset,length);
+ font->Style[length]=(char)NULL;
+ replace_newlines_with_spaces(font->Style);
#ifdef DEBUG_TRUETYPE
- debug("font->Style=\"%s\"",font->Style);
+ debug("font->Style=\"%s\"",font->Style);
#endif
- continue;
- }
+ continue;
+ }
- /* Full Font name */
- if( platform == 1 && nameid == 4 )
- {
- free(font->FullName);
- font->FullName = (char*)calloc(sizeof(char),length+1);
- strncpy(font->FullName,(const char*)strings+offset,length);
- font->FullName[length]=(char)NULL;
- replace_newlines_with_spaces(font->FullName);
+ /* Full Font name */
+ if( platform == 1 && nameid == 4 )
+ {
+ free(font->FullName);
+ font->FullName = (char*)calloc(sizeof(char),length+1);
+ strncpy(font->FullName,(const char*)strings+offset,length);
+ font->FullName[length]=(char)NULL;
+ replace_newlines_with_spaces(font->FullName);
#ifdef DEBUG_TRUETYPE
- debug("font->FullName=\"%s\"",font->FullName);
+ debug("font->FullName=\"%s\"",font->FullName);
#endif
- continue;
- }
+ continue;
+ }
- /* Version string */
- if( platform == 1 && nameid == 5 )
- {
- free(font->Version);
- font->Version = (char*)calloc(sizeof(char),length+1);
- strncpy(font->Version,(const char*)strings+offset,length);
- font->Version[length]=(char)NULL;
- replace_newlines_with_spaces(font->Version);
+ /* Version string */
+ if( platform == 1 && nameid == 5 )
+ {
+ free(font->Version);
+ font->Version = (char*)calloc(sizeof(char),length+1);
+ strncpy(font->Version,(const char*)strings+offset,length);
+ font->Version[length]=(char)NULL;
+ replace_newlines_with_spaces(font->Version);
#ifdef DEBUG_TRUETYPE
- debug("font->Version=\"%s\"",font->Version);
+ debug("font->Version=\"%s\"",font->Version);
#endif
- continue;
- }
+ continue;
+ }
- /* PostScript name */
- if( platform == 1 && nameid == 6 )
- {
- free(font->PostName);
- font->PostName = (char*)calloc(sizeof(char),length+1);
- strncpy(font->PostName,(const char*)strings+offset,length);
- font->PostName[length]=(char)NULL;
- replace_newlines_with_spaces(font->PostName);
+ /* PostScript name */
+ if( platform == 1 && nameid == 6 )
+ {
+ free(font->PostName);
+ font->PostName = (char*)calloc(sizeof(char),length+1);
+ strncpy(font->PostName,(const char*)strings+offset,length);
+ font->PostName[length]=(char)NULL;
+ replace_newlines_with_spaces(font->PostName);
#ifdef DEBUG_TRUETYPE
- debug("font->PostName=\"%s\"",font->PostName);
+ debug("font->PostName=\"%s\"",font->PostName);
#endif
- continue;
- }
+ continue;
+ }
- /* Trademark string */
- if( platform == 1 && nameid == 7 )
- {
- font->Trademark = (char*)calloc(sizeof(char),length+1);
- strncpy(font->Trademark,(const char*)strings+offset,length);
- font->Trademark[length]=(char)NULL;
- replace_newlines_with_spaces(font->Trademark);
+ /* Trademark string */
+ if( platform == 1 && nameid == 7 )
+ {
+ font->Trademark = (char*)calloc(sizeof(char),length+1);
+ strncpy(font->Trademark,(const char*)strings+offset,length);
+ font->Trademark[length]=(char)NULL;
+ replace_newlines_with_spaces(font->Trademark);
#ifdef DEBUG_TRUETYPE
- debug("font->Trademark=\"%s\"",font->Trademark);
+ debug("font->Trademark=\"%s\"",font->Trademark);
#endif
- continue;
- }
+ continue;
+ }
- }
+ }
} catch (TTException& ) {
free(table_ptr);
throw;
@@ -346,17 +346,17 @@
** font manufacturer's revision number for the font.
*/
if( font->target_type == PS_TYPE_42 )
- {
- stream.printf("%%!PS-TrueTypeFont-%d.%d-%d.%d\n",
- font->TTVersion.whole, font->TTVersion.fraction,
- font->MfrRevision.whole, font->MfrRevision.fraction);
- }
+ {
+ stream.printf("%%!PS-TrueTypeFont-%d.%d-%d.%d\n",
+ font->TTVersion.whole, font->TTVersion.fraction,
+ font->MfrRevision.whole, font->MfrRevision.fraction);
+ }
/* If it is not a Type 42 font, we will use a different format. */
else
- {
- stream.putline("%!PS-Adobe-3.0 Resource-Font");
- } /* See RBIIp 641 */
+ {
+ stream.putline("%!PS-Adobe-3.0 Resource-Font");
+ } /* See RBIIp 641 */
/* We will make the title the name of the font. */
stream.printf("%%%%Title: %s\n",font->FullName);
@@ -367,46 +367,46 @@
/* We created this file. */
if( font->target_type == PS_TYPE_42 )
- stream.putline("%%Creator: Converted from TrueType to type 42 by PPR");
+ stream.putline("%%Creator: Converted from TrueType to type 42 by PPR");
else
- stream.putline("%%Creator: Converted from TrueType by PPR");
+ stream.putline("%%Creator: Converted from TrueType by PPR");
/* If VM usage information is available, print it. */
if( font->target_type == PS_TYPE_42 )
- {
- VMMin = (int)getULONG( font->post_table + 16 );
- VMMax = (int)getULONG( font->post_table + 20 );
- if( VMMin > 0 && VMMax > 0 )
- stream.printf("%%%%VMUsage: %d %d\n",VMMin,VMMax);
- }
+ {
+ VMMin = (int)getULONG( font->post_table + 16 );
+ VMMax = (int)getULONG( font->post_table + 20 );
+ if( VMMin > 0 && VMMax > 0 )
+ stream.printf("%%%%VMUsage: %d %d\n",VMMin,VMMax);
+ }
/* Start the dictionary which will eventually */
/* become the font. */
if( font->target_type != PS_TYPE_3 )
- {
- stream.putline("15 dict begin");
- }
+ {
+ stream.putline("15 dict begin");
+ }
else
- {
- stream.putline("25 dict begin");
+ {
+ stream.putline("25 dict begin");
- /* Type 3 fonts will need some subroutines here. */
- stream.putline("/_d{bind def}bind def");
- stream.putline("/_m{moveto}_d");
- stream.putline("/_l{lineto}_d");
- stream.putline("/_cl{closepath eofill}_d");
- stream.putline("/_c{curveto}_d");
- stream.putline("/_sc{7 -1 roll{setcachedevice}{pop pop pop pop pop pop}ifelse}_d");
- stream.putline("/_e{exec}_d");
- }
+ /* Type 3 fonts will need some subroutines here. */
+ stream.putline("/_d{bind def}bind def");
+ stream.putline("/_m{moveto}_d");
+ stream.putline("/_l{lineto}_d");
+ stream.putline("/_cl{closepath eofill}_d");
+ stream.putline("/_c{curveto}_d");
+ stream.putline("/_sc{7 -1 roll{setcachedevice}{pop pop pop pop pop pop}ifelse}_d");
+ stream.putline("/_e{exec}_d");
+ }
stream.printf("/FontName /%s def\n",font->PostName);
stream.putline("/PaintType 0 def");
if(font->target_type == PS_TYPE_42)
- stream.putline("/FontMatrix[1 0 0 1 0 0]def");
+ stream.putline("/FontMatrix[1 0 0 1 0 0]def");
else
- stream.putline("/FontMatrix[.001 0 0 .001 0 0]def");
+ stream.putline("/FontMatrix[.001 0 0 .001 0 0]def");
stream.printf("/FontBBox[%d %d %d %d]def\n",font->llx,font->lly,font->urx,font->ury);
stream.printf("/FontType %d def\n", font->target_type );
@@ -414,11 +414,25 @@
/*-------------------------------------------------------------
** Define the encoding array for this font.
-** It seems best to just use "Standard".
+** Since we don't really want to deal with converting all of
+** the possible font encodings in the wild to a standard PS
+** one, we just explicitly create one for each font.
-------------------------------------------------------------*/
-void ttfont_encoding(TTStreamWriter& stream)
+void ttfont_encoding(TTStreamWriter& stream, struct TTFONT *font, std::vector<int>& glyph_ids, font_type_enum target_type)
{
- stream.putline("/Encoding StandardEncoding def");
+ if (target_type == PS_TYPE_3) {
+ stream.printf("/Encoding [ ");
+
+ for (std::vector<int>::const_iterator i = glyph_ids.begin();
+ i != glyph_ids.end(); ++i) {
+ const char* name = ttfont_CharStrings_getname(font, *i);
+ stream.printf("/%s ", name);
+ }
+
+ stream.printf("] def\n");
+ } else {
+ stream.putline("/Encoding StandardEncoding def");
+ }
} /* end of ttfont_encoding() */
/*-----------------------------------------------------------
@@ -439,13 +453,13 @@
stream.printf("/FullName (%s) def\n",font->FullName);
if( font->Copyright != (char*)NULL || font->Trademark != (char*)NULL )
- {
- stream.printf("/Notice (%s",
- font->Copyright != (char*)NULL ? font->Copyright : "");
- stream.printf("%s%s) def\n",
- font->Trademark != (char*)NULL ? " " : "",
- font->Trademark != (char*)NULL ? font->Trademark : "");
- }
+ {
+ stream.printf("/Notice (%s",
+ font->Copyright != (char*)NULL ? font->Copyright : "");
+ stream.printf("%s%s) def\n",
+ font->Trademark != (char*)NULL ? " " : "",
+ font->Trademark != (char*)NULL ? font->Trademark : "");
+ }
/* This information is not quite correct. */
stream.printf("/Weight (%s) def\n",font->Style);
@@ -494,12 +508,12 @@
static const char hexdigits[]="0123456789ABCDEF";
if(!in_string)
- {
- stream.put_char('<');
- string_len=0;
- line_len++;
- in_string=TRUE;
- }
+ {
+ stream.put_char('<');
+ string_len=0;
+ line_len++;
+ in_string=TRUE;
+ }
stream.put_char( hexdigits[ n / 16 ] );
stream.put_char( hexdigits[ n % 16 ] );
@@ -507,10 +521,10 @@
line_len+=2;
if(line_len > 70)
- {
- stream.put_char('\n');
- line_len=0;
- }
+ {
+ stream.put_char('\n');
+ line_len=0;
+ }
} /* end of sfnts_pputBYTE() */
@@ -553,17 +567,17 @@
void sfnts_end_string(TTStreamWriter& stream)
{
if(in_string)
- {
- string_len=0; /* fool sfnts_pputBYTE() */
+ {
+ string_len=0; /* fool sfnts_pputBYTE() */
- #ifdef DEBUG_TRUETYPE_INLINE
- puts("\n% dummy byte:\n");
- #endif
+ #ifdef DEBUG_TRUETYPE_INLINE
+ puts("\n% dummy byte:\n");
+ #endif
- sfnts_pputBYTE(stream, 0); /* extra byte for pre-2013 compatibility */
- stream.put_char('>');
- line_len++;
- }
+ sfnts_pputBYTE(stream, 0); /* extra byte for pre-2013 compatibility */
+ stream.put_char('>');
+ line_len++;
+ }
in_string=FALSE;
} /* end of sfnts_end_string() */
@@ -589,7 +603,7 @@
ULONG off;
ULONG length;
int c;
- ULONG total=0; /* running total of bytes written to table */
+ ULONG total=0; /* running total of bytes written to table */
int x;
#ifdef DEBUG_TRUETYPE
@@ -604,58 +618,58 @@
/* Copy the glyphs one by one */
for(x=0; x < font->numGlyphs; x++)
- {
- /* Read the glyph offset from the index-to-location table. */
- if(font->indexToLocFormat == 0)
- {
- off = getUSHORT( font->loca_table + (x * 2) );
- off *= 2;
- length = getUSHORT( font->loca_table + ((x+1) * 2) );
- length *= 2;
- length -= off;
- }
- else
- {
- off = getULONG( font->loca_table + (x * 4) );
- length = getULONG( font->loca_table + ((x+1) * 4) );
- length -= off;
- }
+ {
+ /* Read the glyph offset from the index-to-location table. */
+ if(font->indexToLocFormat == 0)
+ {
+ off = getUSHORT( font->loca_table + (x * 2) );
+ off *= 2;
+ length = getUSHORT( font->loca_table + ((x+1) * 2) );
+ length *= 2;
+ length -= off;
+ }
+ else
+ {
+ off = getULONG( font->loca_table + (x * 4) );
+ length = getULONG( font->loca_table + ((x+1) * 4) );
+ length -= off;
+ }
- #ifdef DEBUG_TRUETYPE
- debug("glyph length=%d",(int)length);
- #endif
+ #ifdef DEBUG_TRUETYPE
+ debug("glyph length=%d",(int)length);
+ #endif
- /* Start new string if necessary. */
- sfnts_new_table( stream, (int)length );
+ /* Start new string if necessary. */
+ sfnts_new_table( stream, (int)length );
- /*
- ** Make sure the glyph is padded out to a
- ** two byte boundary.
- */
- if( length % 2 )
- throw TTException("TrueType font contains a 'glyf' table without 2 byte padding");
+ /*
+ ** Make sure the glyph is padded out to a
+ ** two byte boundary.
+ */
+ if( length % 2 )
+ throw TTException("TrueType font contains a 'glyf' table without 2 byte padding");
- /* Copy the bytes of the glyph. */
- while( length-- )
- {
- if( (c = fgetc(font->file)) == EOF )
- throw TTException("TrueType font may be corrupt (reason 6)");
+ /* Copy the bytes of the glyph. */
+ while( length-- )
+ {
+ if( (c = fgetc(font->file)) == EOF )
+ throw TTException("TrueType font may be corrupt (reason 6)");
- sfnts_pputBYTE(stream, c);
- total++; /* add to running total */
- }
+ sfnts_pputBYTE(stream, c);
+ total++; /* add to running total */
+ }
- }
+ }
free(font->loca_table);
font->loca_table = NULL;
/* Pad out to full length from table directory */
while( total < correct_total_length )
- {
- sfnts_pputBYTE(stream, 0);
- total++;
- }
+ {
+ sfnts_pputBYTE(stream, 0);
+ total++;
+ }
} /* end of sfnts_glyf_table() */
@@ -667,32 +681,32 @@
*/
void ttfont_sfnts(TTStreamWriter& stream, struct TTFONT *font)
{
- static const char *table_names[] = /* The names of all tables */
- { /* which it is worth while */
- "cvt ", /* to include in a Type 42 */
- "fpgm", /* PostScript font. */
- "glyf",
- "head",
- "hhea",
- "hmtx",
- "loca",
- "maxp",
- "prep"
- } ;
+ static const char *table_names[] = /* The names of all tables */
+ { /* which it is worth while */
+ "cvt ", /* to include in a Type 42 */
+ "fpgm", /* PostScript font. */
+ "glyf",
+ "head",
+ "hhea",
+ "hmtx",
+ "loca",
+ "maxp",
+ "prep"
+ } ;
- struct { /* The location of each of */
- ULONG oldoffset; /* the above tables. */
- ULONG newoffset;
- ULONG length;
- ULONG checksum;
- } tables[9];
+ struct { /* The location of each of */
+ ULONG oldoffset; /* the above tables. */
+ ULONG newoffset;
+ ULONG length;
+ ULONG checksum;
+ } tables[9];
- BYTE *ptr; /* A pointer into the origional table directory. */
- ULONG x,y; /* General use loop countes. */
- int c; /* Input character. */
+ BYTE *ptr; /* A pointer into the origional table directory. */
+ ULONG x,y; /* General use loop countes. */
+ int c; /* Input character. */
int diff;
ULONG nextoffset;
- int count; /* How many `important' tables did we find? */
+ int count; /* How many `important' tables did we find? */
ptr = font->offset_table + 12;
nextoffset=0;
@@ -703,32 +717,32 @@
** statistics in tables[].
*/
for(x=0; x < 9; x++ )
- {
- do {
- diff = strncmp( (char*)ptr, table_names[x], 4 );
+ {
+ do {
+ diff = strncmp( (char*)ptr, table_names[x], 4 );
- if( diff > 0 ) /* If we are past it. */
- {
- tables[x].length = 0;
- diff = 0;
- }
- else if( diff < 0 ) /* If we haven't hit it yet. */
- {
- ptr += 16;
- }
- else if( diff == 0 ) /* Here it is! */
- {
- tables[x].newoffset = nextoffset;
- tables[x].checksum = getULONG( ptr + 4 );
- tables[x].oldoffset = getULONG( ptr + 8 );
- tables[x].length = getULONG( ptr + 12 );
- nextoffset += ( ((tables[x].length + 3) / 4) * 4 );
- count++;
- ptr += 16;
- }
- } while(diff != 0);
+ if( diff > 0 ) /* If we are past it. */
+ {
+ tables[x].length = 0;
+ diff = 0;
+ }
+ else if( diff < 0 ) /* If we haven't hit it yet. */
+ {
+ ptr += 16;
+ }
+ else if( diff == 0 ) /* Here it is! */
+ {
+ tables[x].newoffset = nextoffset;
+ tables[x].checksum = getULONG( ptr + 4 );
+ tables[x].oldoffset = getULONG( ptr + 8 );
+ tables[x].length = getULONG( ptr + 12 );
+ nextoffset += ( ((tables[x].length + 3) / 4) * 4 );
+ count++;
+ ptr += 16;
+ }
+ } while(diff != 0);
- } /* end of for loop which passes over the table directory */
+ } /* end of for loop which passes over the table directory */
/* Begin the sfnts array. */
sfnts_start(stream);
@@ -737,95 +751,95 @@
/* Start by copying the TrueType version number. */
ptr = font->offset_table;
for(x=0; x < 4; x++)
- {
- sfnts_pputBYTE( stream, *(ptr++) );
- }
+ {
+ sfnts_pputBYTE( stream, *(ptr++) );
+ }
/* Now, generate those silly numTables numbers. */
- sfnts_pputUSHORT(stream, count); /* number of tables */
+ sfnts_pputUSHORT(stream, count); /* number of tables */
if( count == 9 )
- {
- sfnts_pputUSHORT(stream, 7); /* searchRange */
- sfnts_pputUSHORT(stream, 3); /* entrySelector */
- sfnts_pputUSHORT(stream, 81); /* rangeShift */
- }
+ {
+ sfnts_pputUSHORT(stream, 7); /* searchRange */
+ sfnts_pputUSHORT(stream, 3); /* entrySelector */
+ sfnts_pputUSHORT(stream, 81); /* rangeShift */
+ }
#ifdef DEBUG_TRUETYPE
else
- {
- debug("only %d tables selected",count);
- }
+ {
+ debug("only %d tables selected",count);
+ }
#endif
/* Now, emmit the table directory. */
for(x=0; x < 9; x++)
- {
- if( tables[x].length == 0 ) /* Skip missing tables */
- continue;
+ {
+ if( tables[x].length == 0 ) /* Skip missing tables */
+ continue;
- /* Name */
- sfnts_pputBYTE( stream, table_names[x][0] );
- sfnts_pputBYTE( stream, table_names[x][1] );
- sfnts_pputBYTE( stream, table_names[x][2] );
- sfnts_pputBYTE( stream, table_names[x][3] );
+ /* Name */
+ sfnts_pputBYTE( stream, table_names[x][0] );
+ sfnts_pputBYTE( stream, table_names[x][1] );
+ sfnts_pputBYTE( stream, table_names[x][2] );
+ sfnts_pputBYTE( stream, table_names[x][3] );
- /* Checksum */
- sfnts_pputULONG( stream, tables[x].checksum );
+ /* Checksum */
+ sfnts_pputULONG( stream, tables[x].checksum );
- /* Offset */
- sfnts_pputULONG( stream, tables[x].newoffset + 12 + (count * 16) );
+ /* Offset */
+ sfnts_pputULONG( stream, tables[x].newoffset + 12 + (count * 16) );
- /* Length */
- sfnts_pputULONG( stream, tables[x].length );
- }
+ /* Length */
+ sfnts_pputULONG( stream, tables[x].length );
+ }
/* Now, send the tables */
for(x=0; x < 9; x++)
- {
- if( tables[x].length == 0 ) /* skip tables that aren't there */
- continue;
+ {
+ if( tables[x].length == 0 ) /* skip tables that aren't there */
+ continue;
- #ifdef DEBUG_TRUETYPE
- debug("emmiting table '%s'",table_names[x]);
- #endif
+ #ifdef DEBUG_TRUETYPE
+ debug("emmiting table '%s'",table_names[x]);
+ #endif
- /* 'glyf' table gets special treatment */
- if( strcmp(table_names[x],"glyf")==0 )
- {
- sfnts_glyf_table(stream,font,tables[x].oldoffset,tables[x].length);
- }
- else /* Other tables may not exceed */
- { /* 65535 bytes in length. */
- if( tables[x].length > 65535 )
- throw TTException("TrueType font has a table which is too long");
+ /* 'glyf' table gets special treatment */
+ if( strcmp(table_names[x],"glyf")==0 )
+ {
+ sfnts_glyf_table(stream,font,tables[x].oldoffset,tables[x].length);
+ }
+ else /* Other tables may not exceed */
+ { /* 65535 bytes in length. */
+ if( tables[x].length > 65535 )
+ throw TTException("TrueType font has a table which is too long");
- /* Start new string if necessary. */
- sfnts_new_table(stream, tables[x].length);
+ /* Start new string if necessary. */
+ sfnts_new_table(stream, tables[x].length);
- /* Seek to proper position in the file. */
- fseek( font->file, tables[x].oldoffset, SEEK_SET );
+ /* Seek to proper position in the file. */
+ fseek( font->file, tables[x].oldoffset, SEEK_SET );
- /* Copy the bytes of the table. */
- for( y=0; y < tables[x].length; y++ )
- {
- if( (c = fgetc(font->file)) == EOF )
- throw TTException("TrueType font may be corrupt (reason 7)");
+ /* Copy the bytes of the table. */
+ for( y=0; y < tables[x].length; y++ )
+ {
+ if( (c = fgetc(font->file)) == EOF )
+ throw TTException("TrueType font may be corrupt (reason 7)");
- sfnts_pputBYTE(stream, c);
- }
- }
+ sfnts_pputBYTE(stream, c);
+ }
+ }
- /* Padd it out to a four byte boundary. */
- y=tables[x].length;
- while( (y % 4) != 0 )
- {
- sfnts_pputBYTE(stream, 0);
- y++;
- #ifdef DEBUG_TRUETYPE_INLINE
- puts("\n% pad byte:\n");
- #endif
- }
+ /* Padd it out to a four byte boundary. */
+ y=tables[x].length;
+ while( (y % 4) != 0 )
+ {
+ sfnts_pputBYTE(stream, 0);
+ y++;
+ #ifdef DEBUG_TRUETYPE_INLINE
+ puts("\n% pad byte:\n");
+ #endif
+ }
- } /* End of loop for all tables */
+ } /* End of loop for all tables */
/* Close the array. */
sfnts_end_string(stream);
@@ -893,32 +907,32 @@
GlyphIndex = (int)getUSHORT( font->post_table + 34 + (charindex * 2) );
- if( GlyphIndex <= 257 ) /* If a standard Apple name, */
- {
- return Apple_CharStrings[GlyphIndex];
- }
- else /* Otherwise, use one */
- { /* of the pascal strings. */
- GlyphIndex -= 258;
+ if( GlyphIndex <= 257 ) /* If a standard Apple name, */
+ {
+ return Apple_CharStrings[GlyphIndex];
+ }
+ else /* Otherwise, use one */
+ { /* of the pascal strings. */
+ GlyphIndex -= 258;
- /* Set pointer to start of Pascal strings. */
- ptr = (char*)(font->post_table + 34 + (font->numGlyphs * 2));
+ /* Set pointer to start of Pascal strings. */
+ ptr = (char*)(font->post_table + 34 + (font->numGlyphs * 2));
- len = (ULONG)*(ptr++); /* Step thru the strings */
- while(GlyphIndex--) /* until we get to the one */
- { /* that we want. */
- ptr += len;
- len = (ULONG)*(ptr++);
- }
+ len = (ULONG)*(ptr++); /* Step thru the strings */
+ while(GlyphIndex--) /* until we get to the one */
+ { /* that we want. */
+ ptr += len;
+ len = (ULONG)*(ptr++);
+ }
- if( len >= sizeof(temp) )
- throw TTException("TrueType font file contains a very long PostScript name");
+ if( len >= sizeof(temp) )
+ throw TTException("TrueType font file contains a very long PostScript name");
- strncpy(temp,ptr,len); /* Copy the pascal string into */
- temp[len]=(char)NULL; /* a buffer and make it ASCIIz. */
+ strncpy(temp,ptr,len); /* Copy the pascal string into */
+ temp[len]=(char)NULL; /* a buffer and make it ASCIIz. */
- return temp;
- }
+ return temp;
+ }
} /* end of ttfont_CharStrings_getname() */
/*
@@ -932,28 +946,28 @@
post_format = getFixed( font->post_table );
if( post_format.whole != 2 || post_format.fraction != 0 )
- throw TTException("TrueType fontdoes not have a format 2.0 'post' table");
+ throw TTException("TrueType fontdoes not have a format 2.0 'post' table");
/* Emmit the start of the PostScript code to define the dictionary. */
stream.printf("/CharStrings %d dict dup begin\n", glyph_ids.size());
/* Emmit one key-value pair for each glyph. */
for(std::vector<int>::const_iterator i = glyph_ids.begin();
- i != glyph_ids.end(); ++i)
- {
- if(font->target_type == PS_TYPE_42) /* type 42 */
- {
- stream.printf("/%s %d def\n",ttfont_CharStrings_getname(font, *i), *i);
- }
- else /* type 3 */
- {
- stream.printf("/%s{",ttfont_CharStrings_getname(font, *i));
+ i != glyph_ids.end(); ++i)
+ {
+ if(font->target_type == PS_TYPE_42) /* type 42 */
+ {
+ stream.printf("/%s %d def\n",ttfont_CharStrings_getname(font, *i), *i);
+ }
+ else /* type 3 */
+ {
+ stream.printf("/%s{",ttfont_CharStrings_getname(font, *i));
- tt_type3_charproc(stream, font, *i);
+ tt_type3_charproc(stream, font, *i);
- stream.putline("}_d"); /* "} bind def" */
- }
- }
+ stream.putline("}_d"); /* "} bind def" */
+ }
+ }
stream.putline("end readonly def");
} /* end of ttfont_CharStrings() */
@@ -967,27 +981,27 @@
/* If we are generating a type 3 font, we need to provide */
/* a BuildGlyph and BuildChar proceedures. */
if( font->target_type == PS_TYPE_3 )
- {
- stream.put_char('\n');
+ {
+ stream.put_char('\n');
- stream.putline("/BuildGlyph");
- stream.putline(" {exch begin"); /* start font dictionary */
- stream.putline(" CharStrings exch");
- stream.putline(" 2 copy known not{pop /.notdef}if");
- stream.putline(" true 3 1 roll get exec");
- stream.putline(" end}_d");
+ stream.putline("/BuildGlyph");
+ stream.putline(" {exch begin"); /* start font dictionary */
+ stream.putline(" CharStrings exch");
+ stream.putline(" 2 copy known not{pop /.notdef}if");
+ stream.putline(" true 3 1 roll get exec");
+ stream.putline(" end}_d");
- stream.put_char('\n');
+ stream.put_char('\n');
- /* This proceedure is for compatiblity with */
- /* level 1 interpreters. */
- stream.putline("/BuildChar {");
- stream.putline(" 1 index /Encoding get exch get");
- stream.putline(" 1 index /BuildGlyph get exec");
- stream.putline("}_d");
+ /* This proceedure is for compatiblity with */
+ /* level 1 interpreters. */
+ stream.putline("/BuildChar {");
+ stream.putline(" 1 index /Encoding get exch get");
+ stream.putline(" 1 index /BuildGlyph get exec");
+ stream.putline("}_d");
- stream.put_char('\n');
- }
+ stream.put_char('\n');
+ }
/* If we are generating a type 42 font, we need to check to see */
/* if this PostScript interpreter understands type 42 fonts. If */
@@ -997,90 +1011,90 @@
/* generated by a Macintosh. That is where the TrueType interpreter */
/* setup instructions and part of BuildGlyph came from. */
else if( font->target_type == PS_TYPE_42 )
- {
- stream.put_char('\n');
+ {
+ stream.put_char('\n');
- /* If we have no "resourcestatus" command, or FontType 42 */
- /* is unknown, leave "true" on the stack. */
- stream.putline("systemdict/resourcestatus known");
- stream.putline(" {42 /FontType resourcestatus");
- stream.putline(" {pop pop false}{true}ifelse}");
- stream.putline(" {true}ifelse");
+ /* If we have no "resourcestatus" command, or FontType 42 */
+ /* is unknown, leave "true" on the stack. */
+ stream.putline("systemdict/resourcestatus known");
+ stream.putline(" {42 /FontType resourcestatus");
+ stream.putline(" {pop pop false}{true}ifelse}");
+ stream.putline(" {true}ifelse");
- /* If true, execute code to produce an error message if */
- /* we can't find Apple's TrueDict in VM. */
- stream.putline("{/TrueDict where{pop}{(%%[ Error: no TrueType rasterizer ]%%)= flush}ifelse");
+ /* If true, execute code to produce an error message if */
+ /* we can't find Apple's TrueDict in VM. */
+ stream.putline("{/TrueDict where{pop}{(%%[ Error: no TrueType rasterizer ]%%)= flush}ifelse");
- /* Since we are expected to use Apple's TrueDict TrueType */
- /* reasterizer, change the font type to 3. */
- stream.putline("/FontType 3 def");
+ /* Since we are expected to use Apple's TrueDict TrueType */
+ /* reasterizer, change the font type to 3. */
+ stream.putline("/FontType 3 def");
- /* Define a string to hold the state of the Apple */
- /* TrueType interpreter. */
- stream.putline(" /TrueState 271 string def");
+ /* Define a string to hold the state of the Apple */
+ /* TrueType interpreter. */
+ stream.putline(" /TrueState 271 string def");
- /* It looks like we get information about the resolution */
- /* of the printer and store it in the TrueState string. */
- stream.putline(" TrueDict begin sfnts save");
- stream.putline(" 72 0 matrix defaultmatrix dtransform dup");
- stream.putline(" mul exch dup mul add sqrt cvi 0 72 matrix");
- stream.putline(" defaultmatrix dtransform dup mul exch dup");
- stream.putline(" mul add sqrt cvi 3 -1 roll restore");
- stream.putline(" TrueState initer end");
+ /* It looks like we get information about the resolution */
+ /* of the printer and store it in the TrueState string. */
+ stream.putline(" TrueDict begin sfnts save");
+ stream.putline(" 72 0 matrix defaultmatrix dtransform dup");
+ stream.putline(" mul exch dup mul add sqrt cvi 0 72 matrix");
+ stream.putline(" defaultmatrix dtransform dup mul exch dup");
+ stream.putline(" mul add sqrt cvi 3 -1 roll restore");
+ stream.putline(" TrueState initer end");
- /* This BuildGlyph procedure will look the name up in the */
- /* CharStrings array, and then check to see if what it gets */
- /* is a procedure. If it is, it executes it, otherwise, it */
- /* lets the TrueType rasterizer loose on it. */
+ /* This BuildGlyph procedure will look the name up in the */
+ /* CharStrings array, and then check to see if what it gets */
+ /* is a procedure. If it is, it executes it, otherwise, it */
+ /* lets the TrueType rasterizer loose on it. */
- /* When this proceedure is executed the stack contains */
- /* the font dictionary and the character name. We */
- /* exchange arguments and move the dictionary to the */
- /* dictionary stack. */
- stream.putline(" /BuildGlyph{exch begin");
- /* stack: charname */
+ /* When this proceedure is executed the stack contains */
+ /* the font dictionary and the character name. We */
+ /* exchange arguments and move the dictionary to the */
+ /* dictionary stack. */
+ stream.putline(" /BuildGlyph{exch begin");
+ /* stack: charname */
- /* Put two copies of CharStrings on the stack and consume */
- /* one testing to see if the charname is defined in it, */
- /* leave the answer on the stack. */
- stream.putline(" CharStrings dup 2 index known");
- /* stack: charname CharStrings bool */
+ /* Put two copies of CharStrings on the stack and consume */
+ /* one testing to see if the charname is defined in it, */
+ /* leave the answer on the stack. */
+ stream.putline(" CharStrings dup 2 index known");
+ /* stack: charname CharStrings bool */
- /* Exchange the CharStrings dictionary and the charname, */
- /* but if the answer was false, replace the character name */
- /* with ".notdef". */
- stream.putline(" {exch}{exch pop /.notdef}ifelse");
- /* stack: CharStrings charname */
+ /* Exchange the CharStrings dictionary and the charname, */
+ /* but if the answer was false, replace the character name */
+ /* with ".notdef". */
+ stream.putline(" {exch}{exch pop /.notdef}ifelse");
+ /* stack: CharStrings charname */
- /* Get the value from the CharStrings dictionary and see */
- /* if it is executable. */
- stream.putline(" get dup xcheck");
- /* stack: CharStrings_entry */
+ /* Get the value from the CharStrings dictionary and see */
+ /* if it is executable. */
+ stream.putline(" get dup xcheck");
+ /* stack: CharStrings_entry */
- /* If is a proceedure. Execute according to RBIIp 277-278. */
- stream.putline(" {currentdict systemdict begin begin exec end end}");
+ /* If is a proceedure. Execute according to RBIIp 277-278. */
+ stream.putline(" {currentdict systemdict begin begin exec end end}");
- /* Is a TrueType character index, let the rasterizer at it. */
- stream.putline(" {TrueDict begin /bander load cvlit exch TrueState render end}");
+ /* Is a TrueType character index, let the rasterizer at it. */
+ stream.putline(" {TrueDict begin /bander load cvlit exch TrueState render end}");
- stream.putline(" ifelse");
+ stream.putline(" ifelse");
- /* Pop the font's dictionary off the stack. */
- stream.putline(" end}bind def");
+ /* Pop the font's dictionary off the stack. */
+ stream.putline(" end}bind def");
- /* This is the level 1 compatibility BuildChar procedure. */
- /* See RBIIp 281. */
- stream.putline(" /BuildChar{");
- stream.putline(" 1 index /Encoding get exch get");
- stream.putline(" 1 index /BuildGlyph get exec");
- stream.putline(" }bind def");
+ /* This is the level 1 compatibility BuildChar procedure. */
+ /* See RBIIp 281. */
+ stream.putline(" /BuildChar{");
+ stream.putline(" 1 index /Encoding get exch get");
+ stream.putline(" 1 index /BuildGlyph get exec");
+ stream.putline(" }bind def");
- /* Here we close the condition which is true */
- /* if the printer has no built-in TrueType */
- /* rasterizer. */
- stream.putline("}if");
- stream.put_char('\n');
- } /* end of if Type 42 not understood. */
+ /* Here we close the condition which is true */
+ /* if the printer has no built-in TrueType */
+ /* rasterizer. */
+ stream.putline("}if");
+ stream.put_char('\n');
+ } /* end of if Type 42 not understood. */
stream.putline("FontName currentdict end definefont pop");
/* stream.putline("%%EOF"); */
@@ -1102,7 +1116,7 @@
/* Open the font file */
if( (font.file = fopen(filename,"rb")) == (FILE*)NULL )
- throw TTException("Failed to open TrueType font");
+ throw TTException("Failed to open TrueType font");
/* Allocate space for the unvarying part of the offset table. */
assert(font.offset_table == NULL);
@@ -1110,7 +1124,7 @@
/* Read the first part of the offset table. */
if( fread( font.offset_table, sizeof(BYTE), 12, font.file ) != 12 )
- throw TTException("TrueType font may be corrupt (reason 1)");
+ throw TTException("TrueType font may be corrupt (reason 1)");
/* Determine how many directory entries there are. */
font.numTables = getUSHORT( font.offset_table + 4 );
@@ -1123,7 +1137,7 @@
/* Read the rest of the table directory. */
if( fread( font.offset_table + 12, sizeof(BYTE), (font.numTables*16), font.file ) != (font.numTables*16) )
- throw TTException("TrueType font may be corrupt (reason 2)");
+ throw TTException("TrueType font may be corrupt (reason 2)");
/* Extract information from the "Offset" table. */
font.TTVersion = getFixed( font.offset_table );
@@ -1131,21 +1145,21 @@
/* Load the "head" table and extract information from it. */
ptr = GetTable(&font, "head");
try {
- font.MfrRevision = getFixed( ptr + 4 ); /* font revision number */
+ font.MfrRevision = getFixed( ptr + 4 ); /* font revision number */
font.unitsPerEm = getUSHORT( ptr + 18 );
font.HUPM = font.unitsPerEm / 2;
#ifdef DEBUG_TRUETYPE
debug("unitsPerEm=%d",(int)font.unitsPerEm);
#endif
- font.llx = topost2( getFWord( ptr + 36 ) ); /* bounding box info */
+ font.llx = topost2( getFWord( ptr + 36 ) ); /* bounding box info */
font.lly = topost2( getFWord( ptr + 38 ) );
font.urx = topost2( getFWord( ptr + 40 ) );
font.ury = topost2( getFWord( ptr + 42 ) );
- font.indexToLocFormat = getSHORT( ptr + 50 ); /* size of 'loca' data */
+ font.indexToLocFormat = getSHORT( ptr + 50 ); /* size of 'loca' data */
if(font.indexToLocFormat != 0 && font.indexToLocFormat != 1)
- throw TTException("TrueType font is unusable because indexToLocFormat != 0");
+ throw TTException("TrueType font is unusable because indexToLocFormat != 0");
if( getSHORT(ptr+52) != 0 )
- throw TTException("TrueType font is unusable because glyphDataFormat != 0");
+ throw TTException("TrueType font is unusable because glyphDataFormat != 0");
} catch (TTException& ) {
free(ptr);
throw;
@@ -1164,34 +1178,34 @@
/* have the 'loca' and 'glyf' tables arround while */
/* we are generating the CharStrings. */
if(font.target_type == PS_TYPE_3 || font.target_type == PDF_TYPE_3)
- {
- BYTE *ptr; /* We need only one value */
- ptr = GetTable(&font, "hhea");
- font.numberOfHMetrics = getUSHORT(ptr + 34);
- free(ptr);
+ {
+ BYTE *ptr; /* We need only one value */
+ ptr = GetTable(&font, "hhea");
+ font.numberOfHMetrics = getUSHORT(ptr + 34);
+ free(ptr);
- assert(font.loca_table == NULL);
- font.loca_table = GetTable(&font,"loca");
- assert(font.glyf_table == NULL);
- font.glyf_table = GetTable(&font,"glyf");
- assert(font.hmtx_table == NULL);
- font.hmtx_table = GetTable(&font,"hmtx");
+ assert(font.loca_table == NULL);
+ font.loca_table = GetTable(&font,"loca");
+ assert(font.glyf_table == NULL);
+ font.glyf_table = GetTable(&font,"glyf");
+ assert(font.hmtx_table == NULL);
+ font.hmtx_table = GetTable(&font,"hmtx");
}
if (glyph_ids.size() == 0) {
- glyph_ids.clear();
- glyph_ids.reserve(font.numGlyphs);
- for (int x = 0; x < font.numGlyphs; ++x) {
- glyph_ids.push_back(x);
- }
+ glyph_ids.clear();
+ glyph_ids.reserve(font.numGlyphs);
+ for (int x = 0; x < font.numGlyphs; ++x) {
+ glyph_ids.push_back(x);
+ }
} else if (font.target_type == PS_TYPE_3) {
- ttfont_add_glyph_dependencies(&font, glyph_ids);
+ ttfont_add_glyph_dependencies(&font, glyph_ids);
}
} /* end of insert_ttfont() */
void insert_ttfont(const char *filename, TTStreamWriter& stream,
- font_type_enum target_type, std::vector<int>& glyph_ids)
+ font_type_enum target_type, std::vector<int>& glyph_ids)
{
struct TTFONT font;
@@ -1201,7 +1215,7 @@
ttfont_header(stream, &font);
/* Define the encoding. */
- ttfont_encoding(stream);
+ ttfont_encoding(stream, &font, glyph_ids, target_type);
/* Insert FontInfo dictionary. */
ttfont_FontInfo(stream, &font);
@@ -1224,10 +1238,10 @@
public:
void write(const char* a) {
- oss << a;
+ oss << a;
}
std::string str() {
- return oss.str();
+ return oss.str();
}
};
@@ -1237,11 +1251,11 @@
read_font(filename, PDF_TYPE_3, glyph_ids, font);
for (std::vector<int>::const_iterator i = glyph_ids.begin();
- i != glyph_ids.end(); ++i) {
- StringStreamWriter writer;
- tt_type3_charproc(writer, &font, *i);
- const char* name = ttfont_CharStrings_getname(&font, *i);
- dict.add_pair(name, writer.str().c_str());
+ i != glyph_ids.end(); ++i) {
+ StringStreamWriter writer;
+ tt_type3_charproc(writer, &font, *i);
+ const char* name = ttfont_CharStrings_getname(&font, *i);
+ dict.add_pair(name, writer.str().c_str());
}
}
@@ -1263,7 +1277,7 @@
TTFONT::~TTFONT() {
if (file)
- fclose(file);
+ fclose(file);
free(PostName);
free(FullName);
free(FamilyName);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|