mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
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:
parent
bab769a7cf
commit
3e29131d64
7 changed files with 41 additions and 36 deletions
|
@ -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);
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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(),
|
||||||
|
|
|
@ -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,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
},
|
},
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue