1 use std::ptr; 2 3 use base::CGFloat; 4 use core_foundation::base::{CFRetain, CFTypeID}; 5 use core_foundation::data::CFData; 6 use color_space::CGColorSpace; 7 use data_provider::{CGDataProviderRef, CGDataProvider}; 8 use geometry::CGRect; 9 use libc::size_t; 10 use foreign_types::{ForeignType, ForeignTypeRef}; 11 12 #[repr(C)] 13 pub enum CGImageAlphaInfo { 14 CGImageAlphaNone, /* For example, RGB. */ 15 CGImageAlphaPremultipliedLast, /* For example, premultiplied RGBA */ 16 CGImageAlphaPremultipliedFirst, /* For example, premultiplied ARGB */ 17 CGImageAlphaLast, /* For example, non-premultiplied RGBA */ 18 CGImageAlphaFirst, /* For example, non-premultiplied ARGB */ 19 CGImageAlphaNoneSkipLast, /* For example, RBGX. */ 20 CGImageAlphaNoneSkipFirst, /* For example, XRBG. */ 21 CGImageAlphaOnly /* No color data, alpha data only */ 22 } 23 24 #[repr(C)] 25 pub enum CGImageByteOrderInfo { 26 CGImageByteOrderMask = 0x7000, 27 CGImageByteOrder16Little = (1 << 12), 28 CGImageByteOrder32Little = (2 << 12), 29 CGImageByteOrder16Big = (3 << 12), 30 CGImageByteOrder32Big = (4 << 12) 31 } 32 33 foreign_type! { 34 #[doc(hidden)] 35 type CType = ::sys::CGImage; 36 fn drop = CGImageRelease; 37 fn clone = |p| CFRetain(p as *const _) as *mut _; 38 pub struct CGImage; 39 pub struct CGImageRef; 40 } 41 42 impl CGImage { 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) -> Self43 pub fn new(width: size_t, 44 height: size_t, 45 bits_per_component: size_t, 46 bits_per_pixel: size_t, 47 bytes_per_row: size_t, 48 colorspace: &CGColorSpace, 49 bitmap_info: u32, 50 provider: &CGDataProvider, 51 should_interpolate: bool, 52 rendering_intent: u32) 53 -> Self { 54 unsafe { 55 let result = CGImageCreate(width, 56 height, 57 bits_per_component, 58 bits_per_pixel, 59 bytes_per_row, 60 colorspace.as_ptr(), 61 bitmap_info, 62 provider.as_ptr(), 63 ptr::null_mut(), 64 should_interpolate, 65 rendering_intent); 66 assert!(!result.is_null()); 67 Self::from_ptr(result) 68 } 69 } 70 type_id() -> CFTypeID71 pub fn type_id() -> CFTypeID { 72 unsafe { 73 CGImageGetTypeID() 74 } 75 } 76 } 77 78 impl CGImageRef { width(&self) -> size_t79 pub fn width(&self) -> size_t { 80 unsafe { 81 CGImageGetWidth(self.as_ptr()) 82 } 83 } 84 height(&self) -> size_t85 pub fn height(&self) -> size_t { 86 unsafe { 87 CGImageGetHeight(self.as_ptr()) 88 } 89 } 90 bits_per_component(&self) -> size_t91 pub fn bits_per_component(&self) -> size_t { 92 unsafe { 93 CGImageGetBitsPerComponent(self.as_ptr()) 94 } 95 } 96 bits_per_pixel(&self) -> size_t97 pub fn bits_per_pixel(&self) -> size_t { 98 unsafe { 99 CGImageGetBitsPerPixel(self.as_ptr()) 100 } 101 } 102 bytes_per_row(&self) -> size_t103 pub fn bytes_per_row(&self) -> size_t { 104 unsafe { 105 CGImageGetBytesPerRow(self.as_ptr()) 106 } 107 } 108 color_space(&self) -> CGColorSpace109 pub fn color_space(&self) -> CGColorSpace { 110 unsafe { 111 let cs = CGImageGetColorSpace(self.as_ptr()); 112 CFRetain(cs as *mut _); 113 CGColorSpace::from_ptr(cs) 114 } 115 } 116 117 /// Returns the raw image bytes wrapped in `CFData`. Note, the returned `CFData` owns the 118 /// underlying buffer. data(&self) -> CFData119 pub fn data(&self) -> CFData { 120 let data_provider = unsafe { 121 CGDataProviderRef::from_ptr(CGImageGetDataProvider(self.as_ptr())) 122 }; 123 data_provider.copy_data() 124 } 125 126 /// Returns a cropped image. If the `rect` specifies a rectangle which lies outside of the 127 /// image bounds, the `None` is returned. cropped(&self, rect: CGRect) -> Option<CGImage>128 pub fn cropped(&self, rect: CGRect) -> Option<CGImage> { 129 let image_ptr = unsafe { CGImageCreateWithImageInRect(self.as_ptr(), rect) }; 130 if !image_ptr.is_null() { 131 Some(unsafe { CGImage::from_ptr(image_ptr) }) 132 } else { 133 None 134 } 135 } 136 } 137 138 #[link(name = "CoreGraphics", kind = "framework")] 139 extern { CGImageGetTypeID() -> CFTypeID140 fn CGImageGetTypeID() -> CFTypeID; CGImageGetWidth(image: ::sys::CGImageRef) -> size_t141 fn CGImageGetWidth(image: ::sys::CGImageRef) -> size_t; CGImageGetHeight(image: ::sys::CGImageRef) -> size_t142 fn CGImageGetHeight(image: ::sys::CGImageRef) -> size_t; CGImageGetBitsPerComponent(image: ::sys::CGImageRef) -> size_t143 fn CGImageGetBitsPerComponent(image: ::sys::CGImageRef) -> size_t; CGImageGetBitsPerPixel(image: ::sys::CGImageRef) -> size_t144 fn CGImageGetBitsPerPixel(image: ::sys::CGImageRef) -> size_t; CGImageGetBytesPerRow(image: ::sys::CGImageRef) -> size_t145 fn CGImageGetBytesPerRow(image: ::sys::CGImageRef) -> size_t; CGImageGetColorSpace(image: ::sys::CGImageRef) -> ::sys::CGColorSpaceRef146 fn CGImageGetColorSpace(image: ::sys::CGImageRef) -> ::sys::CGColorSpaceRef; CGImageGetDataProvider(image: ::sys::CGImageRef) -> ::sys::CGDataProviderRef147 fn CGImageGetDataProvider(image: ::sys::CGImageRef) -> ::sys::CGDataProviderRef; CGImageRelease(image: ::sys::CGImageRef)148 fn CGImageRelease(image: ::sys::CGImageRef); 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::CGImageRef149 fn CGImageCreate(width: size_t, 150 height: size_t, 151 bitsPerComponent: size_t, 152 bitsPerPixel: size_t, 153 bytesPerRow: size_t, 154 space: ::sys::CGColorSpaceRef, 155 bitmapInfo: u32, 156 provider: ::sys::CGDataProviderRef, 157 decode: *const CGFloat, 158 shouldInterpolate: bool, 159 intent: u32) 160 -> ::sys::CGImageRef; CGImageCreateWithImageInRect(image: ::sys::CGImageRef, rect: CGRect) -> ::sys::CGImageRef161 fn CGImageCreateWithImageInRect(image: ::sys::CGImageRef, rect: CGRect) -> ::sys::CGImageRef; 162 163 //fn CGImageGetAlphaInfo(image: ::sys::CGImageRef) -> CGImageAlphaInfo; 164 //fn CGImageCreateCopyWithColorSpace(image: ::sys::CGImageRef, space: ::sys::CGColorSpaceRef) -> ::sys::CGImageRef 165 } 166