forked from minhngoc25a/freetype2
[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 );
|
(FT_UInt)outline.n_points );
|
||||||
if ( error )
|
if ( error )
|
||||||
goto Exit;
|
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 */
|
#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:
|
Exit1:
|
||||||
FT_FREE( outline.points );
|
FT_FREE( outline.points );
|
||||||
FT_FREE( outline.tags );
|
FT_FREE( outline.tags );
|
||||||
|
|
|
@ -4075,36 +4075,8 @@
|
||||||
FT_Fixed point_delta_y = FT_MulFix( deltas_y[j], apply );
|
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;
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef FT_DEBUG_LEVEL_TRACE
|
#ifdef FT_DEBUG_LEVEL_TRACE
|
||||||
if ( point_delta_x || point_delta_y )
|
if ( point_delta_x || point_delta_y )
|
||||||
|
@ -4177,36 +4149,8 @@
|
||||||
FT_Pos point_delta_y = points_out[j].y - points_org[j].y;
|
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;
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef FT_DEBUG_LEVEL_TRACE
|
#ifdef FT_DEBUG_LEVEL_TRACE
|
||||||
if ( point_delta_x || point_delta_y )
|
if ( point_delta_x || point_delta_y )
|
||||||
|
@ -4244,6 +4188,24 @@
|
||||||
|
|
||||||
FT_TRACE5(( "\n" ));
|
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++ )
|
for ( i = 0; i < n_points; i++ )
|
||||||
{
|
{
|
||||||
unrounded[i].x += FT_fixedToFdot6( point_deltas_x[i] );
|
unrounded[i].x += FT_fixedToFdot6( point_deltas_x[i] );
|
||||||
|
@ -4253,14 +4215,23 @@
|
||||||
outline->points[i].y += FT_fixedToInt( point_deltas_y[i] );
|
outline->points[i].y += FT_fixedToInt( point_deltas_y[i] );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* recalculate linear horizontal and vertical advances */
|
/* To avoid double adjustment of advance width or height, */
|
||||||
/* if we don't have HVAR and VVAR, respectively */
|
/* adjust phantom points only if there is no HVAR or VVAR */
|
||||||
|
/* support, respectively. */
|
||||||
if ( !( face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) )
|
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 -
|
loader->linear = FT_PIX_ROUND( unrounded[n_points - 3].x -
|
||||||
unrounded[n_points - 4].x ) / 64;
|
unrounded[n_points - 4].x ) / 64;
|
||||||
|
}
|
||||||
if ( !( face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) )
|
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 -
|
loader->vadvance = FT_PIX_ROUND( unrounded[n_points - 1].y -
|
||||||
unrounded[n_points - 2].y ) / 64;
|
unrounded[n_points - 2].y ) / 64;
|
||||||
|
}
|
||||||
|
|
||||||
Fail3:
|
Fail3:
|
||||||
FT_FREE( point_deltas_x );
|
FT_FREE( point_deltas_x );
|
||||||
|
|
Loading…
Reference in New Issue