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

📄 icblt.c

📁 按照官方的说法:Cairo is a vector graphics library with cross-device output support. 翻译过来
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -