skia_safe/core/
image_generator.rs1use 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 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 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}