Title: [90676] trunk/Source/WebCore
Revision
90676
Author
[email protected]
Date
2011-07-08 23:05:14 -0700 (Fri, 08 Jul 2011)

Log Message

Refactoring luminance code in RenderSVGResourceMasker
https://bugs.webkit.org/show_bug.cgi?id=64146

Reviewed by Simon Fraser.

Moved luminance calculcation code to ImageBuffer. The code is doing pixel manipulations and can now get replaced
by platform specific algorithms in the ImmageBuffer*.cpp files.

No change of functionality. No new tests.

* WebCore.xcodeproj/project.pbxproj:
* platform/graphics/ImageBuffer.cpp:
(WebCore::ImageBuffer::transformColorSpace):
(WebCore::ImageBuffer::genericConvertToLuminanceMask):
(WebCore::ImageBuffer::convertToLuminanceMask):
* platform/graphics/ImageBuffer.h:
* rendering/svg/RenderSVGResourceMasker.cpp:
(WebCore::RenderSVGResourceMasker::drawContentIntoMaskImage):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (90675 => 90676)


--- trunk/Source/WebCore/ChangeLog	2011-07-09 00:43:14 UTC (rev 90675)
+++ trunk/Source/WebCore/ChangeLog	2011-07-09 06:05:14 UTC (rev 90676)
@@ -1,3 +1,24 @@
+2011-07-08  Dirk Schulze  <[email protected]>
+
+        Refactoring luminance code in RenderSVGResourceMasker
+        https://bugs.webkit.org/show_bug.cgi?id=64146
+
+        Reviewed by Simon Fraser.
+
+        Moved luminance calculcation code to ImageBuffer. The code is doing pixel manipulations and can now get replaced
+        by platform specific algorithms in the ImmageBuffer*.cpp files.
+
+        No change of functionality. No new tests.
+
+        * WebCore.xcodeproj/project.pbxproj:
+        * platform/graphics/ImageBuffer.cpp:
+        (WebCore::ImageBuffer::transformColorSpace):
+        (WebCore::ImageBuffer::genericConvertToLuminanceMask):
+        (WebCore::ImageBuffer::convertToLuminanceMask):
+        * platform/graphics/ImageBuffer.h:
+        * rendering/svg/RenderSVGResourceMasker.cpp:
+        (WebCore::RenderSVGResourceMasker::drawContentIntoMaskImage):
+
 2011-07-08  Simon Fraser  <[email protected]>
 
         Clean up RenderWidget::destroy() to share more code

Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (90675 => 90676)


--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2011-07-09 00:43:14 UTC (rev 90675)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2011-07-09 06:05:14 UTC (rev 90676)
@@ -1019,6 +1019,7 @@
 		43B9336913B261B1004584BF /* SVGAnimatedPointList.h in Headers */ = {isa = PBXBuildFile; fileRef = 43B9336713B261B1004584BF /* SVGAnimatedPointList.h */; };
 		43B9336A13B261B1004584BF /* SVGAnimatedPointList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43B9336813B261B1004584BF /* SVGAnimatedPointList.cpp */; };
 		43C092BC12D9E4EE00A989C3 /* RenderSVGForeignObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 43C092BA12D9E4EE00A989C3 /* RenderSVGForeignObject.h */; };
+		43D2597713C816F400608559 /* ImageBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43D2597613C816F400608559 /* ImageBuffer.cpp */; };
 		43F6FD9613BCD0B100224052 /* SVGAnimatedInteger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43F6FD9513BCD0B100224052 /* SVGAnimatedInteger.cpp */; };
 		4415292E0E1AE8A000C4A2D0 /* HTMLPlugInImageElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 4415292C0E1AE8A000C4A2D0 /* HTMLPlugInImageElement.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		4415292F0E1AE8A000C4A2D0 /* HTMLPlugInImageElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4415292D0E1AE8A000C4A2D0 /* HTMLPlugInImageElement.cpp */; };
@@ -7517,6 +7518,7 @@
 		43B9336813B261B1004584BF /* SVGAnimatedPointList.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGAnimatedPointList.cpp; sourceTree = "<group>"; };
 		43C092B912D9E4EE00A989C3 /* RenderSVGForeignObject.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderSVGForeignObject.cpp; sourceTree = "<group>"; };
 		43C092BA12D9E4EE00A989C3 /* RenderSVGForeignObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderSVGForeignObject.h; sourceTree = "<group>"; };
+		43D2597613C816F400608559 /* ImageBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ImageBuffer.cpp; sourceTree = "<group>"; };
 		43F6FD9513BCD0B100224052 /* SVGAnimatedInteger.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGAnimatedInteger.cpp; sourceTree = "<group>"; };
 		4415292C0E1AE8A000C4A2D0 /* HTMLPlugInImageElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTMLPlugInImageElement.h; sourceTree = "<group>"; };
 		4415292D0E1AE8A000C4A2D0 /* HTMLPlugInImageElement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HTMLPlugInImageElement.cpp; sourceTree = "<group>"; };
@@ -18052,6 +18054,7 @@
 				B27535400B053814002CE64F /* Icon.h */,
 				B27535410B053814002CE64F /* Image.cpp */,
 				B27535420B053814002CE64F /* Image.h */,
+				43D2597613C816F400608559 /* ImageBuffer.cpp */,
 				B2A10B910B3818BD00099AA4 /* ImageBuffer.h */,
 				22BD9F7D1353625C009BD102 /* ImageBufferData.h */,
 				BC7F44A70B9E324E00A9D081 /* ImageObserver.h */,
@@ -25871,6 +25874,7 @@
 				431A308813B8F978007791E4 /* SVGAnimatedBoolean.cpp in Sources */,
 				43F6FD9613BCD0B100224052 /* SVGAnimatedInteger.cpp in Sources */,
 				82889B4C13C62392009A6156 /* InspectorStyleTextEditor.cpp in Sources */,
+				43D2597713C816F400608559 /* ImageBuffer.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

Modified: trunk/Source/WebCore/platform/graphics/ImageBuffer.cpp (90675 => 90676)


--- trunk/Source/WebCore/platform/graphics/ImageBuffer.cpp	2011-07-09 00:43:14 UTC (rev 90675)
+++ trunk/Source/WebCore/platform/graphics/ImageBuffer.cpp	2011-07-09 06:05:14 UTC (rev 90676)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2009 Dirk Schulze <[email protected]>
+ * Copyright (C) Research In Motion Limited 2011. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -26,19 +27,18 @@
 #include "config.h"
 #include "ImageBuffer.h"
 
-#if !USE(CG)
+#include <wtf/MathExtras.h>
 
-#include <math.h>
-
 namespace WebCore {
 
+#if !USE(CG)
 void ImageBuffer::transformColorSpace(ColorSpace srcColorSpace, ColorSpace dstColorSpace)
 {
     if (srcColorSpace == dstColorSpace)
         return;
 
     // only sRGB <-> linearRGB are supported at the moment
-    if ((srcColorSpace != ColorSpaceLinearRGB && srcColorSpace != ColorSpaceDeviceRGB) 
+    if ((srcColorSpace != ColorSpaceLinearRGB && srcColorSpace != ColorSpaceDeviceRGB)
         || (dstColorSpace != ColorSpaceLinearRGB && dstColorSpace != ColorSpaceDeviceRGB))
         return;
 
@@ -66,7 +66,32 @@
         platformTransformColorSpace(m_deviceRgbLUT);
     }
 }
+#endif // USE(CG)
 
+inline void ImageBuffer::genericConvertToLuminanceMask()
+{
+    IntRect luminanceRect(IntPoint(), size());
+    RefPtr<ByteArray> srcPixelArray = getUnmultipliedImageData(luminanceRect);
+    
+    unsigned pixelArrayLength = srcPixelArray->length();
+    for (unsigned pixelOffset = 0; pixelOffset < pixelArrayLength; pixelOffset += 4) {
+        unsigned char a = srcPixelArray->get(pixelOffset + 3);
+        if (!a)
+            continue;
+        unsigned char r = srcPixelArray->get(pixelOffset);
+        unsigned char g = srcPixelArray->get(pixelOffset + 1);
+        unsigned char b = srcPixelArray->get(pixelOffset + 2);
+        
+        double luma = (r * 0.2125 + g * 0.7154 + b * 0.0721) * ((double)a / 255.0);
+        srcPixelArray->set(pixelOffset + 3, luma);
+    }
+    putUnmultipliedImageData(srcPixelArray.get(), luminanceRect.size(), luminanceRect, IntPoint());
 }
 
-#endif // USE(CG)
+void ImageBuffer::convertToLuminanceMask()
+{
+    // Add platform specific functions with platformConvertToLuminanceMask here later.
+    genericConvertToLuminanceMask();
+}
+
+}

Modified: trunk/Source/WebCore/platform/graphics/ImageBuffer.h (90675 => 90676)


--- trunk/Source/WebCore/platform/graphics/ImageBuffer.h	2011-07-09 00:43:14 UTC (rev 90675)
+++ trunk/Source/WebCore/platform/graphics/ImageBuffer.h	2011-07-09 06:05:14 UTC (rev 90676)
@@ -92,6 +92,8 @@
         void putUnmultipliedImageData(ByteArray*, const IntSize& sourceSize, const IntRect& sourceRect, const IntPoint& destPoint);
         void putPremultipliedImageData(ByteArray*, const IntSize& sourceSize, const IntRect& sourceRect, const IntPoint& destPoint);
         
+        void convertToLuminanceMask();
+        
         String toDataURL(const String& mimeType, const double* quality = 0) const;
 #if !USE(CG)
         AffineTransform baseTransform() const { return AffineTransform(); }
@@ -109,6 +111,9 @@
                              CompositeOperator = CompositeSourceOver, bool useLowQualityScale = false);
         void drawPattern(GraphicsContext*, const FloatRect& srcRect, const AffineTransform& patternTransform,
                          const FloatPoint& phase, ColorSpace styleColorSpace, CompositeOperator, const FloatRect& destRect);
+        
+        inline void genericConvertToLuminanceMask();
+
         friend class GraphicsContext;
         friend class GeneratedImage;
 

Modified: trunk/Source/WebCore/rendering/svg/RenderSVGResourceMasker.cpp (90675 => 90676)


--- trunk/Source/WebCore/rendering/svg/RenderSVGResourceMasker.cpp	2011-07-09 00:43:14 UTC (rev 90675)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGResourceMasker.cpp	2011-07-09 06:05:14 UTC (rev 90676)
@@ -159,23 +159,7 @@
 #endif
 
     // Create the luminance mask.
-    IntRect maskImageRect(IntPoint(), maskerData->maskImage->size());
-    RefPtr<ByteArray> srcPixelArray = maskerData->maskImage->getUnmultipliedImageData(maskImageRect);
-
-    unsigned pixelArrayLength = srcPixelArray->length();
-    for (unsigned pixelOffset = 0; pixelOffset < pixelArrayLength; pixelOffset += 4) {
-        unsigned char a = srcPixelArray->get(pixelOffset + 3);
-        if (!a)
-            continue;
-        unsigned char r = srcPixelArray->get(pixelOffset);
-        unsigned char g = srcPixelArray->get(pixelOffset + 1);
-        unsigned char b = srcPixelArray->get(pixelOffset + 2);
-
-        double luma = (r * 0.2125 + g * 0.7154 + b * 0.0721) * ((double)a / 255.0);
-        srcPixelArray->set(pixelOffset + 3, luma);
-    }
-
-    maskerData->maskImage->putUnmultipliedImageData(srcPixelArray.get(), maskImageRect.size(), maskImageRect, IntPoint());
+    maskerData->maskImage->convertToLuminanceMask();
 }
 
 void RenderSVGResourceMasker::calculateMaskContentRepaintRect()
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to