From c9740e7ddc4b606ba80c20545e024ee9076fb33b Mon Sep 17 00:00:00 2001 From: Daniel Abramov Date: Thu, 3 May 2018 13:46:22 +0200 Subject: [PATCH 1/3] Add a constructor for `CGImage` --- core-graphics/src/image.rs | 45 +++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/core-graphics/src/image.rs b/core-graphics/src/image.rs index 93eb807..3217335 100644 --- a/core-graphics/src/image.rs +++ b/core-graphics/src/image.rs @@ -1,7 +1,10 @@ +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; +use data_provider::{CGDataProviderRef, CGDataProvider}; use libc::size_t; use foreign_types::{ForeignType, ForeignTypeRef}; @@ -36,6 +39,34 @@ foreign_type! { } 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() @@ -103,6 +134,18 @@ extern { 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 CGImageGetAlphaInfo(image: ::sys::CGImageRef) -> CGImageAlphaInfo; //fn CGImageCreateCopyWithColorSpace(image: ::sys::CGImageRef, space: ::sys::CGColorSpaceRef) -> ::sys::CGImageRef From 1eec1419a98afb6c9425863027244a1075701a8b Mon Sep 17 00:00:00 2001 From: Daniel Abramov Date: Thu, 3 May 2018 13:52:52 +0200 Subject: [PATCH 2/3] Add rendering intent constants --- core-graphics/src/base.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core-graphics/src/base.rs b/core-graphics/src/base.rs index f5c954d..e7b7a19 100644 --- a/core-graphics/src/base.rs +++ b/core-graphics/src/base.rs @@ -42,6 +42,12 @@ pub const kCGBitmapByteOrder32Little: u32 = (2 << 12); pub const kCGBitmapByteOrder16Big: u32 = (3 << 12); pub const kCGBitmapByteOrder32Big: u32 = (4 << 12); +pub const kCGRenderingIntentDefault: u32 = 0; +pub const kCGRenderingIntentAbsoluteColorimetric: u32 = 1; +pub const kCGRenderingIntentRelativeColorimetric: u32 = 2; +pub const kCGRenderingIntentPerceptual: u32 = 3; +pub const kCGRenderingIntentSaturation: u32 = 4; + #[cfg(target_endian = "big")] pub const kCGBitmapByteOrder16Host: u32 = kCGBitmapByteOrder16Big; #[cfg(target_endian = "big")] From ff9ff8406638c55f101bd8cda45d525b231deed3 Mon Sep 17 00:00:00 2001 From: Daniel Abramov Date: Wed, 23 May 2018 14:21:08 +0200 Subject: [PATCH 3/3] Add the posibility to create a provider from slice --- core-graphics/src/data_provider.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/core-graphics/src/data_provider.rs b/core-graphics/src/data_provider.rs index 6eeb110..9a50b29 100644 --- a/core-graphics/src/data_provider.rs +++ b/core-graphics/src/data_provider.rs @@ -12,6 +12,7 @@ use core_foundation::data::{CFData, CFDataRef}; use libc::{size_t, off_t}; use std::mem; +use std::ptr; use std::sync::Arc; use std::os::raw::c_void; @@ -62,6 +63,15 @@ impl CGDataProvider { drop(mem::transmute::<*mut c_void, Arc>>(info)) } } + + /// Creates a data prvider from a given slice. The data provider does not own the slice in this + /// case, so it's up to the user to ensure the memory safety here. + pub unsafe fn from_slice(buffer: &[u8]) -> Self { + let ptr = buffer.as_ptr() as *const c_void; + let len = buffer.len() as size_t; + let result = CGDataProviderCreateWithData(ptr::null_mut(), ptr, len, None); + CGDataProvider::from_ptr(result) + } } impl CGDataProviderRef {