Files
CgeScanline/CgeScanline.h
T

111 lines
3.4 KiB
C
Raw Normal View History

2026-09-13 22:31:21 +03:00
#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 */