📄 icblt.c
字号:
bits1 = 0; if (reverse) { if (srcX < dstX) bits1 = *--src; if (endmask) { bits = FbScrRight(bits1, rightShift); if (FbScrRight(endmask, leftShift)) { bits1 = *--src; bits |= FbScrLeft(bits1, leftShift); } --dst; *dst = FbDoMaskMergeRop (bits, *dst, mask & endmask); mask = FbPrev24Pix(mask); } while (n--) { bits = FbScrRight(bits1, rightShift); bits1 = *--src; bits |= FbScrLeft(bits1, leftShift); --dst; *dst = FbDoMaskMergeRop(bits, *dst, mask); mask = FbPrev24Pix(mask); } if (startmask) { bits = FbScrRight(bits1, rightShift); if (FbScrRight(startmask, leftShift)) { bits1 = *--src; bits |= FbScrLeft(bits1, leftShift); } --dst; *dst = FbDoMaskMergeRop (bits, *dst, mask & startmask); } } else { if (srcX > dstX) bits1 = *src++; if (startmask) { bits = FbScrLeft(bits1, leftShift); bits1 = *src++; bits |= FbScrRight(bits1, rightShift); *dst = FbDoMaskMergeRop (bits, *dst, mask & startmask); dst++; mask = FbNext24Pix(mask); } while (n--) { bits = FbScrLeft(bits1, leftShift); bits1 = *src++; bits |= FbScrRight(bits1, rightShift); *dst = FbDoMaskMergeRop(bits, *dst, mask); dst++; mask = FbNext24Pix(mask); } if (endmask) { bits = FbScrLeft(bits1, leftShift); if (FbScrLeft(endmask, rightShift)) { bits1 = *src; bits |= FbScrRight(bits1, rightShift); } *dst = FbDoMaskMergeRop (bits, *dst, mask & endmask); } } }#ifdef DEBUG_BLT24 { int firstx, lastx, x; firstx = origX; if (firstx) firstx--; lastx = origX + width/24 + 1; for (x = firstx; x <= lastx; x++) ErrorF ("%06x ", getPixel (origDst, x)); ErrorF ("\n"); while (origNlw--) ErrorF ("%08x ", *origLine++); ErrorF ("\n"); }#endif}voidfbBlt24 (FbBits *srcLine, FbStride srcStride, int srcX, FbBits *dstLine, FbStride dstStride, int dstX, int width, int height, int alu, FbBits pm, Bool reverse, Bool upsidedown){ if (upsidedown) { srcLine += (height-1) * srcStride; dstLine += (height-1) * dstStride; srcStride = -srcStride; dstStride = -dstStride; } while (height--) { fbBlt24Line (srcLine, srcX, dstLine, dstX, width, alu, pm, reverse); srcLine += srcStride; dstLine += dstStride; }#ifdef DEBUG_BLT24 ErrorF ("\n");#endif}#endif /* FB_24BIT */#if FB_SHIFT == FB_STIP_SHIFT + 1/* * Could be generalized to FB_SHIFT > FB_STIP_SHIFT + 1 by * creating an ring of values stepped through for each line */voidfbBltOdd (FbBits *srcLine, FbStride srcStrideEven, FbStride srcStrideOdd, int srcXEven, int srcXOdd, FbBits *dstLine, FbStride dstStrideEven, FbStride dstStrideOdd, int dstXEven, int dstXOdd, int width, int height, int alu, FbBits pm, int bpp){ FbBits *src; int leftShiftEven, rightShiftEven; FbBits startmaskEven, endmaskEven; int nmiddleEven; FbBits *dst; int leftShiftOdd, rightShiftOdd; FbBits startmaskOdd, endmaskOdd; int nmiddleOdd; int leftShift, rightShift; FbBits startmask, endmask; int nmiddle; int srcX, dstX; FbBits bits, bits1; int n; Bool destInvarient; Bool even; FbDeclareMergeRop (); FbInitializeMergeRop (alu, pm); destInvarient = FbDestInvarientMergeRop(); srcLine += srcXEven >> FB_SHIFT; dstLine += dstXEven >> FB_SHIFT; srcXEven &= FB_MASK; dstXEven &= FB_MASK; srcXOdd &= FB_MASK; dstXOdd &= FB_MASK; FbMaskBits(dstXEven, width, startmaskEven, nmiddleEven, endmaskEven); FbMaskBits(dstXOdd, width, startmaskOdd, nmiddleOdd, endmaskOdd); even = TRUE; InitializeShifts(srcXEven, dstXEven, leftShiftEven, rightShiftEven); InitializeShifts(srcXOdd, dstXOdd, leftShiftOdd, rightShiftOdd); while (height--) { src = srcLine; dst = dstLine; if (even) { srcX = srcXEven; dstX = dstXEven; startmask = startmaskEven; endmask = endmaskEven; nmiddle = nmiddleEven; leftShift = leftShiftEven; rightShift = rightShiftEven; srcLine += srcStrideEven; dstLine += dstStrideEven; even = FALSE; } else { srcX = srcXOdd; dstX = dstXOdd; startmask = startmaskOdd; endmask = endmaskOdd; nmiddle = nmiddleOdd; leftShift = leftShiftOdd; rightShift = rightShiftOdd; srcLine += srcStrideOdd; dstLine += dstStrideOdd; even = TRUE; } if (srcX == dstX) { if (startmask) { bits = *src++; *dst = FbDoMaskMergeRop (bits, *dst, startmask); dst++; } n = nmiddle; if (destInvarient) { while (n--) { bits = *src++; *dst = FbDoDestInvarientMergeRop(bits); dst++; } } else { while (n--) { bits = *src++; *dst = FbDoMergeRop (bits, *dst); dst++; } } if (endmask) { bits = *src; *dst = FbDoMaskMergeRop(bits, *dst, endmask); } } else { bits = 0; if (srcX > dstX) bits = *src++; if (startmask) { bits1 = FbScrLeft(bits, leftShift); bits = *src++; bits1 |= FbScrRight(bits, rightShift); *dst = FbDoMaskMergeRop (bits1, *dst, startmask); dst++; } n = nmiddle; if (destInvarient) { while (n--) { bits1 = FbScrLeft(bits, leftShift); bits = *src++; bits1 |= FbScrRight(bits, rightShift); *dst = FbDoDestInvarientMergeRop(bits1); dst++; } } else { while (n--) { bits1 = FbScrLeft(bits, leftShift); bits = *src++; bits1 |= FbScrRight(bits, rightShift); *dst = FbDoMergeRop(bits1, *dst); dst++; } } if (endmask) { bits1 = FbScrLeft(bits, leftShift); if (FbScrLeft(endmask, rightShift)) { bits = *src; bits1 |= FbScrRight(bits, rightShift); } *dst = FbDoMaskMergeRop (bits1, *dst, endmask); } } }}#ifdef FB_24BITvoidfbBltOdd24 (FbBits *srcLine, FbStride srcStrideEven, FbStride srcStrideOdd, int srcXEven, int srcXOdd, FbBits *dstLine, FbStride dstStrideEven, FbStride dstStrideOdd, int dstXEven, int dstXOdd, int width, int height, int alu, FbBits pm){ Bool even = TRUE; while (height--) { if (even) { fbBlt24Line (srcLine, srcXEven, dstLine, dstXEven, width, alu, pm, FALSE); srcLine += srcStrideEven; dstLine += dstStrideEven; even = FALSE; } else { fbBlt24Line (srcLine, srcXOdd, dstLine, dstXOdd, width, alu, pm, FALSE); srcLine += srcStrideOdd; dstLine += dstStrideOdd; even = TRUE; } }#if 0 fprintf (stderr, "\n");#endif}#endif#endif#if FB_STIP_SHIFT != FB_SHIFTvoidfbSetBltOdd (FbStip *stip, FbStride stipStride, int srcX, FbBits **bits, FbStride *strideEven, FbStride *strideOdd, int *srcXEven, int *srcXOdd){ int srcAdjust; int strideAdjust; /* * bytes needed to align source */ srcAdjust = (((int) stip) & (FB_MASK >> 3)); /* * FbStip units needed to align stride */ strideAdjust = stipStride & (FB_MASK >> FB_STIP_SHIFT); *bits = (FbBits *) ((char *) stip - srcAdjust); if (srcAdjust) { *strideEven = FbStipStrideToBitsStride (stipStride + 1); *strideOdd = FbStipStrideToBitsStride (stipStride); *srcXEven = srcX + (srcAdjust << 3); *srcXOdd = srcX + (srcAdjust << 3) - (strideAdjust << FB_STIP_SHIFT); } else { *strideEven = FbStipStrideToBitsStride (stipStride); *strideOdd = FbStipStrideToBitsStride (stipStride + 1); *srcXEven = srcX; *srcXOdd = srcX + (strideAdjust << FB_STIP_SHIFT); }}#endifvoidfbBltStip (FbStip *src, FbStride srcStride, /* in FbStip units, not FbBits units */ int srcX, FbStip *dst, FbStride dstStride, /* in FbStip units, not FbBits units */ int dstX, int width, int height, int alu, FbBits pm, int bpp){#if FB_STIP_SHIFT != FB_SHIFT if (FB_STIP_ODDSTRIDE(srcStride) || FB_STIP_ODDPTR(src) || FB_STIP_ODDSTRIDE(dstStride) || FB_STIP_ODDPTR(dst)) { FbStride srcStrideEven, srcStrideOdd; FbStride dstStrideEven, dstStrideOdd; int srcXEven, srcXOdd; int dstXEven, dstXOdd; FbBits *s, *d; int sx, dx; src += srcX >> FB_STIP_SHIFT; srcX &= FB_STIP_MASK; dst += dstX >> FB_STIP_SHIFT; dstX &= FB_STIP_MASK; fbSetBltOdd (src, srcStride, srcX, &s, &srcStrideEven, &srcStrideOdd, &srcXEven, &srcXOdd); fbSetBltOdd (dst, dstStride, dstX, &d, &dstStrideEven, &dstStrideOdd, &dstXEven, &dstXOdd);#ifdef FB_24BIT if (bpp == 24 && !FbCheck24Pix (pm)) { fbBltOdd24 (s, srcStrideEven, srcStrideOdd, srcXEven, srcXOdd, d, dstStrideEven, dstStrideOdd, dstXEven, dstXOdd, width, height, alu, pm); } else#endif { fbBltOdd (s, srcStrideEven, srcStrideOdd, srcXEven, srcXOdd, d, dstStrideEven, dstStrideOdd, dstXEven, dstXOdd, width, height, alu, pm, bpp); } } else#endif { fbBlt ((FbBits *) src, FbStipStrideToBitsStride (srcStride), srcX, (FbBits *) dst, FbStipStrideToBitsStride (dstStride), dstX, width, height, alu, pm, bpp, FALSE, FALSE); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -