diff --git a/src/color_space.rs b/src/color_space.rs index 20764c3..4117084 100644 --- a/src/color_space.rs +++ b/src/color_space.rs @@ -7,81 +7,35 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -use core_foundation::base::{CFRelease, CFRetain, CFTypeID, CFTypeRef, TCFType}; -use std::mem; +use core_foundation::base::{CFRelease, CFRetain, CFTypeID}; +use foreign_types::ForeignType; -// This is an enum due to zero-sized types warnings. -// For more details see https://github.com/rust-lang/rust/issues/27303 -pub enum __CGColorSpace {} - -pub type CGColorSpaceRef = *const __CGColorSpace; - -pub struct CGColorSpace { - obj: CGColorSpaceRef, +foreign_type! { + type CType = ::sys::CGColorSpace; + fn drop = |p| CFRelease(p as *mut _); + fn clone = |p| CFRetain(p as *const _) as *mut _; + pub struct CGColorSpace; + pub struct CGColorSpaceRef; } -impl Drop for CGColorSpace { - fn drop(&mut self) { - unsafe { - CFRelease(self.as_CFTypeRef()) - } - } -} - -impl Clone for CGColorSpace { - fn clone(&self) -> CGColorSpace { - unsafe { - TCFType::wrap_under_get_rule(self.as_concrete_TypeRef()) - } - } -} - -impl TCFType for CGColorSpace { - #[inline] - fn as_concrete_TypeRef(&self) -> CGColorSpaceRef { - self.obj - } - - #[inline] - unsafe fn wrap_under_get_rule(reference: CGColorSpaceRef) -> CGColorSpace { - let reference: CGColorSpaceRef = mem::transmute(CFRetain(mem::transmute(reference))); - TCFType::wrap_under_create_rule(reference) - } - - #[inline] - fn as_CFTypeRef(&self) -> CFTypeRef { - unsafe { - mem::transmute(self.as_concrete_TypeRef()) - } - } - - #[inline] - unsafe fn wrap_under_create_rule(obj: CGColorSpaceRef) -> CGColorSpace { - CGColorSpace { - obj: obj, - } - } - - #[inline] - fn type_id() -> CFTypeID { +impl CGColorSpace { + pub fn type_id() -> CFTypeID { unsafe { CGColorSpaceGetTypeID() } } -} -impl CGColorSpace { pub fn create_device_rgb() -> CGColorSpace { unsafe { let result = CGColorSpaceCreateDeviceRGB(); - TCFType::wrap_under_create_rule(result) + CGColorSpace::from_ptr(result) } } } #[link(name = "ApplicationServices", kind = "framework")] extern { - fn CGColorSpaceCreateDeviceRGB() -> CGColorSpaceRef; + fn CGColorSpaceCreateDeviceRGB() -> ::sys::CGColorSpaceRef; fn CGColorSpaceGetTypeID() -> CFTypeID; } diff --git a/src/context.rs b/src/context.rs index a0141d0..8a9ac3a 100644 --- a/src/context.rs +++ b/src/context.rs @@ -8,7 +8,7 @@ // except according to those terms. use base::CGFloat; -use color_space::{CGColorSpace, CGColorSpaceRef}; +use color_space::CGColorSpace; use core_foundation::base::{CFRelease, CFRetain, CFTypeID, CFTypeRef, TCFType}; use libc::{c_void, c_int, size_t}; use std::mem; @@ -104,7 +104,7 @@ impl CGContext { height, bits_per_component, bytes_per_row, - space.as_concrete_TypeRef(), + space.as_ptr(), bitmap_info); assert!(!result.is_null()); TCFType::wrap_under_create_rule(result) @@ -256,7 +256,7 @@ extern { height: size_t, bitsPerComponent: size_t, bytesPerRow: size_t, - space: CGColorSpaceRef, + space: ::sys::CGColorSpaceRef, bitmapInfo: u32) -> CGContextRef; fn CGBitmapContextGetData(context: CGContextRef) -> *mut c_void; diff --git a/src/image.rs b/src/image.rs index 38c8ca1..3cb9c7b 100644 --- a/src/image.rs +++ b/src/image.rs @@ -1,6 +1,6 @@ use core_foundation::base::{CFRetain, CFTypeID, TCFType}; use core_foundation::data::CFData; -use color_space::{CGColorSpace, CGColorSpaceRef}; +use color_space::CGColorSpace; use data_provider::{CGDataProvider, CGDataProviderRef}; use libc::size_t; use foreign_types::ForeignType; @@ -75,7 +75,9 @@ impl CGImageRef { pub fn color_space(&self) -> CGColorSpace { unsafe { - TCFType::wrap_under_get_rule(CGImageGetColorSpace(self.as_ptr())) + let cs = CGImageGetColorSpace(self.as_ptr()); + CFRetain(cs as *mut _); + CGColorSpace::from_ptr(cs) } } @@ -97,10 +99,10 @@ extern { fn CGImageGetBitsPerComponent(image: ::sys::CGImageRef) -> size_t; fn CGImageGetBitsPerPixel(image: ::sys::CGImageRef) -> size_t; fn CGImageGetBytesPerRow(image: ::sys::CGImageRef) -> size_t; - fn CGImageGetColorSpace(image: ::sys::CGImageRef) -> CGColorSpaceRef; + fn CGImageGetColorSpace(image: ::sys::CGImageRef) -> ::sys::CGColorSpaceRef; fn CGImageGetDataProvider(image: ::sys::CGImageRef) -> CGDataProviderRef; fn CGImageRelease(image: ::sys::CGImageRef); //fn CGImageGetAlphaInfo(image: ::sys::CGImageRef) -> CGImageAlphaInfo; - //fn CGImageCreateCopyWithColorSpace(image: ::sys::CGImageRef, space: CGColorSpaceRef) -> ::sys::CGImageRef + //fn CGImageCreateCopyWithColorSpace(image: ::sys::CGImageRef, space: ::sys::CGColorSpaceRef) -> ::sys::CGImageRef } diff --git a/src/sys.rs b/src/sys.rs index 897c3cc..86bf701 100644 --- a/src/sys.rs +++ b/src/sys.rs @@ -1,3 +1,6 @@ pub enum CGImage {} pub type CGImageRef = *mut CGImage; + +pub enum CGColorSpace {} +pub type CGColorSpaceRef = *mut CGColorSpace;