|
|
|
@ -3521,9 +3521,10 @@ |
|
|
|
|
FT_ULong here; |
|
|
|
|
FT_UInt i, j; |
|
|
|
|
|
|
|
|
|
FT_Fixed* tuple_coords = NULL; |
|
|
|
|
FT_Fixed* im_start_coords = NULL; |
|
|
|
|
FT_Fixed* im_end_coords = NULL; |
|
|
|
|
FT_Fixed* peak_coords = NULL; |
|
|
|
|
FT_Fixed* tuple_coords; |
|
|
|
|
FT_Fixed* im_start_coords; |
|
|
|
|
FT_Fixed* im_end_coords; |
|
|
|
|
|
|
|
|
|
GX_Blend blend = face->blend; |
|
|
|
|
|
|
|
|
@ -3544,16 +3545,16 @@ |
|
|
|
|
{ |
|
|
|
|
FT_TRACE2(( "\n" )); |
|
|
|
|
FT_TRACE2(( "tt_face_vary_cvt: no blend specified\n" )); |
|
|
|
|
error = FT_Err_Ok; |
|
|
|
|
goto Exit; |
|
|
|
|
|
|
|
|
|
return FT_Err_Ok; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ( !face->cvt ) |
|
|
|
|
{ |
|
|
|
|
FT_TRACE2(( "\n" )); |
|
|
|
|
FT_TRACE2(( "tt_face_vary_cvt: no `cvt ' table\n" )); |
|
|
|
|
error = FT_Err_Ok; |
|
|
|
|
goto Exit; |
|
|
|
|
|
|
|
|
|
return FT_Err_Ok; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
error = face->goto_table( face, TTAG_cvar, stream, &table_len ); |
|
|
|
@ -3561,15 +3562,11 @@ |
|
|
|
|
{ |
|
|
|
|
FT_TRACE2(( "is missing\n" )); |
|
|
|
|
|
|
|
|
|
error = FT_Err_Ok; |
|
|
|
|
goto Exit; |
|
|
|
|
return FT_Err_Ok; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ( FT_FRAME_ENTER( table_len ) ) |
|
|
|
|
{ |
|
|
|
|
error = FT_Err_Ok; |
|
|
|
|
goto Exit; |
|
|
|
|
} |
|
|
|
|
return FT_Err_Ok; |
|
|
|
|
|
|
|
|
|
table_start = FT_Stream_FTell( stream ); |
|
|
|
|
if ( FT_GET_LONG() != 0x00010000L ) |
|
|
|
@ -3582,11 +3579,6 @@ |
|
|
|
|
|
|
|
|
|
FT_TRACE2(( "loaded\n" )); |
|
|
|
|
|
|
|
|
|
if ( FT_NEW_ARRAY( tuple_coords, blend->num_axis ) || |
|
|
|
|
FT_NEW_ARRAY( im_start_coords, blend->num_axis ) || |
|
|
|
|
FT_NEW_ARRAY( im_end_coords, blend->num_axis ) ) |
|
|
|
|
goto FExit; |
|
|
|
|
|
|
|
|
|
tupleCount = FT_GET_USHORT(); |
|
|
|
|
offsetToData = FT_GET_USHORT(); |
|
|
|
|
|
|
|
|
@ -3622,8 +3614,12 @@ |
|
|
|
|
tupleCount & GX_TC_TUPLE_COUNT_MASK, |
|
|
|
|
( tupleCount & GX_TC_TUPLE_COUNT_MASK ) == 1 ? "" : "s" )); |
|
|
|
|
|
|
|
|
|
if ( FT_NEW_ARRAY( cvt_deltas, face->cvt_size ) ) |
|
|
|
|
goto FExit; |
|
|
|
|
if ( FT_QNEW_ARRAY( peak_coords, 3 * blend->num_axis ) || |
|
|
|
|
FT_NEW_ARRAY( cvt_deltas, face->cvt_size ) ) |
|
|
|
|
goto Exit; |
|
|
|
|
|
|
|
|
|
im_start_coords = peak_coords + blend->num_axis; |
|
|
|
|
im_end_coords = im_start_coords + blend->num_axis; |
|
|
|
|
|
|
|
|
|
for ( i = 0; i < ( tupleCount & GX_TC_TUPLE_COUNT_MASK ); i++ ) |
|
|
|
|
{ |
|
|
|
@ -3640,32 +3636,19 @@ |
|
|
|
|
if ( tupleIndex & GX_TI_EMBEDDED_TUPLE_COORD ) |
|
|
|
|
{ |
|
|
|
|
for ( j = 0; j < blend->num_axis; j++ ) |
|
|
|
|
tuple_coords[j] = FT_fdot14ToFixed( FT_GET_SHORT() ); |
|
|
|
|
peak_coords[j] = FT_fdot14ToFixed( FT_GET_SHORT() ); |
|
|
|
|
tuple_coords = peak_coords; |
|
|
|
|
} |
|
|
|
|
else if ( ( tupleIndex & GX_TI_TUPLE_INDEX_MASK ) >= blend->tuplecount ) |
|
|
|
|
else if ( ( tupleIndex & GX_TI_TUPLE_INDEX_MASK ) < blend->tuplecount ) |
|
|
|
|
tuple_coords = blend->tuplecoords + |
|
|
|
|
( tupleIndex & GX_TI_TUPLE_INDEX_MASK ) * blend->num_axis; |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
FT_TRACE2(( "tt_face_vary_cvt:" |
|
|
|
|
" invalid tuple index\n" )); |
|
|
|
|
|
|
|
|
|
error = FT_THROW( Invalid_Table ); |
|
|
|
|
goto FExit; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
if ( !blend->tuplecoords ) |
|
|
|
|
{ |
|
|
|
|
FT_TRACE2(( "tt_face_vary_cvt:" |
|
|
|
|
" no valid tuple coordinates available\n" )); |
|
|
|
|
|
|
|
|
|
error = FT_THROW( Invalid_Table ); |
|
|
|
|
goto FExit; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
FT_MEM_COPY( |
|
|
|
|
tuple_coords, |
|
|
|
|
blend->tuplecoords + |
|
|
|
|
( tupleIndex & GX_TI_TUPLE_INDEX_MASK ) * blend->num_axis, |
|
|
|
|
blend->num_axis * sizeof ( FT_Fixed ) ); |
|
|
|
|
goto Exit; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) |
|
|
|
@ -3808,22 +3791,20 @@ |
|
|
|
|
for ( i = 0; i < face->cvt_size; i++ ) |
|
|
|
|
face->cvt[i] += FT_fixedToFdot6( cvt_deltas[i] ); |
|
|
|
|
|
|
|
|
|
FExit: |
|
|
|
|
FT_FRAME_EXIT(); |
|
|
|
|
/* iterate over all FT_Size objects and set `cvt_ready' to -1 */ |
|
|
|
|
/* to trigger rescaling of all CVT values */ |
|
|
|
|
FT_List_Iterate( &root->sizes_list, |
|
|
|
|
tt_cvt_ready_iterator, |
|
|
|
|
NULL ); |
|
|
|
|
|
|
|
|
|
Exit: |
|
|
|
|
if ( sharedpoints != ALL_POINTS ) |
|
|
|
|
FT_FREE( sharedpoints ); |
|
|
|
|
FT_FREE( tuple_coords ); |
|
|
|
|
FT_FREE( im_start_coords ); |
|
|
|
|
FT_FREE( im_end_coords ); |
|
|
|
|
FT_FREE( cvt_deltas ); |
|
|
|
|
FT_FREE( peak_coords ); |
|
|
|
|
|
|
|
|
|
/* iterate over all FT_Size objects and set `cvt_ready' to -1 */ |
|
|
|
|
/* to trigger rescaling of all CVT values */ |
|
|
|
|
FT_List_Iterate( &root->sizes_list, |
|
|
|
|
tt_cvt_ready_iterator, |
|
|
|
|
NULL ); |
|
|
|
|
FExit: |
|
|
|
|
FT_FRAME_EXIT(); |
|
|
|
|
|
|
|
|
|
return error; |
|
|
|
|
|
|
|
|
@ -4087,9 +4068,10 @@ |
|
|
|
|
FT_ULong here; |
|
|
|
|
FT_UInt i, j; |
|
|
|
|
|
|
|
|
|
FT_Fixed* tuple_coords = NULL; |
|
|
|
|
FT_Fixed* im_start_coords = NULL; |
|
|
|
|
FT_Fixed* im_end_coords = NULL; |
|
|
|
|
FT_Fixed* peak_coords = NULL; |
|
|
|
|
FT_Fixed* tuple_coords; |
|
|
|
|
FT_Fixed* im_start_coords; |
|
|
|
|
FT_Fixed* im_end_coords; |
|
|
|
|
|
|
|
|
|
GX_Blend blend = face->blend; |
|
|
|
|
|
|
|
|
@ -4124,27 +4106,17 @@ |
|
|
|
|
return FT_Err_Ok; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ( FT_NEW_ARRAY( points_org, n_points ) || |
|
|
|
|
FT_NEW_ARRAY( points_out, n_points ) || |
|
|
|
|
FT_NEW_ARRAY( has_delta, n_points ) ) |
|
|
|
|
goto Fail1; |
|
|
|
|
|
|
|
|
|
dataSize = blend->glyphoffsets[glyph_index + 1] - |
|
|
|
|
blend->glyphoffsets[glyph_index]; |
|
|
|
|
|
|
|
|
|
if ( FT_STREAM_SEEK( blend->glyphoffsets[glyph_index] ) || |
|
|
|
|
FT_FRAME_ENTER( dataSize ) ) |
|
|
|
|
goto Fail1; |
|
|
|
|
return error; |
|
|
|
|
|
|
|
|
|
glyph_start = FT_Stream_FTell( stream ); |
|
|
|
|
|
|
|
|
|
/* each set of glyph variation data is formatted similarly to `cvar' */ |
|
|
|
|
|
|
|
|
|
if ( FT_NEW_ARRAY( tuple_coords, blend->num_axis ) || |
|
|
|
|
FT_NEW_ARRAY( im_start_coords, blend->num_axis ) || |
|
|
|
|
FT_NEW_ARRAY( im_end_coords, blend->num_axis ) ) |
|
|
|
|
goto Fail2; |
|
|
|
|
|
|
|
|
|
tupleCount = FT_GET_USHORT(); |
|
|
|
|
offsetToData = FT_GET_USHORT(); |
|
|
|
|
|
|
|
|
@ -4156,7 +4128,7 @@ |
|
|
|
|
" invalid glyph variation array header\n" )); |
|
|
|
|
|
|
|
|
|
error = FT_THROW( Invalid_Table ); |
|
|
|
|
goto Fail2; |
|
|
|
|
goto FExit; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
offsetToData += glyph_start; |
|
|
|
@ -4180,9 +4152,16 @@ |
|
|
|
|
tupleCount & GX_TC_TUPLE_COUNT_MASK, |
|
|
|
|
( tupleCount & GX_TC_TUPLE_COUNT_MASK ) == 1 ? "" : "s" )); |
|
|
|
|
|
|
|
|
|
if ( FT_NEW_ARRAY( point_deltas_x, n_points ) || |
|
|
|
|
FT_NEW_ARRAY( point_deltas_y, n_points ) ) |
|
|
|
|
goto Fail3; |
|
|
|
|
if ( FT_QNEW_ARRAY( peak_coords, 3 * blend->num_axis ) || |
|
|
|
|
FT_NEW_ARRAY( point_deltas_x, 2 * n_points ) || |
|
|
|
|
FT_QNEW_ARRAY( points_org, n_points ) || |
|
|
|
|
FT_QNEW_ARRAY( points_out, n_points ) || |
|
|
|
|
FT_QNEW_ARRAY( has_delta, n_points ) ) |
|
|
|
|
goto Exit; |
|
|
|
|
|
|
|
|
|
im_start_coords = peak_coords + blend->num_axis; |
|
|
|
|
im_end_coords = im_start_coords + blend->num_axis; |
|
|
|
|
point_deltas_y = point_deltas_x + n_points; |
|
|
|
|
|
|
|
|
|
for ( j = 0; j < n_points; j++ ) |
|
|
|
|
{ |
|
|
|
@ -4205,22 +4184,20 @@ |
|
|
|
|
if ( tupleIndex & GX_TI_EMBEDDED_TUPLE_COORD ) |
|
|
|
|
{ |
|
|
|
|
for ( j = 0; j < blend->num_axis; j++ ) |
|
|
|
|
tuple_coords[j] = FT_fdot14ToFixed( FT_GET_SHORT() ); |
|
|
|
|
peak_coords[j] = FT_fdot14ToFixed( FT_GET_SHORT() ); |
|
|
|
|
tuple_coords = peak_coords; |
|
|
|
|
} |
|
|
|
|
else if ( ( tupleIndex & GX_TI_TUPLE_INDEX_MASK ) >= blend->tuplecount ) |
|
|
|
|
else if ( ( tupleIndex & GX_TI_TUPLE_INDEX_MASK ) < blend->tuplecount ) |
|
|
|
|
tuple_coords = blend->tuplecoords + |
|
|
|
|
( tupleIndex & GX_TI_TUPLE_INDEX_MASK ) * blend->num_axis; |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
FT_TRACE2(( "TT_Vary_Apply_Glyph_Deltas:" |
|
|
|
|
" invalid tuple index\n" )); |
|
|
|
|
|
|
|
|
|
error = FT_THROW( Invalid_Table ); |
|
|
|
|
goto Fail3; |
|
|
|
|
goto Exit; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
FT_MEM_COPY( |
|
|
|
|
tuple_coords, |
|
|
|
|
blend->tuplecoords + |
|
|
|
|
( tupleIndex & GX_TI_TUPLE_INDEX_MASK ) * blend->num_axis, |
|
|
|
|
blend->num_axis * sizeof ( FT_Fixed ) ); |
|
|
|
|
|
|
|
|
|
if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) |
|
|
|
|
{ |
|
|
|
@ -4448,23 +4425,17 @@ |
|
|
|
|
unrounded[n_points - 2].y ) / 64; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Fail3: |
|
|
|
|
FT_FREE( point_deltas_x ); |
|
|
|
|
FT_FREE( point_deltas_y ); |
|
|
|
|
|
|
|
|
|
Fail2: |
|
|
|
|
Exit: |
|
|
|
|
if ( sharedpoints != ALL_POINTS ) |
|
|
|
|
FT_FREE( sharedpoints ); |
|
|
|
|
FT_FREE( tuple_coords ); |
|
|
|
|
FT_FREE( im_start_coords ); |
|
|
|
|
FT_FREE( im_end_coords ); |
|
|
|
|
|
|
|
|
|
FT_FRAME_EXIT(); |
|
|
|
|
|
|
|
|
|
Fail1: |
|
|
|
|
FT_FREE( points_org ); |
|
|
|
|
FT_FREE( points_out ); |
|
|
|
|
FT_FREE( has_delta ); |
|
|
|
|
FT_FREE( peak_coords ); |
|
|
|
|
FT_FREE( point_deltas_x ); |
|
|
|
|
|
|
|
|
|
FExit: |
|
|
|
|
FT_FRAME_EXIT(); |
|
|
|
|
|
|
|
|
|
return error; |
|
|
|
|
} |
|
|
|
|