📄 fb_mfbs.c
字号:
startmask = mfbpartmasks32[dp->x & 0x1f][w & 0x1f]; endmask = 0; nlMiddle = 0; } else { startmask = mfbstarttab32[dp->x & 0x1f]; endmask = mfbendtab32[(dp->x + w) & 0x1f]; if (startmask) { nlMiddle = (w - (32 - (dp->x & 0x1f))) >> 5; } else { nlMiddle = w >> 5; } } if (xdir == 1) { xoffSrc = sr->origin.x & 0x1f; xoffDst = dp->x & 0x1f; pdstLine += (dp->x >> 5); psrcLine += (sr->origin.x >> 5); if (xoffSrc == xoffDst) { while (h--) { psrc = psrcLine; pdst = pdstLine; pdstLine += widthDst; psrcLine += widthSrc; if (startmask) { *pdst = DoMergeRopMask(*psrc, *pdst, startmask); psrc++; pdst++; } nl = nlMiddle;#ifdef mc68020 Duff(nl, *pdst = DoMergeRop(*psrc, *pdst); psrc++; pdst++);#else /* mc68020 */ psrc += nl & 7; pdst += nl & 7; switch (nl & 7) { case 7: pdst[-7] = DoMergeRop(psrc[-7], pdst[-7]); case 6: pdst[-6] = DoMergeRop(psrc[-6], pdst[-6]); case 5: pdst[-5] = DoMergeRop(psrc[-5], pdst[-5]); case 4: pdst[-4] = DoMergeRop(psrc[-4], pdst[-4]); case 3: pdst[-3] = DoMergeRop(psrc[-3], pdst[-3]); case 2: pdst[-2] = DoMergeRop(psrc[-2], pdst[-2]); case 1: pdst[-1] = DoMergeRop(psrc[-1], pdst[-1]); } while ((nl -= 8) >= 0) { pdst += 8; psrc += 8; pdst[-8] = DoMergeRop(psrc[-8], pdst[-8]); pdst[-7] = DoMergeRop(psrc[-7], pdst[-7]); pdst[-6] = DoMergeRop(psrc[-6], pdst[-6]); pdst[-5] = DoMergeRop(psrc[-5], pdst[-5]); pdst[-4] = DoMergeRop(psrc[-4], pdst[-4]); pdst[-3] = DoMergeRop(psrc[-3], pdst[-3]); pdst[-2] = DoMergeRop(psrc[-2], pdst[-2]); pdst[-1] = DoMergeRop(psrc[-1], pdst[-1]); }#endif /* mc68020 */ if (endmask) { *pdst = DoMergeRopMask(*psrc, *pdst, endmask); } } } else { if (xoffSrc > xoffDst) { leftShift = xoffSrc - xoffDst; rightShift = 32 - leftShift; } else { rightShift = xoffDst - xoffSrc; leftShift = 32 - rightShift; } while (h--) { psrc = psrcLine; pdst = pdstLine; pdstLine += widthDst; psrcLine += widthSrc; bits = 0; if (xoffSrc > xoffDst) bits = *psrc++; if (startmask) { bits1 = bits << leftShift; bits = *psrc++; bits1 |= bits >> rightShift; *pdst = DoMergeRopMask(bits1, *pdst, startmask); pdst++; } nl = nlMiddle; bits1 = bits; psrc += nl & 7; pdst += nl & 7; switch (nl & 7) { case 7: bits = psrc[-7]; pdst[-7] = DoMergeRop(((bits1 << leftShift) | (bits >> rightShift)), pdst[-7]); case 6: bits1 = psrc[-6]; pdst[-6] = DoMergeRop(((bits << leftShift) | (bits1 >> rightShift)), pdst[-6]); case 5: bits = psrc[-5]; pdst[-5] = DoMergeRop(((bits1 << leftShift) | (bits >> rightShift)), pdst[-5]); case 4: bits1 = psrc[-4]; pdst[-4] = DoMergeRop(((bits << leftShift) | (bits1 >> rightShift)), pdst[-4]); case 3: bits = psrc[-3]; pdst[-3] = DoMergeRop(((bits1 << leftShift) | (bits >> rightShift)), pdst[-3]); case 2: bits1 = psrc[-2]; pdst[-2] = DoMergeRop(((bits << leftShift) | (bits1 >> rightShift)), pdst[-2]); case 1: bits = psrc[-1]; pdst[-1] = DoMergeRop(((bits1 << leftShift) | (bits >> rightShift)), pdst[-1]); } while ((nl -= 8) >= 0) { pdst += 8; psrc += 8; bits1 = psrc[-8]; pdst[-8] = DoMergeRop(((bits << leftShift) | (bits1 >> rightShift)), pdst[-8]); bits = psrc[-7]; pdst[-7] = DoMergeRop(((bits1 << leftShift) | (bits >> rightShift)), pdst[-7]); bits1 = psrc[-6]; pdst[-6] = DoMergeRop(((bits << leftShift) | (bits1 >> rightShift)), pdst[-6]); bits = psrc[-5]; pdst[-5] = DoMergeRop(((bits1 << leftShift) | (bits >> rightShift)), pdst[-5]); bits1 = psrc[-4]; pdst[-4] = DoMergeRop(((bits << leftShift) | (bits1 >> rightShift)), pdst[-4]); bits = psrc[-3]; pdst[-3] = DoMergeRop(((bits1 << leftShift) | (bits >> rightShift)), pdst[-3]); bits1 = psrc[-2]; pdst[-2] = DoMergeRop(((bits << leftShift) | (bits1 >> rightShift)), pdst[-2]); bits = psrc[-1]; pdst[-1] = DoMergeRop(((bits1 << leftShift) | (bits >> rightShift)), pdst[-1]); } if (endmask) { bits1 = bits << leftShift; if (endmask << rightShift) { bits = *psrc; bits1 |= (bits >> rightShift); } *pdst = DoMergeRopMask(bits1, *pdst, endmask); } } } } else { xoffSrc = (sr->origin.x + w - 1) & 0x1f; xoffDst = (dp->x + w - 1) & 0x1f; pdstLine += ((dp->x + w - 1) >> 5) + 1; psrcLine += ((sr->origin.x + w - 1) >> 5) + 1; if (xoffSrc == xoffDst) { while (h--) { psrc = psrcLine; pdst = pdstLine; pdstLine += widthDst; psrcLine += widthSrc; if (endmask) { pdst--; psrc--; *pdst = DoMergeRopMask(*psrc, *pdst, endmask); } nl = nlMiddle;#ifdef mc68020 Duff(nl, pdst--; psrc--; *pdst = DoMergeRop(*psrc, *pdst));#else /* mc68020 */ psrc -= nl & 7; pdst -= nl & 7; switch (nl & 7) { case 7: pdst[7-1] = DoMergeRop(psrc[7-1], pdst[7-1]); case 6: pdst[6-1] = DoMergeRop(psrc[6-1], pdst[6-1]); case 5: pdst[5-1] = DoMergeRop(psrc[5-1], pdst[5-1]); case 4: pdst[4-1] = DoMergeRop(psrc[4-1], pdst[4-1]); case 3: pdst[3-1] = DoMergeRop(psrc[3-1], pdst[3-1]); case 2: pdst[2-1] = DoMergeRop(psrc[2-1], pdst[2-1]); case 1: pdst[1-1] = DoMergeRop(psrc[1-1], pdst[1-1]); } while ((nl -= 8) >= 0) { pdst -= 8; psrc -= 8; pdst[8-1] = DoMergeRop(psrc[8-1], pdst[8-1]); pdst[7-1] = DoMergeRop(psrc[7-1], pdst[7-1]); pdst[6-1] = DoMergeRop(psrc[6-1], pdst[6-1]); pdst[5-1] = DoMergeRop(psrc[5-1], pdst[5-1]); pdst[4-1] = DoMergeRop(psrc[4-1], pdst[4-1]); pdst[3-1] = DoMergeRop(psrc[3-1], pdst[3-1]); pdst[2-1] = DoMergeRop(psrc[2-1], pdst[2-1]); pdst[1-1] = DoMergeRop(psrc[1-1], pdst[1-1]); }#endif /* mc68020 */ if (startmask) { --pdst; --psrc; *pdst = DoMergeRopMask(*psrc, *pdst, startmask); } } } else { if (xoffDst > xoffSrc) { rightShift = xoffDst - xoffSrc; leftShift = 32 - rightShift; } else { leftShift = xoffSrc - xoffDst; rightShift = 32 - leftShift; } while (h--) { psrc = psrcLine; pdst = pdstLine; pdstLine += widthDst; psrcLine += widthSrc; bits = 0; if (xoffDst > xoffSrc) bits = *--psrc; if (endmask) { bits1 = bits >> rightShift; bits = *--psrc; bits1 |= (bits << leftShift); pdst--; *pdst = DoMergeRopMask(bits1, *pdst, endmask); } nl = nlMiddle; bits1 = bits; psrc -= nl & 7; pdst -= nl & 7; switch (nl & 7) { case 7: bits = psrc[7-1]; pdst[7-1] = DoMergeRop(((bits1 >> rightShift) | (bits << leftShift)), pdst[7-1]); case 6: bits1 = psrc[6-1]; pdst[6-1] = DoMergeRop(((bits >> rightShift) | (bits1 << leftShift)), pdst[6-1]); case 5: bits = psrc[5-1]; pdst[5-1] = DoMergeRop(((bits1 >> rightShift) | (bits << leftShift)), pdst[5-1]); case 4: bits1 = psrc[4-1]; pdst[4-1] = DoMergeRop(((bits >> rightShift) | (bits1 << leftShift)), pdst[4-1]); case 3: bits = psrc[3-1]; pdst[3-1] = DoMergeRop(((bits1 >> rightShift) | (bits << leftShift)), pdst[3-1]); case 2: bits1 = psrc[2-1]; pdst[2-1] = DoMergeRop(((bits >> rightShift) | (bits1 << leftShift)), pdst[2-1]); case 1: bits = psrc[1-1]; pdst[1-1] = DoMergeRop(((bits1 >> rightShift) | (bits << leftShift)), pdst[1-1]); } while ((nl -= 8) >= 0) { pdst -= 8; psrc -= 8; bits1 = psrc[8-1]; pdst[8-1] = DoMergeRop(((bits >> rightShift) | (bits1 << leftShift)), pdst[8-1]); bits = psrc[7-1]; pdst[7-1] = DoMergeRop(((bits1 >> rightShift) | (bits << leftShift)), pdst[7-1]); bits1 = psrc[6-1]; pdst[6-1] = DoMergeRop(((bits >> rightShift) | (bits1 << leftShift)), pdst[6-1]); bits = psrc[5-1]; pdst[5-1] = DoMergeRop(((bits1 >> rightShift) | (bits << leftShift)), pdst[5-1]); bits1 = psrc[4-1]; pdst[4-1] = DoMergeRop(((bits >> rightShift) | (bits1 << leftShift)), pdst[4-1]); bits = psrc[3-1]; pdst[3-1] = DoMergeRop(((bits1 >> rightShift) | (bits << leftShift)), pdst[3-1]); bits1 = psrc[2-1]; pdst[2-1] = DoMergeRop(((bits >> rightShift) | (bits1 << leftShift)), pdst[2-1]); bits = psrc[1-1]; pdst[1-1] = DoMergeRop(((bits1 >> rightShift) | (bits << leftShift)), pdst[1-1]); } if (startmask) { bits1 = (bits >> rightShift); if (startmask >> leftShift) { bits = *--psrc; bits1 |= (bits << leftShift); } --pdst; *pdst = DoMergeRopMask(bits1, *pdst, startmask); } } } }}voidmfb_clr_area32(x, y, w, h, addr, nlwidth)int x;int y;int w;register int h;register u_int *addr;int nlwidth;{ register u_int startmask; u_int endmask; register int nlw, nlwExtra; int nlwMiddle; int startoff, endoff; addr += (y * nlwidth + (x >> 5)); startoff = x & 0x1f; if (((startoff) + w) < 32) { startmask = ~mfbpartmasks32[startoff][w & 0x1f]; nlwExtra = nlwidth;#ifdef mc68020 asm(" lsl.l #2,d4"); Duff(h, asm(" and.l d6,(a5)"); asm(" adda.l d4,a5"))#else /* mc68020 */ Duff(h, *addr &= startmask; addr += nlwExtra)#endif /* mc68020 */ return; } endoff = (x + w) & 0x1f; if (startoff) { startmask = ~mfbstarttab32[startoff]; nlwMiddle = (w - (32 - (startoff))) >> 5; nlwExtra = nlwidth - nlwMiddle - 1; if (endoff) { endmask = ~mfbendtab32[endoff]; while (h--) { nlw = nlwMiddle; *addr++ &= startmask; Duff_single(nlw, addr, = 0); *addr &= endmask; addr += nlwExtra; } } else { while (h--) { nlw = nlwMiddle; *addr++ &= startmask; Duff_single(nlw, addr, = 0); addr += nlwExtra; } } } else { nlwMiddle = w >> 5; nlwExtra = nlwidth - nlwMiddle; if (endoff) { endmask = ~mfbendtab32[endoff]; while (h--) { nlw = nlwMiddle; Duff_single(nlw, addr, = 0); *addr &= endmask; addr += nlwExtra; } } else { while (h--) { nlw = nlwMiddle; Duff_single(nlw, addr, = 0); addr += nlwExtra; } } }}voidmfb_inv_area32(x, y, w, h, addr, nlwidth)int x;int y;int w;register int h;register u_int *addr;int nlwidth;{ register u_int startmask; u_int endmask; register int nlw, nlwExtra; int nlwMiddle; int startoff, endoff; addr += (y * nlwidth + (x >> 5)); startoff = x & 0x1f; if (((startoff) + w) < 32) { startmask = mfbpartmasks32[startoff][w & 0x1f]; nlwExtra = nlwidth;#ifdef mc68020 asm(" lsl.l #2,d4"); Duff(h, asm(" eor.l d6,(a5)"); asm(" adda.l d4,a5"))#else /* mc68020 */ Duff(h
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -