116 lines
3.4 KiB
Rust
116 lines
3.4 KiB
Rust
// 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 <LICENSE-APACHE or
|
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, 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 libc::{c_int, c_uint};
|
|
use std::ptr;
|
|
|
|
pub struct CGSRegion {
|
|
region: ffi::CGSRegionRef,
|
|
}
|
|
|
|
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,
|
|
}
|
|
}
|
|
}
|
|
|
|
#[inline]
|
|
pub fn from_rects(rects: &[CGRect]) -> CGSRegion {
|
|
unsafe {
|
|
let mut region = ptr::null_mut();
|
|
assert!(ffi::CGSNewRegionWithRectList(rects.as_ptr(),
|
|
rects.len() as c_uint,
|
|
&mut region) == 0);
|
|
CGSRegion {
|
|
region: region,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/// This should always be memory-safe; the window server rejects any invalid surface IDs.
|
|
pub struct CGSSurface {
|
|
context_id: c_uint,
|
|
window_number: c_int,
|
|
surface_id: c_uint,
|
|
}
|
|
|
|
impl CGSSurface {
|
|
#[inline]
|
|
pub fn from_ids(context_id: c_uint, window_number: c_int, surface_id: c_uint) -> CGSSurface {
|
|
CGSSurface {
|
|
context_id: context_id,
|
|
window_number: window_number,
|
|
surface_id: surface_id,
|
|
}
|
|
}
|
|
|
|
#[inline]
|
|
pub fn id(&self) -> c_uint {
|
|
self.surface_id
|
|
}
|
|
|
|
#[inline]
|
|
pub fn set_shape(&self, region: &CGSRegion) {
|
|
unsafe {
|
|
assert!(ffi::CGSSetSurfaceShape(self.context_id,
|
|
self.window_number,
|
|
self.surface_id,
|
|
region.region) == 0)
|
|
}
|
|
}
|
|
}
|
|
|
|
mod ffi {
|
|
use geometry::CGRect;
|
|
use libc::{c_int, c_uint};
|
|
|
|
// This is an enum so that we can't easily make instances of this opaque type.
|
|
pub enum CGSRegionObject {}
|
|
|
|
pub type CGError = OSStatus;
|
|
pub type CGSRegionRef = *mut CGSRegionObject;
|
|
pub type OSStatus = i32;
|
|
|
|
#[link(name = "CoreGraphics", kind = "framework")]
|
|
extern {
|
|
pub fn CGSRegionRelease(region: CGSRegionRef);
|
|
pub fn CGSNewRegionWithRect(rect: *const CGRect, outRegion: *mut CGSRegionRef) -> CGError;
|
|
pub fn CGSNewRegionWithRectList(rects: *const CGRect,
|
|
rectCount: c_uint,
|
|
outRegion: *mut CGSRegionRef)
|
|
-> CGError;
|
|
|
|
pub fn CGSSetSurfaceShape(contextID: c_uint,
|
|
windowNumber: c_int,
|
|
surfaceID: c_uint,
|
|
region: CGSRegionRef)
|
|
-> CGError;
|
|
}
|
|
}
|
|
|