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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// Take a look at the license at the top of the repository in the LICENSE file.

use std::fmt;

use glib::translate::*;

use crate::{Vec2, Vec3, Vec4};

impl Vec4 {
    /// Initializes a [`Vec4`][crate::Vec4] using the given values.
    ///
    /// This function can be called multiple times.
    /// ## `x`
    /// the X field of the vector
    /// ## `y`
    /// the Y field of the vector
    /// ## `z`
    /// the Z field of the vector
    /// ## `w`
    /// the W field of the vector
    ///
    /// # Returns
    ///
    /// a pointer to the initialized
    ///  vector
    #[doc(alias = "graphene_vec4_init")]
    pub fn new(x: f32, y: f32, z: f32, w: f32) -> Self {
        assert_initialized_main_thread!();
        unsafe {
            let mut vec = Self::uninitialized();
            ffi::graphene_vec4_init(vec.to_glib_none_mut().0, x, y, z, w);
            vec
        }
    }

    /// Initializes a [`Vec4`][crate::Vec4] using the components of a
    /// [`Vec2`][crate::Vec2] and the values of `z` and `w`.
    /// ## `src`
    /// a [`Vec2`][crate::Vec2]
    /// ## `z`
    /// the value for the third component of `self`
    /// ## `w`
    /// the value for the fourth component of `self`
    ///
    /// # Returns
    ///
    /// the initialized vector
    #[doc(alias = "graphene_vec4_init_from_vec2")]
    #[doc(alias = "init_from_vec2")]
    pub fn from_vec2(src: &Vec2, z: f32, w: f32) -> Self {
        assert_initialized_main_thread!();
        unsafe {
            let mut vec = Self::uninitialized();
            ffi::graphene_vec4_init_from_vec2(vec.to_glib_none_mut().0, src.to_glib_none().0, z, w);
            vec
        }
    }

    /// Initializes a [`Vec4`][crate::Vec4] using the components of a
    /// [`Vec3`][crate::Vec3] and the value of `w`.
    /// ## `src`
    /// a [`Vec3`][crate::Vec3]
    /// ## `w`
    /// the value for the fourth component of `self`
    ///
    /// # Returns
    ///
    /// the initialized vector
    #[doc(alias = "graphene_vec4_init_from_vec3")]
    #[doc(alias = "init_from_vec3")]
    pub fn from_vec3(src: &Vec3, w: f32) -> Self {
        assert_initialized_main_thread!();
        unsafe {
            let mut vec = Self::uninitialized();
            ffi::graphene_vec4_init_from_vec3(vec.to_glib_none_mut().0, src.to_glib_none().0, w);
            vec
        }
    }

    /// Initializes a [`Vec4`][crate::Vec4] with the values inside the given array.
    /// ## `src`
    /// an array of four floating point values
    ///
    /// # Returns
    ///
    /// the initialized vector
    #[doc(alias = "graphene_vec4_init_from_float")]
    #[doc(alias = "init_from_float")]
    pub fn from_float(src: [f32; 4]) -> Self {
        assert_initialized_main_thread!();
        unsafe {
            let mut vec = Self::uninitialized();
            ffi::graphene_vec4_init_from_float(vec.to_glib_none_mut().0, src.as_ptr() as *const _);
            vec
        }
    }

    /// Stores the components of the given [`Vec4`][crate::Vec4] into an array
    /// of floating point values.
    ///
    /// # Returns
    ///
    ///
    /// ## `dest`
    /// return location for
    ///  an array of floating point values
    #[doc(alias = "graphene_vec4_to_float")]
    pub fn to_float(&self) -> [f32; 4] {
        unsafe {
            let mut out = std::mem::MaybeUninit::uninit();
            ffi::graphene_vec4_to_float(self.to_glib_none().0, out.as_mut_ptr());
            out.assume_init()
        }
    }
}

impl fmt::Debug for Vec4 {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        f.debug_struct("Vec4")
            .field("x", &self.x())
            .field("y", &self.y())
            .field("z", &self.z())
            .field("w", &self.w())
            .finish()
    }
}

impl Default for Vec4 {
    fn default() -> Self {
        Self::zero()
    }
}