use super::InversePredictionTransformImpl;
use crate::decode::attribute::portabilization::{Deportabilization, DeportabilizationImpl};
use crate::encode::attribute::prediction_transform::geom::{
octahedral_inverse_transform,
octahedral_transform
};
use crate::core::shared::{
NdVector, Vector
};
use crate::prelude::ByteReader;
pub struct OctahedronDifferenceInverseTransform<Data>
where Data: Vector,
{
_marker: std::marker::PhantomData<Data>,
deportabilization: Deportabilization<<Self as InversePredictionTransformImpl>::Correction>,
}
impl<Data> InversePredictionTransformImpl for OctahedronDifferenceInverseTransform<Data>
where
Data: Vector,
{
const ID: usize = 2;
type Data = Data;
type Correction = NdVector<2,f64>;
type Metadata = ();
fn new<R>(reader: &mut R) -> Result<Self, super::Err>
where R: ByteReader
{
let deportabilization = Deportabilization::new(reader)?;
Ok(
Self {
_marker: std::marker::PhantomData,
deportabilization,
}
)
}
fn inverse<R>(&self, pred: Self::Data, reader: &mut R) -> Self::Data
where R: ByteReader
{
let crr = self.deportabilization.deportabilize_next(reader);
debug_assert!(
Data::NUM_COMPONENTS == 3,
);
let pred_in_oct = unsafe {
octahedral_transform(pred)
};
let orig = pred_in_oct + crr;
unsafe {
octahedral_inverse_transform(orig)
}
}
}