Skip to main content

bevy_image/
image_loader.rs

1use crate::{
2    image::{Image, ImageFormat, ImageType, TextureError},
3    TextureReinterpretationError,
4};
5use bevy_asset::{io::Reader, AssetLoader, LoadContext, RenderAssetUsages};
6use bevy_reflect::TypePath;
7use thiserror::Error;
8
9use super::{CompressedImageFormats, ImageSampler};
10use serde::{Deserialize, Serialize};
11
12/// Loader for images that can be read by the `image` crate.
13#[derive(#[automatically_derived]
impl ::core::clone::Clone for ImageLoader {
    #[inline]
    fn clone(&self) -> ImageLoader {
        ImageLoader {
            supported_compressed_formats: ::core::clone::Clone::clone(&self.supported_compressed_formats),
        }
    }
}Clone, const _: () =
    {
        #[allow(deprecated, reason =
        "derives on a deprecated type shouldn't be considered a usage")]
        impl bevy_reflect::TypePath for ImageLoader where  {
            fn type_path() -> &'static str {
                "bevy_image::image_loader::ImageLoader"
            }
            fn short_type_path() -> &'static str { "ImageLoader" }
            fn type_ident() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("ImageLoader")
            }
            fn crate_name() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("bevy_image::image_loader".split(':').next().unwrap())
            }
            fn module_path() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("bevy_image::image_loader")
            }
        }
    };TypePath)]
14pub struct ImageLoader {
15    supported_compressed_formats: CompressedImageFormats,
16}
17
18impl ImageLoader {
19    /// Full list of supported formats.
20    pub const SUPPORTED_FORMATS: &'static [ImageFormat] = &[
21        #[cfg(feature = "basis-universal")]
22        ImageFormat::Basis,
23        #[cfg(feature = "bmp")]
24        ImageFormat::Bmp,
25        #[cfg(feature = "dds")]
26        ImageFormat::Dds,
27        #[cfg(feature = "ff")]
28        ImageFormat::Farbfeld,
29        #[cfg(feature = "gif")]
30        ImageFormat::Gif,
31        #[cfg(feature = "ico")]
32        ImageFormat::Ico,
33        #[cfg(feature = "jpeg")]
34        ImageFormat::Jpeg,
35        #[cfg(feature = "ktx2")]
36        ImageFormat::Ktx2,
37        #[cfg(feature = "png")]
38        ImageFormat::Png,
39        #[cfg(feature = "pnm")]
40        ImageFormat::Pnm,
41        #[cfg(feature = "qoi")]
42        ImageFormat::Qoi,
43        #[cfg(feature = "tga")]
44        ImageFormat::Tga,
45        #[cfg(feature = "tiff")]
46        ImageFormat::Tiff,
47        #[cfg(feature = "webp")]
48        ImageFormat::WebP,
49    ];
50
51    /// Total count of file extensions, for computing supported file extensions list.
52    const COUNT_FILE_EXTENSIONS: usize = {
53        let mut count = 0;
54        let mut idx = 0;
55        while idx < Self::SUPPORTED_FORMATS.len() {
56            count += Self::SUPPORTED_FORMATS[idx].to_file_extensions().len();
57            idx += 1;
58        }
59        count
60    };
61
62    /// Gets the list of file extensions for all formats.
63    pub const SUPPORTED_FILE_EXTENSIONS: &'static [&'static str] = &{
64        let mut exts = [""; Self::COUNT_FILE_EXTENSIONS];
65        let mut ext_idx = 0;
66        let mut fmt_idx = 0;
67        while fmt_idx < Self::SUPPORTED_FORMATS.len() {
68            let mut off = 0;
69            let fmt_exts = Self::SUPPORTED_FORMATS[fmt_idx].to_file_extensions();
70            while off < fmt_exts.len() {
71                exts[ext_idx] = fmt_exts[off];
72                off += 1;
73                ext_idx += 1;
74            }
75            fmt_idx += 1;
76        }
77        exts
78    };
79
80    /// Creates a new image loader that supports the provided formats.
81    pub fn new(supported_compressed_formats: CompressedImageFormats) -> Self {
82        Self {
83            supported_compressed_formats,
84        }
85    }
86}
87
88/// How to determine an image's format when loading.
89#[derive(#[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for ImageFormatSetting {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    ImageFormatSetting::FromExtension =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "ImageFormatSetting", 0u32, "FromExtension"),
                    ImageFormatSetting::Format(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "ImageFormatSetting", 1u32, "Format", __field0),
                    ImageFormatSetting::Guess =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "ImageFormatSetting", 2u32, "Guess"),
                }
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for ImageFormatSetting {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private228::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field { __field0, __field1, __field2, }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "variant identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private228::Ok(__Field::__field0),
                            1u64 => _serde::__private228::Ok(__Field::__field1),
                            2u64 => _serde::__private228::Ok(__Field::__field2),
                            _ =>
                                _serde::__private228::Err(_serde::de::Error::invalid_value(_serde::de::Unexpected::Unsigned(__value),
                                        &"variant index 0 <= i < 3")),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "FromExtension" =>
                                _serde::__private228::Ok(__Field::__field0),
                            "Format" => _serde::__private228::Ok(__Field::__field1),
                            "Guess" => _serde::__private228::Ok(__Field::__field2),
                            _ => {
                                _serde::__private228::Err(_serde::de::Error::unknown_variant(__value,
                                        VARIANTS))
                            }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"FromExtension" =>
                                _serde::__private228::Ok(__Field::__field0),
                            b"Format" => _serde::__private228::Ok(__Field::__field1),
                            b"Guess" => _serde::__private228::Ok(__Field::__field2),
                            _ => {
                                let __value =
                                    &_serde::__private228::from_utf8_lossy(__value);
                                _serde::__private228::Err(_serde::de::Error::unknown_variant(__value,
                                        VARIANTS))
                            }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private228::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private228::PhantomData<ImageFormatSetting>,
                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = ImageFormatSetting;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "enum ImageFormatSetting")
                    }
                    fn visit_enum<__A>(self, __data: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::EnumAccess<'de> {
                        match _serde::de::EnumAccess::variant(__data)? {
                            (__Field::__field0, __variant) => {
                                _serde::de::VariantAccess::unit_variant(__variant)?;
                                _serde::__private228::Ok(ImageFormatSetting::FromExtension)
                            }
                            (__Field::__field1, __variant) =>
                                _serde::__private228::Result::map(_serde::de::VariantAccess::newtype_variant::<ImageFormat>(__variant),
                                    ImageFormatSetting::Format),
                            (__Field::__field2, __variant) => {
                                _serde::de::VariantAccess::unit_variant(__variant)?;
                                _serde::__private228::Ok(ImageFormatSetting::Guess)
                            }
                        }
                    }
                }
                #[doc(hidden)]
                const VARIANTS: &'static [&'static str] =
                    &["FromExtension", "Format", "Guess"];
                _serde::Deserializer::deserialize_enum(__deserializer,
                    "ImageFormatSetting", VARIANTS,
                    __Visitor {
                        marker: _serde::__private228::PhantomData::<ImageFormatSetting>,
                        lifetime: _serde::__private228::PhantomData,
                    })
            }
        }
    };Deserialize, #[automatically_derived]
impl ::core::default::Default for ImageFormatSetting {
    #[inline]
    fn default() -> ImageFormatSetting { Self::FromExtension }
}Default, #[automatically_derived]
impl ::core::fmt::Debug for ImageFormatSetting {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            ImageFormatSetting::FromExtension =>
                ::core::fmt::Formatter::write_str(f, "FromExtension"),
            ImageFormatSetting::Format(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Format",
                    &__self_0),
            ImageFormatSetting::Guess =>
                ::core::fmt::Formatter::write_str(f, "Guess"),
        }
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for ImageFormatSetting {
    #[inline]
    fn clone(&self) -> ImageFormatSetting {
        match self {
            ImageFormatSetting::FromExtension =>
                ImageFormatSetting::FromExtension,
            ImageFormatSetting::Format(__self_0) =>
                ImageFormatSetting::Format(::core::clone::Clone::clone(__self_0)),
            ImageFormatSetting::Guess => ImageFormatSetting::Guess,
        }
    }
}Clone)]
90pub enum ImageFormatSetting {
91    /// Determine the image format from its file extension.
92    ///
93    /// This is the default.
94    #[default]
95    FromExtension,
96    /// Declare the image format explicitly.
97    Format(ImageFormat),
98    /// Guess the image format by looking for magic bytes at the
99    /// beginning of its data.
100    Guess,
101}
102
103/// How to interpret the image as an array of textures.
104#[derive(#[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for ImageArrayLayout {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    ImageArrayLayout::RowCount { ref rows } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "ImageArrayLayout", 0u32, "RowCount", 0 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "rows", rows)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                    ImageArrayLayout::RowHeight { ref pixels } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "ImageArrayLayout", 1u32, "RowHeight", 0 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "pixels", pixels)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                    ImageArrayLayout::GridCount { ref columns, ref rows } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "ImageArrayLayout", 2u32, "GridCount", 0 + 1 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "columns", columns)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "rows", rows)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                    ImageArrayLayout::GridSize {
                        ref tile_width_pixels, ref tile_height_pixels } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "ImageArrayLayout", 3u32, "GridSize", 0 + 1 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "tile_width_pixels", tile_width_pixels)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "tile_height_pixels", tile_height_pixels)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                }
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for ImageArrayLayout {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private228::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field { __field0, __field1, __field2, __field3, }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "variant identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private228::Ok(__Field::__field0),
                            1u64 => _serde::__private228::Ok(__Field::__field1),
                            2u64 => _serde::__private228::Ok(__Field::__field2),
                            3u64 => _serde::__private228::Ok(__Field::__field3),
                            _ =>
                                _serde::__private228::Err(_serde::de::Error::invalid_value(_serde::de::Unexpected::Unsigned(__value),
                                        &"variant index 0 <= i < 4")),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "RowCount" => _serde::__private228::Ok(__Field::__field0),
                            "RowHeight" => _serde::__private228::Ok(__Field::__field1),
                            "GridCount" => _serde::__private228::Ok(__Field::__field2),
                            "GridSize" => _serde::__private228::Ok(__Field::__field3),
                            _ => {
                                _serde::__private228::Err(_serde::de::Error::unknown_variant(__value,
                                        VARIANTS))
                            }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"RowCount" => _serde::__private228::Ok(__Field::__field0),
                            b"RowHeight" => _serde::__private228::Ok(__Field::__field1),
                            b"GridCount" => _serde::__private228::Ok(__Field::__field2),
                            b"GridSize" => _serde::__private228::Ok(__Field::__field3),
                            _ => {
                                let __value =
                                    &_serde::__private228::from_utf8_lossy(__value);
                                _serde::__private228::Err(_serde::de::Error::unknown_variant(__value,
                                        VARIANTS))
                            }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private228::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private228::PhantomData<ImageArrayLayout>,
                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = ImageArrayLayout;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "enum ImageArrayLayout")
                    }
                    fn visit_enum<__A>(self, __data: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::EnumAccess<'de> {
                        match _serde::de::EnumAccess::variant(__data)? {
                            (__Field::__field0, __variant) => {
                                #[allow(non_camel_case_types)]
                                #[doc(hidden)]
                                enum __Field { __field0, __ignore, }
                                #[doc(hidden)]
                                struct __FieldVisitor;
                                #[automatically_derived]
                                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                                    type Value = __Field;
                                    fn expecting(&self,
                                        __formatter: &mut _serde::__private228::Formatter)
                                        -> _serde::__private228::fmt::Result {
                                        _serde::__private228::Formatter::write_str(__formatter,
                                            "field identifier")
                                    }
                                    fn visit_u64<__E>(self, __value: u64)
                                        -> _serde::__private228::Result<Self::Value, __E> where
                                        __E: _serde::de::Error {
                                        match __value {
                                            0u64 => _serde::__private228::Ok(__Field::__field0),
                                            _ => _serde::__private228::Ok(__Field::__ignore),
                                        }
                                    }
                                    fn visit_str<__E>(self, __value: &str)
                                        -> _serde::__private228::Result<Self::Value, __E> where
                                        __E: _serde::de::Error {
                                        match __value {
                                            "rows" => _serde::__private228::Ok(__Field::__field0),
                                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                                        }
                                    }
                                    fn visit_bytes<__E>(self, __value: &[u8])
                                        -> _serde::__private228::Result<Self::Value, __E> where
                                        __E: _serde::de::Error {
                                        match __value {
                                            b"rows" => _serde::__private228::Ok(__Field::__field0),
                                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                                        }
                                    }
                                }
                                #[automatically_derived]
                                impl<'de> _serde::Deserialize<'de> for __Field {
                                    #[inline]
                                    fn deserialize<__D>(__deserializer: __D)
                                        -> _serde::__private228::Result<Self, __D::Error> where
                                        __D: _serde::Deserializer<'de> {
                                        _serde::Deserializer::deserialize_identifier(__deserializer,
                                            __FieldVisitor)
                                    }
                                }
                                #[doc(hidden)]
                                struct __Visitor<'de> {
                                    marker: _serde::__private228::PhantomData<ImageArrayLayout>,
                                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                                }
                                #[automatically_derived]
                                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                                    type Value = ImageArrayLayout;
                                    fn expecting(&self,
                                        __formatter: &mut _serde::__private228::Formatter)
                                        -> _serde::__private228::fmt::Result {
                                        _serde::__private228::Formatter::write_str(__formatter,
                                            "struct variant ImageArrayLayout::RowCount")
                                    }
                                    #[inline]
                                    fn visit_seq<__A>(self, mut __seq: __A)
                                        -> _serde::__private228::Result<Self::Value, __A::Error>
                                        where __A: _serde::de::SeqAccess<'de> {
                                        let __field0 =
                                            match _serde::de::SeqAccess::next_element::<u32>(&mut __seq)?
                                                {
                                                _serde::__private228::Some(__value) => __value,
                                                _serde::__private228::None =>
                                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                                &"struct variant ImageArrayLayout::RowCount with 1 element")),
                                            };
                                        _serde::__private228::Ok(ImageArrayLayout::RowCount {
                                                rows: __field0,
                                            })
                                    }
                                    #[inline]
                                    fn visit_map<__A>(self, mut __map: __A)
                                        -> _serde::__private228::Result<Self::Value, __A::Error>
                                        where __A: _serde::de::MapAccess<'de> {
                                        let mut __field0: _serde::__private228::Option<u32> =
                                            _serde::__private228::None;
                                        while let _serde::__private228::Some(__key) =
                                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                                            match __key {
                                                __Field::__field0 => {
                                                    if _serde::__private228::Option::is_some(&__field0) {
                                                        return _serde::__private228::Err(<__A::Error as
                                                                        _serde::de::Error>::duplicate_field("rows"));
                                                    }
                                                    __field0 =
                                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<u32>(&mut __map)?);
                                                }
                                                _ => {
                                                    let _ =
                                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                                }
                                            }
                                        }
                                        let __field0 =
                                            match __field0 {
                                                _serde::__private228::Some(__field0) => __field0,
                                                _serde::__private228::None =>
                                                    _serde::__private228::de::missing_field("rows")?,
                                            };
                                        _serde::__private228::Ok(ImageArrayLayout::RowCount {
                                                rows: __field0,
                                            })
                                    }
                                }
                                #[doc(hidden)]
                                const FIELDS: &'static [&'static str] = &["rows"];
                                _serde::de::VariantAccess::struct_variant(__variant, FIELDS,
                                    __Visitor {
                                        marker: _serde::__private228::PhantomData::<ImageArrayLayout>,
                                        lifetime: _serde::__private228::PhantomData,
                                    })
                            }
                            (__Field::__field1, __variant) => {
                                #[allow(non_camel_case_types)]
                                #[doc(hidden)]
                                enum __Field { __field0, __ignore, }
                                #[doc(hidden)]
                                struct __FieldVisitor;
                                #[automatically_derived]
                                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                                    type Value = __Field;
                                    fn expecting(&self,
                                        __formatter: &mut _serde::__private228::Formatter)
                                        -> _serde::__private228::fmt::Result {
                                        _serde::__private228::Formatter::write_str(__formatter,
                                            "field identifier")
                                    }
                                    fn visit_u64<__E>(self, __value: u64)
                                        -> _serde::__private228::Result<Self::Value, __E> where
                                        __E: _serde::de::Error {
                                        match __value {
                                            0u64 => _serde::__private228::Ok(__Field::__field0),
                                            _ => _serde::__private228::Ok(__Field::__ignore),
                                        }
                                    }
                                    fn visit_str<__E>(self, __value: &str)
                                        -> _serde::__private228::Result<Self::Value, __E> where
                                        __E: _serde::de::Error {
                                        match __value {
                                            "pixels" => _serde::__private228::Ok(__Field::__field0),
                                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                                        }
                                    }
                                    fn visit_bytes<__E>(self, __value: &[u8])
                                        -> _serde::__private228::Result<Self::Value, __E> where
                                        __E: _serde::de::Error {
                                        match __value {
                                            b"pixels" => _serde::__private228::Ok(__Field::__field0),
                                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                                        }
                                    }
                                }
                                #[automatically_derived]
                                impl<'de> _serde::Deserialize<'de> for __Field {
                                    #[inline]
                                    fn deserialize<__D>(__deserializer: __D)
                                        -> _serde::__private228::Result<Self, __D::Error> where
                                        __D: _serde::Deserializer<'de> {
                                        _serde::Deserializer::deserialize_identifier(__deserializer,
                                            __FieldVisitor)
                                    }
                                }
                                #[doc(hidden)]
                                struct __Visitor<'de> {
                                    marker: _serde::__private228::PhantomData<ImageArrayLayout>,
                                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                                }
                                #[automatically_derived]
                                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                                    type Value = ImageArrayLayout;
                                    fn expecting(&self,
                                        __formatter: &mut _serde::__private228::Formatter)
                                        -> _serde::__private228::fmt::Result {
                                        _serde::__private228::Formatter::write_str(__formatter,
                                            "struct variant ImageArrayLayout::RowHeight")
                                    }
                                    #[inline]
                                    fn visit_seq<__A>(self, mut __seq: __A)
                                        -> _serde::__private228::Result<Self::Value, __A::Error>
                                        where __A: _serde::de::SeqAccess<'de> {
                                        let __field0 =
                                            match _serde::de::SeqAccess::next_element::<u32>(&mut __seq)?
                                                {
                                                _serde::__private228::Some(__value) => __value,
                                                _serde::__private228::None =>
                                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                                &"struct variant ImageArrayLayout::RowHeight with 1 element")),
                                            };
                                        _serde::__private228::Ok(ImageArrayLayout::RowHeight {
                                                pixels: __field0,
                                            })
                                    }
                                    #[inline]
                                    fn visit_map<__A>(self, mut __map: __A)
                                        -> _serde::__private228::Result<Self::Value, __A::Error>
                                        where __A: _serde::de::MapAccess<'de> {
                                        let mut __field0: _serde::__private228::Option<u32> =
                                            _serde::__private228::None;
                                        while let _serde::__private228::Some(__key) =
                                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                                            match __key {
                                                __Field::__field0 => {
                                                    if _serde::__private228::Option::is_some(&__field0) {
                                                        return _serde::__private228::Err(<__A::Error as
                                                                        _serde::de::Error>::duplicate_field("pixels"));
                                                    }
                                                    __field0 =
                                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<u32>(&mut __map)?);
                                                }
                                                _ => {
                                                    let _ =
                                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                                }
                                            }
                                        }
                                        let __field0 =
                                            match __field0 {
                                                _serde::__private228::Some(__field0) => __field0,
                                                _serde::__private228::None =>
                                                    _serde::__private228::de::missing_field("pixels")?,
                                            };
                                        _serde::__private228::Ok(ImageArrayLayout::RowHeight {
                                                pixels: __field0,
                                            })
                                    }
                                }
                                #[doc(hidden)]
                                const FIELDS: &'static [&'static str] = &["pixels"];
                                _serde::de::VariantAccess::struct_variant(__variant, FIELDS,
                                    __Visitor {
                                        marker: _serde::__private228::PhantomData::<ImageArrayLayout>,
                                        lifetime: _serde::__private228::PhantomData,
                                    })
                            }
                            (__Field::__field2, __variant) => {
                                #[allow(non_camel_case_types)]
                                #[doc(hidden)]
                                enum __Field { __field0, __field1, __ignore, }
                                #[doc(hidden)]
                                struct __FieldVisitor;
                                #[automatically_derived]
                                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                                    type Value = __Field;
                                    fn expecting(&self,
                                        __formatter: &mut _serde::__private228::Formatter)
                                        -> _serde::__private228::fmt::Result {
                                        _serde::__private228::Formatter::write_str(__formatter,
                                            "field identifier")
                                    }
                                    fn visit_u64<__E>(self, __value: u64)
                                        -> _serde::__private228::Result<Self::Value, __E> where
                                        __E: _serde::de::Error {
                                        match __value {
                                            0u64 => _serde::__private228::Ok(__Field::__field0),
                                            1u64 => _serde::__private228::Ok(__Field::__field1),
                                            _ => _serde::__private228::Ok(__Field::__ignore),
                                        }
                                    }
                                    fn visit_str<__E>(self, __value: &str)
                                        -> _serde::__private228::Result<Self::Value, __E> where
                                        __E: _serde::de::Error {
                                        match __value {
                                            "columns" => _serde::__private228::Ok(__Field::__field0),
                                            "rows" => _serde::__private228::Ok(__Field::__field1),
                                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                                        }
                                    }
                                    fn visit_bytes<__E>(self, __value: &[u8])
                                        -> _serde::__private228::Result<Self::Value, __E> where
                                        __E: _serde::de::Error {
                                        match __value {
                                            b"columns" => _serde::__private228::Ok(__Field::__field0),
                                            b"rows" => _serde::__private228::Ok(__Field::__field1),
                                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                                        }
                                    }
                                }
                                #[automatically_derived]
                                impl<'de> _serde::Deserialize<'de> for __Field {
                                    #[inline]
                                    fn deserialize<__D>(__deserializer: __D)
                                        -> _serde::__private228::Result<Self, __D::Error> where
                                        __D: _serde::Deserializer<'de> {
                                        _serde::Deserializer::deserialize_identifier(__deserializer,
                                            __FieldVisitor)
                                    }
                                }
                                #[doc(hidden)]
                                struct __Visitor<'de> {
                                    marker: _serde::__private228::PhantomData<ImageArrayLayout>,
                                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                                }
                                #[automatically_derived]
                                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                                    type Value = ImageArrayLayout;
                                    fn expecting(&self,
                                        __formatter: &mut _serde::__private228::Formatter)
                                        -> _serde::__private228::fmt::Result {
                                        _serde::__private228::Formatter::write_str(__formatter,
                                            "struct variant ImageArrayLayout::GridCount")
                                    }
                                    #[inline]
                                    fn visit_seq<__A>(self, mut __seq: __A)
                                        -> _serde::__private228::Result<Self::Value, __A::Error>
                                        where __A: _serde::de::SeqAccess<'de> {
                                        let __field0 =
                                            match _serde::de::SeqAccess::next_element::<u32>(&mut __seq)?
                                                {
                                                _serde::__private228::Some(__value) => __value,
                                                _serde::__private228::None =>
                                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                                &"struct variant ImageArrayLayout::GridCount with 2 elements")),
                                            };
                                        let __field1 =
                                            match _serde::de::SeqAccess::next_element::<u32>(&mut __seq)?
                                                {
                                                _serde::__private228::Some(__value) => __value,
                                                _serde::__private228::None =>
                                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
                                                                &"struct variant ImageArrayLayout::GridCount with 2 elements")),
                                            };
                                        _serde::__private228::Ok(ImageArrayLayout::GridCount {
                                                columns: __field0,
                                                rows: __field1,
                                            })
                                    }
                                    #[inline]
                                    fn visit_map<__A>(self, mut __map: __A)
                                        -> _serde::__private228::Result<Self::Value, __A::Error>
                                        where __A: _serde::de::MapAccess<'de> {
                                        let mut __field0: _serde::__private228::Option<u32> =
                                            _serde::__private228::None;
                                        let mut __field1: _serde::__private228::Option<u32> =
                                            _serde::__private228::None;
                                        while let _serde::__private228::Some(__key) =
                                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                                            match __key {
                                                __Field::__field0 => {
                                                    if _serde::__private228::Option::is_some(&__field0) {
                                                        return _serde::__private228::Err(<__A::Error as
                                                                        _serde::de::Error>::duplicate_field("columns"));
                                                    }
                                                    __field0 =
                                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<u32>(&mut __map)?);
                                                }
                                                __Field::__field1 => {
                                                    if _serde::__private228::Option::is_some(&__field1) {
                                                        return _serde::__private228::Err(<__A::Error as
                                                                        _serde::de::Error>::duplicate_field("rows"));
                                                    }
                                                    __field1 =
                                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<u32>(&mut __map)?);
                                                }
                                                _ => {
                                                    let _ =
                                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                                }
                                            }
                                        }
                                        let __field0 =
                                            match __field0 {
                                                _serde::__private228::Some(__field0) => __field0,
                                                _serde::__private228::None =>
                                                    _serde::__private228::de::missing_field("columns")?,
                                            };
                                        let __field1 =
                                            match __field1 {
                                                _serde::__private228::Some(__field1) => __field1,
                                                _serde::__private228::None =>
                                                    _serde::__private228::de::missing_field("rows")?,
                                            };
                                        _serde::__private228::Ok(ImageArrayLayout::GridCount {
                                                columns: __field0,
                                                rows: __field1,
                                            })
                                    }
                                }
                                #[doc(hidden)]
                                const FIELDS: &'static [&'static str] =
                                    &["columns", "rows"];
                                _serde::de::VariantAccess::struct_variant(__variant, FIELDS,
                                    __Visitor {
                                        marker: _serde::__private228::PhantomData::<ImageArrayLayout>,
                                        lifetime: _serde::__private228::PhantomData,
                                    })
                            }
                            (__Field::__field3, __variant) => {
                                #[allow(non_camel_case_types)]
                                #[doc(hidden)]
                                enum __Field { __field0, __field1, __ignore, }
                                #[doc(hidden)]
                                struct __FieldVisitor;
                                #[automatically_derived]
                                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                                    type Value = __Field;
                                    fn expecting(&self,
                                        __formatter: &mut _serde::__private228::Formatter)
                                        -> _serde::__private228::fmt::Result {
                                        _serde::__private228::Formatter::write_str(__formatter,
                                            "field identifier")
                                    }
                                    fn visit_u64<__E>(self, __value: u64)
                                        -> _serde::__private228::Result<Self::Value, __E> where
                                        __E: _serde::de::Error {
                                        match __value {
                                            0u64 => _serde::__private228::Ok(__Field::__field0),
                                            1u64 => _serde::__private228::Ok(__Field::__field1),
                                            _ => _serde::__private228::Ok(__Field::__ignore),
                                        }
                                    }
                                    fn visit_str<__E>(self, __value: &str)
                                        -> _serde::__private228::Result<Self::Value, __E> where
                                        __E: _serde::de::Error {
                                        match __value {
                                            "tile_width_pixels" =>
                                                _serde::__private228::Ok(__Field::__field0),
                                            "tile_height_pixels" =>
                                                _serde::__private228::Ok(__Field::__field1),
                                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                                        }
                                    }
                                    fn visit_bytes<__E>(self, __value: &[u8])
                                        -> _serde::__private228::Result<Self::Value, __E> where
                                        __E: _serde::de::Error {
                                        match __value {
                                            b"tile_width_pixels" =>
                                                _serde::__private228::Ok(__Field::__field0),
                                            b"tile_height_pixels" =>
                                                _serde::__private228::Ok(__Field::__field1),
                                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                                        }
                                    }
                                }
                                #[automatically_derived]
                                impl<'de> _serde::Deserialize<'de> for __Field {
                                    #[inline]
                                    fn deserialize<__D>(__deserializer: __D)
                                        -> _serde::__private228::Result<Self, __D::Error> where
                                        __D: _serde::Deserializer<'de> {
                                        _serde::Deserializer::deserialize_identifier(__deserializer,
                                            __FieldVisitor)
                                    }
                                }
                                #[doc(hidden)]
                                struct __Visitor<'de> {
                                    marker: _serde::__private228::PhantomData<ImageArrayLayout>,
                                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                                }
                                #[automatically_derived]
                                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                                    type Value = ImageArrayLayout;
                                    fn expecting(&self,
                                        __formatter: &mut _serde::__private228::Formatter)
                                        -> _serde::__private228::fmt::Result {
                                        _serde::__private228::Formatter::write_str(__formatter,
                                            "struct variant ImageArrayLayout::GridSize")
                                    }
                                    #[inline]
                                    fn visit_seq<__A>(self, mut __seq: __A)
                                        -> _serde::__private228::Result<Self::Value, __A::Error>
                                        where __A: _serde::de::SeqAccess<'de> {
                                        let __field0 =
                                            match _serde::de::SeqAccess::next_element::<u32>(&mut __seq)?
                                                {
                                                _serde::__private228::Some(__value) => __value,
                                                _serde::__private228::None =>
                                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                                &"struct variant ImageArrayLayout::GridSize with 2 elements")),
                                            };
                                        let __field1 =
                                            match _serde::de::SeqAccess::next_element::<u32>(&mut __seq)?
                                                {
                                                _serde::__private228::Some(__value) => __value,
                                                _serde::__private228::None =>
                                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
                                                                &"struct variant ImageArrayLayout::GridSize with 2 elements")),
                                            };
                                        _serde::__private228::Ok(ImageArrayLayout::GridSize {
                                                tile_width_pixels: __field0,
                                                tile_height_pixels: __field1,
                                            })
                                    }
                                    #[inline]
                                    fn visit_map<__A>(self, mut __map: __A)
                                        -> _serde::__private228::Result<Self::Value, __A::Error>
                                        where __A: _serde::de::MapAccess<'de> {
                                        let mut __field0: _serde::__private228::Option<u32> =
                                            _serde::__private228::None;
                                        let mut __field1: _serde::__private228::Option<u32> =
                                            _serde::__private228::None;
                                        while let _serde::__private228::Some(__key) =
                                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                                            match __key {
                                                __Field::__field0 => {
                                                    if _serde::__private228::Option::is_some(&__field0) {
                                                        return _serde::__private228::Err(<__A::Error as
                                                                        _serde::de::Error>::duplicate_field("tile_width_pixels"));
                                                    }
                                                    __field0 =
                                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<u32>(&mut __map)?);
                                                }
                                                __Field::__field1 => {
                                                    if _serde::__private228::Option::is_some(&__field1) {
                                                        return _serde::__private228::Err(<__A::Error as
                                                                        _serde::de::Error>::duplicate_field("tile_height_pixels"));
                                                    }
                                                    __field1 =
                                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<u32>(&mut __map)?);
                                                }
                                                _ => {
                                                    let _ =
                                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                                }
                                            }
                                        }
                                        let __field0 =
                                            match __field0 {
                                                _serde::__private228::Some(__field0) => __field0,
                                                _serde::__private228::None =>
                                                    _serde::__private228::de::missing_field("tile_width_pixels")?,
                                            };
                                        let __field1 =
                                            match __field1 {
                                                _serde::__private228::Some(__field1) => __field1,
                                                _serde::__private228::None =>
                                                    _serde::__private228::de::missing_field("tile_height_pixels")?,
                                            };
                                        _serde::__private228::Ok(ImageArrayLayout::GridSize {
                                                tile_width_pixels: __field0,
                                                tile_height_pixels: __field1,
                                            })
                                    }
                                }
                                #[doc(hidden)]
                                const FIELDS: &'static [&'static str] =
                                    &["tile_width_pixels", "tile_height_pixels"];
                                _serde::de::VariantAccess::struct_variant(__variant, FIELDS,
                                    __Visitor {
                                        marker: _serde::__private228::PhantomData::<ImageArrayLayout>,
                                        lifetime: _serde::__private228::PhantomData,
                                    })
                            }
                        }
                    }
                }
                #[doc(hidden)]
                const VARIANTS: &'static [&'static str] =
                    &["RowCount", "RowHeight", "GridCount", "GridSize"];
                _serde::Deserializer::deserialize_enum(__deserializer,
                    "ImageArrayLayout", VARIANTS,
                    __Visitor {
                        marker: _serde::__private228::PhantomData::<ImageArrayLayout>,
                        lifetime: _serde::__private228::PhantomData,
                    })
            }
        }
    };Deserialize, #[automatically_derived]
impl ::core::fmt::Debug for ImageArrayLayout {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            ImageArrayLayout::RowCount { rows: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f,
                    "RowCount", "rows", &__self_0),
            ImageArrayLayout::RowHeight { pixels: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f,
                    "RowHeight", "pixels", &__self_0),
            ImageArrayLayout::GridCount { columns: __self_0, rows: __self_1 }
                =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f,
                    "GridCount", "columns", __self_0, "rows", &__self_1),
            ImageArrayLayout::GridSize {
                tile_width_pixels: __self_0, tile_height_pixels: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f,
                    "GridSize", "tile_width_pixels", __self_0,
                    "tile_height_pixels", &__self_1),
        }
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for ImageArrayLayout {
    #[inline]
    fn clone(&self) -> ImageArrayLayout {
        let _: ::core::clone::AssertParamIsClone<u32>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for ImageArrayLayout { }Copy)]
105pub enum ImageArrayLayout {
106    /// Interpret the image as a vertical stack of *n* images.
107    RowCount {
108        /// The total number of images in the stack.
109        rows: u32,
110    },
111    /// Interpret the image as a vertical stack of images, each *n* pixels tall.
112    RowHeight {
113        /// The height of a single image in the stack.
114        pixels: u32,
115    },
116    /// Interpret the image as a grid of images, with **n** columns and rows.
117    GridCount {
118        /// The number of columns in the grid.
119        columns: u32,
120        /// The number of rows in the grid.
121        rows: u32,
122    },
123    /// Interpret the image as a grid of images where each tile is **n** pixels wide/tall.
124    GridSize {
125        /// The width of a single tile in pixels.
126        tile_width_pixels: u32,
127        /// The height of a single tile in pixels.
128        tile_height_pixels: u32,
129    },
130}
131
132/// Settings for loading an [`Image`] using an [`ImageLoader`].
133#[derive(#[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for ImageLoaderSettings {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer,
                            "ImageLoaderSettings",
                            false as usize + 1 + 1 + 1 + 1 + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "format", &self.format)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "texture_format", &self.texture_format)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "is_srgb", &self.is_srgb)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "sampler", &self.sampler)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "asset_usage", &self.asset_usage)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "array_layout", &self.array_layout)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for ImageLoaderSettings {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private228::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field {
                    __field0,
                    __field1,
                    __field2,
                    __field3,
                    __field4,
                    __field5,
                    __ignore,
                }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "field identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private228::Ok(__Field::__field0),
                            1u64 => _serde::__private228::Ok(__Field::__field1),
                            2u64 => _serde::__private228::Ok(__Field::__field2),
                            3u64 => _serde::__private228::Ok(__Field::__field3),
                            4u64 => _serde::__private228::Ok(__Field::__field4),
                            5u64 => _serde::__private228::Ok(__Field::__field5),
                            _ => _serde::__private228::Ok(__Field::__ignore),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "format" => _serde::__private228::Ok(__Field::__field0),
                            "texture_format" =>
                                _serde::__private228::Ok(__Field::__field1),
                            "is_srgb" => _serde::__private228::Ok(__Field::__field2),
                            "sampler" => _serde::__private228::Ok(__Field::__field3),
                            "asset_usage" =>
                                _serde::__private228::Ok(__Field::__field4),
                            "array_layout" =>
                                _serde::__private228::Ok(__Field::__field5),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"format" => _serde::__private228::Ok(__Field::__field0),
                            b"texture_format" =>
                                _serde::__private228::Ok(__Field::__field1),
                            b"is_srgb" => _serde::__private228::Ok(__Field::__field2),
                            b"sampler" => _serde::__private228::Ok(__Field::__field3),
                            b"asset_usage" =>
                                _serde::__private228::Ok(__Field::__field4),
                            b"array_layout" =>
                                _serde::__private228::Ok(__Field::__field5),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private228::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private228::PhantomData<ImageLoaderSettings>,
                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = ImageLoaderSettings;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "struct ImageLoaderSettings")
                    }
                    #[inline]
                    fn visit_seq<__A>(self, mut __seq: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::SeqAccess<'de> {
                        let __field0 =
                            match _serde::de::SeqAccess::next_element::<ImageFormatSetting>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                &"struct ImageLoaderSettings with 6 elements")),
                            };
                        let __field1 =
                            match _serde::de::SeqAccess::next_element::<Option<wgpu_types::TextureFormat>>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    _serde::__private228::Default::default(),
                            };
                        let __field2 =
                            match _serde::de::SeqAccess::next_element::<bool>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(2usize,
                                                &"struct ImageLoaderSettings with 6 elements")),
                            };
                        let __field3 =
                            match _serde::de::SeqAccess::next_element::<ImageSampler>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(3usize,
                                                &"struct ImageLoaderSettings with 6 elements")),
                            };
                        let __field4 =
                            match _serde::de::SeqAccess::next_element::<RenderAssetUsages>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(4usize,
                                                &"struct ImageLoaderSettings with 6 elements")),
                            };
                        let __field5 =
                            match _serde::de::SeqAccess::next_element::<Option<ImageArrayLayout>>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    _serde::__private228::Default::default(),
                            };
                        _serde::__private228::Ok(ImageLoaderSettings {
                                format: __field0,
                                texture_format: __field1,
                                is_srgb: __field2,
                                sampler: __field3,
                                asset_usage: __field4,
                                array_layout: __field5,
                            })
                    }
                    #[inline]
                    fn visit_map<__A>(self, mut __map: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::MapAccess<'de> {
                        let mut __field0:
                                _serde::__private228::Option<ImageFormatSetting> =
                            _serde::__private228::None;
                        let mut __field1:
                                _serde::__private228::Option<Option<wgpu_types::TextureFormat>> =
                            _serde::__private228::None;
                        let mut __field2: _serde::__private228::Option<bool> =
                            _serde::__private228::None;
                        let mut __field3:
                                _serde::__private228::Option<ImageSampler> =
                            _serde::__private228::None;
                        let mut __field4:
                                _serde::__private228::Option<RenderAssetUsages> =
                            _serde::__private228::None;
                        let mut __field5:
                                _serde::__private228::Option<Option<ImageArrayLayout>> =
                            _serde::__private228::None;
                        while let _serde::__private228::Some(__key) =
                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                            match __key {
                                __Field::__field0 => {
                                    if _serde::__private228::Option::is_some(&__field0) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("format"));
                                    }
                                    __field0 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<ImageFormatSetting>(&mut __map)?);
                                }
                                __Field::__field1 => {
                                    if _serde::__private228::Option::is_some(&__field1) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("texture_format"));
                                    }
                                    __field1 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Option<wgpu_types::TextureFormat>>(&mut __map)?);
                                }
                                __Field::__field2 => {
                                    if _serde::__private228::Option::is_some(&__field2) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("is_srgb"));
                                    }
                                    __field2 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<bool>(&mut __map)?);
                                }
                                __Field::__field3 => {
                                    if _serde::__private228::Option::is_some(&__field3) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("sampler"));
                                    }
                                    __field3 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<ImageSampler>(&mut __map)?);
                                }
                                __Field::__field4 => {
                                    if _serde::__private228::Option::is_some(&__field4) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("asset_usage"));
                                    }
                                    __field4 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<RenderAssetUsages>(&mut __map)?);
                                }
                                __Field::__field5 => {
                                    if _serde::__private228::Option::is_some(&__field5) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("array_layout"));
                                    }
                                    __field5 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Option<ImageArrayLayout>>(&mut __map)?);
                                }
                                _ => {
                                    let _ =
                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                }
                            }
                        }
                        let __field0 =
                            match __field0 {
                                _serde::__private228::Some(__field0) => __field0,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("format")?,
                            };
                        let __field1 =
                            match __field1 {
                                _serde::__private228::Some(__field1) => __field1,
                                _serde::__private228::None =>
                                    _serde::__private228::Default::default(),
                            };
                        let __field2 =
                            match __field2 {
                                _serde::__private228::Some(__field2) => __field2,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("is_srgb")?,
                            };
                        let __field3 =
                            match __field3 {
                                _serde::__private228::Some(__field3) => __field3,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("sampler")?,
                            };
                        let __field4 =
                            match __field4 {
                                _serde::__private228::Some(__field4) => __field4,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("asset_usage")?,
                            };
                        let __field5 =
                            match __field5 {
                                _serde::__private228::Some(__field5) => __field5,
                                _serde::__private228::None =>
                                    _serde::__private228::Default::default(),
                            };
                        _serde::__private228::Ok(ImageLoaderSettings {
                                format: __field0,
                                texture_format: __field1,
                                is_srgb: __field2,
                                sampler: __field3,
                                asset_usage: __field4,
                                array_layout: __field5,
                            })
                    }
                }
                #[doc(hidden)]
                const FIELDS: &'static [&'static str] =
                    &["format", "texture_format", "is_srgb", "sampler",
                                "asset_usage", "array_layout"];
                _serde::Deserializer::deserialize_struct(__deserializer,
                    "ImageLoaderSettings", FIELDS,
                    __Visitor {
                        marker: _serde::__private228::PhantomData::<ImageLoaderSettings>,
                        lifetime: _serde::__private228::PhantomData,
                    })
            }
        }
    };Deserialize, #[automatically_derived]
impl ::core::fmt::Debug for ImageLoaderSettings {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["format", "texture_format", "is_srgb", "sampler", "asset_usage",
                        "array_layout"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.format, &self.texture_format, &self.is_srgb,
                        &self.sampler, &self.asset_usage, &&self.array_layout];
        ::core::fmt::Formatter::debug_struct_fields_finish(f,
            "ImageLoaderSettings", names, values)
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for ImageLoaderSettings {
    #[inline]
    fn clone(&self) -> ImageLoaderSettings {
        ImageLoaderSettings {
            format: ::core::clone::Clone::clone(&self.format),
            texture_format: ::core::clone::Clone::clone(&self.texture_format),
            is_srgb: ::core::clone::Clone::clone(&self.is_srgb),
            sampler: ::core::clone::Clone::clone(&self.sampler),
            asset_usage: ::core::clone::Clone::clone(&self.asset_usage),
            array_layout: ::core::clone::Clone::clone(&self.array_layout),
        }
    }
}Clone)]
134pub struct ImageLoaderSettings {
135    /// How to determine the image's container format.
136    pub format: ImageFormatSetting,
137    /// Forcibly use a specific [`wgpu_types::TextureFormat`].
138    /// Useful to control how data is handled when used
139    /// in a shader.
140    /// Ex: data that would be `R16Uint` that needs to
141    /// be sampled as a float using `R16Snorm`.
142    #[serde(default)]
143    pub texture_format: Option<wgpu_types::TextureFormat>,
144    /// Specifies whether image data is linear
145    /// or in sRGB space when this is not determined by
146    /// the image format.
147    pub is_srgb: bool,
148    /// [`ImageSampler`] to use when rendering - this does
149    /// not affect the loading of the image data.
150    pub sampler: ImageSampler,
151    /// Where the asset will be used - see the docs on
152    /// [`RenderAssetUsages`] for details.
153    pub asset_usage: RenderAssetUsages,
154    /// Interpret the image as an array of images. This is
155    /// primarily for use with the `texture2DArray` shader
156    /// uniform type.
157    #[serde(default)]
158    pub array_layout: Option<ImageArrayLayout>,
159}
160
161impl Default for ImageLoaderSettings {
162    fn default() -> Self {
163        Self {
164            format: ImageFormatSetting::default(),
165            texture_format: None,
166            is_srgb: true,
167            sampler: ImageSampler::Default,
168            asset_usage: RenderAssetUsages::default(),
169            array_layout: None,
170        }
171    }
172}
173
174/// An error when loading an image using [`ImageLoader`].
175#[non_exhaustive]
176#[derive(#[automatically_derived]
impl ::core::fmt::Debug for ImageLoaderError {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            ImageLoaderError::Io(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Io",
                    &__self_0),
            ImageLoaderError::FileTexture(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "FileTexture", &__self_0),
            ImageLoaderError::ArrayLayout(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "ArrayLayout", &__self_0),
        }
    }
}Debug, fn from(source: TextureReinterpretationError) -> Self {
    ImageLoaderError::ArrayLayout { 0: source }
}Error)]
177pub enum ImageLoaderError {
178    /// An error occurred while trying to load the image bytes.
179    #[error("Failed to load image bytes: {0}")]
180    Io(#[from] std::io::Error),
181    /// An error occurred while trying to decode the image bytes.
182    #[error("Could not load texture file: {0}")]
183    FileTexture(#[from] FileTextureError),
184    /// An error occurred while trying to interpret the image bytes as an array texture.
185    #[error("Invalid array layout: {0}")]
186    ArrayLayout(#[from] TextureReinterpretationError),
187}
188
189impl AssetLoader for ImageLoader {
190    type Asset = Image;
191    type Settings = ImageLoaderSettings;
192    type Error = ImageLoaderError;
193    async fn load(
194        &self,
195        reader: &mut dyn Reader,
196        settings: &ImageLoaderSettings,
197        load_context: &mut LoadContext<'_>,
198    ) -> Result<Image, Self::Error> {
199        let mut bytes = Vec::new();
200        reader.read_to_end(&mut bytes).await?;
201        let image_type = match settings.format {
202            ImageFormatSetting::FromExtension => {
203                // use the file extension for the image type
204                let ext = load_context
205                    .path()
206                    .path()
207                    .extension()
208                    .unwrap()
209                    .to_str()
210                    .unwrap();
211                ImageType::Extension(ext)
212            }
213            ImageFormatSetting::Format(format) => ImageType::Format(format),
214            ImageFormatSetting::Guess => {
215                let format = image::guess_format(&bytes).map_err(|err| FileTextureError {
216                    error: err.into(),
217                    path: ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("{0}",
                load_context.path().path().display()))
    })format!("{}", load_context.path().path().display()),
218                })?;
219                ImageType::Format(ImageFormat::from_image_crate_format(format).ok_or_else(
220                    || FileTextureError {
221                        error: TextureError::UnsupportedTextureFormat(::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("{0:?}", format))
    })format!("{format:?}")),
222                        path: ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("{0}",
                load_context.path().path().display()))
    })format!("{}", load_context.path().path().display()),
223                    },
224                )?)
225            }
226        };
227
228        let mut image = Image::from_buffer(
229            &bytes,
230            image_type,
231            self.supported_compressed_formats,
232            settings.is_srgb,
233            settings.sampler.clone(),
234            settings.asset_usage,
235        )
236        .map_err(|err| FileTextureError {
237            error: err,
238            path: ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("{0}",
                load_context.path().path().display()))
    })format!("{}", load_context.path().path().display()),
239        })?;
240
241        if let Some(format) = settings.texture_format {
242            image.texture_descriptor.format = format;
243        }
244
245        if let Some(array_layout) = settings.array_layout {
246            let image = match array_layout {
247                ImageArrayLayout::RowCount { rows } => {
248                    image.reinterpret_stacked_2d_as_array(rows)?;
249                    image
250                }
251                ImageArrayLayout::RowHeight { pixels } => {
252                    image.reinterpret_stacked_2d_as_array(image.height() / pixels)?;
253                    image
254                }
255                ImageArrayLayout::GridCount { columns, rows } => {
256                    image.create_stacked_array_from_2d_grid(rows, columns)?
257                }
258                ImageArrayLayout::GridSize {
259                    tile_width_pixels,
260                    tile_height_pixels,
261                } => image.create_stacked_array_from_2d_grid(
262                    image.height() / tile_height_pixels,
263                    image.width() / tile_width_pixels,
264                )?,
265            };
266            return Ok(image);
267        }
268        Ok(image)
269    }
270
271    fn extensions(&self) -> &[&str] {
272        Self::SUPPORTED_FILE_EXTENSIONS
273    }
274}
275
276/// An error that occurs when loading a texture from a file.
277#[derive(#[allow(unused_qualifications)]
#[automatically_derived]
impl ::core::fmt::Display for FileTextureError {
    #[allow(clippy :: used_underscore_binding)]
    fn fmt(&self, __formatter: &mut ::core::fmt::Formatter)
        -> ::core::fmt::Result {
        use ::thiserror::__private18::AsDisplay as _;
        #[allow(unused_variables, deprecated)]
        let Self { error, path } = self;
        match (path.as_display(), error.as_display()) {
            (__display_path, __display_error) =>
                __formatter.write_fmt(format_args!("Error reading image file {0}: {1}.",
                        __display_path, __display_error)),
        }
    }
}Error, #[automatically_derived]
impl ::core::fmt::Debug for FileTextureError {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f,
            "FileTextureError", "error", &self.error, "path", &&self.path)
    }
}Debug)]
278#[error("Error reading image file {path}: {error}.")]
279pub struct FileTextureError {
280    error: TextureError,
281    path: String,
282}