⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fb_mfbs.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 5 页
字号:
		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 + -