diff options
author | sagudev <16504129+sagudev@users.noreply.github.com> | 2025-04-23 09:32:47 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-04-23 07:32:47 +0000 |
commit | 73b778e67f2f399846af57a2c93e22da05bb7657 (patch) | |
tree | 447ef0a21762dbac581a8113fe4bb28520bc508d /components/script/dom/webgl2renderingcontext.rs | |
parent | b6967fc4c8cc2513a85c535d87c28f5451f7de7e (diff) | |
download | servo-73b778e67f2f399846af57a2c93e22da05bb7657.tar.gz servo-73b778e67f2f399846af57a2c93e22da05bb7657.zip |
Introduce snapshot concept of canvas (#36119)
Each canvas context returns snapshot instead of just raw bytes. This
allows as to hold off conversions (BGRA <-> RGBA, (un)premultiply) to
when/if they are actually needed. For example when loading snapshot into
webgl we can load both RGBA and BGRA so no conversion is really needed.
Currently whole thing is designed to be able to be extend on
https://github.com/servo/ipc-channel/pull/356, to make less copies.
Hence some commented out code.
Fixes #35759
There are tests for these changes in WPT
---------
Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>
Diffstat (limited to 'components/script/dom/webgl2renderingcontext.rs')
-rw-r--r-- | components/script/dom/webgl2renderingcontext.rs | 11 |
1 files changed, 4 insertions, 7 deletions
diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index bb6ffa11849..416454d8719 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -24,6 +24,7 @@ use js::typedarray::{ArrayBufferView, CreateWith, Float32, Int32Array, Uint32, U use script_bindings::interfaces::WebGL2RenderingContextHelpers; use script_layout_interface::HTMLCanvasDataSource; use servo_config::pref; +use snapshot::Snapshot; use url::Host; use crate::canvas_context::CanvasContext; @@ -549,11 +550,11 @@ impl WebGL2RenderingContext { return ); - let (sender, receiver) = ipc::bytes_channel().unwrap(); + let (sender, receiver) = ipc::channel().unwrap(); self.base.send_command(WebGLCommand::ReadPixels( src_rect, format, pixel_type, sender, )); - let src = receiver.recv().unwrap(); + let (src, _) = receiver.recv().unwrap(); for i in 0..src_rect.size.height as usize { let src_start = i * src_row_bytes as usize; @@ -916,11 +917,7 @@ impl CanvasContext for WebGL2RenderingContext { self.base.resize(); } - fn get_image_data_as_shared_memory(&self) -> Option<IpcSharedMemory> { - self.base.get_image_data_as_shared_memory() - } - - fn get_image_data(&self) -> Option<Vec<u8>> { + fn get_image_data(&self) -> Option<Snapshot> { self.base.get_image_data() } |