1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
use crate::{
    c::spTextureRegion,
    c_interface::{NewFromPtr, SyncPtr},
};

#[cfg(feature = "mint")]
use mint::Vector2;

/// A region of a texture, usually imported from an [`AtlasRegion`](`crate::atlas::AtlasRegion`).
#[derive(Debug)]
pub struct TextureRegion {
    c_texture_region: SyncPtr<spTextureRegion>,
}

impl NewFromPtr<spTextureRegion> for TextureRegion {
    unsafe fn new_from_ptr(c_texture_region: *mut spTextureRegion) -> Self {
        Self {
            c_texture_region: SyncPtr(c_texture_region),
        }
    }
}

impl TextureRegion {
    c_accessor!(u, u, f32);
    c_accessor!(v, v, f32);
    c_accessor!(u2, u2, f32);
    c_accessor!(v2, v2, f32);
    c_accessor!(degrees, degrees, i32);
    c_accessor!(offset_x, offsetX, f32);
    c_accessor!(offset_y, offsetY, f32);
    c_accessor!(width, width, i32);
    c_accessor!(height, height, i32);
    c_accessor!(original_width, originalWidth, i32);
    c_accessor!(original_height, originalHeight, i32);
    c_accessor_renderer_object!();
    c_ptr!(c_texture_region, spTextureRegion);
}

/// Functions available if using the `mint` feature.
#[cfg(feature = "mint")]
impl TextureRegion {
    #[must_use]
    pub fn uvs(&self) -> (Vector2<f32>, Vector2<f32>) {
        (
            Vector2 {
                x: self.u(),
                y: self.v(),
            },
            Vector2 {
                x: self.u2(),
                y: self.v2(),
            },
        )
    }

    #[must_use]
    pub fn offset(&self) -> Vector2<f32> {
        Vector2 {
            x: self.offset_x(),
            y: self.offset_y(),
        }
    }

    #[must_use]
    pub fn size(&self) -> Vector2<i32> {
        Vector2 {
            x: self.width(),
            y: self.height(),
        }
    }

    #[must_use]
    pub fn original_size(&self) -> Vector2<i32> {
        Vector2 {
            x: self.original_width(),
            y: self.original_height(),
        }
    }
}