1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
use base::CGFloat;
use core_foundation::base::TCFType;
use core_foundation::dictionary::CFDictionary;
pub const CG_ZERO_POINT: CGPoint = CGPoint {
x: 0.0,
y: 0.0,
};
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct CGSize {
pub width: CGFloat,
pub height: CGFloat,
}
impl CGSize {
#[inline]
pub fn new(width: CGFloat, height: CGFloat) -> CGSize {
CGSize {
width: width,
height: height,
}
}
}
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct CGPoint {
pub x: CGFloat,
pub y: CGFloat,
}
impl CGPoint {
#[inline]
pub fn new(x: CGFloat, y: CGFloat) -> CGPoint {
CGPoint {
x: x,
y: y,
}
}
}
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct CGRect {
pub origin: CGPoint,
pub size: CGSize
}
impl CGRect {
#[inline]
pub fn new(origin: &CGPoint, size: &CGSize) -> CGRect {
CGRect {
origin: *origin,
size: *size,
}
}
#[inline]
pub fn inset(&self, size: &CGSize) -> CGRect {
unsafe {
ffi::CGRectInset(*self, size.width, size.height)
}
}
#[inline]
pub fn from_dict_representation(dict: &CFDictionary) -> Option<CGRect> {
let mut rect = CGRect::new(&CGPoint::new(0., 0.), &CGSize::new(0., 0.));
let result = unsafe {
ffi::CGRectMakeWithDictionaryRepresentation(dict.as_concrete_TypeRef(), &mut rect)
};
if result == 0 {
None
} else {
Some(rect)
}
}
#[inline]
pub fn is_empty(&self) -> bool {
unsafe {
ffi::CGRectIsEmpty(*self) == 1
}
}
#[inline]
pub fn is_intersects(&self, other: &CGRect) -> bool {
unsafe {
ffi::CGRectIntersectsRect(*self, *other) == 1
}
}
}
mod ffi {
use base::{CGFloat, boolean_t};
use geometry::CGRect;
use core_foundation::dictionary::CFDictionaryRef;
#[link(name = "ApplicationServices", kind = "framework")]
extern {
pub fn CGRectInset(rect: CGRect, dx: CGFloat, dy: CGFloat) -> CGRect;
pub fn CGRectMakeWithDictionaryRepresentation(dict: CFDictionaryRef,
rect: *mut CGRect) -> boolean_t;
pub fn CGRectIsEmpty(rect: CGRect) -> boolean_t;
pub fn CGRectIntersectsRect(rect1: CGRect, rect2: CGRect) -> boolean_t;
}
}