📄 cfbsolid.c
字号:
while(h--){#if RROP == GXcopy *pdst++ = ((*pdst) & 0xFFFFFF) | (piQxelXor[0] & 0xFF000000); *pdst-- = ((*pdst) & 0xFFFF0000) | (piQxelXor[1] & 0xFFFF);#endif#if RROP == GXxor *pdst++ ^= (piQxelXor[0] & 0xFF000000); *pdst-- ^= (piQxelXor[1] & 0xFFFF);#endif#if RROP == GXand *pdst++ &= (piQxelAnd[0] | 0xFFFFFF); *pdst-- &= (piQxelAnd[1] | 0xFFFF0000);#endif#if RROP == GXor *pdst++ |= (piQxelOr[0] & 0xFF000000); *pdst-- |= (piQxelOr[1] & 0xFFFF);#endif#if RROP == GXset *pdst = DoMaskRRop((*pdst), piQxelAnd[0], piQxelXor[0], 0xFF000000); pdst++; *pdst = DoMaskRRop((*pdst), piQxelAnd[1], piQxelXor[1], 0xFFFF); pdst--;#endif pdst += widthDst; } break; case 0: /*case 2 leftIndex == 0 */ while(h--){#if RROP == GXcopy *pdst++ = piQxelXor[0]; *pdst-- = ((*pdst) & 0xFFFF0000) | (piQxelXor[1] & 0xFFFF);#endif#if RROP == GXxor *pdst++ ^= piQxelXor[0]; *pdst-- ^= (piQxelXor[1] & 0xFFFF);#endif#if RROP == GXand *pdst++ &= piQxelAnd[0]; *pdst-- &= (piQxelAnd[1] | 0xFFFF0000);#endif#if RROP == GXor *pdst++ |= piQxelOr[0]; *pdst-- |= (piQxelOr[1] & 0xFFFF);#endif#if RROP == GXset *pdst = DoRRop((*pdst), piQxelAnd[0], piQxelXor[0]); pdst++; *pdst = DoMaskRRop((*pdst), piQxelAnd[1], piQxelXor[1], 0xFFFF); pdst--;#endif pdst += widthDst; } break; } break; case 1: /*only if leftIndex = 0 and w = 1*/ while(h--){#if RROP == GXcopy *pdst = ((*pdst) & 0xFF000000) | (piQxelXor[0] & 0xFFFFFF);#endif#if RROP == GXxor *pdst ^= (piQxelXor[0] & 0xFFFFFF);#endif#if RROP == GXand *pdst &= (piQxelAnd[0] | 0xFF000000);#endif#if RROP == GXor *pdst |= (piQxelOr[0] & 0xFFFFFF);#endif#if RROP == GXset *pdst = DoMaskRRop((*pdst), piQxelAnd[0], piQxelXor[0], 0xFFFFFF);#endif pdst += widthDst; } break; case 0: /*never*/ break; default: { while(h--){ pdst = pdstRect; switch(leftIndex){ case 0: break; case 1:#if RROP == GXcopy *pdst++ = ((*pdst) & 0xFFFFFF) | (piQxelXor[0] & 0xFF000000); *pdst++ = piQxelXor[1]; *pdst++ = piQxelXor[2];#endif#if RROP == GXxor *pdst++ ^= (piQxelXor[0] & 0xFF000000); *pdst++ ^= piQxelXor[1]; *pdst++ ^= piQxelXor[2];#endif#if RROP == GXand *pdst++ &= (piQxelAnd[0] | 0xFFFFFF); *pdst++ &= piQxelAnd[1]; *pdst++ &= piQxelAnd[2];#endif#if RROP == GXor *pdst++ |= (piQxelOr[0] & 0xFF000000); *pdst++ |= piQxelOr[1]; *pdst++ |= piQxelOr[2];#endif#if RROP == GXset *pdst = DoMaskRRop((*pdst), piQxelAnd[0], piQxelXor[0], 0xFF000000); pdst++; *pdst = DoRRop((*pdst), piQxelAnd[1], piQxelXor[1]); pdst++; *pdst = DoRRop((*pdst), piQxelAnd[2], piQxelXor[2]); pdst++;#endif break; case 2:#if RROP == GXcopy *pdst++ = (((*pdst) & 0xFFFF) | (piQxelXor[1] & 0xFFFF0000)); *pdst++ = piQxelXor[2];#endif#if RROP == GXxor *pdst++ ^=(piQxelXor[1] & 0xFFFF0000); *pdst++ ^= piQxelXor[2];#endif#if RROP == GXand *pdst++ &= (piQxelAnd[1] | 0xFFFF); *pdst++ &= piQxelAnd[2];#endif#if RROP == GXor *pdst++ |= (piQxelOr[1] & 0xFFFF0000); *pdst++ |= piQxelOr[2];#endif#if RROP == GXset *pdst = DoMaskRRop((*pdst), piQxelAnd[1], piQxelXor[1], 0xFFFF0000); pdst++; *pdst = DoRRop((*pdst), piQxelAnd[2], piQxelXor[2]); pdst++;#endif break; case 3:#if RROP == GXcopy *pdst++ = ((*pdst) & 0xFF) | (piQxelXor[2] & 0xFFFFFF00);#endif#if RROP == GXxor *pdst++ ^= (piQxelXor[2] & 0xFFFFFF00);#endif#if RROP == GXand *pdst++ &= (piQxelAnd[2] | 0xFF);#endif#if RROP == GXor *pdst++ |= (piQxelOr[2] & 0xFFFFFF00);#endif#if RROP == GXset *pdst = DoMaskRRop((*pdst), piQxelAnd[2], piQxelXor[2], 0xFFFFFF00); pdst++;#endif break; } m = nmiddle; while(m--){#if RROP == GXcopy *pdst++ = piQxelXor[0]; *pdst++ = piQxelXor[1]; *pdst++ = piQxelXor[2];#endif#if RROP == GXxor *pdst++ ^= piQxelXor[0]; *pdst++ ^= piQxelXor[1]; *pdst++ ^= piQxelXor[2];#endif#if RROP == GXand *pdst++ &= piQxelAnd[0]; *pdst++ &= piQxelAnd[1]; *pdst++ &= piQxelAnd[2];#endif#if RROP == GXor *pdst++ |= piQxelOr[0]; *pdst++ |= piQxelOr[1]; *pdst++ |= piQxelOr[2];#endif#if RROP == GXset *pdst = DoRRop((*pdst), piQxelAnd[0], piQxelXor[0]); pdst++; *pdst = DoRRop((*pdst), piQxelAnd[1], piQxelXor[1]); pdst++; *pdst = DoRRop((*pdst), piQxelAnd[2], piQxelXor[2]); pdst++;#endif } switch(rightIndex){ case 0: break; case 1:#if RROP == GXcopy *pdst++ = ((*pdst) & 0xFF000000) | (piQxelXor[0] & 0xFFFFFF);#endif#if RROP == GXxor *pdst++ ^= (piQxelXor[0] & 0xFFFFFF);#endif#if RROP == GXand *pdst++ &= (piQxelAnd[0] | 0xFF);#endif#if RROP == GXor *pdst++ |= (piQxelOr[0] & 0xFFFFFF);#endif#if RROP == GXset *pdst++ = DoMaskRRop((*pdst), piQxelAnd[0], piQxelXor[0], 0xFFFFFF);#endif break; case 2:#if RROP == GXcopy *pdst++ = piQxelXor[0]; *pdst++ = ((*pdst) & 0xFFFF0000) | (piQxelXor[1] & 0xFFFF);#endif#if RROP == GXxor *pdst++ ^= piQxelXor[0]; *pdst++ ^= (piQxelXor[1] & 0xFFFF);#endif#if RROP == GXand *pdst++ &= piQxelAnd[0]; *pdst++ &= (piQxelAnd[1] | 0xFFFF0000);#endif#if RROP == GXor *pdst++ |= piQxelOr[0]; *pdst++ |= (piQxelOr[1] & 0xFFFF);#endif#if RROP == GXset *pdst = DoRRop((*pdst), piQxelAnd[0], piQxelXor[0]); *pdst++; *pdst = DoMaskRRop((*pdst), piQxelAnd[1], piQxelXor[1], 0xFFFF); *pdst++;#endif break; case 3:#if RROP == GXcopy *pdst++ = piQxelXor[0]; *pdst++ = piQxelXor[1]; *pdst++ = ((*pdst) & 0xFFFFFF00) | (piQxelXor[2] & 0xFF);#endif#if RROP == GXxor *pdst++ ^= piQxelXor[0]; *pdst++ ^= piQxelXor[1]; *pdst++ ^= (piQxelXor[2] & 0xFF);#endif#if RROP == GXand *pdst++ &= piQxelAnd[0]; *pdst++ &= piQxelAnd[1]; *pdst++ &= (piQxelAnd[2] | 0xFFFFFF00);#endif#if RROP == GXor *pdst++ |= piQxelOr[0]; *pdst++ |= piQxelOr[1]; *pdst++ |= (piQxelOr[2] & 0xFF);#endif#if RROP == GXset *pdst = DoRRop((*pdst), piQxelAnd[0], piQxelXor[0]); pdst++; *pdst = DoRRop((*pdst), piQxelAnd[1], piQxelXor[1]); pdst++; *pdst = DoMaskRRop((*pdst), piQxelAnd[2], piQxelXor[2], 0xFF); pdst++;#endif break; } pdstRect += widthDst; } } }#else /* PSZ != 24 */ pdstRect += (pBox->x1 >> PWSH); if ((pBox->x1 & PIM) + w <= PPW) { maskpartialbits(pBox->x1, w, leftMask); pdst = pdstRect; while (h--) { RROP_SOLID_MASK (pdst, leftMask); pdst += widthDst; } } else { maskbits (pBox->x1, w, leftMask, rightMask, nmiddle); if (leftMask) { if (rightMask) /* left mask and right mask */ { Expand(RROP_SOLID_MASK (pdst, leftMask); pdst++;, RROP_SOLID_MASK (pdst, rightMask);, 1) } else /* left mask and no right mask */ { Expand(RROP_SOLID_MASK (pdst, leftMask); pdst++;, ;, 1) } } else { if (rightMask) /* no left mask and right mask */ { Expand(;, RROP_SOLID_MASK (pdst, rightMask);, 0) } else /* no left mask and no right mask */ { Expand(;, ;, 0) } } }#endif#if PSZ == 8 }#endif }}voidRROP_NAME(cfbSolidSpans) (pDrawable, pGC, nInit, pptInit, pwidthInit, fSorted) DrawablePtr pDrawable; GCPtr pGC; int nInit; /* number of spans to fill */ DDXPointPtr pptInit; /* pointer to list of start points */ int *pwidthInit; /* pointer to list of n widths */ int fSorted;{ unsigned long *pdstBase; int widthDst; RROP_DECLARE register unsigned long *pdst; register int nlmiddle; register unsigned long startmask, endmask; register int w; int x; /* next three parameters are post-clip */ int n; /* number of spans to fill */ DDXPointPtr ppt; /* pointer to list of start points */ int *pwidthFree;/* copies of the pointers to free */ DDXPointPtr pptFree; int *pwidth; cfbPrivGCPtr devPriv;#if PSZ == 24 int leftIndex, rightIndex, xOffset;#endif devPriv = cfbGetGCPrivate(pGC); RROP_FETCH_GCPRIV(devPriv) n = nInit * miFindMaxBand(devPriv->pCompositeClip); pwidthFree = (int *)ALLOCATE_LOCAL(n * sizeof(int)); pptFree = (DDXPointRec *)ALLOCATE_LOCAL(n * sizeof(DDXPointRec)); if(!pptFree || !pwidthFree) { if (pptFree) DEALLOCATE_LOCAL(pptFree); if (pwidthFree) DEALLOCATE_LOCAL(pwidthFree); return; } pwidth = pwidthFree; ppt = pptFree; n = miClipSpans(devPriv->pCompositeClip, pptInit, pwidthInit, nInit, ppt, pwidth, fSorted); cfbGetLongWidthAndPointer (pDrawable, widthDst, pdstBase) while (n--) { x = ppt->x; pdst = pdstBase + (ppt->y * widthDst); ++ppt; w = *pwidth++; if (!w) continue;#if PSZ == 24 leftIndex = x &3;/* rightIndex = ((leftIndex+w)<5)?0:(x+w)&3;*/ rightIndex = (x+w)&3; nlmiddle = w - rightIndex; if(leftIndex){ nlmiddle -= (4 - leftIndex); }/* nlmiddle += 3;*/ nlmiddle >>= 2; if(nlmiddle < 0) nlmiddle = 0; pdst += (x >> 2)*3; pdst += leftIndex? (leftIndex -1):0; switch(leftIndex+w){ case 4: switch(leftIndex){ case 0:#if RROP == GXcopy *pdst++ = piQxelXor[0]; *pdst++ = piQxelXor[1]; *pdst-- = piQxelXor[2];#endif#if RROP == GXxor *pdst++ ^= piQxelXor[0]; *pdst++ ^= piQxelXor[1]; *pdst-- ^= piQxelXor[2];#endif#if RROP == GXand *pdst++ &= piQxelAnd[0]; *pdst++ &= piQxelAnd[1]; *pdst-- &= piQxelAnd[2];#endif#if RROP == GXor *pdst++ |= piQxelOr[0]; *pdst++ |= piQxelOr[1]; *pdst-- |= piQxelOr[2];#endif#if RROP == GXset *pdst = DoRRop((*pdst), piQxelAnd[0], piQxelXor[0]); pdst++; *pdst = DoRRop((*pdst), piQxelAnd[1], piQxelXor[1]); pdst++; *pdst = DoRRop((*pdst), piQxelAnd[2], piQxelXor[2]); pdst--;#endif pdst--; break; case 1:#if RROP == GXcopy *pdst++ = ((*pdst) & 0xFFFFFF) | (piQxelXor[0] & 0xFF000000); *pdst++ = piQxelXor[1]; *pdst-- = piQxelXor[2];#endif#if RROP == GXxor *pdst++ ^= (piQxelXor[0] & 0xFF000000); *pdst++ ^= piQxelXor[1]; *pdst-- ^= piQxelXor[2];#endif#if RROP == GXand *pdst++ &= (piQxelAnd[0] | 0x00FFFFFF); *pdst++ &= piQxelAnd[1]; *pdst-- &= piQxelAnd[2];#endif#if RROP == GXor *pdst++ |= (piQxelOr[0] & 0xFF000000); *pdst++ |= piQxelOr[1]; *pdst-- |= piQxelOr[2];#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -