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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
// This file was generated by gir (https://github.com/gtk-rs/gir)
// from gir-files (https://github.com/gtk-rs/gir-files)
// DO NOT EDIT

use glib::translate::*;
use std::mem;

glib::wrapper! {
    /// A structure specifying a transformation between user-space
    /// coordinates and device coordinates. The transformation
    /// is given by
    ///
    /// `<programlisting>`
    /// x_device = x_user * matrix->xx + y_user * matrix->xy + matrix->x0;
    /// y_device = x_user * matrix->yx + y_user * matrix->yy + matrix->y0;
    /// `</programlisting>`
    #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
    pub struct Matrix(Boxed<ffi::PangoMatrix>);

    match fn {
        copy => |ptr| ffi::pango_matrix_copy(ptr),
        free => |ptr| ffi::pango_matrix_free(ptr),
        type_ => || ffi::pango_matrix_get_type(),
    }
}

impl Matrix {
    /// Changes the transformation represented by `self` to be the
    /// transformation given by first applying transformation
    /// given by `new_matrix` then applying the original transformation.
    /// ## `new_matrix`
    /// a [`Matrix`][crate::Matrix]
    #[doc(alias = "pango_matrix_concat")]
    pub fn concat(&mut self, new_matrix: &Matrix) {
        unsafe {
            ffi::pango_matrix_concat(self.to_glib_none_mut().0, new_matrix.to_glib_none().0);
        }
    }

    /// Returns the scale factor of a matrix on the height of the font.
    /// That is, the scale factor in the direction perpendicular to the
    /// vector that the X coordinate is mapped to. If the scale in the X
    /// coordinate is needed as well, use [`font_scale_factors()`][Self::font_scale_factors()].
    ///
    /// # Returns
    ///
    /// the scale factor of `self` on the height of the font,
    /// or 1.0 if `self` is [`None`].
    #[doc(alias = "pango_matrix_get_font_scale_factor")]
    #[doc(alias = "get_font_scale_factor")]
    pub fn font_scale_factor(&self) -> f64 {
        unsafe { ffi::pango_matrix_get_font_scale_factor(self.to_glib_none().0) }
    }

    /// Calculates the scale factor of a matrix on the width and height of the font.
    /// That is, `xscale` is the scale factor in the direction of the X coordinate,
    /// and `yscale` is the scale factor in the direction perpendicular to the
    /// vector that the X coordinate is mapped to.
    ///
    /// Note that output numbers will always be non-negative.
    ///
    /// # Returns
    ///
    ///
    /// ## `xscale`
    /// output scale factor in the x direction, or [`None`]
    ///
    /// ## `yscale`
    /// output scale factor perpendicular to the x direction, or [`None`]
    #[doc(alias = "pango_matrix_get_font_scale_factors")]
    #[doc(alias = "get_font_scale_factors")]
    pub fn font_scale_factors(&self) -> (f64, f64) {
        unsafe {
            let mut xscale = mem::MaybeUninit::uninit();
            let mut yscale = mem::MaybeUninit::uninit();
            ffi::pango_matrix_get_font_scale_factors(
                self.to_glib_none().0,
                xscale.as_mut_ptr(),
                yscale.as_mut_ptr(),
            );
            let xscale = xscale.assume_init();
            let yscale = yscale.assume_init();
            (xscale, yscale)
        }
    }

    /// Changes the transformation represented by `self` to be the
    /// transformation given by first rotating by `degrees` degrees
    /// counter-clockwise then applying the original transformation.
    /// ## `degrees`
    /// degrees to rotate counter-clockwise
    #[doc(alias = "pango_matrix_rotate")]
    pub fn rotate(&mut self, degrees: f64) {
        unsafe {
            ffi::pango_matrix_rotate(self.to_glib_none_mut().0, degrees);
        }
    }

    /// Changes the transformation represented by `self` to be the
    /// transformation given by first scaling by `sx` in the X direction
    /// and `sy` in the Y direction then applying the original
    /// transformation.
    /// ## `scale_x`
    /// amount to scale by in X direction
    /// ## `scale_y`
    /// amount to scale by in Y direction
    #[doc(alias = "pango_matrix_scale")]
    pub fn scale(&mut self, scale_x: f64, scale_y: f64) {
        unsafe {
            ffi::pango_matrix_scale(self.to_glib_none_mut().0, scale_x, scale_y);
        }
    }

    /// Transforms the distance vector (`dx`,`dy`) by `self`. This is
    /// similar to [`transform_point()`][Self::transform_point()] except that the translation
    /// components of the transformation are ignored. The calculation of
    /// the returned vector is as follows:
    ///
    /// `<programlisting>`
    /// dx2 = dx1 * xx + dy1 * xy;
    /// dy2 = dx1 * yx + dy1 * yy;
    /// `</programlisting>`
    ///
    /// Affine transformations are position invariant, so the same vector
    /// always transforms to the same vector. If (`x1`,`y1`) transforms
    /// to (`x2`,`y2`) then (`x1`+`dx1`,`y1`+`dy1`) will transform to
    /// (`x1`+`dx2`,`y1`+`dy2`) for all values of `x1` and `x2`.
    /// ## `dx`
    /// in/out X component of a distance vector
    /// ## `dy`
    /// in/out Y component of a distance vector
    #[doc(alias = "pango_matrix_transform_distance")]
    pub fn transform_distance(&self, dx: &mut f64, dy: &mut f64) {
        unsafe {
            ffi::pango_matrix_transform_distance(self.to_glib_none().0, dx, dy);
        }
    }

    //#[doc(alias = "pango_matrix_transform_pixel_rectangle")]
    //pub fn transform_pixel_rectangle(&self, rect: /*Unimplemented*/Option<Rectangle>) {
    //    unsafe { TODO: call ffi:pango_matrix_transform_pixel_rectangle() }
    //}

    /// Transforms the point (`x`, `y`) by `self`.
    /// ## `x`
    /// in/out X position
    /// ## `y`
    /// in/out Y position
    #[doc(alias = "pango_matrix_transform_point")]
    pub fn transform_point(&self, x: &mut f64, y: &mut f64) {
        unsafe {
            ffi::pango_matrix_transform_point(self.to_glib_none().0, x, y);
        }
    }

    //#[doc(alias = "pango_matrix_transform_rectangle")]
    //pub fn transform_rectangle(&self, rect: /*Unimplemented*/Option<Rectangle>) {
    //    unsafe { TODO: call ffi:pango_matrix_transform_rectangle() }
    //}

    /// Changes the transformation represented by `self` to be the
    /// transformation given by first translating by (`tx`, `ty`)
    /// then applying the original transformation.
    /// ## `tx`
    /// amount to translate in the X direction
    /// ## `ty`
    /// amount to translate in the Y direction
    #[doc(alias = "pango_matrix_translate")]
    pub fn translate(&mut self, tx: f64, ty: f64) {
        unsafe {
            ffi::pango_matrix_translate(self.to_glib_none_mut().0, tx, ty);
        }
    }
}