Add unique canvas IDs to all canvas operations.

This commit is contained in:
Brody Eastwood 2018-03-20 15:04:15 -04:00 committed by Brody-Eastwood
parent a69eceefc9
commit 8a1590efc6
13 changed files with 334 additions and 155 deletions

View file

@ -64,6 +64,7 @@ pub struct CanvasPaintThread<'a> {
old_image_key: Option<webrender_api::ImageKey>,
/// An old webrender image key that can be deleted when the current epoch ends.
very_old_image_key: Option<webrender_api::ImageKey>,
canvas_id: CanvasId,
}
#[derive(Clone)]
@ -99,7 +100,8 @@ impl<'a> CanvasPaintState<'a> {
impl<'a> CanvasPaintThread<'a> {
fn new(size: Size2D<i32>,
webrender_api_sender: webrender_api::RenderApiSender,
antialias: AntialiasMode) -> CanvasPaintThread<'a> {
antialias: AntialiasMode,
canvas_id: CanvasId) -> CanvasPaintThread<'a> {
let draw_target = CanvasPaintThread::create(size);
let path_builder = draw_target.create_path_builder();
let webrender_api = webrender_api_sender.create_api();
@ -112,6 +114,7 @@ impl<'a> CanvasPaintThread<'a> {
image_key: None,
old_image_key: None,
very_old_image_key: None,
canvas_id: canvas_id,
}
}
@ -119,7 +122,8 @@ impl<'a> CanvasPaintThread<'a> {
/// communicate with it.
pub fn start(size: Size2D<i32>,
webrender_api_sender: webrender_api::RenderApiSender,
antialias: bool)
antialias: bool,
canvas_id: CanvasId)
-> IpcSender<CanvasMsg> {
let (sender, receiver) = ipc::channel::<CanvasMsg>().unwrap();
let antialias = if antialias {
@ -128,11 +132,12 @@ impl<'a> CanvasPaintThread<'a> {
AntialiasMode::None
};
thread::Builder::new().name("CanvasThread".to_owned()).spawn(move || {
let mut painter = CanvasPaintThread::new(size, webrender_api_sender, antialias);
let mut painter = CanvasPaintThread::new(size, webrender_api_sender, antialias, canvas_id);
loop {
let msg = receiver.recv();
match msg.unwrap() {
CanvasMsg::Canvas2d(message) => {
CanvasMsg::Canvas2d(message, canvas_id) => {
assert!(canvas_id == painter.canvas_id);
match message {
Canvas2dMsg::FillText(text, x, y, max_width) => painter.fill_text(text, x, y, max_width),
Canvas2dMsg::FillRect(ref rect) => painter.fill_rect(rect),
@ -165,10 +170,10 @@ impl<'a> CanvasPaintThread<'a> {
painter.draw_image_self(image_size, dest_rect, source_rect, smoothing_enabled)
}
Canvas2dMsg::DrawImageInOther(
renderer, image_size, dest_rect, source_rect, smoothing, sender
renderer, other_canvas_id, image_size, dest_rect, source_rect, smoothing, sender
) => {
painter.draw_image_in_other(
renderer, image_size, dest_rect, source_rect, smoothing, sender)
renderer, other_canvas_id, image_size, dest_rect, source_rect, smoothing, sender)
}
Canvas2dMsg::MoveTo(ref point) => painter.move_to(point),
Canvas2dMsg::LineTo(ref point) => painter.line_to(point),
@ -220,22 +225,30 @@ impl<'a> CanvasPaintThread<'a> {
Canvas2dMsg::SetShadowColor(ref color) => painter.set_shadow_color(color.to_azure_style()),
}
},
CanvasMsg::Close => break,
CanvasMsg::Recreate(size) => painter.recreate(size),
CanvasMsg::FromScript(message) => {
CanvasMsg::Close(canvas_id) =>{
assert!(canvas_id == painter.canvas_id);
break;
},
CanvasMsg::Recreate(size, canvas_id) =>{
assert!(canvas_id == painter.canvas_id);
painter.recreate(size);
},
CanvasMsg::FromScript(message, canvas_id) => {
assert!(canvas_id == painter.canvas_id);
match message {
FromScriptMsg::SendPixels(chan) => {
painter.send_pixels(chan)
}
}
}
CanvasMsg::FromLayout(message) => {
},
CanvasMsg::FromLayout(message, canvas_id) => {
assert!(canvas_id == painter.canvas_id);
match message {
FromLayoutMsg::SendData(chan) => {
painter.send_data(chan)
}
}
}
},
}
}
}).expect("Thread spawning failed");
@ -415,6 +428,7 @@ impl<'a> CanvasPaintThread<'a> {
fn draw_image_in_other(&self,
renderer: IpcSender<CanvasMsg>,
other_canvas_id: CanvasId,
image_size: Size2D<f64>,
dest_rect: Rect<f64>,
source_rect: Rect<f64>,
@ -430,7 +444,9 @@ impl<'a> CanvasPaintThread<'a> {
dest_rect,
source_rect,
smoothing_enabled,
));
),
other_canvas_id,
);
renderer.send(msg).unwrap();
// We acknowledge to the caller here that the data was sent to the
// other canvas so that if JS immediately afterwards try to get the