93 #define BRESINITPGON(dy, x1, x2, xStart, d, m, m1, incr1, incr2) { \ 102 incr1 = -2 * dx + 2 * (dy) * m1; \ 103 incr2 = -2 * dx + 2 * (dy) * m; \ 104 d = 2 * m * (dy) - 2 * dx - 2 * (dy); \ 108 incr1 = 2 * dx - 2 * (dy) * m1; \ 109 incr2 = 2 * dx - 2 * (dy) * m; \ 110 d = -2 * m * (dy) + 2 * dx; \ 115 #define BRESINCRPGON(d, minval, m, m1, incr1, incr2) { \ 153 #define BRESINITPGONSTRUCT(dmaj, min1, min2, bres) \ 154 BRESINITPGON(dmaj, min1, min2, bres.minor_axis, bres.d, \ 155 bres.m, bres.m1, bres.incr1, bres.incr2) 157 #define BRESINCRPGONSTRUCT(bres) \ 158 BRESINCRPGON(bres.d, bres.minor_axis, bres.m, bres.m1, bres.incr1, bres.incr2) 211 #define COUNTERCLOCKWISE -1 213 typedef struct _EdgeTableEntry {
216 struct _EdgeTableEntry *next;
217 struct _EdgeTableEntry *back;
218 struct _EdgeTableEntry *nextWETE;
223 typedef struct _ScanLineList{
226 struct _ScanLineList *next;
242 #define SLLSPERBLOCK 25 244 typedef struct _ScanLineListBlock {
246 struct _ScanLineListBlock *next;
264 #define EVALUATEEDGEWINDING(pAET, pPrevAET, y, fixWAET) { \ 265 if (pAET->ymax == y) { \ 266 pPrevAET->next = pAET->next; \ 267 pAET = pPrevAET->next; \ 270 pAET->back = pPrevAET; \ 273 BRESINCRPGONSTRUCT(pAET->bres); \ 287 #define EVALUATEEDGEEVENODD(pAET, pPrevAET, y) { \ 288 if (pAET->ymax == y) { \ 289 pPrevAET->next = pAET->next; \ 290 pAET = pPrevAET->next; \ 292 pAET->back = pPrevAET; \ 295 BRESINCRPGONSTRUCT(pAET->bres); \ 301 #define LARGE_COORDINATE 1000000 302 #define SMALL_COORDINATE -LARGE_COORDINATE 320 pPrevSLL = &ET->scanlines;
321 pSLL = pPrevSLL->next;
322 while (pSLL && (pSLL->scanline < scanline)) {
330 if ((!pSLL) || (pSLL->scanline > scanline)) {
333 (*SLLBlock)->next = tmpSLLBlock;
335 *SLLBlock = tmpSLLBlock;
338 pSLL = &((*SLLBlock)->SLLs[(*iSLLBlock)++]);
340 pSLL->next = pPrevSLL->next;
342 pPrevSLL->next = pSLL;
344 pSLL->scanline = scanline;
350 start = pSLL->edgelist;
351 while (start && (start->bres.minor_axis < ETE->bres.minor_axis)) {
360 pSLL->edgelist = ETE;
393 if (count < 2)
return;
411 PrevPt = &pts[count-1];
424 if (PrevPt->
fY > CurrPt->
fY) {
425 bottom = PrevPt, top = CurrPt;
426 pETEs->ClockWise = 0;
428 bottom = CurrPt, top = PrevPt;
429 pETEs->ClockWise = 1;
435 if (bottom->
fY != top->
fY) {
436 pETEs->ymax = bottom->
fY-1;
441 dy = bottom->
fY - top->
fY;
446 if (PrevPt->
fY > ET->ymax) ET->ymax = PrevPt->
fY;
447 if (PrevPt->
fY < ET->ymin) ET->ymin = PrevPt->
fY;
467 while (AET && (AET->bres.minor_axis < ETEs->bres.minor_axis)) {
476 ETEs->back = pPrevAET;
477 pPrevAET->next = ETEs;
502 while (pETEchase->back->bres.minor_axis > AET->bres.minor_axis) {
503 pETEchase = pETEchase->back;
507 if (pETEchase != pETEinsert) {
508 pETEchaseBackTMP = pETEchase->back;
509 pETEinsert->back->next = AET;
511 AET->back = pETEinsert->back;
513 pETEinsert->next = pETEchase;
514 pETEchase->back->next = pETEinsert;
515 pETEchase->back = pETEinsert;
516 pETEinsert->back = pETEchaseBackTMP;
531 tmpSLLBlock = pSLLBlock->next;
533 pSLLBlock = tmpSLLBlock;
static void FreeStorage(ScanLineListBlock *pSLLBlock)
static void loadAET(EdgeTableEntry *AET, EdgeTableEntry *ETEs)
static void InsertEdgeInET(EdgeTable *ET, EdgeTableEntry *ETE, int scanline, ScanLineListBlock **SLLBlock, int *iSLLBlock)
static void CreateETandAET(int count, TPoint *pts, EdgeTable *ET, EdgeTableEntry *AET, EdgeTableEntry *pETEs, ScanLineListBlock *pSLLBlock)
static int InsertionSort(EdgeTableEntry *AET)
#define BRESINITPGONSTRUCT(dmaj, min1, min2, bres)
struct _EdgeTableEntry EdgeTableEntry
struct _ScanLineListBlock ScanLineListBlock
struct _ScanLineList ScanLineList