Bug 17620: getImageData lies
authoroliver@apple.com <oliver@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 3 Mar 2008 09:34:49 +0000 (09:34 +0000)
committeroliver@apple.com <oliver@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 3 Mar 2008 09:34:49 +0000 (09:34 +0000)
http://bugs.webkit.org/show_bug.cgi?id=17620

Reviewed by Mark Rowe

Correct logic to actually iterate over the source row

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

LayoutTests/ChangeLog
LayoutTests/fast/canvas/canvas-getImageData-expected.txt
LayoutTests/fast/canvas/canvas-getImageData.html
WebCore/ChangeLog
WebCore/platform/graphics/cg/ImageBufferCG.cpp

index 628259397a89f08c981ad5b151862c98ad75bf2a..b06da899a8a07e681ae06d7dc1ac571488d16629 100644 (file)
@@ -1,3 +1,12 @@
+2008-03-03  Oliver Hunt  <oliver@apple.com>
+
+        Reviewed by Mark Rowe.
+
+        Add check to make sure we return all the data in a row.
+
+        * fast/canvas/canvas-getImageData-expected.txt:
+        * fast/canvas/canvas-getImageData.html:
+
 2008-03-03  Oliver Hunt  <oliver@apple.com>
 
         Reviewed by Mark Rowe.
index 770aadf31d41d69d8691abfba238392cba3ed674..500bf6421e0516499c07729fe4371d1422058ec0 100644 (file)
@@ -25,6 +25,7 @@ PASS: pixel at (88,0) was [0,234,0,255]
 PASS: pixel at (92,0) was [0,244,0,255]
 PASS: pixel at (96,0) was [0,255,0,255]
 PASS: pixel at (5,5) was [64,128,191,255]
+PASS: Correctly retrieved every pixel in a row
 PASS: Correct data for content outside canvas bounds
 PASS: pixel at (50,50) was [0,0,0,0]
 PASS: pixel at (50,54) was [0,0,0,1]
index 1865960088828203427b2e5bf94fc4148d612128..b864b65f28f38e2d38601d0821cc4bb3ffd1cbe0 100644 (file)
@@ -59,6 +59,25 @@ context.setFillColor(0.25, 0.5, 0.75, 1);
 context.fillRect(5,5,1,1);
 pixelShouldBe(context, 5, 5, [Math.round(0.25*255), Math.round(0.5*255), Math.round(0.75*255), 255]);
 
+// Make sure we return correct values for the row
+for (var i = 0; i < 100; i++) {
+    context.fillStyle = "rgba("+[0, i, 0, 1]+")";
+    context.fillRect(i, 10, 1, 1);
+}
+
+var rowImageData = context.getImageData(0, 10, 100, 1).data;
+var rowCheck = true;
+for (var i = 0; i < 100; i++) {
+    if (rowImageData[i * 4 + 1] != i) {
+        rowCheck = false;
+        break;
+    }
+}
+if (!rowCheck)
+    log("FAIL: Did not correctly retrieve every pixel in a row");
+else
+    log("PASS: Correctly retrieved every pixel in a row");
+
 // Check that we return transparent black for regions outside the canvas proper
 context.fillStyle = "rgba(255,255,255,255)";
 context.fillRect(198, 5, 4, 1); // final 2 pixels horizontally should be clipped
index 4ad90bd6b7856feb3f10e023424315ecb6b24b7a..b677bbc1a6aa41326afbf5537845a1d30d218ea5 100644 (file)
@@ -1,3 +1,15 @@
+2008-03-03  Oliver Hunt  <oliver@apple.com>
+
+        Reviewed by Mark Rowe.
+
+        Bug 17620: getImageData lies
+        http://bugs.webkit.org/show_bug.cgi?id=17620
+
+        Correct logic to actually iterate over the source row
+
+        * platform/graphics/cg/ImageBufferCG.cpp:
+        (WebCore::ImageBuffer::getImageData):
+
 2008-03-03  Oliver Hunt  <oliver@apple.com>
 
         Reviewed by Mark Rowe.
index eff61b92e6972dd788bb96696fcc9f44ca6bd1c6..7cb28e3c6eba9a1202fb12dddf2da179f58549ad 100644 (file)
@@ -142,10 +142,11 @@ PassRefPtr<ImageData> ImageBuffer::getImageData(const IntRect& rect) const
     unsigned char* destRows = data + desty * destBytesPerRow + destx * 4;
     for (int y = 0; y < numRows; ++y) {
         for (int x = 0; x < numColumns; x++) {
-            if (unsigned char alpha = srcRows[3]) {
-                destRows[0] = (srcRows[0] * 255) / alpha;
-                destRows[1] = (srcRows[1] * 255) / alpha;
-                destRows[2] = (srcRows[2] * 255) / alpha;
+            int basex = x * 4;
+            if (unsigned char alpha = srcRows[basex + 3]) {
+                destRows[0] = (srcRows[basex] * 255) / alpha;
+                destRows[1] = (srcRows[basex + 1] * 255) / alpha;
+                destRows[2] = (srcRows[basex + 2] * 255) / alpha;
                 destRows[3] = alpha;
             } else {
                 reinterpret_cast<uint32_t*>(destRows)[0] = reinterpret_cast<uint32_t*>(srcRows)[0];