[raster] Handle Bézier stack locally.
* src/raster/ftraster.c (black_TWorker): Move `arcs' from here... (Conic_To, Cubic_To): ... to here to tighten their scope. (Bezier_Up, Bezier_Down): ... Take the current `arc' argument.
This commit is contained in:
parent
7d4e55c329
commit
c852388df7
|
@ -1,3 +1,11 @@
|
||||||
|
2021-06-28 Alexei Podtelezhnikov <apodtele@gmail.com>
|
||||||
|
|
||||||
|
[raster] Handle Bézier stack locally.
|
||||||
|
|
||||||
|
* src/raster/ftraster.c (black_TWorker): Move `arcs' from here...
|
||||||
|
(Conic_To, Cubic_To): ... to here to tighten their scope.
|
||||||
|
(Bezier_Up, Bezier_Down): ... Take the current `arc' argument.
|
||||||
|
|
||||||
2021-06-28 Dominik Röttsches <drott@chromium.org>
|
2021-06-28 Dominik Röttsches <drott@chromium.org>
|
||||||
|
|
||||||
[sfnt] Improve paint limit checks
|
[sfnt] Improve paint limit checks
|
||||||
|
|
|
@ -483,8 +483,6 @@
|
||||||
|
|
||||||
Int numTurns; /* number of Y-turns in outline */
|
Int numTurns; /* number of Y-turns in outline */
|
||||||
|
|
||||||
TPoint* arc; /* current Bezier arc pointer */
|
|
||||||
|
|
||||||
UShort bWidth; /* target bitmap width */
|
UShort bWidth; /* target bitmap width */
|
||||||
PByte bOrigin; /* target bitmap bottom-left origin */
|
PByte bOrigin; /* target bitmap bottom-left origin */
|
||||||
PByte bLine; /* target bitmap current line */
|
PByte bLine; /* target bitmap current line */
|
||||||
|
@ -523,8 +521,6 @@
|
||||||
/* drop-out accurately when calling */
|
/* drop-out accurately when calling */
|
||||||
/* Render_Glyph. */
|
/* Render_Glyph. */
|
||||||
|
|
||||||
TPoint arcs[3 * MaxBezier + 1]; /* The Bezier stack */
|
|
||||||
|
|
||||||
black_TBand band_stack[16]; /* band stack used for sub-banding */
|
black_TBand band_stack[16]; /* band stack used for sub-banding */
|
||||||
/* enough for signed short bands */
|
/* enough for signed short bands */
|
||||||
|
|
||||||
|
@ -1198,6 +1194,7 @@
|
||||||
*/
|
*/
|
||||||
static Bool
|
static Bool
|
||||||
Bezier_Up( RAS_ARGS Int degree,
|
Bezier_Up( RAS_ARGS Int degree,
|
||||||
|
TPoint* arc,
|
||||||
TSplitter splitter,
|
TSplitter splitter,
|
||||||
Long miny,
|
Long miny,
|
||||||
Long maxy )
|
Long maxy )
|
||||||
|
@ -1205,13 +1202,11 @@
|
||||||
Long y1, y2, e, e2, e0;
|
Long y1, y2, e, e2, e0;
|
||||||
Short f1;
|
Short f1;
|
||||||
|
|
||||||
TPoint* arc;
|
|
||||||
TPoint* start_arc;
|
TPoint* start_arc;
|
||||||
|
|
||||||
PLong top;
|
PLong top;
|
||||||
|
|
||||||
|
|
||||||
arc = ras.arc;
|
|
||||||
y1 = arc[degree].y;
|
y1 = arc[degree].y;
|
||||||
y2 = arc[0].y;
|
y2 = arc[0].y;
|
||||||
top = ras.top;
|
top = ras.top;
|
||||||
|
@ -1303,7 +1298,6 @@
|
||||||
|
|
||||||
Fin:
|
Fin:
|
||||||
ras.top = top;
|
ras.top = top;
|
||||||
ras.arc -= degree;
|
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1335,11 +1329,11 @@
|
||||||
*/
|
*/
|
||||||
static Bool
|
static Bool
|
||||||
Bezier_Down( RAS_ARGS Int degree,
|
Bezier_Down( RAS_ARGS Int degree,
|
||||||
|
TPoint* arc,
|
||||||
TSplitter splitter,
|
TSplitter splitter,
|
||||||
Long miny,
|
Long miny,
|
||||||
Long maxy )
|
Long maxy )
|
||||||
{
|
{
|
||||||
TPoint* arc = ras.arc;
|
|
||||||
Bool result, fresh;
|
Bool result, fresh;
|
||||||
|
|
||||||
|
|
||||||
|
@ -1351,7 +1345,7 @@
|
||||||
|
|
||||||
fresh = ras.fresh;
|
fresh = ras.fresh;
|
||||||
|
|
||||||
result = Bezier_Up( RAS_VARS degree, splitter, -maxy, -miny );
|
result = Bezier_Up( RAS_VARS degree, arc, splitter, -maxy, -miny );
|
||||||
|
|
||||||
if ( fresh && !ras.fresh )
|
if ( fresh && !ras.fresh )
|
||||||
ras.cProfile->start = -ras.cProfile->start;
|
ras.cProfile->start = -ras.cProfile->start;
|
||||||
|
@ -1492,22 +1486,24 @@
|
||||||
{
|
{
|
||||||
Long y1, y2, y3, x3, ymin, ymax;
|
Long y1, y2, y3, x3, ymin, ymax;
|
||||||
TStates state_bez;
|
TStates state_bez;
|
||||||
|
TPoint arcs[2 * MaxBezier + 1]; /* The Bezier stack */
|
||||||
|
TPoint* arc; /* current Bezier arc pointer */
|
||||||
|
|
||||||
|
|
||||||
ras.arc = ras.arcs;
|
arc = arcs;
|
||||||
ras.arc[2].x = ras.lastX;
|
arc[2].x = ras.lastX;
|
||||||
ras.arc[2].y = ras.lastY;
|
arc[2].y = ras.lastY;
|
||||||
ras.arc[1].x = cx;
|
arc[1].x = cx;
|
||||||
ras.arc[1].y = cy;
|
arc[1].y = cy;
|
||||||
ras.arc[0].x = x;
|
arc[0].x = x;
|
||||||
ras.arc[0].y = y;
|
arc[0].y = y;
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
y1 = ras.arc[2].y;
|
y1 = arc[2].y;
|
||||||
y2 = ras.arc[1].y;
|
y2 = arc[1].y;
|
||||||
y3 = ras.arc[0].y;
|
y3 = arc[0].y;
|
||||||
x3 = ras.arc[0].x;
|
x3 = arc[0].x;
|
||||||
|
|
||||||
/* first, categorize the Bezier arc */
|
/* first, categorize the Bezier arc */
|
||||||
|
|
||||||
|
@ -1525,13 +1521,13 @@
|
||||||
if ( y2 < ymin || y2 > ymax )
|
if ( y2 < ymin || y2 > ymax )
|
||||||
{
|
{
|
||||||
/* this arc has no given direction, split it! */
|
/* this arc has no given direction, split it! */
|
||||||
Split_Conic( ras.arc );
|
Split_Conic( arc );
|
||||||
ras.arc += 2;
|
arc += 2;
|
||||||
}
|
}
|
||||||
else if ( y1 == y3 )
|
else if ( y1 == y3 )
|
||||||
{
|
{
|
||||||
/* this arc is flat, ignore it and pop it from the Bezier stack */
|
/* this arc is flat, ignore it and pop it from the Bezier stack */
|
||||||
ras.arc -= 2;
|
arc -= 2;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1558,15 +1554,18 @@
|
||||||
/* now call the appropriate routine */
|
/* now call the appropriate routine */
|
||||||
if ( state_bez == Ascending_State )
|
if ( state_bez == Ascending_State )
|
||||||
{
|
{
|
||||||
if ( Bezier_Up( RAS_VARS 2, Split_Conic, ras.minY, ras.maxY ) )
|
if ( Bezier_Up( RAS_VARS 2, arc, Split_Conic,
|
||||||
|
ras.minY, ras.maxY ) )
|
||||||
goto Fail;
|
goto Fail;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if ( Bezier_Down( RAS_VARS 2, Split_Conic, ras.minY, ras.maxY ) )
|
if ( Bezier_Down( RAS_VARS 2, arc, Split_Conic,
|
||||||
|
ras.minY, ras.maxY ) )
|
||||||
goto Fail;
|
goto Fail;
|
||||||
|
arc -= 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
} while ( ras.arc >= ras.arcs );
|
} while ( arc >= arcs );
|
||||||
|
|
||||||
ras.lastX = x3;
|
ras.lastX = x3;
|
||||||
ras.lastY = y3;
|
ras.lastY = y3;
|
||||||
|
@ -1621,25 +1620,27 @@
|
||||||
{
|
{
|
||||||
Long y1, y2, y3, y4, x4, ymin1, ymax1, ymin2, ymax2;
|
Long y1, y2, y3, y4, x4, ymin1, ymax1, ymin2, ymax2;
|
||||||
TStates state_bez;
|
TStates state_bez;
|
||||||
|
TPoint arcs[3 * MaxBezier + 1]; /* The Bezier stack */
|
||||||
|
TPoint* arc; /* current Bezier arc pointer */
|
||||||
|
|
||||||
|
|
||||||
ras.arc = ras.arcs;
|
arc = arcs;
|
||||||
ras.arc[3].x = ras.lastX;
|
arc[3].x = ras.lastX;
|
||||||
ras.arc[3].y = ras.lastY;
|
arc[3].y = ras.lastY;
|
||||||
ras.arc[2].x = cx1;
|
arc[2].x = cx1;
|
||||||
ras.arc[2].y = cy1;
|
arc[2].y = cy1;
|
||||||
ras.arc[1].x = cx2;
|
arc[1].x = cx2;
|
||||||
ras.arc[1].y = cy2;
|
arc[1].y = cy2;
|
||||||
ras.arc[0].x = x;
|
arc[0].x = x;
|
||||||
ras.arc[0].y = y;
|
arc[0].y = y;
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
y1 = ras.arc[3].y;
|
y1 = arc[3].y;
|
||||||
y2 = ras.arc[2].y;
|
y2 = arc[2].y;
|
||||||
y3 = ras.arc[1].y;
|
y3 = arc[1].y;
|
||||||
y4 = ras.arc[0].y;
|
y4 = arc[0].y;
|
||||||
x4 = ras.arc[0].x;
|
x4 = arc[0].x;
|
||||||
|
|
||||||
/* first, categorize the Bezier arc */
|
/* first, categorize the Bezier arc */
|
||||||
|
|
||||||
|
@ -1668,13 +1669,13 @@
|
||||||
if ( ymin2 < ymin1 || ymax2 > ymax1 )
|
if ( ymin2 < ymin1 || ymax2 > ymax1 )
|
||||||
{
|
{
|
||||||
/* this arc has no given direction, split it! */
|
/* this arc has no given direction, split it! */
|
||||||
Split_Cubic( ras.arc );
|
Split_Cubic( arc );
|
||||||
ras.arc += 3;
|
arc += 3;
|
||||||
}
|
}
|
||||||
else if ( y1 == y4 )
|
else if ( y1 == y4 )
|
||||||
{
|
{
|
||||||
/* this arc is flat, ignore it and pop it from the Bezier stack */
|
/* this arc is flat, ignore it and pop it from the Bezier stack */
|
||||||
ras.arc -= 3;
|
arc -= 3;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1700,15 +1701,18 @@
|
||||||
/* compute intersections */
|
/* compute intersections */
|
||||||
if ( state_bez == Ascending_State )
|
if ( state_bez == Ascending_State )
|
||||||
{
|
{
|
||||||
if ( Bezier_Up( RAS_VARS 3, Split_Cubic, ras.minY, ras.maxY ) )
|
if ( Bezier_Up( RAS_VARS 3, arc, Split_Cubic,
|
||||||
|
ras.minY, ras.maxY ) )
|
||||||
goto Fail;
|
goto Fail;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if ( Bezier_Down( RAS_VARS 3, Split_Cubic, ras.minY, ras.maxY ) )
|
if ( Bezier_Down( RAS_VARS 3, arc, Split_Cubic,
|
||||||
|
ras.minY, ras.maxY ) )
|
||||||
goto Fail;
|
goto Fail;
|
||||||
|
arc -= 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
} while ( ras.arc >= ras.arcs );
|
} while ( arc >= arcs );
|
||||||
|
|
||||||
ras.lastX = x4;
|
ras.lastX = x4;
|
||||||
ras.lastY = y4;
|
ras.lastY = y4;
|
||||||
|
|
Loading…
Reference in New Issue