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 VideoFrame(web_sys::VideoFrame),
50}
51
52#[cfg(all(target_arch = "wasm32", feature = "web"))]
53impl ExternalImageSource {
54 pub fn width(&self) -> u32 {
56 match self {
57 ExternalImageSource::ImageBitmap(b) => b.width(),
58 ExternalImageSource::HTMLImageElement(i) => i.width(),
59 ExternalImageSource::HTMLVideoElement(v) => v.video_width(),
60 ExternalImageSource::ImageData(i) => i.width(),
61 ExternalImageSource::HTMLCanvasElement(c) => c.width(),
62 ExternalImageSource::OffscreenCanvas(c) => c.width(),
63 ExternalImageSource::VideoFrame(v) => v.display_width(),
64 }
65 }
66
67 pub fn height(&self) -> u32 {
69 match self {
70 ExternalImageSource::ImageBitmap(b) => b.height(),
71 ExternalImageSource::HTMLImageElement(i) => i.height(),
72 ExternalImageSource::HTMLVideoElement(v) => v.video_height(),
73 ExternalImageSource::ImageData(i) => i.height(),
74 ExternalImageSource::HTMLCanvasElement(c) => c.height(),
75 ExternalImageSource::OffscreenCanvas(c) => c.height(),
76 ExternalImageSource::VideoFrame(v) => v.display_height(),
77 }
78 }
79}
80
81#[cfg(all(target_arch = "wasm32", feature = "web"))]
82impl core::ops::Deref for ExternalImageSource {
83 type Target = js_sys::Object;
84
85 fn deref(&self) -> &Self::Target {
86 match self {
87 Self::ImageBitmap(b) => b,
88 Self::HTMLImageElement(i) => i,
89 Self::HTMLVideoElement(v) => v,
90 Self::ImageData(i) => i,
91 Self::HTMLCanvasElement(c) => c,
92 Self::OffscreenCanvas(c) => c,
93 Self::VideoFrame(v) => v,
94 }
95 }
96}
97
98#[cfg(all(
99 target_arch = "wasm32",
100 feature = "web",
101 feature = "fragile-send-sync-non-atomic-wasm",
102 not(target_feature = "atomics")
103))]
104unsafe impl Send for ExternalImageSource {}
105#[cfg(all(
106 target_arch = "wasm32",
107 feature = "web",
108 feature = "fragile-send-sync-non-atomic-wasm",
109 not(target_feature = "atomics")
110))]
111unsafe impl Sync for ExternalImageSource {}
112
113#[derive(Copy, Clone, Debug, PartialEq, Eq)]
118#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
119#[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))]
120pub enum PredefinedColorSpace {
121 Srgb,
123 DisplayP3,
125}
126
127#[derive(Copy, Clone, Debug)]
133#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
134pub struct CopyExternalImageDestInfo<T> {
135 pub texture: T,
137 pub mip_level: u32,
139 pub origin: crate::Origin3d,
141 pub aspect: crate::TextureAspect,
143 pub color_space: PredefinedColorSpace,
145 pub premultiplied_alpha: bool,
147}
148
149impl<T> CopyExternalImageDestInfo<T> {
150 pub fn to_untagged(self) -> crate::TexelCopyTextureInfo<T> {
152 crate::TexelCopyTextureInfo {
153 texture: self.texture,
154 mip_level: self.mip_level,
155 origin: self.origin,
156 aspect: self.aspect,
157 }
158 }
159}