ref: a959c3c960c433919e8b8f1c22a6702fa2664cd8
parent: d5553d35f3ca37e290b5eb5884de619baccf019a
author: Werner Lemberg <[email protected]>
date: Sat Jun 14 03:40:09 EDT 2003
* src/pfr/pfrobjs.c (pfr_slot_load): Apply font matrix. * src/cid/cidload.c: Remove parse_font_bbox code (already enclosed with #if 0 ... #endif). * src/type1/t1tokens.h: Handle /FontName. * src/type1/t1load.c (parse_font_name): Removed. Remove parse_font_bbox code (already enclosed with #if 0 ... #endif). * src/type42/t42parse.c (t42_parse_font_name): Removed. Remove t42_parse_font_bbox code (already enclosed with #if 0 ... #endif). (t42_keywords): Handle /FontName with T1_FIELD_KEY.
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2003-06-13 Detlef W�rkner <[email protected]>
+
+ * src/pfr/pfrobjs.c (pfr_slot_load): Apply font matrix.
+
2003-06-13 Werner Lemberg <[email protected]>
* builds/dos/detect.mk: Test not only for `Dos' but for `DOS' also.
@@ -8,6 +12,19 @@
* builds/compiler/watcom.mk (LINK_LIBRARY): GNU Make for DOS doesn't
like a trailing semicolon; add a dummy command.
+
+ * src/cid/cidload.c: Remove parse_font_bbox code (already enclosed
+ with #if 0 ... #endif).
+
+ * src/type1/t1tokens.h: Handle /FontName.
+ * src/type1/t1load.c (parse_font_name): Removed.
+ Remove parse_font_bbox code (already enclosed with #if 0 ...
+ #endif).
+
+ * src/type42/t42parse.c (t42_parse_font_name): Removed.
+ Remove t42_parse_font_bbox code (already enclosed with #if 0 ...
+ #endif).
+ (t42_keywords): Handle /FontName with T1_FIELD_KEY.
2003-06-12 Werner Lemberg <[email protected]>
--- a/docs/TODO
+++ b/docs/TODO
@@ -9,5 +9,18 @@
the quality of AA text, but Monochrome and LCD hinting still suck. We
need to do something about that.
+* Add CIDCMap support to the CID driver.
+
+* Add track kerning support to the Type1 and PFR driver and the API
+ (The degree of kerning, e.g. light, normal or tight, and
+ the glyph size has to be passed as parameter).
+
+* Add kerning (AFM file) support to the CID driver.
+
+* Possibly add support for reading PFM files.
+
+* Is the anti-aliased glyphs feature of BDF also available in PCF format?
+ If yes, add support to the PCF driver.
+
--- end of TODO ---
--- a/include/freetype/freetype.h
+++ b/include/freetype/freetype.h
@@ -743,10 +743,11 @@
/* descender :: The face's descender is the vertical */
/* distance from the baseline to the */
/* bottommost point of any glyph in the face. */
- /* This field's value is *negative*, expressed */
- /* in font units. Some font designs use a */
- /* value different from `bbox.yMin'. Only */
- /* relevant for scalable formats. */
+ /* This field's value is *negative* for values */
+ /* below the baseline. It is expressed in */
+ /* font units. Some font designs use a value */
+ /* different from `bbox.yMin'. Only relevant */
+ /* for scalable formats. */
/* */
/* height :: The face's height is the vertical distance */
/* from one baseline to the next when writing */
--- a/src/cid/cidload.c
+++ b/src/cid/cidload.c
@@ -142,28 +142,7 @@
}
-#if 0
FT_CALLBACK_DEF( FT_Error )
- parse_font_bbox( CID_Face face,
- CID_Parser* parser )
- {
- FT_Fixed temp[4];
- FT_BBox* bbox = &face->cid.font_bbox;
-
-
- (void)cid_parser_to_fixed_array( parser, 4, temp, 0 );
- bbox->xMin = FT_RoundFix( temp[0] );
- bbox->yMin = FT_RoundFix( temp[1] );
- bbox->xMax = FT_RoundFix( temp[2] );
- bbox->yMax = FT_RoundFix( temp[3] );
-
- return CID_Err_Ok; /* this is a callback function; */
- /* we must return an error code */
- }
-#endif
-
-
- FT_CALLBACK_DEF( FT_Error )
parse_font_matrix( CID_Face face,
CID_Parser* parser )
{
@@ -261,10 +240,7 @@
#include "cidtoken.h"
-#if 0
- T1_FIELD_CALLBACK( "FontBBox", parse_font_bbox )
-#endif
- T1_FIELD_CALLBACK( "FDArray", parse_fd_array )
+ T1_FIELD_CALLBACK( "FDArray", parse_fd_array )
T1_FIELD_CALLBACK( "FontMatrix", parse_font_matrix )
{ 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0 }
--- a/src/pfr/pfrobjs.c
+++ b/src/pfr/pfrobjs.c
@@ -114,128 +114,128 @@
goto Exit;
/* now load the physical font descriptor */
- error = pfr_phy_font_load( &face->phy_font, stream,
- face->log_font.phys_offset,
- face->log_font.phys_size );
- if ( error )
- goto Exit;
+ error = pfr_phy_font_load( &face->phy_font, stream,
+ face->log_font.phys_offset,
+ face->log_font.phys_size );
+ if ( error )
+ goto Exit;
- /* now, set-up all root face fields */
- {
- FT_Face root = FT_FACE( face );
- PFR_PhyFont phy_font = &face->phy_font;
+ /* now, set-up all root face fields */
+ {
+ FT_Face root = FT_FACE( face );
+ PFR_PhyFont phy_font = &face->phy_font;
- root->face_index = face_index;
- root->num_glyphs = phy_font->num_chars;
- root->face_flags = FT_FACE_FLAG_SCALABLE;
+ root->face_index = face_index;
+ root->num_glyphs = phy_font->num_chars;
+ root->face_flags = FT_FACE_FLAG_SCALABLE;
- if ( (phy_font->flags & PFR_PHY_PROPORTIONAL) == 0 )
- root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
+ if ( (phy_font->flags & PFR_PHY_PROPORTIONAL) == 0 )
+ root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
- if ( phy_font->flags & PFR_PHY_VERTICAL )
- root->face_flags |= FT_FACE_FLAG_VERTICAL;
- else
- root->face_flags |= FT_FACE_FLAG_HORIZONTAL;
+ if ( phy_font->flags & PFR_PHY_VERTICAL )
+ root->face_flags |= FT_FACE_FLAG_VERTICAL;
+ else
+ root->face_flags |= FT_FACE_FLAG_HORIZONTAL;
- if ( phy_font->num_strikes > 0 )
- root->face_flags |= FT_FACE_FLAG_FIXED_SIZES;
+ if ( phy_font->num_strikes > 0 )
+ root->face_flags |= FT_FACE_FLAG_FIXED_SIZES;
- if ( phy_font->num_kern_pairs > 0 )
- root->face_flags |= FT_FACE_FLAG_KERNING;
+ if ( phy_font->num_kern_pairs > 0 )
+ root->face_flags |= FT_FACE_FLAG_KERNING;
- /* If no family name was found in the "undocumented" auxiliary
- * data, use the font ID instead. This sucks but is better than
- * nothing.
- */
- root->family_name = phy_font->family_name;
- if ( root->family_name == NULL )
- root->family_name = phy_font->font_id;
+ /* If no family name was found in the "undocumented" auxiliary
+ * data, use the font ID instead. This sucks but is better than
+ * nothing.
+ */
+ root->family_name = phy_font->family_name;
+ if ( root->family_name == NULL )
+ root->family_name = phy_font->font_id;
- /* note that the style name can be NULL in certain PFR fonts,
- * probably meaning "Regular"
- */
- root->style_name = phy_font->style_name;
+ /* note that the style name can be NULL in certain PFR fonts,
+ * probably meaning "Regular"
+ */
+ root->style_name = phy_font->style_name;
- root->num_fixed_sizes = 0;
- root->available_sizes = 0;
+ root->num_fixed_sizes = 0;
+ root->available_sizes = 0;
- root->bbox = phy_font->bbox;
- root->units_per_EM = (FT_UShort)phy_font->outline_resolution;
- root->ascender = (FT_Short) phy_font->bbox.yMax;
- root->descender = (FT_Short) phy_font->bbox.yMin;
- root->height = (FT_Short)
- ( ( ( root->ascender - root->descender ) * 12 )
- / 10 );
+ root->bbox = phy_font->bbox;
+ root->units_per_EM = (FT_UShort)phy_font->outline_resolution;
+ root->ascender = (FT_Short) phy_font->bbox.yMax;
+ root->descender = (FT_Short) phy_font->bbox.yMin;
+ root->height = (FT_Short)
+ ( ( ( root->ascender - root->descender ) * 12 )
+ / 10 );
- if ( phy_font->num_strikes > 0 )
- {
- FT_UInt n, count = phy_font->num_strikes;
- FT_Bitmap_Size* size;
- PFR_Strike strike;
- FT_Memory memory = root->stream->memory;
+ if ( phy_font->num_strikes > 0 )
+ {
+ FT_UInt n, count = phy_font->num_strikes;
+ FT_Bitmap_Size* size;
+ PFR_Strike strike;
+ FT_Memory memory = root->stream->memory;
- if ( FT_NEW_ARRAY( root->available_sizes, count ) )
- goto Exit;
+ if ( FT_NEW_ARRAY( root->available_sizes, count ) )
+ goto Exit;
- size = root->available_sizes;
- strike = phy_font->strikes;
- for ( n = 0; n < count; n++, size++, strike++ )
- {
- size->height = (FT_UShort)strike->y_ppm;
- size->width = (FT_UShort)strike->x_ppm;
- }
- root->num_fixed_sizes = count;
- }
+ size = root->available_sizes;
+ strike = phy_font->strikes;
+ for ( n = 0; n < count; n++, size++, strike++ )
+ {
+ size->height = (FT_UShort)strike->y_ppm;
+ size->width = (FT_UShort)strike->x_ppm;
+ }
+ root->num_fixed_sizes = count;
+ }
- /* now compute maximum advance width */
- if ( ( phy_font->flags & PFR_PHY_PROPORTIONAL ) == 0 )
- root->max_advance_width = (FT_Short)phy_font->standard_advance;
- else
- {
- FT_Int max = 0;
- FT_UInt count = phy_font->num_chars;
- PFR_Char gchar = phy_font->chars;
+ /* now compute maximum advance width */
+ if ( ( phy_font->flags & PFR_PHY_PROPORTIONAL ) == 0 )
+ root->max_advance_width = (FT_Short)phy_font->standard_advance;
+ else
+ {
+ FT_Int max = 0;
+ FT_UInt count = phy_font->num_chars;
+ PFR_Char gchar = phy_font->chars;
- for ( ; count > 0; count--, gchar++ )
- {
- if ( max < gchar->advance )
- max = gchar->advance;
- }
+ for ( ; count > 0; count--, gchar++ )
+ {
+ if ( max < gchar->advance )
+ max = gchar->advance;
+ }
- root->max_advance_width = (FT_Short)max;
- }
+ root->max_advance_width = (FT_Short)max;
+ }
- root->max_advance_height = root->height;
+ root->max_advance_height = root->height;
- root->underline_position = (FT_Short)( - root->units_per_EM / 10 );
- root->underline_thickness = (FT_Short)( root->units_per_EM / 30 );
+ root->underline_position = (FT_Short)( - root->units_per_EM / 10 );
+ root->underline_thickness = (FT_Short)( root->units_per_EM / 30 );
- /* create charmap */
- {
- FT_CharMapRec charmap;
+ /* create charmap */
+ {
+ FT_CharMapRec charmap;
- charmap.face = root;
- charmap.platform_id = 3;
- charmap.encoding_id = 1;
- charmap.encoding = FT_ENCODING_UNICODE;
+ charmap.face = root;
+ charmap.platform_id = 3;
+ charmap.encoding_id = 1;
+ charmap.encoding = FT_ENCODING_UNICODE;
- FT_CMap_New( &pfr_cmap_class_rec, NULL, &charmap, NULL );
+ FT_CMap_New( &pfr_cmap_class_rec, NULL, &charmap, NULL );
#if 0
- /* Select default charmap */
- if (root->num_charmaps)
- root->charmap = root->charmaps[0];
+ /* Select default charmap */
+ if (root->num_charmaps)
+ root->charmap = root->charmaps[0];
#endif
- }
+ }
- /* check whether we've loaded any kerning pairs */
- if ( phy_font->num_kern_pairs )
- root->face_flags |= FT_FACE_FLAG_KERNING;
- }
+ /* check whether we've loaded any kerning pairs */
+ if ( phy_font->num_kern_pairs )
+ root->face_flags |= FT_FACE_FLAG_KERNING;
+ }
Exit:
return error;
@@ -353,6 +353,21 @@
/* make-up vertical metrics(?) */
metrics->vertBearingX = 0;
metrics->vertBearingY = 0;
+
+ /* Apply the font matrix, if any. */
+ /* TODO: Test existing fonts with unusual matrix */
+ /* whether we have to adjust Units per EM. */
+ {
+ FT_Matrix font_matrix;
+
+
+ font_matrix.xx = face->log_font.matrix[0] << 8;
+ font_matrix.yx = face->log_font.matrix[1] << 8;
+ font_matrix.xy = face->log_font.matrix[2] << 8;
+ font_matrix.yy = face->log_font.matrix[3] << 8;
+
+ FT_Outline_Transform( outline, &font_matrix );
+ }
/* scale when needed */
if ( scaling )
--- a/src/type1/t1load.c
+++ b/src/type1/t1load.c
@@ -843,71 +843,6 @@
/* dictionaries */
static void
- parse_font_name( T1_Face face,
- T1_Loader loader )
- {
- T1_Parser parser = &loader->parser;
- FT_Error error;
- FT_Memory memory = parser->root.memory;
- FT_PtrDist len;
- FT_Byte* cur;
- FT_Byte* cur2;
- FT_Byte* limit;
-
-
- if ( face->type1.font_name )
- /* with synthetic fonts, it's possible we get here twice */
- return;
-
- T1_Skip_Spaces( parser );
-
- cur = parser->root.cursor;
- limit = parser->root.limit;
-
- if ( cur >= limit - 1 || *cur != '/' )
- return;
-
- cur++;
- cur2 = cur;
- while ( cur2 < limit && is_name_char( *cur2 ) )
- cur2++;
-
- len = cur2 - cur;
- if ( len > 0 )
- {
- if ( FT_ALLOC( face->type1.font_name, len + 1 ) )
- {
- parser->root.error = error;
- return;
- }
-
- FT_MEM_COPY( face->type1.font_name, cur, len );
- face->type1.font_name[len] = '\0';
- }
- parser->root.cursor = cur2;
- }
-
-
-#if 0
- static void
- parse_font_bbox( T1_Face face,
- T1_Loader loader )
- {
- T1_Parser parser = &loader->parser;
- FT_Fixed temp[4];
- FT_BBox* bbox = &face->type1.font_bbox;
-
-
- (void)T1_ToFixedArray( parser, 4, temp, 0 );
- bbox->xMin = FT_RoundFix( temp[0] );
- bbox->yMin = FT_RoundFix( temp[1] );
- bbox->xMax = FT_RoundFix( temp[2] );
- bbox->yMax = FT_RoundFix( temp[3] );
- }
-#endif
-
-
- static void
parse_font_matrix( T1_Face face,
T1_Loader loader )
{
@@ -1498,10 +1433,6 @@
#include "t1tokens.h"
/* now add the special functions... */
- T1_FIELD_CALLBACK( "FontName", parse_font_name )
-#if 0
- T1_FIELD_CALLBACK( "FontBBox", parse_font_bbox )
-#endif
T1_FIELD_CALLBACK( "FontMatrix", parse_font_matrix )
T1_FIELD_CALLBACK( "Encoding", parse_encoding )
T1_FIELD_CALLBACK( "Subrs", parse_subrs )
--- a/src/type1/t1tokens.h
+++ b/src/type1/t1tokens.h
@@ -66,6 +66,7 @@
#undef T1CODE
#define T1CODE T1_FIELD_LOCATION_FONT_DICT
+ T1_FIELD_KEY ( "FontName", font_name )
T1_FIELD_NUM_P ( "PaintType", paint_type )
T1_FIELD_NUM ( "FontType", font_type )
T1_FIELD_FIXED_P( "StrokeWidth", stroke_width )
--- a/src/type42/t42parse.c
+++ b/src/type42/t42parse.c
@@ -34,16 +34,6 @@
static void
- t42_parse_font_name( T42_Face face,
- T42_Loader loader );
-
-#if 0
- static void
- t42_parse_font_bbox( T42_Face face,
- T42_Loader loader );
-#endif
-
- static void
t42_parse_font_matrix( T42_Face face,
T42_Loader loader );
static void
@@ -82,6 +72,7 @@
#undef T1CODE
#define T1CODE T1_FIELD_LOCATION_FONT_DICT
+ T1_FIELD_KEY ( "FontName", font_name )
T1_FIELD_NUM_P ( "PaintType", paint_type )
T1_FIELD_NUM ( "FontType", font_type )
T1_FIELD_FIXED_P( "StrokeWidth", stroke_width )
@@ -93,10 +84,6 @@
T1_FIELD_BBOX("FontBBox", xMin )
- T1_FIELD_CALLBACK( "FontName", t42_parse_font_name )
-#if 0
- T1_FIELD_CALLBACK( "FontBBox", t42_parse_font_bbox )
-#endif
T1_FIELD_CALLBACK( "FontMatrix", t42_parse_font_matrix )
T1_FIELD_CALLBACK( "Encoding", t42_parse_encoding )
T1_FIELD_CALLBACK( "CharStrings", t42_parse_charstrings )
@@ -256,66 +243,6 @@
{
return ( c == ' ' || c == '\t' || c == '\r' || c == '\n' );
}
-
-
- static void
- t42_parse_font_name( T42_Face face,
- T42_Loader loader )
- {
- T42_Parser parser = &loader->parser;
- FT_Error error;
- FT_Memory memory = parser->root.memory;
- FT_Int len;
- FT_Byte* cur;
- FT_Byte* cur2;
- FT_Byte* limit;
-
-
- T1_Skip_Spaces( parser );
-
- cur = parser->root.cursor;
- limit = parser->root.limit;
-
- if ( cur >= limit - 1 ||
- ( *cur != '/' && *cur != '(') )
- return;
-
- cur++;
- cur2 = cur;
- while ( cur2 < limit && t42_is_alpha( *cur2 ) )
- cur2++;
-
- len = (FT_Int)( cur2 - cur );
- if ( len > 0 )
- {
- if ( FT_ALLOC( face->type1.font_name, len + 1 ) )
- {
- parser->root.error = error;
- return;
- }
-
- FT_MEM_COPY( face->type1.font_name, cur, len );
- face->type1.font_name[len] = '\0';
- }
- parser->root.cursor = cur2;
- }
-
-
-#if 0
- static void
- t42_parse_font_bbox( T42_Face face,
- T42_Loader loader )
- {
- T42_Parser parser = &loader->parser;
- FT_BBox* bbox = &face->type1.font_bbox;
-
-
- bbox->xMin = T1_ToInt( parser );
- bbox->yMin = T1_ToInt( parser );
- bbox->xMax = T1_ToInt( parser );
- bbox->yMax = T1_ToInt( parser );
- }
-#endif
static void