aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/canvasrenderingcontext2d.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/canvasrenderingcontext2d.rs')
-rw-r--r--components/script/dom/canvasrenderingcontext2d.rs11
1 files changed, 5 insertions, 6 deletions
diff --git a/components/script/dom/canvasrenderingcontext2d.rs b/components/script/dom/canvasrenderingcontext2d.rs
index 89d07cf815c..f66913a9417 100644
--- a/components/script/dom/canvasrenderingcontext2d.rs
+++ b/components/script/dom/canvasrenderingcontext2d.rs
@@ -41,6 +41,7 @@ use std::cell::RefCell;
use std::str::FromStr;
use std::sync::mpsc::channel;
use std::{cmp, fmt};
+use unpremultiplytable::UNPREMULTIPLY_TABLE;
use url::Url;
use util::str::DOMString;
use util::vec::byte_swap;
@@ -889,13 +890,11 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
let mut data = receiver.recv().unwrap();
// Un-premultiply alpha
- // TODO: may want a precomputed un-premultiply table to make this fast.
- // https://github.com/servo/servo/issues/6969
for chunk in data.chunks_mut(4) {
- let alpha = chunk[3] as f32 / 255.;
- chunk[0] = (chunk[0] as f32 / alpha) as u8;
- chunk[1] = (chunk[1] as f32 / alpha) as u8;
- chunk[2] = (chunk[2] as f32 / alpha) as u8;
+ let alpha = chunk[3] as usize;
+ chunk[0] = UNPREMULTIPLY_TABLE[256 * alpha + chunk[0] as usize];
+ chunk[1] = UNPREMULTIPLY_TABLE[256 * alpha + chunk[1] as usize];
+ chunk[2] = UNPREMULTIPLY_TABLE[256 * alpha + chunk[2] as usize];
}
Ok(ImageData::new(self.global.root().r(), sw, sh, Some(data)))