Initial commit
This commit is contained in:
+111
@@ -0,0 +1,111 @@
|
||||
#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 */
|
||||
Reference in New Issue
Block a user