Skip to main content

core_graphics2/
pattern.rs

1use 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}