mirror of
https://github.com/servo/servo.git
synced 2025-08-05 21:50:18 +01:00
canvas: Do not update ImageKey during canvas layout (#35719)
Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>
This commit is contained in:
parent
f31043602a
commit
6f6840d63c
17 changed files with 90 additions and 126 deletions
|
@ -21,7 +21,7 @@ use servo_arc::Arc as ServoArc;
|
|||
use style::color::AbsoluteColor;
|
||||
use style::properties::style_structs::Font as FontStyleStruct;
|
||||
use unicode_script::Script;
|
||||
use webrender_api::units::{DeviceIntSize, RectExt as RectExt_};
|
||||
use webrender_api::units::RectExt as RectExt_;
|
||||
use webrender_api::{ImageDescriptor, ImageDescriptorFlags, ImageFormat, ImageKey};
|
||||
use webrender_traits::{CrossProcessCompositorApi, ImageUpdate, SerializableImageData};
|
||||
|
||||
|
@ -465,6 +465,10 @@ impl<'a> CanvasData<'a> {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn image_key(&self) -> ImageKey {
|
||||
self.image_key
|
||||
}
|
||||
|
||||
pub fn draw_image(
|
||||
&mut self,
|
||||
image_data: &[u8],
|
||||
|
@ -1249,7 +1253,7 @@ impl<'a> CanvasData<'a> {
|
|||
.create_drawtarget(Size2D::new(size.width, size.height));
|
||||
self.state = self.backend.recreate_paint_state(&self.state);
|
||||
self.saved_states.clear();
|
||||
self.update_wr_image(size.cast().cast_unit());
|
||||
self.update_image_rendering();
|
||||
}
|
||||
|
||||
pub fn send_pixels(&mut self, chan: IpcSender<IpcSharedMemory>) {
|
||||
|
@ -1260,20 +1264,10 @@ impl<'a> CanvasData<'a> {
|
|||
});
|
||||
}
|
||||
|
||||
pub fn send_data(&mut self, chan: IpcSender<CanvasImageData>) {
|
||||
let size = self.drawtarget.get_size();
|
||||
|
||||
self.update_wr_image(size.cast_unit());
|
||||
|
||||
let data = CanvasImageData {
|
||||
image_key: self.image_key,
|
||||
};
|
||||
chan.send(data).unwrap();
|
||||
}
|
||||
|
||||
fn update_wr_image(&mut self, size: DeviceIntSize) {
|
||||
/// Update image in WebRender
|
||||
pub fn update_image_rendering(&mut self) {
|
||||
let descriptor = ImageDescriptor {
|
||||
size,
|
||||
size: self.drawtarget.get_size().cast_unit(),
|
||||
stride: None,
|
||||
format: ImageFormat::BGRA8,
|
||||
offset: 0,
|
||||
|
|
|
@ -16,6 +16,7 @@ use ipc_channel::ipc::{self, IpcSender};
|
|||
use ipc_channel::router::ROUTER;
|
||||
use log::warn;
|
||||
use net_traits::ResourceThreads;
|
||||
use webrender_api::ImageKey;
|
||||
use webrender_traits::CrossProcessCompositorApi;
|
||||
|
||||
use crate::canvas_data::*;
|
||||
|
@ -79,8 +80,9 @@ impl<'a> CanvasPaintThread<'a> {
|
|||
},
|
||||
},
|
||||
Ok(CanvasMsg::FromLayout(message, canvas_id)) => match message {
|
||||
FromLayoutMsg::SendData(chan) => {
|
||||
canvas_paint_thread.canvas(canvas_id).send_data(chan);
|
||||
FromLayoutMsg::UpdateImage(sender) => {
|
||||
canvas_paint_thread.canvas(canvas_id).update_image_rendering();
|
||||
sender.send(()).unwrap();
|
||||
},
|
||||
},
|
||||
Err(e) => {
|
||||
|
@ -90,9 +92,9 @@ impl<'a> CanvasPaintThread<'a> {
|
|||
}
|
||||
recv(create_receiver) -> msg => {
|
||||
match msg {
|
||||
Ok(ConstellationCanvasMsg::Create { id_sender: creator, size }) => {
|
||||
let canvas_id = canvas_paint_thread.create_canvas(size);
|
||||
creator.send(canvas_id).unwrap();
|
||||
Ok(ConstellationCanvasMsg::Create { sender: creator, size }) => {
|
||||
let canvas_data = canvas_paint_thread.create_canvas(size);
|
||||
creator.send(canvas_data).unwrap();
|
||||
},
|
||||
Ok(ConstellationCanvasMsg::Exit) => break,
|
||||
Err(e) => {
|
||||
|
@ -109,15 +111,16 @@ impl<'a> CanvasPaintThread<'a> {
|
|||
(create_sender, ipc_sender)
|
||||
}
|
||||
|
||||
pub fn create_canvas(&mut self, size: Size2D<u64>) -> CanvasId {
|
||||
pub fn create_canvas(&mut self, size: Size2D<u64>) -> (CanvasId, ImageKey) {
|
||||
let canvas_id = self.next_canvas_id;
|
||||
self.next_canvas_id.0 += 1;
|
||||
|
||||
let canvas_data =
|
||||
CanvasData::new(size, self.compositor_api.clone(), self.font_context.clone());
|
||||
let image_key = canvas_data.image_key();
|
||||
self.canvases.insert(canvas_id, canvas_data);
|
||||
|
||||
canvas_id
|
||||
(canvas_id, image_key)
|
||||
}
|
||||
|
||||
fn process_canvas_2d_message(&mut self, message: Canvas2dMsg, canvas_id: CanvasId) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue