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

📄 fbmmx.c

📁 按照官方的说法:Cairo is a vector graphics library with cross-device output support. 翻译过来
💻 C
📖 第 1 页 / 共 4 页
字号:
        *dest = store8888(s);        ++src;        ++mask;        ++dest;    }    _mm_empty();}static FASTCALL voidmmxCombineOverC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width){    const CARD32 *end = src + width;    while (src < end) {        __m64 a = load8888(*mask);        __m64 s = load8888(*src);        __m64 d = load8888(*dest);        __m64 sa = expand_alpha(s);	*dest = store8888(in_over (s, sa, a, d));        ++src;        ++dest;        ++mask;    }    _mm_empty();}static FASTCALL voidmmxCombineOverReverseC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width){    const CARD32 *end = src + width;    while (src < end) {        __m64 a = load8888(*mask);        __m64 s = load8888(*src);        __m64 d = load8888(*dest);        __m64 da = expand_alpha(d);	*dest = store8888(over (d, da, in (s, a)));        ++src;        ++dest;        ++mask;    }    _mm_empty();}static FASTCALL voidmmxCombineInC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width){    const CARD32 *end = src + width;    while (src < end) {        __m64 a = load8888(*mask);        __m64 s = load8888(*src);        __m64 d = load8888(*dest);        __m64 da = expand_alpha(d);        s = pix_multiply(s, a);        s = pix_multiply(s, da);        *dest = store8888(s);        ++src;        ++dest;        ++mask;    }    _mm_empty();}static FASTCALL voidmmxCombineInReverseC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width){    const CARD32 *end = src + width;    while (src < end) {        __m64 a = load8888(*mask);        __m64 s = load8888(*src);        __m64 d = load8888(*dest);        __m64 sa = expand_alpha(s);        a = pix_multiply(a, sa);        d = pix_multiply(d, a);        *dest = store8888(d);        ++src;        ++dest;        ++mask;    }    _mm_empty();}static FASTCALL voidmmxCombineOutC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width){    const CARD32 *end = src + width;    while (src < end) {        __m64 a = load8888(*mask);        __m64 s = load8888(*src);        __m64 d = load8888(*dest);        __m64 da = expand_alpha(d);        da = negate(da);        s = pix_multiply(s, a);        s = pix_multiply(s, da);        *dest = store8888(s);        ++src;        ++dest;        ++mask;    }    _mm_empty();}static FASTCALL voidmmxCombineOutReverseC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width){    const CARD32 *end = src + width;    while (src < end) {        __m64 a = load8888(*mask);        __m64 s = load8888(*src);        __m64 d = load8888(*dest);        __m64 sa = expand_alpha(s);        a = pix_multiply(a, sa);        a = negate(a);        d = pix_multiply(d, a);        *dest = store8888(d);        ++src;        ++dest;        ++mask;    }    _mm_empty();}static FASTCALL voidmmxCombineAtopC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width){    const CARD32 *end = src + width;    while (src < end) {        __m64 a = load8888(*mask);        __m64 s = load8888(*src);        __m64 d = load8888(*dest);        __m64 da = expand_alpha(d);        __m64 sa = expand_alpha(s);        s = pix_multiply(s, a);        a = pix_multiply(a, sa);        a = negate(a);	d = pix_add_mul (d, a, s, da);        *dest = store8888(d);        ++src;        ++dest;        ++mask;    }    _mm_empty();}static FASTCALL voidmmxCombineAtopReverseC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width){    const CARD32 *end = src + width;    while (src < end) {        __m64 a = load8888(*mask);        __m64 s = load8888(*src);        __m64 d = load8888(*dest);        __m64 da = expand_alpha(d);        __m64 sa = expand_alpha(s);        s = pix_multiply(s, a);        a = pix_multiply(a, sa);        da = negate(da);	d = pix_add_mul (d, a, s, da);        *dest = store8888(d);        ++src;        ++dest;        ++mask;    }    _mm_empty();}static FASTCALL voidmmxCombineXorC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width){    const CARD32 *end = src + width;    while (src < end) {        __m64 a = load8888(*mask);        __m64 s = load8888(*src);        __m64 d = load8888(*dest);        __m64 da = expand_alpha(d);        __m64 sa = expand_alpha(s);        s = pix_multiply(s, a);        a = pix_multiply(a, sa);        da = negate(da);        a = negate(a);	d = pix_add_mul (d, a, s, da);        *dest = store8888(d);        ++src;        ++dest;        ++mask;    }    _mm_empty();}static FASTCALL voidmmxCombineAddC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width){    const CARD32 *end = src + width;    while (src < end) {        __m64 a = load8888(*mask);        __m64 s = load8888(*src);        __m64 d = load8888(*dest);        s = pix_multiply(s, a);        d = pix_add(s, d);        *dest = store8888(d);        ++src;        ++dest;        ++mask;    }    _mm_empty();}extern FbComposeFunctions composeFunctions;void fbComposeSetupMMX(void){    /* check if we have MMX support and initialize accordingly */    if (fbHaveMMX()) {        composeFunctions.combineU[PIXMAN_OPERATOR_OVER] = mmxCombineOverU;        composeFunctions.combineU[PIXMAN_OPERATOR_OVER_REVERSE] = mmxCombineOverReverseU;        composeFunctions.combineU[PIXMAN_OPERATOR_IN] = mmxCombineInU;        composeFunctions.combineU[PIXMAN_OPERATOR_IN_REVERSE] = mmxCombineInReverseU;        composeFunctions.combineU[PIXMAN_OPERATOR_OUT] = mmxCombineOutU;        composeFunctions.combineU[PIXMAN_OPERATOR_OUT_REVERSE] = mmxCombineOutReverseU;        composeFunctions.combineU[PIXMAN_OPERATOR_ATOP] = mmxCombineAtopU;        composeFunctions.combineU[PIXMAN_OPERATOR_ATOP_REVERSE] = mmxCombineAtopReverseU;        composeFunctions.combineU[PIXMAN_OPERATOR_XOR] = mmxCombineXorU;        composeFunctions.combineU[PIXMAN_OPERATOR_ADD] = mmxCombineAddU;        composeFunctions.combineU[PIXMAN_OPERATOR_SATURATE] = mmxCombineSaturateU;        composeFunctions.combineC[PIXMAN_OPERATOR_SRC] = mmxCombineSrcC;        composeFunctions.combineC[PIXMAN_OPERATOR_OVER] = mmxCombineOverC;        composeFunctions.combineC[PIXMAN_OPERATOR_OVER_REVERSE] = mmxCombineOverReverseC;        composeFunctions.combineC[PIXMAN_OPERATOR_IN] = mmxCombineInC;        composeFunctions.combineC[PIXMAN_OPERATOR_IN_REVERSE] = mmxCombineInReverseC;        composeFunctions.combineC[PIXMAN_OPERATOR_OUT] = mmxCombineOutC;        composeFunctions.combineC[PIXMAN_OPERATOR_OUT_REVERSE] = mmxCombineOutReverseC;        composeFunctions.combineC[PIXMAN_OPERATOR_ATOP] = mmxCombineAtopC;        composeFunctions.combineC[PIXMAN_OPERATOR_ATOP_REVERSE] = mmxCombineAtopReverseC;        composeFunctions.combineC[PIXMAN_OPERATOR_XOR] = mmxCombineXorC;        composeFunctions.combineC[PIXMAN_OPERATOR_ADD] = mmxCombineAddC;        composeFunctions.combineMaskU = mmxCombineMaskU;    }}/* ------------------ MMX code paths called from fbpict.c ----------------------- */voidfbCompositeSolid_nx8888mmx (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;    CARD32	*dstLine, *dst;    CARD16	w;    FbStride	dstStride;    __m64	vsrc, vsrca;    CHECKPOINT();    fbComposeGetSolid(pSrc, pDst, src);    if (src >> 24 == 0)	return;    fbComposeGetStart (pDst, xDst, yDst, CARD32, dstStride, dstLine, 1);    vsrc = load8888 (src);    vsrca = expand_alpha (vsrc);    while (height--)    {	dst = dstLine;	dstLine += dstStride;	w = width;	CHECKPOINT();	while (w && (unsigned long)dst & 7)	{	    *dst = store8888(over(vsrc, vsrca, load8888(*dst)));	    w--;	    dst++;	}	while (w >= 2)	{	    __m64 vdest;	    __m64 dest0, dest1;	    vdest = *(__m64 *)dst;	    dest0 = over(vsrc, vsrca, expand8888(vdest, 0));	    dest1 = over(vsrc, vsrca, expand8888(vdest, 1));	    *(__m64 *)dst = pack8888(dest0, dest1);	    dst += 2;	    w -= 2;	}	CHECKPOINT();	while (w)	{	    *dst = store8888(over(vsrc, vsrca, load8888(*dst)));	    w--;	    dst++;	}    }    _mm_empty();}voidfbCompositeSolid_nx0565mmx (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;    CARD16	*dstLine, *dst;    CARD16	w;    FbStride	dstStride;    __m64	vsrc, vsrca;    CHECKPOINT();    fbComposeGetSolid(pSrc, pDst, src);    if (src >> 24 == 0)	return;    fbComposeGetStart (pDst, xDst, yDst, CARD16, dstStride, dstLine, 1);    vsrc = load8888 (src);    vsrca = expand_alpha (vsrc);    while (height--)    {	dst = dstLine;	dstLine += dstStride;	w = width;	CHECKPOINT();	while (w && (unsigned long)dst & 7)	{	    ullong d = *dst;	    __m64 vdest = expand565 ((__m64)d, 0);	    vdest = pack565(over(vsrc, vsrca, vdest), vdest, 0);	    *dst = (ullong)vdest;	    w--;	    dst++;	}	while (w >= 4)	{	    __m64 vdest;	    vdest = *(__m64 *)dst;	    vdest = pack565 (over(vsrc, vsrca, expand565(vdest, 0)), vdest, 0);	    vdest = pack565 (over(vsrc, vsrca, expand565(vdest, 1)), vdest, 1);	    vdest = pack565 (over(vsrc, vsrca, expand565(vdest, 2)), vdest, 2);	    vdest = pack565 (over(vsrc, vsrca, expand565(vdest, 3)), vdest, 3);	    *(__m64 *)dst = vdest;	    dst += 4;	    w -= 4;	}	CHECKPOINT();	while (w)	{	    ullong d = *dst;	    __m64 vdest = expand565 ((__m64)d, 0);	    vdest = pack565(over(vsrc, vsrca, vdest), vdest, 0);	    *dst = (ullong)vdest;	    w--;	    dst++;	}    }    _mm_empty();}voidfbCompositeSolidMask_nx8888x8888Cmmx (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;    CARD32	*maskLine;    FbStride	dstStride, maskStride;    __m64	vsrc, vsrca;    CHECKPOINT();    fbComposeGetSolid(pSrc, pDst, src);    srca = src >> 24;    if (srca == 0)	return;    fbComposeGetStart (pDst, xDst, yDst, CARD32, 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;	CARD32 *q = (CARD32 *)dstLine;	while (twidth && (unsigned long)q & 7)	{	    CARD32 m = *(CARD32 *)p;	    if (m)	    {		__m64 vdest = load8888(*q);		vdest = in_over(vsrc, vsrca, load8888(m), vdest);		*q = store8888(vdest);	    }	    twidth--;	    p++;	    q++;	}	while (twidth >= 2)	{	    CARD32 m0, m1;	    m0 = *p;	    m1 = *(p + 1);	    if (m0 | m1)	    {		__m64 dest0, dest1;		__m64 vdest = *(__m64 *)q;		dest0 = in_over(vsrc, vsrca, load8888(m0),				expand8888 (vdest, 0));		dest1 = in_over(vsrc, vsrca, load8888(m1),				expand8888 (vdest, 1));		*(__m64 *)q = pack8888(dest0, dest1);	    }	    p += 2;	    q += 2;	    twidth -= 2;	}	while (twidth)	{	    CARD32 m = *(CARD32 *)p;	    if (m)	    {		__m64 vdest = load8888(*q);		vdest = in_over(vsrc, vsrca, load8888(m), vdest);		*q = store8888(vdest);	    }	    twidth--;	    p++;	    q++;	}	dstLine += dstStride;	maskLine += maskStride;    }    _mm_empty();}voidfbCompositeSrc_8888x8x8888mmx (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;    CARD8	*maskLine;    CARD32	mask;    __m64	vmask;    FbStride	dstStride, srcStride, maskStride;    CARD16	w;    __m64  srca;    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 (over (s, expand_alpha (s), d));	    w--;	    dst++;	    src++;	}	while (w >= 2)	{	    __m64 vs = *(__m64 *)dst;	    __m64 vd = *(__m64 *)src;	    __m64 vsrc0 = expand8888 (vs, 0);	    __m64 vsrc1 = expand8888 (vs, 1);	    *(__m64 *)dst = (__m64)pack8888 (		in_over (vsrc0, expand_alpha (vsrc0), vmask, expand8888 (vd, 0)),		in_over (vsrc1, expand_alpha (vsrc1), vmask, expand8888 (vd, 1)));	    w -= 2;	    dst += 2;	    src += 2;	}	while (w)	{	    __m64 s = load8888 (*src);	    __m64 d = load8888 (*dst);	    *dst = store8888 (in_over (s, expand_alpha (s), vmask, d));	    w--;	    dst++;	    src++;	}    }    _mm_empty();}voidfbCompositeSrc_x888x8x8888mmx (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;    CARD8	*maskLine;    CARD32	mask;    __m64	vmask;    FbStride	dstStride, srcStride, maskStride;    CARD16	w;    __m64  srca;

⌨️ 快捷键说明

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