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

📄 pixman-mmx.c

📁 嵌入式图形库
💻 C
📖 第 1 页 / 共 5 页
字号:
        s = pix_add_mul (s, da, d, sia);        *dest = store8888(s);        ++dest;        ++src;    }    _mm_empty();}static FASTCALL voidmmxCombineAtopReverseU (uint32_t *dest, const uint32_t *src, int width){    const uint32_t *end;    end = dest + width;    while (dest < end) {        __m64 s, dia, d, sa;        s = load8888(*src);        d = load8888(*dest);        sa = expand_alpha(s);        dia = expand_alpha(d);        dia = negate(dia);	s = pix_add_mul (s, dia, d, sa);        *dest = store8888(s);        ++dest;        ++src;    }    _mm_empty();}static FASTCALL voidmmxCombineXorU (uint32_t *dest, const uint32_t *src, int width){    const uint32_t *end = dest + width;    while (dest < end) {        __m64 s, dia, d, sia;        s = load8888(*src);        d = load8888(*dest);        sia = expand_alpha(s);        dia = expand_alpha(d);        sia = negate(sia);        dia = negate(dia);	s = pix_add_mul (s, dia, d, sia);        *dest = store8888(s);        ++dest;        ++src;    }    _mm_empty();}static FASTCALL voidmmxCombineAddU (uint32_t *dest, const uint32_t *src, int width){    const uint32_t *end = dest + width;    while (dest < end) {        __m64 s, d;        s = load8888(*src);        d = load8888(*dest);        s = pix_add(s, d);        *dest = store8888(s);        ++dest;        ++src;    }    _mm_empty();}static FASTCALL voidmmxCombineSaturateU (uint32_t *dest, const uint32_t *src, int width){    const uint32_t *end = dest + width;    while (dest < end) {        uint32_t s = *src;        uint32_t d = *dest;        __m64 ms = load8888(s);        __m64 md = load8888(d);        uint32_t sa = s >> 24;        uint32_t da = ~d >> 24;        if (sa > da) {            __m64 msa = load8888(FbIntDiv(da, sa) << 24);            msa = expand_alpha(msa);            ms = pix_multiply(ms, msa);        }        md = pix_add(md, ms);        *dest = store8888(md);        ++src;        ++dest;    }    _mm_empty();}static FASTCALL voidmmxCombineSrcC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width){    const uint32_t *end = src + width;    while (src < end) {        __m64 a = load8888(*mask);        __m64 s = load8888(*src);        s = pix_multiply(s, a);        *dest = store8888(s);        ++src;        ++mask;        ++dest;    }    _mm_empty();}static FASTCALL voidmmxCombineOverC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width){    const uint32_t *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 (uint32_t *dest, uint32_t *src, uint32_t *mask, int width){    const uint32_t *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 (uint32_t *dest, uint32_t *src, uint32_t *mask, int width){    const uint32_t *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 (uint32_t *dest, uint32_t *src, uint32_t *mask, int width){    const uint32_t *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 (uint32_t *dest, uint32_t *src, uint32_t *mask, int width){    const uint32_t *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 (uint32_t *dest, uint32_t *src, uint32_t *mask, int width){    const uint32_t *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 (uint32_t *dest, uint32_t *src, uint32_t *mask, int width){    const uint32_t *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 (uint32_t *dest, uint32_t *src, uint32_t *mask, int width){    const uint32_t *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 (uint32_t *dest, uint32_t *src, uint32_t *mask, int width){    const uint32_t *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 (uint32_t *dest, uint32_t *src, uint32_t *mask, int width){    const uint32_t *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();}voidfbComposeSetupMMX(void){    static pixman_bool_t initialized = FALSE;    if (initialized)	return;        /* check if we have MMX support and initialize accordingly */    if (pixman_have_mmx())    {        pixman_composeFunctions.combineU[PIXMAN_OP_OVER] = mmxCombineOverU;        pixman_composeFunctions.combineU[PIXMAN_OP_OVER_REVERSE] = mmxCombineOverReverseU;        pixman_composeFunctions.combineU[PIXMAN_OP_IN] = mmxCombineInU;        pixman_composeFunctions.combineU[PIXMAN_OP_IN_REVERSE] = mmxCombineInReverseU;        pixman_composeFunctions.combineU[PIXMAN_OP_OUT] = mmxCombineOutU;        pixman_composeFunctions.combineU[PIXMAN_OP_OUT_REVERSE] = mmxCombineOutReverseU;        pixman_composeFunctions.combineU[PIXMAN_OP_ATOP] = mmxCombineAtopU;        pixman_composeFunctions.combineU[PIXMAN_OP_ATOP_REVERSE] = mmxCombineAtopReverseU;        pixman_composeFunctions.combineU[PIXMAN_OP_XOR] = mmxCombineXorU;        pixman_composeFunctions.combineU[PIXMAN_OP_ADD] = mmxCombineAddU;        pixman_composeFunctions.combineU[PIXMAN_OP_SATURATE] = mmxCombineSaturateU;        pixman_composeFunctions.combineC[PIXMAN_OP_SRC] = mmxCombineSrcC;        pixman_composeFunctions.combineC[PIXMAN_OP_OVER] = mmxCombineOverC;        pixman_composeFunctions.combineC[PIXMAN_OP_OVER_REVERSE] = mmxCombineOverReverseC;        pixman_composeFunctions.combineC[PIXMAN_OP_IN] = mmxCombineInC;        pixman_composeFunctions.combineC[PIXMAN_OP_IN_REVERSE] = mmxCombineInReverseC;        pixman_composeFunctions.combineC[PIXMAN_OP_OUT] = mmxCombineOutC;        pixman_composeFunctions.combineC[PIXMAN_OP_OUT_REVERSE] = mmxCombineOutReverseC;        pixman_composeFunctions.combineC[PIXMAN_OP_ATOP] = mmxCombineAtopC;        pixman_composeFunctions.combineC[PIXMAN_OP_ATOP_REVERSE] = mmxCombineAtopReverseC;        pixman_composeFunctions.combineC[PIXMAN_OP_XOR] = mmxCombineXorC;        pixman_composeFunctions.combineC[PIXMAN_OP_ADD] = mmxCombineAddC;        pixman_composeFunctions.combineMaskU = mmxCombineMaskU;    }    initialized = TRUE;}/* ------------------ MMX code paths called from fbpict.c ----------------------- */voidfbCompositeSolid_nx8888mmx (pixman_op_t op,			    pixman_image_t * pSrc,			    pixman_image_t * pMask,			    pixman_image_t * pDst,			    int16_t	xSrc,			    int16_t	ySrc,			    int16_t	xMask,			    int16_t	yMask,			    int16_t	xDst,			    int16_t	yDst,			    uint16_t	width,			    uint16_t	height){    uint32_t	src;    uint32_t	*dstLine, *dst;    uint16_t	w;    int	dstStride;    __m64	vsrc, vsrca;    CHECKPOINT();    fbComposeGetSolid(pSrc, src, pDst->bits.format);    if (src >> 24 == 0)	return;    fbComposeGetStart (pDst, xDst, yDst, uint32_t, 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_op_t op,			    pixman_image_t * pSrc,			    pixman_image_t * pMask,			    pixman_image_t * pDst,			    int16_t	xSrc,			    int16_t	ySrc,			    int16_t	xMask,			    int16_t	yMask,			    int16_t	xDst,			    int16_t	yDst,			    uint16_t	width,			    uint16_t	height){    uint32_t	src;    uint16_t	*dstLine, *dst;    uint16_t	w;    int	dstStride;    __m64	vsrc, vsrca;    CHECKPOINT();    fbComposeGetSolid(pSrc, src, pDst->bits.format);    if (src >> 24 == 0)	return;    fbComposeGetStart (pDst, xDst, yDst, uint16_t, 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_op_t op,				      pixman_image_t * pSrc,				      pixman_image_t * pMask,				      pixman_image_t * pDst,				      int16_t	xSrc,				      int16_t	ySrc,				      int16_t	xMask,				      int16_t	yMask,				      int16_t	xDst,				      int16_t	yDst,				      uint16_t	width,				      uint16_t	height){    uint32_t	src, srca;    uint32_t	*dstLine;    uint32_t	*maskLine;    int	dstStride, maskStride;    __m64	vsrc, vsrca;    CHECKPOINT();    fbComposeGetSolid(pSrc, src, pDst->bits.format);    srca = src >> 24;    if (srca == 0)	return;    fbComposeGetStart (pDst, xDst, yDst, uint32_t, dstStride, dstLine, 1);    fbComposeGetStart (pMask, xMask, yMask, uint32_t, maskStride, maskLine, 1);    vsrc = load8888(src);    vsrca = expand_alpha(vsrc);    while (height--)    {	int twidth = width;	uint32_t *p = (uint32_t *)maskLine;	uint32_t *q = (uint32_t *)dstLine;	while (twidth && (unsigned long)q & 7)	{	    uint32_t m = *(uint32_t *)p;	    if (m)	    {		__m64 vdest = load8888(*q);		vdest = in_over(vsrc, vsrca, load8888(m), vdest);		*q = store8888(vdest);	    }	    twidth--;	    p++;	    q++;	}	while (twidth >= 2)	{	    uint32_t 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)	{	    uint32_t m = *(uint32_t *)p;	    if (m)

⌨️ 快捷键说明

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