CELLS-SWEEP (STATE FUNCTION &OPTIONAL FUNCTION-SPAN)
Call FUNCTION for each pixel on the polygon described by previous call to LINE or LINE-F. The pixels are scanned in increasing Y, then on increasing X. For optimization purpose, the optional FUNCTION-SPAN, if provided, is called for a full span of identical alpha pixel. If not provided, a call is made to FUNCTION for each pixel in the span.
CELLS-SWEEP/RECTANGLE (STATE X1 Y1 X2 Y2 FUNCTION &OPTIONAL FUNCTION-SPAN)
Call FUNCTION for each pixel on the polygon described by previous call to LINE or LINE-F. The pixels are scanned in increasing Y, then on increasing X. This is limited to the rectangle region specified with (X1,Y1)-(X2,Y2) (where X2 must be greater than X1 and Y2 must be greater than Y1, to describe a non-empty region.) For optimization purpose, the optional FUNCTION-SPAN, if provided, is called for a full span of identical alpha pixel. If not provided, a call is made to FUNCTION for each pixel in the span.
Freeze the state and return a list of scanlines. A scanline is an object which can be examined with SCANLINE-Y and processed with SCANLINE-SWEEP.
LINE (STATE X1 Y1 X2 Y2)
Draw a line from (X1,Y1) to (X2,Y2). All coordinates are integers with subpixel accuracy (a pixel width is given by +CELL-WIDTH+.) The line must be part of a closed polygon.
LINE-F (STATE X1 Y1 X2 Y2)
Draw a line, whose coordinates are translated to fixed-point as expected by function LINE. This is a convenient function to not depend on +CELL-WIDTH+.
Call FUNCTION for each pixel on the polygon covered by SCANLINE. The pixels are scanned in increasing X. The sweep can be limited to a range by START (included) or/and END (excluded).
Get the Y position of SCANLINE.
Reset the state, losing all accumulated cells. It can be faster or less memory consuming to reset a state and reuse it, rather than creating a new state.
MAKE-STATE (&KEY ((CURRENT-CELL DUM279) (MAKE-CELL)) ((CELLS DUM280) NIL) ((SCANLINES DUM281) NIL) ((END-OF-LINES DUM282) NIL) ((DROPPED-CELLS DUM283) NIL) ((RECYCLING-CELLS DUM284) (CONS NIL NIL)))
Test if the cell is empty. A cell is empty when COVER and AREA are both zero.
Reset the cell such that CELL-EMPTY-P is true.
COMPARE-CELLS (A B)
Compare coordinates between 2 cells. Used to sort cells by Y, then by X.
COMPUTE-ALPHA (COVER AREA)
Compute the alpha value given the accumulated cover and the actual area of a cell.
MAP-GRID-SPANS (FUNCTION X1 Y1 X2 Y2)
Call FUNCTION for each segments of the line from (X1,Y1) to (X2,Y2) cut by a grid with spacing +CELL-WIDTH+.
MAP-LINE-SPANS (FUNCTION A1 B1 A2 B2)
Call FUNCTION for each segment of a line with integer coordinates (A1,B1)-(A2,B2) cut by a grid of spacing +CELL-WIDTH+.
SET-CURRENT-CELL (STATE X Y)
Ensure current cell is one at coordinate X and Y. If not, the current cell is stored, then reset accordingly to new coordinate. Returns the current cell.
Finalize the state.
STATE-PUSH-CELL (STATE CELL)
Store a copy of the current cell into the cells list. If the state was reset, possibly reuse previous cells.
Sort the cells by Y, then by X.
UPDATE-CELL (CELL FX1 FY1 FX2 FY2)
Update COVER and AREA given a segment inside the corresponding cell. FX1, FY1, FX2 and FY2 must be subpixel coordinates between 0 and +CELL-WIDTH+ included.
SETFCELL-AREA (NEW-VALUE INSTANCE)
SETFCELL-COVER (NEW-VALUE INSTANCE)
SETFCELL-X (NEW-VALUE INSTANCE)
SETFCELL-Y (NEW-VALUE INSTANCE)
MAKE-CELL (&KEY ((X DUM178) 0) ((Y DUM179) 0) ((COVER DUM180) 0) ((AREA DUM181) 0))
SETFSTATE-CELLS (NEW-VALUE INSTANCE)
SETFSTATE-CURRENT-CELL (NEW-VALUE INSTANCE)
SETFSTATE-DROPPED-CELLS (NEW-VALUE INSTANCE)
SETFSTATE-END-OF-LINES (NEW-VALUE INSTANCE)
SETFSTATE-RECYCLING-CELLS (NEW-VALUE INSTANCE)
SETFSTATE-SCANLINES (NEW-VALUE INSTANCE)
A cell used to represent the partial area covered by a line passing by a corresponding pixel. The cell alone doesn't hold all the information to calculate the area.
AA state. Hold all the cells generated when drawing lines.
Constant used to translate value computed by AREA and COVER to an alpha value.
For non overlapping polygons, the alpha value will be in the range (-limit,limit) where limit is +alpha-range+. The value is negative or positive accordingly to the polygon orientation (clockwise or counter-clockwise.)
A cell represent a pixel square, and the width is the fractional part of the fixed-point coordinate. A large value increase precision. 256 should be enough though. Note that smaller value should NOT increase performance.