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 3a0d27b231

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

---------

Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>
This commit is contained in:
Samson 2024-09-22 16:04:53 +02:00 committed by GitHub
parent bab769a7cf
commit 3e29131d64
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 41 additions and 36 deletions

View file

@ -1944,20 +1944,18 @@ impl Fragment {
let image_key = match canvas_fragment_info.source { let image_key = match canvas_fragment_info.source {
CanvasFragmentSource::WebGL(image_key) => image_key, CanvasFragmentSource::WebGL(image_key) => image_key,
CanvasFragmentSource::WebGPU(image_key) => image_key, CanvasFragmentSource::WebGPU(image_key) => image_key,
CanvasFragmentSource::Image(ref ipc_renderer) => match *ipc_renderer { CanvasFragmentSource::Image(ref ipc_renderer) => {
Some(ref ipc_renderer) => { let ipc_renderer = ipc_renderer.lock().unwrap();
let ipc_renderer = ipc_renderer.lock().unwrap(); let (sender, receiver) = ipc::channel().unwrap();
let (sender, receiver) = ipc::channel().unwrap(); ipc_renderer
ipc_renderer .send(CanvasMsg::FromLayout(
.send(CanvasMsg::FromLayout( FromLayoutMsg::SendData(sender),
FromLayoutMsg::SendData(sender), canvas_fragment_info.canvas_id,
canvas_fragment_info.canvas_id, ))
)) .unwrap();
.unwrap(); receiver.recv().unwrap().image_key
receiver.recv().unwrap().image_key
},
None => return,
}, },
CanvasFragmentSource::Empty => return,
}; };
let base = create_base_display_item(state); let base = create_base_display_item(state);

View file

@ -353,8 +353,10 @@ impl InlineAbsoluteFragmentInfo {
#[derive(Clone)] #[derive(Clone)]
pub enum CanvasFragmentSource { pub enum CanvasFragmentSource {
WebGL(ImageKey), WebGL(ImageKey),
Image(Option<Arc<Mutex<IpcSender<CanvasMsg>>>>), Image(Arc<Mutex<IpcSender<CanvasMsg>>>),
WebGPU(ImageKey), WebGPU(ImageKey),
/// Transparent black
Empty,
} }
#[derive(Clone)] #[derive(Clone)]
@ -369,10 +371,11 @@ impl CanvasFragmentInfo {
pub fn new(data: HTMLCanvasData) -> CanvasFragmentInfo { pub fn new(data: HTMLCanvasData) -> CanvasFragmentInfo {
let source = match data.source { let source = match data.source {
HTMLCanvasDataSource::WebGL(texture_id) => CanvasFragmentSource::WebGL(texture_id), HTMLCanvasDataSource::WebGL(texture_id) => CanvasFragmentSource::WebGL(texture_id),
HTMLCanvasDataSource::Image(ipc_sender) => CanvasFragmentSource::Image( HTMLCanvasDataSource::Image(ipc_sender) => {
ipc_sender.map(|renderer| Arc::new(Mutex::new(renderer))), CanvasFragmentSource::Image(Arc::new(Mutex::new(ipc_sender)))
), },
HTMLCanvasDataSource::WebGPU(image_key) => CanvasFragmentSource::WebGPU(image_key), HTMLCanvasDataSource::WebGPU(image_key) => CanvasFragmentSource::WebGPU(image_key),
HTMLCanvasDataSource::Empty => CanvasFragmentSource::Empty,
}; };
CanvasFragmentInfo { CanvasFragmentInfo {

View file

@ -149,9 +149,10 @@ where
let source = match canvas_data.source { let source = match canvas_data.source {
HTMLCanvasDataSource::WebGL(texture_id) => CanvasSource::WebGL(texture_id), HTMLCanvasDataSource::WebGL(texture_id) => CanvasSource::WebGL(texture_id),
HTMLCanvasDataSource::Image(ipc_sender) => { 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::WebGPU(image_key) => CanvasSource::WebGPU(image_key),
HTMLCanvasDataSource::Empty => CanvasSource::Empty,
}; };
Some(( Some((
CanvasInfo { CanvasInfo {

View file

@ -94,8 +94,10 @@ impl NaturalSizes {
#[derive(Serialize)] #[derive(Serialize)]
pub(crate) enum CanvasSource { pub(crate) enum CanvasSource {
WebGL(ImageKey), WebGL(ImageKey),
Image(Option<Arc<Mutex<IpcSender<CanvasMsg>>>>), Image(Arc<Mutex<IpcSender<CanvasMsg>>>),
WebGPU(ImageKey), WebGPU(ImageKey),
/// transparent black
Empty,
} }
impl fmt::Debug for CanvasSource { impl fmt::Debug for CanvasSource {
@ -107,6 +109,7 @@ impl fmt::Debug for CanvasSource {
CanvasSource::WebGL(_) => "WebGL", CanvasSource::WebGL(_) => "WebGL",
CanvasSource::Image(_) => "Image", CanvasSource::Image(_) => "Image",
CanvasSource::WebGPU(_) => "WebGPU", CanvasSource::WebGPU(_) => "WebGPU",
CanvasSource::Empty => "Empty",
} }
) )
} }
@ -376,20 +379,18 @@ impl ReplacedContent {
let image_key = match canvas_info.source { let image_key = match canvas_info.source {
CanvasSource::WebGL(image_key) => image_key, CanvasSource::WebGL(image_key) => image_key,
CanvasSource::WebGPU(image_key) => image_key, CanvasSource::WebGPU(image_key) => image_key,
CanvasSource::Image(ref ipc_renderer) => match *ipc_renderer { CanvasSource::Image(ref ipc_renderer) => {
Some(ref ipc_renderer) => { let ipc_renderer = ipc_renderer.lock().unwrap();
let ipc_renderer = ipc_renderer.lock().unwrap(); let (sender, receiver) = ipc::channel().unwrap();
let (sender, receiver) = ipc::channel().unwrap(); ipc_renderer
ipc_renderer .send(CanvasMsg::FromLayout(
.send(CanvasMsg::FromLayout( FromLayoutMsg::SendData(sender),
FromLayoutMsg::SendData(sender), canvas_info.canvas_id,
canvas_info.canvas_id, ))
)) .unwrap();
.unwrap(); receiver.recv().unwrap().image_key
receiver.recv().unwrap().image_key
},
None => return vec![],
}, },
CanvasSource::Empty => return vec![],
}; };
vec![Fragment::Image(ImageFragment { vec![Fragment::Image(ImageFragment {
base: self.base_fragment_info.into(), base: self.base_fragment_info.into(),

View file

@ -137,12 +137,12 @@ impl LayoutHTMLCanvasElementHelpers for LayoutDom<'_, HTMLCanvasElement> {
let source = unsafe { let source = unsafe {
match self.unsafe_get().context.borrow_for_layout().as_ref() { match self.unsafe_get().context.borrow_for_layout().as_ref() {
Some(CanvasContext::Context2d(context)) => { 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::WebGL(context)) => context.to_layout().canvas_data_source(),
Some(CanvasContext::WebGL2(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(), Some(CanvasContext::WebGPU(context)) => context.to_layout().canvas_data_source(),
None => HTMLCanvasDataSource::Image(None), None => HTMLCanvasDataSource::Empty,
} }
}; };

View file

@ -665,7 +665,7 @@ impl WebGLRenderingContext {
HTMLCanvasElementOrOffscreenCanvas::HTMLCanvasElement(ref canvas) => { HTMLCanvasElementOrOffscreenCanvas::HTMLCanvasElement(ref canvas) => {
document_from_node(&**canvas) document_from_node(&**canvas)
}, },
HTMLCanvasElementOrOffscreenCanvas::OffscreenCanvas(ref canvas) => { HTMLCanvasElementOrOffscreenCanvas::OffscreenCanvas(ref _canvas) => {
// TODO: Support retrieving image pixels here for OffscreenCanvas // TODO: Support retrieving image pixels here for OffscreenCanvas
return Ok(None); return Ok(None);
}, },

View file

@ -116,8 +116,10 @@ pub enum LayoutElementType {
pub enum HTMLCanvasDataSource { pub enum HTMLCanvasDataSource {
WebGL(ImageKey), WebGL(ImageKey),
Image(Option<IpcSender<CanvasMsg>>), Image(IpcSender<CanvasMsg>),
WebGPU(ImageKey), WebGPU(ImageKey),
/// transparent black
Empty,
} }
pub struct HTMLCanvasData { pub struct HTMLCanvasData {