1use crate::{ffi, AttrList, Direction, Stretch, Style, Variant, Weight};
6use glib::translate::*;
7
8#[doc(alias = "pango_find_base_dir")]
22pub fn find_base_dir(text: &str) -> Direction {
23 let length = text.len() as _;
24 unsafe { from_glib(ffi::pango_find_base_dir(text.to_glib_none().0, length)) }
25}
26
27#[doc(alias = "pango_find_paragraph_boundary")]
28pub fn find_paragraph_boundary(text: &str) -> (i32, i32) {
29 let length = text.len() as _;
30 unsafe {
31 let mut paragraph_delimiter_index = std::mem::MaybeUninit::uninit();
32 let mut next_paragraph_start = std::mem::MaybeUninit::uninit();
33 ffi::pango_find_paragraph_boundary(
34 text.to_glib_none().0,
35 length,
36 paragraph_delimiter_index.as_mut_ptr(),
37 next_paragraph_start.as_mut_ptr(),
38 );
39 (
40 paragraph_delimiter_index.assume_init(),
41 next_paragraph_start.assume_init(),
42 )
43 }
44}
45
46#[doc(alias = "pango_is_zero_width")]
53pub fn is_zero_width(ch: char) -> bool {
54 unsafe { from_glib(ffi::pango_is_zero_width(ch.into_glib())) }
55}
56
57#[doc(alias = "pango_markup_parser_finish")]
58pub fn markup_parser_finish(
59 context: &glib::MarkupParseContext,
60) -> Result<(AttrList, glib::GString, char), glib::Error> {
61 unsafe {
62 let mut attr_list = std::ptr::null_mut();
63 let mut text = std::ptr::null_mut();
64 let mut accel_char = std::mem::MaybeUninit::uninit();
65 let mut error = std::ptr::null_mut();
66 let is_ok = ffi::pango_markup_parser_finish(
67 context.to_glib_none().0,
68 &mut attr_list,
69 &mut text,
70 accel_char.as_mut_ptr(),
71 &mut error,
72 );
73 debug_assert_eq!(is_ok == glib::ffi::GFALSE, !error.is_null());
74 if error.is_null() {
75 Ok((
76 from_glib_full(attr_list),
77 from_glib_full(text),
78 std::convert::TryFrom::try_from(accel_char.assume_init())
79 .expect("conversion from an invalid Unicode value attempted"),
80 ))
81 } else {
82 Err(from_glib_full(error))
83 }
84 }
85}
86
87#[doc(alias = "pango_markup_parser_new")]
88pub fn markup_parser_new(accel_marker: char) -> glib::MarkupParseContext {
89 unsafe { from_glib_none(ffi::pango_markup_parser_new(accel_marker.into_glib())) }
90}
91
92#[doc(alias = "pango_parse_markup")]
93pub fn parse_markup(
94 markup_text: &str,
95 accel_marker: char,
96) -> Result<(AttrList, glib::GString, char), glib::Error> {
97 let length = markup_text.len() as _;
98 unsafe {
99 let mut attr_list = std::ptr::null_mut();
100 let mut text = std::ptr::null_mut();
101 let mut accel_char = std::mem::MaybeUninit::uninit();
102 let mut error = std::ptr::null_mut();
103 let is_ok = ffi::pango_parse_markup(
104 markup_text.to_glib_none().0,
105 length,
106 accel_marker.into_glib(),
107 &mut attr_list,
108 &mut text,
109 accel_char.as_mut_ptr(),
110 &mut error,
111 );
112 debug_assert_eq!(is_ok == glib::ffi::GFALSE, !error.is_null());
113 if error.is_null() {
114 Ok((
115 from_glib_full(attr_list),
116 from_glib_full(text),
117 std::convert::TryFrom::try_from(accel_char.assume_init())
118 .expect("conversion from an invalid Unicode value attempted"),
119 ))
120 } else {
121 Err(from_glib_full(error))
122 }
123 }
124}
125
126#[doc(alias = "pango_parse_stretch")]
127pub fn parse_stretch(str: &str, warn: bool) -> Option<Stretch> {
128 unsafe {
129 let mut stretch = std::mem::MaybeUninit::uninit();
130 let ret = from_glib(ffi::pango_parse_stretch(
131 str.to_glib_none().0,
132 stretch.as_mut_ptr(),
133 warn.into_glib(),
134 ));
135 if ret {
136 Some(from_glib(stretch.assume_init()))
137 } else {
138 None
139 }
140 }
141}
142
143#[doc(alias = "pango_parse_style")]
144pub fn parse_style(str: &str, warn: bool) -> Option<Style> {
145 unsafe {
146 let mut style = std::mem::MaybeUninit::uninit();
147 let ret = from_glib(ffi::pango_parse_style(
148 str.to_glib_none().0,
149 style.as_mut_ptr(),
150 warn.into_glib(),
151 ));
152 if ret {
153 Some(from_glib(style.assume_init()))
154 } else {
155 None
156 }
157 }
158}
159
160#[doc(alias = "pango_parse_variant")]
161pub fn parse_variant(str: &str, warn: bool) -> Option<Variant> {
162 unsafe {
163 let mut variant = std::mem::MaybeUninit::uninit();
164 let ret = from_glib(ffi::pango_parse_variant(
165 str.to_glib_none().0,
166 variant.as_mut_ptr(),
167 warn.into_glib(),
168 ));
169 if ret {
170 Some(from_glib(variant.assume_init()))
171 } else {
172 None
173 }
174 }
175}
176
177#[doc(alias = "pango_parse_weight")]
178pub fn parse_weight(str: &str, warn: bool) -> Option<Weight> {
179 unsafe {
180 let mut weight = std::mem::MaybeUninit::uninit();
181 let ret = from_glib(ffi::pango_parse_weight(
182 str.to_glib_none().0,
183 weight.as_mut_ptr(),
184 warn.into_glib(),
185 ));
186 if ret {
187 Some(from_glib(weight.assume_init()))
188 } else {
189 None
190 }
191 }
192}
193
194#[doc(alias = "pango_quantize_line_geometry")]
195pub fn quantize_line_geometry(thickness: &mut i32, position: &mut i32) {
196 unsafe {
197 ffi::pango_quantize_line_geometry(thickness, position);
198 }
199}
200
201#[doc(alias = "pango_unichar_direction")]
209pub fn unichar_direction(ch: char) -> Direction {
210 unsafe { from_glib(ffi::pango_unichar_direction(ch.into_glib())) }
211}
212
213#[doc(alias = "pango_units_from_double")]
214pub fn units_from_double(d: f64) -> i32 {
215 unsafe { ffi::pango_units_from_double(d) }
216}
217
218#[doc(alias = "pango_units_to_double")]
219pub fn units_to_double(i: i32) -> f64 {
220 unsafe { ffi::pango_units_to_double(i) }
221}
222
223#[doc(alias = "pango_version")]
224pub fn version() -> i32 {
225 unsafe { ffi::pango_version() }
226}
227
228#[doc(alias = "pango_version_check")]
229pub fn version_check(
230 required_major: i32,
231 required_minor: i32,
232 required_micro: i32,
233) -> Option<glib::GString> {
234 unsafe {
235 from_glib_none(ffi::pango_version_check(
236 required_major,
237 required_minor,
238 required_micro,
239 ))
240 }
241}
242
243#[doc(alias = "pango_version_string")]
244pub fn version_string() -> glib::GString {
245 unsafe { from_glib_none(ffi::pango_version_string()) }
246}