aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamson <16504129+sagudev@users.noreply.github.com>2024-09-22 16:04:53 +0200
committerGitHub <noreply@github.com>2024-09-22 14:04:53 +0000
commit3e29131d642b3273fe4f302f9a29602289ae8616 (patch)
tree593f9d946c47ddcce034671b1cb56b615509aaec
parentbab769a7cff3309819fb0efb60b279b53e483165 (diff)
downloadservo-3e29131d642b3273fe4f302f9a29602289ae8616.tar.gz
servo-3e29131d642b3273fe4f302f9a29602289ae8616.zip
Add `HTMLCanvasDataSource::Empty` that represent transparent black instead of `HTMLCanvasDataSource::Image(None)` (#33519)
* `HTMLCanvasDataSource::Empty` that represent transparent black instead of Image(None) Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com> * Fix warning from 3a0d27b2312c6396e85178615290ac2ec3592ce1 Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com> --------- Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>
-rw-r--r--components/layout/display_list/builder.rs24
-rw-r--r--components/layout/fragment.rs11
-rw-r--r--components/layout_2020/dom.rs3
-rw-r--r--components/layout_2020/replaced.rs29
-rw-r--r--components/script/dom/htmlcanvaselement.rs4
-rw-r--r--components/script/dom/webglrenderingcontext.rs2
-rw-r--r--components/shared/script_layout/lib.rs4
7 files changed, 41 insertions, 36 deletions
diff --git a/components/layout/display_list/builder.rs b/components/layout/display_list/builder.rs
index 0721c50ac87..c09169d25f4 100644
--- a/components/layout/display_list/builder.rs
+++ b/components/layout/display_list/builder.rs
@@ -1944,20 +1944,18 @@ impl Fragment {
let image_key = match canvas_fragment_info.source {
CanvasFragmentSource::WebGL(image_key) => image_key,
CanvasFragmentSource::WebGPU(image_key) => image_key,
- CanvasFragmentSource::Image(ref ipc_renderer) => match *ipc_renderer {
- Some(ref ipc_renderer) => {
- let ipc_renderer = ipc_renderer.lock().unwrap();
- let (sender, receiver) = ipc::channel().unwrap();
- ipc_renderer
- .send(CanvasMsg::FromLayout(
- FromLayoutMsg::SendData(sender),
- canvas_fragment_info.canvas_id,
- ))
- .unwrap();
- receiver.recv().unwrap().image_key
- },
- None => return,
+ CanvasFragmentSource::Image(ref ipc_renderer) => {
+ let ipc_renderer = ipc_renderer.lock().unwrap();
+ let (sender, receiver) = ipc::channel().unwrap();
+ ipc_renderer
+ .send(CanvasMsg::FromLayout(
+ FromLayoutMsg::SendData(sender),
+ canvas_fragment_info.canvas_id,
+ ))
+ .unwrap();
+ receiver.recv().unwrap().image_key
},
+ CanvasFragmentSource::Empty => return,
};
let base = create_base_display_item(state);
diff --git a/components/layout/fragment.rs b/components/layout/fragment.rs
index 444323154f1..1cb25cefc7a 100644
--- a/components/layout/fragment.rs
+++ b/components/layout/fragment.rs
@@ -353,8 +353,10 @@ impl InlineAbsoluteFragmentInfo {
#[derive(Clone)]
pub enum CanvasFragmentSource {
WebGL(ImageKey),
- Image(Option<Arc<Mutex<IpcSender<CanvasMsg>>>>),
+ Image(Arc<Mutex<IpcSender<CanvasMsg>>>),
WebGPU(ImageKey),
+ /// Transparent black
+ Empty,
}
#[derive(Clone)]
@@ -369,10 +371,11 @@ impl CanvasFragmentInfo {
pub fn new(data: HTMLCanvasData) -> CanvasFragmentInfo {
let source = match data.source {
HTMLCanvasDataSource::WebGL(texture_id) => CanvasFragmentSource::WebGL(texture_id),
- HTMLCanvasDataSource::Image(ipc_sender) => CanvasFragmentSource::Image(
- ipc_sender.map(|renderer| Arc::new(Mutex::new(renderer))),
- ),
+ HTMLCanvasDataSource::Image(ipc_sender) => {
+ CanvasFragmentSource::Image(Arc::new(Mutex::new(ipc_sender)))
+ },
HTMLCanvasDataSource::WebGPU(image_key) => CanvasFragmentSource::WebGPU(image_key),
+ HTMLCanvasDataSource::Empty => CanvasFragmentSource::Empty,
};
CanvasFragmentInfo {
diff --git a/components/layout_2020/dom.rs b/components/layout_2020/dom.rs
index c602153cc60..205d2db5c2a 100644
--- a/components/layout_2020/dom.rs
+++ b/components/layout_2020/dom.rs
@@ -149,9 +149,10 @@ where
let source = match canvas_data.source {
HTMLCanvasDataSource::WebGL(texture_id) => CanvasSource::WebGL(texture_id),
HTMLCanvasDataSource::Image(ipc_sender) => {
- CanvasSource::Image(ipc_sender.map(|renderer| Arc::new(Mutex::new(renderer))))
+ CanvasSource::Image(Arc::new(Mutex::new(ipc_sender)))
},
HTMLCanvasDataSource::WebGPU(image_key) => CanvasSource::WebGPU(image_key),
+ HTMLCanvasDataSource::Empty => CanvasSource::Empty,
};
Some((
CanvasInfo {
diff --git a/components/layout_2020/replaced.rs b/components/layout_2020/replaced.rs
index 208fe6eb986..f0e4648a5a9 100644
--- a/components/layout_2020/replaced.rs
+++ b/components/layout_2020/replaced.rs
@@ -94,8 +94,10 @@ impl NaturalSizes {
#[derive(Serialize)]
pub(crate) enum CanvasSource {
WebGL(ImageKey),
- Image(Option<Arc<Mutex<IpcSender<CanvasMsg>>>>),
+ Image(Arc<Mutex<IpcSender<CanvasMsg>>>),
WebGPU(ImageKey),
+ /// transparent black
+ Empty,
}
impl fmt::Debug for CanvasSource {
@@ -107,6 +109,7 @@ impl fmt::Debug for CanvasSource {
CanvasSource::WebGL(_) => "WebGL",
CanvasSource::Image(_) => "Image",
CanvasSource::WebGPU(_) => "WebGPU",
+ CanvasSource::Empty => "Empty",
}
)
}
@@ -376,20 +379,18 @@ impl ReplacedContent {
let image_key = match canvas_info.source {
CanvasSource::WebGL(image_key) => image_key,
CanvasSource::WebGPU(image_key) => image_key,
- CanvasSource::Image(ref ipc_renderer) => match *ipc_renderer {
- Some(ref ipc_renderer) => {
- let ipc_renderer = ipc_renderer.lock().unwrap();
- let (sender, receiver) = ipc::channel().unwrap();
- ipc_renderer
- .send(CanvasMsg::FromLayout(
- FromLayoutMsg::SendData(sender),
- canvas_info.canvas_id,
- ))
- .unwrap();
- receiver.recv().unwrap().image_key
- },
- None => return vec![],
+ CanvasSource::Image(ref ipc_renderer) => {
+ let ipc_renderer = ipc_renderer.lock().unwrap();
+ let (sender, receiver) = ipc::channel().unwrap();
+ ipc_renderer
+ .send(CanvasMsg::FromLayout(
+ FromLayoutMsg::SendData(sender),
+ canvas_info.canvas_id,
+ ))
+ .unwrap();
+ receiver.recv().unwrap().image_key
},
+ CanvasSource::Empty => return vec![],
};
vec![Fragment::Image(ImageFragment {
base: self.base_fragment_info.into(),
diff --git a/components/script/dom/htmlcanvaselement.rs b/components/script/dom/htmlcanvaselement.rs
index f58acb028ee..839c233cb1e 100644
--- a/components/script/dom/htmlcanvaselement.rs
+++ b/components/script/dom/htmlcanvaselement.rs
@@ -137,12 +137,12 @@ impl LayoutHTMLCanvasElementHelpers for LayoutDom<'_, HTMLCanvasElement> {
let source = unsafe {
match self.unsafe_get().context.borrow_for_layout().as_ref() {
Some(CanvasContext::Context2d(context)) => {
- HTMLCanvasDataSource::Image(Some(context.to_layout().get_ipc_renderer()))
+ HTMLCanvasDataSource::Image(context.to_layout().get_ipc_renderer())
},
Some(CanvasContext::WebGL(context)) => context.to_layout().canvas_data_source(),
Some(CanvasContext::WebGL2(context)) => context.to_layout().canvas_data_source(),
Some(CanvasContext::WebGPU(context)) => context.to_layout().canvas_data_source(),
- None => HTMLCanvasDataSource::Image(None),
+ None => HTMLCanvasDataSource::Empty,
}
};
diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs
index 19175cdeb5c..c2fafc4f596 100644
--- a/components/script/dom/webglrenderingcontext.rs
+++ b/components/script/dom/webglrenderingcontext.rs
@@ -665,7 +665,7 @@ impl WebGLRenderingContext {
HTMLCanvasElementOrOffscreenCanvas::HTMLCanvasElement(ref canvas) => {
document_from_node(&**canvas)
},
- HTMLCanvasElementOrOffscreenCanvas::OffscreenCanvas(ref canvas) => {
+ HTMLCanvasElementOrOffscreenCanvas::OffscreenCanvas(ref _canvas) => {
// TODO: Support retrieving image pixels here for OffscreenCanvas
return Ok(None);
},
diff --git a/components/shared/script_layout/lib.rs b/components/shared/script_layout/lib.rs
index 3969cc332fb..67f95327453 100644
--- a/components/shared/script_layout/lib.rs
+++ b/components/shared/script_layout/lib.rs
@@ -116,8 +116,10 @@ pub enum LayoutElementType {
pub enum HTMLCanvasDataSource {
WebGL(ImageKey),
- Image(Option<IpcSender<CanvasMsg>>),
+ Image(IpcSender<CanvasMsg>),
WebGPU(ImageKey),
+ /// transparent black
+ Empty,
}
pub struct HTMLCanvasData {