diff options
Diffstat (limited to 'hw/xfree86/xaa/xaaDashLine.c')
-rw-r--r-- | hw/xfree86/xaa/xaaDashLine.c | 497 |
1 files changed, 258 insertions, 239 deletions
diff --git a/hw/xfree86/xaa/xaaDashLine.c b/hw/xfree86/xaa/xaaDashLine.c index e84708449..c7e52cd0b 100644 --- a/hw/xfree86/xaa/xaaDashLine.c +++ b/hw/xfree86/xaa/xaaDashLine.c @@ -17,26 +17,20 @@ #include "xaa.h" #include "xaalocal.h" - void #ifdef POLYSEGMENT -XAAPolySegmentDashed( - DrawablePtr pDrawable, - GCPtr pGC, - int nseg, - xSegment *pSeg + XAAPolySegmentDashed(DrawablePtr pDrawable, + GCPtr pGC, int nseg, xSegment * pSeg #else -XAAPolyLinesDashed( - DrawablePtr pDrawable, - GCPtr pGC, - int mode, /* Origin or Previous */ - int npt, /* number of points */ - DDXPointPtr pptInit +XAAPolyLinesDashed(DrawablePtr pDrawable, GCPtr pGC, int mode, /* Origin or Previous */ + int npt, /* number of points */ + DDXPointPtr pptInit #endif -){ + ) +{ XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_GC(pGC); - XAAGCPtr pGCPriv = (XAAGCPtr)dixLookupPrivate(&pGC->devPrivates, - XAAGetGCKey()); + XAAGCPtr pGCPriv = (XAAGCPtr) dixLookupPrivate(&pGC->devPrivates, + XAAGetGCKey()); BoxPtr pboxInit = RegionRects(pGC->pCompositeClip); int nboxInit = RegionNumRects(pGC->pCompositeClip); unsigned int bias = miGetZeroLineBias(pDrawable->pScreen); @@ -44,6 +38,7 @@ XAAPolyLinesDashed( int yorg = pDrawable->y; int nbox; BoxPtr pbox; + #ifndef POLYSEGMENT DDXPointPtr ppt; #endif @@ -52,68 +47,69 @@ XAAPolyLinesDashed( int x1, x2, y1, y2, tmp, len, offset; int PatternLength, PatternOffset; - if(!nboxInit) - return; + if (!nboxInit) + return; if (infoRec->DashedLineFlags & LINE_LIMIT_COORDS) { - int minValX = infoRec->DashedLineLimits.x1; - int maxValX = infoRec->DashedLineLimits.x2; - int minValY = infoRec->DashedLineLimits.y1; - int maxValY = infoRec->DashedLineLimits.y2; + int minValX = infoRec->DashedLineLimits.x1; + int maxValX = infoRec->DashedLineLimits.x2; + int minValY = infoRec->DashedLineLimits.y1; + int maxValY = infoRec->DashedLineLimits.y2; + #ifdef POLYSEGMENT - int n = nseg; - xSegment *s = pSeg; + int n = nseg; + xSegment *s = pSeg; - while (n--) + while (n--) #else - int n = npt; - int xorgtmp = xorg; - int yorgtmp = yorg; - - ppt = pptInit; - x2 = ppt->x + xorgtmp; - y2 = ppt->y + yorgtmp; - while (--n) + int n = npt; + int xorgtmp = xorg; + int yorgtmp = yorg; + + ppt = pptInit; + x2 = ppt->x + xorgtmp; + y2 = ppt->y + yorgtmp; + while (--n) #endif - { + { #ifdef POLYSEGMENT - x1 = s->x1 + xorg; - y1 = s->y1 + yorg; - x2 = s->x2 + xorg; - y2 = s->y2 + yorg; - s++; + x1 = s->x1 + xorg; + y1 = s->y1 + yorg; + x2 = s->x2 + xorg; + y2 = s->y2 + yorg; + s++; #else - x1 = x2; - y1 = y2; - ++ppt; - if (mode == CoordModePrevious) { - xorgtmp = x1; - yorgtmp = y1; - } - x2 = ppt->x + xorgtmp; - y2 = ppt->y + yorgtmp; + x1 = x2; + y1 = y2; + ++ppt; + if (mode == CoordModePrevious) { + xorgtmp = x1; + yorgtmp = y1; + } + x2 = ppt->x + xorgtmp; + y2 = ppt->y + yorgtmp; #endif - if (x1 > maxValX || x1 < minValX || - x2 > maxValX || x2 < minValX || - y1 > maxValY || y1 < minValY || - y2 > maxValY || y2 < minValY) { + if (x1 > maxValX || x1 < minValX || + x2 > maxValX || x2 < minValX || + y1 > maxValY || y1 < minValY || y2 > maxValY || y2 < minValY) { #ifdef POLYSEGMENT - XAAFallbackOps.PolySegment(pDrawable, pGC, nseg, pSeg); + XAAFallbackOps.PolySegment(pDrawable, pGC, nseg, pSeg); #else - XAAFallbackOps.Polylines(pDrawable, pGC, mode, npt, pptInit); + XAAFallbackOps.Polylines(pDrawable, pGC, mode, npt, pptInit); #endif - return; - } - } + return; + } + } } - PatternLength = pGCPriv->DashLength; + PatternLength = pGCPriv->DashLength; PatternOffset = pGC->dashOffset % PatternLength; - (*infoRec->SetupForDashedLine)(infoRec->pScrn, pGC->fgPixel, - (pGC->lineStyle == LineDoubleDash) ? pGC->bgPixel : -1, - pGC->alu, pGC->planemask, PatternLength, pGCPriv->DashPattern); - + (*infoRec->SetupForDashedLine) (infoRec->pScrn, pGC->fgPixel, + (pGC->lineStyle == + LineDoubleDash) ? pGC->bgPixel : -1, + pGC->alu, pGC->planemask, PatternLength, + pGCPriv->DashPattern); #ifdef POLYSEGMENT while (nseg--) @@ -121,214 +117,237 @@ XAAPolyLinesDashed( ppt = pptInit; x2 = ppt->x + xorg; y2 = ppt->y + yorg; - while(--npt) + while (--npt) #endif { - nbox = nboxInit; - pbox = pboxInit; + nbox = nboxInit; + pbox = pboxInit; #ifdef POLYSEGMENT - x1 = pSeg->x1 + xorg; - y1 = pSeg->y1 + yorg; - x2 = pSeg->x2 + xorg; - y2 = pSeg->y2 + yorg; - pSeg++; + x1 = pSeg->x1 + xorg; + y1 = pSeg->y1 + yorg; + x2 = pSeg->x2 + xorg; + y2 = pSeg->y2 + yorg; + pSeg++; #else - x1 = x2; - y1 = y2; - ++ppt; - if (mode == CoordModePrevious) { - xorg = x1; - yorg = y1; - } - x2 = ppt->x + xorg; - y2 = ppt->y + yorg; + x1 = x2; + y1 = y2; + ++ppt; + if (mode == CoordModePrevious) { + xorg = x1; + yorg = y1; + } + x2 = ppt->x + xorg; + y2 = ppt->y + yorg; #endif - - if (infoRec->SubsequentDashedBresenhamLine) { - if((dmaj = x2 - x1) < 0) { - dmaj = -dmaj; - octant = XDECREASING; - } else octant = 0; - - if((dmin = y2 - y1) < 0) { - dmin = -dmin; - octant |= YDECREASING; - } - - if(dmin >= dmaj){ - tmp = dmin; dmin = dmaj; dmaj = tmp; - octant |= YMAJOR; - } - - e = -dmaj - ((bias >> octant) & 1); - len = dmaj; - dmin <<= 1; - dmaj <<= 1; - } else { /* Muffle compiler */ - dmin = dmaj = e = octant = len = 0; - } - - while(nbox--) { - oc1 = oc2 = 0; - OUTCODES(oc1, x1, y1, pbox); - OUTCODES(oc2, x2, y2, pbox); - if (!(oc1 | oc2)) { /* uncliped */ - if(infoRec->SubsequentDashedTwoPointLine) { - (*infoRec->SubsequentDashedTwoPointLine)( - infoRec->pScrn, x1, y1, x2, y2, + if (infoRec->SubsequentDashedBresenhamLine) { + if ((dmaj = x2 - x1) < 0) { + dmaj = -dmaj; + octant = XDECREASING; + } + else + octant = 0; + + if ((dmin = y2 - y1) < 0) { + dmin = -dmin; + octant |= YDECREASING; + } + + if (dmin >= dmaj) { + tmp = dmin; + dmin = dmaj; + dmaj = tmp; + octant |= YMAJOR; + } + + e = -dmaj - ((bias >> octant) & 1); + len = dmaj; + dmin <<= 1; + dmaj <<= 1; + } + else { /* Muffle compiler */ + dmin = dmaj = e = octant = len = 0; + } + + while (nbox--) { + oc1 = oc2 = 0; + OUTCODES(oc1, x1, y1, pbox); + OUTCODES(oc2, x2, y2, pbox); + if (!(oc1 | oc2)) { /* uncliped */ + if (infoRec->SubsequentDashedTwoPointLine) { + (*infoRec->SubsequentDashedTwoPointLine) (infoRec->pScrn, + x1, y1, x2, y2, #ifdef POLYSEGMENT - (pGC->capStyle != CapNotLast) ? 0 : + (pGC->capStyle != + CapNotLast) ? 0 : #endif - OMIT_LAST, PatternOffset); - } else { - (*infoRec->SubsequentDashedBresenhamLine)( - infoRec->pScrn, x1, y1, dmaj, dmin, e, + OMIT_LAST, + PatternOffset); + } + else { + (*infoRec->SubsequentDashedBresenhamLine) (infoRec->pScrn, + x1, y1, dmaj, + dmin, e, #ifdef POLYSEGMENT - (pGC->capStyle != CapNotLast) ? (len+1) : + (pGC->capStyle != + CapNotLast) + ? (len + 1) : #endif - len, octant, PatternOffset); - } - break; - } else if (oc1 & oc2) { /* completely clipped */ - pbox++; - } else if (infoRec->ClippingFlags & HARDWARE_CLIP_DASHED_LINE) { - (*infoRec->SetClippingRectangle)(infoRec->pScrn, - pbox->x1, pbox->y1, pbox->x2 - 1, pbox->y2 - 1); - - if(infoRec->SubsequentDashedBresenhamLine) { - (*infoRec->SubsequentDashedBresenhamLine)( - infoRec->pScrn, x1, y1, dmaj, dmin, e, + len, octant, + PatternOffset); + } + break; + } + else if (oc1 & oc2) { /* completely clipped */ + pbox++; + } + else if (infoRec->ClippingFlags & HARDWARE_CLIP_DASHED_LINE) { + (*infoRec->SetClippingRectangle) (infoRec->pScrn, + pbox->x1, pbox->y1, + pbox->x2 - 1, pbox->y2 - 1); + + if (infoRec->SubsequentDashedBresenhamLine) { + (*infoRec->SubsequentDashedBresenhamLine) (infoRec->pScrn, + x1, y1, dmaj, + dmin, e, #ifdef POLYSEGMENT - (pGC->capStyle != CapNotLast) ? (len+1) : + (pGC->capStyle != + CapNotLast) + ? (len + 1) : #endif - len, octant, PatternOffset); - } else { - (*infoRec->SubsequentDashedTwoPointLine)( - infoRec->pScrn, x1, y1, x2, y2, + len, octant, + PatternOffset); + } + else { + (*infoRec->SubsequentDashedTwoPointLine) (infoRec->pScrn, + x1, y1, x2, y2, #ifdef POLYSEGMENT - (pGC->capStyle != CapNotLast) ? 0 : + (pGC->capStyle != + CapNotLast) ? 0 : #endif - OMIT_LAST, PatternOffset - ); - } - (*infoRec->DisableClipping)(infoRec->pScrn); - pbox++; - } else { - int new_x1 = x1, new_y1 = y1, new_x2 = x2, new_y2 = y2; - int clip1 = 0, clip2 = 0; - int err, adx, ady; - - if(octant & YMAJOR) { - ady = dmaj >> 1; - adx = dmin >> 1; - } else { - ady = dmin >> 1; - adx = dmaj >> 1; - } - - if (miZeroClipLine(pbox->x1, pbox->y1, - pbox->x2 - 1, pbox->y2 - 1, - &new_x1, &new_y1, &new_x2, &new_y2, - adx, ady, &clip1, &clip2, - octant, bias, oc1, oc2) == -1) - { - pbox++; - continue; - } - - if (octant & YMAJOR) - len = abs(new_y2 - new_y1); - else - len = abs(new_x2 - new_x1); + OMIT_LAST, + PatternOffset); + } + (*infoRec->DisableClipping) (infoRec->pScrn); + pbox++; + } + else { + int new_x1 = x1, new_y1 = y1, new_x2 = x2, new_y2 = y2; + int clip1 = 0, clip2 = 0; + int err, adx, ady; + + if (octant & YMAJOR) { + ady = dmaj >> 1; + adx = dmin >> 1; + } + else { + ady = dmin >> 1; + adx = dmaj >> 1; + } + + if (miZeroClipLine(pbox->x1, pbox->y1, + pbox->x2 - 1, pbox->y2 - 1, + &new_x1, &new_y1, &new_x2, &new_y2, + adx, ady, &clip1, &clip2, + octant, bias, oc1, oc2) == -1) { + pbox++; + continue; + } + + if (octant & YMAJOR) + len = abs(new_y2 - new_y1); + else + len = abs(new_x2 - new_x1); #ifdef POLYSEGMENT - if (clip2 != 0 || pGC->capStyle != CapNotLast) - len++; + if (clip2 != 0 || pGC->capStyle != CapNotLast) + len++; #else - len += (clip2 != 0); + len += (clip2 != 0); #endif - if (len) { - int abserr, clipdx, clipdy; - /* unwind bresenham error term to first point */ - if (clip1) { - clipdx = abs(new_x1 - x1); - clipdy = abs(new_y1 - y1); - - if (octant & YMAJOR) - err = e + clipdy*dmin - clipdx*dmaj; - else - err = e + clipdx*dmin - clipdy*dmaj; - } else - err = e; + if (len) { + int abserr, clipdx, clipdy; + + /* unwind bresenham error term to first point */ + if (clip1) { + clipdx = abs(new_x1 - x1); + clipdy = abs(new_y1 - y1); + + if (octant & YMAJOR) + err = e + clipdy * dmin - clipdx * dmaj; + else + err = e + clipdx * dmin - clipdy * dmaj; + } + else + err = e; #define range infoRec->DashedBresenhamLineErrorTermBits - abserr = abs(err); - while((abserr & range) || - (dmaj & range) || - (dmin & range)) { - dmin >>= 1; - dmaj >>= 1; - abserr >>= 1; - err /= 2; - } - - if(octant & YMAJOR) - offset = abs(new_y1 - y1); - else - offset = abs(new_x1 - x1); - - offset += PatternOffset; - offset %= PatternLength; - - (*infoRec->SubsequentDashedBresenhamLine)( - infoRec->pScrn, new_x1, new_y1, - dmaj, dmin, err, len, octant, offset); - } - pbox++; - } - } /* while (nbox--) */ + abserr = abs(err); + while ((abserr & range) || (dmaj & range) || (dmin & range)) { + dmin >>= 1; + dmaj >>= 1; + abserr >>= 1; + err /= 2; + } + + if (octant & YMAJOR) + offset = abs(new_y1 - y1); + else + offset = abs(new_x1 - x1); + + offset += PatternOffset; + offset %= PatternLength; + + (*infoRec->SubsequentDashedBresenhamLine) (infoRec->pScrn, + new_x1, new_y1, + dmaj, dmin, err, + len, octant, + offset); + } + pbox++; + } + } /* while (nbox--) */ #ifndef POLYSEGMENT - len = abs(y2 - y1); - tmp = abs(x2 - x1); - PatternOffset += (len > tmp) ? len : tmp; - PatternOffset %= PatternLength; + len = abs(y2 - y1); + tmp = abs(x2 - x1); + PatternOffset += (len > tmp) ? len : tmp; + PatternOffset %= PatternLength; #endif - } /* while (nline--) */ + } /* while (nline--) */ #ifndef POLYSEGMENT /* paint the last point if the end style isn't CapNotLast. (Assume that a projecting, butt, or round cap that is one - pixel wide is the same as the single pixel of the endpoint.) - */ + pixel wide is the same as the single pixel of the endpoint.) + */ if ((pGC->capStyle != CapNotLast) && - ((ppt->x + xorg != pptInit->x + pDrawable->x) || - (ppt->y + yorg != pptInit->y + pDrawable->y) || - (ppt == pptInit + 1))) - { - nbox = nboxInit; - pbox = pboxInit; - while (nbox--) { - if ((x2 >= pbox->x1) && (y2 >= pbox->y1) && - (x2 < pbox->x2) && (y2 < pbox->y2)) - { - if(infoRec->SubsequentDashedTwoPointLine) { - (*infoRec->SubsequentDashedTwoPointLine)( - infoRec->pScrn, x2, y2, x2, y2, 0, - PatternOffset); - } else { - (*infoRec->SubsequentDashedBresenhamLine)( - infoRec->pScrn, x2, y2, 2, 0, -1, - 1, 0, PatternOffset); - } - break; - } else - pbox++; - } + ((ppt->x + xorg != pptInit->x + pDrawable->x) || + (ppt->y + yorg != pptInit->y + pDrawable->y) || + (ppt == pptInit + 1))) { + nbox = nboxInit; + pbox = pboxInit; + while (nbox--) { + if ((x2 >= pbox->x1) && (y2 >= pbox->y1) && + (x2 < pbox->x2) && (y2 < pbox->y2)) { + if (infoRec->SubsequentDashedTwoPointLine) { + (*infoRec->SubsequentDashedTwoPointLine) (infoRec->pScrn, + x2, y2, x2, y2, 0, + PatternOffset); + } + else { + (*infoRec->SubsequentDashedBresenhamLine) (infoRec->pScrn, + x2, y2, 2, 0, -1, + 1, 0, + PatternOffset); + } + break; + } + else + pbox++; + } } #endif SET_SYNC_FLAG(infoRec); } - |