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

glib::wrapper! {
    /// A [`GlyphItem`][crate::GlyphItem] is a pair of a [`Item`][crate::Item] and the glyphs
    /// resulting from shaping the text corresponding to an item.
    /// As an example of the usage of [`GlyphItem`][crate::GlyphItem], the results
    /// of shaping text with [`Layout`][crate::Layout] is a list of [`LayoutLine`][crate::LayoutLine],
    /// each of which contains a list of [`GlyphItem`][crate::GlyphItem].
    #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
    pub struct GlyphItem(Boxed<ffi::PangoGlyphItem>);

    match fn {
        copy => |ptr| ffi::pango_glyph_item_copy(mut_override(ptr)),
        free => |ptr| ffi::pango_glyph_item_free(ptr),
        type_ => || ffi::pango_glyph_item_get_type(),
    }
}

impl GlyphItem {
    /// Splits a shaped item (PangoGlyphItem) into multiple items based
    /// on an attribute list. The idea is that if you have attributes
    /// that don't affect shaping, such as color or underline, to avoid
    /// affecting shaping, you filter them out ([`AttrList::filter()`][crate::AttrList::filter()]),
    /// apply the shaping process and then reapply them to the result using
    /// this function.
    ///
    /// All attributes that start or end inside a cluster are applied
    /// to that cluster; for instance, if half of a cluster is underlined
    /// and the other-half strikethrough, then the cluster will end
    /// up with both underline and strikethrough attributes. In these
    /// cases, it may happen that item->extra_attrs for some of the
    /// result items can have multiple attributes of the same type.
    ///
    /// This function takes ownership of `self`; it will be reused
    /// as one of the elements in the list.
    /// ## `text`
    /// text that `list` applies to
    /// ## `list`
    /// a [`AttrList`][crate::AttrList]
    ///
    /// # Returns
    ///
    /// a
    ///  list of glyph items resulting from splitting `self`. Free
    ///  the elements using `pango_glyph_item_free()`, the list using
    ///  `g_slist_free()`.
    #[doc(alias = "pango_glyph_item_apply_attrs")]
    pub fn apply_attrs(&mut self, text: &str, list: &AttrList) -> Vec<GlyphItem> {
        unsafe {
            FromGlibPtrContainer::from_glib_full(ffi::pango_glyph_item_apply_attrs(
                self.to_glib_none_mut().0,
                text.to_glib_none().0,
                list.to_glib_none().0,
            ))
        }
    }

    //#[doc(alias = "pango_glyph_item_get_logical_widths")]
    //#[doc(alias = "get_logical_widths")]
    //pub fn logical_widths(&mut self, text: &str, logical_widths: &[i32]) {
    //    unsafe { TODO: call ffi:pango_glyph_item_get_logical_widths() }
    //}

    //#[doc(alias = "pango_glyph_item_letter_space")]
    //pub fn letter_space(&mut self, text: &str, log_attrs: /*Ignored*/&[&LogAttr], letter_spacing: i32) {
    //    unsafe { TODO: call ffi:pango_glyph_item_letter_space() }
    //}

    /// Modifies `self` to cover only the text after `split_index`, and
    /// returns a new item that covers the text before `split_index` that
    /// used to be in `self`. You can think of `split_index` as the length of
    /// the returned item. `split_index` may not be 0, and it may not be
    /// greater than or equal to the length of `self` (that is, there must
    /// be at least one byte assigned to each item, you can't create a
    /// zero-length item).
    ///
    /// This function is similar in function to [`Item::split()`][crate::Item::split()] (and uses
    /// it internally.)
    /// ## `text`
    /// text to which positions in `self` apply
    /// ## `split_index`
    /// byte index of position to split item, relative to the start of the item
    ///
    /// # Returns
    ///
    /// the newly allocated item representing text before
    ///  `split_index`, which should be freed
    ///  with `pango_glyph_item_free()`.
    #[doc(alias = "pango_glyph_item_split")]
    pub fn split(&mut self, text: &str, split_index: i32) -> Option<GlyphItem> {
        unsafe {
            from_glib_full(ffi::pango_glyph_item_split(
                self.to_glib_none_mut().0,
                text.to_glib_none().0,
                split_index,
            ))
        }
    }
}