use libc::{c_float, c_uint};
use std::ptr;
use traits::Wrappable;
use sfml_types::Vector2f;
use graphics::{Drawable, Shape, Transformable, FloatRect, IntRect, Color, Texture,
RenderTarget, Transform, RenderStates};
use sfml_types::sfBool;
use csfml_graphics_sys as ffi;
pub struct RectangleShape<'s> {
rectangle_shape: *mut ffi::sfRectangleShape,
texture: Option<&'s Texture>
}
impl<'s> RectangleShape<'s> {
pub fn new() -> Option<RectangleShape<'s>> {
let rectangle = unsafe { ffi::sfRectangleShape_create() };
if rectangle.is_null() {
None
} else {
Some(RectangleShape {
rectangle_shape: rectangle,
texture: None
})
}
}
pub fn new_with_texture(texture: &'s Texture) -> Option<RectangleShape<'s>> {
let rectangle = unsafe { ffi::sfRectangleShape_create() };
if rectangle.is_null() {
None
} else {
unsafe {
ffi::sfRectangleShape_setTexture(rectangle,
texture.unwrap(),
sfBool::SFTRUE);
}
Some(RectangleShape {
rectangle_shape: rectangle,
texture: Some(texture)
})
}
}
pub fn new_init(size: &Vector2f) -> Option<RectangleShape<'s>> {
let rectangle = unsafe { ffi::sfRectangleShape_create() };
if rectangle.is_null() {
None
} else {
unsafe{
ffi::sfRectangleShape_setSize(rectangle, *size);
}
Some(RectangleShape {
rectangle_shape: rectangle,
texture: None
})
}
}
pub fn clone_opt(&self) -> Option<RectangleShape<'s>> {
let rectangle =
unsafe { ffi::sfRectangleShape_copy(self.rectangle_shape) };
if rectangle.is_null() {
None
} else {
Some(RectangleShape {
rectangle_shape: rectangle,
texture: self.texture
})
}
}
pub fn get_size(&self) -> Vector2f {
unsafe {
ffi::sfRectangleShape_getSize(self.rectangle_shape)
}
}
pub fn set_size(&mut self, size: &Vector2f) {
unsafe {
ffi::sfRectangleShape_setSize(self.rectangle_shape, *size)
}
}
pub fn set_size2f(&mut self, size_x: f32, size_y: f32) {
unsafe {
ffi::sfRectangleShape_setSize(self.rectangle_shape,
Vector2f::new(size_x, size_y))
}
}
}
impl<'s> Drawable for RectangleShape<'s> {
fn draw<RT: RenderTarget>(&self,
render_target: &mut RT,
render_states: &mut RenderStates) {
render_target.draw_rectangle_shape(self, render_states);
}
}
impl<'s> Transformable for RectangleShape<'s> {
fn set_position(&mut self, position: &Vector2f) {
unsafe {
ffi::sfRectangleShape_setPosition(self.rectangle_shape, *position)
}
}
fn set_position2f(&mut self, x: f32, y: f32) {
unsafe {
ffi::sfRectangleShape_setPosition(self.rectangle_shape,
Vector2f::new(x, y))
}
}
fn set_rotation(&mut self, angle: f32) {
unsafe {
ffi::sfRectangleShape_setRotation(self.rectangle_shape,
angle as c_float)
}
}
fn set_scale(&mut self, scale: &Vector2f) {
unsafe {
ffi::sfRectangleShape_setScale(self.rectangle_shape, *scale)
}
}
fn set_scale2f(&mut self, factor_x: f32, factor_y: f32) {
unsafe {
ffi::sfRectangleShape_setScale(self.rectangle_shape,
Vector2f::new(factor_x, factor_y))
}
}
fn set_origin(&mut self, origin: &Vector2f) {
unsafe {
ffi::sfRectangleShape_setOrigin(self.rectangle_shape, *origin)
}
}
fn set_origin2f(&mut self, x: f32, y: f32) {
unsafe {
ffi::sfRectangleShape_setOrigin(self.rectangle_shape,
Vector2f::new(x, y))
}
}
fn get_position(&self) -> Vector2f {
unsafe {
ffi::sfRectangleShape_getPosition(self.rectangle_shape)
}
}
fn get_rotation(&self) -> f32 {
unsafe {
ffi::sfRectangleShape_getRotation(self.rectangle_shape) as f32
}
}
fn get_scale(&self) -> Vector2f {
unsafe {
ffi::sfRectangleShape_getScale(self.rectangle_shape)
}
}
fn get_origin(&self) -> Vector2f {
unsafe {
ffi::sfRectangleShape_getOrigin(self.rectangle_shape)
}
}
fn move_(&mut self, offset: &Vector2f) {
unsafe {
ffi::sfRectangleShape_move(self.rectangle_shape, *offset)
}
}
fn move2f(&mut self, offset_x: f32, offset_y: f32) {
unsafe {ffi::sfRectangleShape_move(self.rectangle_shape,
Vector2f::new(offset_x, offset_y))}
}
fn rotate(&mut self, angle: f32) {
unsafe {
ffi::sfRectangleShape_rotate(self.rectangle_shape, angle as c_float)
}
}
fn scale(&mut self, factors: &Vector2f) {
unsafe {
ffi::sfRectangleShape_scale(self.rectangle_shape, *factors)
}
}
fn scale2f(&mut self, factor_x: f32, factor_y: f32) {
unsafe {
ffi::sfRectangleShape_scale(self.rectangle_shape,
Vector2f::new(factor_x, factor_y))
}
}
fn get_transform(&self) -> Transform {
unsafe {
Transform(ffi::sfRectangleShape_getTransform(self.rectangle_shape))
}
}
fn get_inverse_transform(&self) -> Transform {
unsafe {
Transform(ffi::sfRectangleShape_getInverseTransform(self.rectangle_shape))
}
}
}
impl<'s> Shape<'s> for RectangleShape<'s> {
fn set_texture(&mut self, texture: &'s Texture, reset_rect: bool) {
self.texture = Some(texture);
unsafe {
ffi::sfRectangleShape_setTexture(self.rectangle_shape,
texture.unwrap(),
sfBool::from_bool(reset_rect))
}
}
fn disable_texture(&mut self) {
self.texture = None;
unsafe {
ffi::sfRectangleShape_setTexture(self.rectangle_shape,
ptr::null_mut(),
sfBool::SFTRUE)
}
}
fn set_texture_rect(&mut self, rect: &IntRect) {
unsafe {
ffi::sfRectangleShape_setTextureRect(self.rectangle_shape, *rect)
}
}
fn set_fill_color(&mut self, color: &Color) {
unsafe {
ffi::sfRectangleShape_setFillColor(self.rectangle_shape, color.0)
}
}
fn set_outline_color(&mut self, color: &Color) {
unsafe {
ffi::sfRectangleShape_setOutlineColor(self.rectangle_shape, color.0)
}
}
fn set_outline_thickness(&mut self, thickness: f32) {
unsafe {
ffi::sfRectangleShape_setOutlineThickness(self.rectangle_shape,
thickness as c_float)
}
}
fn get_texture(&self) -> Option<&'s Texture> {
self.texture
}
fn get_texture_rect(&self) -> IntRect {
unsafe {
ffi::sfRectangleShape_getTextureRect(self.rectangle_shape)
}
}
fn get_fill_color(&self) -> Color {
unsafe {
Color(ffi::sfRectangleShape_getFillColor(self.rectangle_shape))
}
}
fn get_outline_color(&self) -> Color {
unsafe {
Color(ffi::sfRectangleShape_getOutlineColor(self.rectangle_shape))
}
}
fn get_outline_thickness(&self) -> f32 {
unsafe {
ffi::sfRectangleShape_getOutlineThickness(self.rectangle_shape)
}
}
fn get_point_count(&self) -> u32 {
unsafe {
ffi::sfRectangleShape_getPointCount(self.rectangle_shape) as u32
}
}
fn get_point(&self, index: u32) -> Vector2f {
unsafe {
ffi::sfRectangleShape_getPoint(self.rectangle_shape,
index as c_uint)
}
}
fn get_local_bounds(&self) -> FloatRect {
unsafe {
ffi::sfRectangleShape_getLocalBounds(self.rectangle_shape)
}
}
fn get_global_bounds(&self) -> FloatRect {
unsafe {
ffi::sfRectangleShape_getGlobalBounds(self.rectangle_shape)
}
}
}
impl<'s> Clone for RectangleShape<'s> {
fn clone(&self) -> RectangleShape<'s> {
let rectangle =
unsafe { ffi::sfRectangleShape_copy(self.rectangle_shape) };
if rectangle.is_null() {
panic!("Not enough memory to clone RectangleShape")
} else {
RectangleShape {
rectangle_shape: rectangle,
texture: self.texture
}
}
}
}
impl<'s> Wrappable<*mut ffi::sfRectangleShape> for RectangleShape<'s> {
fn wrap(rectangle_shape: *mut ffi::sfRectangleShape) -> RectangleShape<'s> {
RectangleShape {
rectangle_shape: rectangle_shape,
texture: None
}
}
fn unwrap(&self) -> *mut ffi::sfRectangleShape {
self.rectangle_shape
}
}
impl<'s> Drop for RectangleShape<'s> {
fn drop(&mut self) {
unsafe {
ffi::sfRectangleShape_destroy(self.rectangle_shape)
}
}
}