wgpu_types/texture/
external_image.rs1#[allow(unused_imports, reason = "conditionally used, including in docs")]
2use crate::{DownlevelFlags, Origin2d};
3
4#[cfg(all(target_arch = "wasm32", feature = "web"))]
9#[derive(Clone, Debug)]
10pub struct CopyExternalImageSourceInfo {
11 pub source: ExternalImageSource,
14 pub origin: Origin2d,
22 pub flip_y: bool,
25}
26
27#[cfg(all(target_arch = "wasm32", feature = "web"))]
32#[derive(Clone, Debug)]
33pub enum ExternalImageSource {
34 ImageBitmap(web_sys::ImageBitmap),
36 HTMLImageElement(web_sys::HtmlImageElement),
38 HTMLVideoElement(web_sys::HtmlVideoElement),
40 ImageData(web_sys::ImageData),
42 HTMLCanvasElement(web_sys::HtmlCanvasElement),
44 OffscreenCanvas(web_sys::OffscreenCanvas),
48 #[cfg(web_sys_unstable_apis)]
50 VideoFrame(web_sys::VideoFrame),
51}
52
53#[cfg(all(target_arch = "wasm32", feature = "web"))]
54impl ExternalImageSource {
55 pub fn width(&self) -> u32 {
57 match self {
58 ExternalImageSource::ImageBitmap(b) => b.width(),
59 ExternalImageSource::HTMLImageElement(i) => i.width(),
60 ExternalImageSource::HTMLVideoElement(v) => v.video_width(),
61 ExternalImageSource::ImageData(i) => i.width(),
62 ExternalImageSource::HTMLCanvasElement(c) => c.width(),
63 ExternalImageSource::OffscreenCanvas(c) => c.width(),
64 #[cfg(web_sys_unstable_apis)]
65 ExternalImageSource::VideoFrame(v) => v.display_width(),
66 }
67 }
68
69 pub fn height(&self) -> u32 {
71 match self {
72 ExternalImageSource::ImageBitmap(b) => b.height(),
73 ExternalImageSource::HTMLImageElement(i) => i.height(),
74 ExternalImageSource::HTMLVideoElement(v) => v.video_height(),
75 ExternalImageSource::ImageData(i) => i.height(),
76 ExternalImageSource::HTMLCanvasElement(c) => c.height(),
77 ExternalImageSource::OffscreenCanvas(c) => c.height(),
78 #[cfg(web_sys_unstable_apis)]
79 ExternalImageSource::VideoFrame(v) => v.display_height(),
80 }
81 }
82}
83
84#[cfg(all(target_arch = "wasm32", feature = "web"))]
85impl core::ops::Deref for ExternalImageSource {
86 type Target = js_sys::Object;
87
88 fn deref(&self) -> &Self::Target {
89 match self {
90 Self::ImageBitmap(b) => b,
91 Self::HTMLImageElement(i) => i,
92 Self::HTMLVideoElement(v) => v,
93 Self::ImageData(i) => i,
94 Self::HTMLCanvasElement(c) => c,
95 Self::OffscreenCanvas(c) => c,
96 #[cfg(web_sys_unstable_apis)]
97 Self::VideoFrame(v) => v,
98 }
99 }
100}
101
102#[cfg(all(
103 target_arch = "wasm32",
104 feature = "web",
105 feature = "fragile-send-sync-non-atomic-wasm",
106 not(target_feature = "atomics")
107))]
108unsafe impl Send for ExternalImageSource {}
109#[cfg(all(
110 target_arch = "wasm32",
111 feature = "web",
112 feature = "fragile-send-sync-non-atomic-wasm",
113 not(target_feature = "atomics")
114))]
115unsafe impl Sync for ExternalImageSource {}
116
117#[derive(Copy, Clone, Debug, PartialEq, Eq)]
122#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
123#[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))]
124pub enum PredefinedColorSpace {
125 Srgb,
127 DisplayP3,
129}
130
131#[derive(Copy, Clone, Debug)]
137#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
138pub struct CopyExternalImageDestInfo<T> {
139 pub texture: T,
141 pub mip_level: u32,
143 pub origin: crate::Origin3d,
145 pub aspect: crate::TextureAspect,
147 pub color_space: PredefinedColorSpace,
149 pub premultiplied_alpha: bool,
151}
152
153impl<T> CopyExternalImageDestInfo<T> {
154 pub fn to_untagged(self) -> crate::TexelCopyTextureInfo<T> {
156 crate::TexelCopyTextureInfo {
157 texture: self.texture,
158 mip_level: self.mip_level,
159 origin: self.origin,
160 aspect: self.aspect,
161 }
162 }
163}