[sdf] Fixed corner checks and improved performance.

* src/sdf/ftsdf.c (sdf_generate_bounding_box): Always check for
  corner if two distance (for different curves) are very close.

* src/sdf/ftsdf.c (sdf_conic_to): Added check to figure out if
  the conic can be treated as a line (which happens if the control
  point coincide with any end-point).
This commit is contained in:
Anuj Verma 2022-03-04 16:58:50 +05:30
parent b3d917d2f8
commit ab950e18f4
1 changed files with 23 additions and 6 deletions

View File

@ -738,6 +738,18 @@
contour = shape->contours;
/* If the control point coincide with any of the end point */
/* then it's a line and should be treated as one to avoid */
/* unnecessary complexity later in the algorithm. */
if ( ( contour->last_pos.x == control_1->x &&
contour->last_pos.y == control_1->y ) ||
( control_1->x == to->x &&
control_1->y == to->y ) )
{
sdf_line_to( to, user );
goto Exit;
}
FT_CALL( sdf_edge_new( memory, &edge ) );
edge->edge_type = SDF_EDGE_CONIC;
@ -3318,6 +3330,7 @@
FT_26D6_Vec grid_point = zero_vector;
SDF_Signed_Distance dist = max_sdf;
FT_UInt index = 0;
FT_16D16 diff = 0;
if ( x < 0 || x >= width )
@ -3345,7 +3358,7 @@
if ( dist.distance > sp_sq )
continue;
/* square_root the values and fit in a 6.10 fixed-point */
/* square_root the values if required */
if ( USE_SQUARED_DISTANCES )
dist.distance = square_root( dist.distance );
@ -3357,11 +3370,15 @@
/* check whether the pixel is set or not */
if ( dists[index].sign == 0 )
dists[index] = dist;
else if ( dists[index].distance > dist.distance )
dists[index] = dist;
else if ( FT_ABS( dists[index].distance - dist.distance )
< CORNER_CHECK_EPSILON )
dists[index] = resolve_corner( dists[index], dist );
else
{
diff = FT_ABS( dists[index].distance - dist.distance );
if ( diff <= CORNER_CHECK_EPSILON )
dists[index] = resolve_corner( dists[index], dist );
else if ( dists[index].distance > dist.distance )
dists[index] = dist;
}
}
}