Formatting...

Fixing incorrect scaling of vertical advance width.
This commit is contained in:
Werner Lemberg 2000-06-30 22:24:36 +00:00
parent cc9fc49c90
commit ac39ecdca8
10 changed files with 107 additions and 91 deletions

View File

@ -1659,7 +1659,7 @@
T2_Forget_Element( &cff->charstrings_index, &charstring ); T2_Forget_Element( &cff->charstrings_index, &charstring );
} }
/* ignore the error if one has occured - skip to next glyph */ /* ignore the error if one has occurred -- skip to next glyph */
error = 0; error = 0;
} }
@ -1800,10 +1800,10 @@
/* Then scale the metrics */ /* Then scale the metrics */
metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale ); metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale );
metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale );
metrics->vertBearingX = FT_MulFix( metrics->vertBearingX, x_scale ); metrics->vertBearingX = FT_MulFix( metrics->vertBearingX, x_scale );
metrics->vertBearingY = FT_MulFix( metrics->vertBearingY, y_scale ); metrics->vertBearingY = FT_MulFix( metrics->vertBearingY, y_scale );
metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, x_scale );
} }
#if 0 #if 0

View File

@ -36,8 +36,6 @@
#define FT_COMPONENT trace_cidafm #define FT_COMPONENT trace_cidafm
#if 1
LOCAL_FUNC LOCAL_FUNC
void CID_Done_AFM( FT_Memory memory, void CID_Done_AFM( FT_Memory memory,
CID_AFM* afm ) CID_AFM* afm )
@ -120,7 +118,7 @@
while ( p < limit && !isdigit( *p ) ) while ( p < limit && !isdigit( *p ) )
{ {
sign = 1; sign = 1;
if (*p == '-') if ( *p == '-' )
sign = -1; sign = -1;
p++; p++;
@ -138,7 +136,7 @@
#undef KERN_INDEX #undef KERN_INDEX
#define KERN_INDEX( g1, g2 ) ( ( (FT_ULong)g1 << 16 ) | g2 ) #define KERN_INDEX( g1, g2 ) ( ( (FT_ULong)g1 << 16 ) | g2 )
/* compare two kerning pairs */ /* compare two kerning pairs */
@ -157,7 +155,7 @@
} }
/* parse an AFM file - for now, only read the kerning pairs */ /* parse an AFM file -- for now, only read the kerning pairs */
LOCAL_FUNC LOCAL_FUNC
FT_Error CID_Read_AFM( FT_Face cid_face, FT_Error CID_Read_AFM( FT_Face cid_face,
FT_Stream stream ) FT_Stream stream )
@ -180,8 +178,8 @@
limit = (FT_Byte*)stream->limit; limit = (FT_Byte*)stream->limit;
p = start; p = start;
/* we are now going to count the occurences of `KP' or `KPX' in */ /* we are now going to count the occurrences of `KP' or `KPX' in */
/* the AFM file. */ /* the AFM file. */
count = 0; count = 0;
for ( p = start; p < limit - 3; p++ ) for ( p = start; p < limit - 3; p++ )
{ {
@ -212,7 +210,7 @@
FT_Byte* q; FT_Byte* q;
/* skip keyword (KP or KPX) */ /* skip keyword (`KP' or `KPX') */
q = p + 2; q = p + 2;
if ( *q == 'X' ) if ( *q == 'X' )
q++; q++;
@ -281,7 +279,5 @@
kerning->y = 0; kerning->y = 0;
} }
#endif /* 1 */
/* END */ /* END */

View File

@ -38,8 +38,6 @@
} CID_AFM; } CID_AFM;
#if 1
LOCAL_DEF LOCAL_DEF
FT_Error CID_Read_AFM( FT_Face cid_face, FT_Error CID_Read_AFM( FT_Face cid_face,
FT_Stream stream ); FT_Stream stream );
@ -54,8 +52,6 @@
FT_UInt glyph2, FT_UInt glyph2,
FT_Vector* kerning ); FT_Vector* kerning );
#endif /* 1 */
#endif /* CIDAFM_H */ #endif /* CIDAFM_H */

View File

@ -76,7 +76,8 @@
} CID_Operator; } CID_Operator;
static const FT_Int t1_args_count[op_max] = static
const FT_Int t1_args_count[op_max] =
{ {
0, /* none */ 0, /* none */
0, /* endchar */ 0, /* endchar */
@ -220,7 +221,7 @@
/* decoder :: A pointer to the glyph builder to initialize. */ /* decoder :: A pointer to the glyph builder to initialize. */
/* */ /* */
LOCAL_FUNC LOCAL_FUNC
void CID_Init_Decoder( CID_Decoder* decoder ) void CID_Init_Decoder( CID_Decoder* decoder )
{ {
MEM_Set( decoder, 0, sizeof ( *decoder ) ); MEM_Set( decoder, 0, sizeof ( *decoder ) );
@ -229,7 +230,7 @@
} }
/* check that there is enough room for `count' more points */ /* check that there is enough space for `count' more points */
static static
FT_Error check_points( CID_Builder* builder, FT_Error check_points( CID_Builder* builder,
FT_Int count ) FT_Int count )
@ -238,7 +239,7 @@
} }
/* add a new point, do not check space */ /* add a new point, but do not check space */
static static
void add_point( CID_Builder* builder, void add_point( CID_Builder* builder,
FT_Pos x, FT_Pos x,
@ -265,7 +266,7 @@
} }
/* check room for a new on-curve point, then add it */ /* check space for a new on-curve point, then add it */
static static
FT_Error add_point1( CID_Builder* builder, FT_Error add_point1( CID_Builder* builder,
FT_Pos x, FT_Pos x,
@ -273,6 +274,7 @@
{ {
FT_Error error; FT_Error error;
error = check_points( builder, 1 ); error = check_points( builder, 1 );
if ( !error ) if ( !error )
add_point( builder, x, y, 1 ); add_point( builder, x, y, 1 );
@ -307,7 +309,7 @@
} }
/* if a path was begun, add its first on-curve point */ /* if a path has been started, add its first on-curve point */
static static
FT_Error start_point( CID_Builder* builder, FT_Error start_point( CID_Builder* builder,
FT_Pos x, FT_Pos x,
@ -335,8 +337,9 @@
{ {
FT_Outline* outline = builder->current; FT_Outline* outline = builder->current;
/* XXXX: We must not include the last point in the path if it */
/* is located on the first point. */ /* XXX: We must not include the last point in the path if it */
/* is located on the first point. */
if ( outline->n_points > 1 ) if ( outline->n_points > 1 )
{ {
FT_Int first = 0; FT_Int first = 0;
@ -456,7 +459,8 @@
if ( bchar_index < 0 || achar_index < 0 ) if ( bchar_index < 0 || achar_index < 0 )
{ {
FT_ERROR(( "t1operator_seac: invalid seac character code arguments\n" )); FT_ERROR(( "t1operator_seac: ));
FT_ERROR(( " invalid seac character code arguments\n" ));
return T1_Err_Syntax_Error; return T1_Err_Syntax_Error;
} }
@ -542,14 +546,18 @@
FT_Outline_Translate( &dummy, adx - asb, ady ); FT_Outline_Translate( &dummy, adx - asb, ady );
} }
} }
Exit: Exit:
return error; return error;
} }
#define USE_ARGS( n ) top -= n; \ #define USE_ARGS( n ) do \
if ( top < decoder->stack ) \ { \
goto Stack_Underflow top -= n; \
if ( top < decoder->stack ) \
goto Stack_Underflow; \
} while ( 0 )
/*************************************************************************/ /*************************************************************************/
@ -561,12 +569,12 @@
/* Parses a given CID charstrings program. */ /* Parses a given CID charstrings program. */
/* */ /* */
/* <InOut> */ /* <InOut> */
/* decoder :: The current CID decoder. */ /* decoder :: The current CID decoder. */
/* */ /* */
/* <Input> */ /* <Input> */
/* charstring_base :: The base of the charstring stream. */ /* charstring_base :: The base of the charstring stream. */
/* */ /* */
/* charstring_len :: The length in bytes of the charstring stream. */ /* charstring_len :: The length in bytes of the charstring stream. */
/* */ /* */
/* <Return> */ /* <Return> */
/* FreeType error code. 0 means success. */ /* FreeType error code. 0 means success. */
@ -738,7 +746,8 @@
{ {
if ( ++ip > limit ) if ( ++ip > limit )
{ {
FT_ERROR(( "CID_Parse_CharStrings: unexpected EOF in integer\n" )); FT_ERROR(( "CID_Parse_CharStrings:" ));
FT_ERROR(( " unexpected EOF in integer\n" ));
goto Syntax_Error; goto Syntax_Error;
} }
@ -775,6 +784,7 @@
else if ( op == op_callothersubr ) /* callothersubr */ else if ( op == op_callothersubr ) /* callothersubr */
{ {
FT_TRACE4(( " callothersubr" )); FT_TRACE4(( " callothersubr" ));
if ( top - decoder->stack < 2 ) if ( top - decoder->stack < 2 )
goto Stack_Underflow; goto Stack_Underflow;
@ -819,7 +829,7 @@
if ( decoder->flex_state == 0 || if ( decoder->flex_state == 0 ||
decoder->num_flex_vectors != 7 ) decoder->num_flex_vectors != 7 )
{ {
FT_ERROR(( "CID)Parse_CharStrings: unexpected flex end\n" )); FT_ERROR(( "CID_Parse_CharStrings: unexpected flex end\n" ));
goto Syntax_Error; goto Syntax_Error;
} }
@ -851,7 +861,8 @@
if ( ip[0] != 12 || ip[1] != 17 ) if ( ip[0] != 12 || ip[1] != 17 )
{ {
FT_ERROR(( "CID_Parse_CharStrings: `pop' expected, found (%d %d)\n", FT_ERROR(( "CID_Parse_CharStrings:" ));
FT_ERROR(( " `pop' expected, found (%d %d)\n",
ip[0], ip[1] )); ip[0], ip[1] ));
goto Syntax_Error; goto Syntax_Error;
} }
@ -877,16 +888,19 @@
FT_Int* delta; FT_Int* delta;
FT_Int* values; FT_Int* values;
if ( !blend ) if ( !blend )
{ {
FT_ERROR(( "CID_Parse_CharStrings: unexpected multiple masters operator!\n" )); FT_ERROR(( "CID_Parse_CharStrings:" ));
FT_ERROR(( " unexpected multiple masters operator!\n" ));
goto Syntax_Error; goto Syntax_Error;
} }
num_points = top[1] - 13 + ( top[1] == 18 ); num_points = top[1] - 13 + ( top[1] == 18 );
if ( top[0] != num_points * blend->num_designs ) if ( top[0] != num_points * blend->num_designs )
{ {
FT_ERROR(( "CID_Parse_CharStrings: incorrect number of mm arguments\n" )); FT_ERROR(( "CID_Parse_CharStrings:" ));
FT_ERROR(( " incorrect number of mm arguments\n" ));
goto Syntax_Error; goto Syntax_Error;
} }
@ -894,12 +908,12 @@
if ( top < decoder->stack ) if ( top < decoder->stack )
goto Stack_Underflow; goto Stack_Underflow;
/* we want to compute: */ /* We want to compute: */
/* */ /* */
/* a0*w0 + a1*w1 + ... + ak*wk */ /* a0*w0 + a1*w1 + ... + ak*wk */
/* */ /* */
/* but we only have the a0, a1-a0, a2-a0, .. ak-a0 */ /* but we only have the a0, a1-a0, a2-a0, .. ak-a0. */
/* however, given that w0 + w1 + ... + wk == 1, we can */ /* However, given that w0 + w1 + ... + wk == 1, we can */
/* rewrite it easily as: */ /* rewrite it easily as: */
/* */ /* */
/* a0 + (a1-a0)*w1 + (a2-a0)*w2 + .. + (ak-a0)*wk */ /* a0 + (a1-a0)*w1 + (a2-a0)*w2 + .. + (ak-a0)*wk */
@ -909,7 +923,6 @@
/* I guess that's why it's written in this `compact' */ /* I guess that's why it's written in this `compact' */
/* form... */ /* form... */
/* */ /* */
/* */
delta = top + num_points; delta = top + num_points;
values = top; values = top;
for ( nn = 0; nn < num_points; nn++ ) for ( nn = 0; nn < num_points; nn++ )
@ -970,7 +983,7 @@
builder->last.x = x = top[0]; builder->last.x = x = top[0];
builder->last.y = y = 0; builder->last.y = y = 0;
/* the `metrics_only' indicates that we only want to compute */ /* The `metrics_only' indicates that we only want to compute */
/* the glyph's metrics (lsb + advance width), not load the */ /* the glyph's metrics (lsb + advance width), not load the */
/* rest of it. So exit immediately. */ /* rest of it. So exit immediately. */
if ( builder->metrics_only ) if ( builder->metrics_only )
@ -979,7 +992,7 @@
break; break;
case op_seac: case op_seac:
/* return immediately after the processing */ /* return immediately after processing */
return t1operator_seac( decoder, top[0], top[1], return t1operator_seac( decoder, top[0], top[1],
top[2], top[3], top[4] ); top[2], top[3], top[4] );
@ -994,7 +1007,7 @@
builder->last.x = x = top[0]; builder->last.x = x = top[0];
builder->last.y = y = top[1]; builder->last.y = y = top[1];
/* the `metrics_only' indicates that we only want to compute */ /* The `metrics_only' indicates that we only want to compute */
/* the glyph's metrics (lsb + advance width), not load the */ /* the glyph's metrics (lsb + advance width), not load the */
/* rest of it. So exit immediately. */ /* rest of it. So exit immediately. */
if ( builder->metrics_only ) if ( builder->metrics_only )
@ -1087,6 +1100,7 @@
case op_vhcurveto: case op_vhcurveto:
FT_TRACE4(( " vhcurveto" )); FT_TRACE4(( " vhcurveto" ));
if ( start_point( builder, x, y ) || if ( start_point( builder, x, y ) ||
check_points( builder, 3 ) ) check_points( builder, 3 ) )
goto Memory_Error; goto Memory_Error;
@ -1175,7 +1189,7 @@
case op_pop: case op_pop:
FT_TRACE4(( " pop" )); FT_TRACE4(( " pop" ));
/* theorically, the arguments are already on the stack */ /* theoretically, the arguments are already on the stack */
top++; top++;
break; break;
@ -1223,7 +1237,8 @@
case op_setcurrentpoint: case op_setcurrentpoint:
FT_TRACE4(( " setcurrentpoint" )); FT_TRACE4(( " setcurrentpoint" ));
FT_ERROR(( "CID_Parse_CharStrings: unexpected `setcurrentpoint'\n" )); FT_ERROR(( "CID_Parse_CharStrings:" ));
FT_ERROR(( " unexpected `setcurrentpoint'\n" ));
goto Syntax_Error; goto Syntax_Error;
default: default:
@ -1252,6 +1267,9 @@
} }
#if 0
/*************************************************************************/ /*************************************************************************/
/*************************************************************************/ /*************************************************************************/
/*************************************************************************/ /*************************************************************************/
@ -1270,9 +1288,6 @@
/*************************************************************************/ /*************************************************************************/
#if 0
LOCAL_FUNC LOCAL_FUNC
FT_Error CID_Compute_Max_Advance( CID_Face face, FT_Error CID_Compute_Max_Advance( CID_Face face,
FT_Int* max_advance ) FT_Int* max_advance )
@ -1291,14 +1306,14 @@
decoder.builder.metrics_only = 1; decoder.builder.metrics_only = 1;
decoder.builder.load_points = 0; decoder.builder.load_points = 0;
/* For each glyph, parse the glyph charstring and extract */ /* for each glyph, parse the glyph charstring and extract */
/* the advance width. */ /* the advance width */
for ( glyph_index = 0; glyph_index < face->root.num_glyphs; for ( glyph_index = 0; glyph_index < face->root.num_glyphs;
glyph_index++ ) glyph_index++ )
{ {
/* now get load the unscaled outline */ /* now get load the unscaled outline */
error = cid_load_glyph( &decoder, glyph_index ); error = cid_load_glyph( &decoder, glyph_index );
/* ignore the error if one occured - skip to next glyph */ /* ignore the error if one occurred - skip to next glyph */
} }
*max_advance = decoder.builder.advance.x; *max_advance = decoder.builder.advance.x;
@ -1395,7 +1410,6 @@
} }
LOCAL_FUNC LOCAL_FUNC
FT_Error CID_Load_Glyph( CID_GlyphSlot glyph, FT_Error CID_Load_Glyph( CID_GlyphSlot glyph,
CID_Size size, CID_Size size,
@ -1442,7 +1456,7 @@
if ( !error ) if ( !error )
{ {
/* for composite glyphs, return only the left side bearing and the */ /* for composite glyphs, return only the left side bearing and the */
/* advance width.. */ /* advance width */
if ( load_flags & FT_LOAD_NO_RECURSE ) if ( load_flags & FT_LOAD_NO_RECURSE )
{ {
glyph->root.metrics.horiBearingX = decoder.builder.left_bearing.x; glyph->root.metrics.horiBearingX = decoder.builder.left_bearing.x;
@ -1455,7 +1469,7 @@
/* copy the _unscaled_ advance width */ /* copy the _unscaled_ advance width */
metrics->horiAdvance = decoder.builder.advance.x; metrics->horiAdvance = decoder.builder.advance.x;
/* make up vertical metrics */ /* make up vertical metrics */
metrics->vertBearingX = 0; metrics->vertBearingX = 0;
@ -1497,10 +1511,10 @@
/* Then scale the metrics */ /* Then scale the metrics */
metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale ); metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale );
metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale );
metrics->vertBearingX = FT_MulFix( metrics->vertBearingX, x_scale ); metrics->vertBearingX = FT_MulFix( metrics->vertBearingX, x_scale );
metrics->vertBearingY = FT_MulFix( metrics->vertBearingY, y_scale ); metrics->vertBearingY = FT_MulFix( metrics->vertBearingY, y_scale );
metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, x_scale );
} }
/* apply the font matrix */ /* apply the font matrix */
@ -1514,8 +1528,8 @@
{ {
cbox.xMin &= -64; cbox.xMin &= -64;
cbox.yMin &= -64; cbox.yMin &= -64;
cbox.xMax = ( cbox.xMax + 63 ) & -64; cbox.xMax = ( cbox.xMax + 63 ) & -64;
cbox.yMax = ( cbox.yMax + 63 ) & -64; cbox.yMax = ( cbox.yMax + 63 ) & -64;
} }
metrics->width = cbox.xMax - cbox.xMin; metrics->width = cbox.xMax - cbox.xMin;

View File

@ -38,7 +38,7 @@
#define FT_COMPONENT trace_cidload #define FT_COMPONENT trace_cidload
/* read a single offset */ /* read a single offset */
LOCAL_FUNC LOCAL_FUNC
FT_Long cid_get_offset( FT_Byte** start, FT_Long cid_get_offset( FT_Byte** start,
FT_Byte offsize ) FT_Byte offsize )
@ -48,7 +48,10 @@
for ( result = 0; offsize > 0; offsize-- ) for ( result = 0; offsize > 0; offsize-- )
result = ( result << 8 ) | *p++; {
result <<= 8;
result |= *p++;
}
*start = p; *start = p;
return result; return result;
@ -87,10 +90,10 @@
CID_Loader* loader, CID_Loader* loader,
const CID_Field_Rec* keyword ) const CID_Field_Rec* keyword )
{ {
FT_Error error; FT_Error error;
CID_Parser* parser = &loader->parser; CID_Parser* parser = &loader->parser;
FT_Byte* object; FT_Byte* object;
CID_Info* cid = &face->cid; CID_Info* cid = &face->cid;
/* if the keyword has a dedicated callback, call it */ /* if the keyword has a dedicated callback, call it */
@ -309,7 +312,7 @@
len = cur2 - cur; len = cur2 - cur;
if ( len > 0 && len < 22 ) if ( len > 0 && len < 22 )
{ {
/* now, compare the immediate name to the keyword table */ /* now compare the immediate name to the keyword table */
const CID_Field_Rec* keyword = t1_field_records; const CID_Field_Rec* keyword = t1_field_records;
@ -408,8 +411,8 @@
/* allocate, and read them */ /* allocate, and read them */
data_len = offsets[num_subrs] - offsets[0]; data_len = offsets[num_subrs] - offsets[0];
if ( ALLOC_ARRAY( subr->code, num_subrs+1, FT_Byte* ) || if ( ALLOC_ARRAY( subr->code, num_subrs + 1, FT_Byte* ) ||
ALLOC( subr->code[0], data_len ) ) ALLOC( subr->code[0], data_len ) )
goto Fail; goto Fail;
if ( FILE_Seek( cid->data_offset + offsets[0] ) || if ( FILE_Seek( cid->data_offset + offsets[0] ) ||
@ -463,7 +466,7 @@
void t1_init_loader( CID_Loader* loader, void t1_init_loader( CID_Loader* loader,
CID_Face face ) CID_Face face )
{ {
UNUSED(face); UNUSED( face );
MEM_Set( loader, 0, sizeof ( *loader ) ); MEM_Set( loader, 0, sizeof ( *loader ) );
} }

View File

@ -177,10 +177,10 @@
if ( face->cid.font_info.is_fixed_pitch ) if ( face->cid.font_info.is_fixed_pitch )
root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
/* XXX: TO DO - add kerning with .afm support */ /* XXX: TODO: add kerning with .afm support */
/* get style name - be careful, some broken fonts only */ /* get style name -- be careful, some broken fonts only */
/* have a /FontName dictionary entry! */ /* have a /FontName dictionary entry! */
root->family_name = face->cid.font_info.family_name; root->family_name = face->cid.font_info.family_name;
if ( root->family_name ) if ( root->family_name )
{ {
@ -259,7 +259,7 @@
FT_CharMap charmap = face->charmaprecs; FT_CharMap charmap = face->charmaprecs;
/* synthesize a Unicode charmap if there is support in the "psnames" */ /* synthesize a Unicode charmap if there is support in the `psnames' */
/* module */ /* module */
if ( face->psnames ) if ( face->psnames )
{ {

View File

@ -86,20 +86,20 @@
/*************************************************************************/ /*************************************************************************/
/* */ /* */
/* HERE BEGINS THE TYPE1 SPECIFIC STUFF */ /* HERE BEGINS THE TYPE 1 SPECIFIC STUFF */
/* */ /* */
/*************************************************************************/ /*************************************************************************/
typedef struct CID_SizeRec_ typedef struct CID_SizeRec_
{ {
FT_SizeRec root; FT_SizeRec root;
FT_Bool valid; FT_Bool valid;
} CID_SizeRec; } CID_SizeRec;
typedef struct CID_GlyphSlotRec_ typedef struct CID_GlyphSlotRec_
{ {
FT_GlyphSlotRec root; FT_GlyphSlotRec root;
@ -113,11 +113,11 @@
LOCAL_DEF LOCAL_DEF
FT_Error CID_Init_Face( FT_Stream stream, FT_Error CID_Init_Face( FT_Stream stream,
CID_Face face, CID_Face face,
FT_Int face_index, FT_Int face_index,
FT_Int num_params, FT_Int num_params,
FT_Parameter* params ); FT_Parameter* params );
LOCAL_DEF LOCAL_DEF
void CID_Done_Face( CID_Face face ); void CID_Done_Face( CID_Face face );

View File

@ -354,7 +354,7 @@
} }
break; break;
/* **************** otherwise, it's any token **********/ /* **************** otherwise, it is any token **********/
default: default:
token->start = cur++; token->start = cur++;
token->type = t1_token_any; token->type = t1_token_any;
@ -504,7 +504,8 @@
for (;;) for (;;)
{ {
d = (FT_Byte)( *cur - '0' ); d = (FT_Byte)( *cur - '0' );
if ( d >= 10 ) break; if ( d >= 10 )
break;
if ( divider < 10000000L ) if ( divider < 10000000L )
{ {
@ -706,7 +707,6 @@
} }
/* Loads a simple field (i.e. non-table) into the current */ /* Loads a simple field (i.e. non-table) into the current */
/* list of objects */ /* list of objects */
LOCAL_FUNC LOCAL_FUNC
@ -761,6 +761,12 @@
*(FT_UShort*)q = (FT_UShort)val; *(FT_UShort*)q = (FT_UShort)val;
break; break;
#if SIZEOF_INT == 4
case 4:
*(FT_Int*)q = (FT_Int)val;
break;
#endif
default: default:
*(FT_Long*)q = val; *(FT_Long*)q = val;
} }
@ -783,7 +789,7 @@
break; break;
default: default:
/* an error occured */ /* an error occurred */
goto Fail; goto Fail;
} }
} }
@ -958,12 +964,12 @@
buff_len = 256 + 10; buff_len = 256 + 10;
/* look for "StartData" */ /* look for `StartData' */
for ( p = buffer; p < limit; p++ ) for ( p = buffer; p < limit; p++ )
{ {
if ( p[0] == 'S' && strncmp( (char*)p, "StartData", 9 ) == 0 ) if ( p[0] == 'S' && strncmp( (char*)p, "StartData", 9 ) == 0 )
{ {
/* save offset of binary data after "StartData" */ /* save offset of binary data after `StartData' */
offset = FILE_Pos() - ( limit - p ) + 10; offset = FILE_Pos() - ( limit - p ) + 10;
goto Found; goto Found;
} }
@ -971,7 +977,7 @@
} }
Found: Found:
/* all right, we found the start of the binary data. We will now */ /* we have found the start of the binary data. We will now */
/* rewind and extract the frame of corresponding to the Postscript */ /* rewind and extract the frame of corresponding to the Postscript */
/* section */ /* section */

View File

@ -1783,11 +1783,12 @@
metrics->horiBearingX = FT_MulFix( metrics->horiBearingX, x_scale ); metrics->horiBearingX = FT_MulFix( metrics->horiBearingX, x_scale );
metrics->horiBearingY = FT_MulFix( metrics->horiBearingY, y_scale ); metrics->horiBearingY = FT_MulFix( metrics->horiBearingY, y_scale );
metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale );
metrics->vertBearingX = FT_MulFix( metrics->vertBearingX, x_scale ); metrics->vertBearingX = FT_MulFix( metrics->vertBearingX, x_scale );
metrics->vertBearingY = FT_MulFix( metrics->vertBearingY, y_scale ); metrics->vertBearingY = FT_MulFix( metrics->vertBearingY, y_scale );
metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, x_scale );
metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale );
metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale );
} }
} }
} }

View File

@ -1368,10 +1368,10 @@
/* Then scale the metrics */ /* Then scale the metrics */
metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale ); metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale );
metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale );
metrics->vertBearingX = FT_MulFix( metrics->vertBearingX, x_scale ); metrics->vertBearingX = FT_MulFix( metrics->vertBearingX, x_scale );
metrics->vertBearingY = FT_MulFix( metrics->vertBearingY, y_scale ); metrics->vertBearingY = FT_MulFix( metrics->vertBearingY, y_scale );
metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, x_scale );
} }
/* apply the font matrix */ /* apply the font matrix */