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

📄 fbpict.c

📁 按照官方的说法:Cairo is a vector graphics library with cross-device output support. 翻译过来
💻 C
📖 第 1 页 / 共 3 页
字号:
	    s = *src++;	    a = s >> 24;	    if (a)	    {		if (a == 0xff)		    d = s;		else		    d = fbOver24 (s, Fetch24(dst));		Store24(dst,d);	    }	    dst += 3;	}    }}static voidfbCompositeSrc_8888x0565 (pixman_operator_t  op,			 PicturePtr pSrc,			 PicturePtr pMask,			 PicturePtr pDst,			 INT16      xSrc,			 INT16      ySrc,			 INT16      xMask,			 INT16      yMask,			 INT16      xDst,			 INT16      yDst,			 CARD16     width,			 CARD16     height){    CARD16	*dstLine, *dst;    CARD32	d;    CARD32	*srcLine, *src, s;    CARD8	a;    FbStride	dstStride, srcStride;    CARD16	w;    fbComposeGetStart (pSrc, xSrc, ySrc, CARD32, srcStride, srcLine, 1);    fbComposeGetStart (pDst, xDst, yDst, CARD16, dstStride, dstLine, 1);    while (height--)    {	dst = dstLine;	dstLine += dstStride;	src = srcLine;	srcLine += srcStride;	w = width;	while (w--)	{	    s = *src++;	    a = s >> 24;	    if (a)	    {		if (a == 0xff)		    d = s;		else		{		    d = *dst;		    d = fbOver24 (s, cvt0565to0888(d));		}		*dst = cvt8888to0565(d);	    }	    dst++;	}    }}static voidfbCompositeSrcAdd_8000x8000 (pixman_operator_t	  op,			     PicturePtr pSrc,			     PicturePtr pMask,			     PicturePtr pDst,			     INT16      xSrc,			     INT16      ySrc,			     INT16      xMask,			     INT16      yMask,			     INT16      xDst,			     INT16      yDst,			     CARD16     width,			     CARD16     height){    CARD8	*dstLine, *dst;    CARD8	*srcLine, *src;    FbStride	dstStride, srcStride;    CARD16	w;    CARD8	s, d;    CARD16	t;    fbComposeGetStart (pSrc, xSrc, ySrc, CARD8, srcStride, srcLine, 1);    fbComposeGetStart (pDst, xDst, yDst, CARD8, dstStride, dstLine, 1);    while (height--)    {	dst = dstLine;	dstLine += dstStride;	src = srcLine;	srcLine += srcStride;	w = width;	while (w--)	{	    s = *src++;	    if (s)	    {		if (s != 0xff)		{		    d = *dst;		    t = d + s;		    s = t | (0 - (t >> 8));		}		*dst = s;	    }	    dst++;	}    }}static voidfbCompositeSrcAdd_8888x8888 (pixman_operator_t   op,			     PicturePtr pSrc,			     PicturePtr pMask,			     PicturePtr pDst,			     INT16      xSrc,			     INT16      ySrc,			     INT16      xMask,			     INT16      yMask,			     INT16      xDst,			     INT16      yDst,			     CARD16     width,			     CARD16     height){    CARD32	*dstLine, *dst;    CARD32	*srcLine, *src;    FbStride	dstStride, srcStride;    CARD16	w;    CARD32	s, d;    CARD16	t;    CARD32	m,n,o,p;    fbComposeGetStart (pSrc, xSrc, ySrc, CARD32, srcStride, srcLine, 1);    fbComposeGetStart (pDst, xDst, yDst, CARD32, dstStride, dstLine, 1);    while (height--)    {	dst = dstLine;	dstLine += dstStride;	src = srcLine;	srcLine += srcStride;	w = width;	while (w--)	{	    s = *src++;	    if (s)	    {		if (s != 0xffffffff)		{		    d = *dst;		    if (d)		    {			m = FbAdd(s,d,0,t);			n = FbAdd(s,d,8,t);			o = FbAdd(s,d,16,t);			p = FbAdd(s,d,24,t);			s = m|n|o|p;		    }		}		*dst = s;	    }	    dst++;	}    }}static voidfbCompositeSrcAdd_1000x1000 (pixman_operator_t   op,			     PicturePtr pSrc,			     PicturePtr pMask,			     PicturePtr pDst,			     INT16      xSrc,			     INT16      ySrc,			     INT16      xMask,			     INT16      yMask,			     INT16      xDst,			     INT16      yDst,			     CARD16     width,			     CARD16     height){    FbBits	*dstBits, *srcBits;    FbStride	dstStride, srcStride;    int		dstBpp, srcBpp;    int		dstXoff, dstYoff;    int		srcXoff, srcYoff;    fbGetDrawable(pSrc->pDrawable, srcBits, srcStride, srcBpp, srcXoff, srcYoff);    fbGetDrawable(pDst->pDrawable, dstBits, dstStride, dstBpp, dstXoff, dstYoff);    fbBlt (srcBits + srcStride * (ySrc + srcYoff),	   srcStride,	   xSrc + srcXoff,	   dstBits + dstStride * (yDst + dstYoff),	   dstStride,	   xDst + dstXoff,	   width,	   height,	   GXor,	   FB_ALLONES,	   srcBpp,	   FALSE,	   FALSE);}static voidfbCompositeSolidMask_nx1xn (pixman_operator_t   op,			    PicturePtr pSrc,			    PicturePtr pMask,			    PicturePtr pDst,			    INT16      xSrc,			    INT16      ySrc,			    INT16      xMask,			    INT16      yMask,			    INT16      xDst,			    INT16      yDst,			    CARD16     width,			    CARD16     height){    FbBits	*dstBits;    FbStip	*maskBits;    FbStride	dstStride, maskStride;    int		dstBpp, maskBpp;    int		dstXoff, dstYoff;    int		maskXoff, maskYoff;    FbBits	src;    fbComposeGetSolid(pSrc, pDst, src);    if ((src & 0xff000000) != 0xff000000)    {	pixman_compositeGeneral  (op, pSrc, pMask, pDst,			     xSrc, ySrc, xMask, yMask, xDst, yDst,			     width, height);	return;    }    FbGetStipPixels (pMask->pixels, maskBits, maskStride, maskBpp, maskXoff, maskYoff);    fbGetDrawable (pDst->pDrawable, dstBits, dstStride, dstBpp, dstXoff, dstYoff);    switch (dstBpp) {    case 32:	break;    case 24:	break;    case 16:	src = cvt8888to0565(src);	break;    }    src = fbReplicatePixel (src, dstBpp);    fbBltOne (maskBits + maskStride * (yMask + maskYoff),	      maskStride,	      xMask + maskXoff,	      dstBits + dstStride * (yDst + dstYoff),	      dstStride,	      (xDst + dstXoff) * dstBpp,	      dstBpp,	      width * dstBpp,	      height,	      0x0,	      src,	      FB_ALLONES,	      0x0);}/* prototype to help with merging */static voidfbCompositeSrcSrc_nxn  (pixman_operator_t	op,			PicturePtr pSrc,			PicturePtr pMask,			PicturePtr pDst,			INT16      xSrc,			INT16      ySrc,			INT16      xMask,			INT16      yMask,			INT16      xDst,			INT16      yDst,			CARD16     width,			CARD16     height);/* * Apply a constant alpha value in an over computation */static voidfbCompositeTrans_0565xnx0565(pixman_operator_t      op,			     PicturePtr pSrc,			     PicturePtr pMask,			     PicturePtr pDst,			     INT16      xSrc,			     INT16      ySrc,			     INT16      xMask,			     INT16      yMask,			     INT16      xDst,			     INT16      yDst,			     CARD16     width,			     CARD16     height){    CARD16	*dstLine, *dst;    CARD16	*srcLine, *src;    FbStride	dstStride, srcStride;    CARD16	w;    FbBits	mask;    CARD8	maskAlpha;    CARD16	s_16, d_16;    CARD32	s_32, d_32;    fbComposeGetSolid (pMask, pDst, mask);    maskAlpha = mask >> 27;    if (!maskAlpha)	return;    if (maskAlpha == 0xff)    {	fbCompositeSrcSrc_nxn (PIXMAN_OPERATOR_SRC, pSrc, pMask, pDst,			       xSrc, ySrc, xMask, yMask, xDst, yDst,			       width, height);	return;    }    fbComposeGetStart (pSrc, xSrc, ySrc, CARD16, srcStride, srcLine, 1);    fbComposeGetStart (pDst, xDst, yDst, CARD16, dstStride, dstLine, 1);    while (height--)	{		CARD32 *isrc, *idst;		dst = dstLine;		dstLine += dstStride;		src = srcLine;		srcLine += srcStride;		w = width;		if(((long)src&1)==1)		{			s_16 = *src++;			d_16 = *dst;			inOver0565(maskAlpha, s_16, d_16, *dst++);			w--;		}		isrc=(CARD32 *)src;		if(((long)dst&1)==0)		{			idst=(CARD32 *)dst;			while (w>1)			{				s_32 = *isrc++;				d_32 = *idst;				inOver2x0565(maskAlpha,s_32,d_32,*idst++);				w-=2;			}			dst=(CARD16 *)idst;		}		else		{		    while (w > 1)		    {			s_32 = *isrc++;#if IMAGE_BYTE_ORDER == LSBFirst				s_16=s_32&0xffff;#else				s_16=s_32>>16;#endif				d_16 = *dst;				inOver0565(maskAlpha, s_16, d_16, *dst++);#if IMAGE_BYTE_ORDER == LSBFirst				s_16=s_32>>16;#else				s_16=s_32&0xffff;#endif			d_16 = *dst;			inOver0565(maskAlpha, s_16, d_16, *dst++);			w-=2;		    }		}		src=(CARD16 *)isrc;		if(w!=0)		{			s_16 = *src;			d_16 = *dst;			inOver0565(maskAlpha, s_16, d_16, *dst);		}	}}/* macros for "i can't believe it's not fast" packed pixel handling */#define alphamaskCombine24(a,b) genericCombine24(a,b,maskAlpha,maskiAlpha)static voidfbCompositeTrans_0888xnx0888(pixman_operator_t      op,			     PicturePtr pSrc,			     PicturePtr pMask,			     PicturePtr pDst,			     INT16      xSrc,			     INT16      ySrc,			     INT16      xMask,			     INT16      yMask,			     INT16      xDst,			     INT16      yDst,			     CARD16     width,			     CARD16     height){    CARD8	*dstLine, *dst,*idst;    CARD8	*srcLine, *src;    FbStride	dstStride, srcStride;    CARD16	w;    FbBits	mask;    CARD16	maskAlpha,maskiAlpha;    fbComposeGetSolid (pMask, pDst, mask);    maskAlpha = mask >> 24;	maskiAlpha= 255-maskAlpha;    if (!maskAlpha)	return;    /*    if (maskAlpha == 0xff)    {	fbCompositeSrc_0888x0888 (op, pSrc, pMask, pDst,				  xSrc, ySrc, xMask, yMask, xDst, yDst,				  width, height);	return;    }    */    fbComposeGetStart (pSrc, xSrc, ySrc, CARD8, srcStride, srcLine, 3);    fbComposeGetStart (pDst, xDst, yDst, CARD8, dstStride, dstLine, 3);	{		unsigned long ws,wt;		CARD32 workingSource;		CARD32 *wsrc, *wdst, *widst;		CARD32 rs, rd, nd;		CARD8 *isrc;		/* are xSrc and xDst at the same alignment?  if not, we need to be complicated :)*/		/* if(0==0) */		if( (((xSrc*3)&3)!=((xDst*3)&3)) || ((srcStride&3)!=(dstStride&3)))		{			while (height--)			{				dst = dstLine;				dstLine += dstStride;				isrc = src = srcLine;				srcLine += srcStride;				w = width*3;				setupPackedReader(ws,wt,isrc,wsrc,workingSource);				/* get to word aligned */				switch(~(long)dst&3)				{					case 1:						readPackedSource(rs);						/* *dst++=alphamaskCombine24(rs, *dst)>>8; */						rd=*dst;  /* make gcc happy.  hope it doens't cost us too much performance*/						*dst++=alphamaskCombine24(rs, rd)>>8;						w--; if(w==0) break;					case 2:						readPackedSource(rs);						rd=*dst;						*dst++=alphamaskCombine24(rs, rd)>>8;						w--; if(w==0) break;					case 3:						readPackedSource(rs);						rd=*dst;						*dst++=alphamaskCombine24(rs, rd)>>8;						w--; if(w==0) break;				}				wdst=(CARD32 *)dst;				while (w>3)				{					/* FIXME: write a special readPackedWord macro, which knows how to					 * halfword combine					 */#if IMAGE_BYTE_ORDER == LSBFirst					rd=*wdst;					readPackedSource(nd);					readPackedSource(rs);					nd|=rs<<8;					readPackedSource(rs);					nd|=rs<<16;					readPackedSource(rs);					nd|=rs<<24;#else					readPackedSource(nd);					nd<<=24;					readPackedSource(rs);					nd|=rs<<16;					readPackedSource(rs);					nd|=rs<<8;					readPackedSource(rs);					nd|=rs;#endif					inOver0888(maskAlpha, nd, rd, *wdst++)					w-=4;				}				dst=(CARD8 *)wdst;				switch(w)				{					case 3:						readPackedSource(rs);						rd=*dst;						*dst++=alphamaskCombine24(rs, rd)>>8;					case 2:						readPackedSource(rs);						rd=*dst;						*dst++=alphamaskCombine24(rs, rd)>>8;					case 1:						readPackedSource(rs);						rd=*dst;						*dst++=alphamaskCombine24(rs, rd)>>8;				}			}		}		else		{			while (height--)			{				idst=dst = dstLine;				dstLine += dstStride;				src = srcLine;				srcLine += srcStride;				w = width*3;				/* get to word aligned */				switch(~(long)src&3)				{					case 1:						rd=alphamaskCombine24(*src++, *dst)>>8;						*dst++=rd;						w--; if(w==0) break;					case 2:						rd=alphamaskCombine24(*src++, *dst)>>8;						*dst++=rd;						w--; if(w==0) break;					case 3:						rd=alphamaskCombine24(*src++, *dst)>>8;						*dst++=rd;						w--; if(w==0) break;				}				wsrc=(CARD32 *)src;				widst=(CARD32 *)dst;				while(w>3)				{					rs = *wsrc++;					rd = *widst;					inOver0888(maskAlpha, rs, rd, *widst++);					w-=4;				}				src=(CARD8 *)wsrc;				dst=(CARD8 *)widst;				switch(w)				{					case 3:						rd=alphamaskCombine24(*src++, *dst)>>8;						*dst++=rd;					case 2:						rd=alphamaskCombine24(*src++, *dst)>>8;						*dst++=rd;					case 1:						rd=alphamaskCombine24(*src++, *dst)>>8;						*dst++=rd;				}			}		}	}}/* * Simple bitblt */static voidfbCompositeSrcSrc_nxn  (pixman_operator_t	op,			PicturePtr pSrc,			PicturePtr pMask,			PicturePtr pDst,			INT16      xSrc,			INT16      ySrc,			INT16      xMask,			INT16      yMask,			INT16      xDst,			INT16      yDst,			CARD16     width,			CARD16     height){    FbBits	*dst;    FbBits	*src;    FbStride	dstStride, srcStride;    int		srcXoff, srcYoff;    int		dstXoff, dstYoff;    int		srcBpp;    int		dstBpp;    Bool	reverse = FALSE;    Bool	upsidedown = FALSE;    fbGetDrawable(pSrc->pDrawable,src,srcStride,srcBpp,srcXoff,srcYoff);    fbGetDrawable(pDst->pDrawable,dst,dstStride,dstBpp,dstXoff,dstYoff);    fbBlt (src + (ySrc + srcYoff) * srcStride,	   srcStride,	   (xSrc + srcXoff) * srcBpp,	   dst + (yDst + dstYoff) * dstStride,	   dstStride,	   (xDst + dstXoff) * dstBpp,	   (width) * dstBpp,	   (height),	   GXcopy,	   FB_ALLONES,	   dstBpp,	   reverse,	   upsidedown);}/* * Solid fillvoidfbCompositeSolidSrc_nxn  (CARD8	op,			  PicturePtr pSrc,			  PicturePtr pMask,			  PicturePtr pDst,			  INT16      xSrc,			  INT16      ySrc,			  INT16      xMask,			  INT16      yMask,			  INT16      xDst,			  INT16      yDst,			  CARD16     width,			  CARD16     height){} */# define mod(a,b)	((b) == 1 ? 0 : (a) >= 0 ? (a) % (b) : (b) - (-a) % (b))voidpixman_composite (pixman_operator_t	op,	     PicturePtr pSrc,	     PicturePtr pMask,	     PicturePtr pDst,	     int	xSrc,	     int	ySrc,	     int	xMask,	     int	yMask,	     int	xDst,	     int	yDst,	     int	width,	     int	height){    pixman_region16_t	    *region;    int		    n;    pixman_box16_t    *pbox;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -