[raster] Improve the second pass (#58373).

Besides dropout control the second horizontal sweep is supposed to
clean up straight horizontal edges that are mishandled by the first
vertical sweep when a line passes through pixel centers.  This line
would present as perfectly aligned span edges in the second sweep.

* src/raster/ftraster.c (Horizontal_Sweep_Span): Replace the old
implementation with a better one focusing on aligned span edges only.
This commit is contained in:
Alexei Podtelezhnikov 2020-09-11 23:47:54 -04:00
parent c3721642f1
commit 20186d1be6
2 changed files with 61 additions and 26 deletions

View File

@ -1,3 +1,15 @@
2020-09-11 Alexei Podtelezhnikov <apodtele@gmail.com>
[raster] Improve the second pass (#58373).
Besides dropout control the second horizontal sweep is supposed to
clean up straight horizontal edges that are mishandled by the first
vertical sweep when a line passes through pixel centers. This line
would present as perfectly aligned span edges in the second sweep.
* src/raster/ftraster.c (Horizontal_Sweep_Span): Replace the old
implementation with a better one focusing on aligned span edges only.
2020-09-08 Alexei Podtelezhnikov <apodtele@gmail.com>
[raster] Tune SMART macro (#58352).

View File

@ -2495,45 +2495,68 @@
PProfile left,
PProfile right )
{
Long e1, e2;
FT_UNUSED( left );
FT_UNUSED( right );
if ( x2 - x1 < ras.precision )
FT_TRACE7(( " x=%d y=[% .12f;% .12f]",
y,
x1 / (double)ras.precision,
x2 / (double)ras.precision ));
/* We should not need this procedure but the vertical sweep */
/* mishandles horizontal lines through pixel centers. So we */
/* have to check perfectly aligned span edges here. */
/* */
/* XXX: Can we handle horizontal lines better and drop this? */
e1 = CEILING( x1 );
if ( x1 == e1 )
{
Long e1, e2;
e1 = TRUNC( e1 );
FT_TRACE7(( " x=%d y=[% .12f;% .12f]",
y,
x1 / (double)ras.precision,
x2 / (double)ras.precision ));
e1 = CEILING( x1 );
e2 = FLOOR ( x2 );
if ( e1 == e2 )
if ( e1 >= 0 && (ULong)e1 < ras.target.rows )
{
e1 = TRUNC( e1 );
if ( e1 >= 0 && (ULong)e1 < ras.target.rows )
{
Byte f1;
PByte bits;
Byte f1;
PByte bits;
bits = ras.bOrigin + ( y >> 3 ) - e1 * ras.target.pitch;
f1 = (Byte)( 0x80 >> ( y & 7 ) );
bits = ras.bOrigin + ( y >> 3 ) - e1 * ras.target.pitch;
f1 = (Byte)( 0x80 >> ( y & 7 ) );
FT_TRACE7(( bits[0] & f1 ? " redundant"
: " -> y=%ld", e1 ));
FT_TRACE7(( bits[0] & f1 ? " redundant"
: " -> y=%ld edge", e1 ));
bits[0] |= f1;
}
bits[0] |= f1;
}
FT_TRACE7(( "\n" ));
}
e2 = FLOOR ( x2 );
if ( x2 == e2 )
{
e2 = TRUNC( e2 );
if ( e2 >= 0 && (ULong)e2 < ras.target.rows )
{
Byte f1;
PByte bits;
bits = ras.bOrigin + ( y >> 3 ) - e2 * ras.target.pitch;
f1 = (Byte)( 0x80 >> ( y & 7 ) );
FT_TRACE7(( bits[0] & f1 ? " redundant"
: " -> y=%ld edge", e2 ));
bits[0] |= f1;
}
}
FT_TRACE7(( "\n" ));
}