diff options
Diffstat (limited to 'nx-X11/lib/X11/PolyReg.c')
-rw-r--r-- | nx-X11/lib/X11/PolyReg.c | 90 |
1 files changed, 46 insertions, 44 deletions
diff --git a/nx-X11/lib/X11/PolyReg.c b/nx-X11/lib/X11/PolyReg.c index 6cff945b7..6ac2e2897 100644 --- a/nx-X11/lib/X11/PolyReg.c +++ b/nx-X11/lib/X11/PolyReg.c @@ -27,13 +27,13 @@ Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. All Rights Reserved -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that -both that copyright notice and this permission notice appear in +both that copyright notice and this permission notice appear in supporting documentation, and that the name of Digital not be used in advertising or publicity pertaining to distribution of the -software without specific, written prior permission. +software without specific, written prior permission. DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL @@ -82,7 +82,7 @@ InsertEdgeInET( */ pPrevSLL = &ET->scanlines; pSLL = pPrevSLL->next; - while (pSLL && (pSLL->scanline < scanline)) + while (pSLL && (pSLL->scanline < scanline)) { pPrevSLL = pSLL; pSLL = pSLL->next; @@ -91,11 +91,11 @@ InsertEdgeInET( /* * reassign pSLL (pointer to ScanLineList) if necessary */ - if ((!pSLL) || (pSLL->scanline > scanline)) + if ((!pSLL) || (pSLL->scanline > scanline)) { - if (*iSLLBlock > SLLSPERBLOCK-1) + if (*iSLLBlock > SLLSPERBLOCK-1) { - tmpSLLBlock = + tmpSLLBlock = (ScanLineListBlock *)Xmalloc(sizeof(ScanLineListBlock)); (*SLLBlock)->next = tmpSLLBlock; tmpSLLBlock->next = (ScanLineListBlock *)NULL; @@ -115,7 +115,7 @@ InsertEdgeInET( */ prev = (EdgeTableEntry *)NULL; start = pSLL->edgelist; - while (start && (start->bres.minor_axis < ETE->bres.minor_axis)) + while (start && (start->bres.minor_axis < ETE->bres.minor_axis)) { prev = start; start = start->next; @@ -132,7 +132,7 @@ InsertEdgeInET( * CreateEdgeTable * * This routine creates the edge table for - * scan converting polygons. + * scan converting polygons. * The Edge Table (ET) looks like: * * EdgeTable @@ -192,19 +192,19 @@ CreateETandAET( * In this loop we are dealing with two vertices at * a time -- these make up one edge of the polygon. */ - while (count--) + while (count--) { CurrPt = pts++; /* * find out which point is above and which is below. */ - if (PrevPt->y > CurrPt->y) + if (PrevPt->y > CurrPt->y) { bottom = PrevPt, top = CurrPt; pETEs->ClockWise = 0; } - else + else { bottom = CurrPt, top = PrevPt; pETEs->ClockWise = 1; @@ -213,7 +213,7 @@ CreateETandAET( /* * don't add horizontal edges to the Edge table. */ - if (bottom->y != top->y) + if (bottom->y != top->y) { pETEs->ymax = bottom->y-1; /* -1 so we don't get last scanline */ @@ -255,9 +255,9 @@ loadAET( pPrevAET = AET; AET = AET->next; - while (ETEs) + while (ETEs) { - while (AET && (AET->bres.minor_axis < ETEs->bres.minor_axis)) + while (AET && (AET->bres.minor_axis < ETEs->bres.minor_axis)) { pPrevAET = AET; AET = AET->next; @@ -279,13 +279,13 @@ loadAET( * * This routine links the AET by the * nextWETE (winding EdgeTableEntry) link for - * use by the winding number rule. The final + * use by the winding number rule. The final * Active Edge Table (AET) might look something * like: * * AET * ---------- --------- --------- - * |ymax | |ymax | |ymax | + * |ymax | |ymax | |ymax | * | ... | |... | |... | * |next |->|next |->|next |->... * |nextWETE| |nextWETE| |nextWETE| @@ -305,7 +305,7 @@ computeWAET( AET->nextWETE = (EdgeTableEntry *)NULL; pWETE = AET; AET = AET->next; - while (AET) + while (AET) { if (AET->ClockWise) isInside++; @@ -313,7 +313,7 @@ computeWAET( isInside--; if ((!inside && !isInside) || - ( inside && isInside)) + ( inside && isInside)) { pWETE->nextWETE = AET; pWETE = AET; @@ -343,7 +343,7 @@ InsertionSort( register int changed = 0; AET = AET->next; - while (AET) + while (AET) { pETEinsert = AET; pETEchase = AET; @@ -351,7 +351,7 @@ InsertionSort( pETEchase = pETEchase->back; AET = AET->next; - if (pETEchase != pETEinsert) + if (pETEchase != pETEinsert) { pETEchaseBackTMP = pETEchase->back; pETEinsert->back->next = AET; @@ -376,7 +376,7 @@ FreeStorage( { register ScanLineListBlock *tmpSLLBlock; - while (pSLLBlock) + while (pSLLBlock) { tmpSLLBlock = pSLLBlock->next; Xfree((char *)pSLLBlock); @@ -407,21 +407,21 @@ static int PtsToRegion( BOX *prevRects = reg->rects; extents = ®->extents; - + numRects = ((numFullPtBlocks * NUMPTSTOBUFFER) + iCurPtBlock) >> 1; - - if (!(reg->rects = (BOX *)Xrealloc((char *)reg->rects, + + if (!(reg->rects = (BOX *)Xrealloc((char *)reg->rects, (unsigned) (sizeof(BOX) * numRects)))) { Xfree(prevRects); return(0); } - + reg->size = numRects; CurPtBlock = FirstPtBlock; rects = reg->rects - 1; numRects = 0; extents->x1 = MAXSHORT, extents->x2 = MINSHORT; - + for ( ; numFullPtBlocks >= 0; numFullPtBlocks--) { /* the loop uses 2 points per iteration */ i = NUMPTSTOBUFFER >> 1; @@ -459,7 +459,7 @@ static int PtsToRegion( extents->y2 = 0; } reg->numRects = numRects; - + return(TRUE); } @@ -470,11 +470,11 @@ static int PtsToRegion( * encoding of the resultant bitmap -- the run-length * encoding is in the form of an array of rectangles. */ -Region -XPolygonRegion(Pts, Count, rule) - int Count; /* number of pts */ - XPoint *Pts; /* the pts */ - int rule; /* winding rule */ +Region +XPolygonRegion( + XPoint *Pts, /* the pts */ + int Count, /* number of pts */ + int rule) /* winding rule */ { Region region; register EdgeTableEntry *pAET; /* Active Edge Table */ @@ -492,7 +492,7 @@ XPolygonRegion(Pts, Count, rule) POINTBLOCK FirstPtBlock, *curPtBlock; /* PtBlock buffers */ POINTBLOCK *tmpPtBlock; int numFullPtBlocks = 0; - + if (! (region = XCreateRegion())) return (Region) NULL; /* special case a rectangle */ @@ -518,18 +518,20 @@ XPolygonRegion(Pts, Count, rule) } return(region); } - + if (Count < 2) return region; if (! (pETEs = (EdgeTableEntry *) - Xmalloc((unsigned) (sizeof(EdgeTableEntry) * Count)))) + Xmalloc((unsigned) (sizeof(EdgeTableEntry) * Count)))) { + XDestroyRegion(region); return (Region) NULL; + } pts = FirstPtBlock.pts; CreateETandAET(Count, Pts, &ET, &AET, pETEs, &SLLBlock); pSLL = ET.scanlines.next; curPtBlock = &FirstPtBlock; - + if (rule == EvenOddRule) { /* * for each scanline @@ -545,14 +547,14 @@ XPolygonRegion(Pts, Count, rule) } pPrevAET = &AET; pAET = AET.next; - + /* * for each active edge */ while (pAET) { pts->x = pAET->bres.minor_axis, pts->y = y; pts++, iPts++; - + /* * send out the buffer */ @@ -586,7 +588,7 @@ XPolygonRegion(Pts, Count, rule) pPrevAET = &AET; pAET = AET.next; pWETE = pAET; - + /* * for each active edge */ @@ -598,7 +600,7 @@ XPolygonRegion(Pts, Count, rule) if (pWETE == pAET) { pts->x = pAET->bres.minor_axis, pts->y = y; pts++, iPts++; - + /* * send out the buffer */ @@ -613,7 +615,7 @@ XPolygonRegion(Pts, Count, rule) } EVALUATEEDGEWINDING(pAET, pPrevAET, y, fixWAET); } - + /* * recompute the winding active edge table if * we just resorted or have exited an edge. @@ -624,7 +626,7 @@ XPolygonRegion(Pts, Count, rule) } } } - FreeStorage(SLLBlock.next); + FreeStorage(SLLBlock.next); (void) PtsToRegion(numFullPtBlocks, iPts, &FirstPtBlock, region); for (curPtBlock = FirstPtBlock.next; --numFullPtBlocks >= 0;) { tmpPtBlock = curPtBlock->next; |