graphicscomposition/openwfcompositionengine/common/src/owfimage.c
branchNewGraphicsArchitecture
changeset 34 76efc8f9f7b4
parent 0 5d03bc08d59c
child 35 3aa07f06a4b7
equal deleted inserted replaced
28:c0155353733c 34:76efc8f9f7b4
   292     
   292     
   293         switch (src->format.pixelFormat)
   293         switch (src->format.pixelFormat)
   294         {
   294         {
   295             case OWF_IMAGE_ARGB8888:
   295             case OWF_IMAGE_ARGB8888:
   296             {
   296             {
       
   297 #ifdef USE_FLOAT_PIXEL
   297                 OWFuint32* srcPtr = (OWFuint32*) srcLinePtr;
   298                 OWFuint32* srcPtr = (OWFuint32*) srcLinePtr;
   298     
   299     
   299                 while (count > 0)
   300                 while (count > 0)
   300                 {
   301                 {
   301                     dstPtr->color.alpha = (OWFsubpixel)
   302                     dstPtr->color.alpha = (OWFsubpixel)
   308                         OWF_BLUE_MAX_VALUE * ((*srcPtr & ARGB8888_BLUE_MASK) >> ARGB8888_BLUE_SHIFT) / OWF_BYTE_MAX_VALUE;
   309                         OWF_BLUE_MAX_VALUE * ((*srcPtr & ARGB8888_BLUE_MASK) >> ARGB8888_BLUE_SHIFT) / OWF_BYTE_MAX_VALUE;
   309                     dstPtr ++;
   310                     dstPtr ++;
   310                     srcPtr ++;
   311                     srcPtr ++;
   311                     count--;
   312                     count--;
   312                 }
   313                 }
       
   314 #else
       
   315                 memcpy(dstLinePtr, srcLinePtr, src->stride);
       
   316 #endif
   313                 break;
   317                 break;
   314             }
   318             }
   315     
   319     
   316             case OWF_IMAGE_XRGB8888:
   320             case OWF_IMAGE_XRGB8888:
   317             {
   321             {
   318                 OWFuint32* srcPtr = (OWFuint32*) srcLinePtr;
   322                 OWFuint32* srcPtr = (OWFuint32*) srcLinePtr;
   319                 
   323                 
   320                 while (count > 0)
   324                 while (count > 0)
   321                 {
   325                 {
       
   326 #ifdef USE_FLOAT_PIXEL
   322                     dstPtr->color.alpha = OWF_FULLY_OPAQUE;
   327                     dstPtr->color.alpha = OWF_FULLY_OPAQUE;
   323                     dstPtr->color.red   = (OWFsubpixel)
   328                     dstPtr->color.red   = (OWFsubpixel)
   324                         OWF_RED_MAX_VALUE * ((*srcPtr & ARGB8888_RED_MASK) >> ARGB8888_RED_SHIFT) / OWF_BYTE_MAX_VALUE;
   329                         OWF_RED_MAX_VALUE * ((*srcPtr & ARGB8888_RED_MASK) >> ARGB8888_RED_SHIFT) / OWF_BYTE_MAX_VALUE;
   325                     dstPtr->color.green = (OWFsubpixel)
   330                     dstPtr->color.green = (OWFsubpixel)
   326                         OWF_GREEN_MAX_VALUE * ((*srcPtr & ARGB8888_GREEN_MASK) >> ARGB8888_GREEN_SHIFT) / OWF_BYTE_MAX_VALUE;
   331                         OWF_GREEN_MAX_VALUE * ((*srcPtr & ARGB8888_GREEN_MASK) >> ARGB8888_GREEN_SHIFT) / OWF_BYTE_MAX_VALUE;
   327                     dstPtr->color.blue  = (OWFsubpixel)
   332                     dstPtr->color.blue  = (OWFsubpixel)
   328                         OWF_BLUE_MAX_VALUE * ((*srcPtr & ARGB8888_BLUE_MASK) >> ARGB8888_BLUE_SHIFT) / OWF_BYTE_MAX_VALUE;
   333                         OWF_BLUE_MAX_VALUE * ((*srcPtr & ARGB8888_BLUE_MASK) >> ARGB8888_BLUE_SHIFT) / OWF_BYTE_MAX_VALUE;
       
   334 #else
       
   335                     *(OWFuint32*)dstPtr = *srcPtr | ARGB8888_ALPHA_MASK;
       
   336 #endif
   329                     dstPtr ++;
   337                     dstPtr ++;
   330                     srcPtr ++;
   338                     srcPtr ++;
   331                     count--;
   339                     count--;
   332                 }
   340                 }
   333                 break;
   341                 break;
   448 OWF_Image_DestinationFormatConversion(OWF_IMAGE* dst, OWF_IMAGE* src)
   456 OWF_Image_DestinationFormatConversion(OWF_IMAGE* dst, OWF_IMAGE* src)
   449 {
   457 {
   450     OWFint                  countY;
   458     OWFint                  countY;
   451     OWFuint32*              dstPtr;
   459     OWFuint32*              dstPtr;
   452     OWFpixel*               srcPtr;
   460     OWFpixel*               srcPtr;
       
   461     OWFuint8*               destination;
   453 
   462 
   454     OWF_ASSERT(dst != 0 && dst->data != NULL);
   463     OWF_ASSERT(dst != 0 && dst->data != NULL);
   455     OWF_ASSERT(src != 0 && src->data != NULL);
   464     OWF_ASSERT(src != 0 && src->data != NULL);
   456     OWF_ASSERT(src->format.pixelFormat==OWF_IMAGE_ARGB_INTERNAL);
   465     OWF_ASSERT(src->format.pixelFormat==OWF_IMAGE_ARGB_INTERNAL);
   457 
   466 
   476     else if (!dst->format.premultiplied && src->format.premultiplied)
   485     else if (!dst->format.premultiplied && src->format.premultiplied)
   477     {
   486     {
   478         OWF_Image_UnpremultiplyAlpha(src);
   487         OWF_Image_UnpremultiplyAlpha(src);
   479     }
   488     }
   480 
   489 
       
   490     destination = (OWFuint8*) dst->data;
   481     for (countY = 0; countY < src->height; countY++)
   491     for (countY = 0; countY < src->height; countY++)
   482     {   
   492     {   
   483         OWFuint8* destination = (OWFuint8*) dst->data;
       
   484         destination += countY*dst->stride;
       
   485         dstPtr = (OWFuint32*) destination;    
   493         dstPtr = (OWFuint32*) destination;    
   486     
   494         destination += dst->stride;
       
   495 
   487         switch (dst->format.pixelFormat)
   496         switch (dst->format.pixelFormat)
   488         {
   497         {
   489             case OWF_IMAGE_ARGB8888:
   498             case OWF_IMAGE_ARGB8888:
   490             {
   499             {
       
   500 #ifdef USE_FLOAT_PIXEL
   491                 OWFint countX;
   501                 OWFint countX;
   492                 OWFuint32 dstPixel = 0;               
   502                 OWFuint32 dstPixel = 0;               
   493                 
   503                 
   494                 for (countX = 0; countX < src->width; countX++)
   504                 for (countX = 0; countX < src->width; countX++)
   495                 {
   505                 {
   503                                 ARGB8888_BLUE_SHIFT);
   513                                 ARGB8888_BLUE_SHIFT);
   504                     *dstPtr = dstPixel;
   514                     *dstPtr = dstPixel;
   505                     dstPtr ++;
   515                     dstPtr ++;
   506                     srcPtr ++;
   516                     srcPtr ++;
   507                 }
   517                 }
       
   518 #else
       
   519                 memcpy(dstPtr, srcPtr, src->stride);
       
   520                 srcPtr = (OWFpixel*)((OWFuint8*)srcPtr + src->stride);
       
   521 #endif
   508                 break;
   522                 break;
   509             }
   523             }
   510     
   524     
   511             case OWF_IMAGE_XRGB8888:
   525             case OWF_IMAGE_XRGB8888:
   512             {
   526             {
       
   527 #ifdef USE_FLOAT_PIXEL
   513                 OWFint countX;
   528                 OWFint countX;
   514                 OWFuint32 dstPixel = 0;
   529                 OWFuint32 dstPixel = 0;
   515                 
   530                 
   516                 for (countX = 0; countX < src->width; countX++)
   531                 for (countX = 0; countX < src->width; countX++)
   517                 {
   532                 {
   524                                 ARGB8888_BLUE_SHIFT);
   539                                 ARGB8888_BLUE_SHIFT);
   525                     *dstPtr = dstPixel;
   540                     *dstPtr = dstPixel;
   526                     dstPtr ++;
   541                     dstPtr ++;
   527                     srcPtr ++;
   542                     srcPtr ++;
   528                 }
   543                 }
       
   544 #else
       
   545                 memcpy(dstPtr, srcPtr, src->stride);
       
   546                 srcPtr = (OWFpixel*)((OWFuint8*)srcPtr + src->stride);
       
   547 #endif
   529                 break;
   548                 break;
   530             }
   549             }
   531     
   550     
   532             default:
   551             default:
   533             {
   552             {
  1404 #define BLENDER_INNER_LOOP_END \
  1423 #define BLENDER_INNER_LOOP_END \
  1405                 DA = blend->destinationFullyOpaque ? OWF_FULLY_OPAQUE : DA; \
  1424                 DA = blend->destinationFullyOpaque ? OWF_FULLY_OPAQUE : DA; \
  1406             } /* end tsColor check */ \
  1425             } /* end tsColor check */ \
  1407             srcPtr ++; \
  1426             srcPtr ++; \
  1408             dstPtr ++; \
  1427             dstPtr ++; \
       
  1428             --colCount; \
       
  1429         } \
       
  1430         srcPtr += srcLineDelta; \
       
  1431         dstPtr += dstLineDelta; \
       
  1432         --rowCount; \
       
  1433     }
       
  1434 
       
  1435 #define BLENDER_INNER_LOOP_END_WITH_MASK \
       
  1436                 DA = blend->destinationFullyOpaque ? OWF_FULLY_OPAQUE : DA; \
       
  1437             } /* end tsColor check */ \
       
  1438             srcPtr ++; \
       
  1439             dstPtr ++; \
  1409             maskPtr++; \
  1440             maskPtr++; \
  1410             --colCount; \
  1441             --colCount; \
  1411         } \
  1442         } \
  1412         srcPtr += srcLineDelta; \
  1443         srcPtr += srcLineDelta; \
  1413         dstPtr += dstLineDelta; \
  1444         dstPtr += dstLineDelta; \
  1536         maskLineDelta = 0;
  1567         maskLineDelta = 0;
  1537     }
  1568     }
  1538     srcLineDelta = src->width - srect.width;
  1569     srcLineDelta = src->width - srect.width;
  1539     dstLineDelta = dst->width - drect.width;
  1570     dstLineDelta = dst->width - drect.width;
  1540 
  1571 
       
  1572     if ((transparency & OWF_TRANSPARENCY_GLOBAL_ALPHA) && (GA > (OWF_ALPHA_MAX_VALUE - OWF_ALPHA_MIN_STEP_VALUE)))
       
  1573         {
       
  1574         /* Fully opaque, so ignore global alpha */
       
  1575         transparency &= ~OWF_TRANSPARENCY_GLOBAL_ALPHA;
       
  1576         }
  1541     /* inner loops */
  1577     /* inner loops */
  1542     switch (transparency)
  1578     switch (transparency)
  1543     {
  1579     {
  1544         case OWF_TRANSPARENCY_NONE:
  1580         case OWF_TRANSPARENCY_NONE:
  1545         {
  1581         {
       
  1582 #ifdef SLOW_CODE
  1546             /*
  1583             /*
  1547             rgb     = src.rgb
  1584             rgb     = src.rgb
  1548             alpha    = 1
  1585             alpha    = 1
  1549             */
  1586             */
  1550             BLENDER_INNER_LOOP_BEGIN;
  1587             BLENDER_INNER_LOOP_BEGIN;
  1551                 DR = SR;
  1588                 DR = SR;
  1552                 DG = SG;
  1589                 DG = SG;
  1553                 DB = SB;
  1590                 DB = SB;
  1554                 DA = OWF_FULLY_OPAQUE;
  1591                 DA = OWF_FULLY_OPAQUE;
  1555             BLENDER_INNER_LOOP_END;
  1592             BLENDER_INNER_LOOP_END;
       
  1593 #else
       
  1594             memcpy(dstPtr, srcPtr, drect.height*drect.width*4);
       
  1595 #endif
  1556             break;
  1596             break;
  1557         }
  1597         }
  1558 
  1598 
  1559         case OWF_TRANSPARENCY_GLOBAL_ALPHA:
  1599         case OWF_TRANSPARENCY_GLOBAL_ALPHA:
  1560         {
  1600         {
  1580             /*
  1620             /*
  1581             rgb     = src.rgb + dst.rgb * (1 - src.alpha)
  1621             rgb     = src.rgb + dst.rgb * (1 - src.alpha)
  1582             alpha    = src.alpha + dst.alpha * (1 - src.alpha)
  1622             alpha    = src.alpha + dst.alpha * (1 - src.alpha)
  1583             */
  1623             */
  1584             BLENDER_INNER_LOOP_BEGIN;
  1624             BLENDER_INNER_LOOP_BEGIN;
  1585                 DR = SR + (DR * (OWF_FULLY_OPAQUE - SA) + OWF_BLEND_ROUNDING_VALUE) / OWF_ALPHA_MAX_VALUE;
  1625                 if (SA > (OWF_ALPHA_MAX_VALUE - OWF_ALPHA_MIN_STEP_VALUE))
  1586                 DG = SG + (DG * (OWF_FULLY_OPAQUE - SA) + OWF_BLEND_ROUNDING_VALUE) / OWF_ALPHA_MAX_VALUE;
  1626                     {
  1587                 DB = SB + (DB * (OWF_FULLY_OPAQUE - SA) + OWF_BLEND_ROUNDING_VALUE) / OWF_ALPHA_MAX_VALUE;
  1627                     /* Fully opaque source pixel */
  1588                 DA = SA + (DA * (OWF_FULLY_OPAQUE - SA) + OWF_BLEND_ROUNDING_VALUE) / OWF_ALPHA_MAX_VALUE;
  1628                     DR = SR;
       
  1629                     DG = SG;
       
  1630                     DB = SB;
       
  1631                     DA = OWF_FULLY_OPAQUE;
       
  1632                     }
       
  1633                 else
       
  1634                     {
       
  1635                     if (SA >= OWF_ALPHA_MIN_STEP_VALUE)
       
  1636                         {
       
  1637                         /* Not fully transparent source pixel */
       
  1638                        /*
       
  1639                         * DR = SR + (DR * (OWF_FULLY_OPAQUE - SA) + OWF_BLEND_ROUNDING_VALUE) / OWF_ALPHA_MAX_VALUE;
       
  1640                         */ 
       
  1641                         DR = SR + (DR * (OWF_FULLY_OPAQUE - SA) + OWF_BLEND_ROUNDING_VALUE) >> 8;
       
  1642                         DG = SG + (DG * (OWF_FULLY_OPAQUE - SA) + OWF_BLEND_ROUNDING_VALUE) >> 8;
       
  1643                         DB = SB + (DB * (OWF_FULLY_OPAQUE - SA) + OWF_BLEND_ROUNDING_VALUE) >> 8;
       
  1644                         DA = SA + (DA * (OWF_FULLY_OPAQUE - SA) + OWF_BLEND_ROUNDING_VALUE) >> 8;
       
  1645                         }
       
  1646                     }
  1589             BLENDER_INNER_LOOP_END;
  1647             BLENDER_INNER_LOOP_END;
  1590             break;
  1648             break;
  1591         }
  1649         }
  1592 
  1650 
  1593         case OWF_TRANSPARENCY_MASK:
  1651         case OWF_TRANSPARENCY_MASK:
  1603                      OWF_ALPHA_MAX_VALUE;
  1661                      OWF_ALPHA_MAX_VALUE;
  1604                 DB = (SB * MA + DB * (OWF_FULLY_OPAQUE - MA) + OWF_BLEND_ROUNDING_VALUE) /
  1662                 DB = (SB * MA + DB * (OWF_FULLY_OPAQUE - MA) + OWF_BLEND_ROUNDING_VALUE) /
  1605                      OWF_ALPHA_MAX_VALUE;
  1663                      OWF_ALPHA_MAX_VALUE;
  1606                 DA = MA + (DA * (OWF_FULLY_OPAQUE - MA) + OWF_BLEND_ROUNDING_VALUE) / 
  1664                 DA = MA + (DA * (OWF_FULLY_OPAQUE - MA) + OWF_BLEND_ROUNDING_VALUE) / 
  1607                      OWF_ALPHA_MAX_VALUE;
  1665                      OWF_ALPHA_MAX_VALUE;
  1608             BLENDER_INNER_LOOP_END;
  1666             BLENDER_INNER_LOOP_END_WITH_MASK;
  1609             break;
  1667             break;
  1610         }
  1668         }
  1611 
  1669 
  1612         case OWF_TRANSPARENCY_GLOBAL_ALPHA | OWF_TRANSPARENCY_SOURCE_ALPHA:
  1670         case OWF_TRANSPARENCY_GLOBAL_ALPHA | OWF_TRANSPARENCY_SOURCE_ALPHA:
  1613         {
  1671         {
  1649                      OWF_ALPHA_MAX_VALUE;
  1707                      OWF_ALPHA_MAX_VALUE;
  1650                 DA = MAEA + (DA * (OWF_FULLY_OPAQUE - MAEA) + OWF_BLEND_ROUNDING_VALUE) /
  1708                 DA = MAEA + (DA * (OWF_FULLY_OPAQUE - MAEA) + OWF_BLEND_ROUNDING_VALUE) /
  1651                      OWF_ALPHA_MAX_VALUE;
  1709                      OWF_ALPHA_MAX_VALUE;
  1652                 //No need to check with OWF_ALPHA_MIN_VALUE as it is zero
  1710                 //No need to check with OWF_ALPHA_MIN_VALUE as it is zero
  1653                 OWF_ASSERT(GA <= OWF_ALPHA_MAX_VALUE);
  1711                 OWF_ASSERT(GA <= OWF_ALPHA_MAX_VALUE);
  1654             BLENDER_INNER_LOOP_END;
  1712             BLENDER_INNER_LOOP_END_WITH_MASK;
  1655             break;
  1713             break;
  1656         }
  1714         }
  1657 
  1715 
  1658         default:
  1716         default:
  1659         {
  1717         {