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
// 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::{prelude::*, translate::*};
use std::{fmt, mem};

glib::wrapper! {
    /// A render node drawing a set of glyphs.
    #[doc(alias = "GskTextNode")]
    pub struct TextNode(Shared<ffi::GskTextNode>);

    match fn {
        ref => |ptr| ffi::gsk_render_node_ref(ptr as *mut ffi::GskRenderNode),
        unref => |ptr| ffi::gsk_render_node_unref(ptr as *mut ffi::GskRenderNode),
    }
}

impl glib::StaticType for TextNode {
    fn static_type() -> glib::Type {
        unsafe { from_glib(ffi::gsk_text_node_get_type()) }
    }
}

impl TextNode {
    /// Creates a render node that renders the given glyphs.
    ///
    /// Note that @color may not be used if the font contains
    /// color glyphs.
    /// ## `font`
    /// the [`pango::Font`][crate::pango::Font] containing the glyphs
    /// ## `glyphs`
    /// the [`pango::GlyphString`][crate::pango::GlyphString] to render
    /// ## `color`
    /// the foreground color to render with
    /// ## `offset`
    /// offset of the baseline
    ///
    /// # Returns
    ///
    /// a new [`RenderNode`][crate::RenderNode]
    #[doc(alias = "gsk_text_node_new")]
    pub fn new(
        font: &impl IsA<pango::Font>,
        glyphs: &pango::GlyphString,
        color: &gdk::RGBA,
        offset: &graphene::Point,
    ) -> Option<TextNode> {
        assert_initialized_main_thread!();
        unsafe {
            from_glib_full(ffi::gsk_text_node_new(
                font.as_ref().to_glib_none().0,
                mut_override(glyphs.to_glib_none().0),
                color.to_glib_none().0,
                offset.to_glib_none().0,
            ))
        }
    }

    /// Retrieves the color used by the text @self.
    ///
    /// # Returns
    ///
    /// the text color
    #[doc(alias = "gsk_text_node_get_color")]
    #[doc(alias = "get_color")]
    pub fn color(&self) -> gdk::RGBA {
        unsafe { from_glib_none(ffi::gsk_text_node_get_color(self.to_glib_none().0)) }
    }

    /// Returns the font used by the text @self.
    ///
    /// # Returns
    ///
    /// the font
    #[doc(alias = "gsk_text_node_get_font")]
    #[doc(alias = "get_font")]
    pub fn font(&self) -> pango::Font {
        unsafe { from_glib_none(ffi::gsk_text_node_get_font(self.to_glib_none().0)) }
    }

    /// Retrieves the glyph information in the @self.
    ///
    /// # Returns
    ///
    /// the glyph information
    #[doc(alias = "gsk_text_node_get_glyphs")]
    #[doc(alias = "get_glyphs")]
    pub fn glyphs(&self) -> Vec<pango::GlyphInfo> {
        unsafe {
            let mut n_glyphs = mem::MaybeUninit::uninit();
            let ret = FromGlibContainer::from_glib_none_num(
                ffi::gsk_text_node_get_glyphs(self.to_glib_none().0, n_glyphs.as_mut_ptr()),
                n_glyphs.assume_init() as _,
            );
            ret
        }
    }

    /// Retrieves the number of glyphs in the text node.
    ///
    /// # Returns
    ///
    /// the number of glyphs
    #[doc(alias = "gsk_text_node_get_num_glyphs")]
    #[doc(alias = "get_num_glyphs")]
    pub fn num_glyphs(&self) -> u32 {
        unsafe { ffi::gsk_text_node_get_num_glyphs(self.to_glib_none().0) }
    }

    /// Retrieves the offset applied to the text.
    ///
    /// # Returns
    ///
    /// a point with the horizontal and vertical offsets
    #[doc(alias = "gsk_text_node_get_offset")]
    #[doc(alias = "get_offset")]
    pub fn offset(&self) -> graphene::Point {
        unsafe { from_glib_none(ffi::gsk_text_node_get_offset(self.to_glib_none().0)) }
    }

    /// Checks whether the text @self has color glyphs.
    ///
    /// # Returns
    ///
    /// [`true`] if the text node has color glyphs
    #[cfg(feature = "v4_2")]
    #[cfg_attr(docsrs, doc(cfg(feature = "v4_2")))]
    #[doc(alias = "gsk_text_node_has_color_glyphs")]
    pub fn has_color_glyphs(&self) -> bool {
        unsafe { from_glib(ffi::gsk_text_node_has_color_glyphs(self.to_glib_none().0)) }
    }
}

impl fmt::Display for TextNode {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        f.write_str("TextNode")
    }
}