mirror of
https://github.com/servo/servo.git
synced 2025-08-06 06:00:15 +01:00
Add unique canvas IDs to all canvas operations.
This commit is contained in:
parent
a69eceefc9
commit
8a1590efc6
13 changed files with 334 additions and 155 deletions
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue