From d1b3ef77042df64d3094695fc6221ac6b757f543 Mon Sep 17 00:00:00 2001 From: Alexei Podtelezhnikov Date: Tue, 14 Nov 2023 15:54:52 +0000 Subject: [PATCH] [raster] Revise overshoot setting. * src/raster/ftraster.c (New_Profile, End_Profile): Deal with overshoots locally. (Line_To, Conic_To, Cubic_To): Update callers. --- src/raster/ftraster.c | 67 ++++++++++++++++--------------------------- 1 file changed, 24 insertions(+), 43 deletions(-) diff --git a/src/raster/ftraster.c b/src/raster/ftraster.c index fae28b849..cd87b9592 100644 --- a/src/raster/ftraster.c +++ b/src/raster/ftraster.c @@ -634,8 +634,7 @@ * profile. */ static Bool - New_Profile( RAS_ARGS TStates aState, - Bool overshoot ) + New_Profile( RAS_ARGS TStates aState ) { Long e; @@ -661,14 +660,14 @@ { case Ascending_State: ras.cProfile->flags |= Flow_Up; - if ( overshoot ) + if ( IS_BOTTOM_OVERSHOOT( ras.lastY ) ) ras.cProfile->flags |= Overshoot_Bottom; e = CEILING( ras.lastY ); break; case Descending_State: - if ( overshoot ) + if ( IS_TOP_OVERSHOOT( ras.lastY ) ) ras.cProfile->flags |= Overshoot_Top; e = FLOOR( ras.lastY ); @@ -716,7 +715,7 @@ * SUCCESS on success. FAILURE in case of overflow or incoherency. */ static Bool - End_Profile( RAS_ARGS Bool overshoot ) + End_Profile( RAS_ARG ) { PProfile p = ras.cProfile; Int h = (Int)( ras.top - p->x ); @@ -735,11 +734,14 @@ FT_TRACE7(( " ending profile %p, start = %2d, height = %+3d\n", (void *)p, p->start, p->flags & Flow_Up ? h : -h )); - if ( overshoot ) + if ( p->flags & Flow_Up ) { - if ( p->flags & Flow_Up ) + if ( IS_TOP_OVERSHOOT( ras.lastY ) ) p->flags |= Overshoot_Top; - else + } + else + { + if ( IS_BOTTOM_OVERSHOOT( ras.lastY ) ) p->flags |= Overshoot_Bottom; } @@ -1243,25 +1245,21 @@ case Unknown_State: if ( y > ras.lastY ) { - if ( New_Profile( RAS_VARS Ascending_State, - IS_BOTTOM_OVERSHOOT( ras.lastY ) ) ) + if ( New_Profile( RAS_VARS Ascending_State ) ) return FAILURE; } - else + else if ( y < ras.lastY ) { - if ( y < ras.lastY ) - if ( New_Profile( RAS_VARS Descending_State, - IS_TOP_OVERSHOOT( ras.lastY ) ) ) - return FAILURE; + if ( New_Profile( RAS_VARS Descending_State ) ) + return FAILURE; } break; case Ascending_State: if ( y < ras.lastY ) { - if ( End_Profile( RAS_VARS IS_TOP_OVERSHOOT( ras.lastY ) ) || - New_Profile( RAS_VARS Descending_State, - IS_TOP_OVERSHOOT( ras.lastY ) ) ) + if ( End_Profile( RAS_VAR ) || + New_Profile( RAS_VARS Descending_State ) ) return FAILURE; } break; @@ -1269,9 +1267,8 @@ case Descending_State: if ( y > ras.lastY ) { - if ( End_Profile( RAS_VARS IS_BOTTOM_OVERSHOOT( ras.lastY ) ) || - New_Profile( RAS_VARS Ascending_State, - IS_BOTTOM_OVERSHOOT( ras.lastY ) ) ) + if ( End_Profile( RAS_VAR ) || + New_Profile( RAS_VARS Ascending_State ) ) return FAILURE; } break; @@ -1395,18 +1392,13 @@ state_bez = y1 < y3 ? Ascending_State : Descending_State; if ( ras.state != state_bez ) { - Bool o = ( state_bez == Ascending_State ) - ? IS_BOTTOM_OVERSHOOT( y1 ) - : IS_TOP_OVERSHOOT( y1 ); - - /* finalize current profile if any */ if ( ras.state != Unknown_State && - End_Profile( RAS_VARS o ) ) + End_Profile( RAS_VAR ) ) goto Fail; /* create a new profile */ - if ( New_Profile( RAS_VARS state_bez, o ) ) + if ( New_Profile( RAS_VARS state_bez ) ) goto Fail; } @@ -1541,22 +1533,17 @@ } else { - state_bez = ( y1 <= y4 ) ? Ascending_State : Descending_State; + state_bez = y1 < y4 ? Ascending_State : Descending_State; /* detect a change of direction */ if ( ras.state != state_bez ) { - Bool o = ( state_bez == Ascending_State ) - ? IS_BOTTOM_OVERSHOOT( y1 ) - : IS_TOP_OVERSHOOT( y1 ); - - /* finalize current profile if any */ if ( ras.state != Unknown_State && - End_Profile( RAS_VARS o ) ) + End_Profile( RAS_VAR ) ) goto Fail; - if ( New_Profile( RAS_VARS state_bez, o ) ) + if ( New_Profile( RAS_VARS state_bez ) ) goto Fail; } @@ -1865,9 +1852,6 @@ last = -1; for ( i = 0; i < ras.outline.n_contours; i++ ) { - Bool o; - - ras.state = Unknown_State; ras.gProfile = NULL; @@ -1890,10 +1874,7 @@ ( ras.cProfile->flags & Flow_Up ) ) ras.top--; - o = ras.cProfile->flags & Flow_Up ? IS_TOP_OVERSHOOT( ras.lastY ) - : IS_BOTTOM_OVERSHOOT( ras.lastY ); - - if ( End_Profile( RAS_VARS o ) ) + if ( End_Profile( RAS_VAR ) ) return FAILURE; if ( !ras.fProfile )