diff options
Diffstat (limited to 'components/script/dom/webgpu/gpucanvascontext.rs')
-rw-r--r-- | components/script/dom/webgpu/gpucanvascontext.rs | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/components/script/dom/webgpu/gpucanvascontext.rs b/components/script/dom/webgpu/gpucanvascontext.rs index 51627071271..e1cfd4e5176 100644 --- a/components/script/dom/webgpu/gpucanvascontext.rs +++ b/components/script/dom/webgpu/gpucanvascontext.rs @@ -8,7 +8,7 @@ use std::cell::RefCell; use arrayvec::ArrayVec; use dom_struct::dom_struct; use euclid::default::Size2D; -use ipc_channel::ipc; +use ipc_channel::ipc::{self, IpcSharedMemory}; use script_layout_interface::HTMLCanvasDataSource; use webgpu::swapchain::WebGPUContextId; use webgpu::wgc::id; @@ -306,6 +306,28 @@ impl GPUCanvasContext { .replace(Some(self.texture_descriptor_for_canvas(configuration))); } } + + /// <https://gpuweb.github.io/gpuweb/#ref-for-abstract-opdef-get-a-copy-of-the-image-contents-of-a-context%E2%91%A5> + pub(crate) fn get_ipc_image(&self) -> IpcSharedMemory { + // 1. Return a copy of the image contents of context. + if self.drawing_buffer.borrow().cleared { + IpcSharedMemory::from_byte(0, self.size().area() as usize * 4) + } else { + let (sender, receiver) = ipc::channel().unwrap(); + self.channel + .0 + .send(WebGPURequest::GetImage { + context_id: self.context_id, + sender, + }) + .unwrap(); + receiver.recv().unwrap() + } + } + + pub(crate) fn get_image_data(&self) -> Vec<u8> { + self.get_ipc_image().to_vec() + } } impl LayoutCanvasRenderingContextHelpers for LayoutDom<'_, GPUCanvasContext> { |