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

📄 fbpict.c

📁 超强的嵌入式GUI系统
💻 C
📖 第 1 页 / 共 4 页
字号:
#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;    CompositeFunc   func = NULL;    Bool	    srcRepeat = pSrc->pDrawable && pSrc->repeat == RepeatNormal;    Bool	    maskRepeat = FALSE;    Bool	    srcTransform = pSrc->transform != 0;    Bool	    maskTransform = FALSE;    Bool	    srcAlphaMap = pSrc->alphaMap != 0;    Bool	    maskAlphaMap = FALSE;    Bool	    dstAlphaMap = pDst->alphaMap != 0;    int		    x_msk, y_msk, x_src, y_src, x_dst, y_dst;    unsigned int    w, h, w_this, h_this;#ifdef USE_MMX    static Bool mmx_setup = FALSE;    if (!mmx_setup) {        fbComposeSetupMMX();        mmx_setup = TRUE;    }#endif    xDst += pDst->pDrawable->x;    yDst += pDst->pDrawable->y;    if (pSrc->pDrawable) {        xSrc += pSrc->pDrawable->x;        ySrc += pSrc->pDrawable->y;    }    if (srcRepeat && srcTransform &&	pSrc->pDrawable->width == 1 &&	pSrc->pDrawable->height == 1)	srcTransform = FALSE;    if (pMask && pMask->pDrawable)    {	xMask += pMask->pDrawable->x;	yMask += pMask->pDrawable->y;	maskRepeat = pMask->repeat == RepeatNormal;	maskTransform = pMask->transform != 0;#ifdef PIXMAN_CONVOLUTION	if (pMask->filter == PictFilterConvolution)	    maskTransform = TRUE;#endif	maskAlphaMap = pMask->alphaMap != 0;	if (maskRepeat && maskTransform &&	    pMask->pDrawable->width == 1 &&	    pMask->pDrawable->height == 1)	    maskTransform = FALSE;    }    if (pSrc->pDrawable && (!pMask || pMask->pDrawable)        && !srcTransform && !maskTransform        && !maskAlphaMap && !srcAlphaMap && !dstAlphaMap#ifdef PIXMAN_CONVOLUTION        && (pSrc->filter != PictFilterConvolution)        && (!pMask || pMask->filter != PictFilterConvolution)#endif        )    switch (op) {    case PIXMAN_OPERATOR_OVER:	if (pMask)	{	    if (srcRepeat &&		pSrc->pDrawable->width == 1 &&		pSrc->pDrawable->height == 1)	    {		if (PICT_FORMAT_COLOR(pSrc->format_code)) {		    switch (pMask->format_code) {		    case PICT_a8:			switch (pDst->format_code) {			case PICT_r5g6b5:			case PICT_b5g6r5:#ifdef USE_MMX			    if (fbHaveMMX())				func = fbCompositeSolidMask_nx8x0565mmx;			    else#endif				func = fbCompositeSolidMask_nx8x0565;			    break;			case PICT_r8g8b8:			case PICT_b8g8r8:			    func = fbCompositeSolidMask_nx8x0888;			    break;			case PICT_a8r8g8b8:			case PICT_x8r8g8b8:			case PICT_a8b8g8r8:			case PICT_x8b8g8r8:#ifdef USE_MMX			    if (fbHaveMMX())				func = fbCompositeSolidMask_nx8x8888mmx;			    else#endif				func = fbCompositeSolidMask_nx8x8888;			    break;			}			break;		    case PICT_a8r8g8b8:			if (pMask->componentAlpha) {			    switch (pDst->format_code) {			    case PICT_a8r8g8b8:			    case PICT_x8r8g8b8:#ifdef USE_MMX				if (fbHaveMMX())				    func = fbCompositeSolidMask_nx8888x8888Cmmx;				else#endif				    func = fbCompositeSolidMask_nx8888x8888C;				break;			    case PICT_r5g6b5:#ifdef USE_MMX				if (fbHaveMMX())				    func = fbCompositeSolidMask_nx8888x0565Cmmx;				else#endif				    func = fbCompositeSolidMask_nx8888x0565C;				break;			    }			}			else			{			    switch (pDst->format_code) {			    case PICT_r5g6b5:				func = fbCompositeSolidMask_nx8888x0565;				break;			    }			}			break;		    case PICT_a8b8g8r8:			if (pMask->componentAlpha) {			    switch (pDst->format_code) {			    case PICT_a8b8g8r8:			    case PICT_x8b8g8r8:#ifdef USE_MMX				if (fbHaveMMX())				    func = fbCompositeSolidMask_nx8888x8888Cmmx;				else#endif				    func = fbCompositeSolidMask_nx8888x8888C;				break;			    case PICT_b5g6r5:#ifdef USE_MMX				if (fbHaveMMX())				    func = fbCompositeSolidMask_nx8888x0565Cmmx;				else#endif				    func = fbCompositeSolidMask_nx8888x0565C;				break;			    }			}			else			{			    switch (pDst->format_code) {			    case PICT_b5g6r5:				func = fbCompositeSolidMask_nx8888x0565;				break;			    }			}			break;		    case PICT_a1:			switch (pDst->format_code) {			case PICT_r5g6b5:			case PICT_b5g6r5:			case PICT_r8g8b8:			case PICT_b8g8r8:			case PICT_a8r8g8b8:			case PICT_x8r8g8b8:			case PICT_a8b8g8r8:			case PICT_x8b8g8r8:			    func = fbCompositeSolidMask_nx1xn;			    break;			}		    }		}		if (func != pixman_compositeGeneral)		    srcRepeat = FALSE;	    }	    else /* has mask and non-repeating source */	    {		if (pSrc->pDrawable == pMask->pDrawable &&		    xSrc == xMask && ySrc == yMask &&		    !pMask->componentAlpha)		{		    /* source == mask: non-premultiplied data */		    switch (pSrc->format_code) {		    case PICT_x8b8g8r8:			switch (pMask->format_code) {			case PICT_a8r8g8b8:			case PICT_a8b8g8r8:			    switch (pDst->format_code) {			    case PICT_a8r8g8b8:			    case PICT_x8r8g8b8:#ifdef USE_MMX				if (fbHaveMMX())				    func = fbCompositeSrc_8888RevNPx8888mmx;#endif				break;			    case PICT_r5g6b5:#ifdef USE_MMX				if (fbHaveMMX())				    func = fbCompositeSrc_8888RevNPx0565mmx;#endif				break;			    }			    break;			}			break;		    case PICT_x8r8g8b8:			switch (pMask->format_code) {			case PICT_a8r8g8b8:			case PICT_a8b8g8r8:			    switch (pDst->format_code) {			    case PICT_a8b8g8r8:			    case PICT_x8b8g8r8:#ifdef USE_MMX				if (fbHaveMMX())				    func = fbCompositeSrc_8888RevNPx8888mmx;#endif				break;			    case PICT_r5g6b5:#ifdef USE_MMX				if (fbHaveMMX())				    func = fbCompositeSrc_8888RevNPx0565mmx;#endif				break;			    }			    break;			}			break;		    }		    break;		}		else		{		    /* non-repeating source, repeating mask => translucent window */		    if (maskRepeat &&			pMask->pDrawable->width == 1 &&			pMask->pDrawable->height == 1)		    {			switch (pSrc->format_code) {			case PICT_r5g6b5:			case PICT_b5g6r5:			    if (pDst->format_code == pSrc->format_code)				func = fbCompositeTrans_0565xnx0565;			    break;			case PICT_r8g8b8:			case PICT_b8g8r8:			    if (pDst->format_code == pSrc->format_code)

⌨️ 快捷键说明

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