core_graphics2/
pattern.rs

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