📄 fbpict.c
字号:
#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 + -