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

📄 fbmmx.c

📁 超强的嵌入式GUI系统
💻 C
📖 第 1 页 / 共 4 页
字号:
        ++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)	{	    __m64 vdest = expand565 (_mm_cvtsi32_si64 (*dst), 0);	    vdest = pack565(over(vsrc, vsrca, vdest), vdest, 0);	    *dst = _mm_cvtsi64_si32 (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)	{	    __m64 vdest = expand565 (_mm_cvtsi32_si64 (*dst), 0);	    vdest = pack565(over(vsrc, vsrca, vdest), vdest, 0);	    *dst = _mm_cvtsi64_si32 (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--)    {	unsigned 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 = 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;    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 = pack8888 (		in_over (expand8888 (vs0, 0), srca, vmask, expand8888 (vd0, 0)),		in_over (expand8888 (vs0, 1), srca, vmask, expand8888 (vd0, 1)));	    vd1 = pack8888 (		in_over (expand8888 (vs1, 0), srca, vmask, expand8888 (vd1, 0)),		in_over (expand8888 (vs1, 1), srca, vmask, expand8888 (vd1, 1)));	    vd2 = pack8888 (		in_over (expand8888 (vs2, 0), srca, vmask, expand8888 (vd2, 0)),		in_over (expand8888 (vs2, 1), srca, vmask, expand8888 (vd2, 1)));	    vd3 = pack8888 (		in_over (expand8888 (vs3, 0), srca, vmask, expand8888 (vd3, 0)),		in_over (expand8888 (vs3, 1), srca, vmask, expand8888 (vd3, 1)));	    vd4 = pack8888 (		in_over (expand8888 (vs4, 0), srca, vmask, expand8888 (vd4, 0)),		in_over (expand8888 (vs4, 1), srca, vmask, expand8888 (vd4, 1)));	    vd5 = pack8888 (		in_over (expand8888 (vs5, 0), srca, vmask, expand8888 (vd5, 0)),		in_over (expand8888 (vs5, 1), srca, vmask, expand8888 (vd5, 1)));	    vd6 = pack8888 (		in_over (expand8888 (vs6, 0), srca, vmask, expand8888 (vd6, 0)),		in_over (expand8888 (vs6, 1), srca, vmask, expand8888 (vd6, 1)));	    vd7 = 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;

⌨️ 快捷键说明

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