canvas: Update the image as part of update the rendering (#35996)

* Create `update_rendering` in `CanvasState` instead of manually updating in layout

Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>

* Mark as dirty and do flushes

Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>

* fixup rebase

Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>

* Update components/script/dom/htmlcanvaselement.rs

Co-authored-by: Martin Robinson <mrobinson@igalia.com>
Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>

---------

Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>
Co-authored-by: Martin Robinson <mrobinson@igalia.com>
This commit is contained in:
sagudev 2025-03-25 07:38:02 +01:00 committed by GitHub
parent ed995e61a6
commit 62737b3830
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 72 additions and 51 deletions

View file

@ -7,6 +7,7 @@ use dom_struct::dom_struct;
use euclid::default::{Point2D, Rect, Size2D};
use ipc_channel::ipc::IpcSharedMemory;
use profile_traits::ipc;
use script_bindings::inheritance::Castable;
use script_layout_interface::HTMLCanvasDataSource;
use servo_url::ServoUrl;
@ -30,6 +31,7 @@ use crate::dom::dommatrix::DOMMatrix;
use crate::dom::globalscope::GlobalScope;
use crate::dom::htmlcanvaselement::HTMLCanvasElement;
use crate::dom::imagedata::ImageData;
use crate::dom::node::{Node, NodeDamage, NodeTraits};
use crate::dom::textmetrics::TextMetrics;
use crate::script_runtime::CanGc;
@ -116,11 +118,7 @@ impl CanvasRenderingContext2D {
impl LayoutCanvasRenderingContextHelpers for LayoutDom<'_, CanvasRenderingContext2D> {
fn canvas_data_source(self) -> HTMLCanvasDataSource {
let canvas_state = &self.unsafe_get().canvas_state;
HTMLCanvasDataSource::Image((
canvas_state.image_key(),
canvas_state.get_canvas_id(),
canvas_state.get_ipc_renderer().clone(),
))
HTMLCanvasDataSource::Image(canvas_state.image_key())
}
}
@ -135,6 +133,10 @@ impl CanvasContext for CanvasRenderingContext2D {
self.canvas.clone()
}
fn update_rendering(&self) {
self.canvas_state.update_rendering();
}
fn resize(&self) {
self.set_bitmap_dimensions(self.size().cast())
}
@ -156,7 +158,10 @@ impl CanvasContext for CanvasRenderingContext2D {
}
fn mark_as_dirty(&self) {
self.canvas_state.mark_as_dirty(self.canvas.canvas())
if let Some(canvas) = self.canvas.canvas() {
canvas.upcast::<Node>().dirty(NodeDamage::OtherNodeDamage);
canvas.owner_document().add_dirty_2d_canvas(self);
}
}
}