📄 cfb8line.c
字号:
*addrp = ((*addrp)&0xFF)|(piQxelXor[2] & 0xFFFFFF00); break; case 1: *addrp = ((*addrp)&0xFFFFFF)|(piQxelXor[0] & 0xFF000000); *(addrp+1) = ((*(addrp+1))&0xFFFF0000)|(piQxelXor[1] & 0xFFFF); break; case 2: *addrp = ((*addrp)&0xFFFF)|(piQxelXor[1] & 0xFFFF0000); *(addrp+1) = ((*(addrp+1))&0xFFFFFF00)|(piQxelXor[2] & 0xFF); break; }#endif#if RROP == GXxor switch(xOffset & 3){ case 0: *addrp ^= (piQxelXor[0] & 0xFFFFFF); break; case 3: *addrp ^= (piQxelXor[2] & 0xFFFFFF00); break; case 1: *addrp ^= (piQxelXor[0] & 0xFF000000); *(addrp+1) ^= (piQxelXor[1] & 0xFFFF); break; case 2: *addrp ^= (piQxelXor[1] & 0xFFFF0000); *(addrp+1) ^= (piQxelXor[2] & 0xFF); break; }#endif#if RROP == GXand switch(xOffset & 3){ case 0: *addrp &= (piQxelAnd[0] | 0xFF000000); break; case 3: *addrp &= (piQxelAnd[2] | 0xFF); break; case 1: *addrp &= (0xFFFFFF|piQxelAnd[0]); *(addrp+1) &= (0xFFFF0000|piQxelAnd[1]); break; case 2: *addrp &= (0xFFFF|piQxelAnd[1]); *(addrp+1) &= (0xFFFFFF00|piQxelAnd[2]); break; }#endif#if RROP == GXor switch(xOffset & 3){ case 0: *addrp |= (piQxelOr[0] & 0xFFFFFF); break; case 3: *addrp |= (piQxelOr[2] & 0xFFFFFF00); break; case 1: *addrp |= (piQxelOr[0] & 0xFF000000); *(addrp+1) |= (piQxelOr[1] & 0xFFFF); break; case 2: *addrp |= (piQxelOr[1] & 0xFFFF0000); *(addrp+1) |= (piQxelOr[2] & 0xFF); break; }#endif#if RROP == GXset switch(xOffset & 3){ case 0: *addrp = (((*addrp)&(piQxelAnd[0] |0xFF000000))^(piQxelXor[0] & 0xFFFFFF)); break; case 3: *addrp = (((*addrp)&(piQxelAnd[2]|0xFF))^(piQxelXor[2] & 0xFFFFFF00)); break; case 1: *addrp = (((*addrp)&(piQxelAnd[0]|0xFFFFFF))^(piQxelXor[0] & 0xFF000000)); *(addrp+1) = (((*(addrp+1))&(piQxelAnd[1]|0xFFFF0000))^(piQxelXor[1] & 0xFFFF)); break; case 2: *addrp = (((*addrp)&(piQxelAnd[1]|0xFFFF))^(piQxelXor[1] & 0xFFFF0000)); *(addrp+1) = (((*(addrp+1))&(piQxelAnd[2]|0xFFFFFF00))^(piQxelXor[2] & 0xFF)); break; } #endif#else RROP_SOLID (addrp);# endif }#endif /* !POLYSEGMENT */ return -1;}#endif /* INCLUDE_DRAW */#ifdef INCLUDE_OTHERS#ifdef POLYSEGMENTvoidcfb8SegmentSS1Rect (pDrawable, pGC, nseg, pSegInit) DrawablePtr pDrawable; GCPtr pGC; int nseg; xSegment *pSegInit;{ int (*func)(); void (*clip)(); int drawn; cfbPrivGCPtr devPriv; devPriv = cfbGetGCPrivate(pGC);#ifdef NO_ONE_RECT if (REGION_NUM_RECTS(devPriv->pCompositeClip) != 1) { cfbSegmentSS(pDrawable, pGC, nseg, pSegInit); return; }#endif switch (devPriv->rop) { case GXcopy: func = cfb8SegmentSS1RectCopy; clip = cfb8ClippedLineCopy;#ifdef FAST_MUL if (cfbGetPixelWidth (pDrawable) == WIDTH_FAST) func = cfb8SegmentSS1RectShiftCopy;#endif break; case GXxor: func = cfb8SegmentSS1RectXor; clip = cfb8ClippedLineXor; break; default: func = cfb8SegmentSS1RectGeneral; clip = cfb8ClippedLineGeneral; break; } while (nseg) { drawn = (*func) (pDrawable, pGC, nseg, pSegInit); if (drawn == -1) break; (*clip) (pDrawable, pGC, pSegInit[drawn-1].x1, pSegInit[drawn-1].y1, pSegInit[drawn-1].x2, pSegInit[drawn-1].y2, &devPriv->pCompositeClip->extents, pGC->capStyle == CapNotLast); pSegInit += drawn; nseg -= drawn; }}#else /* POLYSEGMENT */voidcfb8LineSS1Rect (pDrawable, pGC, mode, npt, pptInit) DrawablePtr pDrawable; GCPtr pGC; int mode; int npt; DDXPointPtr pptInit;{ int (*func)(); void (*clip)(); int drawn; cfbPrivGCPtr devPriv; int x1, y1, x2, y2; DDXPointPtr pptInitOrig = pptInit; devPriv = cfbGetGCPrivate(pGC);#ifdef NO_ONE_RECT if (REGION_NUM_RECTS(devPriv->pCompositeClip) != 1) { cfbLineSS(pDrawable, pGC, mode, npt, pptInit); return; }#endif switch (devPriv->rop) { case GXcopy: func = cfb8LineSS1RectCopy; clip = cfb8ClippedLineCopy; if (mode == CoordModePrevious) func = cfb8LineSS1RectPreviousCopy; break; case GXxor: func = cfb8LineSS1RectXor; clip = cfb8ClippedLineXor; break; default: func = cfb8LineSS1RectGeneral; clip = cfb8ClippedLineGeneral; break; } if (mode == CoordModePrevious) { x1 = pptInit->x; y1 = pptInit->y; while (npt > 1) { drawn = (*func) (pDrawable, pGC, mode, npt, pptInit, pptInitOrig, &x1, &y1, &x2, &y2); if (drawn == -1) break; (*clip) (pDrawable, pGC, x1, y1, x2, y2, &devPriv->pCompositeClip->extents, drawn != npt - 1 || pGC->capStyle == CapNotLast); pptInit += drawn; npt -= drawn; x1 = x2; y1 = y2; } } else { while (npt > 1) { drawn = (*func) (pDrawable, pGC, mode, npt, pptInit, pptInitOrig, &x1, &y1, &x2, &y2); if (drawn == -1) break; (*clip) (pDrawable, pGC, pptInit[drawn-1].x, pptInit[drawn-1].y, pptInit[drawn].x, pptInit[drawn].y, &devPriv->pCompositeClip->extents, drawn != npt - 1 || pGC->capStyle == CapNotLast); pptInit += drawn; npt -= drawn; } }}#endif /* else POLYSEGMENT */#endif /* INCLUDE_OTHERS */#if !defined(POLYSEGMENT) && !defined (PREVIOUS)voidRROP_NAME (cfb8ClippedLine) (pDrawable, pGC, x1, y1, x2, y2, boxp, shorten) DrawablePtr pDrawable; GCPtr pGC; int x1, y1, x2, y2; BoxPtr boxp; Bool shorten;{ int oc1, oc2; int e, e1, e3, len; int adx, ady; PixelType *addr; int nwidth; int stepx, stepy; int xorg, yorg; int new_x1, new_y1, new_x2, new_y2; Bool pt1_clipped, pt2_clipped; int changex, changey, result;#if PSZ == 24 int xOffset; PixelType *addrLineEnd; char *addrb; int stepx3, stepy3;#endif int octant; unsigned int bias = miGetZeroLineBias(pDrawable->pScreen); cfbGetPixelWidthAndPointer(pDrawable, nwidth, addr); xorg = pDrawable->x; yorg = pDrawable->y; x1 += xorg; y1 += yorg; x2 += xorg; y2 += yorg; oc1 = 0; oc2 = 0; OUTCODES (oc1, x1, y1, boxp); OUTCODES (oc2, x2, y2, boxp); if (oc1 & oc2) return; CalcLineDeltas(x1, y1, x2, y2, adx, ady, stepx, stepy, 1, nwidth, octant); if (adx <= ady) { int t; t = adx; adx = ady; ady = t; t = stepx; stepx = stepy; stepy = t; SetYMajorOctant(octant); } e = - adx; e1 = ady << 1; e3 = - (adx << 1); FIXUP_ERROR(e, octant, bias); new_x1 = x1; new_y1 = y1; new_x2 = x2; new_y2 = y2; pt1_clipped = 0; pt2_clipped = 0; if (IsXMajorOctant(octant)) { result = miZeroClipLine(boxp->x1, boxp->y1, boxp->x2 - 1, boxp->y2 - 1, &new_x1, &new_y1, &new_x2, &new_y2, adx, ady, &pt1_clipped, &pt2_clipped, octant, bias, oc1, oc2); if (result == -1) return; len = abs(new_x2 - new_x1) - 1; /* this routine needs the "-1" */ /* if we've clipped the endpoint, always draw the full length * of the segment, because then the capstyle doesn't matter * if x2,y2 isn't clipped, use the capstyle * (shorten == TRUE <--> CapNotLast) */ if (pt2_clipped || !shorten) len++; if (pt1_clipped) { /* must calculate new error terms */ changex = abs(new_x1 - x1); changey = abs(new_y1 - y1); e = e + changey * e3 + changex * e1; } } else /* Y_AXIS */ { result = miZeroClipLine(boxp->x1, boxp->y1, boxp->x2 - 1, boxp->y2 - 1, &new_x1, &new_y1, &new_x2, &new_y2, ady, adx, &pt1_clipped, &pt2_clipped, octant, bias, oc1, oc2); if (result == -1) return; len = abs(new_y2 - new_y1) - 1; /* this routine needs the "-1" */ /* if we've clipped the endpoint, always draw the full length * of the segment, because then the capstyle doesn't matter * if x2,y2 isn't clipped, use the capstyle * (shorten == TRUE <--> CapNotLast) */ if (pt2_clipped || !shorten) len++; if (pt1_clipped) { /* must calculate new error terms */ changex = abs(new_x1 - x1); changey = abs(new_y1 - y1); e = e + changex * e3 + changey * e1; } } x1 = new_x1; y1 = new_y1; { register PixelType *addrp; RROP_DECLARE RROP_FETCH_GC(pGC);#if PSZ == 24 xOffset = x1; addrLineEnd = addr + (y1 * nwidth); addrb = (char *)addrLineEnd + x1 * 3; if (stepx == 1 || stepx == -1){ stepx3 = stepx * 3; stepy3 = stepy * sizeof (long); } else { stepx3 = stepx * sizeof (long); stepy3 = stepy * 3; }#else addrp = addr + (y1 * nwidth) + x1;#endif#ifndef REARRANGE if (!ady) {#if PSZ == 24#define body {\ body_rop \ addrb += stepx3; \ }#else#define body { RROP_SOLID(addrp); addrp += stepx; }#endif while (len >= PGSZB) { body body body body#if PGSZ == 64 body body body body#endif len -= PGSZB; } switch (len) {#if PGSZ == 64 case 7: body case 6: body case 5: body case 4: body#endif case 3: body case 2: body case 1: body }#undef body } else#endif /* !REARRANGE */ {#if PSZ == 24#define body {\ body_rop \ addrb += stepx3; \ e += e1; \ if (e >= 0) \ { \ addrb += stepy3; \ e += e3; \ } \ }#else#define body {\ RROP_SOLID(addrp); \ addrp += stepx; \ e += e1; \ if (e >= 0) \ { \ addrp += stepy; \ e += e3; \ } \ }#endif#ifdef LARGE_INSTRUCTION_CACHE while ((len -= PGSZB) >= 0) { body body body body#if PGSZ == 64 body body body body#endif } switch (len) { case -1: body case -2: body case -3: body#if PGSZ == 64 case -4: body case -5: body case -6: body case -7: body#endif }#else /* !LARGE_INSTRUCTION_CACHE */ IMPORTANT_START; while ((len -= 2) >= 0) { body body; } if (len & 1) body; IMPORTANT_END;#endif /* LARGE_INSTRUCTION_CACHE */ }#if PSZ == 24 body_rop#else RROP_SOLID(addrp);#endif#undef body }}#endif /* !POLYSEGMENT && !PREVIOUS */#endif /* PIXEL_ADDR */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -