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()