mirror of
https://github.com/servo/servo.git
synced 2025-06-08 08:33:26 +00:00
Simplify ctx.drawImage a bit
There is no need to swap between RGBA and BGRA twice.
This commit is contained in:
parent
35bf180dcb
commit
bb2101f540
2 changed files with 9 additions and 36 deletions
|
@ -7,7 +7,6 @@ use canvas_data::*;
|
||||||
use canvas_traits::canvas::*;
|
use canvas_traits::canvas::*;
|
||||||
use euclid::Size2D;
|
use euclid::Size2D;
|
||||||
use ipc_channel::ipc::{self, IpcSender};
|
use ipc_channel::ipc::{self, IpcSender};
|
||||||
use pixels;
|
|
||||||
use std::borrow::ToOwned;
|
use std::borrow::ToOwned;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::thread;
|
use std::thread;
|
||||||
|
@ -139,13 +138,10 @@ impl<'a> CanvasPaintThread <'a> {
|
||||||
source_rect,
|
source_rect,
|
||||||
smoothing_enabled,
|
smoothing_enabled,
|
||||||
) => {
|
) => {
|
||||||
let data = match imagedata {
|
let data = imagedata.map_or_else(
|
||||||
None => vec![0; image_size.width as usize * image_size.height as usize * 4],
|
|| vec![0; image_size.width as usize * image_size.height as usize * 4],
|
||||||
Some(mut data) => {
|
|bytes| bytes.into(),
|
||||||
pixels::byte_swap_colors_inplace(&mut data);
|
);
|
||||||
data.into()
|
|
||||||
},
|
|
||||||
};
|
|
||||||
self.canvas(canvas_id).draw_image(
|
self.canvas(canvas_id).draw_image(
|
||||||
data,
|
data,
|
||||||
image_size,
|
image_size,
|
||||||
|
|
|
@ -403,39 +403,16 @@ impl CanvasRenderingContext2D {
|
||||||
dh: Option<f64>,
|
dh: Option<f64>,
|
||||||
) -> ErrorResult {
|
) -> ErrorResult {
|
||||||
debug!("Fetching image {}.", url);
|
debug!("Fetching image {}.", url);
|
||||||
// https://html.spec.whatwg.org/multipage/#img-error
|
let (mut image_data, image_size) =
|
||||||
// If the image argument is an HTMLImageElement object that is in the broken state,
|
self.fetch_image_data(url).ok_or(Error::InvalidState)?;
|
||||||
// then throw an InvalidStateError exception
|
pixels::premultiply_inplace(&mut image_data);
|
||||||
let (image_data, image_size) = match self.fetch_image_data(url) {
|
let image_size = image_size.to_f64();
|
||||||
Some((mut data, size)) => {
|
|
||||||
// Pixels come from cache in BGRA order and drawImage expects RGBA so we
|
|
||||||
// have to swap the color values
|
|
||||||
pixels::byte_swap_and_premultiply_inplace(&mut data);
|
|
||||||
let size = Size2D::new(size.width as f64, size.height as f64);
|
|
||||||
(data, size)
|
|
||||||
},
|
|
||||||
None => return Err(Error::InvalidState),
|
|
||||||
};
|
|
||||||
let dw = dw.unwrap_or(image_size.width);
|
let dw = dw.unwrap_or(image_size.width);
|
||||||
let dh = dh.unwrap_or(image_size.height);
|
let dh = dh.unwrap_or(image_size.height);
|
||||||
let sw = sw.unwrap_or(image_size.width);
|
let sw = sw.unwrap_or(image_size.width);
|
||||||
let sh = sh.unwrap_or(image_size.height);
|
let sh = sh.unwrap_or(image_size.height);
|
||||||
self.draw_image_data(image_data, image_size, sx, sy, sw, sh, dx, dy, dw, dh)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn draw_image_data(
|
|
||||||
&self,
|
|
||||||
image_data: Vec<u8>,
|
|
||||||
image_size: Size2D<f64>,
|
|
||||||
sx: f64,
|
|
||||||
sy: f64,
|
|
||||||
sw: f64,
|
|
||||||
sh: f64,
|
|
||||||
dx: f64,
|
|
||||||
dy: f64,
|
|
||||||
dw: f64,
|
|
||||||
dh: f64,
|
|
||||||
) -> ErrorResult {
|
|
||||||
// Establish the source and destination rectangles
|
// Establish the source and destination rectangles
|
||||||
let (source_rect, dest_rect) =
|
let (source_rect, dest_rect) =
|
||||||
self.adjust_source_dest_rects(image_size, sx, sy, sw, sh, dx, dy, dw, dh);
|
self.adjust_source_dest_rects(image_size, sx, sy, sw, sh, dx, dy, dw, dh);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue