diff -r c0155353733c -r 76efc8f9f7b4 graphicscomposition/openwfcompositionengine/common/src/owfimage.c --- a/graphicscomposition/openwfcompositionengine/common/src/owfimage.c Fri Apr 02 11:19:42 2010 +0100 +++ b/graphicscomposition/openwfcompositionengine/common/src/owfimage.c Tue Apr 20 16:24:43 2010 +0100 @@ -294,6 +294,7 @@ { case OWF_IMAGE_ARGB8888: { +#ifdef USE_FLOAT_PIXEL OWFuint32* srcPtr = (OWFuint32*) srcLinePtr; while (count > 0) @@ -310,6 +311,9 @@ srcPtr ++; count--; } +#else + memcpy(dstLinePtr, srcLinePtr, src->stride); +#endif break; } @@ -319,6 +323,7 @@ while (count > 0) { +#ifdef USE_FLOAT_PIXEL dstPtr->color.alpha = OWF_FULLY_OPAQUE; dstPtr->color.red = (OWFsubpixel) OWF_RED_MAX_VALUE * ((*srcPtr & ARGB8888_RED_MASK) >> ARGB8888_RED_SHIFT) / OWF_BYTE_MAX_VALUE; @@ -326,6 +331,9 @@ OWF_GREEN_MAX_VALUE * ((*srcPtr & ARGB8888_GREEN_MASK) >> ARGB8888_GREEN_SHIFT) / OWF_BYTE_MAX_VALUE; dstPtr->color.blue = (OWFsubpixel) OWF_BLUE_MAX_VALUE * ((*srcPtr & ARGB8888_BLUE_MASK) >> ARGB8888_BLUE_SHIFT) / OWF_BYTE_MAX_VALUE; +#else + *(OWFuint32*)dstPtr = *srcPtr | ARGB8888_ALPHA_MASK; +#endif dstPtr ++; srcPtr ++; count--; @@ -450,6 +458,7 @@ OWFint countY; OWFuint32* dstPtr; OWFpixel* srcPtr; + OWFuint8* destination; OWF_ASSERT(dst != 0 && dst->data != NULL); OWF_ASSERT(src != 0 && src->data != NULL); @@ -478,16 +487,17 @@ OWF_Image_UnpremultiplyAlpha(src); } + destination = (OWFuint8*) dst->data; for (countY = 0; countY < src->height; countY++) { - OWFuint8* destination = (OWFuint8*) dst->data; - destination += countY*dst->stride; dstPtr = (OWFuint32*) destination; - + destination += dst->stride; + switch (dst->format.pixelFormat) { case OWF_IMAGE_ARGB8888: { +#ifdef USE_FLOAT_PIXEL OWFint countX; OWFuint32 dstPixel = 0; @@ -505,11 +515,16 @@ dstPtr ++; srcPtr ++; } +#else + memcpy(dstPtr, srcPtr, src->stride); + srcPtr = (OWFpixel*)((OWFuint8*)srcPtr + src->stride); +#endif break; } case OWF_IMAGE_XRGB8888: { +#ifdef USE_FLOAT_PIXEL OWFint countX; OWFuint32 dstPixel = 0; @@ -526,6 +541,10 @@ dstPtr ++; srcPtr ++; } +#else + memcpy(dstPtr, srcPtr, src->stride); + srcPtr = (OWFpixel*)((OWFuint8*)srcPtr + src->stride); +#endif break; } @@ -1406,6 +1425,18 @@ } /* end tsColor check */ \ srcPtr ++; \ dstPtr ++; \ + --colCount; \ + } \ + srcPtr += srcLineDelta; \ + dstPtr += dstLineDelta; \ + --rowCount; \ + } + +#define BLENDER_INNER_LOOP_END_WITH_MASK \ + DA = blend->destinationFullyOpaque ? OWF_FULLY_OPAQUE : DA; \ + } /* end tsColor check */ \ + srcPtr ++; \ + dstPtr ++; \ maskPtr++; \ --colCount; \ } \ @@ -1538,11 +1569,17 @@ srcLineDelta = src->width - srect.width; dstLineDelta = dst->width - drect.width; + if ((transparency & OWF_TRANSPARENCY_GLOBAL_ALPHA) && (GA > (OWF_ALPHA_MAX_VALUE - OWF_ALPHA_MIN_STEP_VALUE))) + { + /* Fully opaque, so ignore global alpha */ + transparency &= ~OWF_TRANSPARENCY_GLOBAL_ALPHA; + } /* inner loops */ switch (transparency) { case OWF_TRANSPARENCY_NONE: { +#ifdef SLOW_CODE /* rgb = src.rgb alpha = 1 @@ -1553,6 +1590,9 @@ DB = SB; DA = OWF_FULLY_OPAQUE; BLENDER_INNER_LOOP_END; +#else + memcpy(dstPtr, srcPtr, drect.height*drect.width*4); +#endif break; } @@ -1582,10 +1622,28 @@ alpha = src.alpha + dst.alpha * (1 - src.alpha) */ BLENDER_INNER_LOOP_BEGIN; - DR = SR + (DR * (OWF_FULLY_OPAQUE - SA) + OWF_BLEND_ROUNDING_VALUE) / OWF_ALPHA_MAX_VALUE; - DG = SG + (DG * (OWF_FULLY_OPAQUE - SA) + OWF_BLEND_ROUNDING_VALUE) / OWF_ALPHA_MAX_VALUE; - DB = SB + (DB * (OWF_FULLY_OPAQUE - SA) + OWF_BLEND_ROUNDING_VALUE) / OWF_ALPHA_MAX_VALUE; - DA = SA + (DA * (OWF_FULLY_OPAQUE - SA) + OWF_BLEND_ROUNDING_VALUE) / OWF_ALPHA_MAX_VALUE; + if (SA > (OWF_ALPHA_MAX_VALUE - OWF_ALPHA_MIN_STEP_VALUE)) + { + /* Fully opaque source pixel */ + DR = SR; + DG = SG; + DB = SB; + DA = OWF_FULLY_OPAQUE; + } + else + { + if (SA >= OWF_ALPHA_MIN_STEP_VALUE) + { + /* Not fully transparent source pixel */ + /* + * DR = SR + (DR * (OWF_FULLY_OPAQUE - SA) + OWF_BLEND_ROUNDING_VALUE) / OWF_ALPHA_MAX_VALUE; + */ + DR = SR + (DR * (OWF_FULLY_OPAQUE - SA) + OWF_BLEND_ROUNDING_VALUE) >> 8; + DG = SG + (DG * (OWF_FULLY_OPAQUE - SA) + OWF_BLEND_ROUNDING_VALUE) >> 8; + DB = SB + (DB * (OWF_FULLY_OPAQUE - SA) + OWF_BLEND_ROUNDING_VALUE) >> 8; + DA = SA + (DA * (OWF_FULLY_OPAQUE - SA) + OWF_BLEND_ROUNDING_VALUE) >> 8; + } + } BLENDER_INNER_LOOP_END; break; } @@ -1605,7 +1663,7 @@ OWF_ALPHA_MAX_VALUE; DA = MA + (DA * (OWF_FULLY_OPAQUE - MA) + OWF_BLEND_ROUNDING_VALUE) / OWF_ALPHA_MAX_VALUE; - BLENDER_INNER_LOOP_END; + BLENDER_INNER_LOOP_END_WITH_MASK; break; } @@ -1651,7 +1709,7 @@ OWF_ALPHA_MAX_VALUE; //No need to check with OWF_ALPHA_MIN_VALUE as it is zero OWF_ASSERT(GA <= OWF_ALPHA_MAX_VALUE); - BLENDER_INNER_LOOP_END; + BLENDER_INNER_LOOP_END_WITH_MASK; break; }