#ifndef CGE_SCANLINE_H #define CGE_SCANLINE_H #ifdef __cplusplus extern "C" { #endif #include #include enum CgeScanlineFillRule { CGE_SCANLINE_ODD_EVEN = 0, CGE_SCANLINE_NON_ZERO = (1 << 0), }; enum CgeScanlineCode { CGE_SCANLINE_EOK, CGE_SCANLINE_EDONE, CGE_SCANLINE_EAET, CGE_SCANLINE_ESPANS, }; typedef struct CgeScanlineEdge { uint32_t startX; uint32_t startY; uint32_t endY; uint32_t step; uint32_t error; uint32_t threshold; uint32_t dir; int winding; } CgeScanlineEdge; typedef struct CgeScanlineEdgeTable { size_t index; uint32_t x; uint32_t error; } CgeScanlineEdgeTable; typedef struct CgeScanlineSpan { uint32_t start; uint32_t end; } CgeScanlineSpan; typedef void (*CgeScanlineRowCallback)(uint32_t y, CgeScanlineSpan *spans, size_t size, void *userData); typedef void (*CgeScanlineLineToCallback)(uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1, void *userData); typedef struct CgeScanlineState { CgeScanlineEdge *edge; size_t edgeSize; CgeScanlineEdgeTable *aet; size_t aetCapacity; CgeScanlineSpan *span; size_t spanCapacity; CgeScanlineRowCallback callback; void *userData; int flags; /* Internal state - do not edit */ uint32_t yCurrent; uint32_t yMax; size_t aetSize; size_t edgeCursor; } CgeScanlineState; int CgeScanlineStateInit(CgeScanlineState *state, CgeScanlineEdge *edge, size_t edgeSize, CgeScanlineEdgeTable *aet, size_t aetCapacity, CgeScanlineSpan *span, size_t spanCapacity, CgeScanlineRowCallback callback, void *userData, int flags); int CgeScanlineStateNext(CgeScanlineState *state, int *result); int CgeScanlineEdgeAdd(CgeScanlineEdge *edge, uint32_t aX, uint32_t aY, uint32_t bX, uint32_t bY); int CgeScanlineSpans(CgeScanlineEdge *edge, size_t edgeSize, CgeScanlineRowCallback callback, void *userData, int flags); void CgeScanlineBezierCubicFlatten(uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1, uint32_t x2, uint32_t y2, uint32_t x3, uint32_t y3, uint32_t flatness, CgeScanlineLineToCallback lineTo, void *userData); void CgeScanlineBezierQuadFlatten(uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1, uint32_t x2, uint32_t y2, uint32_t flatness, CgeScanlineLineToCallback lineTo, void *userData); size_t CgeScanlineBezierCubicEdges(CgeScanlineEdge *edge, size_t edgeSize, uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1, uint32_t x2, uint32_t y2, uint32_t x3, uint32_t y3, uint32_t flatness); size_t CgeScanlineBezierQuadEdges(CgeScanlineEdge *edge, size_t edgeSize, uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1, uint32_t x2, uint32_t y2, uint32_t flatness); #ifdef __cplusplus } #endif #endif /* CGE_SCANLINE_H */