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

📄 fbmmx.c

📁 按照官方的说法:Cairo is a vector graphics library with cross-device output support. 翻译过来
💻 C
📖 第 1 页 / 共 4 页
字号:
		vdest = pack565(over_rev_non_pre(load8888(s0), expand565(vdest, 0)), vdest, 0);	        vdest = pack565(over_rev_non_pre(load8888(s1), expand565(vdest, 1)), vdest, 1);		vdest = pack565(over_rev_non_pre(load8888(s2), expand565(vdest, 2)), vdest, 2);		vdest = pack565(over_rev_non_pre(load8888(s3), expand565(vdest, 3)), vdest, 3);		*(__m64 *)dst = vdest;	    }	    w -= 4;	    dst += 4;	    src += 4;	}	CHECKPOINT();	while (w)	{	    __m64 vsrc = load8888 (*src);	    ullong d = *dst;	    __m64 vdest = expand565 ((__m64)d, 0);	    vdest = pack565(over_rev_non_pre(vsrc, vdest), vdest, 0);	    *dst = (ullong)vdest;	    w--;	    dst++;	    src++;	}    }    _mm_empty();}/* "8888RevNP" is GdkPixbuf's format: ABGR, non premultiplied */voidfbCompositeSrc_8888RevNPx8888mmx (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;    CHECKPOINT();    fbComposeGetStart (pDst, xDst, yDst, CARD32, dstStride, dstLine, 1);    fbComposeGetStart (pSrc, xSrc, ySrc, CARD32, srcStride, srcLine, 1);    assert (pSrc->pDrawable == pMask->pDrawable);    while (height--)    {	dst = dstLine;	dstLine += dstStride;	src = srcLine;	srcLine += srcStride;	w = width;	while (w && (unsigned long)dst & 7)	{	    __m64 s = load8888 (*src);	    __m64 d = load8888 (*dst);	    *dst = store8888 (over_rev_non_pre (s, d));	    w--;	    dst++;	    src++;	}	while (w >= 2)	{	    ullong s0, s1;	    unsigned char a0, a1;	    __m64 d0, d1;	    s0 = *src;	    s1 = *(src + 1);	    a0 = (s0 >> 24);	    a1 = (s1 >> 24);	    if ((a0 & a1) == 0xFF)	    {		d0 = invert_colors(load8888(s0));		d1 = invert_colors(load8888(s1));		*(__m64 *)dst = pack8888 (d0, d1);	    }	    else if (a0 | a1)	    {		__m64 vdest = *(__m64 *)dst;		d0 = over_rev_non_pre (load8888(s0), expand8888 (vdest, 0));		d1 = over_rev_non_pre (load8888(s1), expand8888 (vdest, 1));		*(__m64 *)dst = pack8888 (d0, d1);	    }	    w -= 2;	    dst += 2;	    src += 2;	}	while (w)	{	    __m64 s = load8888 (*src);	    __m64 d = load8888 (*dst);	    *dst = store8888 (over_rev_non_pre (s, d));	    w--;	    dst++;	    src++;	}    }    _mm_empty();}voidfbCompositeSolidMask_nx8888x0565Cmmx (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	src, srca;    CARD16	*dstLine;    CARD32	*maskLine;    FbStride	dstStride, maskStride;    __m64  vsrc, vsrca;    CHECKPOINT();    fbComposeGetSolid(pSrc, pDst, src);    srca = src >> 24;    if (srca == 0)	return;    fbComposeGetStart (pDst, xDst, yDst, CARD16, dstStride, dstLine, 1);    fbComposeGetStart (pMask, xMask, yMask, CARD32, maskStride, maskLine, 1);    vsrc = load8888 (src);    vsrca = expand_alpha (vsrc);    while (height--)    {	int twidth = width;	CARD32 *p = (CARD32 *)maskLine;	CARD16 *q = (CARD16 *)dstLine;	while (twidth && ((unsigned long)q & 7))	{	    CARD32 m = *(CARD32 *)p;	    if (m)	    {		ullong d = *q;		__m64 vdest = expand565 ((__m64)d, 0);		vdest = pack565 (in_over (vsrc, vsrca, load8888 (m), vdest), vdest, 0);		*q = (ullong)vdest;	    }	    twidth--;	    p++;	    q++;	}	while (twidth >= 4)	{	    CARD32 m0, m1, m2, m3;	    m0 = *p;	    m1 = *(p + 1);	    m2 = *(p + 2);	    m3 = *(p + 3);	    if ((m0 | m1 | m2 | m3))	    {		__m64 vdest = *(__m64 *)q;		vdest = pack565(in_over(vsrc, vsrca, load8888(m0), expand565(vdest, 0)), vdest, 0);		vdest = pack565(in_over(vsrc, vsrca, load8888(m1), expand565(vdest, 1)), vdest, 1);		vdest = pack565(in_over(vsrc, vsrca, load8888(m2), expand565(vdest, 2)), vdest, 2);		vdest = pack565(in_over(vsrc, vsrca, load8888(m3), expand565(vdest, 3)), vdest, 3);		*(__m64 *)q = vdest;	    }	    twidth -= 4;	    p += 4;	    q += 4;	}	while (twidth)	{	    CARD32 m;	    m = *(CARD32 *)p;	    if (m)	    {		ullong d = *q;		__m64 vdest = expand565((__m64)d, 0);		vdest = pack565 (in_over(vsrc, vsrca, load8888(m), vdest), vdest, 0);		*q = (ullong)vdest;	    }	    twidth--;	    p++;	    q++;	}	maskLine += maskStride;	dstLine += dstStride;    }    _mm_empty ();}voidfbCompositeSrcAdd_8000x8000mmx (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;    CHECKPOINT();    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 && (unsigned long)dst & 7)	{	    s = *src;	    d = *dst;	    t = d + s;	    s = t | (0 - (t >> 8));	    *dst = s;	    dst++;	    src++;	    w--;	}	while (w >= 8)	{	    *(__m64*)dst = _mm_adds_pu8(*(__m64*)src, *(__m64*)dst);	    dst += 8;	    src += 8;	    w -= 8;	}	while (w)	{	    s = *src;	    d = *dst;	    t = d + s;	    s = t | (0 - (t >> 8));	    *dst = s;	    dst++;	    src++;	    w--;	}    }    _mm_empty();}voidfbCompositeSrcAdd_8888x8888mmx (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;    CHECKPOINT();    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 && (unsigned long)dst & 7)	{	    *dst = _mm_cvtsi64_si32(_mm_adds_pu8(_mm_cvtsi32_si64(*src),						 _mm_cvtsi32_si64(*dst)));	    dst++;	    src++;	    w--;	}	while (w >= 2)	{	    *(ullong*)dst = (ullong) _mm_adds_pu8(*(__m64*)src, *(__m64*)dst);	    dst += 2;	    src += 2;	    w -= 2;	}	if (w)	{	    *dst = _mm_cvtsi64_si32(_mm_adds_pu8(_mm_cvtsi32_si64(*src),						 _mm_cvtsi32_si64(*dst)));	}    }    _mm_empty();}BoolfbSolidFillmmx (FbPixels	*pDraw,		int		x,		int		y,		int		width,		int		height,		FbBits		xor){    FbStride	stride;    int		bpp;    ullong	fill;    __m64	vfill;    CARD32	byte_width;    CARD8	*byte_line;    FbBits      *bits;    int		xoff, yoff;    CHECKPOINT();    fbGetDrawable(pDraw, bits, stride, bpp, xoff, yoff);    if (bpp == 16 && (xor >> 16 != (xor & 0xffff)))	return FALSE;    if (bpp != 16 && bpp != 32)	return FALSE;    if (bpp == 16)    {	stride = stride * sizeof (FbBits) / 2;	byte_line = (CARD8 *)(((CARD16 *)bits) + stride * (y + yoff) + (x + xoff));	byte_width = 2 * width;	stride *= 2;    }    else    {	stride = stride * sizeof (FbBits) / 4;	byte_line = (CARD8 *)(((CARD32 *)bits) + stride * (y + yoff) + (x + xoff));	byte_width = 4 * width;	stride *= 4;    }    fill = ((ullong)xor << 32) | xor;    vfill = (__m64)fill;    while (height--)    {	int w;	CARD8 *d = byte_line;	byte_line += stride;	w = byte_width;	while (w >= 2 && ((unsigned long)d & 3))	{	    *(CARD16 *)d = xor;	    w -= 2;	    d += 2;	}	while (w >= 4 && ((unsigned long)d & 7))	{	    *(CARD32 *)d = xor;	    w -= 4;	    d += 4;	}	while (w >= 64)	{	    *(__m64*) (d +  0) = vfill;	    *(__m64*) (d +  8) = vfill;	    *(__m64*) (d + 16) = vfill;	    *(__m64*) (d + 24) = vfill;	    *(__m64*) (d + 32) = vfill;	    *(__m64*) (d + 40) = vfill;	    *(__m64*) (d + 48) = vfill;	    *(__m64*) (d + 56) = vfill;	    w -= 64;	    d += 64;	}	while (w >= 4)	{	    *(CARD32 *)d = xor;	    w -= 4;	    d += 4;	}	if (w >= 2)	{	    *(CARD16 *)d = xor;	    w -= 2;	    d += 2;	}    }    _mm_empty();    return TRUE;}BoolfbCopyAreammx (FbPixels	*pSrc,	       FbPixels	*pDst,	       int		src_x,	       int		src_y,	       int		dst_x,	       int		dst_y,	       int		width,	       int		height){    FbBits *	src_bits;    FbStride	src_stride;    int		src_bpp;    int		src_xoff;    int		src_yoff;    FbBits *	dst_bits;    FbStride	dst_stride;    int		dst_bpp;    int		dst_xoff;    int		dst_yoff;    CARD8 *	src_bytes;    CARD8 *	dst_bytes;    int		byte_width;    fbGetDrawable(pSrc, src_bits, src_stride, src_bpp, src_xoff, src_yoff);    fbGetDrawable(pDst, dst_bits, dst_stride, dst_bpp, dst_xoff, dst_yoff);    if (src_bpp != 16 && src_bpp != 32)	return FALSE;    if (dst_bpp != 16 && dst_bpp != 32)	return FALSE;    if (src_bpp != dst_bpp)    {	return FALSE;    }    if (src_bpp == 16)    {	src_stride = src_stride * sizeof (FbBits) / 2;	dst_stride = dst_stride * sizeof (FbBits) / 2;	src_bytes = (CARD8 *)(((CARD16 *)src_bits) + src_stride * (src_y + src_yoff) + (src_x + src_xoff));	dst_bytes = (CARD8 *)(((CARD16 *)dst_bits) + dst_stride * (dst_y + dst_yoff) + (dst_x + dst_xoff));	byte_width = 2 * width;	src_stride *= 2;	dst_stride *= 2;    }    else    {	src_stride = src_stride * sizeof (FbBits) / 4;	dst_stride = dst_stride * sizeof (FbBits) / 4;	src_bytes = (CARD8 *)(((CARD32 *)src_bits) + src_stride * (src_y + src_yoff) + (src_x + src_xoff));	dst_bytes = (CARD8 *)(((CARD32 *)dst_bits) + dst_stride * (dst_y + dst_yoff) + (dst_x + dst_xoff));	byte_width = 4 * width;	src_stride *= 4;	dst_stride *= 4;    }    while (height--)    {	int w;	CARD8 *s = src_bytes;	CARD8 *d = dst_bytes;	src_bytes += src_stride;	dst_bytes += dst_stride;	w = byte_width;	while (w >= 2 && ((unsigned long)d & 3))	{	    *(CARD16 *)d = *(CARD16 *)s;	    w -= 2;	    s += 2;	    d += 2;	}	while (w >= 4 && ((unsigned int)d & 7))	{	    *(CARD32 *)d = *(CARD32 *)s;	    w -= 4;	    s += 4;	    d += 4;	}	while (w >= 64)	{	    *(__m64 *)(d + 0)  = *(__m64 *)(s + 0);	    *(__m64 *)(d + 8)  = *(__m64 *)(s + 8);	    *(__m64 *)(d + 16) = *(__m64 *)(s + 16);	    *(__m64 *)(d + 24) = *(__m64 *)(s + 24);	    *(__m64 *)(d + 32) = *(__m64 *)(s + 32);	    *(__m64 *)(d + 40) = *(__m64 *)(s + 40);	    *(__m64 *)(d + 48) = *(__m64 *)(s + 48);	    *(__m64 *)(d + 56) = *(__m64 *)(s + 56);	    w -= 64;	    s += 64;	    d += 64;	}	while (w >= 4)	{	    *(CARD32 *)d = *(CARD32 *)s;	    w -= 4;	    s += 4;	    d += 4;	}	if (w >= 2)	{	    *(CARD16 *)d = *(CARD16 *)s;	    w -= 2;	    s += 2;	    d += 2;	}    }    _mm_empty();    return TRUE;}voidfbCompositeCopyAreammx (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){    fbCopyAreammx (pSrc->pDrawable,		   pDst->pDrawable,		   xSrc, ySrc,		   xDst, yDst,		   width, height);}#endif /* RENDER */

⌨️ 快捷键说明

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