#[allow(unused_imports, reason = "conditionally used, including in docs")]
use crate::{DownlevelFlags, Origin2d};
#[cfg(all(target_arch = "wasm32", feature = "web"))]
#[derive(Clone, Debug)]
pub struct CopyExternalImageSourceInfo {
pub source: ExternalImageSource,
pub origin: Origin2d,
pub flip_y: bool,
}
#[cfg(all(target_arch = "wasm32", feature = "web"))]
#[derive(Clone, Debug)]
pub enum ExternalImageSource {
ImageBitmap(web_sys::ImageBitmap),
HTMLImageElement(web_sys::HtmlImageElement),
HTMLVideoElement(web_sys::HtmlVideoElement),
ImageData(web_sys::ImageData),
HTMLCanvasElement(web_sys::HtmlCanvasElement),
OffscreenCanvas(web_sys::OffscreenCanvas),
#[cfg(web_sys_unstable_apis)]
VideoFrame(web_sys::VideoFrame),
}
#[cfg(all(target_arch = "wasm32", feature = "web"))]
impl ExternalImageSource {
pub fn width(&self) -> u32 {
match self {
ExternalImageSource::ImageBitmap(b) => b.width(),
ExternalImageSource::HTMLImageElement(i) => i.width(),
ExternalImageSource::HTMLVideoElement(v) => v.video_width(),
ExternalImageSource::ImageData(i) => i.width(),
ExternalImageSource::HTMLCanvasElement(c) => c.width(),
ExternalImageSource::OffscreenCanvas(c) => c.width(),
#[cfg(web_sys_unstable_apis)]
ExternalImageSource::VideoFrame(v) => v.display_width(),
}
}
pub fn height(&self) -> u32 {
match self {
ExternalImageSource::ImageBitmap(b) => b.height(),
ExternalImageSource::HTMLImageElement(i) => i.height(),
ExternalImageSource::HTMLVideoElement(v) => v.video_height(),
ExternalImageSource::ImageData(i) => i.height(),
ExternalImageSource::HTMLCanvasElement(c) => c.height(),
ExternalImageSource::OffscreenCanvas(c) => c.height(),
#[cfg(web_sys_unstable_apis)]
ExternalImageSource::VideoFrame(v) => v.display_height(),
}
}
}
#[cfg(all(target_arch = "wasm32", feature = "web"))]
impl core::ops::Deref for ExternalImageSource {
type Target = js_sys::Object;
fn deref(&self) -> &Self::Target {
match self {
Self::ImageBitmap(b) => b,
Self::HTMLImageElement(i) => i,
Self::HTMLVideoElement(v) => v,
Self::ImageData(i) => i,
Self::HTMLCanvasElement(c) => c,
Self::OffscreenCanvas(c) => c,
#[cfg(web_sys_unstable_apis)]
Self::VideoFrame(v) => v,
}
}
}
#[cfg(all(
target_arch = "wasm32",
feature = "web",
feature = "fragile-send-sync-non-atomic-wasm",
not(target_feature = "atomics")
))]
unsafe impl Send for ExternalImageSource {}
#[cfg(all(
target_arch = "wasm32",
feature = "web",
feature = "fragile-send-sync-non-atomic-wasm",
not(target_feature = "atomics")
))]
unsafe impl Sync for ExternalImageSource {}
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))]
pub enum PredefinedColorSpace {
Srgb,
DisplayP3,
}
#[derive(Copy, Clone, Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct CopyExternalImageDestInfo<T> {
pub texture: T,
pub mip_level: u32,
pub origin: crate::Origin3d,
pub aspect: crate::TextureAspect,
pub color_space: PredefinedColorSpace,
pub premultiplied_alpha: bool,
}
impl<T> CopyExternalImageDestInfo<T> {
pub fn to_untagged(self) -> crate::TexelCopyTextureInfo<T> {
crate::TexelCopyTextureInfo {
texture: self.texture,
mip_level: self.mip_level,
origin: self.origin,
aspect: self.aspect,
}
}
}