glycin-core 4.0.0-alpha.1

Sandboxed image decoding
use std::marker::PhantomData;
use std::sync::OnceLock;

use glib::prelude::*;
use glib::subclass::prelude::*;
use glib::translate::*;

use crate::FrameDetails;
use crate::gobject::new_frame::GlyPhysicalDimensionUnit;

pub mod imp {
    use super::*;

    #[derive(Debug, Default, glib::Properties)]
    #[properties(wrapper_type = super::GlyFrameDetails)]
    pub struct GlyFrameDetails {
        pub(super) frame_details: OnceLock<FrameDetails>,

        #[property(get=Self::get_pixel_density_x)]
        pixel_density_x: PhantomData<f64>,

        #[property(get=Self::get_pixel_density_x_unit, nullable, builder(GlyPhysicalDimensionUnit::default()))]
        pixel_density_x_unit: PhantomData<GlyPhysicalDimensionUnit>,

        #[property(get=Self::get_pixel_density_y)]
        pixel_density_y: PhantomData<f64>,

        #[property(get=Self::get_pixel_density_y_unit, nullable, builder(GlyPhysicalDimensionUnit::default()))]
        pixel_density_y_unit: PhantomData<GlyPhysicalDimensionUnit>,
    }

    #[glib::object_subclass]
    impl ObjectSubclass for GlyFrameDetails {
        const NAME: &'static str = "GlyFrameDetails";
        type Type = super::GlyFrameDetails;
    }

    #[glib::derived_properties]
    impl ObjectImpl for GlyFrameDetails {}

    impl GlyFrameDetails {
        fn get_pixel_density_x(&self) -> f64 {
            self.frame_details
                .get()
                .unwrap()
                .pixel_density()
                .map(|x| x.x().value())
                .unwrap_or_default()
        }

        fn get_pixel_density_x_unit(&self) -> GlyPhysicalDimensionUnit {
            self.frame_details
                .get()
                .unwrap()
                .pixel_density()
                .map(|x| unsafe { GlyPhysicalDimensionUnit::from_glib(x.x().unit().into()) })
                .unwrap_or_default()
        }

        fn get_pixel_density_y(&self) -> f64 {
            self.frame_details
                .get()
                .unwrap()
                .pixel_density()
                .map(|x| x.y().value())
                .unwrap_or_default()
        }

        fn get_pixel_density_y_unit(&self) -> GlyPhysicalDimensionUnit {
            self.frame_details
                .get()
                .unwrap()
                .pixel_density()
                .map(|x| unsafe { GlyPhysicalDimensionUnit::from_glib(x.y().unit().into()) })
                .unwrap_or_default()
        }
    }
}

glib::wrapper! {
    pub struct GlyFrameDetails(ObjectSubclass<imp::GlyFrameDetails>);
}

impl GlyFrameDetails {
    pub fn new(frame_details: FrameDetails) -> Self {
        let obj = glib::Object::new::<Self>();
        obj.imp().frame_details.set(frame_details).unwrap();
        obj
    }
}