graphicscomposition/openwfcompositionengine/common/src/owfimage.c
branchNewGraphicsArchitecture
changeset 34 76efc8f9f7b4
parent 0 5d03bc08d59c
child 35 3aa07f06a4b7
--- 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;
         }