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