use std::rc::Rc;
use std::cell::RefCell;
use libc::{c_float};
use std::ptr;
use traits::{Drawable, Wrappable};
use graphics::{FloatRect, IntRect, Color, Texture,
RenderTarget, Transform, rc, RenderStates};
use sfml_types::Vector2f;
use sfml_types::sfBool;
use ffi::graphics::sprite as ffi;
pub struct Sprite {
sprite: *mut ffi::sfSprite,
texture: Option<Rc<RefCell<Texture>>>
}
impl Sprite {
pub fn new() -> Option<Sprite> {
let sp = unsafe { ffi::sfSprite_create() };
if sp.is_null() {
None
} else {
Some(Sprite {
sprite: sp,
texture: None
})
}
}
pub fn new_with_texture(texture: Rc<RefCell<Texture>>) -> Option<Sprite> {
let sp = unsafe { ffi::sfSprite_create() };
if sp.is_null() {
None
} else {
unsafe {
ffi::sfSprite_setTexture(sp,
(*texture).borrow().unwrap(),
sfBool::SFTRUE);
}
Some(Sprite {
sprite: sp,
texture: Some(texture)
})
}
}
pub fn clone_opt(&self) -> Option<Sprite> {
let sp = unsafe { ffi::sfSprite_copy(self.sprite) };
if sp.is_null() {
None
} else {
Some(Sprite {
sprite: sp,
texture: self.texture.clone()
})
}
}
pub fn set_rotation(&mut self, angle: f32) {
unsafe {
ffi::sfSprite_setRotation(self.sprite, angle as c_float)
}
}
pub fn get_rotation(&self) -> f32 {
unsafe {
ffi::sfSprite_getRotation(self.sprite) as f32
}
}
pub fn rotate(&mut self, angle: f32) {
unsafe {
ffi::sfSprite_rotate(self.sprite, angle as c_float)
}
}
pub fn set_texture(&mut self,
texture: Rc<RefCell<Texture>>,
reset_rect: bool) -> (){
unsafe {
ffi::sfSprite_setTexture(self.sprite,
(*texture).borrow().unwrap(),
sfBool::from_bool(reset_rect))
}
self.texture = Some(texture);
}
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)
}
}
pub fn get_texture(&self) -> Option<Rc<RefCell<Texture>>> {
self.texture.clone()
}
pub fn get_color(&self) -> Color {
unsafe {
ffi::sfSprite_getColor(self.sprite)
}
}
pub fn set_position(&mut self, position: &Vector2f) {
unsafe {
ffi::sfSprite_setPosition(self.sprite, *position)
}
}
pub fn set_position2f(&mut self, x: f32, y: f32) {
unsafe {
ffi::sfSprite_setPosition(self.sprite, Vector2f::new(x, y))
}
}
pub fn scale(&mut self, factors: &Vector2f) {
unsafe {
ffi::sfSprite_scale(self.sprite, *factors)
}
}
pub fn scale2f(&mut self, factor_x: f32, factor_y: f32) {
unsafe {
ffi::sfSprite_scale(self.sprite, Vector2f::new(factor_x, factor_y))
}
}
pub fn get_scale(&self) -> Vector2f {
unsafe {
ffi::sfSprite_getScale(self.sprite)
}
}
pub fn get_origin(&self) -> Vector2f {
unsafe {
ffi::sfSprite_getOrigin(self.sprite)
}
}
pub fn move_(&mut self, offset: &Vector2f) {
unsafe {
ffi::sfSprite_move(self.sprite, *offset)
}
}
pub fn move2f(&mut self, offset_x: f32, offset_y: f32) {
unsafe {
ffi::sfSprite_move(self.sprite, Vector2f::new(offset_x, offset_y))
}
}
pub fn set_scale(&mut self, scale: &Vector2f) {
unsafe {
ffi::sfSprite_setScale(self.sprite, *scale)
}
}
pub fn set_scale2f(&mut self, scale_x: f32, scale_y: f32) {
unsafe {
ffi::sfSprite_setScale(self.sprite, Vector2f::new(scale_x, scale_y))
}
}
pub fn set_origin(&mut self, origin: &Vector2f) {
unsafe {
ffi::sfSprite_setOrigin(self.sprite, *origin)
}
}
pub fn set_origin2f(&mut self, x: f32, y: f32) {
unsafe {
ffi::sfSprite_setOrigin(self.sprite, Vector2f::new(x, y))
}
}
pub fn get_position(&self) -> Vector2f {
unsafe {
ffi::sfSprite_getPosition(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)
}
}
pub fn get_transform(&self) -> Transform {
unsafe {
ffi::sfSprite_getTransform(self.sprite)
}
}
pub fn get_inverse_transform(&self) -> Transform {
unsafe {
ffi::sfSprite_getInverseTransform(self.sprite)
}
}
}
impl Clone for Sprite {
fn clone(&self) -> Sprite {
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.clone()
}
}
}
}
impl Wrappable<*mut ffi::sfSprite> for Sprite {
fn wrap(sprite: *mut ffi::sfSprite) -> Sprite {
Sprite {
sprite: sprite,
texture: None
}
}
fn unwrap(&self) -> *mut ffi::sfSprite {
self.sprite
}
}
impl Drawable for Sprite {
fn draw<RT:RenderTarget>(&self,
render_target: &mut RT,
render_states: &mut RenderStates) {
render_target.draw_sprite(self, render_states)
}
}
impl Drop for Sprite {
fn drop(&mut self) {
unsafe {
ffi::sfSprite_destroy(self.sprite)
}
}
}