use std::ptr; use base::CGFloat; use core_foundation::base::{CFRetain, CFTypeID}; use core_foundation::data::CFData; use color_space::CGColorSpace; use data_provider::{CGDataProviderRef, CGDataProvider}; use geometry::CGRect; use libc::size_t; use foreign_types::{ForeignType, ForeignTypeRef}; #[repr(C)] pub enum CGImageAlphaInfo { CGImageAlphaNone, /* For example, RGB. */ CGImageAlphaPremultipliedLast, /* For example, premultiplied RGBA */ CGImageAlphaPremultipliedFirst, /* For example, premultiplied ARGB */ CGImageAlphaLast, /* For example, non-premultiplied RGBA */ CGImageAlphaFirst, /* For example, non-premultiplied ARGB */ CGImageAlphaNoneSkipLast, /* For example, RBGX. */ CGImageAlphaNoneSkipFirst, /* For example, XRBG. */ CGImageAlphaOnly /* No color data, alpha data only */ } #[repr(C)] pub enum CGImageByteOrderInfo { CGImageByteOrderMask = 0x7000, CGImageByteOrder16Little = 1 << 12, CGImageByteOrder32Little = 2 << 12, CGImageByteOrder16Big = 3 << 12, CGImageByteOrder32Big = 4 << 12 } foreign_type! { #[doc(hidden)] type CType = ::sys::CGImage; fn drop = CGImageRelease; fn clone = |p| CFRetain(p as *const _) as *mut _; pub struct CGImage; pub struct CGImageRef; } impl CGImage { pub fn new(width: size_t, height: size_t, bits_per_component: size_t, bits_per_pixel: size_t, bytes_per_row: size_t, colorspace: &CGColorSpace, bitmap_info: u32, provider: &CGDataProvider, should_interpolate: bool, rendering_intent: u32) -> Self { unsafe { let result = CGImageCreate(width, height, bits_per_component, bits_per_pixel, bytes_per_row, colorspace.as_ptr(), bitmap_info, provider.as_ptr(), ptr::null_mut(), should_interpolate, rendering_intent); assert!(!result.is_null()); Self::from_ptr(result) } } pub fn type_id() -> CFTypeID { unsafe { CGImageGetTypeID() } } } impl CGImageRef { pub fn width(&self) -> size_t { unsafe { CGImageGetWidth(self.as_ptr()) } } pub fn height(&self) -> size_t { unsafe { CGImageGetHeight(self.as_ptr()) } } pub fn bits_per_component(&self) -> size_t { unsafe { CGImageGetBitsPerComponent(self.as_ptr()) } } pub fn bits_per_pixel(&self) -> size_t { unsafe { CGImageGetBitsPerPixel(self.as_ptr()) } } pub fn bytes_per_row(&self) -> size_t { unsafe { CGImageGetBytesPerRow(self.as_ptr()) } } pub fn color_space(&self) -> CGColorSpace { unsafe { let cs = CGImageGetColorSpace(self.as_ptr()); CFRetain(cs as *mut _); CGColorSpace::from_ptr(cs) } } /// Returns the raw image bytes wrapped in `CFData`. Note, the returned `CFData` owns the /// underlying buffer. pub fn data(&self) -> CFData { let data_provider = unsafe { CGDataProviderRef::from_ptr(CGImageGetDataProvider(self.as_ptr())) }; data_provider.copy_data() } /// Returns a cropped image. If the `rect` specifies a rectangle which lies outside of the /// image bounds, the `None` is returned. pub fn cropped(&self, rect: CGRect) -> Option { let image_ptr = unsafe { CGImageCreateWithImageInRect(self.as_ptr(), rect) }; if !image_ptr.is_null() { Some(unsafe { CGImage::from_ptr(image_ptr) }) } else { None } } } #[link(name = "CoreGraphics", kind = "framework")] extern { fn CGImageGetTypeID() -> CFTypeID; fn CGImageGetWidth(image: ::sys::CGImageRef) -> size_t; fn CGImageGetHeight(image: ::sys::CGImageRef) -> size_t; 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) -> ::sys::CGColorSpaceRef; fn CGImageGetDataProvider(image: ::sys::CGImageRef) -> ::sys::CGDataProviderRef; fn CGImageRelease(image: ::sys::CGImageRef); fn CGImageCreate(width: size_t, height: size_t, bitsPerComponent: size_t, bitsPerPixel: size_t, bytesPerRow: size_t, space: ::sys::CGColorSpaceRef, bitmapInfo: u32, provider: ::sys::CGDataProviderRef, decode: *const CGFloat, shouldInterpolate: bool, intent: u32) -> ::sys::CGImageRef; fn CGImageCreateWithImageInRect(image: ::sys::CGImageRef, rect: CGRect) -> ::sys::CGImageRef; //fn CGImageGetAlphaInfo(image: ::sys::CGImageRef) -> CGImageAlphaInfo; //fn CGImageCreateCopyWithColorSpace(image: ::sys::CGImageRef, space: ::sys::CGColorSpaceRef) -> ::sys::CGImageRef }