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
// 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 crate::GlyphItem;
use glib::translate::*;

glib::wrapper! {
    /// A [`GlyphItemIter`][crate::GlyphItemIter] is an iterator over the clusters in a
    /// [`GlyphItem`][crate::GlyphItem]. The `<firstterm>`forward direction`</firstterm>` of the
    /// iterator is the logical direction of text. That is, with increasing
    /// `start_index` and `start_char` values. If `glyph_item` is right-to-left
    /// (that is, if `<literal>``glyph_item`->item->analysis.level`</literal>` is odd),
    /// then `start_glyph` decreases as the iterator moves forward. Moreover,
    /// in right-to-left cases, `start_glyph` is greater than `end_glyph`.
    ///
    /// An iterator should be initialized using either of
    /// [`init_start()`][Self::init_start()] and
    /// [`init_end()`][Self::init_end()], for forward and backward iteration
    /// respectively, and walked over using any desired mixture of
    /// [`next_cluster()`][Self::next_cluster()] and
    /// [`prev_cluster()`][Self::prev_cluster()]. A common idiom for doing a
    /// forward iteration over the clusters is:
    /// `<programlisting>`
    /// PangoGlyphItemIter cluster_iter;
    /// gboolean have_cluster;
    ///
    /// for (have_cluster = pango_glyph_item_iter_init_start (&amp;cluster_iter,
    ///  glyph_item, text);
    ///  have_cluster;
    ///  have_cluster = pango_glyph_item_iter_next_cluster (&amp;cluster_iter))
    /// {
    ///  ...
    /// }
    /// `</programlisting>`
    ///
    /// Note that `text` is the start of the text for layout, which is then
    /// indexed by `<literal>``glyph_item`->item->offset`</literal>` to get to the
    /// text of `glyph_item`. The `start_index` and `end_index` values can directly
    /// index into `text`. The `start_glyph`, `end_glyph`, `start_char`, and `end_char`
    /// values however are zero-based for the `glyph_item`. For each cluster, the
    /// item pointed at by the start variables is included in the cluster while
    /// the one pointed at by end variables is not.
    ///
    /// None of the members of a [`GlyphItemIter`][crate::GlyphItemIter] should be modified manually.
    #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
    pub struct GlyphItemIter(Boxed<ffi::PangoGlyphItemIter>);

    match fn {
        copy => |ptr| ffi::pango_glyph_item_iter_copy(mut_override(ptr)),
        free => |ptr| ffi::pango_glyph_item_iter_free(ptr),
        type_ => || ffi::pango_glyph_item_iter_get_type(),
    }
}

impl GlyphItemIter {
    /// Initializes a [`GlyphItemIter`][crate::GlyphItemIter] structure to point to the
    /// last cluster in a glyph item.
    /// See [`GlyphItemIter`][crate::GlyphItemIter] for details of cluster orders.
    /// ## `glyph_item`
    /// the glyph item to iterate over
    /// ## `text`
    /// text corresponding to the glyph item
    ///
    /// # Returns
    ///
    /// [`false`] if there are no clusters in the glyph item
    #[doc(alias = "pango_glyph_item_iter_init_end")]
    pub fn init_end(&mut self, glyph_item: &mut GlyphItem, text: &str) -> bool {
        unsafe {
            from_glib(ffi::pango_glyph_item_iter_init_end(
                self.to_glib_none_mut().0,
                glyph_item.to_glib_none_mut().0,
                text.to_glib_none().0,
            ))
        }
    }

    /// Initializes a [`GlyphItemIter`][crate::GlyphItemIter] structure to point to the
    /// first cluster in a glyph item.
    /// See [`GlyphItemIter`][crate::GlyphItemIter] for details of cluster orders.
    /// ## `glyph_item`
    /// the glyph item to iterate over
    /// ## `text`
    /// text corresponding to the glyph item
    ///
    /// # Returns
    ///
    /// [`false`] if there are no clusters in the glyph item
    #[doc(alias = "pango_glyph_item_iter_init_start")]
    pub fn init_start(&mut self, glyph_item: &mut GlyphItem, text: &str) -> bool {
        unsafe {
            from_glib(ffi::pango_glyph_item_iter_init_start(
                self.to_glib_none_mut().0,
                glyph_item.to_glib_none_mut().0,
                text.to_glib_none().0,
            ))
        }
    }

    /// Advances the iterator to the next cluster in the glyph item.
    /// See [`GlyphItemIter`][crate::GlyphItemIter] for details of cluster orders.
    ///
    /// # Returns
    ///
    /// [`true`] if the iterator was advanced, [`false`] if we were already on the
    ///  last cluster.
    #[doc(alias = "pango_glyph_item_iter_next_cluster")]
    pub fn next_cluster(&mut self) -> bool {
        unsafe {
            from_glib(ffi::pango_glyph_item_iter_next_cluster(
                self.to_glib_none_mut().0,
            ))
        }
    }

    /// Moves the iterator to the preceding cluster in the glyph item.
    /// See [`GlyphItemIter`][crate::GlyphItemIter] for details of cluster orders.
    ///
    /// # Returns
    ///
    /// [`true`] if the iterator was moved, [`false`] if we were already on the
    ///  first cluster.
    #[doc(alias = "pango_glyph_item_iter_prev_cluster")]
    pub fn prev_cluster(&mut self) -> bool {
        unsafe {
            from_glib(ffi::pango_glyph_item_iter_prev_cluster(
                self.to_glib_none_mut().0,
            ))
        }
    }
}