112 lines
3.4 KiB
C
112 lines
3.4 KiB
C
#ifndef CGE_SCANLINE_H
|
|
#define CGE_SCANLINE_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include <stdint.h>
|
|
#include <stddef.h>
|
|
|
|
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 */
|