[truetype/GX] Clean up phantom point adjustment.
This moves phantom point and advance variation adjustment next to calculations. The logic stays the same, HVAR and VVAR take priority. * src/truetype/ttgload.c (load_truetype_glyph): Move it from here... * src/truetype/ttgxvar.c (TT_Vary_Apply_Glyph_Deltas): ... to here and check for HVAR and VVAR presence outside the main loop.
This commit is contained in:
parent
f7daf9d293
commit
705f416184
@ -1778,16 +1778,6 @@
|
||||
(FT_UInt)outline.n_points );
|
||||
if ( error )
|
||||
goto Exit;
|
||||
|
||||
loader->pp1.x = points[0].x;
|
||||
loader->pp1.y = points[0].y;
|
||||
loader->pp2.x = points[1].x;
|
||||
loader->pp2.y = points[1].y;
|
||||
|
||||
loader->pp3.x = points[2].x;
|
||||
loader->pp3.y = points[2].y;
|
||||
loader->pp4.x = points[3].x;
|
||||
loader->pp4.y = points[3].y;
|
||||
}
|
||||
|
||||
#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
|
||||
@ -2008,16 +1998,6 @@
|
||||
}
|
||||
}
|
||||
|
||||
loader->pp1.x = points[i + 0].x;
|
||||
loader->pp1.y = points[i + 0].y;
|
||||
loader->pp2.x = points[i + 1].x;
|
||||
loader->pp2.y = points[i + 1].y;
|
||||
|
||||
loader->pp3.x = points[i + 2].x;
|
||||
loader->pp3.y = points[i + 2].y;
|
||||
loader->pp4.x = points[i + 3].x;
|
||||
loader->pp4.y = points[i + 3].y;
|
||||
|
||||
Exit1:
|
||||
FT_FREE( outline.points );
|
||||
FT_FREE( outline.tags );
|
||||
|
@ -4075,36 +4075,8 @@
|
||||
FT_Fixed point_delta_y = FT_MulFix( deltas_y[j], apply );
|
||||
|
||||
|
||||
if ( j < n_points - 4 )
|
||||
{
|
||||
point_deltas_x[j] = old_point_delta_x + point_delta_x;
|
||||
point_deltas_y[j] = old_point_delta_y + point_delta_y;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* To avoid double adjustment of advance width or height, */
|
||||
/* adjust phantom points only if there is no HVAR or VVAR */
|
||||
/* support, respectively. */
|
||||
if ( j == ( n_points - 4 ) &&
|
||||
!( face->variation_support &
|
||||
TT_FACE_FLAG_VAR_LSB ) )
|
||||
point_deltas_x[j] = old_point_delta_x + point_delta_x;
|
||||
|
||||
else if ( j == ( n_points - 3 ) &&
|
||||
!( face->variation_support &
|
||||
TT_FACE_FLAG_VAR_HADVANCE ) )
|
||||
point_deltas_x[j] = old_point_delta_x + point_delta_x;
|
||||
|
||||
else if ( j == ( n_points - 2 ) &&
|
||||
!( face->variation_support &
|
||||
TT_FACE_FLAG_VAR_TSB ) )
|
||||
point_deltas_y[j] = old_point_delta_y + point_delta_y;
|
||||
|
||||
else if ( j == ( n_points - 1 ) &&
|
||||
!( face->variation_support &
|
||||
TT_FACE_FLAG_VAR_VADVANCE ) )
|
||||
point_deltas_y[j] = old_point_delta_y + point_delta_y;
|
||||
}
|
||||
point_deltas_x[j] = old_point_delta_x + point_delta_x;
|
||||
point_deltas_y[j] = old_point_delta_y + point_delta_y;
|
||||
|
||||
#ifdef FT_DEBUG_LEVEL_TRACE
|
||||
if ( point_delta_x || point_delta_y )
|
||||
@ -4177,36 +4149,8 @@
|
||||
FT_Pos point_delta_y = points_out[j].y - points_org[j].y;
|
||||
|
||||
|
||||
if ( j < n_points - 4 )
|
||||
{
|
||||
point_deltas_x[j] = old_point_delta_x + point_delta_x;
|
||||
point_deltas_y[j] = old_point_delta_y + point_delta_y;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* To avoid double adjustment of advance width or height, */
|
||||
/* adjust phantom points only if there is no HVAR or VVAR */
|
||||
/* support, respectively. */
|
||||
if ( j == ( n_points - 4 ) &&
|
||||
!( face->variation_support &
|
||||
TT_FACE_FLAG_VAR_LSB ) )
|
||||
point_deltas_x[j] = old_point_delta_x + point_delta_x;
|
||||
|
||||
else if ( j == ( n_points - 3 ) &&
|
||||
!( face->variation_support &
|
||||
TT_FACE_FLAG_VAR_HADVANCE ) )
|
||||
point_deltas_x[j] = old_point_delta_x + point_delta_x;
|
||||
|
||||
else if ( j == ( n_points - 2 ) &&
|
||||
!( face->variation_support &
|
||||
TT_FACE_FLAG_VAR_TSB ) )
|
||||
point_deltas_y[j] = old_point_delta_y + point_delta_y;
|
||||
|
||||
else if ( j == ( n_points - 1 ) &&
|
||||
!( face->variation_support &
|
||||
TT_FACE_FLAG_VAR_VADVANCE ) )
|
||||
point_deltas_y[j] = old_point_delta_y + point_delta_y;
|
||||
}
|
||||
point_deltas_x[j] = old_point_delta_x + point_delta_x;
|
||||
point_deltas_y[j] = old_point_delta_y + point_delta_y;
|
||||
|
||||
#ifdef FT_DEBUG_LEVEL_TRACE
|
||||
if ( point_delta_x || point_delta_y )
|
||||
@ -4244,6 +4188,24 @@
|
||||
|
||||
FT_TRACE5(( "\n" ));
|
||||
|
||||
/* To avoid double adjustment of advance width or height, */
|
||||
/* do not move phantom points if there is HVAR or VVAR */
|
||||
/* support, respectively. */
|
||||
if ( face->variation_support & TT_FACE_FLAG_VAR_HADVANCE )
|
||||
{
|
||||
point_deltas_x[n_points - 4] = 0;
|
||||
point_deltas_y[n_points - 4] = 0;
|
||||
point_deltas_x[n_points - 3] = 0;
|
||||
point_deltas_y[n_points - 3] = 0;
|
||||
}
|
||||
if ( face->variation_support & TT_FACE_FLAG_VAR_VADVANCE )
|
||||
{
|
||||
point_deltas_x[n_points - 2] = 0;
|
||||
point_deltas_y[n_points - 2] = 0;
|
||||
point_deltas_x[n_points - 1] = 0;
|
||||
point_deltas_y[n_points - 1] = 0;
|
||||
}
|
||||
|
||||
for ( i = 0; i < n_points; i++ )
|
||||
{
|
||||
unrounded[i].x += FT_fixedToFdot6( point_deltas_x[i] );
|
||||
@ -4253,14 +4215,23 @@
|
||||
outline->points[i].y += FT_fixedToInt( point_deltas_y[i] );
|
||||
}
|
||||
|
||||
/* recalculate linear horizontal and vertical advances */
|
||||
/* if we don't have HVAR and VVAR, respectively */
|
||||
/* To avoid double adjustment of advance width or height, */
|
||||
/* adjust phantom points only if there is no HVAR or VVAR */
|
||||
/* support, respectively. */
|
||||
if ( !( face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) )
|
||||
{
|
||||
loader->pp1 = outline->points[n_points - 4];
|
||||
loader->pp2 = outline->points[n_points - 3];
|
||||
loader->linear = FT_PIX_ROUND( unrounded[n_points - 3].x -
|
||||
unrounded[n_points - 4].x ) / 64;
|
||||
}
|
||||
if ( !( face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) )
|
||||
{
|
||||
loader->pp3 = outline->points[n_points - 2];
|
||||
loader->pp4 = outline->points[n_points - 1];
|
||||
loader->vadvance = FT_PIX_ROUND( unrounded[n_points - 1].y -
|
||||
unrounded[n_points - 2].y ) / 64;
|
||||
}
|
||||
|
||||
Fail3:
|
||||
FT_FREE( point_deltas_x );
|
||||
|
Loading…
Reference in New Issue
Block a user