Skip to main content

core_graphics2/
affine_transform.rs

1use crate::{
2    base::CGFloat,
3    geometry::{CGPoint, CGRect, CGSize, CGVector},
4};
5
6#[repr(C)]
7#[derive(Clone, Copy, Debug, Default, PartialEq)]
8pub struct CGAffineTransform {
9    pub a: CGFloat,
10    pub b: CGFloat,
11    pub c: CGFloat,
12    pub d: CGFloat,
13    pub tx: CGFloat,
14    pub ty: CGFloat,
15}
16
17#[repr(C)]
18#[derive(Clone, Copy, Debug, Default, PartialEq)]
19pub struct CGAffineTransformComponents {
20    pub scale: CGSize,
21    pub horizontal_shear: CGFloat,
22    pub rotation: CGFloat,
23    pub translation: CGVector,
24}
25
26pub const CGAffineTransformIdentity: CGAffineTransform = CGAffineTransform {
27    a: 1.0,
28    b: 0.0,
29    c: 0.0,
30    d: 1.0,
31    tx: 0.0,
32    ty: 0.0,
33};
34
35extern "C" {
36    pub fn CGAffineTransformMake(a: CGFloat, b: CGFloat, c: CGFloat, d: CGFloat, tx: CGFloat, ty: CGFloat) -> CGAffineTransform;
37    pub fn CGAffineTransformMakeTranslation(tx: CGFloat, ty: CGFloat) -> CGAffineTransform;
38    pub fn CGAffineTransformMakeScale(sx: CGFloat, sy: CGFloat) -> CGAffineTransform;
39    pub fn CGAffineTransformMakeRotation(angle: CGFloat) -> CGAffineTransform;
40    pub fn CGAffineTransformIsIdentity(t: CGAffineTransform) -> bool;
41    pub fn CGAffineTransformTranslate(t: CGAffineTransform, tx: CGFloat, ty: CGFloat) -> CGAffineTransform;
42    pub fn CGAffineTransformScale(t: CGAffineTransform, sx: CGFloat, sy: CGFloat) -> CGAffineTransform;
43    pub fn CGAffineTransformRotate(t: CGAffineTransform, angle: CGFloat) -> CGAffineTransform;
44    pub fn CGAffineTransformInvert(t: CGAffineTransform) -> CGAffineTransform;
45    pub fn CGAffineTransformConcat(t1: CGAffineTransform, t2: CGAffineTransform) -> CGAffineTransform;
46    pub fn CGPointApplyAffineTransform(point: CGPoint, t: CGAffineTransform) -> CGPoint;
47    pub fn CGSizeApplyAffineTransform(size: CGSize, t: CGAffineTransform) -> CGSize;
48    pub fn CGRectApplyAffineTransform(rect: CGRect, t: CGAffineTransform) -> CGRect;
49    pub fn CGAffineTransformDecompose(transform: CGAffineTransform) -> CGAffineTransformComponents;
50    pub fn CGAffineTransformMakeWithComponents(components: CGAffineTransformComponents) -> CGAffineTransform;
51}
52
53impl CGAffineTransform {
54    pub fn new(a: CGFloat, b: CGFloat, c: CGFloat, d: CGFloat, tx: CGFloat, ty: CGFloat) -> CGAffineTransform {
55        unsafe { CGAffineTransformMake(a, b, c, d, tx, ty) }
56    }
57
58    pub fn new_translate(tx: CGFloat, ty: CGFloat) -> CGAffineTransform {
59        unsafe { CGAffineTransformMakeTranslation(tx, ty) }
60    }
61
62    pub fn new_scale(sx: CGFloat, sy: CGFloat) -> CGAffineTransform {
63        unsafe { CGAffineTransformMakeScale(sx, sy) }
64    }
65
66    pub fn new_rotate(angle: CGFloat) -> CGAffineTransform {
67        unsafe { CGAffineTransformMakeRotation(angle) }
68    }
69
70    pub fn from_components(components: CGAffineTransformComponents) -> CGAffineTransform {
71        unsafe { CGAffineTransformMakeWithComponents(components) }
72    }
73
74    pub fn translate(&self, tx: CGFloat, ty: CGFloat) -> CGAffineTransform {
75        unsafe { CGAffineTransformTranslate(*self, tx, ty) }
76    }
77
78    pub fn scale(&self, sx: CGFloat, sy: CGFloat) -> CGAffineTransform {
79        unsafe { CGAffineTransformScale(*self, sx, sy) }
80    }
81
82    pub fn rotate(&self, angle: CGFloat) -> CGAffineTransform {
83        unsafe { CGAffineTransformRotate(*self, angle) }
84    }
85
86    pub fn is_identity(&self) -> bool {
87        unsafe { CGAffineTransformIsIdentity(*self) }
88    }
89
90    pub fn invert(&self) -> CGAffineTransform {
91        unsafe { CGAffineTransformInvert(*self) }
92    }
93
94    pub fn concat(&self, other: &CGAffineTransform) -> CGAffineTransform {
95        unsafe { CGAffineTransformConcat(*self, *other) }
96    }
97
98    pub fn decompose(&self) -> CGAffineTransformComponents {
99        unsafe { CGAffineTransformDecompose(*self) }
100    }
101}