PNGImageDecoder: Add ENABLE(IMAGE_DECODER_DOWN_SAMPLING) guards to rowAvailable
authornoel.gordon@gmail.com <noel.gordon@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 2 May 2012 02:52:32 +0000 (02:52 +0000)
committernoel.gordon@gmail.com <noel.gordon@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 2 May 2012 02:52:32 +0000 (02:52 +0000)
https://bugs.webkit.org/show_bug.cgi?id=85268

Reviewed by Eric Seidel.

PNGImageDecoder supports image downsampling. Add ENABLE guards to show where
downsampling is applied when outputting decoded rows to the frame buffer. Most
ports don't enable the flag: don't penalize them in terms speed in this tight
row pixel write loop. s/y/destY/ to match setRGBA() and amend some comments.

No new tests. No change in behavior.

* platform/image-decoders/png/PNGImageDecoder.cpp:
(WebCore::PNGImageDecoder::rowAvailable):

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

Source/WebCore/ChangeLog
Source/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp

index 0965a7d..ca3c598 100644 (file)
@@ -1,3 +1,20 @@
+2012-05-01  Noel Gordon  <noel.gordon@gmail.com>
+
+        PNGImageDecoder: Add ENABLE(IMAGE_DECODER_DOWN_SAMPLING) guards to rowAvailable
+        https://bugs.webkit.org/show_bug.cgi?id=85268
+
+        Reviewed by Eric Seidel.
+
+        PNGImageDecoder supports image downsampling. Add ENABLE guards to show where
+        downsampling is applied when outputting decoded rows to the frame buffer. Most
+        ports don't enable the flag: don't penalize them in terms speed in this tight
+        row pixel write loop. s/y/destY/ to match setRGBA() and amend some comments.
+
+        No new tests. No change in behavior.
+
+        * platform/image-decoders/png/PNGImageDecoder.cpp:
+        (WebCore::PNGImageDecoder::rowAvailable):
+
 2012-05-01  Eric Seidel  <eric@webkit.org>
 
         Remove uneeded min/max pref width assignment from RenderView
index bcca474..49216d0 100644 (file)
@@ -418,20 +418,32 @@ void PNGImageDecoder::rowAvailable(unsigned char* rowBuffer, unsigned rowIndex,
     } else
         row = rowBuffer;
 
-    // Copy the data into our buffer.
-    int width = scaledSize().width();
-    int destY = scaledY(rowIndex);
-
-    // Check that the row is within the image bounds. LibPNG may supply an extra row.
-    if (destY < 0 || destY >= scaledSize().height())
+    // Check the row is within the image bounds: libpng may supply an extra row.
+    int y = !m_scaled ? rowIndex : scaledY(rowIndex);
+    if (y < 0 || y >= scaledSize().height())
         return;
+
+    // Write the decoded row pixels to the frame buffer.
+    int width = scaledSize().width();
     bool nonTrivialAlpha = false;
+
+#if ENABLE(IMAGE_DECODER_DOWN_SAMPLING)
     for (int x = 0; x < width; ++x) {
         png_bytep pixel = row + (m_scaled ? m_scaledColumns[x] : x) * colorChannels;
         unsigned alpha = hasAlpha ? pixel[3] : 255;
-        buffer.setRGBA(x, destY, pixel[0], pixel[1], pixel[2], alpha);
+        buffer.setRGBA(x, y, pixel[0], pixel[1], pixel[2], alpha);
         nonTrivialAlpha |= alpha < 255;
     }
+#else
+    ASSERT(!m_scaled);
+    png_bytep pixel = row;
+    for (int x = 0; x < width; ++x, pixel += colorChannels) {
+        unsigned alpha = hasAlpha ? pixel[3] : 255;
+        buffer.setRGBA(x, y, pixel[0], pixel[1], pixel[2], alpha);
+        nonTrivialAlpha |= alpha < 255;
+    }
+#endif
+
     if (nonTrivialAlpha && !buffer.hasAlpha())
         buffer.setHasAlpha(nonTrivialAlpha);
 }