skia_safe/encode_/
webp_encoder.rs

1use crate::{interop::RustWStream, prelude::*, Pixmap};
2use skia_bindings::SkWebpEncoder_Compression;
3use std::io;
4
5pub type Compression = SkWebpEncoder_Compression;
6variant_name!(Compression::Lossy);
7
8#[derive(Debug, Clone, PartialEq)]
9pub struct Options {
10    pub compression: Compression,
11    pub quality: f32,
12    // TODO: ICCProfile
13    // TODO: ICCProfileDescription
14}
15
16impl Default for Options {
17    fn default() -> Self {
18        Self {
19            compression: Compression::Lossy,
20            quality: 100.0,
21        }
22    }
23}
24
25pub fn encode<W: io::Write>(pixmap: &Pixmap, writer: &mut W, options: &Options) -> bool {
26    let mut stream = RustWStream::new(writer);
27    unsafe {
28        skia_bindings::C_SkWebpEncoder_Encode(
29            stream.stream_mut(),
30            pixmap.native(),
31            options.compression,
32            options.quality,
33        )
34    }
35}
36
37pub fn encode_image<'a>(
38    context: impl Into<Option<&'a mut crate::gpu::DirectContext>>,
39    img: &crate::Image,
40    options: &Options,
41) -> Option<crate::Data> {
42    crate::Data::from_ptr(unsafe {
43        skia_bindings::C_SkWebpEncoder_EncodeImage(
44            context.into().native_ptr_or_null_mut(),
45            img.native(),
46            options.compression,
47            options.quality,
48        )
49    })
50}
51
52// TODO: EncodeAnimated