FEComponentTransfer could be faster.
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 14 Aug 2013 07:49:22 +0000 (07:49 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 14 Aug 2013 07:49:22 +0000 (07:49 +0000)
https://bugs.webkit.org/show_bug.cgi?id=119671

Patch by Jinwoo Jeong <jw00.jeong@samsung.com> on 2013-08-14
Reviewed by Christophe Dumez.

Use direct writing to target data instead of calling Uint8ClampedArray::set() function.
This change reduces at least 80% time in the loop of that function.

The Uint8ClampedArray::set() function has index checking code, value checking code and value casting code.
But the index is managed by for loop condition, the value is generated by transferFunction.
And the value is already defined as unsigned char.
Thus all works in Uint8ClampedArray::set() function is redundant.
Removing the call to Uint8ClampedArray::set() function does not reduce stability but improves performance.

* platform/graphics/filters/FEComponentTransfer.cpp:
(WebCore::FEComponentTransfer::platformApplySoftware):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@154042 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/platform/graphics/filters/FEComponentTransfer.cpp

index 5594d7b631de6c0e994c36087a7c95afc6c806a0..ca0435c7cdf520c7b566847f8ac74ec43a591466 100644 (file)
@@ -1,3 +1,22 @@
+2013-08-14  Jinwoo Jeong  <jw00.jeong@samsung.com>
+
+        FEComponentTransfer could be faster.
+        https://bugs.webkit.org/show_bug.cgi?id=119671
+
+        Reviewed by Christophe Dumez.
+
+        Use direct writing to target data instead of calling Uint8ClampedArray::set() function.
+        This change reduces at least 80% time in the loop of that function.
+
+        The Uint8ClampedArray::set() function has index checking code, value checking code and value casting code.
+        But the index is managed by for loop condition, the value is generated by transferFunction.
+        And the value is already defined as unsigned char.
+        Thus all works in Uint8ClampedArray::set() function is redundant.
+        Removing the call to Uint8ClampedArray::set() function does not reduce stability but improves performance.
+
+        * platform/graphics/filters/FEComponentTransfer.cpp:
+        (WebCore::FEComponentTransfer::platformApplySoftware):
+
 2013-08-13  Gyuyoung Kim  <gyuyoung.kim@samsung.com>
 
         The length of scheme is at least five characters even when the scheme has 'web+' prefix
index e494b08bd1f066cf02d99102756e1079c25bf9df..8fa4f35f8d859ce17f2ffbf9d6191fd83115aee9 100644 (file)
@@ -166,10 +166,11 @@ void FEComponentTransfer::platformApplySoftware()
     in->copyUnmultipliedImage(pixelArray, drawingRect);
 
     unsigned pixelArrayLength = pixelArray->length();
+    unsigned char* data = pixelArray->data();
     for (unsigned pixelOffset = 0; pixelOffset < pixelArrayLength; pixelOffset += 4) {
         for (unsigned channel = 0; channel < 4; ++channel) {
-            unsigned char c = pixelArray->item(pixelOffset + channel);
-            pixelArray->set(pixelOffset + channel, tables[channel][c]);
+            unsigned char c = data[pixelOffset + channel];
+            data[pixelOffset + channel] = tables[channel][c];
         }
     }
 }