core_graphics2/
affine_transform.rs1use 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}