Skip to main content

core_graphics2/
pattern.rs

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