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

📄 fbmmx.c

📁 按照官方的说法:Cairo is a vector graphics library with cross-device output support. 翻译过来
💻 C
📖 第 1 页 / 共 4 页
字号:
    CHECKPOINT();    fbComposeGetStart (pDst, xDst, yDst, CARD32, dstStride, dstLine, 1);    fbComposeGetStart (pSrc, xSrc, ySrc, CARD32, srcStride, srcLine, 1);    fbComposeGetStart (pMask, xMask, yMask, CARD8, maskStride, maskLine, 1);    mask = *maskLine << 24 | *maskLine << 16 | *maskLine << 8 | *maskLine;    vmask = load8888 (mask);    srca = MC(4x00ff);    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 (in_over (s, srca, vmask, d));	    w--;	    dst++;	    src++;	}	while (w >= 16)	{	    __m64 vd0 = *(__m64 *)(dst + 0);	    __m64 vd1 = *(__m64 *)(dst + 2);	    __m64 vd2 = *(__m64 *)(dst + 4);	    __m64 vd3 = *(__m64 *)(dst + 6);	    __m64 vd4 = *(__m64 *)(dst + 8);	    __m64 vd5 = *(__m64 *)(dst + 10);	    __m64 vd6 = *(__m64 *)(dst + 12);	    __m64 vd7 = *(__m64 *)(dst + 14);	    __m64 vs0 = *(__m64 *)(src + 0);	    __m64 vs1 = *(__m64 *)(src + 2);	    __m64 vs2 = *(__m64 *)(src + 4);	    __m64 vs3 = *(__m64 *)(src + 6);	    __m64 vs4 = *(__m64 *)(src + 8);	    __m64 vs5 = *(__m64 *)(src + 10);	    __m64 vs6 = *(__m64 *)(src + 12);	    __m64 vs7 = *(__m64 *)(src + 14);	    vd0 = (__m64)pack8888 (		in_over (expand8888 (vs0, 0), srca, vmask, expand8888 (vd0, 0)),		in_over (expand8888 (vs0, 1), srca, vmask, expand8888 (vd0, 1)));	    vd1 = (__m64)pack8888 (		in_over (expand8888 (vs1, 0), srca, vmask, expand8888 (vd1, 0)),		in_over (expand8888 (vs1, 1), srca, vmask, expand8888 (vd1, 1)));	    vd2 = (__m64)pack8888 (		in_over (expand8888 (vs2, 0), srca, vmask, expand8888 (vd2, 0)),		in_over (expand8888 (vs2, 1), srca, vmask, expand8888 (vd2, 1)));	    vd3 = (__m64)pack8888 (		in_over (expand8888 (vs3, 0), srca, vmask, expand8888 (vd3, 0)),		in_over (expand8888 (vs3, 1), srca, vmask, expand8888 (vd3, 1)));	    vd4 = (__m64)pack8888 (		in_over (expand8888 (vs4, 0), srca, vmask, expand8888 (vd4, 0)),		in_over (expand8888 (vs4, 1), srca, vmask, expand8888 (vd4, 1)));	    vd5 = (__m64)pack8888 (		in_over (expand8888 (vs5, 0), srca, vmask, expand8888 (vd5, 0)),		in_over (expand8888 (vs5, 1), srca, vmask, expand8888 (vd5, 1)));	    vd6 = (__m64)pack8888 (		in_over (expand8888 (vs6, 0), srca, vmask, expand8888 (vd6, 0)),		in_over (expand8888 (vs6, 1), srca, vmask, expand8888 (vd6, 1)));	    vd7 = (__m64)pack8888 (		in_over (expand8888 (vs7, 0), srca, vmask, expand8888 (vd7, 0)),		in_over (expand8888 (vs7, 1), srca, vmask, expand8888 (vd7, 1)));	    *(__m64 *)(dst + 0) = vd0;	    *(__m64 *)(dst + 2) = vd1;	    *(__m64 *)(dst + 4) = vd2;	    *(__m64 *)(dst + 6) = vd3;	    *(__m64 *)(dst + 8) = vd4;	    *(__m64 *)(dst + 10) = vd5;	    *(__m64 *)(dst + 12) = vd6;	    *(__m64 *)(dst + 14) = vd7;	    w -= 16;	    dst += 16;	    src += 16;	}	while (w)	{	    __m64 s = load8888 (*src);	    __m64 d = load8888 (*dst);	    *dst = store8888 (in_over (s, srca, vmask, d));	    w--;	    dst++;	    src++;	}    }    _mm_empty();}voidfbCompositeSrc_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, s;    FbStride	dstStride, srcStride;    CARD8	a;    CARD16	w;    fbComposeGetStart (pDst, xDst, yDst, CARD32, dstStride, dstLine, 1);    fbComposeGetStart (pSrc, xSrc, ySrc, CARD32, srcStride, srcLine, 1);    while (height--)    {	dst = dstLine;	dstLine += dstStride;	src = srcLine;	srcLine += srcStride;	w = width;	while (w--)	{	    s = *src++;	    a = s >> 24;	    if (a == 0xff)		*dst = s;	    else if (a) {		__m64 ms, sa;		ms = load8888(s);		sa = expand_alpha(ms);		*dst = store8888(over(ms, sa, load8888(*dst)));	    }	    dst++;	}    }    _mm_empty();}voidfbCompositeSolidMask_nx8x8888mmx (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;    CARD32	*dstLine, *dst;    CARD8	*maskLine, *mask;    FbStride	dstStride, maskStride;    CARD16	w;    __m64	vsrc, vsrca;    ullong	srcsrc;    CHECKPOINT();    fbComposeGetSolid(pSrc, pDst, src);    srca = src >> 24;    if (srca == 0)	return;    srcsrc = (unsigned long long)src << 32 | src;    fbComposeGetStart (pDst, xDst, yDst, CARD32, dstStride, dstLine, 1);    fbComposeGetStart (pMask, xMask, yMask, CARD8, maskStride, maskLine, 1);    vsrc = load8888 (src);    vsrca = expand_alpha (vsrc);    while (height--)    {	dst = dstLine;	dstLine += dstStride;	mask = maskLine;	maskLine += maskStride;	w = width;	CHECKPOINT();	while (w && (unsigned long)dst & 7)	{	    ullong m = *mask;	    if (m)	    {		__m64 vdest = in_over(vsrc, vsrca, expand_alpha_rev ((__m64)m), load8888(*dst));		*dst = store8888(vdest);	    }	    w--;	    mask++;	    dst++;	}	CHECKPOINT();	while (w >= 2)	{	    ullong m0, m1;	    m0 = *mask;	    m1 = *(mask + 1);	    if (srca == 0xff && (m0 & m1) == 0xff)	    {		*(unsigned long long *)dst = srcsrc;	    }	    else if (m0 | m1)	    {		__m64 vdest;		__m64 dest0, dest1;		vdest = *(__m64 *)dst;		dest0 = in_over(vsrc, vsrca, expand_alpha_rev ((__m64)m0), expand8888(vdest, 0));		dest1 = in_over(vsrc, vsrca, expand_alpha_rev ((__m64)m1), expand8888(vdest, 1));		*(__m64 *)dst = pack8888(dest0, dest1);	    }	    mask += 2;	    dst += 2;	    w -= 2;	}	CHECKPOINT();	while (w)	{	    ullong m = *mask;	    if (m)	    {		__m64 vdest = load8888(*dst);		vdest = in_over(vsrc, vsrca, expand_alpha_rev ((__m64)m), vdest);		*dst = store8888(vdest);	    }	    w--;	    mask++;	    dst++;	}    }    _mm_empty();}voidfbCompositeSolidMaskSrc_nx8x8888mmx (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;    CARD32	*dstLine, *dst;    CARD8	*maskLine, *mask;    FbStride	dstStride, maskStride;    CARD16	w;    __m64	vsrc, vsrca;    ullong	srcsrc;    CHECKPOINT();    fbComposeGetSolid(pSrc, pDst, src);    srca = src >> 24;    if (srca == 0)    {	if (fbSolidFillmmx (pDst->pDrawable, xDst, yDst, width, height, 0))	    return;    }    srcsrc = (unsigned long long)src << 32 | src;    fbComposeGetStart (pDst, xDst, yDst, CARD32, dstStride, dstLine, 1);    fbComposeGetStart (pMask, xMask, yMask, CARD8, maskStride, maskLine, 1);    vsrc = load8888 (src);    vsrca = expand_alpha (vsrc);    while (height--)    {	dst = dstLine;	dstLine += dstStride;	mask = maskLine;	maskLine += maskStride;	w = width;	CHECKPOINT();	while (w && (unsigned long)dst & 7)	{	    ullong m = *mask;	    if (m)	    {		  __m64 vdest = in(vsrc, expand_alpha_rev ((__m64)m));		  *dst = store8888(vdest);	    }	    else	    {		  *dst = 0;	    }	    w--;	    mask++;	    dst++;	}	CHECKPOINT();	while (w >= 2)	{	    ullong m0, m1;	    m0 = *mask;	    m1 = *(mask + 1);	    if (srca == 0xff && (m0 & m1) == 0xff)	    {		*(unsigned long long *)dst = srcsrc;	    }	    else if (m0 | m1)	    {		__m64 vdest;		__m64 dest0, dest1;		vdest = *(__m64 *)dst;		dest0 = in(vsrc, expand_alpha_rev ((__m64)m0));		dest1 = in(vsrc, expand_alpha_rev ((__m64)m1));		*(__m64 *)dst = pack8888(dest0, dest1);	    }	    else	    {		*dst = 0;	    }	    mask += 2;	    dst += 2;	    w -= 2;	}	CHECKPOINT();	while (w)	{	    ullong m = *mask;	    if (m)	    {		__m64 vdest = load8888(*dst);		vdest = in(vsrc, expand_alpha_rev ((__m64)m));		*dst = store8888(vdest);	    }	    else	    {		*dst = 0;	    }	    w--;	    mask++;	    dst++;	}    }    _mm_empty();}voidfbCompositeSolidMask_nx8x0565mmx (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, *dst;    CARD8	*maskLine, *mask;    FbStride	dstStride, maskStride;    CARD16	w;    __m64	vsrc, vsrca;    unsigned long long srcsrcsrcsrc, src16;    CHECKPOINT();    fbComposeGetSolid(pSrc, pDst, src);    srca = src >> 24;    if (srca == 0)	return;    fbComposeGetStart (pDst, xDst, yDst, CARD16, dstStride, dstLine, 1);    fbComposeGetStart (pMask, xMask, yMask, CARD8, maskStride, maskLine, 1);    vsrc = load8888 (src);    vsrca = expand_alpha (vsrc);    src16 = (ullong)pack565(vsrc, _mm_setzero_si64(), 0);    srcsrcsrcsrc = (ullong)src16 << 48 | (ullong)src16 << 32 |	(ullong)src16 << 16 | (ullong)src16;    while (height--)    {	dst = dstLine;	dstLine += dstStride;	mask = maskLine;	maskLine += maskStride;	w = width;	CHECKPOINT();	while (w && (unsigned long)dst & 7)	{	    ullong m = *mask;	    if (m)	    {		ullong d = *dst;		__m64 vd = (__m64)d;		__m64 vdest = in_over(vsrc, vsrca, expand_alpha_rev ((__m64)m), expand565(vd, 0));		*dst = (ullong)pack565(vdest, _mm_setzero_si64(), 0);	    }	    w--;	    mask++;	    dst++;	}	CHECKPOINT();	while (w >= 4)	{	    ullong m0, m1, m2, m3;	    m0 = *mask;	    m1 = *(mask + 1);	    m2 = *(mask + 2);	    m3 = *(mask + 3);	    if (srca == 0xff && (m0 & m1 & m2 & m3) == 0xff)	    {		*(unsigned long long *)dst = srcsrcsrcsrc;	    }	    else if (m0 | m1 | m2 | m3)	    {		__m64 vdest;		__m64 vm0, vm1, vm2, vm3;		vdest = *(__m64 *)dst;		vm0 = (__m64)m0;		vdest = pack565(in_over(vsrc, vsrca, expand_alpha_rev(vm0), expand565(vdest, 0)), vdest, 0);		vm1 = (__m64)m1;		vdest = pack565(in_over(vsrc, vsrca, expand_alpha_rev(vm1), expand565(vdest, 1)), vdest, 1);		vm2 = (__m64)m2;		vdest = pack565(in_over(vsrc, vsrca, expand_alpha_rev(vm2), expand565(vdest, 2)), vdest, 2);		vm3 = (__m64)m3;		vdest = pack565(in_over(vsrc, vsrca, expand_alpha_rev(vm3), expand565(vdest, 3)), vdest, 3);		*(__m64 *)dst = vdest;	    }	    w -= 4;	    mask += 4;	    dst += 4;	}	CHECKPOINT();	while (w)	{	    ullong m = *mask;	    if (m)	    {		ullong d = *dst;		__m64 vd = (__m64)d;		__m64 vdest = in_over(vsrc, vsrca, expand_alpha_rev ((__m64)m), expand565(vd, 0));		*dst = (ullong)pack565(vdest, _mm_setzero_si64(), 0);	    }	    w--;	    mask++;	    dst++;	}    }    _mm_empty();}voidfbCompositeSrc_8888RevNPx0565mmx (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	*srcLine, *src;    FbStride	dstStride, srcStride;    CARD16	w;    CHECKPOINT();    fbComposeGetStart (pDst, xDst, yDst, CARD16, 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;	CHECKPOINT();	while (w && (unsigned long)dst & 7)	{	    __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++;	}	CHECKPOINT();	while (w >= 4)	{	    CARD32 s0, s1, s2, s3;	    unsigned char a0, a1, a2, a3;	    s0 = *src;	    s1 = *(src + 1);	    s2 = *(src + 2);	    s3 = *(src + 3);	    a0 = (s0 >> 24);	    a1 = (s1 >> 24);	    a2 = (s2 >> 24);	    a3 = (s3 >> 24);	    if ((a0 & a1 & a2 & a3) == 0xFF)	    {		__m64 vdest;		vdest = pack565(invert_colors(load8888(s0)), _mm_setzero_si64(), 0);		vdest = pack565(invert_colors(load8888(s1)), vdest, 1);		vdest = pack565(invert_colors(load8888(s2)), vdest, 2);		vdest = pack565(invert_colors(load8888(s3)), vdest, 3);		*(__m64 *)dst = vdest;	    }	    else if (a0 | a1 | a2 | a3)	    {		__m64 vdest = *(__m64 *)dst;

⌨️ 快捷键说明

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