From 4211f4f51c14ff2182e629e14f620b8cfc845d4f Mon Sep 17 00:00:00 2001 From: "reed%reedloden.com" Date: Wed, 24 Oct 2007 01:06:23 +0000 Subject: [PATCH] Bug 389366 - "Canvas's .getImageData is returning premultiplied alpha pixels" [p=philip@zaynar.demon.co.uk (Philip Taylor) r=vlad a1.9=damons] git-svn-id: svn://10.0.0.236/trunk@238060 18797224-902f-48f8-a5cc-f745e15eee43 --- .../canvas/src/nsCanvasRenderingContext2D.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/mozilla/content/canvas/src/nsCanvasRenderingContext2D.cpp b/mozilla/content/canvas/src/nsCanvasRenderingContext2D.cpp index 8b0f2ea9ba3..9b4db0b7d93 100644 --- a/mozilla/content/canvas/src/nsCanvasRenderingContext2D.cpp +++ b/mozilla/content/canvas/src/nsCanvasRenderingContext2D.cpp @@ -2465,6 +2465,13 @@ nsCanvasRenderingContext2D::GetImageData() PRUint8 g = *row++; PRUint8 b = *row++; #endif + // Convert to non-premultiplied color + if (a != 0) { + r = (r * 255) / a; + g = (g * 255) / a; + b = (b * 255) / a; + } + *dest++ = INT_TO_JSVAL(r); *dest++ = INT_TO_JSVAL(g); *dest++ = INT_TO_JSVAL(b); @@ -2588,6 +2595,11 @@ nsCanvasRenderingContext2D::PutImageData() else if (JSVAL_IS_DOUBLE(va)) ia = (PRUint8) (*JSVAL_TO_DOUBLE(va)); else return NS_ERROR_DOM_SYNTAX_ERR; + // Convert to premultiplied color (losslessly if the input came from getImageData) + ir = (ir*ia + 254) / 255; + ig = (ig*ia + 254) / 255; + ib = (ib*ia + 254) / 255; + #ifdef IS_LITTLE_ENDIAN *imgPtr++ = ib; *imgPtr++ = ig;