use libc::{c_float};
use std::ptr;
use traits::Wrappable;
use graphics::{Drawable, Transformable, FloatRect, IntRect, Color, Texture,
RenderTarget, Transform, RenderStates};
use sfml_types::Vector2f;
use sfml_types::sfBool;
use csfml_graphics_sys as ffi;
pub struct Sprite<'s> {
sprite: *mut ffi::sfSprite,
texture: Option<&'s Texture>
}
impl<'s> Sprite<'s> {
pub fn new() -> Option<Sprite<'s>> {
let sp = unsafe { ffi::sfSprite_create() };
if sp.is_null() {
None
} else {
Some(Sprite {
sprite: sp,
texture: None
})
}
}
pub fn new_with_texture(texture: &'s Texture) -> Option<Sprite<'s>> {
let sp = unsafe { ffi::sfSprite_create() };
if sp.is_null() {
None
} else {
unsafe {
ffi::sfSprite_setTexture(sp, texture.unwrap(), sfBool::SFTRUE);
}
Some(Sprite {
sprite: sp,
texture: Some(texture)
})
}
}
pub fn clone_opt(&self) -> Option<Sprite<'s>> {
let sp = unsafe { ffi::sfSprite_copy(self.sprite) };
if sp.is_null() {
None
} else {
Some(Sprite {
sprite: sp,
texture: self.texture
})
}
}
pub fn set_texture(&mut self, texture: &'s Texture, reset_rect: bool) {
self.texture = Some(texture);
unsafe {
ffi::sfSprite_setTexture(self.sprite,
texture.unwrap(),
sfBool::from_bool(reset_rect))
}
}
pub fn disable_texture(&mut self) {
self.texture = None;
unsafe {
ffi::sfSprite_setTexture(self.sprite, ptr::null_mut(), sfBool::SFTRUE)
}
}
pub fn set_color(&mut self, color: &Color) {
unsafe {
ffi::sfSprite_setColor(self.sprite, color.0)
}
}
pub fn get_texture(&self) -> Option<&'s Texture> {
if self.texture.is_none() {
None
} else {
self.texture
}
}
pub fn get_color(&self) -> Color {
unsafe {
Color(ffi::sfSprite_getColor(self.sprite))
}
}
pub fn get_local_bounds(&self) -> FloatRect {
unsafe {
ffi::sfSprite_getLocalBounds(self.sprite)
}
}
pub fn get_global_bounds(&self) -> FloatRect {
unsafe {
ffi::sfSprite_getGlobalBounds(self.sprite)
}
}
pub fn get_texture_rect(&self) -> IntRect {
unsafe {
ffi::sfSprite_getTextureRect(self.sprite)
}
}
pub fn set_texture_rect(&mut self, rect: &IntRect) {
unsafe {
ffi::sfSprite_setTextureRect(self.sprite, *rect)
}
}
}
impl<'s> Clone for Sprite<'s> {
fn clone(&self) -> Sprite<'s> {
let sp = unsafe { ffi::sfSprite_copy(self.sprite) };
if sp.is_null() {
panic!("Not enough memory to clone RectangleShape")
} else {
Sprite {
sprite: sp,
texture: self.texture
}
}
}
}
impl<'s> Drawable for Sprite<'s> {
fn draw<RT:RenderTarget>(&self,
render_target: &mut RT,
render_states: &mut RenderStates) {
render_target.draw_sprite(self, render_states)
}
}
impl<'s> Transformable for Sprite<'s> {
fn set_position(&mut self, position: &Vector2f) {
unsafe {
ffi::sfSprite_setPosition(self.sprite, *position)
}
}
fn set_position2f(&mut self, x: f32, y: f32) {
unsafe {
ffi::sfSprite_setPosition(self.sprite, Vector2f::new(x, y))
}
}
fn set_rotation(&mut self, angle: f32) {
unsafe {
ffi::sfSprite_setRotation(self.sprite, angle as c_float)
}
}
fn set_scale(&mut self, scale: &Vector2f) {
unsafe {
ffi::sfSprite_setScale(self.sprite, *scale)
}
}
fn set_scale2f(&mut self, scale_x: f32, scale_y: f32) {
unsafe {
ffi::sfSprite_setScale(self.sprite, Vector2f::new(scale_x, scale_y))
}
}
fn set_origin(&mut self, origin: &Vector2f) {
unsafe {
ffi::sfSprite_setOrigin(self.sprite, *origin)
}
}
fn set_origin2f(&mut self, x: f32, y: f32) {
unsafe {
ffi::sfSprite_setOrigin(self.sprite, Vector2f::new(x, y))
}
}
fn get_position(&self) -> Vector2f {
unsafe {
ffi::sfSprite_getPosition(self.sprite)
}
}
fn get_rotation(&self) -> f32 {
unsafe {
ffi::sfSprite_getRotation(self.sprite) as f32
}
}
fn get_scale(&self) -> Vector2f {
unsafe {
ffi::sfSprite_getScale(self.sprite)
}
}
fn get_origin(&self) -> Vector2f {
unsafe {
ffi::sfSprite_getOrigin(self.sprite)
}
}
fn move_(&mut self, offset: &Vector2f) {
unsafe {
ffi::sfSprite_move(self.sprite, *offset)
}
}
fn move2f(&mut self, offset_x: f32, offset_y: f32) {
unsafe {
ffi::sfSprite_move(self.sprite, Vector2f::new(offset_x, offset_y))
}
}
fn rotate(&mut self, angle: f32) {
unsafe {
ffi::sfSprite_rotate(self.sprite, angle as c_float)
}
}
fn scale(&mut self, factors: &Vector2f) {
unsafe {
ffi::sfSprite_scale(self.sprite, *factors)
}
}
fn scale2f(&mut self, factor_x: f32, factor_y: f32) {
unsafe {
ffi::sfSprite_scale(self.sprite, Vector2f::new(factor_x, factor_y))
}
}
fn get_transform(&self) -> Transform {
unsafe {
Transform(ffi::sfSprite_getTransform(self.sprite))
}
}
fn get_inverse_transform(&self) -> Transform {
unsafe {
Transform(ffi::sfSprite_getInverseTransform(self.sprite))
}
}
}
impl<'s> Wrappable<*mut ffi::sfSprite> for Sprite<'s> {
fn wrap(sprite: *mut ffi::sfSprite) -> Sprite<'s> {
Sprite {
sprite: sprite,
texture: None
}
}
fn unwrap(&self) -> *mut ffi::sfSprite {
self.sprite
}
}
impl<'s> Drop for Sprite<'s> {
fn drop(&mut self) {
unsafe {
ffi::sfSprite_destroy(self.sprite)
}
}
}