diff --git a/src/lib.rs b/src/lib.rs index a7d45ea..a162a1c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -18,4 +18,5 @@ pub mod data_provider; pub mod display; pub mod font; pub mod geometry; +pub mod private; diff --git a/src/private.rs b/src/private.rs new file mode 100644 index 0000000..ff9a57d --- /dev/null +++ b/src/private.rs @@ -0,0 +1,57 @@ +// Copyright 2016 The Servo Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +//! Evil private APIs. +//! +//! These are liable to change at any time. Use with caution! + +use geometry::CGRect; +use std::ptr; + +pub struct CGSRegion { + region: ffi::CGSRegion, +} + +impl Drop for CGSRegion { + fn drop(&mut self) { + unsafe { + ffi::CGSRegionRelease(self.region) + } + } +} + +impl CGSRegion { + #[inline] + pub fn from_rect(rect: &CGRect) -> CGSRegion { + unsafe { + let mut region = ptr::null_mut(); + assert!(ffi::CGSNewRegionWithRect(rect, &mut region) == 0); + CGSRegion { + region: region, + } + } + } +} + +mod ffi { + use geometry::CGRect; + + // This is an enum so that we can't easily make instances of this opaque type. + enum CGSRegionObject {} + + pub type CGSRegion = *mut CGSRegionObject; + pub type OSStatus = i32; + + #[link(name = "ApplicationServices", kind = "framework")] + extern { + pub fn CGSRegionRelease(region: CGSRegion); + pub fn CGSNewRegionWithRect(rect: *const CGRect, region: *mut CGSRegion) -> OSStatus; + } +} +