core_graphics2/
pattern.rs1use core_foundation::{
2 base::{CFTypeID, TCFType},
3 impl_CFTypeDescription, impl_TCFType,
4};
5use libc::c_void;
6
7use crate::{affine_transform::CGAffineTransform, base::CGFloat, context::CGContextRef, geometry::CGRect};
8
9#[repr(C)]
10pub struct __CGPattern(c_void);
11
12pub type CGPatternRef = *const __CGPattern;
13
14#[repr(i32)]
15#[derive(Clone, Copy, Debug, Eq, PartialEq)]
16pub enum CGPatternTiling {
17 #[doc(alias = "kCGPatternTilingNoDistortion")]
18 NoDistortion,
19 #[doc(alias = "kCGPatternTilingConstantSpacingMinimalDistortion")]
20 ConstantSpacingMinimalDistortion,
21 #[doc(alias = "kCGPatternTilingConstantSpacing")]
22 ConstantSpacing,
23}
24
25pub type CGPatternDrawPatternCallback = extern "C" fn(*mut c_void, CGContextRef);
26pub type CGPatternReleaseInfoCallback = extern "C" fn(*mut c_void);
27
28pub struct CGPatternCallbacks {
29 pub version: u32,
30 pub drawPattern: CGPatternDrawPatternCallback,
31 pub releaseInfo: CGPatternReleaseInfoCallback,
32}
33
34extern "C" {
35 pub fn CGPatternGetTypeID() -> CFTypeID;
36 pub fn CGPatternCreate(
37 info: *mut c_void,
38 bounds: CGRect,
39 matrix: CGAffineTransform,
40 xStep: CGFloat,
41 yStep: CGFloat,
42 tiling: CGPatternTiling,
43 isColored: i32,
44 callbacks: *const CGPatternCallbacks,
45 ) -> CGPatternRef;
46 pub fn CGPatternRetain(pattern: CGPatternRef) -> CGPatternRef;
47 pub fn CGPatternRelease(pattern: CGPatternRef);
48}
49
50pub struct CGPattern(CGPatternRef);
51
52impl Drop for CGPattern {
53 fn drop(&mut self) {
54 unsafe { CGPatternRelease(self.0) }
55 }
56}
57
58impl_TCFType!(CGPattern, CGPatternRef, CGPatternGetTypeID);
59impl_CFTypeDescription!(CGPattern);
60
61impl CGPattern {
62 pub unsafe fn new(
63 info: *mut c_void,
64 bounds: CGRect,
65 matrix: CGAffineTransform,
66 xStep: CGFloat,
67 yStep: CGFloat,
68 tiling: CGPatternTiling,
69 is_colored: i32,
70 callbacks: Option<&CGPatternCallbacks>,
71 ) -> Self {
72 unsafe {
73 let pattern =
74 CGPatternCreate(info, bounds, matrix, xStep, yStep, tiling, is_colored, callbacks.map_or(std::ptr::null(), |c| c as *const _));
75 TCFType::wrap_under_create_rule(pattern)
76 }
77 }
78}