Index: third_party/freetype/src/cff/cffgload.c |
diff --git a/third_party/freetype/src/cff/cffgload.c b/third_party/freetype/src/cff/cffgload.c |
index 758a3d3bbd1e164079a88d02c84f6eed89eb3d0b..5f57403e22a4e49c22fa2cab4c9b574e297ffa7e 100644 |
--- a/third_party/freetype/src/cff/cffgload.c |
+++ b/third_party/freetype/src/cff/cffgload.c |
@@ -4,7 +4,7 @@ |
/* */ |
/* OpenType Glyph Loader (body). */ |
/* */ |
-/* Copyright 1996-2014 by */ |
+/* Copyright 1996-2015 by */ |
/* David Turner, Robert Wilhelm, and Werner Lemberg. */ |
/* */ |
/* This file is part of the FreeType project, and may only be used, */ |
@@ -273,8 +273,8 @@ |
builder->current = &loader->current.outline; |
FT_GlyphLoader_Rewind( loader ); |
- builder->hints_globals = 0; |
- builder->hints_funcs = 0; |
+ builder->hints_globals = NULL; |
+ builder->hints_funcs = NULL; |
if ( hinting && size ) |
{ |
@@ -646,7 +646,7 @@ |
for ( n = 0; n < cff->num_glyphs; n++ ) |
{ |
if ( cff->charset.sids[n] == glyph_sid ) |
- return n; |
+ return (FT_Int)n; |
} |
return -1; |
@@ -672,7 +672,7 @@ |
*pointer = (FT_Byte*)data.pointer; |
- *length = data.length; |
+ *length = (FT_ULong)data.length; |
return error; |
} |
@@ -707,7 +707,7 @@ |
data.pointer = *pointer; |
- data.length = length; |
+ data.length = (FT_Int)length; |
face->root.internal->incremental_interface->funcs->free_glyph_data( |
face->root.internal->incremental_interface->object, &data ); |
@@ -819,7 +819,7 @@ |
FT_GlyphLoader_Prepare( builder->loader ); |
/* First load `bchar' in builder */ |
- error = cff_get_glyph_data( face, bchar_index, |
+ error = cff_get_glyph_data( face, (FT_UInt)bchar_index, |
&charstring, &charstring_len ); |
if ( !error ) |
{ |
@@ -849,7 +849,7 @@ |
builder->pos_y = ady; |
/* Now load `achar' on top of the base outline. */ |
- error = cff_get_glyph_data( face, achar_index, |
+ error = cff_get_glyph_data( face, (FT_UInt)achar_index, |
&charstring, &charstring_len ); |
if ( !error ) |
{ |
@@ -922,10 +922,10 @@ |
decoder->read_width = 1; |
/* compute random seed from stack address of parameter */ |
- seed = (FT_Fixed)( ( (FT_PtrDist)(char*)&seed ^ |
- (FT_PtrDist)(char*)&decoder ^ |
- (FT_PtrDist)(char*)&charstring_base ) & |
- FT_ULONG_MAX ) ; |
+ seed = (FT_Fixed)( ( (FT_Offset)(char*)&seed ^ |
+ (FT_Offset)(char*)&decoder ^ |
+ (FT_Offset)(char*)&charstring_base ) & |
+ FT_ULONG_MAX ); |
seed = ( seed ^ ( seed >> 10 ) ^ ( seed >> 20 ) ) & 0xFFFFL; |
if ( seed == 0 ) |
seed = 0x7384; |
@@ -1373,12 +1373,12 @@ |
{ |
if ( op == cff_op_hintmask ) |
hinter->hintmask( hinter->hints, |
- builder->current->n_points, |
- decoder->num_hints, |
+ (FT_UInt)builder->current->n_points, |
+ (FT_UInt)decoder->num_hints, |
ip ); |
else |
hinter->counter( hinter->hints, |
- decoder->num_hints, |
+ (FT_UInt)decoder->num_hints, |
ip ); |
} |
@@ -1995,7 +1995,7 @@ |
if ( hinter ) |
{ |
if ( hinter->close( hinter->hints, |
- builder->current->n_points ) ) |
+ (FT_UInt)builder->current->n_points ) ) |
goto Syntax_Error; |
/* apply hints to the loaded glyph outline now */ |
@@ -2389,7 +2389,9 @@ |
decoder->locals_bias ); |
- FT_TRACE4(( " callsubr(%d)\n", idx )); |
+ FT_TRACE4(( " callsubr (idx %d, entering level %d)\n", |
+ idx, |
+ zone - decoder->zones + 1 )); |
if ( idx >= decoder->num_locals ) |
{ |
@@ -2431,7 +2433,9 @@ |
decoder->globals_bias ); |
- FT_TRACE4(( " callgsubr(%d)\n", idx )); |
+ FT_TRACE4(( " callgsubr (idx %d, entering level %d)\n", |
+ idx, |
+ zone - decoder->zones + 1 )); |
if ( idx >= decoder->num_globals ) |
{ |
@@ -2468,7 +2472,8 @@ |
break; |
case cff_op_return: |
- FT_TRACE4(( " return\n" )); |
+ FT_TRACE4(( " return (leaving level %d)\n", |
+ decoder->zone - decoder->zones )); |
if ( decoder->zone <= decoder->zones ) |
{ |
@@ -2669,7 +2674,7 @@ |
error = sfnt->load_sbit_image( face, |
size->strike_index, |
glyph_index, |
- (FT_Int)load_flags, |
+ (FT_UInt)load_flags, |
stream, |
&glyph->root.bitmap, |
&metrics ); |
@@ -2720,7 +2725,7 @@ |
face->vertical_info && |
face->vertical.number_Of_VMetrics > 0 ); |
- /* get the vertical metrics from the vtmx table if we have one */ |
+ /* get the vertical metrics from the vmtx table if we have one */ |
if ( has_vertical_info ) |
{ |
(void)( (SFNT_Service)face->sfnt )->get_metrics( face, 1, |
@@ -2757,16 +2762,16 @@ |
/* this scaling is only relevant if the PS hinter isn't active */ |
if ( cff->num_subfonts ) |
{ |
- FT_ULong top_upm, sub_upm; |
- FT_Byte fd_index = cff_fd_select_get( &cff->fd_select, |
- glyph_index ); |
+ FT_Long top_upm, sub_upm; |
+ FT_Byte fd_index = cff_fd_select_get( &cff->fd_select, |
+ glyph_index ); |
if ( fd_index >= cff->num_subfonts ) |
fd_index = (FT_Byte)( cff->num_subfonts - 1 ); |
- top_upm = cff->top_font.font_dict.units_per_em; |
- sub_upm = cff->subfonts[fd_index]->font_dict.units_per_em; |
+ top_upm = (FT_Long)cff->top_font.font_dict.units_per_em; |
+ sub_upm = (FT_Long)cff->subfonts[fd_index]->font_dict.units_per_em; |
font_matrix = cff->subfonts[fd_index]->font_dict.font_matrix; |
@@ -2867,7 +2872,7 @@ |
/* fonts. */ |
if ( face->root.internal->incremental_interface ) |
{ |
- glyph->root.control_data = 0; |
+ glyph->root.control_data = NULL; |
glyph->root.control_len = 0; |
} |
else |
@@ -2884,7 +2889,7 @@ |
{ |
glyph->root.control_data = csindex->bytes + |
csindex->offsets[glyph_index] - 1; |
- glyph->root.control_len = charstring_len; |
+ glyph->root.control_len = (FT_Long)charstring_len; |
} |
} |
@@ -2944,29 +2949,46 @@ |
{ |
FT_BBox cbox; |
FT_Glyph_Metrics* metrics = &glyph->root.metrics; |
- FT_Vector advance; |
FT_Bool has_vertical_info; |
- /* copy the _unscaled_ advance width */ |
- metrics->horiAdvance = decoder.glyph_width; |
- glyph->root.linearHoriAdvance = decoder.glyph_width; |
+ if ( face->horizontal.number_Of_HMetrics ) |
+ { |
+ FT_Short horiBearingX = 0; |
+ FT_UShort horiAdvance = 0; |
+ |
+ |
+ ( (SFNT_Service)face->sfnt )->get_metrics( face, 0, |
+ glyph_index, |
+ &horiBearingX, |
+ &horiAdvance ); |
+ metrics->horiAdvance = horiAdvance; |
+ metrics->horiBearingX = horiBearingX; |
+ glyph->root.linearHoriAdvance = horiAdvance; |
+ } |
+ else |
+ { |
+ /* copy the _unscaled_ advance width */ |
+ metrics->horiAdvance = decoder.glyph_width; |
+ glyph->root.linearHoriAdvance = decoder.glyph_width; |
+ } |
+ |
glyph->root.internal->glyph_transformed = 0; |
has_vertical_info = FT_BOOL( face->vertical_info && |
face->vertical.number_Of_VMetrics > 0 ); |
- /* get the vertical metrics from the vtmx table if we have one */ |
+ /* get the vertical metrics from the vmtx table if we have one */ |
if ( has_vertical_info ) |
{ |
FT_Short vertBearingY = 0; |
FT_UShort vertAdvance = 0; |
- (void)( (SFNT_Service)face->sfnt )->get_metrics( face, 1, |
- glyph_index, |
- &vertBearingY, |
- &vertAdvance ); |
+ ( (SFNT_Service)face->sfnt )->get_metrics( face, 1, |
+ glyph_index, |
+ &vertBearingY, |
+ &vertAdvance ); |
metrics->vertBearingY = vertBearingY; |
metrics->vertAdvance = vertAdvance; |
} |
@@ -2991,26 +3013,27 @@ |
glyph->root.outline.flags |= FT_OUTLINE_REVERSE_FILL; |
- if ( !( font_matrix.xx == 0x10000L && |
- font_matrix.yy == 0x10000L && |
- font_matrix.xy == 0 && |
- font_matrix.yx == 0 ) ) |
+ /* apply the font matrix, if any */ |
+ if ( font_matrix.xx != 0x10000L || font_matrix.yy != 0x10000L || |
+ font_matrix.xy != 0 || font_matrix.yx != 0 ) |
+ { |
FT_Outline_Transform( &glyph->root.outline, &font_matrix ); |
- if ( !( font_offset.x == 0 && |
- font_offset.y == 0 ) ) |
- FT_Outline_Translate( &glyph->root.outline, |
- font_offset.x, font_offset.y ); |
+ metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, |
+ font_matrix.xx ); |
+ metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, |
+ font_matrix.yy ); |
+ } |
- advance.x = metrics->horiAdvance; |
- advance.y = 0; |
- FT_Vector_Transform( &advance, &font_matrix ); |
- metrics->horiAdvance = advance.x + font_offset.x; |
+ if ( font_offset.x || font_offset.y ) |
+ { |
+ FT_Outline_Translate( &glyph->root.outline, |
+ font_offset.x, |
+ font_offset.y ); |
- advance.x = 0; |
- advance.y = metrics->vertAdvance; |
- FT_Vector_Transform( &advance, &font_matrix ); |
- metrics->vertAdvance = advance.y + font_offset.y; |
+ metrics->horiAdvance += font_offset.x; |
+ metrics->vertAdvance += font_offset.y; |
+ } |
if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 || force_scaling ) |
{ |