skia_safe/core/
image_generator.rs

1use std::fmt;
2
3use crate::{prelude::*, yuva_pixmap_info, Data, ImageInfo, Recorder, YUVAPixmapInfo};
4use skia_bindings::{self as sb, SkImageGenerator};
5
6pub type ImageGenerator = RefHandle<SkImageGenerator>;
7unsafe_send_sync!(ImageGenerator);
8
9impl NativeDrop for SkImageGenerator {
10    fn drop(&mut self) {
11        unsafe { sb::C_SkImageGenerator_delete(self) }
12    }
13}
14
15impl fmt::Debug for ImageGenerator {
16    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
17        f.debug_struct("ImageGenerator")
18            .field("unique_id", &self.unique_id())
19            .field("info", &self.info())
20            .finish()
21    }
22}
23
24impl ImageGenerator {
25    pub fn unique_id(&self) -> u32 {
26        self.native().fUniqueID
27    }
28
29    pub fn encoded_data(&mut self) -> Option<Data> {
30        Data::from_ptr(unsafe { sb::C_SkImageGenerator_refEncodedData(self.native_mut()) })
31    }
32
33    pub fn info(&self) -> &ImageInfo {
34        ImageInfo::from_native_ref(&self.native().fInfo)
35    }
36
37    pub fn is_valid(&self, recorder: Option<&mut dyn Recorder>) -> bool {
38        unsafe {
39            sb::C_SkImageGenerator_isValid(
40                self.native(),
41                recorder
42                    .map(|r| r.as_recorder_ref())
43                    .native_ptr_or_null_mut(),
44            )
45        }
46    }
47
48    pub fn is_protected(self) -> bool {
49        unsafe { sb::C_SkImageGenerator_isProtected(self.native()) }
50    }
51
52    #[must_use]
53    pub fn get_pixels(&mut self, info: &ImageInfo, pixels: &mut [u8], row_bytes: usize) -> bool {
54        assert!(info.valid_pixels(row_bytes, pixels));
55        unsafe {
56            self.native_mut()
57                .getPixels(info.native(), pixels.as_mut_ptr() as _, row_bytes)
58        }
59    }
60
61    // TODO: m86: get_pixels(&Pixmap)
62
63    pub fn query_yuva_info(
64        &self,
65        supported_data_types: &yuva_pixmap_info::SupportedDataTypes,
66    ) -> Option<YUVAPixmapInfo> {
67        YUVAPixmapInfo::new_if_valid(|info| unsafe {
68            self.native()
69                .queryYUVAInfo(supported_data_types.native(), info)
70        })
71    }
72
73    // TODO: getYUVAPlanes()
74
75    pub fn is_texture_generator(&self) -> bool {
76        unsafe { sb::C_SkImageGenerator_isTextureGenerator(self.native()) }
77    }
78
79    #[deprecated(
80        since = "0.64.0",
81        note = "Removed, will return `None`. Use Image::deferred_from_encoded_data() or Codec::from_data()"
82    )]
83    pub fn from_encoded(_encoded: impl Into<Data>) -> Option<Self> {
84        debug_assert!(false, "Removed, will return `None` in release builds");
85        None
86    }
87}