core_graphics2/
pattern.rs1use 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}