impellers/
sys.rs

1#![allow(non_upper_case_globals)]
2#![allow(non_camel_case_types)]
3#![allow(non_snake_case)]
4#![allow(unused)]
5#![allow(rustdoc::invalid_codeblock_attributes)]
6#![allow(rustdoc::invalid_rust_codeblocks)]
7#![allow(rustdoc::broken_intra_doc_links)]
8/* automatically generated by rust-bindgen 0.71.1 */
9
10pub const __bool_true_false_are_defined: u32 = 1;
11pub const true_: u32 = 1;
12pub const false_: u32 = 0;
13pub const _STDINT_H: u32 = 1;
14pub const _FEATURES_H: u32 = 1;
15pub const _DEFAULT_SOURCE: u32 = 1;
16pub const __GLIBC_USE_ISOC2Y: u32 = 0;
17pub const __GLIBC_USE_ISOC23: u32 = 0;
18pub const __USE_ISOC11: u32 = 1;
19pub const __USE_ISOC99: u32 = 1;
20pub const __USE_ISOC95: u32 = 1;
21pub const __USE_POSIX_IMPLICITLY: u32 = 1;
22pub const _POSIX_SOURCE: u32 = 1;
23pub const _POSIX_C_SOURCE: u32 = 200809;
24pub const __USE_POSIX: u32 = 1;
25pub const __USE_POSIX2: u32 = 1;
26pub const __USE_POSIX199309: u32 = 1;
27pub const __USE_POSIX199506: u32 = 1;
28pub const __USE_XOPEN2K: u32 = 1;
29pub const __USE_XOPEN2K8: u32 = 1;
30pub const _ATFILE_SOURCE: u32 = 1;
31pub const __WORDSIZE: u32 = 64;
32pub const __WORDSIZE_TIME64_COMPAT32: u32 = 1;
33pub const __SYSCALL_WORDSIZE: u32 = 64;
34pub const __TIMESIZE: u32 = 64;
35pub const __USE_TIME_BITS64: u32 = 1;
36pub const __USE_MISC: u32 = 1;
37pub const __USE_ATFILE: u32 = 1;
38pub const __USE_FORTIFY_LEVEL: u32 = 0;
39pub const __GLIBC_USE_DEPRECATED_GETS: u32 = 0;
40pub const __GLIBC_USE_DEPRECATED_SCANF: u32 = 0;
41pub const __GLIBC_USE_C23_STRTOL: u32 = 0;
42pub const _STDC_PREDEF_H: u32 = 1;
43pub const __STDC_IEC_559__: u32 = 1;
44pub const __STDC_IEC_60559_BFP__: u32 = 201404;
45pub const __STDC_IEC_559_COMPLEX__: u32 = 1;
46pub const __STDC_IEC_60559_COMPLEX__: u32 = 201404;
47pub const __STDC_ISO_10646__: u32 = 201706;
48pub const __GNU_LIBRARY__: u32 = 6;
49pub const __GLIBC__: u32 = 2;
50pub const __GLIBC_MINOR__: u32 = 41;
51pub const _SYS_CDEFS_H: u32 = 1;
52pub const __glibc_c99_flexarr_available: u32 = 1;
53pub const __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI: u32 = 0;
54pub const __HAVE_GENERIC_SELECTION: u32 = 1;
55pub const __GLIBC_USE_LIB_EXT2: u32 = 0;
56pub const __GLIBC_USE_IEC_60559_BFP_EXT: u32 = 0;
57pub const __GLIBC_USE_IEC_60559_BFP_EXT_C23: u32 = 0;
58pub const __GLIBC_USE_IEC_60559_EXT: u32 = 0;
59pub const __GLIBC_USE_IEC_60559_FUNCS_EXT: u32 = 0;
60pub const __GLIBC_USE_IEC_60559_FUNCS_EXT_C23: u32 = 0;
61pub const __GLIBC_USE_IEC_60559_TYPES_EXT: u32 = 0;
62pub const _BITS_TYPES_H: u32 = 1;
63pub const _BITS_TYPESIZES_H: u32 = 1;
64pub const __OFF_T_MATCHES_OFF64_T: u32 = 1;
65pub const __INO_T_MATCHES_INO64_T: u32 = 1;
66pub const __RLIM_T_MATCHES_RLIM64_T: u32 = 1;
67pub const __STATFS_MATCHES_STATFS64: u32 = 1;
68pub const __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64: u32 = 1;
69pub const __FD_SETSIZE: u32 = 1024;
70pub const _BITS_TIME64_H: u32 = 1;
71pub const _BITS_WCHAR_H: u32 = 1;
72pub const _BITS_STDINT_INTN_H: u32 = 1;
73pub const _BITS_STDINT_UINTN_H: u32 = 1;
74pub const _BITS_STDINT_LEAST_H: u32 = 1;
75pub const INT8_MIN: i32 = -128;
76pub const INT16_MIN: i32 = -32768;
77pub const INT32_MIN: i32 = -2147483648;
78pub const INT8_MAX: u32 = 127;
79pub const INT16_MAX: u32 = 32767;
80pub const INT32_MAX: u32 = 2147483647;
81pub const UINT8_MAX: u32 = 255;
82pub const UINT16_MAX: u32 = 65535;
83pub const UINT32_MAX: u32 = 4294967295;
84pub const INT_LEAST8_MIN: i32 = -128;
85pub const INT_LEAST16_MIN: i32 = -32768;
86pub const INT_LEAST32_MIN: i32 = -2147483648;
87pub const INT_LEAST8_MAX: u32 = 127;
88pub const INT_LEAST16_MAX: u32 = 32767;
89pub const INT_LEAST32_MAX: u32 = 2147483647;
90pub const UINT_LEAST8_MAX: u32 = 255;
91pub const UINT_LEAST16_MAX: u32 = 65535;
92pub const UINT_LEAST32_MAX: u32 = 4294967295;
93pub const INT_FAST8_MIN: i32 = -128;
94pub const INT_FAST16_MIN: i64 = -9223372036854775808;
95pub const INT_FAST32_MIN: i64 = -9223372036854775808;
96pub const INT_FAST8_MAX: u32 = 127;
97pub const INT_FAST16_MAX: u64 = 9223372036854775807;
98pub const INT_FAST32_MAX: u64 = 9223372036854775807;
99pub const UINT_FAST8_MAX: u32 = 255;
100pub const UINT_FAST16_MAX: i32 = -1;
101pub const UINT_FAST32_MAX: i32 = -1;
102pub const INTPTR_MIN: i64 = -9223372036854775808;
103pub const INTPTR_MAX: u64 = 9223372036854775807;
104pub const UINTPTR_MAX: i32 = -1;
105pub const PTRDIFF_MIN: i64 = -9223372036854775808;
106pub const PTRDIFF_MAX: u64 = 9223372036854775807;
107pub const SIG_ATOMIC_MIN: i32 = -2147483648;
108pub const SIG_ATOMIC_MAX: u32 = 2147483647;
109pub const SIZE_MAX: i32 = -1;
110pub const WINT_MIN: u32 = 0;
111pub const WINT_MAX: u32 = 4294967295;
112pub const IMPELLER_VERSION_VARIANT: u32 = 1;
113pub const IMPELLER_VERSION_MAJOR: u32 = 1;
114pub const IMPELLER_VERSION_MINOR: u32 = 3;
115pub const IMPELLER_VERSION_PATCH: u32 = 0;
116pub type wchar_t = ::std::os::raw::c_int;
117#[repr(C)]
118#[repr(align(16))]
119#[derive(Debug, Default, Copy, Clone)]
120pub struct max_align_t {
121    pub __clang_max_align_nonce1: ::std::os::raw::c_longlong,
122    pub __bindgen_padding_0: u64,
123    pub __clang_max_align_nonce2: u128,
124}
125#[allow(clippy::unnecessary_operation, clippy::identity_op)]
126const _: () = {
127    ["Size of max_align_t"][::std::mem::size_of::<max_align_t>() - 32usize];
128    ["Alignment of max_align_t"][::std::mem::align_of::<max_align_t>() - 16usize];
129    ["Offset of field: max_align_t::__clang_max_align_nonce1"]
130        [::std::mem::offset_of!(max_align_t, __clang_max_align_nonce1) - 0usize];
131    ["Offset of field: max_align_t::__clang_max_align_nonce2"]
132        [::std::mem::offset_of!(max_align_t, __clang_max_align_nonce2) - 16usize];
133};
134pub type __u_char = ::std::os::raw::c_uchar;
135pub type __u_short = ::std::os::raw::c_ushort;
136pub type __u_int = ::std::os::raw::c_uint;
137pub type __u_long = ::std::os::raw::c_ulong;
138pub type __int8_t = ::std::os::raw::c_schar;
139pub type __uint8_t = ::std::os::raw::c_uchar;
140pub type __int16_t = ::std::os::raw::c_short;
141pub type __uint16_t = ::std::os::raw::c_ushort;
142pub type __int32_t = ::std::os::raw::c_int;
143pub type __uint32_t = ::std::os::raw::c_uint;
144pub type __int64_t = ::std::os::raw::c_long;
145pub type __uint64_t = ::std::os::raw::c_ulong;
146pub type __int_least8_t = __int8_t;
147pub type __uint_least8_t = __uint8_t;
148pub type __int_least16_t = __int16_t;
149pub type __uint_least16_t = __uint16_t;
150pub type __int_least32_t = __int32_t;
151pub type __uint_least32_t = __uint32_t;
152pub type __int_least64_t = __int64_t;
153pub type __uint_least64_t = __uint64_t;
154pub type __quad_t = ::std::os::raw::c_long;
155pub type __u_quad_t = ::std::os::raw::c_ulong;
156pub type __intmax_t = ::std::os::raw::c_long;
157pub type __uintmax_t = ::std::os::raw::c_ulong;
158pub type __dev_t = ::std::os::raw::c_ulong;
159pub type __uid_t = ::std::os::raw::c_uint;
160pub type __gid_t = ::std::os::raw::c_uint;
161pub type __ino_t = ::std::os::raw::c_ulong;
162pub type __ino64_t = ::std::os::raw::c_ulong;
163pub type __mode_t = ::std::os::raw::c_uint;
164pub type __nlink_t = ::std::os::raw::c_ulong;
165pub type __off_t = ::std::os::raw::c_long;
166pub type __off64_t = ::std::os::raw::c_long;
167pub type __pid_t = ::std::os::raw::c_int;
168#[repr(C)]
169#[derive(Debug, Default, Copy, Clone)]
170pub struct __fsid_t {
171    pub __val: [::std::os::raw::c_int; 2usize],
172}
173#[allow(clippy::unnecessary_operation, clippy::identity_op)]
174const _: () = {
175    ["Size of __fsid_t"][::std::mem::size_of::<__fsid_t>() - 8usize];
176    ["Alignment of __fsid_t"][::std::mem::align_of::<__fsid_t>() - 4usize];
177    ["Offset of field: __fsid_t::__val"][::std::mem::offset_of!(__fsid_t, __val) - 0usize];
178};
179pub type __clock_t = ::std::os::raw::c_long;
180pub type __rlim_t = ::std::os::raw::c_ulong;
181pub type __rlim64_t = ::std::os::raw::c_ulong;
182pub type __id_t = ::std::os::raw::c_uint;
183pub type __time_t = ::std::os::raw::c_long;
184pub type __useconds_t = ::std::os::raw::c_uint;
185pub type __suseconds_t = ::std::os::raw::c_long;
186pub type __suseconds64_t = ::std::os::raw::c_long;
187pub type __daddr_t = ::std::os::raw::c_int;
188pub type __key_t = ::std::os::raw::c_int;
189pub type __clockid_t = ::std::os::raw::c_int;
190pub type __timer_t = *mut ::std::os::raw::c_void;
191pub type __blksize_t = ::std::os::raw::c_long;
192pub type __blkcnt_t = ::std::os::raw::c_long;
193pub type __blkcnt64_t = ::std::os::raw::c_long;
194pub type __fsblkcnt_t = ::std::os::raw::c_ulong;
195pub type __fsblkcnt64_t = ::std::os::raw::c_ulong;
196pub type __fsfilcnt_t = ::std::os::raw::c_ulong;
197pub type __fsfilcnt64_t = ::std::os::raw::c_ulong;
198pub type __fsword_t = ::std::os::raw::c_long;
199pub type __ssize_t = ::std::os::raw::c_long;
200pub type __syscall_slong_t = ::std::os::raw::c_long;
201pub type __syscall_ulong_t = ::std::os::raw::c_ulong;
202pub type __loff_t = __off64_t;
203pub type __caddr_t = *mut ::std::os::raw::c_char;
204pub type __intptr_t = ::std::os::raw::c_long;
205pub type __socklen_t = ::std::os::raw::c_uint;
206pub type __sig_atomic_t = ::std::os::raw::c_int;
207pub type int_least8_t = __int_least8_t;
208pub type int_least16_t = __int_least16_t;
209pub type int_least32_t = __int_least32_t;
210pub type int_least64_t = __int_least64_t;
211pub type uint_least8_t = __uint_least8_t;
212pub type uint_least16_t = __uint_least16_t;
213pub type uint_least32_t = __uint_least32_t;
214pub type uint_least64_t = __uint_least64_t;
215pub type int_fast8_t = ::std::os::raw::c_schar;
216pub type int_fast16_t = ::std::os::raw::c_long;
217pub type int_fast32_t = ::std::os::raw::c_long;
218pub type int_fast64_t = ::std::os::raw::c_long;
219pub type uint_fast8_t = ::std::os::raw::c_uchar;
220pub type uint_fast16_t = ::std::os::raw::c_ulong;
221pub type uint_fast32_t = ::std::os::raw::c_ulong;
222pub type uint_fast64_t = ::std::os::raw::c_ulong;
223pub type intmax_t = __intmax_t;
224pub type uintmax_t = __uintmax_t;
225#[repr(C)]
226#[derive(Debug, Copy, Clone)]
227pub struct ImpellerContext_ {
228    _unused: [u8; 0],
229}
230#[doc = " An Impeller graphics context. Contexts are platform and client-rendering-API\n specific.\n\n Contexts are thread-safe objects that are expensive to create. Most\n applications will only ever create a single context during their lifetimes.\n Once setup, Impeller is ready to render frames as performantly as possible.\n\n During setup, context create the underlying graphics pipelines, allocators,\n worker threads, etc...\n\n The general guidance is to create as few contexts as possible (typically\n just one) and share them as much as possible.\n"]
231pub type ImpellerContext = *mut ImpellerContext_;
232#[repr(C)]
233#[derive(Debug, Copy, Clone)]
234pub struct ImpellerDisplayList_ {
235    _unused: [u8; 0],
236}
237#[doc = " Display lists represent encoded rendering intent. These objects are\n immutable, reusable, thread-safe, and context-agnostic.\n\n While it is perfectly fine to create new display lists per frame, there may\n be opportunities for optimization when display lists are reused multiple\n times.\n"]
238pub type ImpellerDisplayList = *mut ImpellerDisplayList_;
239#[repr(C)]
240#[derive(Debug, Copy, Clone)]
241pub struct ImpellerDisplayListBuilder_ {
242    _unused: [u8; 0],
243}
244#[doc = " Display list builders allow for the incremental creation of display lists.\n\n Display list builders are context-agnostic.\n"]
245pub type ImpellerDisplayListBuilder = *mut ImpellerDisplayListBuilder_;
246#[repr(C)]
247#[derive(Debug, Copy, Clone)]
248pub struct ImpellerPaint_ {
249    _unused: [u8; 0],
250}
251#[doc = " Paints control the behavior of draw calls encoded in a display list.\n\n Like display lists, paints are context-agnostic.\n"]
252pub type ImpellerPaint = *mut ImpellerPaint_;
253#[repr(C)]
254#[derive(Debug, Copy, Clone)]
255pub struct ImpellerColorFilter_ {
256    _unused: [u8; 0],
257}
258#[doc = " Color filters are functions that take two colors and mix them to produce a\n single color. This color is then merged with the destination during\n blending.\n"]
259pub type ImpellerColorFilter = *mut ImpellerColorFilter_;
260#[repr(C)]
261#[derive(Debug, Copy, Clone)]
262pub struct ImpellerColorSource_ {
263    _unused: [u8; 0],
264}
265#[doc = " Color sources are functions that generate colors for each texture element\n covered by a draw call. The colors for each element can be generated using a\n mathematical function (to produce gradients for example) or sampled from a\n texture.\n"]
266pub type ImpellerColorSource = *mut ImpellerColorSource_;
267#[repr(C)]
268#[derive(Debug, Copy, Clone)]
269pub struct ImpellerImageFilter_ {
270    _unused: [u8; 0],
271}
272#[doc = " Image filters are functions that are applied regions of a texture to produce\n a single color. Contrast this with color filters that operate independently\n on a per-pixel basis. The generated color is then merged with the\n destination during blending.\n"]
273pub type ImpellerImageFilter = *mut ImpellerImageFilter_;
274#[repr(C)]
275#[derive(Debug, Copy, Clone)]
276pub struct ImpellerMaskFilter_ {
277    _unused: [u8; 0],
278}
279#[doc = " Mask filters are functions that are applied over a shape after it has been\n drawn but before it has been blended into the final image.\n"]
280pub type ImpellerMaskFilter = *mut ImpellerMaskFilter_;
281#[repr(C)]
282#[derive(Debug, Copy, Clone)]
283pub struct ImpellerTypographyContext_ {
284    _unused: [u8; 0],
285}
286#[doc = " Typography contexts allow for the layout and rendering of text.\n\n These are typically expensive to create and applications will only ever need\n to create a single one of these during their lifetimes.\n\n Unlike graphics context, typograhy contexts are not thread-safe. These must\n be created, used, and collected on a single thread.\n"]
287pub type ImpellerTypographyContext = *mut ImpellerTypographyContext_;
288#[repr(C)]
289#[derive(Debug, Copy, Clone)]
290pub struct ImpellerParagraph_ {
291    _unused: [u8; 0],
292}
293#[doc = " An immutable, fully laid out paragraph.\n"]
294pub type ImpellerParagraph = *mut ImpellerParagraph_;
295#[repr(C)]
296#[derive(Debug, Copy, Clone)]
297pub struct ImpellerParagraphBuilder_ {
298    _unused: [u8; 0],
299}
300#[doc = " Paragraph builders allow for the creation of fully laid out paragraphs\n (which themselves are immutable).\n\n To build a paragraph, users push/pop paragraph styles onto a stack then add\n UTF-8 encoded text. The properties on the top of paragraph style stack when\n the text is added are used to layout and shape that subset of the paragraph.\n\n @see      `ImpellerParagraphStyle`\n"]
301pub type ImpellerParagraphBuilder = *mut ImpellerParagraphBuilder_;
302#[repr(C)]
303#[derive(Debug, Copy, Clone)]
304pub struct ImpellerParagraphStyle_ {
305    _unused: [u8; 0],
306}
307#[doc = " Specified when building a paragraph, paragraph styles are managed in a stack\n with specify text properties to apply to text that is added to the paragraph\n builder.\n"]
308pub type ImpellerParagraphStyle = *mut ImpellerParagraphStyle_;
309#[repr(C)]
310#[derive(Debug, Copy, Clone)]
311pub struct ImpellerPath_ {
312    _unused: [u8; 0],
313}
314#[doc = " Represents a two-dimensional path that is immutable and graphics context\n agnostic.\n\n Paths in Impeller consist of linear, cubic Bézier curve, and quadratic\n Bézier curve segments. All other shapes are approximations using these\n building blocks.\n\n Paths are created using path builder that allow for the configuration of the\n path segments, how they are filled, and/or stroked.\n"]
315pub type ImpellerPath = *mut ImpellerPath_;
316#[repr(C)]
317#[derive(Debug, Copy, Clone)]
318pub struct ImpellerPathBuilder_ {
319    _unused: [u8; 0],
320}
321#[doc = " Path builders allow for the incremental building up of paths.\n"]
322pub type ImpellerPathBuilder = *mut ImpellerPathBuilder_;
323#[repr(C)]
324#[derive(Debug, Copy, Clone)]
325pub struct ImpellerSurface_ {
326    _unused: [u8; 0],
327}
328#[doc = " A surface represents a render target for Impeller to direct the rendering\n intent specified the form of display lists to.\n\n Render targets are how Impeller API users perform Window System Integration\n (WSI). Users wrap swapchain images as surfaces and draw display lists onto\n these surfaces to present content.\n\n Creating surfaces is typically platform and client-rendering-API specific.\n"]
329pub type ImpellerSurface = *mut ImpellerSurface_;
330#[repr(C)]
331#[derive(Debug, Copy, Clone)]
332pub struct ImpellerTexture_ {
333    _unused: [u8; 0],
334}
335#[doc = " A reference to a texture whose data is resident on the GPU. These can be\n referenced in draw calls and paints.\n\n Creating textures is extremely expensive. Creating a single one can\n typically comfortably blow the frame budget of an application. Textures\n should be created on background threads.\n\n @warning    While textures themselves are thread safe, some context types\n             (like OpenGL) may need extra configuration to be able to operate\n             from multiple threads.\n"]
336pub type ImpellerTexture = *mut ImpellerTexture_;
337#[repr(C)]
338#[derive(Debug, Copy, Clone)]
339pub struct ImpellerVulkanSwapchain_ {
340    _unused: [u8; 0],
341}
342#[doc = " The primary form of WSI when using a Vulkan context, these swapchains use\n the `VK_KHR_surface` Vulkan extension.\n\n Creating a swapchain is extremely expensive. One must be created at\n application startup and re-used throughout the application lifecycle.\n\n Swapchains are resilient to the underlying surfaces being resized. The\n swapchain images will be re-created as necessary on-demand.\n"]
343pub type ImpellerVulkanSwapchain = *mut ImpellerVulkanSwapchain_;
344#[doc = " A callback invoked by Impeller that passes a user supplied baton back to the\n user. Impeller does not interpret the baton in any way. The way the baton is\n specified and the thread on which the callback is invoked depends on how the\n user supplies the callback to Impeller.\n"]
345pub type ImpellerCallback =
346    ::std::option::Option<unsafe extern "C" fn(user_data: *mut ::std::os::raw::c_void)>;
347#[doc = " A callback used by Impeller to allow the user to resolve function pointers.\n A user supplied baton that is uninterpreted by Impeller is passed back to\n the user in the callback. How the baton is specified to Impeller and the\n thread on which the callback is invoked depends on how the callback is\n specified to Impeller.\n"]
348pub type ImpellerProcAddressCallback = ::std::option::Option<
349    unsafe extern "C" fn(
350        proc_name: *const ::std::os::raw::c_char,
351        user_data: *mut ::std::os::raw::c_void,
352    ) -> *mut ::std::os::raw::c_void,
353>;
354#[doc = " A callback used by Impeller to allow the user to resolve Vulkan function\n pointers. A user supplied baton that is uninterpreted by Impeller is passed\n back to the user in the callback.\n"]
355pub type ImpellerVulkanProcAddressCallback = ::std::option::Option<
356    unsafe extern "C" fn(
357        vulkan_instance: *mut ::std::os::raw::c_void,
358        vulkan_proc_name: *const ::std::os::raw::c_char,
359        user_data: *mut ::std::os::raw::c_void,
360    ) -> *mut ::std::os::raw::c_void,
361>;
362#[repr(u32)]
363#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
364pub enum FillType {
365    NonZero = 0,
366    Odd = 1,
367}
368#[repr(u32)]
369#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
370pub enum ClipOperation {
371    Difference = 0,
372    Intersect = 1,
373}
374#[repr(u32)]
375#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
376pub enum BlendMode {
377    Clear = 0,
378    Source = 1,
379    Destination = 2,
380    SourceOver = 3,
381    DestinationOver = 4,
382    SourceIn = 5,
383    DestinationIn = 6,
384    SourceOut = 7,
385    DestinationOut = 8,
386    SourceATop = 9,
387    DestinationATop = 10,
388    Xor = 11,
389    Plus = 12,
390    Modulate = 13,
391    Screen = 14,
392    Overlay = 15,
393    Darken = 16,
394    Lighten = 17,
395    ColorDodge = 18,
396    ColorBurn = 19,
397    HardLight = 20,
398    SoftLight = 21,
399    Difference = 22,
400    Exclusion = 23,
401    Multiply = 24,
402    Hue = 25,
403    Saturation = 26,
404    Color = 27,
405    Luminosity = 28,
406}
407#[repr(u32)]
408#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
409pub enum DrawStyle {
410    Fill = 0,
411    Stroke = 1,
412    StrokeAndFill = 2,
413}
414#[repr(u32)]
415#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
416pub enum StrokeCap {
417    Butt = 0,
418    Round = 1,
419    Square = 2,
420}
421#[repr(u32)]
422#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
423pub enum StrokeJoin {
424    Miter = 0,
425    Round = 1,
426    Bevel = 2,
427}
428#[repr(u32)]
429#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
430pub enum PixelFormat {
431    RGBA8888 = 0,
432}
433#[repr(u32)]
434#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
435pub enum TextureSampling {
436    NearestNeighbor = 0,
437    Linear = 1,
438}
439#[repr(u32)]
440#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
441pub enum TileMode {
442    Clamp = 0,
443    Repeat = 1,
444    Mirror = 2,
445    Decal = 3,
446}
447#[repr(u32)]
448#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
449pub enum BlurStyle {
450    Normal = 0,
451    Solid = 1,
452    Outer = 2,
453    Inner = 3,
454}
455#[repr(u32)]
456#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
457pub enum ColorSpace {
458    SRGB = 0,
459    ExtendedSRGB = 1,
460    DisplayP3 = 2,
461}
462#[repr(u32)]
463#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
464pub enum FontWeight {
465    Thin = 0,
466    ExtraLight = 1,
467    Light = 2,
468    Regular = 3,
469    Medium = 4,
470    SemiBold = 5,
471    Bold = 6,
472    ExtraBold = 7,
473    Black = 8,
474}
475#[repr(u32)]
476#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
477pub enum FontStyle {
478    Normal = 0,
479    Italic = 1,
480}
481#[repr(u32)]
482#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
483pub enum TextAlignment {
484    Left = 0,
485    Right = 1,
486    Center = 2,
487    Justify = 3,
488    Start = 4,
489    End = 5,
490}
491#[repr(u32)]
492#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
493pub enum TextDirection {
494    RTL = 0,
495    LTR = 1,
496}
497#[repr(C)]
498#[derive(Debug, Default, Copy, Clone)]
499pub struct ImpellerRect {
500    pub x: f32,
501    pub y: f32,
502    pub width: f32,
503    pub height: f32,
504}
505#[allow(clippy::unnecessary_operation, clippy::identity_op)]
506const _: () = {
507    ["Size of ImpellerRect"][::std::mem::size_of::<ImpellerRect>() - 16usize];
508    ["Alignment of ImpellerRect"][::std::mem::align_of::<ImpellerRect>() - 4usize];
509    ["Offset of field: ImpellerRect::x"][::std::mem::offset_of!(ImpellerRect, x) - 0usize];
510    ["Offset of field: ImpellerRect::y"][::std::mem::offset_of!(ImpellerRect, y) - 4usize];
511    ["Offset of field: ImpellerRect::width"][::std::mem::offset_of!(ImpellerRect, width) - 8usize];
512    ["Offset of field: ImpellerRect::height"]
513        [::std::mem::offset_of!(ImpellerRect, height) - 12usize];
514};
515#[repr(C)]
516#[derive(Debug, Default, Copy, Clone)]
517pub struct ImpellerPoint {
518    pub x: f32,
519    pub y: f32,
520}
521#[allow(clippy::unnecessary_operation, clippy::identity_op)]
522const _: () = {
523    ["Size of ImpellerPoint"][::std::mem::size_of::<ImpellerPoint>() - 8usize];
524    ["Alignment of ImpellerPoint"][::std::mem::align_of::<ImpellerPoint>() - 4usize];
525    ["Offset of field: ImpellerPoint::x"][::std::mem::offset_of!(ImpellerPoint, x) - 0usize];
526    ["Offset of field: ImpellerPoint::y"][::std::mem::offset_of!(ImpellerPoint, y) - 4usize];
527};
528#[repr(C)]
529#[derive(Debug, Default, Copy, Clone)]
530pub struct ImpellerSize {
531    pub width: f32,
532    pub height: f32,
533}
534#[allow(clippy::unnecessary_operation, clippy::identity_op)]
535const _: () = {
536    ["Size of ImpellerSize"][::std::mem::size_of::<ImpellerSize>() - 8usize];
537    ["Alignment of ImpellerSize"][::std::mem::align_of::<ImpellerSize>() - 4usize];
538    ["Offset of field: ImpellerSize::width"][::std::mem::offset_of!(ImpellerSize, width) - 0usize];
539    ["Offset of field: ImpellerSize::height"]
540        [::std::mem::offset_of!(ImpellerSize, height) - 4usize];
541};
542#[repr(C)]
543#[derive(Debug, Default, Copy, Clone)]
544pub struct ImpellerISize {
545    pub width: i64,
546    pub height: i64,
547}
548#[allow(clippy::unnecessary_operation, clippy::identity_op)]
549const _: () = {
550    ["Size of ImpellerISize"][::std::mem::size_of::<ImpellerISize>() - 16usize];
551    ["Alignment of ImpellerISize"][::std::mem::align_of::<ImpellerISize>() - 8usize];
552    ["Offset of field: ImpellerISize::width"]
553        [::std::mem::offset_of!(ImpellerISize, width) - 0usize];
554    ["Offset of field: ImpellerISize::height"]
555        [::std::mem::offset_of!(ImpellerISize, height) - 8usize];
556};
557#[doc = " A 4x4 transformation matrix using column-major storage.\n\n ```ignore | m[0] m[4] m[8]  m[12] |\n | m[1] m[5] m[9]  m[13] |\n | m[2] m[6] m[10] m[14] |\n | m[3] m[7] m[11] m[15] |\n ```\n"]
558#[repr(C)]
559#[derive(Debug, Default, Copy, Clone)]
560pub struct ImpellerMatrix {
561    pub m: [f32; 16usize],
562}
563#[allow(clippy::unnecessary_operation, clippy::identity_op)]
564const _: () = {
565    ["Size of ImpellerMatrix"][::std::mem::size_of::<ImpellerMatrix>() - 64usize];
566    ["Alignment of ImpellerMatrix"][::std::mem::align_of::<ImpellerMatrix>() - 4usize];
567    ["Offset of field: ImpellerMatrix::m"][::std::mem::offset_of!(ImpellerMatrix, m) - 0usize];
568};
569#[doc = " A 4x5 matrix using row-major storage used for transforming color values.\n\n To transform color values, a 5x5 matrix is constructed with the 5th row\n being identity. Then the following transformation is performed:\n\n ```ignore | R' |   | m[0]  m[1]  m[2]  m[3]  m[4]  |   | R |\n | G' |   | m[5]  m[6]  m[7]  m[8]  m[9]  |   | G |\n | B' | = | m[10] m[11] m[12] m[13] m[14] | * | B |\n | A' |   | m[15] m[16] m[17] m[18] m[19] |   | A |\n | 1  |   | 0     0     0     0     1     |   | 1 |\n ```\n\n The translation column (m[4], m[9], m[14], m[19]) must be specified in\n non-normalized 8-bit unsigned integer space (0 to 255). Values outside this\n range will produce undefined results.\n\n The identity transformation is thus:\n\n ```ignore 1, 0, 0, 0, 0,\n 0, 1, 0, 0, 0,\n 0, 0, 1, 0, 0,\n 0, 0, 0, 1, 0,\n ```\n\n Some examples:\n\n To invert all colors:\n\n ```ignore -1,  0,  0, 0, 255,\n  0, -1,  0, 0, 255,\n  0,  0, -1, 0, 255,\n  0,  0,  0, 1,   0,\n ```\n\n To apply a sepia filter:\n\n ```ignore 0.393, 0.769, 0.189, 0, 0,\n 0.349, 0.686, 0.168, 0, 0,\n 0.272, 0.534, 0.131, 0, 0,\n 0,     0,     0,     1, 0,\n ```\n\n To apply a grayscale conversion filter:\n\n ```ignore  0.2126, 0.7152, 0.0722, 0, 0,\n  0.2126, 0.7152, 0.0722, 0, 0,\n  0.2126, 0.7152, 0.0722, 0, 0,\n  0,      0,      0,      1, 0,\n ```\n\n @see      ImpellerColorFilter\n"]
570#[repr(C)]
571#[derive(Debug, Default, Copy, Clone)]
572pub struct ImpellerColorMatrix {
573    pub m: [f32; 20usize],
574}
575#[allow(clippy::unnecessary_operation, clippy::identity_op)]
576const _: () = {
577    ["Size of ImpellerColorMatrix"][::std::mem::size_of::<ImpellerColorMatrix>() - 80usize];
578    ["Alignment of ImpellerColorMatrix"][::std::mem::align_of::<ImpellerColorMatrix>() - 4usize];
579    ["Offset of field: ImpellerColorMatrix::m"]
580        [::std::mem::offset_of!(ImpellerColorMatrix, m) - 0usize];
581};
582#[repr(C)]
583#[derive(Debug, Default, Copy, Clone)]
584pub struct ImpellerRoundingRadii {
585    pub top_left: ImpellerPoint,
586    pub bottom_left: ImpellerPoint,
587    pub top_right: ImpellerPoint,
588    pub bottom_right: ImpellerPoint,
589}
590#[allow(clippy::unnecessary_operation, clippy::identity_op)]
591const _: () = {
592    ["Size of ImpellerRoundingRadii"][::std::mem::size_of::<ImpellerRoundingRadii>() - 32usize];
593    ["Alignment of ImpellerRoundingRadii"]
594        [::std::mem::align_of::<ImpellerRoundingRadii>() - 4usize];
595    ["Offset of field: ImpellerRoundingRadii::top_left"]
596        [::std::mem::offset_of!(ImpellerRoundingRadii, top_left) - 0usize];
597    ["Offset of field: ImpellerRoundingRadii::bottom_left"]
598        [::std::mem::offset_of!(ImpellerRoundingRadii, bottom_left) - 8usize];
599    ["Offset of field: ImpellerRoundingRadii::top_right"]
600        [::std::mem::offset_of!(ImpellerRoundingRadii, top_right) - 16usize];
601    ["Offset of field: ImpellerRoundingRadii::bottom_right"]
602        [::std::mem::offset_of!(ImpellerRoundingRadii, bottom_right) - 24usize];
603};
604#[repr(C)]
605#[derive(Debug, Copy, Clone)]
606pub struct ImpellerColor {
607    pub red: f32,
608    pub green: f32,
609    pub blue: f32,
610    pub alpha: f32,
611    pub color_space: ColorSpace,
612}
613#[allow(clippy::unnecessary_operation, clippy::identity_op)]
614const _: () = {
615    ["Size of ImpellerColor"][::std::mem::size_of::<ImpellerColor>() - 20usize];
616    ["Alignment of ImpellerColor"][::std::mem::align_of::<ImpellerColor>() - 4usize];
617    ["Offset of field: ImpellerColor::red"][::std::mem::offset_of!(ImpellerColor, red) - 0usize];
618    ["Offset of field: ImpellerColor::green"]
619        [::std::mem::offset_of!(ImpellerColor, green) - 4usize];
620    ["Offset of field: ImpellerColor::blue"][::std::mem::offset_of!(ImpellerColor, blue) - 8usize];
621    ["Offset of field: ImpellerColor::alpha"]
622        [::std::mem::offset_of!(ImpellerColor, alpha) - 12usize];
623    ["Offset of field: ImpellerColor::color_space"]
624        [::std::mem::offset_of!(ImpellerColor, color_space) - 16usize];
625};
626impl Default for ImpellerColor {
627    fn default() -> Self {
628        let mut s = ::std::mem::MaybeUninit::<Self>::uninit();
629        unsafe {
630            ::std::ptr::write_bytes(s.as_mut_ptr(), 0, 1);
631            s.assume_init()
632        }
633    }
634}
635#[repr(C)]
636#[derive(Debug, Copy, Clone)]
637pub struct ImpellerTextureDescriptor {
638    pub pixel_format: PixelFormat,
639    pub size: ImpellerISize,
640    pub mip_count: u32,
641}
642#[allow(clippy::unnecessary_operation, clippy::identity_op)]
643const _: () = {
644    ["Size of ImpellerTextureDescriptor"]
645        [::std::mem::size_of::<ImpellerTextureDescriptor>() - 32usize];
646    ["Alignment of ImpellerTextureDescriptor"]
647        [::std::mem::align_of::<ImpellerTextureDescriptor>() - 8usize];
648    ["Offset of field: ImpellerTextureDescriptor::pixel_format"]
649        [::std::mem::offset_of!(ImpellerTextureDescriptor, pixel_format) - 0usize];
650    ["Offset of field: ImpellerTextureDescriptor::size"]
651        [::std::mem::offset_of!(ImpellerTextureDescriptor, size) - 8usize];
652    ["Offset of field: ImpellerTextureDescriptor::mip_count"]
653        [::std::mem::offset_of!(ImpellerTextureDescriptor, mip_count) - 24usize];
654};
655impl Default for ImpellerTextureDescriptor {
656    fn default() -> Self {
657        let mut s = ::std::mem::MaybeUninit::<Self>::uninit();
658        unsafe {
659            ::std::ptr::write_bytes(s.as_mut_ptr(), 0, 1);
660            s.assume_init()
661        }
662    }
663}
664#[repr(C)]
665#[derive(Debug, Copy, Clone)]
666pub struct ImpellerMapping {
667    pub data: *const u8,
668    pub length: u64,
669    pub on_release: ImpellerCallback,
670}
671#[allow(clippy::unnecessary_operation, clippy::identity_op)]
672const _: () = {
673    ["Size of ImpellerMapping"][::std::mem::size_of::<ImpellerMapping>() - 24usize];
674    ["Alignment of ImpellerMapping"][::std::mem::align_of::<ImpellerMapping>() - 8usize];
675    ["Offset of field: ImpellerMapping::data"]
676        [::std::mem::offset_of!(ImpellerMapping, data) - 0usize];
677    ["Offset of field: ImpellerMapping::length"]
678        [::std::mem::offset_of!(ImpellerMapping, length) - 8usize];
679    ["Offset of field: ImpellerMapping::on_release"]
680        [::std::mem::offset_of!(ImpellerMapping, on_release) - 16usize];
681};
682impl Default for ImpellerMapping {
683    fn default() -> Self {
684        let mut s = ::std::mem::MaybeUninit::<Self>::uninit();
685        unsafe {
686            ::std::ptr::write_bytes(s.as_mut_ptr(), 0, 1);
687            s.assume_init()
688        }
689    }
690}
691#[repr(C)]
692#[derive(Debug, Copy, Clone)]
693pub struct ImpellerContextVulkanSettings {
694    pub user_data: *mut ::std::os::raw::c_void,
695    pub proc_address_callback: ImpellerVulkanProcAddressCallback,
696    pub enable_vulkan_validation: bool,
697}
698#[allow(clippy::unnecessary_operation, clippy::identity_op)]
699const _: () = {
700    ["Size of ImpellerContextVulkanSettings"]
701        [::std::mem::size_of::<ImpellerContextVulkanSettings>() - 24usize];
702    ["Alignment of ImpellerContextVulkanSettings"]
703        [::std::mem::align_of::<ImpellerContextVulkanSettings>() - 8usize];
704    ["Offset of field: ImpellerContextVulkanSettings::user_data"]
705        [::std::mem::offset_of!(ImpellerContextVulkanSettings, user_data) - 0usize];
706    ["Offset of field: ImpellerContextVulkanSettings::proc_address_callback"]
707        [::std::mem::offset_of!(ImpellerContextVulkanSettings, proc_address_callback) - 8usize];
708    ["Offset of field: ImpellerContextVulkanSettings::enable_vulkan_validation"]
709        [::std::mem::offset_of!(ImpellerContextVulkanSettings, enable_vulkan_validation) - 16usize];
710};
711impl Default for ImpellerContextVulkanSettings {
712    fn default() -> Self {
713        let mut s = ::std::mem::MaybeUninit::<Self>::uninit();
714        unsafe {
715            ::std::ptr::write_bytes(s.as_mut_ptr(), 0, 1);
716            s.assume_init()
717        }
718    }
719}
720#[repr(C)]
721#[derive(Debug, Copy, Clone)]
722pub struct ImpellerContextVulkanInfo {
723    pub vk_instance: *mut ::std::os::raw::c_void,
724    pub vk_physical_device: *mut ::std::os::raw::c_void,
725    pub vk_logical_device: *mut ::std::os::raw::c_void,
726    pub graphics_queue_family_index: u32,
727    pub graphics_queue_index: u32,
728}
729#[allow(clippy::unnecessary_operation, clippy::identity_op)]
730const _: () = {
731    ["Size of ImpellerContextVulkanInfo"]
732        [::std::mem::size_of::<ImpellerContextVulkanInfo>() - 32usize];
733    ["Alignment of ImpellerContextVulkanInfo"]
734        [::std::mem::align_of::<ImpellerContextVulkanInfo>() - 8usize];
735    ["Offset of field: ImpellerContextVulkanInfo::vk_instance"]
736        [::std::mem::offset_of!(ImpellerContextVulkanInfo, vk_instance) - 0usize];
737    ["Offset of field: ImpellerContextVulkanInfo::vk_physical_device"]
738        [::std::mem::offset_of!(ImpellerContextVulkanInfo, vk_physical_device) - 8usize];
739    ["Offset of field: ImpellerContextVulkanInfo::vk_logical_device"]
740        [::std::mem::offset_of!(ImpellerContextVulkanInfo, vk_logical_device) - 16usize];
741    ["Offset of field: ImpellerContextVulkanInfo::graphics_queue_family_index"]
742        [::std::mem::offset_of!(ImpellerContextVulkanInfo, graphics_queue_family_index) - 24usize];
743    ["Offset of field: ImpellerContextVulkanInfo::graphics_queue_index"]
744        [::std::mem::offset_of!(ImpellerContextVulkanInfo, graphics_queue_index) - 28usize];
745};
746impl Default for ImpellerContextVulkanInfo {
747    fn default() -> Self {
748        let mut s = ::std::mem::MaybeUninit::<Self>::uninit();
749        unsafe {
750            ::std::ptr::write_bytes(s.as_mut_ptr(), 0, 1);
751            s.assume_init()
752        }
753    }
754}
755unsafe extern "C" {
756    #[doc = " @brief      Get the version of Impeller standalone API. This is the API that\n             will be accepted for validity checks when provided to the\n             context creation methods.\n\n             The current version of the API  is denoted by the\n             `IMPELLER_VERSION` macro. This version must be passed to APIs\n             that create top-level objects like graphics contexts.\n             Construction of the context may fail if the API version expected\n             by the caller is not supported by the library.\n\n             Since there are no API stability guarantees today, passing a\n             version that is different to the one returned by\n             `ImpellerGetVersion` will always fail.\n\n @see        `ImpellerContextCreateOpenGLESNew`\n\n @return     The version of the standalone API.\n"]
757    pub fn ImpellerGetVersion() -> u32;
758    #[doc = " @brief      Create an OpenGL(ES) Impeller context.\n\n @warning    Unlike other context types, the OpenGL ES context can only be\n             created, used, and collected on the calling thread. This\n             restriction may be lifted in the future once reactor workers are\n             exposed in the API. No other context types have threading\n             restrictions. Till reactor workers can be used, using the\n             context on a background thread will cause a stall of OpenGL\n             operations.\n\n @param[in]  version      The version of the Impeller\n                          standalone API. See `ImpellerGetVersion`. If the\n                          specified here is not compatible with the version\n                          of the library, context creation will fail and NULL\n                          context returned from this call.\n @param[in]  gl_proc_address_callback\n                          The gl proc address callback. For instance,\n                          `eglGetProcAddress`.\n @param[in]  gl_proc_address_callback_user_data\n                          The gl proc address callback user data baton. This\n                          pointer is not interpreted by Impeller and will be\n                          returned as user data in the proc address callback.\n                          user data.\n\n @return     The context or NULL if one cannot be created.\n"]
759    pub fn ImpellerContextCreateOpenGLESNew(
760        version: u32,
761        gl_proc_address_callback: ImpellerProcAddressCallback,
762        gl_proc_address_callback_user_data: *mut ::std::os::raw::c_void,
763    ) -> ImpellerContext;
764    #[doc = " @brief      Create a Metal context using the system default Metal device.\n\n @param[in]  version  The version specified in the IMPELLER_VERSION macro.\n\n @return     The Metal context or NULL if one cannot be created.\n"]
765    pub fn ImpellerContextCreateMetalNew(version: u32) -> ImpellerContext;
766    #[doc = " @brief      Create a Vulkan context using the provided Vulkan Settings.\n\n @param[in]  version   The version specified in the IMPELLER_VERSION macro.\n @param[in]  settings  The Vulkan settings.\n\n @return     The Vulkan context or NULL if one cannot be created.\n"]
767    pub fn ImpellerContextCreateVulkanNew(
768        version: u32,
769        settings: *const ImpellerContextVulkanSettings,
770    ) -> ImpellerContext;
771    #[doc = " @brief      Retain a strong reference to the object. The object can be NULL\n             in which case this method is a no-op.\n\n @param[in]  context  The context.\n"]
772    pub fn ImpellerContextRetain(context: ImpellerContext);
773    #[doc = " @brief      Release a previously retained reference to the object. The\n             object can be NULL in which case this method is a no-op.\n\n @param[in]  context  The context.\n"]
774    pub fn ImpellerContextRelease(context: ImpellerContext);
775    #[doc = " @brief      Get internal Vulkan handles managed by the given Vulkan context.\n             Ownership of the handles is still maintained by Impeller. This\n             accessor is just available so embedders can create resources\n             using the same device and instance as Impeller for interop.\n\n @warning    If the context is not a Vulkan context, False is returned with\n             the [out] argument unaffected.\n\n @param[in]  context          The context\n @param[out]  out_vulkan_info  The out vulkan information\n\n @return     If the Vulkan info could be fetched from the context.\n"]
776    pub fn ImpellerContextGetVulkanInfo(
777        context: ImpellerContext,
778        out_vulkan_info: *mut ImpellerContextVulkanInfo,
779    ) -> bool;
780    #[doc = " @brief      Create a new Vulkan swapchain using a VkSurfaceKHR instance.\n             Ownership of the surface is transferred over to Impeller. The\n             Vulkan instance the surface is created from must the same as the\n             context provided.\n\n @param[in]  context             The context. Must be a Vulkan context whose\n                                 instance is the same used to create the\n                                 surface passed into the next argument.\n @param      vulkan_surface_khr  The vulkan surface.\n\n @return     The vulkan swapchain.\n"]
781    pub fn ImpellerVulkanSwapchainCreateNew(
782        context: ImpellerContext,
783        vulkan_surface_khr: *mut ::std::os::raw::c_void,
784    ) -> ImpellerVulkanSwapchain;
785    #[doc = " @brief      Retain a strong reference to the object. The object can be NULL\n             in which case this method is a no-op.\n\n @param[in]  swapchain  The swapchain.\n"]
786    pub fn ImpellerVulkanSwapchainRetain(swapchain: ImpellerVulkanSwapchain);
787    #[doc = " @brief      Release a previously retained reference to the object. The\n             object can be NULL in which case this method is a no-op.\n\n @param[in]  swapchain  The swapchain.\n"]
788    pub fn ImpellerVulkanSwapchainRelease(swapchain: ImpellerVulkanSwapchain);
789    #[doc = " @brief      A potentially blocking operation, acquires the next surface to\n             render to. Since this may block, surface acquisition must be\n             delayed for as long as possible to avoid an idle wait on the\n             CPU.\n\n @param[in]  swapchain  The swapchain.\n\n @return     The surface if one could be obtained, NULL otherwise.\n"]
790    pub fn ImpellerVulkanSwapchainAcquireNextSurfaceNew(
791        swapchain: ImpellerVulkanSwapchain,
792    ) -> ImpellerSurface;
793    #[doc = " @brief      Create a new surface by wrapping an existing framebuffer object.\n             The framebuffer must be complete as determined by\n             `glCheckFramebufferStatus`. The framebuffer is still owned by\n             the caller and it must be collected once the surface is\n             collected.\n\n @param[in]  context  The context.\n @param[in]  fbo      The framebuffer object handle.\n @param[in]  format   The format of the framebuffer.\n @param[in]  size     The size of the framebuffer is texels.\n\n @return     The surface if once can be created, NULL otherwise.\n"]
794    pub fn ImpellerSurfaceCreateWrappedFBONew(
795        context: ImpellerContext,
796        fbo: u64,
797        format: PixelFormat,
798        size: *const ImpellerISize,
799    ) -> ImpellerSurface;
800    #[doc = " @brief      Create a surface by wrapping a Metal drawable. This is useful\n             during WSI when the drawable is the backing store of the Metal\n             layer being drawn to.\n\n             The Metal layer must be using the same device managed by the\n             underlying context.\n\n @param[in]  context         The context. The Metal device managed by this\n                             context must be the same used to create the\n                             drawable that is being wrapped.\n @param      metal_drawable  The drawable to wrap as a surface.\n\n @return     The surface if one could be wrapped, NULL otherwise.\n"]
801    pub fn ImpellerSurfaceCreateWrappedMetalDrawableNew(
802        context: ImpellerContext,
803        metal_drawable: *mut ::std::os::raw::c_void,
804    ) -> ImpellerSurface;
805    #[doc = " @brief      Retain a strong reference to the object. The object can be NULL\n             in which case this method is a no-op.\n\n @param[in]  surface  The surface.\n"]
806    pub fn ImpellerSurfaceRetain(surface: ImpellerSurface);
807    #[doc = " @brief      Release a previously retained reference to the object. The\n             object can be NULL in which case this method is a no-op.\n\n @param[in]  surface  The surface.\n"]
808    pub fn ImpellerSurfaceRelease(surface: ImpellerSurface);
809    #[doc = " @brief      Draw a display list onto the surface. The same display list can\n             be drawn multiple times to different surfaces.\n\n @warning    In the OpenGL backend, Impeller will not make an effort to\n             preserve the OpenGL state that is current in the context.\n             Embedders that perform additional OpenGL operations in the\n             context should expect the reset state after control transitions\n             back to them. Key state to watch out for would be the viewports,\n             stencil rects, test toggles, resource (texture, framebuffer,\n             buffer) bindings, etc...\n\n @param[in]  surface       The surface to draw the display list to.\n @param[in]  display_list  The display list to draw onto the surface.\n\n @return     If the display list could be drawn onto the surface.\n"]
810    pub fn ImpellerSurfaceDrawDisplayList(
811        surface: ImpellerSurface,
812        display_list: ImpellerDisplayList,
813    ) -> bool;
814    #[doc = " @brief      Present the surface to the underlying window system.\n\n @param[in]  surface  The surface to present.\n\n @return     True if the surface could be presented.\n"]
815    pub fn ImpellerSurfacePresent(surface: ImpellerSurface) -> bool;
816    #[doc = " @brief      Retain a strong reference to the object. The object can be NULL\n             in which case this method is a no-op.\n\n @param[in]  path  The path.\n"]
817    pub fn ImpellerPathRetain(path: ImpellerPath);
818    #[doc = " @brief      Release a previously retained reference to the object. The\n             object can be NULL in which case this method is a no-op.\n\n @param[in]  path  The path.\n"]
819    pub fn ImpellerPathRelease(path: ImpellerPath);
820    #[doc = " @brief      Create a new path builder. Paths themselves are immutable.\n             A builder builds these immutable paths.\n\n @return     The path builder.\n"]
821    pub fn ImpellerPathBuilderNew() -> ImpellerPathBuilder;
822    #[doc = " @brief      Retain a strong reference to the object. The object can be NULL\n             in which case this method is a no-op.\n\n @param[in]  builder  The builder.\n"]
823    pub fn ImpellerPathBuilderRetain(builder: ImpellerPathBuilder);
824    #[doc = " @brief      Release a previously retained reference to the object. The\n             object can be NULL in which case this method is a no-op.\n\n @param[in]  builder  The builder.\n"]
825    pub fn ImpellerPathBuilderRelease(builder: ImpellerPathBuilder);
826    #[doc = " @brief      Move the cursor to the specified location.\n\n @param[in]  builder   The builder.\n @param[in]  location  The location.\n"]
827    pub fn ImpellerPathBuilderMoveTo(builder: ImpellerPathBuilder, location: *const ImpellerPoint);
828    #[doc = " @brief      Add a line segment from the current cursor location to the given\n             location. The cursor location is updated to be at the endpoint.\n\n @param[in]  builder   The builder.\n @param[in]  location  The location.\n"]
829    pub fn ImpellerPathBuilderLineTo(builder: ImpellerPathBuilder, location: *const ImpellerPoint);
830    #[doc = " @brief      Add a quadratic curve from whose start point is the cursor to\n             the specified end point using the a single control point.\n\n             The new location of the cursor after this call is the end point.\n\n @param[in]  builder        The builder.\n @param[in]  control_point  The control point.\n @param[in]  end_point      The end point.\n"]
831    pub fn ImpellerPathBuilderQuadraticCurveTo(
832        builder: ImpellerPathBuilder,
833        control_point: *const ImpellerPoint,
834        end_point: *const ImpellerPoint,
835    );
836    #[doc = " @brief      Add a cubic curve whose start point is current cursor location\n             to the specified end point using the two specified control\n             points.\n\n             The new location of the cursor after this call is the end point\n             supplied.\n\n @param[in]  builder          The builder\n @param[in]  control_point_1  The control point 1\n @param[in]  control_point_2  The control point 2\n @param[in]  end_point        The end point\n"]
837    pub fn ImpellerPathBuilderCubicCurveTo(
838        builder: ImpellerPathBuilder,
839        control_point_1: *const ImpellerPoint,
840        control_point_2: *const ImpellerPoint,
841        end_point: *const ImpellerPoint,
842    );
843    #[doc = " @brief      Adds a rectangle to the path.\n\n @param[in]  builder  The builder.\n @param[in]  rect     The rectangle.\n"]
844    pub fn ImpellerPathBuilderAddRect(builder: ImpellerPathBuilder, rect: *const ImpellerRect);
845    #[doc = " @brief      Add an arc to the path.\n\n @param[in]  builder              The builder.\n @param[in]  oval_bounds          The oval bounds.\n @param[in]  start_angle_degrees  The start angle in degrees.\n @param[in]  end_angle_degrees    The end angle in degrees.\n"]
846    pub fn ImpellerPathBuilderAddArc(
847        builder: ImpellerPathBuilder,
848        oval_bounds: *const ImpellerRect,
849        start_angle_degrees: f32,
850        end_angle_degrees: f32,
851    );
852    #[doc = " @brief      Add an oval to the path.\n\n @param[in]  builder      The builder.\n @param[in]  oval_bounds  The oval bounds.\n"]
853    pub fn ImpellerPathBuilderAddOval(
854        builder: ImpellerPathBuilder,
855        oval_bounds: *const ImpellerRect,
856    );
857    #[doc = " @brief      Add a rounded rect with potentially non-uniform radii to the\n             path.\n\n @param[in]  builder         The builder.\n @param[in]  rect            The rectangle.\n @param[in]  rounding_radii  The rounding radii.\n"]
858    pub fn ImpellerPathBuilderAddRoundedRect(
859        builder: ImpellerPathBuilder,
860        rect: *const ImpellerRect,
861        rounding_radii: *const ImpellerRoundingRadii,
862    );
863    #[doc = " @brief      Close the path.\n\n @param[in]  builder  The builder.\n"]
864    pub fn ImpellerPathBuilderClose(builder: ImpellerPathBuilder);
865    #[doc = " @brief      Create a new path by copying the existing built-up path. The\n             existing path can continue being added to.\n\n @param[in]  builder  The builder.\n @param[in]  fill     The fill.\n\n @return     The impeller path.\n"]
866    pub fn ImpellerPathBuilderCopyPathNew(
867        builder: ImpellerPathBuilder,
868        fill: FillType,
869    ) -> ImpellerPath;
870    #[doc = " @brief      Create a new path using the existing built-up path. The existing\n             path builder now contains an empty path.\n\n @param[in]  builder  The builder.\n @param[in]  fill     The fill.\n\n @return     The impeller path.\n"]
871    pub fn ImpellerPathBuilderTakePathNew(
872        builder: ImpellerPathBuilder,
873        fill: FillType,
874    ) -> ImpellerPath;
875    #[doc = " @brief      Create a new paint with default values.\n\n @return     The impeller paint.\n"]
876    pub fn ImpellerPaintNew() -> ImpellerPaint;
877    #[doc = " @brief      Retain a strong reference to the object. The object can be NULL\n             in which case this method is a no-op.\n\n @param[in]  paint  The paint.\n"]
878    pub fn ImpellerPaintRetain(paint: ImpellerPaint);
879    #[doc = " @brief      Release a previously retained reference to the object. The\n             object can be NULL in which case this method is a no-op.\n\n @param[in]  paint  The paint.\n"]
880    pub fn ImpellerPaintRelease(paint: ImpellerPaint);
881    #[doc = " @brief      Set the paint color.\n\n @param[in]  paint  The paint.\n @param[in]  color  The color.\n"]
882    pub fn ImpellerPaintSetColor(paint: ImpellerPaint, color: *const ImpellerColor);
883    #[doc = " @brief      Set the paint blend mode. The blend mode controls how the new\n             paints contents are mixed with the values already drawn using\n             previous draw calls.\n\n @param[in]  paint  The paint.\n @param[in]  mode   The mode.\n"]
884    pub fn ImpellerPaintSetBlendMode(paint: ImpellerPaint, mode: BlendMode);
885    #[doc = " @brief      Set the paint draw style. The style controls if the closed\n             shapes are filled and/or stroked.\n\n @param[in]  paint  The paint.\n @param[in]  style  The style.\n"]
886    pub fn ImpellerPaintSetDrawStyle(paint: ImpellerPaint, style: DrawStyle);
887    #[doc = " @brief      Sets how strokes rendered using this paint are capped.\n\n @param[in]  paint  The paint.\n @param[in]  cap    The stroke cap style.\n"]
888    pub fn ImpellerPaintSetStrokeCap(paint: ImpellerPaint, cap: StrokeCap);
889    #[doc = " @brief      Sets how strokes rendered using this paint are joined.\n\n @param[in]  paint  The paint.\n @param[in]  join   The join.\n"]
890    pub fn ImpellerPaintSetStrokeJoin(paint: ImpellerPaint, join: StrokeJoin);
891    #[doc = " @brief      Set the width of the strokes rendered using this paint.\n\n @param[in]  paint  The paint.\n @param[in]  width  The width.\n"]
892    pub fn ImpellerPaintSetStrokeWidth(paint: ImpellerPaint, width: f32);
893    #[doc = " @brief      Set the miter limit of the strokes rendered using this paint.\n\n @param[in]  paint  The paint.\n @param[in]  miter  The miter limit.\n"]
894    pub fn ImpellerPaintSetStrokeMiter(paint: ImpellerPaint, miter: f32);
895    #[doc = " @brief      Set the color filter of the paint.\n\n             Color filters are functions that take two colors and mix them to\n             produce a single color. This color is then usually merged with\n             the destination during blending.\n\n @param[in]  paint         The paint.\n @param[in]  color_filter  The color filter.\n"]
896    pub fn ImpellerPaintSetColorFilter(paint: ImpellerPaint, color_filter: ImpellerColorFilter);
897    #[doc = " @brief      Set the color source of the paint.\n\n             Color sources are functions that generate colors for each\n             texture element covered by a draw call.\n\n @param[in]  paint         The paint.\n @param[in]  color_source  The color source.\n"]
898    pub fn ImpellerPaintSetColorSource(paint: ImpellerPaint, color_source: ImpellerColorSource);
899    #[doc = " @brief      Set the image filter of a paint.\n\n             Image filters are functions that are applied to regions of a\n             texture to produce a single color.\n\n @param[in]  paint         The paint.\n @param[in]  image_filter  The image filter.\n"]
900    pub fn ImpellerPaintSetImageFilter(paint: ImpellerPaint, image_filter: ImpellerImageFilter);
901    #[doc = " @brief      Set the mask filter of a paint.\n\n @param[in]  paint        The paint.\n @param[in]  mask_filter  The mask filter.\n"]
902    pub fn ImpellerPaintSetMaskFilter(paint: ImpellerPaint, mask_filter: ImpellerMaskFilter);
903    #[doc = " @brief      Create a texture with decompressed bytes.\n\n             Impeller will do its best to perform the transfer of this data\n             to GPU memory with a minimal number of copies. Towards this\n             end, it may need to send this data to a different thread for\n             preparation and transfer. To facilitate this transfer, it is\n             recommended that the content mapping have a release callback\n             attach to it. When there is a release callback, Impeller assumes\n             that collection of the data can be deferred till texture upload\n             is done and can happen on a background thread. When there is no\n             release callback, Impeller may try to perform an eager copy of\n             the data if it needs to perform data preparation and transfer on\n             a background thread.\n\n             Whether an extra data copy actually occurs will always depend on\n             the rendering backend in use. But it is best practice to provide\n             a release callback and be resilient to the data being released\n             in a deferred manner on a background thread.\n\n @warning    Do **not** supply compressed image data directly (PNG, JPEG,\n             etc...). This function only works with tightly packed\n             decompressed data.\n\n @param[in]  context                        The context.\n @param[in]  descriptor                     The texture descriptor.\n @param[in]  contents                       The contents.\n @param[in]  contents_on_release_user_data  The baton passes to the contents\n                                            release callback if one exists.\n\n @return     The texture if one can be created using the provided data, NULL\n             otherwise.\n"]
904    pub fn ImpellerTextureCreateWithContentsNew(
905        context: ImpellerContext,
906        descriptor: *const ImpellerTextureDescriptor,
907        contents: *const ImpellerMapping,
908        contents_on_release_user_data: *mut ::std::os::raw::c_void,
909    ) -> ImpellerTexture;
910    #[doc = " @brief      Create a texture with an externally created OpenGL texture\n             handle.\n\n             Ownership of the handle is transferred over to Impeller after a\n             successful call to this method. Impeller is responsible for\n             calling glDeleteTextures on this handle. Do **not** collect this\n             handle yourself as this will lead to a double-free.\n\n             The handle must be created in the same context as the one used\n             by Impeller. If a different context is used, that context must\n             be in the same sharegroup as Impellers OpenGL context and all\n             synchronization of texture contents must already be complete.\n\n             If the context is not an OpenGL context, this call will always\n             fail.\n\n @param[in]  context     The context\n @param[in]  descriptor  The descriptor\n @param[in]  handle      The handle\n\n @return     The texture if one could be created by adopting the supplied\n             texture handle, NULL otherwise.\n"]
911    pub fn ImpellerTextureCreateWithOpenGLTextureHandleNew(
912        context: ImpellerContext,
913        descriptor: *const ImpellerTextureDescriptor,
914        handle: u64,
915    ) -> ImpellerTexture;
916    #[doc = " @brief      Retain a strong reference to the object. The object can be NULL\n             in which case this method is a no-op.\n\n @param[in]  texture  The texture.\n"]
917    pub fn ImpellerTextureRetain(texture: ImpellerTexture);
918    #[doc = " @brief      Release a previously retained reference to the object. The\n             object can be NULL in which case this method is a no-op.\n\n @param[in]  texture  The texture.\n"]
919    pub fn ImpellerTextureRelease(texture: ImpellerTexture);
920    #[doc = " @brief      Get the OpenGL handle associated with this texture. If this is\n             not an OpenGL texture, this method will always return 0.\n\n             OpenGL handles are lazily created, this method will return\n             GL_NONE is no OpenGL handle is available. To ensure that this\n             call eagerly creates an OpenGL texture, call this on a thread\n             where Impeller knows there is an OpenGL context available.\n\n @param[in]  texture  The texture.\n\n @return     The OpenGL handle if one is available, GL_NONE otherwise.\n"]
921    pub fn ImpellerTextureGetOpenGLHandle(texture: ImpellerTexture) -> u64;
922    #[doc = " @brief      Retain a strong reference to the object. The object can be NULL\n             in which case this method is a no-op.\n\n @param[in]  color_source  The color source.\n"]
923    pub fn ImpellerColorSourceRetain(color_source: ImpellerColorSource);
924    #[doc = " @brief      Release a previously retained reference to the object. The\n             object can be NULL in which case this method is a no-op.\n\n @param[in]  color_source  The color source.\n"]
925    pub fn ImpellerColorSourceRelease(color_source: ImpellerColorSource);
926    #[doc = " @brief      Create a color source that forms a linear gradient.\n\n @param[in]  start_point     The start point.\n @param[in]  end_point       The end point.\n @param[in]  stop_count      The stop count.\n @param[in]  colors          The colors.\n @param[in]  stops           The stops.\n @param[in]  tile_mode       The tile mode.\n @param[in]  transformation  The transformation.\n\n @return     The color source.\n"]
927    pub fn ImpellerColorSourceCreateLinearGradientNew(
928        start_point: *const ImpellerPoint,
929        end_point: *const ImpellerPoint,
930        stop_count: u32,
931        colors: *const ImpellerColor,
932        stops: *const f32,
933        tile_mode: TileMode,
934        transformation: *const ImpellerMatrix,
935    ) -> ImpellerColorSource;
936    #[doc = " @brief      Create a color source that forms a radial gradient.\n\n @param[in]  center          The center.\n @param[in]  radius          The radius.\n @param[in]  stop_count      The stop count.\n @param[in]  colors          The colors.\n @param[in]  stops           The stops.\n @param[in]  tile_mode       The tile mode.\n @param[in]  transformation  The transformation.\n\n @return     The color source.\n"]
937    pub fn ImpellerColorSourceCreateRadialGradientNew(
938        center: *const ImpellerPoint,
939        radius: f32,
940        stop_count: u32,
941        colors: *const ImpellerColor,
942        stops: *const f32,
943        tile_mode: TileMode,
944        transformation: *const ImpellerMatrix,
945    ) -> ImpellerColorSource;
946    #[doc = " @brief      Create a color source that forms a conical gradient.\n\n @param[in]  start_center    The start center.\n @param[in]  start_radius    The start radius.\n @param[in]  end_center      The end center.\n @param[in]  end_radius      The end radius.\n @param[in]  stop_count      The stop count.\n @param[in]  colors          The colors.\n @param[in]  stops           The stops.\n @param[in]  tile_mode       The tile mode.\n @param[in]  transformation  The transformation.\n\n @return     The color source.\n"]
947    pub fn ImpellerColorSourceCreateConicalGradientNew(
948        start_center: *const ImpellerPoint,
949        start_radius: f32,
950        end_center: *const ImpellerPoint,
951        end_radius: f32,
952        stop_count: u32,
953        colors: *const ImpellerColor,
954        stops: *const f32,
955        tile_mode: TileMode,
956        transformation: *const ImpellerMatrix,
957    ) -> ImpellerColorSource;
958    #[doc = " @brief      Create a color source that forms a sweep gradient.\n\n @param[in]  center          The center.\n @param[in]  start           The start.\n @param[in]  end             The end.\n @param[in]  stop_count      The stop count.\n @param[in]  colors          The colors.\n @param[in]  stops           The stops.\n @param[in]  tile_mode       The tile mode.\n @param[in]  transformation  The transformation.\n\n @return     The color source.\n"]
959    pub fn ImpellerColorSourceCreateSweepGradientNew(
960        center: *const ImpellerPoint,
961        start: f32,
962        end: f32,
963        stop_count: u32,
964        colors: *const ImpellerColor,
965        stops: *const f32,
966        tile_mode: TileMode,
967        transformation: *const ImpellerMatrix,
968    ) -> ImpellerColorSource;
969    #[doc = " @brief      Create a color source that samples from an image.\n\n @param[in]  image                 The image.\n @param[in]  horizontal_tile_mode  The horizontal tile mode.\n @param[in]  vertical_tile_mode    The vertical tile mode.\n @param[in]  sampling              The sampling.\n @param[in]  transformation        The transformation.\n\n @return     The color source.\n"]
970    pub fn ImpellerColorSourceCreateImageNew(
971        image: ImpellerTexture,
972        horizontal_tile_mode: TileMode,
973        vertical_tile_mode: TileMode,
974        sampling: TextureSampling,
975        transformation: *const ImpellerMatrix,
976    ) -> ImpellerColorSource;
977    #[doc = " @brief      Retain a strong reference to the object. The object can be NULL\n             in which case this method is a no-op.\n\n @param[in]  color_filter  The color filter.\n"]
978    pub fn ImpellerColorFilterRetain(color_filter: ImpellerColorFilter);
979    #[doc = " @brief      Release a previously retained reference to the object. The\n             object can be NULL in which case this method is a no-op.\n\n @param[in]  color_filter  The color filter.\n"]
980    pub fn ImpellerColorFilterRelease(color_filter: ImpellerColorFilter);
981    #[doc = " @brief      Create a color filter that performs blending of pixel values\n             independently.\n\n @param[in]  color       The color.\n @param[in]  blend_mode  The blend mode.\n\n @return     The color filter.\n"]
982    pub fn ImpellerColorFilterCreateBlendNew(
983        color: *const ImpellerColor,
984        blend_mode: BlendMode,
985    ) -> ImpellerColorFilter;
986    #[doc = " @brief      Create a color filter that transforms pixel color values\n             independently.\n\n @param[in]  color_matrix  The color matrix.\n\n @return     The color filter.\n"]
987    pub fn ImpellerColorFilterCreateColorMatrixNew(
988        color_matrix: *const ImpellerColorMatrix,
989    ) -> ImpellerColorFilter;
990    #[doc = " @brief      Retain a strong reference to the object. The object can be NULL\n             in which case this method is a no-op.\n\n @param[in]  mask_filter  The mask filter.\n"]
991    pub fn ImpellerMaskFilterRetain(mask_filter: ImpellerMaskFilter);
992    #[doc = " @brief      Release a previously retained reference to the object. The\n             object can be NULL in which case this method is a no-op.\n\n @param[in]  mask_filter  The mask filter.\n"]
993    pub fn ImpellerMaskFilterRelease(mask_filter: ImpellerMaskFilter);
994    #[doc = " @brief      Create a mask filter that blurs contents in the masked shape.\n\n @param[in]  style  The style.\n @param[in]  sigma  The sigma.\n\n @return     The mask filter.\n"]
995    pub fn ImpellerMaskFilterCreateBlurNew(style: BlurStyle, sigma: f32) -> ImpellerMaskFilter;
996    #[doc = " @brief      Retain a strong reference to the object. The object can be NULL\n             in which case this method is a no-op.\n\n @param[in]  image_filter  The image filter.\n"]
997    pub fn ImpellerImageFilterRetain(image_filter: ImpellerImageFilter);
998    #[doc = " @brief      Release a previously retained reference to the object. The\n             object can be NULL in which case this method is a no-op.\n\n @param[in]  image_filter  The image filter.\n"]
999    pub fn ImpellerImageFilterRelease(image_filter: ImpellerImageFilter);
1000    #[doc = " @brief      Creates an image filter that applies a Gaussian blur.\n\n             The Gaussian blur applied may be an approximation for\n             performance.\n\n\n @param[in]  x_sigma    The x sigma.\n @param[in]  y_sigma    The y sigma.\n @param[in]  tile_mode  The tile mode.\n\n @return     The image filter.\n"]
1001    pub fn ImpellerImageFilterCreateBlurNew(
1002        x_sigma: f32,
1003        y_sigma: f32,
1004        tile_mode: TileMode,
1005    ) -> ImpellerImageFilter;
1006    #[doc = " @brief      Creates an image filter that enhances the per-channel pixel\n             values to the maximum value in a circle around the pixel.\n\n @param[in]  x_radius  The x radius.\n @param[in]  y_radius  The y radius.\n\n @return     The image filter.\n"]
1007    pub fn ImpellerImageFilterCreateDilateNew(x_radius: f32, y_radius: f32) -> ImpellerImageFilter;
1008    #[doc = " @brief      Creates an image filter that dampens the per-channel pixel\n             values to the minimum value in a circle around the pixel.\n\n @param[in]  x_radius  The x radius.\n @param[in]  y_radius  The y radius.\n\n @return     The image filter.\n"]
1009    pub fn ImpellerImageFilterCreateErodeNew(x_radius: f32, y_radius: f32) -> ImpellerImageFilter;
1010    #[doc = " @brief      Creates an image filter that applies a transformation matrix to\n             the underlying image.\n\n @param[in]  matrix    The transformation matrix.\n @param[in]  sampling  The image sampling mode.\n\n @return     The image filter.\n"]
1011    pub fn ImpellerImageFilterCreateMatrixNew(
1012        matrix: *const ImpellerMatrix,
1013        sampling: TextureSampling,
1014    ) -> ImpellerImageFilter;
1015    #[doc = " @brief      Creates a composed filter that when applied is identical to\n             subsequently applying the inner and then the outer filters.\n\n             ```ignore             destination = outer_filter(inner_filter(source))\n             ```\n\n @param[in]  outer  The outer image filter.\n @param[in]  inner  The inner image filter.\n\n @return     The combined image filter.\n"]
1016    pub fn ImpellerImageFilterCreateComposeNew(
1017        outer: ImpellerImageFilter,
1018        inner: ImpellerImageFilter,
1019    ) -> ImpellerImageFilter;
1020    #[doc = " @brief      Retain a strong reference to the object. The object can be NULL\n             in which case this method is a no-op.\n\n @param[in]  display_list  The display list.\n"]
1021    pub fn ImpellerDisplayListRetain(display_list: ImpellerDisplayList);
1022    #[doc = " @brief      Release a previously retained reference to the object. The\n             object can be NULL in which case this method is a no-op.\n\n @param[in]  display_list  The display list.\n"]
1023    pub fn ImpellerDisplayListRelease(display_list: ImpellerDisplayList);
1024    #[doc = " @brief      Create a new display list builder.\n\n             An optional cull rectangle may be specified. Impeller is allowed\n             to treat the contents outside this rectangle as being undefined.\n             This may aid performance optimizations.\n\n @param[in]  cull_rect  The cull rectangle or NULL.\n\n @return     The display list builder.\n"]
1025    pub fn ImpellerDisplayListBuilderNew(
1026        cull_rect: *const ImpellerRect,
1027    ) -> ImpellerDisplayListBuilder;
1028    #[doc = " @brief      Retain a strong reference to the object. The object can be NULL\n             in which case this method is a no-op.\n\n @param[in]  builder  The display list builder.\n"]
1029    pub fn ImpellerDisplayListBuilderRetain(builder: ImpellerDisplayListBuilder);
1030    #[doc = " @brief      Release a previously retained reference to the object. The\n             object can be NULL in which case this method is a no-op.\n\n @param[in]  builder  The display list builder.\n"]
1031    pub fn ImpellerDisplayListBuilderRelease(builder: ImpellerDisplayListBuilder);
1032    #[doc = " @brief      Create a new display list using the rendering intent already\n             encoded in the builder. The builder is reset after this call.\n\n @param[in]  builder  The builder.\n\n @return     The display list.\n"]
1033    pub fn ImpellerDisplayListBuilderCreateDisplayListNew(
1034        builder: ImpellerDisplayListBuilder,
1035    ) -> ImpellerDisplayList;
1036    #[doc = " @brief      Stashes the current transformation and clip state onto a save\n             stack.\n\n @param[in]  builder  The builder.\n"]
1037    pub fn ImpellerDisplayListBuilderSave(builder: ImpellerDisplayListBuilder);
1038    #[doc = " @brief      Stashes the current transformation and clip state onto a save\n             stack and creates and creates an offscreen layer onto which\n             subsequent rendering intent will be directed to.\n\n             On the balancing call to restore, the supplied paints filters\n             and blend modes will be used to composite the offscreen contents\n             back onto the display display list.\n\n @param[in]  builder   The builder.\n @param[in]  bounds    The bounds.\n @param[in]  paint     The paint.\n @param[in]  backdrop  The backdrop.\n"]
1039    pub fn ImpellerDisplayListBuilderSaveLayer(
1040        builder: ImpellerDisplayListBuilder,
1041        bounds: *const ImpellerRect,
1042        paint: ImpellerPaint,
1043        backdrop: ImpellerImageFilter,
1044    );
1045    #[doc = " @brief      Pops the last entry pushed onto the save stack using a call to\n             `ImpellerDisplayListBuilderSave` or\n             `ImpellerDisplayListBuilderSaveLayer`.\n\n @param[in]  builder  The builder.\n"]
1046    pub fn ImpellerDisplayListBuilderRestore(builder: ImpellerDisplayListBuilder);
1047    #[doc = " @brief      Apply a scale to the transformation matrix currently on top of\n             the save stack.\n\n @param[in]  builder  The builder.\n @param[in]  x_scale  The x scale.\n @param[in]  y_scale  The y scale.\n"]
1048    pub fn ImpellerDisplayListBuilderScale(
1049        builder: ImpellerDisplayListBuilder,
1050        x_scale: f32,
1051        y_scale: f32,
1052    );
1053    #[doc = " @brief      Apply a clockwise rotation to the transformation matrix\n             currently on top of the save stack.\n\n @param[in]  builder        The builder.\n @param[in]  angle_degrees  The angle in degrees.\n"]
1054    pub fn ImpellerDisplayListBuilderRotate(
1055        builder: ImpellerDisplayListBuilder,
1056        angle_degrees: f32,
1057    );
1058    #[doc = " @brief      Apply a translation to the transformation matrix currently on\n             top of the save stack.\n\n @param[in]  builder        The builder.\n @param[in]  x_translation  The x translation.\n @param[in]  y_translation  The y translation.\n"]
1059    pub fn ImpellerDisplayListBuilderTranslate(
1060        builder: ImpellerDisplayListBuilder,
1061        x_translation: f32,
1062        y_translation: f32,
1063    );
1064    #[doc = " @brief      Appends the the provided transformation to the transformation\n             already on the save stack.\n\n @param[in]  builder    The builder.\n @param[in]  transform  The transform to append.\n"]
1065    pub fn ImpellerDisplayListBuilderTransform(
1066        builder: ImpellerDisplayListBuilder,
1067        transform: *const ImpellerMatrix,
1068    );
1069    #[doc = " @brief      Clear the transformation on top of the save stack and replace it\n             with a new value.\n\n @param[in]  builder    The builder.\n @param[in]  transform  The new transform.\n"]
1070    pub fn ImpellerDisplayListBuilderSetTransform(
1071        builder: ImpellerDisplayListBuilder,
1072        transform: *const ImpellerMatrix,
1073    );
1074    #[doc = " @brief      Get the transformation currently built up on the top of the\n             transformation stack.\n\n @param[in]  builder        The builder.\n @param[out] out_transform  The transform.\n"]
1075    pub fn ImpellerDisplayListBuilderGetTransform(
1076        builder: ImpellerDisplayListBuilder,
1077        out_transform: *mut ImpellerMatrix,
1078    );
1079    #[doc = " @brief      Reset the transformation on top of the transformation stack to\n             identity.\n\n @param[in]  builder  The builder.\n"]
1080    pub fn ImpellerDisplayListBuilderResetTransform(builder: ImpellerDisplayListBuilder);
1081    #[doc = " @brief      Get the current size of the save stack.\n\n @param[in]  builder  The builder.\n\n @return     The save stack size.\n"]
1082    pub fn ImpellerDisplayListBuilderGetSaveCount(builder: ImpellerDisplayListBuilder) -> u32;
1083    #[doc = " @brief      Effectively calls ImpellerDisplayListBuilderRestore till the\n             size of the save stack becomes a specified count.\n\n @param[in]  builder  The builder.\n @param[in]  count    The count.\n"]
1084    pub fn ImpellerDisplayListBuilderRestoreToCount(
1085        builder: ImpellerDisplayListBuilder,
1086        count: u32,
1087    );
1088    #[doc = " @brief      Reduces the clip region to the intersection of the current clip\n             and the given rectangle taking into account the clip operation.\n\n @param[in]  builder  The builder.\n @param[in]  rect     The rectangle.\n @param[in]  op       The operation.\n"]
1089    pub fn ImpellerDisplayListBuilderClipRect(
1090        builder: ImpellerDisplayListBuilder,
1091        rect: *const ImpellerRect,
1092        op: ClipOperation,
1093    );
1094    #[doc = " @brief      Reduces the clip region to the intersection of the current clip\n             and the given oval taking into account the clip operation.\n\n @param[in]  builder      The builder.\n @param[in]  oval_bounds  The oval bounds.\n @param[in]  op           The operation.\n"]
1095    pub fn ImpellerDisplayListBuilderClipOval(
1096        builder: ImpellerDisplayListBuilder,
1097        oval_bounds: *const ImpellerRect,
1098        op: ClipOperation,
1099    );
1100    #[doc = " @brief      Reduces the clip region to the intersection of the current clip\n             and the given rounded rectangle taking into account the clip\n             operation.\n\n @param[in]  builder  The builder.\n @param[in]  rect     The rectangle.\n @param[in]  radii    The radii.\n @param[in]  op       The operation.\n"]
1101    pub fn ImpellerDisplayListBuilderClipRoundedRect(
1102        builder: ImpellerDisplayListBuilder,
1103        rect: *const ImpellerRect,
1104        radii: *const ImpellerRoundingRadii,
1105        op: ClipOperation,
1106    );
1107    #[doc = " @brief      Reduces the clip region to the intersection of the current clip\n             and the given path taking into account the clip operation.\n\n @param[in]  builder  The builder.\n @param[in]  path     The path.\n @param[in]  op       The operation.\n"]
1108    pub fn ImpellerDisplayListBuilderClipPath(
1109        builder: ImpellerDisplayListBuilder,
1110        path: ImpellerPath,
1111        op: ClipOperation,
1112    );
1113    #[doc = " @brief      Fills the current clip with the specified paint.\n\n @param[in]  builder  The builder.\n @param[in]  paint    The paint.\n"]
1114    pub fn ImpellerDisplayListBuilderDrawPaint(
1115        builder: ImpellerDisplayListBuilder,
1116        paint: ImpellerPaint,
1117    );
1118    #[doc = " @brief      Draws a line segment.\n\n @param[in]  builder  The builder.\n @param[in]  from     The starting point of the line.\n @param[in]  to       The end point of the line.\n @param[in]  paint    The paint.\n"]
1119    pub fn ImpellerDisplayListBuilderDrawLine(
1120        builder: ImpellerDisplayListBuilder,
1121        from: *const ImpellerPoint,
1122        to: *const ImpellerPoint,
1123        paint: ImpellerPaint,
1124    );
1125    #[doc = " @brief      Draws a dash line segment.\n\n @param[in]  builder     The builder.\n @param[in]  from        The starting point of the line.\n @param[in]  to          The end point of the line.\n @param[in]  on_length   On length.\n @param[in]  off_length  Off length.\n @param[in]  paint       The paint.\n"]
1126    pub fn ImpellerDisplayListBuilderDrawDashedLine(
1127        builder: ImpellerDisplayListBuilder,
1128        from: *const ImpellerPoint,
1129        to: *const ImpellerPoint,
1130        on_length: f32,
1131        off_length: f32,
1132        paint: ImpellerPaint,
1133    );
1134    #[doc = " @brief      Draws a rectangle.\n\n @param[in]  builder  The builder.\n @param[in]  rect     The rectangle.\n @param[in]  paint    The paint.\n"]
1135    pub fn ImpellerDisplayListBuilderDrawRect(
1136        builder: ImpellerDisplayListBuilder,
1137        rect: *const ImpellerRect,
1138        paint: ImpellerPaint,
1139    );
1140    #[doc = " @brief      Draws an oval.\n\n @param[in]  builder      The builder.\n @param[in]  oval_bounds  The oval bounds.\n @param[in]  paint        The paint.\n"]
1141    pub fn ImpellerDisplayListBuilderDrawOval(
1142        builder: ImpellerDisplayListBuilder,
1143        oval_bounds: *const ImpellerRect,
1144        paint: ImpellerPaint,
1145    );
1146    #[doc = " @brief      Draws a rounded rect.\n\n @param[in]  builder  The builder.\n @param[in]  rect     The rectangle.\n @param[in]  radii    The radii.\n @param[in]  paint    The paint.\n"]
1147    pub fn ImpellerDisplayListBuilderDrawRoundedRect(
1148        builder: ImpellerDisplayListBuilder,
1149        rect: *const ImpellerRect,
1150        radii: *const ImpellerRoundingRadii,
1151        paint: ImpellerPaint,
1152    );
1153    #[doc = " @brief      Draws a shape that is the different between the specified\n             rectangles (each with configurable corner radii).\n\n @param[in]  builder      The builder.\n @param[in]  outer_rect   The outer rectangle.\n @param[in]  outer_radii  The outer radii.\n @param[in]  inner_rect   The inner rectangle.\n @param[in]  inner_radii  The inner radii.\n @param[in]  paint        The paint.\n"]
1154    pub fn ImpellerDisplayListBuilderDrawRoundedRectDifference(
1155        builder: ImpellerDisplayListBuilder,
1156        outer_rect: *const ImpellerRect,
1157        outer_radii: *const ImpellerRoundingRadii,
1158        inner_rect: *const ImpellerRect,
1159        inner_radii: *const ImpellerRoundingRadii,
1160        paint: ImpellerPaint,
1161    );
1162    #[doc = " @brief      Draws the specified shape.\n\n @param[in]  builder  The builder.\n @param[in]  path     The path.\n @param[in]  paint    The paint.\n"]
1163    pub fn ImpellerDisplayListBuilderDrawPath(
1164        builder: ImpellerDisplayListBuilder,
1165        path: ImpellerPath,
1166        paint: ImpellerPaint,
1167    );
1168    #[doc = " @brief      Flattens the contents of another display list into the one\n             currently being built.\n\n @param[in]  builder       The builder.\n @param[in]  display_list  The display list.\n @param[in]  opacity       The opacity.\n"]
1169    pub fn ImpellerDisplayListBuilderDrawDisplayList(
1170        builder: ImpellerDisplayListBuilder,
1171        display_list: ImpellerDisplayList,
1172        opacity: f32,
1173    );
1174    #[doc = " @brief      Draw a paragraph at the specified point.\n\n @param[in]  builder    The builder.\n @param[in]  paragraph  The paragraph.\n @param[in]  point      The point.\n"]
1175    pub fn ImpellerDisplayListBuilderDrawParagraph(
1176        builder: ImpellerDisplayListBuilder,
1177        paragraph: ImpellerParagraph,
1178        point: *const ImpellerPoint,
1179    );
1180    #[doc = " @brief      Draw a texture at the specified point.\n\n @param[in]  builder   The builder.\n @param[in]  texture   The texture.\n @param[in]  point     The point.\n @param[in]  sampling  The sampling.\n @param[in]  paint     The paint.\n"]
1181    pub fn ImpellerDisplayListBuilderDrawTexture(
1182        builder: ImpellerDisplayListBuilder,
1183        texture: ImpellerTexture,
1184        point: *const ImpellerPoint,
1185        sampling: TextureSampling,
1186        paint: ImpellerPaint,
1187    );
1188    #[doc = " @brief      Draw a portion of texture at the specified location.\n\n @param[in]  builder   The builder.\n @param[in]  texture   The texture.\n @param[in]  src_rect  The source rectangle.\n @param[in]  dst_rect  The destination rectangle.\n @param[in]  sampling  The sampling.\n @param[in]  paint     The paint.\n"]
1189    pub fn ImpellerDisplayListBuilderDrawTextureRect(
1190        builder: ImpellerDisplayListBuilder,
1191        texture: ImpellerTexture,
1192        src_rect: *const ImpellerRect,
1193        dst_rect: *const ImpellerRect,
1194        sampling: TextureSampling,
1195        paint: ImpellerPaint,
1196    );
1197    #[doc = " @brief      Create a new typography contents.\n\n @return     The typography context.\n"]
1198    pub fn ImpellerTypographyContextNew() -> ImpellerTypographyContext;
1199    #[doc = " @brief      Retain a strong reference to the object. The object can be NULL\n             in which case this method is a no-op.\n\n @param[in]  context  The typography context.\n"]
1200    pub fn ImpellerTypographyContextRetain(context: ImpellerTypographyContext);
1201    #[doc = " @brief      Release a previously retained reference to the object. The\n             object can be NULL in which case this method is a no-op.\n\n @param[in]  context  The typography context.\n"]
1202    pub fn ImpellerTypographyContextRelease(context: ImpellerTypographyContext);
1203    #[doc = " @brief      Register a custom font.\n\n             The following font formats are supported:\n             * OpenType font collections (.ttc extension)\n             * TrueType fonts: (.ttf extension)\n             * OpenType fonts: (.otf extension)\n\n @warning    Web Open Font Formats (.woff and .woff2 extensions) are **not**\n             supported.\n\n             The font data is specified as a mapping. It is possible for the\n             release callback of the mapping to not be called even past the\n             destruction of the typography context. Care must be taken to not\n             collect the mapping till the release callback is invoked by\n             Impeller.\n\n             The family alias name can be NULL. In such cases, the font\n             family specified in paragraph styles must match the family that\n             is specified in the font data.\n\n             If the family name alias is not NULL, that family name must be\n             used in the paragraph style to reference glyphs from this font\n             instead of the one encoded in the font itself.\n\n             Multiple fonts (with glyphs for different styles) can be\n             specified with the same family.\n\n @see        `ImpellerParagraphStyleSetFontFamily`\n\n @param[in]  context                        The context.\n @param[in]  contents                       The contents.\n @param[in]  contents_on_release_user_data  The user data baton to be passed\n                                            to the contents release callback.\n @param[in]  family_name_alias              The family name alias or NULL if\n                                            the one specified in the font\n                                            data is to be used.\n\n @return     If the font could be successfully registered.\n"]
1204    pub fn ImpellerTypographyContextRegisterFont(
1205        context: ImpellerTypographyContext,
1206        contents: *const ImpellerMapping,
1207        contents_on_release_user_data: *mut ::std::os::raw::c_void,
1208        family_name_alias: *const ::std::os::raw::c_char,
1209    ) -> bool;
1210    #[doc = " @brief      Create a new paragraph style.\n\n @return     The paragraph style.\n"]
1211    pub fn ImpellerParagraphStyleNew() -> ImpellerParagraphStyle;
1212    #[doc = " @brief      Retain a strong reference to the object. The object can be NULL\n             in which case this method is a no-op.\n\n @param[in]  paragraph_style  The paragraph style.\n"]
1213    pub fn ImpellerParagraphStyleRetain(paragraph_style: ImpellerParagraphStyle);
1214    #[doc = " @brief      Release a previously retained reference to the object. The\n             object can be NULL in which case this method is a no-op.\n\n @param[in]  paragraph_style  The paragraph style.\n"]
1215    pub fn ImpellerParagraphStyleRelease(paragraph_style: ImpellerParagraphStyle);
1216    #[doc = " @brief      Set the paint used to render the text glyph contents.\n\n @param[in]  paragraph_style  The paragraph style.\n @param[in]  paint            The paint.\n"]
1217    pub fn ImpellerParagraphStyleSetForeground(
1218        paragraph_style: ImpellerParagraphStyle,
1219        paint: ImpellerPaint,
1220    );
1221    #[doc = " @brief      Set the paint used to render the background of the text glyphs.\n\n @param[in]  paragraph_style  The paragraph style.\n @param[in]  paint            The paint.\n"]
1222    pub fn ImpellerParagraphStyleSetBackground(
1223        paragraph_style: ImpellerParagraphStyle,
1224        paint: ImpellerPaint,
1225    );
1226    #[doc = " @brief      Set the weight of the font to select when rendering glyphs.\n\n @param[in]  paragraph_style  The paragraph style.\n @param[in]  weight           The weight.\n"]
1227    pub fn ImpellerParagraphStyleSetFontWeight(
1228        paragraph_style: ImpellerParagraphStyle,
1229        weight: FontWeight,
1230    );
1231    #[doc = " @brief      Set whether the glyphs should be bolded or italicized.\n\n @param[in]  paragraph_style  The paragraph style.\n @param[in]  style            The style.\n"]
1232    pub fn ImpellerParagraphStyleSetFontStyle(
1233        paragraph_style: ImpellerParagraphStyle,
1234        style: FontStyle,
1235    );
1236    #[doc = " @brief      Set the font family.\n\n @param[in]  paragraph_style  The paragraph style.\n @param[in]  family_name      The family name.\n"]
1237    pub fn ImpellerParagraphStyleSetFontFamily(
1238        paragraph_style: ImpellerParagraphStyle,
1239        family_name: *const ::std::os::raw::c_char,
1240    );
1241    #[doc = " @brief      Set the font size.\n\n @param[in]  paragraph_style  The paragraph style.\n @param[in]  size             The size.\n"]
1242    pub fn ImpellerParagraphStyleSetFontSize(paragraph_style: ImpellerParagraphStyle, size: f32);
1243    #[doc = " @brief      The height of the text as a multiple of text size.\n\n             When height is 0.0, the line height will be determined by the\n             font's metrics directly, which may differ from the font size.\n             Otherwise the line height of the text will be a multiple of font\n             size, and be exactly fontSize * height logical pixels tall.\n\n @param[in]  paragraph_style  The paragraph style.\n @param[in]  height           The height.\n"]
1244    pub fn ImpellerParagraphStyleSetHeight(paragraph_style: ImpellerParagraphStyle, height: f32);
1245    #[doc = " @brief      Set the alignment of text within the paragraph.\n\n @param[in]  paragraph_style  The paragraph style.\n @param[in]  align            The align.\n"]
1246    pub fn ImpellerParagraphStyleSetTextAlignment(
1247        paragraph_style: ImpellerParagraphStyle,
1248        align: TextAlignment,
1249    );
1250    #[doc = " @brief      Set the directionality of the text within the paragraph.\n\n @param[in]  paragraph_style  The paragraph style.\n @param[in]  direction        The direction.\n"]
1251    pub fn ImpellerParagraphStyleSetTextDirection(
1252        paragraph_style: ImpellerParagraphStyle,
1253        direction: TextDirection,
1254    );
1255    #[doc = " @brief      Set the maximum line count within the paragraph.\n\n @param[in]  paragraph_style  The paragraph style.\n @param[in]  max_lines        The maximum lines.\n"]
1256    pub fn ImpellerParagraphStyleSetMaxLines(
1257        paragraph_style: ImpellerParagraphStyle,
1258        max_lines: u32,
1259    );
1260    #[doc = " @brief      Set the paragraph locale.\n\n @param[in]  paragraph_style  The paragraph style.\n @param[in]  locale           The locale.\n"]
1261    pub fn ImpellerParagraphStyleSetLocale(
1262        paragraph_style: ImpellerParagraphStyle,
1263        locale: *const ::std::os::raw::c_char,
1264    );
1265    #[doc = " @brief      Create a new paragraph builder.\n\n @param[in]  context  The context.\n\n @return     The paragraph builder.\n"]
1266    pub fn ImpellerParagraphBuilderNew(
1267        context: ImpellerTypographyContext,
1268    ) -> ImpellerParagraphBuilder;
1269    #[doc = " @brief      Retain a strong reference to the object. The object can be NULL\n             in which case this method is a no-op.\n\n @param[in]  paragraph_builder  The paragraph builder.\n"]
1270    pub fn ImpellerParagraphBuilderRetain(paragraph_builder: ImpellerParagraphBuilder);
1271    #[doc = " @brief      Release a previously retained reference to the object. The\n             object can be NULL in which case this method is a no-op.\n\n @param[in]  paragraph_builder  The paragraph_builder.\n"]
1272    pub fn ImpellerParagraphBuilderRelease(paragraph_builder: ImpellerParagraphBuilder);
1273    #[doc = " @brief      Push a new paragraph style onto the paragraph style stack\n             managed by the paragraph builder.\n\n             Not all paragraph styles can be combined. For instance, it does\n             not make sense to mix text alignment for different text runs\n             within a paragraph. In such cases, the preference of the the\n             first paragraph style on the style stack will take hold.\n\n             If text is pushed onto the paragraph builder without a style\n             previously pushed onto the stack, a default paragraph text style\n             will be used. This may not always be desirable because some\n             style element cannot be overridden. It is recommended that a\n             default paragraph style always be pushed onto the stack before\n             the addition of any text.\n\n @param[in]  paragraph_builder  The paragraph builder.\n @param[in]  style              The style.\n"]
1274    pub fn ImpellerParagraphBuilderPushStyle(
1275        paragraph_builder: ImpellerParagraphBuilder,
1276        style: ImpellerParagraphStyle,
1277    );
1278    #[doc = " @brief      Pop a previously pushed paragraph style from the paragraph style\n             stack.\n\n @param[in]  paragraph_builder  The paragraph builder.\n"]
1279    pub fn ImpellerParagraphBuilderPopStyle(paragraph_builder: ImpellerParagraphBuilder);
1280    #[doc = " @brief      Add UTF-8 encoded text to the paragraph. The text will be styled\n             according to the paragraph style already on top of the paragraph\n             style stack.\n\n @param[in]  paragraph_builder  The paragraph builder.\n @param[in]  data               The data.\n @param[in]  length             The length.\n"]
1281    pub fn ImpellerParagraphBuilderAddText(
1282        paragraph_builder: ImpellerParagraphBuilder,
1283        data: *const u8,
1284        length: u32,
1285    );
1286    #[doc = " @brief      Layout and build a new paragraph using the specified width. The\n             resulting paragraph is immutable. The paragraph builder must be\n             discarded and a new one created to build more paragraphs.\n\n @param[in]  paragraph_builder  The paragraph builder.\n @param[in]  width              The paragraph width.\n\n @return     The paragraph if one can be created, NULL otherwise.\n"]
1287    pub fn ImpellerParagraphBuilderBuildParagraphNew(
1288        paragraph_builder: ImpellerParagraphBuilder,
1289        width: f32,
1290    ) -> ImpellerParagraph;
1291    #[doc = " @brief      Retain a strong reference to the object. The object can be NULL\n             in which case this method is a no-op.\n\n @param[in]  paragraph  The paragraph.\n"]
1292    pub fn ImpellerParagraphRetain(paragraph: ImpellerParagraph);
1293    #[doc = " @brief      Release a previously retained reference to the object. The\n             object can be NULL in which case this method is a no-op.\n\n @param[in]  paragraph  The paragraph.\n"]
1294    pub fn ImpellerParagraphRelease(paragraph: ImpellerParagraph);
1295    #[doc = " @see        `ImpellerParagraphGetMinIntrinsicWidth`\n\n @param[in]  paragraph  The paragraph.\n\n\n @return     The width provided to the paragraph builder during the call to\n             layout. This is the maximum width any line in the laid out\n             paragraph can occupy. But, it is not necessarily the actual\n             width of the paragraph after layout.\n"]
1296    pub fn ImpellerParagraphGetMaxWidth(paragraph: ImpellerParagraph) -> f32;
1297    #[doc = " @param[in]  paragraph  The paragraph.\n\n @return     The height of the laid out paragraph. This is **not** a tight\n             bounding box and some glyphs may not reach the minimum location\n             they are allowed to reach.\n"]
1298    pub fn ImpellerParagraphGetHeight(paragraph: ImpellerParagraph) -> f32;
1299    #[doc = " @param[in]  paragraph  The paragraph.\n\n @return     The length of the longest line in the paragraph. This is the\n             horizontal distance between the left edge of the leftmost glyph\n             and the right edge of the rightmost glyph, in the longest line\n             in the paragraph.\n"]
1300    pub fn ImpellerParagraphGetLongestLineWidth(paragraph: ImpellerParagraph) -> f32;
1301    #[doc = " @see        `ImpellerParagraphGetMaxWidth`\n\n @param[in]  paragraph  The paragraph.\n\n @return     The actual width of the longest line in the paragraph after\n             layout. This is expected to be less than or equal to\n             `ImpellerParagraphGetMaxWidth`.\n"]
1302    pub fn ImpellerParagraphGetMinIntrinsicWidth(paragraph: ImpellerParagraph) -> f32;
1303    #[doc = " @param[in]  paragraph  The paragraph.\n\n @return     The width of the paragraph without line breaking.\n"]
1304    pub fn ImpellerParagraphGetMaxIntrinsicWidth(paragraph: ImpellerParagraph) -> f32;
1305    #[doc = " @param[in]  paragraph  The paragraph.\n\n @return     The distance from the top of the paragraph to the ideographic\n             baseline of the first line when using ideographic fonts\n             (Japanese, Korean, etc...).\n"]
1306    pub fn ImpellerParagraphGetIdeographicBaseline(paragraph: ImpellerParagraph) -> f32;
1307    #[doc = " @param[in]  paragraph  The paragraph.\n\n @return     The distance from the top of the paragraph to the alphabetic\n             baseline of the first line when using alphabetic fonts (A-Z,\n             a-z, Greek, etc...).\n"]
1308    pub fn ImpellerParagraphGetAlphabeticBaseline(paragraph: ImpellerParagraph) -> f32;
1309    #[doc = " @param[in]  paragraph  The paragraph.\n\n @return     The number of lines visible in the paragraph after line\n             breaking.\n"]
1310    pub fn ImpellerParagraphGetLineCount(paragraph: ImpellerParagraph) -> u32;
1311}