Title: [104769] branches/chromium/963
Revision
104769
Author
[email protected]
Date
2012-01-11 17:00:17 -0800 (Wed, 11 Jan 2012)

Log Message

Merge 104732 - [chromium] Color profiles are incorrect for images without premultiplied alpha
https://bugs.webkit.org/show_bug.cgi?id=75999

Reviewed by Stephen White.

Source/WebCore:

Don't apply the color profile if the user has requested separate alpha.

Test: fast/canvas/webgl/texture-color-profile.html

* platform/image-decoders/skia/ImageDecoderSkia.cpp:
(WebCore::ImageFrame::setStatus):

LayoutTests:

Verify that the image's contents don't get destroyed if using both
separate alpha as well as the browser's colorspace conversion.

* fast/canvas/webgl/resources/tan-1x1-with-alpha.png: Added.
* fast/canvas/webgl/texture-color-profile-expected.txt: Added.
* fast/canvas/webgl/texture-color-profile.html: Added.

[email protected]
Review URL: http://codereview.chromium.org/9187038

Modified Paths

Added Paths

Diff

Copied: branches/chromium/963/LayoutTests/fast/canvas/webgl/resources/tan-1x1-with-alpha.png (from rev 104732, trunk/LayoutTests/fast/canvas/webgl/resources/tan-1x1-with-alpha.png) (0 => 104769)


--- branches/chromium/963/LayoutTests/fast/canvas/webgl/resources/tan-1x1-with-alpha.png	                        (rev 0)
+++ branches/chromium/963/LayoutTests/fast/canvas/webgl/resources/tan-1x1-with-alpha.png	2012-01-12 01:00:17 UTC (rev 104769)
@@ -0,0 +1,27 @@
+\x89PNG
+
+
+IHDRĉ
+OiCCPPhotoshop ICC profilexڝSgTS\xE9=\xF7\xDE\xF4BK\x88\x80\x94KoR RB\x8B\x80\x91&*!	J\x88!\xA1\xD9Q\xC1EEȠ\x88\x8E\x8E\x80\x8CQ,\x8A
+\xD8\xE4!\xA2\x8E\x83\xA3\x88\x8A\xCA\xFB\xE1{\xA3kּ\xF7\xE6\xCD\xFE\xB5\xD7>\xE7\xAC\xF3\x9D\xB3\xCF\xC0\x96H3Q5\x80\xA9B\xE0\x83\xC7\xC4\xC6\xE1\xE4.@\x81
+$p\xB3d!s\xFD#\xF8~<<+"\xC0\xBEx\xD3\xC0M\x9B\xC00\x87\xFF\xEAB\x99\\x80\x84\xC0t\x918K\x80@z\x8EB\xA6@F\x80\x9D\x98&S\xA0`\xCBcb\xE3P-`'\xE6\xD3\x80\x9D\xF8\x99{[\x94!\xA0\x91 e\x88Dh;\xAC\xCFV\x8AEX0fK\xC49\xD8-0IWfH\xB0\xB7\xC0\xCE\xB20Q\x88\x85){`\xC8##x\x84\x99F\xF2W<\xF1+\xAE\xE7*x\x99\xB2<\xB9$9E\x81[-qWW.(\xCEI+6aa\x9A@.\xC2y\x992\x814\xE0\xF3\xCC\xA0\x91\xE0\x83\xF3\xFDx\xCE\xAE\xCE\xCE6\x8E\xB6_-\xEA\xBF\xFF"bb\xE3\xFE\xE5ϫp@\xE1t~\xD1\xFE,/\xB3\x80;\x80m\xFE\xA2%\xEEh^\xA0u\xF7\x8Bf\xB2@\xB5\xA0\xE9\xDAW\xF3p\xF8~<<E\xA1\x90\xB9\xD9\xD9\xE5\xE4\xE4\xD8J\xC4B[a\xCAW}\xFEg\xC2_\xC0W\xFDl\xF9~<\xFC\xF7\xF5\xE0\xBE\xE2$\x812]\x81G\xF8\xE0\xC2\xCC\xF4L\xA5ϒ	\x84b\xDC\xE6\x8FG\xFC\xB7\xFF\xFC\xD3"\xC4Ib\xB9X*\xE3Qq\x8ED\x9A\x8C\xF32\xA5"\x89B\x92)\xC5%\xD2\xFFd\xE2\xDF,\xFB>\xDF5\xB0j>{\x91-\xA8]c\xF6K'Xt\xC0\xE2\xF7\xF2\xBBo\xC1\xD4(\x80h\x83\xE1\xCFw\xFF\xEF?\xFDG\xA0%\x80fI\x92q^D$.Tʳ?\xC7D\xA0\x81*\xB0A\xF4\xC1,\xC0\xC1\xDC\xC1\xFC`6\x84B$\xC4\xC2BB
+d\x80r`)\xAC\x82B(\x86Ͱ*`/\xD4@4\xC0Qh\x86\x93p.\xC2U\xB8=p\xFAa\x9E\xC1(\xBC\x81	A\xC8a!ڈb\x8AX#\x8E\x99\x85\xF8!\xC1H\x8B$ ɈQ"K\x915H1R\x8AT UH\xF2=r9\x87\F\xBA\x91;\xC82\x82\xFC\x86\xBCG1\x94\x81\xB2Q=\xD4\xB5C\xB9\xA87\x84F\xA2\xD0dt1\x9A\x8F\xA0\x9B\xD0r\xB4=\x8C6\xA1\xE7Ыhڏ>C\xC70\xC0\xE83\xC4l0.\xC6\xC3B\xB18,	\x93c˱"\xAC\xAB\xC6\xB0V\xAC\xBB\x89\xF5cϱw\x81E\xC0	6wB aAHXLXN\xD8H\xA8 $4\xDA	7	\x84Q\xC2'"\x93\xA8K\xB4&\xBA\xF9\xC4b21\x87XH,#\xD6\x8F/{\x88C\xC47$\x89C2'\xB9\x90I\xB1\xA4T\xD2\xD2F\xD2nR#\xE9,\xA9\x9B4H#\x93\xC9\xDAdk\xB29\x94, +ȅ\xE4\x9D\xE4\xC3\xE43\xE4\xE4!\xF2[
+\x9Db@q\xA4\xF8S\xE2(R\xCAjJ\xE5\xE54\xE5e\x982AU\xA3\x9ARݨ\xA1T5\x8FZB\xAD\xA1\xB6R\xAFQ\x87\xA84u\x9A9̓IK\xA5\xAD\xA2\x95\xD3hh\xF7i\xAF\xE8t\xBAݕN\x97\xD0W\xD2\xCB\xE9G\xE8\x97\xE8\xF4w
+\x86\x83Ljg(\x9Bgw\xAF\x98L\xA6Ӌ\xC7T071\xEB\x98\xE7\x99\x99oUX*\xB6*|\x91\xCA
+\x95J\x95&\x95*/T\xA9\xAA\xA6\xAAުU\xF3U\xCBT\x8F\xA9^S}\xAEFU3S\xE3\xA9	Ԗ\xABU\xAA\x9DP\xEBSSg\xA9;\xA8\x87\xAAg\xA8oT?\xA4~Y\xFD\x89Y\xC3L\xC3OC\xA4Q\xA0\xB1_\xE3\xBC\xC6 c\xB3x,!k
+\xAB\x86u\x815\xC4&\xB1\xCD\xD9|v*\xBB\x98\xFD\xBB\x8B=\xAA\xA9\xA19C3J3W\xB3R\xF3\x94f?\xE3\x98q\xF8\x9CtN	\xE7(\xA7\x97\xF3~\x8A\xDE\xEF)\xE2)\xA64L\xB91e\k\xAA\x96\x97\x96X\xABH\xABQ\xABG\xEB\xBD6\xAE\x{D9DD}\xA6\xBDE\xBBY\xFB\x81A\xC7J'\'Gg\x8F\xCE\x9D\xE7S\xD9Sݧ
+\xA7M=:\xF5\xAE.\xAAk\xA5\xA1\xBBDw\xBFn\xA7\xBE^\x80\x9ELo\xA7\xDEy\xBD\xE7\xFA}/\xFDT\xFDm\xFA\xA7\xF5GX\xB3$\xDB\xCE<\xC55qo</\xC7\xDB\xF1QC]\xC3@C\xA5a\x95a\x97ᄑ\xB9\xD1<\xA3\xD5F\x8DF\x8Ci\xC6\\xE3$\xE3m\xC6mƣ&&!&KM\xEAM\xEE\x9ARM\xB9\xA6)\xA6;L;L\xC7\xCD\xCC͢\xCD֙5\x9B=1\xD72\xE7\x9B\xE7\x9Bכ߷`ZxZ,\xB6\xA8\xB6\xB8eI\xB2\xE4Z\xA6Yn\x85Z9Y\xA5XUZ]\xB3F\xAD\x9D\xAD%ֻ\xAD\xBB\xA7\xA7\xB9N\x93N\xAB\x9E\xD6gð\xF1\xB6ɶ\xA9\xB7\xB0\xE5\xD8ۮ\xB6m\xB6}agbg\xB7Ů\xC3\x93}\xBA}\x8D\xFD=
+\x87\xD9\xABZ~s\xB4r:V:ޚΜ\xEE?}\xC5\xF4\x96\xE9/gX\xCF\xCF\xD83\xE3\xB6\xCB)\xC4i\x9DS\x9B\xD3Ggg\xB9s\x83󈋉K\x82\xCB.\x97>.\x9B\xC6\xDDȽ\xE4Jt\xF5q]\xE1z\xD2\x{15D6F3}\x9B\xC2\xED\xA8ۯ\xEE6\xEEi\xEE\x87ܟ\xCC4\x9F)\x9EY3s\xD0\xC3\xC8C\xE0Q\xE5\xD1?\x9F\x950k߬~OCO\x81g\xB5\xE7#/c/\x91W\xADװ\xB7\xA5w\xAA\xF7a\xEF>\xF6>r\x9F\xE3>\xE3<7\xDE2\xDEY_\xCC7\xC0\xB7ȷ\xCBO\xC3o\x9E_\x85\xDFC#\xFFd\xFFz\xFF\xD1\xA7\x80%g\x89\x81A\x81[\xFB\xF8z|!\xBF\x8E?:\xDBe\xF6\xB2\xD9\xEDA\x8C\xA0\xB9AA\x8F\x82\xAD\x82\xE5\xC1\xAD!h\xC8쐭!\xF7\xE7\x98Α\xCEi\x85P~\xE8\xD6\xD0a\xE6a\x8B\xC3~'\x85\x87\x85W\x86?\x8Ep\x88X\xD11\x975w\xD1\xDCCs\xDFD\xFAD\x96Dޛg1O9\xAF-J5*>\xAA.j<\xDA7\xBA4\xBA?\xC6.fY\xCC\xD5X\x9DXIlK9.*\xAE6nl\xBE\xDF\xFC\xED\xF3\x87\xE2\x9D\xE2\xE3{\x98/\xC8]py\xA1\xCE\xC2\xF4\x85\xA7\xA9.,:\x96@L\x88N8\x94\xF0A*\xA8\x8C%\xF2w%\x8E
+y\xC2\xC2g"/\xD16ш\xD8C\*N\xF2H*Mz\x92쑼5y$\xC53\xA5,幄'\xA9\x90\xBCL
+Lݛ:\x9E\x9Av m2=:\xBD1\x83\x92\x91\x90qB\xAA!M\x93\xB6g\xEAg\xE6fvˬe\x85\xB2\xFE\xC5n\x8B\xB7/\x95\xC9k\xB3\x90\xACY-
+\xB6B\xA6\xE8TZ(\xD7*\xB2geWf\xBF͉\xCA9\x96\xAB\x9E+\xCD\xED̳\xCAې7\x9C\xEF\x9F\xFF\xED\xC2ᒶ\xA5\x86KW-X潬j9\xB2<qy\xDB
+\xE3+\x86V\xAC<\xB8\x8A\xB6*m\xD5O\xAB\xEDW\x97\xAE~\xBD&zMk\x81^\xC1ʂ\xC1\xB5k\xEBU
+\xE5\x85}\xEB\xDC\xD7\xED]OX/Yߵa\xFA\x86\x9D>\x89\x8A\xAE\xDB\x97\xD8(\xDCx\xE5\x87oʿ\x99ܔ\xB4\xA9\xABĹd\xCFf\xD2f\xE9\xE6\xDE-\x9E[\x96\xAA\x97\xE6\x97n
+\xD9ڴ
+\xDFV\xB4\xED\xF5\xF6E\xDB/\x97\xCD(ۻ\x83\xB6C\xB9\xA3\xBF<\xB8\xBCe\xA7\xC9\xCE\xCD;?T\xA4T\xF4T\xFAT6\xEE\xD2ݵa\xD7\xF8n\xD1\xEE{\xBC\xF64\xEC\xD5\xDB[\xBC\xF7\xFD>ɾ\xDBUUM\xD5f\xD5e\xFBI\xFB\xB3\xF7?\xAE\x89\xAA\xE9\xF8\x96\xFBm]\xADNmq\xED\xC7\xD2\xFD#\xB6׹\xD4\xD5\xD2=TR\x8F\xD6+\xEBG\xC7\xBE\xFE\x9D\xEFw-
+6
+U\x8D\x9C\xC6\xE2#pDy\xE4\xE9\xF7	\xDF\xF7
+:\xDAv\x8C{\xAC\xE1\xD3vg/jB\x9A\xF2\x9AF\x9BS\x9A\xFB[b[\xBAO\xCC>\xD1\xD6\xEA\xDEz\xFCG\xDB\x9C4<YyJ\xF3T\xC9i\xDA\xE9\x82ӓg\xF2ό\x9D\x95\x9D}~.\xF9\xDC`ۢ\xB6{\xE7c\xCE\xDFjo\xEF\xBAt\xE1\xD2E\xFF\x8B\xE7;\xBC;\xCE\\xF2\xB8t\xF2\xB2\xDB\xE5W\xB8W\x9A\xAF:_m\xEAt\xEA<\xFE\x93\xD3Oǻ\x9C\xBB\x9A\xAE\xB9\k\xB9\xEEz\xBD\xB5{f\xF7\xE9\x9E7\xCE\xDD\xF4\xBDy\xF1\xFF\xD6՞9=ݽ\xF3zo\xF7\xC5\xF7\xF5\xDF\xDD~r'\xFD\xCE˻\xD9w'O\xBC_\xF4@\xEDA\xD9C݇\xD5?[\xFE\xDC\xD8\xEF\xDCj\xC0w\xA0\xF3\xD1\xDCG\xF7\x85\x83\xCF\xFE\x91\xF5\x8FC\x8F\x99\x8Fˆ
+\x86\xEB\x9E8>99\xE2?r\xFD\xE9\xFC\xA7C\xCFd\xCF&\x9E\xFE\xA2\xFEˮ/~\xF8\xD5\xEB\xD7\xCEјѡ\x97򗓿m|\xA5\xFD\xEA\xC0\xEB\xAF\xDB\xC6\xC2\xC6\xBE\xC9x31^\xF4V\xFB\xED\xC1w\xDCw\xEF\xA3\xDFO\xE4| (\xFFh\xF9\xB1\xF5SЧ\xFB\x93\x93\x93\xFF\x98\xF3\xFCc3-\xDBbKGD\xFF\xFF\xFF\xA0\xBD\xA7\x93	pHYs\x9A\x9CtIME\xDC
+MMD^
+IDAT\xD7cX\\xD7H?l<\xD9IEND\xAEB`\x82
\ No newline at end of file

Copied: branches/chromium/963/LayoutTests/fast/canvas/webgl/texture-color-profile-expected.txt (from rev 104732, trunk/LayoutTests/fast/canvas/webgl/texture-color-profile-expected.txt) (0 => 104769)


--- branches/chromium/963/LayoutTests/fast/canvas/webgl/texture-color-profile-expected.txt	                        (rev 0)
+++ branches/chromium/963/LayoutTests/fast/canvas/webgl/texture-color-profile-expected.txt	2012-01-12 01:00:17 UTC (rev 104769)
@@ -0,0 +1,14 @@
+Test that applying a color profile to a texture with separate alpha doesn't destroy the texture.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+This test isn't appropriate to include in the WebGL conformance suite, since the browser's behavior when applying a color profile can't be guaranteed.
+PASS getError was expected value: NO_ERROR : Should be no errors from setup.
+PASS getError was expected value: NO_ERROR : Should be no errors from setup
+PASS pixel 0, 0 should be within 20 units of 163, 126, 94, 129
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Copied: branches/chromium/963/LayoutTests/fast/canvas/webgl/texture-color-profile.html (from rev 104732, trunk/LayoutTests/fast/canvas/webgl/texture-color-profile.html) (0 => 104769)


--- branches/chromium/963/LayoutTests/fast/canvas/webgl/texture-color-profile.html	                        (rev 0)
+++ branches/chromium/963/LayoutTests/fast/canvas/webgl/texture-color-profile.html	2012-01-12 01:00:17 UTC (rev 104769)
@@ -0,0 +1,90 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Texture upload with color profile</title>
+<link rel="stylesheet" href=""
+<script src=""
+<script src=""
+<script src=""
+</head>
+<body>
+<canvas id="example" width="16" height="16" style="width: 16px; height: 16px;"></canvas>
+<div id="description"></div>
+<div id="console"></div>
+<script>
+description("Test that applying a color profile to a texture with separate alpha doesn't destroy the texture.");
+debug("")
+debug("This test isn't appropriate to include in the WebGL conformance suite, since the browser's behavior when applying a color profile can't be guaranteed.")
+var wtu = WebGLTestUtils;
+var canvas = document.getElementById("example");
+var gl = wtu.create3DContext(canvas);
+var program = wtu.setupTexturedQuad(gl);
+
+glErrorShouldBe(gl, gl.NO_ERROR, "Should be no errors from setup.");
+
+var imgURLs = [
+  'resources/tan-1x1-with-alpha.png'
+];
+
+wtu.loadImagesAsync(imgURLs, runTests);
+
+function runTests(imgs) {
+  // pixelStorei defaults are UNPACK_PREMULTIPLY_ALPHA_WEBGL=false, UNPACK_COLORSPACE_CONVERSION_WEBGL=BROWSER_DEFAULT_WEBGL.
+  var loc = gl.getUniformLocation(program, "tex");
+  gl.uniform1i(loc, 0);
+
+  gl.disable(gl.BLEND);
+  gl.disable(gl.DEPTH_TEST);
+
+  var width = canvas.width;
+  var height = canvas.height;
+
+  function checkPixelRange(buf, x, y, color, allowedRange) {
+    var off = (y * width + x) * 4;
+    var msg = "pixel " + x + ", " + y + " should be within " +
+              allowedRange + " units of " +
+              color[0] + ", " +
+              color[1] + ", " +
+              color[2] + ", " +
+              color[3];
+    var subMsg = " was " +
+              buf[off + 0] + ", " +
+              buf[off + 1] + ", " +
+              buf[off + 2] + ", " +
+              buf[off + 3];
+    // When running in WebKit's test harness, we don't want to print the
+    // pixel value when the test passes, because different machines might
+    // have different results and we record the text output.
+    var inDumpRenderTree = window.layoutTestController;
+    for (var ii = 0; ii < 4; ++ii) {
+      if (Math.abs(buf[off + ii] - color[ii]) > allowedRange) {
+        testFailed(msg + subMsg);
+        return;
+      }
+    }
+    testPassed(msg + (inDumpRenderTree ? "" : subMsg));
+  }
+  
+  var tex = gl.createTexture();
+  gl.bindTexture(gl.TEXTURE_2D, tex);
+  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
+  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
+  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
+  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
+
+  var buf = new Uint8Array(width * height * 4);
+
+  gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE,
+                imgs['resources/tan-1x1-with-alpha.png']);
+  glErrorShouldBe(gl, gl.NO_ERROR, "Should be no errors from setup");
+  wtu.drawQuad(gl);
+  gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, buf);
+  // This generous range is still enough to catch the regression.
+  checkPixelRange(buf, 0, 0, [163, 126, 94, 129], 20);
+
+  debug("");
+  isSuccessfullyParsed();
+}
+</script>
+</body>
+</html>

Modified: branches/chromium/963/Source/WebCore/platform/image-decoders/skia/ImageDecoderSkia.cpp (104768 => 104769)


--- branches/chromium/963/Source/WebCore/platform/image-decoders/skia/ImageDecoderSkia.cpp	2012-01-12 00:58:52 UTC (rev 104768)
+++ branches/chromium/963/Source/WebCore/platform/image-decoders/skia/ImageDecoderSkia.cpp	2012-01-12 01:00:17 UTC (rev 104769)
@@ -158,7 +158,9 @@
     if (m_status == FrameComplete) {
         m_bitmap.setDataComplete();  // Tell the bitmap it's done.
 #if PLATFORM(CHROMIUM) && OS(DARWIN)
-        if (m_colorProfile.isEmpty())
+        // resolveColorSpace() and callees assume that the alpha channel is
+        // premultiplied, so don't apply the color profile if it isn't.
+        if (m_colorProfile.isEmpty() || !m_premultiplyAlpha)
             return;
         RetainPtr<CGColorSpaceRef> cgColorSpace(AdoptCF, createColorSpace(m_colorProfile));
         resolveColorSpace(m_bitmap.bitmap(), cgColorSpace.get());
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to