use crate::sys;
#[derive(Debug, Clone, Copy)]
pub struct Transform {
pub m: [f32; 6],
}
impl Transform {
pub fn identity() -> Self {
let mut m = [0.0f32; 6];
unsafe { sys::nvgTransformIdentity(m.as_mut_ptr()) };
Self { m }
}
pub fn from_translate(tx: f32, ty: f32) -> Self {
let mut m = [0.0f32; 6];
unsafe { sys::nvgTransformTranslate(m.as_mut_ptr(), tx, ty) };
Self { m }
}
pub fn from_scale(sx: f32, sy: f32) -> Self {
let mut m = [0.0f32; 6];
unsafe { sys::nvgTransformScale(m.as_mut_ptr(), sx, sy) };
Self { m }
}
pub fn from_rotate(angle: f32) -> Self {
let mut m = [0.0f32; 6];
unsafe { sys::nvgTransformRotate(m.as_mut_ptr(), angle) };
Self { m }
}
pub fn translate(mut self, tx: f32, ty: f32) -> Self {
let t = Self::from_translate(tx, ty);
unsafe { sys::nvgTransformMultiply(self.m.as_mut_ptr(), t.m.as_ptr()) };
self
}
pub fn rotate(mut self, angle: f32) -> Self {
let t = Self::from_rotate(angle);
unsafe { sys::nvgTransformMultiply(self.m.as_mut_ptr(), t.m.as_ptr()) };
self
}
pub fn scale(mut self, sx: f32, sy: f32) -> Self {
let t = Self::from_scale(sx, sy);
unsafe { sys::nvgTransformMultiply(self.m.as_mut_ptr(), t.m.as_ptr()) };
self
}
pub fn skew_x(mut self, angle: f32) -> Self {
let mut t = [0.0f32; 6];
unsafe { sys::nvgTransformSkewX(t.as_mut_ptr(), angle) };
unsafe { sys::nvgTransformMultiply(self.m.as_mut_ptr(), t.as_ptr()) };
self
}
pub fn skew_y(mut self, angle: f32) -> Self {
let mut t = [0.0f32; 6];
unsafe { sys::nvgTransformSkewY(t.as_mut_ptr(), angle) };
unsafe { sys::nvgTransformMultiply(self.m.as_mut_ptr(), t.as_ptr()) };
self
}
pub fn then(mut self, other: &Transform) -> Self {
unsafe { sys::nvgTransformMultiply(self.m.as_mut_ptr(), other.m.as_ptr()) };
self
}
pub fn inverse(&self) -> Option<Self> {
let mut m = [0.0f32; 6];
let ok = unsafe { sys::nvgTransformInverse(m.as_mut_ptr(), self.m.as_ptr()) };
if ok != 0 { Some(Self { m }) } else { None }
}
pub fn apply(&self, x: f32, y: f32) -> (f32, f32) {
let mut dx = 0.0f32;
let mut dy = 0.0f32;
unsafe { sys::nvgTransformPoint(&mut dx, &mut dy, self.m.as_ptr(), x, y) };
(dx, dy)
}
}
impl Default for Transform {
fn default() -> Self {
Self::identity()
}
}
#[inline]
pub fn deg_to_rad(deg: f32) -> f32 {
unsafe { sys::nvgDegToRad(deg) }
}
#[inline]
pub fn rad_to_deg(rad: f32) -> f32 {
unsafe { sys::nvgRadToDeg(rad) }
}