Skip to main content

gsk4/auto/
enums.rs

1// This file was generated by gir (https://github.com/gtk-rs/gir)
2// from gir-files (https://github.com/gtk-rs/gir-files)
3// DO NOT EDIT
4
5use crate::ffi;
6use glib::{prelude::*, translate::*};
7
8///  for more information
9/// on blending and blend modes.
10#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
11#[non_exhaustive]
12#[doc(alias = "GskBlendMode")]
13pub enum BlendMode {
14    /// The default blend mode, which specifies no blending
15    #[doc(alias = "GSK_BLEND_MODE_DEFAULT")]
16    Default,
17    /// The source color is multiplied by the destination
18    ///   and replaces the destination
19    #[doc(alias = "GSK_BLEND_MODE_MULTIPLY")]
20    Multiply,
21    /// Multiplies the complements of the destination and source
22    ///   color values, then complements the result.
23    #[doc(alias = "GSK_BLEND_MODE_SCREEN")]
24    Screen,
25    /// Multiplies or screens the colors, depending on the
26    ///   destination color value. This is the inverse of hard-list
27    #[doc(alias = "GSK_BLEND_MODE_OVERLAY")]
28    Overlay,
29    /// Selects the darker of the destination and source colors
30    #[doc(alias = "GSK_BLEND_MODE_DARKEN")]
31    Darken,
32    /// Selects the lighter of the destination and source colors
33    #[doc(alias = "GSK_BLEND_MODE_LIGHTEN")]
34    Lighten,
35    /// Brightens the destination color to reflect the source color
36    #[doc(alias = "GSK_BLEND_MODE_COLOR_DODGE")]
37    ColorDodge,
38    /// Darkens the destination color to reflect the source color
39    #[doc(alias = "GSK_BLEND_MODE_COLOR_BURN")]
40    ColorBurn,
41    /// Multiplies or screens the colors, depending on the source color value
42    #[doc(alias = "GSK_BLEND_MODE_HARD_LIGHT")]
43    HardLight,
44    /// Darkens or lightens the colors, depending on the source color value
45    #[doc(alias = "GSK_BLEND_MODE_SOFT_LIGHT")]
46    SoftLight,
47    /// Subtracts the darker of the two constituent colors from the lighter color
48    #[doc(alias = "GSK_BLEND_MODE_DIFFERENCE")]
49    Difference,
50    /// Produces an effect similar to that of the difference mode but lower in contrast
51    #[doc(alias = "GSK_BLEND_MODE_EXCLUSION")]
52    Exclusion,
53    /// Creates a color with the hue and saturation of the source color and the luminosity of the destination color
54    #[doc(alias = "GSK_BLEND_MODE_COLOR")]
55    Color,
56    /// Creates a color with the hue of the source color and the saturation and luminosity of the destination color
57    #[doc(alias = "GSK_BLEND_MODE_HUE")]
58    Hue,
59    /// Creates a color with the saturation of the source color and the hue and luminosity of the destination color
60    #[doc(alias = "GSK_BLEND_MODE_SATURATION")]
61    Saturation,
62    /// Creates a color with the luminosity of the source color and the hue and saturation of the destination color
63    #[doc(alias = "GSK_BLEND_MODE_LUMINOSITY")]
64    Luminosity,
65    #[doc(hidden)]
66    __Unknown(i32),
67}
68
69#[doc(hidden)]
70impl IntoGlib for BlendMode {
71    type GlibType = ffi::GskBlendMode;
72
73    fn into_glib(self) -> ffi::GskBlendMode {
74        match self {
75            Self::Default => ffi::GSK_BLEND_MODE_DEFAULT,
76            Self::Multiply => ffi::GSK_BLEND_MODE_MULTIPLY,
77            Self::Screen => ffi::GSK_BLEND_MODE_SCREEN,
78            Self::Overlay => ffi::GSK_BLEND_MODE_OVERLAY,
79            Self::Darken => ffi::GSK_BLEND_MODE_DARKEN,
80            Self::Lighten => ffi::GSK_BLEND_MODE_LIGHTEN,
81            Self::ColorDodge => ffi::GSK_BLEND_MODE_COLOR_DODGE,
82            Self::ColorBurn => ffi::GSK_BLEND_MODE_COLOR_BURN,
83            Self::HardLight => ffi::GSK_BLEND_MODE_HARD_LIGHT,
84            Self::SoftLight => ffi::GSK_BLEND_MODE_SOFT_LIGHT,
85            Self::Difference => ffi::GSK_BLEND_MODE_DIFFERENCE,
86            Self::Exclusion => ffi::GSK_BLEND_MODE_EXCLUSION,
87            Self::Color => ffi::GSK_BLEND_MODE_COLOR,
88            Self::Hue => ffi::GSK_BLEND_MODE_HUE,
89            Self::Saturation => ffi::GSK_BLEND_MODE_SATURATION,
90            Self::Luminosity => ffi::GSK_BLEND_MODE_LUMINOSITY,
91            Self::__Unknown(value) => value,
92        }
93    }
94}
95
96#[doc(hidden)]
97impl FromGlib<ffi::GskBlendMode> for BlendMode {
98    unsafe fn from_glib(value: ffi::GskBlendMode) -> Self {
99        skip_assert_initialized!();
100
101        match value {
102            ffi::GSK_BLEND_MODE_DEFAULT => Self::Default,
103            ffi::GSK_BLEND_MODE_MULTIPLY => Self::Multiply,
104            ffi::GSK_BLEND_MODE_SCREEN => Self::Screen,
105            ffi::GSK_BLEND_MODE_OVERLAY => Self::Overlay,
106            ffi::GSK_BLEND_MODE_DARKEN => Self::Darken,
107            ffi::GSK_BLEND_MODE_LIGHTEN => Self::Lighten,
108            ffi::GSK_BLEND_MODE_COLOR_DODGE => Self::ColorDodge,
109            ffi::GSK_BLEND_MODE_COLOR_BURN => Self::ColorBurn,
110            ffi::GSK_BLEND_MODE_HARD_LIGHT => Self::HardLight,
111            ffi::GSK_BLEND_MODE_SOFT_LIGHT => Self::SoftLight,
112            ffi::GSK_BLEND_MODE_DIFFERENCE => Self::Difference,
113            ffi::GSK_BLEND_MODE_EXCLUSION => Self::Exclusion,
114            ffi::GSK_BLEND_MODE_COLOR => Self::Color,
115            ffi::GSK_BLEND_MODE_HUE => Self::Hue,
116            ffi::GSK_BLEND_MODE_SATURATION => Self::Saturation,
117            ffi::GSK_BLEND_MODE_LUMINOSITY => Self::Luminosity,
118            value => Self::__Unknown(value),
119        }
120    }
121}
122
123impl StaticType for BlendMode {
124    #[inline]
125    #[doc(alias = "gsk_blend_mode_get_type")]
126    fn static_type() -> glib::Type {
127        unsafe { from_glib(ffi::gsk_blend_mode_get_type()) }
128    }
129}
130
131impl glib::HasParamSpec for BlendMode {
132    type ParamSpec = glib::ParamSpecEnum;
133    type SetValue = Self;
134    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
135
136    fn param_spec_builder() -> Self::BuilderFn {
137        Self::ParamSpec::builder_with_default
138    }
139}
140
141impl glib::value::ValueType for BlendMode {
142    type Type = Self;
143}
144
145unsafe impl<'a> glib::value::FromValue<'a> for BlendMode {
146    type Checker = glib::value::GenericValueTypeChecker<Self>;
147
148    #[inline]
149    unsafe fn from_value(value: &'a glib::Value) -> Self {
150        skip_assert_initialized!();
151        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
152    }
153}
154
155impl ToValue for BlendMode {
156    #[inline]
157    fn to_value(&self) -> glib::Value {
158        let mut value = glib::Value::for_value_type::<Self>();
159        unsafe {
160            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
161        }
162        value
163    }
164
165    #[inline]
166    fn value_type(&self) -> glib::Type {
167        Self::static_type()
168    }
169}
170
171impl From<BlendMode> for glib::Value {
172    #[inline]
173    fn from(v: BlendMode) -> Self {
174        skip_assert_initialized!();
175        ToValue::to_value(&v)
176    }
177}
178
179/// The corner indices used by [`RoundedRect`][crate::RoundedRect].
180#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
181#[non_exhaustive]
182#[doc(alias = "GskCorner")]
183pub enum Corner {
184    /// The top left corner
185    #[doc(alias = "GSK_CORNER_TOP_LEFT")]
186    TopLeft,
187    /// The top right corner
188    #[doc(alias = "GSK_CORNER_TOP_RIGHT")]
189    TopRight,
190    /// The bottom right corner
191    #[doc(alias = "GSK_CORNER_BOTTOM_RIGHT")]
192    BottomRight,
193    /// The bottom left corner
194    #[doc(alias = "GSK_CORNER_BOTTOM_LEFT")]
195    BottomLeft,
196    #[doc(hidden)]
197    __Unknown(i32),
198}
199
200#[doc(hidden)]
201impl IntoGlib for Corner {
202    type GlibType = ffi::GskCorner;
203
204    #[inline]
205    fn into_glib(self) -> ffi::GskCorner {
206        match self {
207            Self::TopLeft => ffi::GSK_CORNER_TOP_LEFT,
208            Self::TopRight => ffi::GSK_CORNER_TOP_RIGHT,
209            Self::BottomRight => ffi::GSK_CORNER_BOTTOM_RIGHT,
210            Self::BottomLeft => ffi::GSK_CORNER_BOTTOM_LEFT,
211            Self::__Unknown(value) => value,
212        }
213    }
214}
215
216#[doc(hidden)]
217impl FromGlib<ffi::GskCorner> for Corner {
218    #[inline]
219    unsafe fn from_glib(value: ffi::GskCorner) -> Self {
220        skip_assert_initialized!();
221
222        match value {
223            ffi::GSK_CORNER_TOP_LEFT => Self::TopLeft,
224            ffi::GSK_CORNER_TOP_RIGHT => Self::TopRight,
225            ffi::GSK_CORNER_BOTTOM_RIGHT => Self::BottomRight,
226            ffi::GSK_CORNER_BOTTOM_LEFT => Self::BottomLeft,
227            value => Self::__Unknown(value),
228        }
229    }
230}
231
232impl StaticType for Corner {
233    #[inline]
234    #[doc(alias = "gsk_corner_get_type")]
235    fn static_type() -> glib::Type {
236        unsafe { from_glib(ffi::gsk_corner_get_type()) }
237    }
238}
239
240impl glib::HasParamSpec for Corner {
241    type ParamSpec = glib::ParamSpecEnum;
242    type SetValue = Self;
243    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
244
245    fn param_spec_builder() -> Self::BuilderFn {
246        Self::ParamSpec::builder_with_default
247    }
248}
249
250impl glib::value::ValueType for Corner {
251    type Type = Self;
252}
253
254unsafe impl<'a> glib::value::FromValue<'a> for Corner {
255    type Checker = glib::value::GenericValueTypeChecker<Self>;
256
257    #[inline]
258    unsafe fn from_value(value: &'a glib::Value) -> Self {
259        skip_assert_initialized!();
260        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
261    }
262}
263
264impl ToValue for Corner {
265    #[inline]
266    fn to_value(&self) -> glib::Value {
267        let mut value = glib::Value::for_value_type::<Self>();
268        unsafe {
269            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
270        }
271        value
272    }
273
274    #[inline]
275    fn value_type(&self) -> glib::Type {
276        Self::static_type()
277    }
278}
279
280impl From<Corner> for glib::Value {
281    #[inline]
282    fn from(v: Corner) -> Self {
283        skip_assert_initialized!();
284        ToValue::to_value(&v)
285    }
286}
287
288/// Specifies how paths are filled.
289///
290/// Whether or not a point is included in the fill is determined by taking
291/// a ray from that point to infinity and looking at intersections with the
292/// path. The ray can be in any direction, as long as it doesn't pass through
293/// the end point of a segment or have a tricky intersection such as
294/// intersecting tangent to the path.
295///
296/// (Note that filling is not actually implemented in this way. This
297/// is just a description of the rule that is applied.)
298///
299/// New entries may be added in future versions.
300#[cfg(feature = "v4_14")]
301#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
302#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
303#[non_exhaustive]
304#[doc(alias = "GskFillRule")]
305pub enum FillRule {
306    /// If the path crosses the ray from
307    ///   left-to-right, counts +1. If the path crosses the ray
308    ///   from right to left, counts -1. (Left and right are determined
309    ///   from the perspective of looking along the ray from the starting
310    ///   point.) If the total count is non-zero, the point will be filled.
311    #[doc(alias = "GSK_FILL_RULE_WINDING")]
312    Winding,
313    /// Counts the total number of
314    ///   intersections, without regard to the orientation of the contour. If
315    ///   the total number of intersections is odd, the point will be
316    ///   filled.
317    #[doc(alias = "GSK_FILL_RULE_EVEN_ODD")]
318    EvenOdd,
319    #[doc(hidden)]
320    __Unknown(i32),
321}
322
323#[cfg(feature = "v4_14")]
324#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
325#[doc(hidden)]
326impl IntoGlib for FillRule {
327    type GlibType = ffi::GskFillRule;
328
329    #[inline]
330    fn into_glib(self) -> ffi::GskFillRule {
331        match self {
332            Self::Winding => ffi::GSK_FILL_RULE_WINDING,
333            Self::EvenOdd => ffi::GSK_FILL_RULE_EVEN_ODD,
334            Self::__Unknown(value) => value,
335        }
336    }
337}
338
339#[cfg(feature = "v4_14")]
340#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
341#[doc(hidden)]
342impl FromGlib<ffi::GskFillRule> for FillRule {
343    #[inline]
344    unsafe fn from_glib(value: ffi::GskFillRule) -> Self {
345        skip_assert_initialized!();
346
347        match value {
348            ffi::GSK_FILL_RULE_WINDING => Self::Winding,
349            ffi::GSK_FILL_RULE_EVEN_ODD => Self::EvenOdd,
350            value => Self::__Unknown(value),
351        }
352    }
353}
354
355#[cfg(feature = "v4_14")]
356#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
357impl StaticType for FillRule {
358    #[inline]
359    #[doc(alias = "gsk_fill_rule_get_type")]
360    fn static_type() -> glib::Type {
361        unsafe { from_glib(ffi::gsk_fill_rule_get_type()) }
362    }
363}
364
365#[cfg(feature = "v4_14")]
366#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
367impl glib::HasParamSpec for FillRule {
368    type ParamSpec = glib::ParamSpecEnum;
369    type SetValue = Self;
370    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
371
372    fn param_spec_builder() -> Self::BuilderFn {
373        Self::ParamSpec::builder_with_default
374    }
375}
376
377#[cfg(feature = "v4_14")]
378#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
379impl glib::value::ValueType for FillRule {
380    type Type = Self;
381}
382
383#[cfg(feature = "v4_14")]
384#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
385unsafe impl<'a> glib::value::FromValue<'a> for FillRule {
386    type Checker = glib::value::GenericValueTypeChecker<Self>;
387
388    #[inline]
389    unsafe fn from_value(value: &'a glib::Value) -> Self {
390        skip_assert_initialized!();
391        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
392    }
393}
394
395#[cfg(feature = "v4_14")]
396#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
397impl ToValue for FillRule {
398    #[inline]
399    fn to_value(&self) -> glib::Value {
400        let mut value = glib::Value::for_value_type::<Self>();
401        unsafe {
402            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
403        }
404        value
405    }
406
407    #[inline]
408    fn value_type(&self) -> glib::Type {
409        Self::static_type()
410    }
411}
412
413#[cfg(feature = "v4_14")]
414#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
415impl From<FillRule> for glib::Value {
416    #[inline]
417    fn from(v: FillRule) -> Self {
418        skip_assert_initialized!();
419        ToValue::to_value(&v)
420    }
421}
422
423/// Defines the types of the uniforms that `GskGLShaders` declare.
424///
425/// It defines both what the type is called in the GLSL shader
426/// code, and what the corresponding C type is on the Gtk side.
427///
428/// # Deprecated since 4.16
429///
430#[cfg_attr(feature = "v4_16", deprecated = "Since 4.16")]
431#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
432#[non_exhaustive]
433#[doc(alias = "GskGLUniformType")]
434pub enum GLUniformType {
435    /// No type, used for uninitialized or unspecified values.
436    #[doc(alias = "GSK_GL_UNIFORM_TYPE_NONE")]
437    None,
438    /// A float uniform
439    #[doc(alias = "GSK_GL_UNIFORM_TYPE_FLOAT")]
440    Float,
441    /// A GLSL int / gint32 uniform
442    #[doc(alias = "GSK_GL_UNIFORM_TYPE_INT")]
443    Int,
444    /// A GLSL uint / guint32 uniform
445    #[doc(alias = "GSK_GL_UNIFORM_TYPE_UINT")]
446    Uint,
447    /// A GLSL bool / gboolean uniform
448    #[doc(alias = "GSK_GL_UNIFORM_TYPE_BOOL")]
449    Bool,
450    /// A GLSL vec2 / graphene_vec2_t uniform
451    #[doc(alias = "GSK_GL_UNIFORM_TYPE_VEC2")]
452    Vec2,
453    /// A GLSL vec3 / graphene_vec3_t uniform
454    #[doc(alias = "GSK_GL_UNIFORM_TYPE_VEC3")]
455    Vec3,
456    /// A GLSL vec4 / graphene_vec4_t uniform
457    #[doc(alias = "GSK_GL_UNIFORM_TYPE_VEC4")]
458    Vec4,
459    #[doc(hidden)]
460    __Unknown(i32),
461}
462
463#[allow(deprecated)]
464#[doc(hidden)]
465impl IntoGlib for GLUniformType {
466    type GlibType = ffi::GskGLUniformType;
467
468    #[inline]
469    fn into_glib(self) -> ffi::GskGLUniformType {
470        match self {
471            Self::None => ffi::GSK_GL_UNIFORM_TYPE_NONE,
472            Self::Float => ffi::GSK_GL_UNIFORM_TYPE_FLOAT,
473            Self::Int => ffi::GSK_GL_UNIFORM_TYPE_INT,
474            Self::Uint => ffi::GSK_GL_UNIFORM_TYPE_UINT,
475            Self::Bool => ffi::GSK_GL_UNIFORM_TYPE_BOOL,
476            Self::Vec2 => ffi::GSK_GL_UNIFORM_TYPE_VEC2,
477            Self::Vec3 => ffi::GSK_GL_UNIFORM_TYPE_VEC3,
478            Self::Vec4 => ffi::GSK_GL_UNIFORM_TYPE_VEC4,
479            Self::__Unknown(value) => value,
480        }
481    }
482}
483
484#[allow(deprecated)]
485#[doc(hidden)]
486impl FromGlib<ffi::GskGLUniformType> for GLUniformType {
487    #[inline]
488    unsafe fn from_glib(value: ffi::GskGLUniformType) -> Self {
489        skip_assert_initialized!();
490
491        match value {
492            ffi::GSK_GL_UNIFORM_TYPE_NONE => Self::None,
493            ffi::GSK_GL_UNIFORM_TYPE_FLOAT => Self::Float,
494            ffi::GSK_GL_UNIFORM_TYPE_INT => Self::Int,
495            ffi::GSK_GL_UNIFORM_TYPE_UINT => Self::Uint,
496            ffi::GSK_GL_UNIFORM_TYPE_BOOL => Self::Bool,
497            ffi::GSK_GL_UNIFORM_TYPE_VEC2 => Self::Vec2,
498            ffi::GSK_GL_UNIFORM_TYPE_VEC3 => Self::Vec3,
499            ffi::GSK_GL_UNIFORM_TYPE_VEC4 => Self::Vec4,
500            value => Self::__Unknown(value),
501        }
502    }
503}
504
505#[allow(deprecated)]
506impl StaticType for GLUniformType {
507    #[inline]
508    #[doc(alias = "gsk_gl_uniform_type_get_type")]
509    fn static_type() -> glib::Type {
510        unsafe { from_glib(ffi::gsk_gl_uniform_type_get_type()) }
511    }
512}
513
514#[allow(deprecated)]
515impl glib::HasParamSpec for GLUniformType {
516    type ParamSpec = glib::ParamSpecEnum;
517    type SetValue = Self;
518    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
519
520    fn param_spec_builder() -> Self::BuilderFn {
521        Self::ParamSpec::builder_with_default
522    }
523}
524
525#[allow(deprecated)]
526impl glib::value::ValueType for GLUniformType {
527    type Type = Self;
528}
529
530#[allow(deprecated)]
531unsafe impl<'a> glib::value::FromValue<'a> for GLUniformType {
532    type Checker = glib::value::GenericValueTypeChecker<Self>;
533
534    #[inline]
535    unsafe fn from_value(value: &'a glib::Value) -> Self {
536        skip_assert_initialized!();
537        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
538    }
539}
540
541#[allow(deprecated)]
542impl ToValue for GLUniformType {
543    #[inline]
544    fn to_value(&self) -> glib::Value {
545        let mut value = glib::Value::for_value_type::<Self>();
546        unsafe {
547            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
548        }
549        value
550    }
551
552    #[inline]
553    fn value_type(&self) -> glib::Type {
554        Self::static_type()
555    }
556}
557
558#[allow(deprecated)]
559impl From<GLUniformType> for glib::Value {
560    #[inline]
561    fn from(v: GLUniformType) -> Self {
562        skip_assert_initialized!();
563        ToValue::to_value(&v)
564    }
565}
566
567/// /figure
568#[cfg(feature = "v4_14")]
569#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
570#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
571#[non_exhaustive]
572#[doc(alias = "GskLineCap")]
573pub enum LineCap {
574    /// Start and stop the line exactly at the start
575    ///   and end point
576    #[doc(alias = "GSK_LINE_CAP_BUTT")]
577    Butt,
578    /// Use a round ending, the center of the circle
579    ///   is the start or end point
580    #[doc(alias = "GSK_LINE_CAP_ROUND")]
581    Round,
582    /// use squared ending, the center of the square
583    ///   is the start or end point
584    #[doc(alias = "GSK_LINE_CAP_SQUARE")]
585    Square,
586    #[doc(hidden)]
587    __Unknown(i32),
588}
589
590#[cfg(feature = "v4_14")]
591#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
592#[doc(hidden)]
593impl IntoGlib for LineCap {
594    type GlibType = ffi::GskLineCap;
595
596    #[inline]
597    fn into_glib(self) -> ffi::GskLineCap {
598        match self {
599            Self::Butt => ffi::GSK_LINE_CAP_BUTT,
600            Self::Round => ffi::GSK_LINE_CAP_ROUND,
601            Self::Square => ffi::GSK_LINE_CAP_SQUARE,
602            Self::__Unknown(value) => value,
603        }
604    }
605}
606
607#[cfg(feature = "v4_14")]
608#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
609#[doc(hidden)]
610impl FromGlib<ffi::GskLineCap> for LineCap {
611    #[inline]
612    unsafe fn from_glib(value: ffi::GskLineCap) -> Self {
613        skip_assert_initialized!();
614
615        match value {
616            ffi::GSK_LINE_CAP_BUTT => Self::Butt,
617            ffi::GSK_LINE_CAP_ROUND => Self::Round,
618            ffi::GSK_LINE_CAP_SQUARE => Self::Square,
619            value => Self::__Unknown(value),
620        }
621    }
622}
623
624#[cfg(feature = "v4_14")]
625#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
626impl StaticType for LineCap {
627    #[inline]
628    #[doc(alias = "gsk_line_cap_get_type")]
629    fn static_type() -> glib::Type {
630        unsafe { from_glib(ffi::gsk_line_cap_get_type()) }
631    }
632}
633
634#[cfg(feature = "v4_14")]
635#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
636impl glib::HasParamSpec for LineCap {
637    type ParamSpec = glib::ParamSpecEnum;
638    type SetValue = Self;
639    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
640
641    fn param_spec_builder() -> Self::BuilderFn {
642        Self::ParamSpec::builder_with_default
643    }
644}
645
646#[cfg(feature = "v4_14")]
647#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
648impl glib::value::ValueType for LineCap {
649    type Type = Self;
650}
651
652#[cfg(feature = "v4_14")]
653#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
654unsafe impl<'a> glib::value::FromValue<'a> for LineCap {
655    type Checker = glib::value::GenericValueTypeChecker<Self>;
656
657    #[inline]
658    unsafe fn from_value(value: &'a glib::Value) -> Self {
659        skip_assert_initialized!();
660        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
661    }
662}
663
664#[cfg(feature = "v4_14")]
665#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
666impl ToValue for LineCap {
667    #[inline]
668    fn to_value(&self) -> glib::Value {
669        let mut value = glib::Value::for_value_type::<Self>();
670        unsafe {
671            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
672        }
673        value
674    }
675
676    #[inline]
677    fn value_type(&self) -> glib::Type {
678        Self::static_type()
679    }
680}
681
682#[cfg(feature = "v4_14")]
683#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
684impl From<LineCap> for glib::Value {
685    #[inline]
686    fn from(v: LineCap) -> Self {
687        skip_assert_initialized!();
688        ToValue::to_value(&v)
689    }
690}
691
692/// /figure
693#[cfg(feature = "v4_14")]
694#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
695#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
696#[non_exhaustive]
697#[doc(alias = "GskLineJoin")]
698pub enum LineJoin {
699    /// Use a sharp angled corner
700    #[doc(alias = "GSK_LINE_JOIN_MITER")]
701    Miter,
702    /// Use a round join, the center of the circle is
703    ///   the join point
704    #[doc(alias = "GSK_LINE_JOIN_ROUND")]
705    Round,
706    /// use a cut-off join, the join is cut off at half
707    ///   the line width from the joint point
708    #[doc(alias = "GSK_LINE_JOIN_BEVEL")]
709    Bevel,
710    #[doc(hidden)]
711    __Unknown(i32),
712}
713
714#[cfg(feature = "v4_14")]
715#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
716#[doc(hidden)]
717impl IntoGlib for LineJoin {
718    type GlibType = ffi::GskLineJoin;
719
720    #[inline]
721    fn into_glib(self) -> ffi::GskLineJoin {
722        match self {
723            Self::Miter => ffi::GSK_LINE_JOIN_MITER,
724            Self::Round => ffi::GSK_LINE_JOIN_ROUND,
725            Self::Bevel => ffi::GSK_LINE_JOIN_BEVEL,
726            Self::__Unknown(value) => value,
727        }
728    }
729}
730
731#[cfg(feature = "v4_14")]
732#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
733#[doc(hidden)]
734impl FromGlib<ffi::GskLineJoin> for LineJoin {
735    #[inline]
736    unsafe fn from_glib(value: ffi::GskLineJoin) -> Self {
737        skip_assert_initialized!();
738
739        match value {
740            ffi::GSK_LINE_JOIN_MITER => Self::Miter,
741            ffi::GSK_LINE_JOIN_ROUND => Self::Round,
742            ffi::GSK_LINE_JOIN_BEVEL => Self::Bevel,
743            value => Self::__Unknown(value),
744        }
745    }
746}
747
748#[cfg(feature = "v4_14")]
749#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
750impl StaticType for LineJoin {
751    #[inline]
752    #[doc(alias = "gsk_line_join_get_type")]
753    fn static_type() -> glib::Type {
754        unsafe { from_glib(ffi::gsk_line_join_get_type()) }
755    }
756}
757
758#[cfg(feature = "v4_14")]
759#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
760impl glib::HasParamSpec for LineJoin {
761    type ParamSpec = glib::ParamSpecEnum;
762    type SetValue = Self;
763    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
764
765    fn param_spec_builder() -> Self::BuilderFn {
766        Self::ParamSpec::builder_with_default
767    }
768}
769
770#[cfg(feature = "v4_14")]
771#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
772impl glib::value::ValueType for LineJoin {
773    type Type = Self;
774}
775
776#[cfg(feature = "v4_14")]
777#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
778unsafe impl<'a> glib::value::FromValue<'a> for LineJoin {
779    type Checker = glib::value::GenericValueTypeChecker<Self>;
780
781    #[inline]
782    unsafe fn from_value(value: &'a glib::Value) -> Self {
783        skip_assert_initialized!();
784        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
785    }
786}
787
788#[cfg(feature = "v4_14")]
789#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
790impl ToValue for LineJoin {
791    #[inline]
792    fn to_value(&self) -> glib::Value {
793        let mut value = glib::Value::for_value_type::<Self>();
794        unsafe {
795            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
796        }
797        value
798    }
799
800    #[inline]
801    fn value_type(&self) -> glib::Type {
802        Self::static_type()
803    }
804}
805
806#[cfg(feature = "v4_14")]
807#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
808impl From<LineJoin> for glib::Value {
809    #[inline]
810    fn from(v: LineJoin) -> Self {
811        skip_assert_initialized!();
812        ToValue::to_value(&v)
813    }
814}
815
816/// The mask modes available for mask nodes.
817#[cfg(feature = "v4_10")]
818#[cfg_attr(docsrs, doc(cfg(feature = "v4_10")))]
819#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
820#[non_exhaustive]
821#[doc(alias = "GskMaskMode")]
822pub enum MaskMode {
823    /// Use the alpha channel of the mask
824    #[doc(alias = "GSK_MASK_MODE_ALPHA")]
825    Alpha,
826    /// Use the inverted alpha channel of the mask
827    #[doc(alias = "GSK_MASK_MODE_INVERTED_ALPHA")]
828    InvertedAlpha,
829    /// Use the luminance of the mask,
830    ///     multiplied by mask alpha
831    #[doc(alias = "GSK_MASK_MODE_LUMINANCE")]
832    Luminance,
833    /// Use the inverted luminance of the mask,
834    ///     multiplied by mask alpha
835    #[doc(alias = "GSK_MASK_MODE_INVERTED_LUMINANCE")]
836    InvertedLuminance,
837    #[doc(hidden)]
838    __Unknown(i32),
839}
840
841#[cfg(feature = "v4_10")]
842#[cfg_attr(docsrs, doc(cfg(feature = "v4_10")))]
843#[doc(hidden)]
844impl IntoGlib for MaskMode {
845    type GlibType = ffi::GskMaskMode;
846
847    #[inline]
848    fn into_glib(self) -> ffi::GskMaskMode {
849        match self {
850            Self::Alpha => ffi::GSK_MASK_MODE_ALPHA,
851            Self::InvertedAlpha => ffi::GSK_MASK_MODE_INVERTED_ALPHA,
852            Self::Luminance => ffi::GSK_MASK_MODE_LUMINANCE,
853            Self::InvertedLuminance => ffi::GSK_MASK_MODE_INVERTED_LUMINANCE,
854            Self::__Unknown(value) => value,
855        }
856    }
857}
858
859#[cfg(feature = "v4_10")]
860#[cfg_attr(docsrs, doc(cfg(feature = "v4_10")))]
861#[doc(hidden)]
862impl FromGlib<ffi::GskMaskMode> for MaskMode {
863    #[inline]
864    unsafe fn from_glib(value: ffi::GskMaskMode) -> Self {
865        skip_assert_initialized!();
866
867        match value {
868            ffi::GSK_MASK_MODE_ALPHA => Self::Alpha,
869            ffi::GSK_MASK_MODE_INVERTED_ALPHA => Self::InvertedAlpha,
870            ffi::GSK_MASK_MODE_LUMINANCE => Self::Luminance,
871            ffi::GSK_MASK_MODE_INVERTED_LUMINANCE => Self::InvertedLuminance,
872            value => Self::__Unknown(value),
873        }
874    }
875}
876
877#[cfg(feature = "v4_10")]
878#[cfg_attr(docsrs, doc(cfg(feature = "v4_10")))]
879impl StaticType for MaskMode {
880    #[inline]
881    #[doc(alias = "gsk_mask_mode_get_type")]
882    fn static_type() -> glib::Type {
883        unsafe { from_glib(ffi::gsk_mask_mode_get_type()) }
884    }
885}
886
887#[cfg(feature = "v4_10")]
888#[cfg_attr(docsrs, doc(cfg(feature = "v4_10")))]
889impl glib::HasParamSpec for MaskMode {
890    type ParamSpec = glib::ParamSpecEnum;
891    type SetValue = Self;
892    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
893
894    fn param_spec_builder() -> Self::BuilderFn {
895        Self::ParamSpec::builder_with_default
896    }
897}
898
899#[cfg(feature = "v4_10")]
900#[cfg_attr(docsrs, doc(cfg(feature = "v4_10")))]
901impl glib::value::ValueType for MaskMode {
902    type Type = Self;
903}
904
905#[cfg(feature = "v4_10")]
906#[cfg_attr(docsrs, doc(cfg(feature = "v4_10")))]
907unsafe impl<'a> glib::value::FromValue<'a> for MaskMode {
908    type Checker = glib::value::GenericValueTypeChecker<Self>;
909
910    #[inline]
911    unsafe fn from_value(value: &'a glib::Value) -> Self {
912        skip_assert_initialized!();
913        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
914    }
915}
916
917#[cfg(feature = "v4_10")]
918#[cfg_attr(docsrs, doc(cfg(feature = "v4_10")))]
919impl ToValue for MaskMode {
920    #[inline]
921    fn to_value(&self) -> glib::Value {
922        let mut value = glib::Value::for_value_type::<Self>();
923        unsafe {
924            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
925        }
926        value
927    }
928
929    #[inline]
930    fn value_type(&self) -> glib::Type {
931        Self::static_type()
932    }
933}
934
935#[cfg(feature = "v4_10")]
936#[cfg_attr(docsrs, doc(cfg(feature = "v4_10")))]
937impl From<MaskMode> for glib::Value {
938    #[inline]
939    fn from(v: MaskMode) -> Self {
940        skip_assert_initialized!();
941        ToValue::to_value(&v)
942    }
943}
944
945/// /picture
946#[cfg(feature = "v4_14")]
947#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
948#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
949#[non_exhaustive]
950#[doc(alias = "GskPathDirection")]
951pub enum PathDirection {
952    /// The tangent in path direction of the incoming side
953    ///   of the path
954    #[doc(alias = "GSK_PATH_FROM_START")]
955    FromStart,
956    /// The tangent against path direction of the incoming side
957    ///   of the path
958    #[doc(alias = "GSK_PATH_TO_START")]
959    ToStart,
960    /// The tangent in path direction of the outgoing side
961    ///   of the path
962    #[doc(alias = "GSK_PATH_TO_END")]
963    ToEnd,
964    /// The tangent against path direction of the outgoing
965    ///   side of the path
966    #[doc(alias = "GSK_PATH_FROM_END")]
967    FromEnd,
968    #[doc(hidden)]
969    __Unknown(i32),
970}
971
972#[cfg(feature = "v4_14")]
973#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
974#[doc(hidden)]
975impl IntoGlib for PathDirection {
976    type GlibType = ffi::GskPathDirection;
977
978    #[inline]
979    fn into_glib(self) -> ffi::GskPathDirection {
980        match self {
981            Self::FromStart => ffi::GSK_PATH_FROM_START,
982            Self::ToStart => ffi::GSK_PATH_TO_START,
983            Self::ToEnd => ffi::GSK_PATH_TO_END,
984            Self::FromEnd => ffi::GSK_PATH_FROM_END,
985            Self::__Unknown(value) => value,
986        }
987    }
988}
989
990#[cfg(feature = "v4_14")]
991#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
992#[doc(hidden)]
993impl FromGlib<ffi::GskPathDirection> for PathDirection {
994    #[inline]
995    unsafe fn from_glib(value: ffi::GskPathDirection) -> Self {
996        skip_assert_initialized!();
997
998        match value {
999            ffi::GSK_PATH_FROM_START => Self::FromStart,
1000            ffi::GSK_PATH_TO_START => Self::ToStart,
1001            ffi::GSK_PATH_TO_END => Self::ToEnd,
1002            ffi::GSK_PATH_FROM_END => Self::FromEnd,
1003            value => Self::__Unknown(value),
1004        }
1005    }
1006}
1007
1008#[cfg(feature = "v4_14")]
1009#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
1010impl StaticType for PathDirection {
1011    #[inline]
1012    #[doc(alias = "gsk_path_direction_get_type")]
1013    fn static_type() -> glib::Type {
1014        unsafe { from_glib(ffi::gsk_path_direction_get_type()) }
1015    }
1016}
1017
1018#[cfg(feature = "v4_14")]
1019#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
1020impl glib::HasParamSpec for PathDirection {
1021    type ParamSpec = glib::ParamSpecEnum;
1022    type SetValue = Self;
1023    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
1024
1025    fn param_spec_builder() -> Self::BuilderFn {
1026        Self::ParamSpec::builder_with_default
1027    }
1028}
1029
1030#[cfg(feature = "v4_14")]
1031#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
1032impl glib::value::ValueType for PathDirection {
1033    type Type = Self;
1034}
1035
1036#[cfg(feature = "v4_14")]
1037#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
1038unsafe impl<'a> glib::value::FromValue<'a> for PathDirection {
1039    type Checker = glib::value::GenericValueTypeChecker<Self>;
1040
1041    #[inline]
1042    unsafe fn from_value(value: &'a glib::Value) -> Self {
1043        skip_assert_initialized!();
1044        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
1045    }
1046}
1047
1048#[cfg(feature = "v4_14")]
1049#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
1050impl ToValue for PathDirection {
1051    #[inline]
1052    fn to_value(&self) -> glib::Value {
1053        let mut value = glib::Value::for_value_type::<Self>();
1054        unsafe {
1055            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
1056        }
1057        value
1058    }
1059
1060    #[inline]
1061    fn value_type(&self) -> glib::Type {
1062        Self::static_type()
1063    }
1064}
1065
1066#[cfg(feature = "v4_14")]
1067#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
1068impl From<PathDirection> for glib::Value {
1069    #[inline]
1070    fn from(v: PathDirection) -> Self {
1071        skip_assert_initialized!();
1072        ToValue::to_value(&v)
1073    }
1074}
1075
1076/// The values of this enumeration classify intersections
1077/// between paths.
1078#[cfg(feature = "v4_20")]
1079#[cfg_attr(docsrs, doc(cfg(feature = "v4_20")))]
1080#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
1081#[non_exhaustive]
1082#[doc(alias = "GskPathIntersection")]
1083pub enum PathIntersection {
1084    /// No intersection
1085    #[doc(alias = "GSK_PATH_INTERSECTION_NONE")]
1086    None,
1087    /// A normal intersection, where the two paths
1088    ///   cross each other
1089    #[doc(alias = "GSK_PATH_INTERSECTION_NORMAL")]
1090    Normal,
1091    /// The start of a segment where the two paths coincide
1092    #[doc(alias = "GSK_PATH_INTERSECTION_START")]
1093    Start,
1094    /// The end of a segment where the two paths coincide
1095    #[doc(alias = "GSK_PATH_INTERSECTION_END")]
1096    End,
1097    #[doc(hidden)]
1098    __Unknown(i32),
1099}
1100
1101#[cfg(feature = "v4_20")]
1102#[cfg_attr(docsrs, doc(cfg(feature = "v4_20")))]
1103#[doc(hidden)]
1104impl IntoGlib for PathIntersection {
1105    type GlibType = ffi::GskPathIntersection;
1106
1107    #[inline]
1108    fn into_glib(self) -> ffi::GskPathIntersection {
1109        match self {
1110            Self::None => ffi::GSK_PATH_INTERSECTION_NONE,
1111            Self::Normal => ffi::GSK_PATH_INTERSECTION_NORMAL,
1112            Self::Start => ffi::GSK_PATH_INTERSECTION_START,
1113            Self::End => ffi::GSK_PATH_INTERSECTION_END,
1114            Self::__Unknown(value) => value,
1115        }
1116    }
1117}
1118
1119#[cfg(feature = "v4_20")]
1120#[cfg_attr(docsrs, doc(cfg(feature = "v4_20")))]
1121#[doc(hidden)]
1122impl FromGlib<ffi::GskPathIntersection> for PathIntersection {
1123    #[inline]
1124    unsafe fn from_glib(value: ffi::GskPathIntersection) -> Self {
1125        skip_assert_initialized!();
1126
1127        match value {
1128            ffi::GSK_PATH_INTERSECTION_NONE => Self::None,
1129            ffi::GSK_PATH_INTERSECTION_NORMAL => Self::Normal,
1130            ffi::GSK_PATH_INTERSECTION_START => Self::Start,
1131            ffi::GSK_PATH_INTERSECTION_END => Self::End,
1132            value => Self::__Unknown(value),
1133        }
1134    }
1135}
1136
1137#[cfg(feature = "v4_20")]
1138#[cfg_attr(docsrs, doc(cfg(feature = "v4_20")))]
1139impl StaticType for PathIntersection {
1140    #[inline]
1141    #[doc(alias = "gsk_path_intersection_get_type")]
1142    fn static_type() -> glib::Type {
1143        unsafe { from_glib(ffi::gsk_path_intersection_get_type()) }
1144    }
1145}
1146
1147#[cfg(feature = "v4_20")]
1148#[cfg_attr(docsrs, doc(cfg(feature = "v4_20")))]
1149impl glib::HasParamSpec for PathIntersection {
1150    type ParamSpec = glib::ParamSpecEnum;
1151    type SetValue = Self;
1152    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
1153
1154    fn param_spec_builder() -> Self::BuilderFn {
1155        Self::ParamSpec::builder_with_default
1156    }
1157}
1158
1159#[cfg(feature = "v4_20")]
1160#[cfg_attr(docsrs, doc(cfg(feature = "v4_20")))]
1161impl glib::value::ValueType for PathIntersection {
1162    type Type = Self;
1163}
1164
1165#[cfg(feature = "v4_20")]
1166#[cfg_attr(docsrs, doc(cfg(feature = "v4_20")))]
1167unsafe impl<'a> glib::value::FromValue<'a> for PathIntersection {
1168    type Checker = glib::value::GenericValueTypeChecker<Self>;
1169
1170    #[inline]
1171    unsafe fn from_value(value: &'a glib::Value) -> Self {
1172        skip_assert_initialized!();
1173        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
1174    }
1175}
1176
1177#[cfg(feature = "v4_20")]
1178#[cfg_attr(docsrs, doc(cfg(feature = "v4_20")))]
1179impl ToValue for PathIntersection {
1180    #[inline]
1181    fn to_value(&self) -> glib::Value {
1182        let mut value = glib::Value::for_value_type::<Self>();
1183        unsafe {
1184            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
1185        }
1186        value
1187    }
1188
1189    #[inline]
1190    fn value_type(&self) -> glib::Type {
1191        Self::static_type()
1192    }
1193}
1194
1195#[cfg(feature = "v4_20")]
1196#[cfg_attr(docsrs, doc(cfg(feature = "v4_20")))]
1197impl From<PathIntersection> for glib::Value {
1198    #[inline]
1199    fn from(v: PathIntersection) -> Self {
1200        skip_assert_initialized!();
1201        ToValue::to_value(&v)
1202    }
1203}
1204
1205/// Describes the segments of a [`Path`][crate::Path].
1206///
1207/// More values may be added in the future.
1208#[cfg(feature = "v4_14")]
1209#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
1210#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
1211#[non_exhaustive]
1212#[doc(alias = "GskPathOperation")]
1213pub enum PathOperation {
1214    /// A move-to operation, with 1 point describing the target point.
1215    #[doc(alias = "GSK_PATH_MOVE")]
1216    Move,
1217    /// A close operation ending the current contour with a line back
1218    ///   to the starting point. Two points describe the start and end of the line.
1219    #[doc(alias = "GSK_PATH_CLOSE")]
1220    Close,
1221    /// A line-to operation, with 2 points describing the start and
1222    ///   end point of a straight line.
1223    #[doc(alias = "GSK_PATH_LINE")]
1224    Line,
1225    /// zier curve
1226    ///   with 3 points describing the start point, the control point and the end
1227    ///   point of the curve.
1228    #[doc(alias = "GSK_PATH_QUAD")]
1229    Quad,
1230    /// zier curve with 4
1231    ///   points describing the start point, the two control points and the end point
1232    ///   of the curve.
1233    #[doc(alias = "GSK_PATH_CUBIC")]
1234    Cubic,
1235    /// zier curve with 3 points describing
1236    ///   the start point, control point and end point of the curve. A weight for the
1237    ///   curve will be passed, too.
1238    #[doc(alias = "GSK_PATH_CONIC")]
1239    Conic,
1240    #[doc(hidden)]
1241    __Unknown(i32),
1242}
1243
1244#[cfg(feature = "v4_14")]
1245#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
1246#[doc(hidden)]
1247impl IntoGlib for PathOperation {
1248    type GlibType = ffi::GskPathOperation;
1249
1250    #[inline]
1251    fn into_glib(self) -> ffi::GskPathOperation {
1252        match self {
1253            Self::Move => ffi::GSK_PATH_MOVE,
1254            Self::Close => ffi::GSK_PATH_CLOSE,
1255            Self::Line => ffi::GSK_PATH_LINE,
1256            Self::Quad => ffi::GSK_PATH_QUAD,
1257            Self::Cubic => ffi::GSK_PATH_CUBIC,
1258            Self::Conic => ffi::GSK_PATH_CONIC,
1259            Self::__Unknown(value) => value,
1260        }
1261    }
1262}
1263
1264#[cfg(feature = "v4_14")]
1265#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
1266#[doc(hidden)]
1267impl FromGlib<ffi::GskPathOperation> for PathOperation {
1268    #[inline]
1269    unsafe fn from_glib(value: ffi::GskPathOperation) -> Self {
1270        skip_assert_initialized!();
1271
1272        match value {
1273            ffi::GSK_PATH_MOVE => Self::Move,
1274            ffi::GSK_PATH_CLOSE => Self::Close,
1275            ffi::GSK_PATH_LINE => Self::Line,
1276            ffi::GSK_PATH_QUAD => Self::Quad,
1277            ffi::GSK_PATH_CUBIC => Self::Cubic,
1278            ffi::GSK_PATH_CONIC => Self::Conic,
1279            value => Self::__Unknown(value),
1280        }
1281    }
1282}
1283
1284#[cfg(feature = "v4_14")]
1285#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
1286impl StaticType for PathOperation {
1287    #[inline]
1288    #[doc(alias = "gsk_path_operation_get_type")]
1289    fn static_type() -> glib::Type {
1290        unsafe { from_glib(ffi::gsk_path_operation_get_type()) }
1291    }
1292}
1293
1294#[cfg(feature = "v4_14")]
1295#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
1296impl glib::HasParamSpec for PathOperation {
1297    type ParamSpec = glib::ParamSpecEnum;
1298    type SetValue = Self;
1299    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
1300
1301    fn param_spec_builder() -> Self::BuilderFn {
1302        Self::ParamSpec::builder_with_default
1303    }
1304}
1305
1306#[cfg(feature = "v4_14")]
1307#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
1308impl glib::value::ValueType for PathOperation {
1309    type Type = Self;
1310}
1311
1312#[cfg(feature = "v4_14")]
1313#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
1314unsafe impl<'a> glib::value::FromValue<'a> for PathOperation {
1315    type Checker = glib::value::GenericValueTypeChecker<Self>;
1316
1317    #[inline]
1318    unsafe fn from_value(value: &'a glib::Value) -> Self {
1319        skip_assert_initialized!();
1320        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
1321    }
1322}
1323
1324#[cfg(feature = "v4_14")]
1325#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
1326impl ToValue for PathOperation {
1327    #[inline]
1328    fn to_value(&self) -> glib::Value {
1329        let mut value = glib::Value::for_value_type::<Self>();
1330        unsafe {
1331            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
1332        }
1333        value
1334    }
1335
1336    #[inline]
1337    fn value_type(&self) -> glib::Type {
1338        Self::static_type()
1339    }
1340}
1341
1342#[cfg(feature = "v4_14")]
1343#[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
1344impl From<PathOperation> for glib::Value {
1345    #[inline]
1346    fn from(v: PathOperation) -> Self {
1347        skip_assert_initialized!();
1348        ToValue::to_value(&v)
1349    }
1350}
1351
1352/// GSK_PORTER_DUFF_SOURCE:
1353/// GSK_PORTER_DUFF_DEST:
1354/// GSK_PORTER_DUFF_SOURCE_OVER_DEST:
1355/// GSK_PORTER_DUFF_DEST_OVER_SOURCE:
1356/// GSK_PORTER_DUFF_SOURCE_IN_DEST:
1357/// GSK_PORTER_DUFF_DEST_IN_SOURCE:
1358/// GSK_PORTER_DUFF_SOURCE_OUT_DEST:
1359/// GSK_PORTER_DUFF_DEST_OUT_SOURCE:
1360/// GSK_PORTER_DUFF_SOURCE_ATOP_DEST:
1361/// GSK_PORTER_DUFF_DEST_ATOP_SOURCE:
1362/// GSK_PORTER_DUFF_XOR:
1363/// GSK_PORTER_DUFF_CLEAR:
1364/// The 12 compositing modes defined by the seminal paper
1365/// by Thomas Porter and Tom Duff.
1366///
1367/// They are used in SVG, PDF and in Cairo with `cairo_operator_t`.
1368#[cfg(feature = "v4_22")]
1369#[cfg_attr(docsrs, doc(cfg(feature = "v4_22")))]
1370#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
1371#[non_exhaustive]
1372#[doc(alias = "GskPorterDuff")]
1373pub enum PorterDuff {
1374    #[doc(alias = "GSK_PORTER_DUFF_SOURCE")]
1375    Source,
1376    #[doc(alias = "GSK_PORTER_DUFF_DEST")]
1377    Dest,
1378    #[doc(alias = "GSK_PORTER_DUFF_SOURCE_OVER_DEST")]
1379    SourceOverDest,
1380    #[doc(alias = "GSK_PORTER_DUFF_DEST_OVER_SOURCE")]
1381    DestOverSource,
1382    #[doc(alias = "GSK_PORTER_DUFF_SOURCE_IN_DEST")]
1383    SourceInDest,
1384    #[doc(alias = "GSK_PORTER_DUFF_DEST_IN_SOURCE")]
1385    DestInSource,
1386    #[doc(alias = "GSK_PORTER_DUFF_SOURCE_OUT_DEST")]
1387    SourceOutDest,
1388    #[doc(alias = "GSK_PORTER_DUFF_DEST_OUT_SOURCE")]
1389    DestOutSource,
1390    #[doc(alias = "GSK_PORTER_DUFF_SOURCE_ATOP_DEST")]
1391    SourceAtopDest,
1392    #[doc(alias = "GSK_PORTER_DUFF_DEST_ATOP_SOURCE")]
1393    DestAtopSource,
1394    #[doc(alias = "GSK_PORTER_DUFF_XOR")]
1395    Xor,
1396    #[doc(alias = "GSK_PORTER_DUFF_CLEAR")]
1397    Clear,
1398    #[doc(hidden)]
1399    __Unknown(i32),
1400}
1401
1402#[cfg(feature = "v4_22")]
1403#[cfg_attr(docsrs, doc(cfg(feature = "v4_22")))]
1404#[doc(hidden)]
1405impl IntoGlib for PorterDuff {
1406    type GlibType = ffi::GskPorterDuff;
1407
1408    #[inline]
1409    fn into_glib(self) -> ffi::GskPorterDuff {
1410        match self {
1411            Self::Source => ffi::GSK_PORTER_DUFF_SOURCE,
1412            Self::Dest => ffi::GSK_PORTER_DUFF_DEST,
1413            Self::SourceOverDest => ffi::GSK_PORTER_DUFF_SOURCE_OVER_DEST,
1414            Self::DestOverSource => ffi::GSK_PORTER_DUFF_DEST_OVER_SOURCE,
1415            Self::SourceInDest => ffi::GSK_PORTER_DUFF_SOURCE_IN_DEST,
1416            Self::DestInSource => ffi::GSK_PORTER_DUFF_DEST_IN_SOURCE,
1417            Self::SourceOutDest => ffi::GSK_PORTER_DUFF_SOURCE_OUT_DEST,
1418            Self::DestOutSource => ffi::GSK_PORTER_DUFF_DEST_OUT_SOURCE,
1419            Self::SourceAtopDest => ffi::GSK_PORTER_DUFF_SOURCE_ATOP_DEST,
1420            Self::DestAtopSource => ffi::GSK_PORTER_DUFF_DEST_ATOP_SOURCE,
1421            Self::Xor => ffi::GSK_PORTER_DUFF_XOR,
1422            Self::Clear => ffi::GSK_PORTER_DUFF_CLEAR,
1423            Self::__Unknown(value) => value,
1424        }
1425    }
1426}
1427
1428#[cfg(feature = "v4_22")]
1429#[cfg_attr(docsrs, doc(cfg(feature = "v4_22")))]
1430#[doc(hidden)]
1431impl FromGlib<ffi::GskPorterDuff> for PorterDuff {
1432    #[inline]
1433    unsafe fn from_glib(value: ffi::GskPorterDuff) -> Self {
1434        skip_assert_initialized!();
1435
1436        match value {
1437            ffi::GSK_PORTER_DUFF_SOURCE => Self::Source,
1438            ffi::GSK_PORTER_DUFF_DEST => Self::Dest,
1439            ffi::GSK_PORTER_DUFF_SOURCE_OVER_DEST => Self::SourceOverDest,
1440            ffi::GSK_PORTER_DUFF_DEST_OVER_SOURCE => Self::DestOverSource,
1441            ffi::GSK_PORTER_DUFF_SOURCE_IN_DEST => Self::SourceInDest,
1442            ffi::GSK_PORTER_DUFF_DEST_IN_SOURCE => Self::DestInSource,
1443            ffi::GSK_PORTER_DUFF_SOURCE_OUT_DEST => Self::SourceOutDest,
1444            ffi::GSK_PORTER_DUFF_DEST_OUT_SOURCE => Self::DestOutSource,
1445            ffi::GSK_PORTER_DUFF_SOURCE_ATOP_DEST => Self::SourceAtopDest,
1446            ffi::GSK_PORTER_DUFF_DEST_ATOP_SOURCE => Self::DestAtopSource,
1447            ffi::GSK_PORTER_DUFF_XOR => Self::Xor,
1448            ffi::GSK_PORTER_DUFF_CLEAR => Self::Clear,
1449            value => Self::__Unknown(value),
1450        }
1451    }
1452}
1453
1454#[cfg(feature = "v4_22")]
1455#[cfg_attr(docsrs, doc(cfg(feature = "v4_22")))]
1456impl StaticType for PorterDuff {
1457    #[inline]
1458    #[doc(alias = "gsk_porter_duff_get_type")]
1459    fn static_type() -> glib::Type {
1460        unsafe { from_glib(ffi::gsk_porter_duff_get_type()) }
1461    }
1462}
1463
1464#[cfg(feature = "v4_22")]
1465#[cfg_attr(docsrs, doc(cfg(feature = "v4_22")))]
1466impl glib::HasParamSpec for PorterDuff {
1467    type ParamSpec = glib::ParamSpecEnum;
1468    type SetValue = Self;
1469    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
1470
1471    fn param_spec_builder() -> Self::BuilderFn {
1472        Self::ParamSpec::builder_with_default
1473    }
1474}
1475
1476#[cfg(feature = "v4_22")]
1477#[cfg_attr(docsrs, doc(cfg(feature = "v4_22")))]
1478impl glib::value::ValueType for PorterDuff {
1479    type Type = Self;
1480}
1481
1482#[cfg(feature = "v4_22")]
1483#[cfg_attr(docsrs, doc(cfg(feature = "v4_22")))]
1484unsafe impl<'a> glib::value::FromValue<'a> for PorterDuff {
1485    type Checker = glib::value::GenericValueTypeChecker<Self>;
1486
1487    #[inline]
1488    unsafe fn from_value(value: &'a glib::Value) -> Self {
1489        skip_assert_initialized!();
1490        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
1491    }
1492}
1493
1494#[cfg(feature = "v4_22")]
1495#[cfg_attr(docsrs, doc(cfg(feature = "v4_22")))]
1496impl ToValue for PorterDuff {
1497    #[inline]
1498    fn to_value(&self) -> glib::Value {
1499        let mut value = glib::Value::for_value_type::<Self>();
1500        unsafe {
1501            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
1502        }
1503        value
1504    }
1505
1506    #[inline]
1507    fn value_type(&self) -> glib::Type {
1508        Self::static_type()
1509    }
1510}
1511
1512#[cfg(feature = "v4_22")]
1513#[cfg_attr(docsrs, doc(cfg(feature = "v4_22")))]
1514impl From<PorterDuff> for glib::Value {
1515    #[inline]
1516    fn from(v: PorterDuff) -> Self {
1517        skip_assert_initialized!();
1518        ToValue::to_value(&v)
1519    }
1520}
1521
1522/// The type of a node determines what the node is rendering.
1523#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
1524#[non_exhaustive]
1525#[doc(alias = "GskRenderNodeType")]
1526pub enum RenderNodeType {
1527    /// Error type. No node will ever have this type.
1528    #[doc(alias = "GSK_NOT_A_RENDER_NODE")]
1529    NotARenderNode,
1530    /// A node containing a stack of children
1531    #[doc(alias = "GSK_CONTAINER_NODE")]
1532    ContainerNode,
1533    /// A node drawing a [`cairo::Surface`][crate::cairo::Surface]
1534    #[doc(alias = "GSK_CAIRO_NODE")]
1535    CairoNode,
1536    /// A node drawing a single color rectangle
1537    #[doc(alias = "GSK_COLOR_NODE")]
1538    ColorNode,
1539    /// A node drawing a linear gradient
1540    #[doc(alias = "GSK_LINEAR_GRADIENT_NODE")]
1541    LinearGradientNode,
1542    /// A node drawing a repeating linear gradient
1543    #[doc(alias = "GSK_REPEATING_LINEAR_GRADIENT_NODE")]
1544    RepeatingLinearGradientNode,
1545    /// A node drawing a radial gradient
1546    #[doc(alias = "GSK_RADIAL_GRADIENT_NODE")]
1547    RadialGradientNode,
1548    /// A node drawing a repeating radial gradient
1549    #[doc(alias = "GSK_REPEATING_RADIAL_GRADIENT_NODE")]
1550    RepeatingRadialGradientNode,
1551    /// A node drawing a conic gradient
1552    #[doc(alias = "GSK_CONIC_GRADIENT_NODE")]
1553    ConicGradientNode,
1554    /// A node stroking a border around an area
1555    #[doc(alias = "GSK_BORDER_NODE")]
1556    BorderNode,
1557    /// A node drawing a [`gdk::Texture`][crate::gdk::Texture]
1558    #[doc(alias = "GSK_TEXTURE_NODE")]
1559    TextureNode,
1560    /// A node drawing an inset shadow
1561    #[doc(alias = "GSK_INSET_SHADOW_NODE")]
1562    InsetShadowNode,
1563    /// A node drawing an outset shadow
1564    #[doc(alias = "GSK_OUTSET_SHADOW_NODE")]
1565    OutsetShadowNode,
1566    /// A node that renders its child after applying a matrix transform
1567    #[doc(alias = "GSK_TRANSFORM_NODE")]
1568    TransformNode,
1569    /// A node that changes the opacity of its child
1570    #[doc(alias = "GSK_OPACITY_NODE")]
1571    OpacityNode,
1572    /// A node that applies a color matrix to every pixel
1573    #[doc(alias = "GSK_COLOR_MATRIX_NODE")]
1574    ColorMatrixNode,
1575    /// A node that repeats the child's contents
1576    #[doc(alias = "GSK_REPEAT_NODE")]
1577    RepeatNode,
1578    /// A node that clips its child to a rectangular area
1579    #[doc(alias = "GSK_CLIP_NODE")]
1580    ClipNode,
1581    /// A node that clips its child to a rounded rectangle
1582    #[doc(alias = "GSK_ROUNDED_CLIP_NODE")]
1583    RoundedClipNode,
1584    /// A node that draws a shadow below its child
1585    #[doc(alias = "GSK_SHADOW_NODE")]
1586    ShadowNode,
1587    /// A node that blends two children together
1588    #[doc(alias = "GSK_BLEND_NODE")]
1589    BlendNode,
1590    /// A node that cross-fades between two children
1591    #[doc(alias = "GSK_CROSS_FADE_NODE")]
1592    CrossFadeNode,
1593    /// A node containing a glyph string
1594    #[doc(alias = "GSK_TEXT_NODE")]
1595    TextNode,
1596    /// A node that applies a blur
1597    #[doc(alias = "GSK_BLUR_NODE")]
1598    BlurNode,
1599    /// Debug information that does not affect the rendering
1600    #[doc(alias = "GSK_DEBUG_NODE")]
1601    DebugNode,
1602    /// A node that uses OpenGL fragment shaders to render
1603    #[doc(alias = "GSK_GL_SHADER_NODE")]
1604    GlShaderNode,
1605    /// A node drawing a [`gdk::Texture`][crate::gdk::Texture] scaled and filtered.
1606    #[cfg(feature = "v4_10")]
1607    #[cfg_attr(docsrs, doc(cfg(feature = "v4_10")))]
1608    #[doc(alias = "GSK_TEXTURE_SCALE_NODE")]
1609    TextureScaleNode,
1610    /// A node that masks one child with another.
1611    #[cfg(feature = "v4_10")]
1612    #[cfg_attr(docsrs, doc(cfg(feature = "v4_10")))]
1613    #[doc(alias = "GSK_MASK_NODE")]
1614    MaskNode,
1615    /// A node that fills a path.
1616    #[cfg(feature = "v4_14")]
1617    #[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
1618    #[doc(alias = "GSK_FILL_NODE")]
1619    FillNode,
1620    /// A node that strokes a path.
1621    #[cfg(feature = "v4_14")]
1622    #[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
1623    #[doc(alias = "GSK_STROKE_NODE")]
1624    StrokeNode,
1625    /// A node that possibly redirects part of the scene graph to a subsurface.
1626    #[cfg(feature = "v4_14")]
1627    #[cfg_attr(docsrs, doc(cfg(feature = "v4_14")))]
1628    #[doc(alias = "GSK_SUBSURFACE_NODE")]
1629    SubsurfaceNode,
1630    /// A node that applies some function to each color component.
1631    #[cfg(feature = "v4_20")]
1632    #[cfg_attr(docsrs, doc(cfg(feature = "v4_20")))]
1633    #[doc(alias = "GSK_COMPONENT_TRANSFER_NODE")]
1634    ComponentTransferNode,
1635    /// A node that copies the rendering canvas to be pasted later.
1636    #[cfg(feature = "v4_22")]
1637    #[cfg_attr(docsrs, doc(cfg(feature = "v4_22")))]
1638    #[doc(alias = "GSK_COPY_NODE")]
1639    CopyNode,
1640    /// A node that pastes a previously copied canvas.
1641    #[cfg(feature = "v4_22")]
1642    #[cfg_attr(docsrs, doc(cfg(feature = "v4_22")))]
1643    #[doc(alias = "GSK_PASTE_NODE")]
1644    PasteNode,
1645    /// A node that combines a child with the background using Porter/Duff
1646    /// operations.
1647    #[cfg(feature = "v4_22")]
1648    #[cfg_attr(docsrs, doc(cfg(feature = "v4_22")))]
1649    #[doc(alias = "GSK_COMPOSITE_NODE")]
1650    CompositeNode,
1651    /// A node that isolated content of its child from previous content.
1652    #[cfg(feature = "v4_22")]
1653    #[cfg_attr(docsrs, doc(cfg(feature = "v4_22")))]
1654    #[doc(alias = "GSK_ISOLATION_NODE")]
1655    IsolationNode,
1656    /// A node that displaces content according to some mask.
1657    #[cfg(feature = "v4_22")]
1658    #[cfg_attr(docsrs, doc(cfg(feature = "v4_22")))]
1659    #[doc(alias = "GSK_DISPLACEMENT_NODE")]
1660    DisplacementNode,
1661    /// A node that combines two child nodes in an arithmetic way.
1662    #[cfg(feature = "v4_22")]
1663    #[cfg_attr(docsrs, doc(cfg(feature = "v4_22")))]
1664    #[doc(alias = "GSK_ARITHMETIC_NODE")]
1665    ArithmeticNode,
1666    /// A node that generates a Perlin noise or fractal Brownian motion pattern.
1667    #[cfg(feature = "v4_24")]
1668    #[cfg_attr(docsrs, doc(cfg(feature = "v4_24")))]
1669    #[doc(alias = "GSK_TURBULENCE_NODE")]
1670    TurbulenceNode,
1671    #[doc(hidden)]
1672    __Unknown(i32),
1673}
1674
1675#[doc(hidden)]
1676impl IntoGlib for RenderNodeType {
1677    type GlibType = ffi::GskRenderNodeType;
1678
1679    fn into_glib(self) -> ffi::GskRenderNodeType {
1680        match self {
1681            Self::NotARenderNode => ffi::GSK_NOT_A_RENDER_NODE,
1682            Self::ContainerNode => ffi::GSK_CONTAINER_NODE,
1683            Self::CairoNode => ffi::GSK_CAIRO_NODE,
1684            Self::ColorNode => ffi::GSK_COLOR_NODE,
1685            Self::LinearGradientNode => ffi::GSK_LINEAR_GRADIENT_NODE,
1686            Self::RepeatingLinearGradientNode => ffi::GSK_REPEATING_LINEAR_GRADIENT_NODE,
1687            Self::RadialGradientNode => ffi::GSK_RADIAL_GRADIENT_NODE,
1688            Self::RepeatingRadialGradientNode => ffi::GSK_REPEATING_RADIAL_GRADIENT_NODE,
1689            Self::ConicGradientNode => ffi::GSK_CONIC_GRADIENT_NODE,
1690            Self::BorderNode => ffi::GSK_BORDER_NODE,
1691            Self::TextureNode => ffi::GSK_TEXTURE_NODE,
1692            Self::InsetShadowNode => ffi::GSK_INSET_SHADOW_NODE,
1693            Self::OutsetShadowNode => ffi::GSK_OUTSET_SHADOW_NODE,
1694            Self::TransformNode => ffi::GSK_TRANSFORM_NODE,
1695            Self::OpacityNode => ffi::GSK_OPACITY_NODE,
1696            Self::ColorMatrixNode => ffi::GSK_COLOR_MATRIX_NODE,
1697            Self::RepeatNode => ffi::GSK_REPEAT_NODE,
1698            Self::ClipNode => ffi::GSK_CLIP_NODE,
1699            Self::RoundedClipNode => ffi::GSK_ROUNDED_CLIP_NODE,
1700            Self::ShadowNode => ffi::GSK_SHADOW_NODE,
1701            Self::BlendNode => ffi::GSK_BLEND_NODE,
1702            Self::CrossFadeNode => ffi::GSK_CROSS_FADE_NODE,
1703            Self::TextNode => ffi::GSK_TEXT_NODE,
1704            Self::BlurNode => ffi::GSK_BLUR_NODE,
1705            Self::DebugNode => ffi::GSK_DEBUG_NODE,
1706            Self::GlShaderNode => ffi::GSK_GL_SHADER_NODE,
1707            #[cfg(feature = "v4_10")]
1708            Self::TextureScaleNode => ffi::GSK_TEXTURE_SCALE_NODE,
1709            #[cfg(feature = "v4_10")]
1710            Self::MaskNode => ffi::GSK_MASK_NODE,
1711            #[cfg(feature = "v4_14")]
1712            Self::FillNode => ffi::GSK_FILL_NODE,
1713            #[cfg(feature = "v4_14")]
1714            Self::StrokeNode => ffi::GSK_STROKE_NODE,
1715            #[cfg(feature = "v4_14")]
1716            Self::SubsurfaceNode => ffi::GSK_SUBSURFACE_NODE,
1717            #[cfg(feature = "v4_20")]
1718            Self::ComponentTransferNode => ffi::GSK_COMPONENT_TRANSFER_NODE,
1719            #[cfg(feature = "v4_22")]
1720            Self::CopyNode => ffi::GSK_COPY_NODE,
1721            #[cfg(feature = "v4_22")]
1722            Self::PasteNode => ffi::GSK_PASTE_NODE,
1723            #[cfg(feature = "v4_22")]
1724            Self::CompositeNode => ffi::GSK_COMPOSITE_NODE,
1725            #[cfg(feature = "v4_22")]
1726            Self::IsolationNode => ffi::GSK_ISOLATION_NODE,
1727            #[cfg(feature = "v4_22")]
1728            Self::DisplacementNode => ffi::GSK_DISPLACEMENT_NODE,
1729            #[cfg(feature = "v4_22")]
1730            Self::ArithmeticNode => ffi::GSK_ARITHMETIC_NODE,
1731            #[cfg(feature = "v4_24")]
1732            Self::TurbulenceNode => ffi::GSK_TURBULENCE_NODE,
1733            Self::__Unknown(value) => value,
1734        }
1735    }
1736}
1737
1738#[doc(hidden)]
1739impl FromGlib<ffi::GskRenderNodeType> for RenderNodeType {
1740    unsafe fn from_glib(value: ffi::GskRenderNodeType) -> Self {
1741        skip_assert_initialized!();
1742
1743        match value {
1744            ffi::GSK_NOT_A_RENDER_NODE => Self::NotARenderNode,
1745            ffi::GSK_CONTAINER_NODE => Self::ContainerNode,
1746            ffi::GSK_CAIRO_NODE => Self::CairoNode,
1747            ffi::GSK_COLOR_NODE => Self::ColorNode,
1748            ffi::GSK_LINEAR_GRADIENT_NODE => Self::LinearGradientNode,
1749            ffi::GSK_REPEATING_LINEAR_GRADIENT_NODE => Self::RepeatingLinearGradientNode,
1750            ffi::GSK_RADIAL_GRADIENT_NODE => Self::RadialGradientNode,
1751            ffi::GSK_REPEATING_RADIAL_GRADIENT_NODE => Self::RepeatingRadialGradientNode,
1752            ffi::GSK_CONIC_GRADIENT_NODE => Self::ConicGradientNode,
1753            ffi::GSK_BORDER_NODE => Self::BorderNode,
1754            ffi::GSK_TEXTURE_NODE => Self::TextureNode,
1755            ffi::GSK_INSET_SHADOW_NODE => Self::InsetShadowNode,
1756            ffi::GSK_OUTSET_SHADOW_NODE => Self::OutsetShadowNode,
1757            ffi::GSK_TRANSFORM_NODE => Self::TransformNode,
1758            ffi::GSK_OPACITY_NODE => Self::OpacityNode,
1759            ffi::GSK_COLOR_MATRIX_NODE => Self::ColorMatrixNode,
1760            ffi::GSK_REPEAT_NODE => Self::RepeatNode,
1761            ffi::GSK_CLIP_NODE => Self::ClipNode,
1762            ffi::GSK_ROUNDED_CLIP_NODE => Self::RoundedClipNode,
1763            ffi::GSK_SHADOW_NODE => Self::ShadowNode,
1764            ffi::GSK_BLEND_NODE => Self::BlendNode,
1765            ffi::GSK_CROSS_FADE_NODE => Self::CrossFadeNode,
1766            ffi::GSK_TEXT_NODE => Self::TextNode,
1767            ffi::GSK_BLUR_NODE => Self::BlurNode,
1768            ffi::GSK_DEBUG_NODE => Self::DebugNode,
1769            ffi::GSK_GL_SHADER_NODE => Self::GlShaderNode,
1770            #[cfg(feature = "v4_10")]
1771            ffi::GSK_TEXTURE_SCALE_NODE => Self::TextureScaleNode,
1772            #[cfg(feature = "v4_10")]
1773            ffi::GSK_MASK_NODE => Self::MaskNode,
1774            #[cfg(feature = "v4_14")]
1775            ffi::GSK_FILL_NODE => Self::FillNode,
1776            #[cfg(feature = "v4_14")]
1777            ffi::GSK_STROKE_NODE => Self::StrokeNode,
1778            #[cfg(feature = "v4_14")]
1779            ffi::GSK_SUBSURFACE_NODE => Self::SubsurfaceNode,
1780            #[cfg(feature = "v4_20")]
1781            ffi::GSK_COMPONENT_TRANSFER_NODE => Self::ComponentTransferNode,
1782            #[cfg(feature = "v4_22")]
1783            ffi::GSK_COPY_NODE => Self::CopyNode,
1784            #[cfg(feature = "v4_22")]
1785            ffi::GSK_PASTE_NODE => Self::PasteNode,
1786            #[cfg(feature = "v4_22")]
1787            ffi::GSK_COMPOSITE_NODE => Self::CompositeNode,
1788            #[cfg(feature = "v4_22")]
1789            ffi::GSK_ISOLATION_NODE => Self::IsolationNode,
1790            #[cfg(feature = "v4_22")]
1791            ffi::GSK_DISPLACEMENT_NODE => Self::DisplacementNode,
1792            #[cfg(feature = "v4_22")]
1793            ffi::GSK_ARITHMETIC_NODE => Self::ArithmeticNode,
1794            #[cfg(feature = "v4_24")]
1795            ffi::GSK_TURBULENCE_NODE => Self::TurbulenceNode,
1796            value => Self::__Unknown(value),
1797        }
1798    }
1799}
1800
1801impl StaticType for RenderNodeType {
1802    #[inline]
1803    #[doc(alias = "gsk_render_node_type_get_type")]
1804    fn static_type() -> glib::Type {
1805        unsafe { from_glib(ffi::gsk_render_node_type_get_type()) }
1806    }
1807}
1808
1809impl glib::HasParamSpec for RenderNodeType {
1810    type ParamSpec = glib::ParamSpecEnum;
1811    type SetValue = Self;
1812    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
1813
1814    fn param_spec_builder() -> Self::BuilderFn {
1815        Self::ParamSpec::builder_with_default
1816    }
1817}
1818
1819impl glib::value::ValueType for RenderNodeType {
1820    type Type = Self;
1821}
1822
1823unsafe impl<'a> glib::value::FromValue<'a> for RenderNodeType {
1824    type Checker = glib::value::GenericValueTypeChecker<Self>;
1825
1826    #[inline]
1827    unsafe fn from_value(value: &'a glib::Value) -> Self {
1828        skip_assert_initialized!();
1829        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
1830    }
1831}
1832
1833impl ToValue for RenderNodeType {
1834    #[inline]
1835    fn to_value(&self) -> glib::Value {
1836        let mut value = glib::Value::for_value_type::<Self>();
1837        unsafe {
1838            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
1839        }
1840        value
1841    }
1842
1843    #[inline]
1844    fn value_type(&self) -> glib::Type {
1845        Self::static_type()
1846    }
1847}
1848
1849impl From<RenderNodeType> for glib::Value {
1850    #[inline]
1851    fn from(v: RenderNodeType) -> Self {
1852        skip_assert_initialized!();
1853        ToValue::to_value(&v)
1854    }
1855}
1856
1857/// The filters used when scaling texture data.
1858///
1859/// The actual implementation of each filter is deferred to the
1860/// rendering pipeline.
1861#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
1862#[non_exhaustive]
1863#[doc(alias = "GskScalingFilter")]
1864pub enum ScalingFilter {
1865    /// linear interpolation filter
1866    #[doc(alias = "GSK_SCALING_FILTER_LINEAR")]
1867    Linear,
1868    /// nearest neighbor interpolation filter
1869    #[doc(alias = "GSK_SCALING_FILTER_NEAREST")]
1870    Nearest,
1871    /// linear interpolation along each axis,
1872    ///   plus mipmap generation, with linear interpolation along the mipmap
1873    ///   levels
1874    #[doc(alias = "GSK_SCALING_FILTER_TRILINEAR")]
1875    Trilinear,
1876    #[doc(hidden)]
1877    __Unknown(i32),
1878}
1879
1880#[doc(hidden)]
1881impl IntoGlib for ScalingFilter {
1882    type GlibType = ffi::GskScalingFilter;
1883
1884    #[inline]
1885    fn into_glib(self) -> ffi::GskScalingFilter {
1886        match self {
1887            Self::Linear => ffi::GSK_SCALING_FILTER_LINEAR,
1888            Self::Nearest => ffi::GSK_SCALING_FILTER_NEAREST,
1889            Self::Trilinear => ffi::GSK_SCALING_FILTER_TRILINEAR,
1890            Self::__Unknown(value) => value,
1891        }
1892    }
1893}
1894
1895#[doc(hidden)]
1896impl FromGlib<ffi::GskScalingFilter> for ScalingFilter {
1897    #[inline]
1898    unsafe fn from_glib(value: ffi::GskScalingFilter) -> Self {
1899        skip_assert_initialized!();
1900
1901        match value {
1902            ffi::GSK_SCALING_FILTER_LINEAR => Self::Linear,
1903            ffi::GSK_SCALING_FILTER_NEAREST => Self::Nearest,
1904            ffi::GSK_SCALING_FILTER_TRILINEAR => Self::Trilinear,
1905            value => Self::__Unknown(value),
1906        }
1907    }
1908}
1909
1910impl StaticType for ScalingFilter {
1911    #[inline]
1912    #[doc(alias = "gsk_scaling_filter_get_type")]
1913    fn static_type() -> glib::Type {
1914        unsafe { from_glib(ffi::gsk_scaling_filter_get_type()) }
1915    }
1916}
1917
1918impl glib::HasParamSpec for ScalingFilter {
1919    type ParamSpec = glib::ParamSpecEnum;
1920    type SetValue = Self;
1921    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
1922
1923    fn param_spec_builder() -> Self::BuilderFn {
1924        Self::ParamSpec::builder_with_default
1925    }
1926}
1927
1928impl glib::value::ValueType for ScalingFilter {
1929    type Type = Self;
1930}
1931
1932unsafe impl<'a> glib::value::FromValue<'a> for ScalingFilter {
1933    type Checker = glib::value::GenericValueTypeChecker<Self>;
1934
1935    #[inline]
1936    unsafe fn from_value(value: &'a glib::Value) -> Self {
1937        skip_assert_initialized!();
1938        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
1939    }
1940}
1941
1942impl ToValue for ScalingFilter {
1943    #[inline]
1944    fn to_value(&self) -> glib::Value {
1945        let mut value = glib::Value::for_value_type::<Self>();
1946        unsafe {
1947            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
1948        }
1949        value
1950    }
1951
1952    #[inline]
1953    fn value_type(&self) -> glib::Type {
1954        Self::static_type()
1955    }
1956}
1957
1958impl From<ScalingFilter> for glib::Value {
1959    #[inline]
1960    fn from(v: ScalingFilter) -> Self {
1961        skip_assert_initialized!();
1962        ToValue::to_value(&v)
1963    }
1964}
1965
1966/// Errors that can happen during (de)serialization.
1967#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
1968#[non_exhaustive]
1969#[doc(alias = "GskSerializationError")]
1970pub enum SerializationError {
1971    /// The format can not be identified
1972    #[doc(alias = "GSK_SERIALIZATION_UNSUPPORTED_FORMAT")]
1973    UnsupportedFormat,
1974    /// The version of the data is not
1975    ///   understood
1976    #[doc(alias = "GSK_SERIALIZATION_UNSUPPORTED_VERSION")]
1977    UnsupportedVersion,
1978    /// The given data may not exist in
1979    ///   a proper serialization
1980    #[doc(alias = "GSK_SERIALIZATION_INVALID_DATA")]
1981    InvalidData,
1982    #[doc(hidden)]
1983    __Unknown(i32),
1984}
1985
1986#[doc(hidden)]
1987impl IntoGlib for SerializationError {
1988    type GlibType = ffi::GskSerializationError;
1989
1990    #[inline]
1991    fn into_glib(self) -> ffi::GskSerializationError {
1992        match self {
1993            Self::UnsupportedFormat => ffi::GSK_SERIALIZATION_UNSUPPORTED_FORMAT,
1994            Self::UnsupportedVersion => ffi::GSK_SERIALIZATION_UNSUPPORTED_VERSION,
1995            Self::InvalidData => ffi::GSK_SERIALIZATION_INVALID_DATA,
1996            Self::__Unknown(value) => value,
1997        }
1998    }
1999}
2000
2001#[doc(hidden)]
2002impl FromGlib<ffi::GskSerializationError> for SerializationError {
2003    #[inline]
2004    unsafe fn from_glib(value: ffi::GskSerializationError) -> Self {
2005        skip_assert_initialized!();
2006
2007        match value {
2008            ffi::GSK_SERIALIZATION_UNSUPPORTED_FORMAT => Self::UnsupportedFormat,
2009            ffi::GSK_SERIALIZATION_UNSUPPORTED_VERSION => Self::UnsupportedVersion,
2010            ffi::GSK_SERIALIZATION_INVALID_DATA => Self::InvalidData,
2011            value => Self::__Unknown(value),
2012        }
2013    }
2014}
2015
2016impl glib::error::ErrorDomain for SerializationError {
2017    #[inline]
2018    fn domain() -> glib::Quark {
2019        skip_assert_initialized!();
2020
2021        unsafe { from_glib(ffi::gsk_serialization_error_quark()) }
2022    }
2023
2024    #[inline]
2025    fn code(self) -> i32 {
2026        self.into_glib()
2027    }
2028
2029    #[inline]
2030    #[allow(clippy::match_single_binding)]
2031    fn from(code: i32) -> Option<Self> {
2032        skip_assert_initialized!();
2033        match unsafe { from_glib(code) } {
2034            value => Some(value),
2035        }
2036    }
2037}
2038
2039impl StaticType for SerializationError {
2040    #[inline]
2041    #[doc(alias = "gsk_serialization_error_get_type")]
2042    fn static_type() -> glib::Type {
2043        unsafe { from_glib(ffi::gsk_serialization_error_get_type()) }
2044    }
2045}
2046
2047impl glib::HasParamSpec for SerializationError {
2048    type ParamSpec = glib::ParamSpecEnum;
2049    type SetValue = Self;
2050    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
2051
2052    fn param_spec_builder() -> Self::BuilderFn {
2053        Self::ParamSpec::builder_with_default
2054    }
2055}
2056
2057impl glib::value::ValueType for SerializationError {
2058    type Type = Self;
2059}
2060
2061unsafe impl<'a> glib::value::FromValue<'a> for SerializationError {
2062    type Checker = glib::value::GenericValueTypeChecker<Self>;
2063
2064    #[inline]
2065    unsafe fn from_value(value: &'a glib::Value) -> Self {
2066        skip_assert_initialized!();
2067        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
2068    }
2069}
2070
2071impl ToValue for SerializationError {
2072    #[inline]
2073    fn to_value(&self) -> glib::Value {
2074        let mut value = glib::Value::for_value_type::<Self>();
2075        unsafe {
2076            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
2077        }
2078        value
2079    }
2080
2081    #[inline]
2082    fn value_type(&self) -> glib::Type {
2083        Self::static_type()
2084    }
2085}
2086
2087impl From<SerializationError> for glib::Value {
2088    #[inline]
2089    fn from(v: SerializationError) -> Self {
2090        skip_assert_initialized!();
2091        ToValue::to_value(&v)
2092    }
2093}
2094
2095/// The sides of a rectangle as used by `GskRectSnap` or [`BorderNode`][crate::BorderNode].
2096///
2097/// This is the order used by CSS shorthand arguments.
2098#[cfg(feature = "v4_24")]
2099#[cfg_attr(docsrs, doc(cfg(feature = "v4_24")))]
2100#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
2101#[non_exhaustive]
2102#[doc(alias = "GskSide")]
2103pub enum Side {
2104    /// The top side
2105    #[doc(alias = "GSK_SIDE_TOP")]
2106    Top,
2107    /// The right side
2108    #[doc(alias = "GSK_SIDE_RIGHT")]
2109    Right,
2110    /// The bottom side
2111    #[doc(alias = "GSK_SIDE_BOTTOM")]
2112    Bottom,
2113    /// The left side
2114    #[doc(alias = "GSK_SIDE_LEFT")]
2115    Left,
2116    #[doc(hidden)]
2117    __Unknown(i32),
2118}
2119
2120#[cfg(feature = "v4_24")]
2121#[cfg_attr(docsrs, doc(cfg(feature = "v4_24")))]
2122#[doc(hidden)]
2123impl IntoGlib for Side {
2124    type GlibType = ffi::GskSide;
2125
2126    #[inline]
2127    fn into_glib(self) -> ffi::GskSide {
2128        match self {
2129            Self::Top => ffi::GSK_SIDE_TOP,
2130            Self::Right => ffi::GSK_SIDE_RIGHT,
2131            Self::Bottom => ffi::GSK_SIDE_BOTTOM,
2132            Self::Left => ffi::GSK_SIDE_LEFT,
2133            Self::__Unknown(value) => value,
2134        }
2135    }
2136}
2137
2138#[cfg(feature = "v4_24")]
2139#[cfg_attr(docsrs, doc(cfg(feature = "v4_24")))]
2140#[doc(hidden)]
2141impl FromGlib<ffi::GskSide> for Side {
2142    #[inline]
2143    unsafe fn from_glib(value: ffi::GskSide) -> Self {
2144        skip_assert_initialized!();
2145
2146        match value {
2147            ffi::GSK_SIDE_TOP => Self::Top,
2148            ffi::GSK_SIDE_RIGHT => Self::Right,
2149            ffi::GSK_SIDE_BOTTOM => Self::Bottom,
2150            ffi::GSK_SIDE_LEFT => Self::Left,
2151            value => Self::__Unknown(value),
2152        }
2153    }
2154}
2155
2156#[cfg(feature = "v4_24")]
2157#[cfg_attr(docsrs, doc(cfg(feature = "v4_24")))]
2158impl StaticType for Side {
2159    #[inline]
2160    #[doc(alias = "gsk_side_get_type")]
2161    fn static_type() -> glib::Type {
2162        unsafe { from_glib(ffi::gsk_side_get_type()) }
2163    }
2164}
2165
2166#[cfg(feature = "v4_24")]
2167#[cfg_attr(docsrs, doc(cfg(feature = "v4_24")))]
2168impl glib::HasParamSpec for Side {
2169    type ParamSpec = glib::ParamSpecEnum;
2170    type SetValue = Self;
2171    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
2172
2173    fn param_spec_builder() -> Self::BuilderFn {
2174        Self::ParamSpec::builder_with_default
2175    }
2176}
2177
2178#[cfg(feature = "v4_24")]
2179#[cfg_attr(docsrs, doc(cfg(feature = "v4_24")))]
2180impl glib::value::ValueType for Side {
2181    type Type = Self;
2182}
2183
2184#[cfg(feature = "v4_24")]
2185#[cfg_attr(docsrs, doc(cfg(feature = "v4_24")))]
2186unsafe impl<'a> glib::value::FromValue<'a> for Side {
2187    type Checker = glib::value::GenericValueTypeChecker<Self>;
2188
2189    #[inline]
2190    unsafe fn from_value(value: &'a glib::Value) -> Self {
2191        skip_assert_initialized!();
2192        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
2193    }
2194}
2195
2196#[cfg(feature = "v4_24")]
2197#[cfg_attr(docsrs, doc(cfg(feature = "v4_24")))]
2198impl ToValue for Side {
2199    #[inline]
2200    fn to_value(&self) -> glib::Value {
2201        let mut value = glib::Value::for_value_type::<Self>();
2202        unsafe {
2203            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
2204        }
2205        value
2206    }
2207
2208    #[inline]
2209    fn value_type(&self) -> glib::Type {
2210        Self::static_type()
2211    }
2212}
2213
2214#[cfg(feature = "v4_24")]
2215#[cfg_attr(docsrs, doc(cfg(feature = "v4_24")))]
2216impl From<Side> for glib::Value {
2217    #[inline]
2218    fn from(v: Side) -> Self {
2219        skip_assert_initialized!();
2220        ToValue::to_value(&v)
2221    }
2222}
2223
2224/// Specifies how a coordinate should be snapped to the pixel grid.
2225///
2226/// Note that the top and left sides of rectangles need to be snapped
2227/// in the opposite direction from the bottom and right sides to make
2228/// the rectangle grow or shrink.
2229#[cfg(feature = "v4_24")]
2230#[cfg_attr(docsrs, doc(cfg(feature = "v4_24")))]
2231#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
2232#[non_exhaustive]
2233#[doc(alias = "GskSnapDirection")]
2234pub enum SnapDirection {
2235    /// Don't snap the value
2236    #[doc(alias = "GSK_SNAP_NONE")]
2237    None,
2238    /// Use floor() to snap
2239    #[doc(alias = "GSK_SNAP_FLOOR")]
2240    Floor,
2241    /// Use ceil() to snap
2242    #[doc(alias = "GSK_SNAP_CEIL")]
2243    Ceil,
2244    /// Use round() to snap
2245    #[doc(alias = "GSK_SNAP_ROUND")]
2246    Round,
2247    #[doc(hidden)]
2248    __Unknown(i32),
2249}
2250
2251#[cfg(feature = "v4_24")]
2252#[cfg_attr(docsrs, doc(cfg(feature = "v4_24")))]
2253#[doc(hidden)]
2254impl IntoGlib for SnapDirection {
2255    type GlibType = ffi::GskSnapDirection;
2256
2257    #[inline]
2258    fn into_glib(self) -> ffi::GskSnapDirection {
2259        match self {
2260            Self::None => ffi::GSK_SNAP_NONE,
2261            Self::Floor => ffi::GSK_SNAP_FLOOR,
2262            Self::Ceil => ffi::GSK_SNAP_CEIL,
2263            Self::Round => ffi::GSK_SNAP_ROUND,
2264            Self::__Unknown(value) => value,
2265        }
2266    }
2267}
2268
2269#[cfg(feature = "v4_24")]
2270#[cfg_attr(docsrs, doc(cfg(feature = "v4_24")))]
2271#[doc(hidden)]
2272impl FromGlib<ffi::GskSnapDirection> for SnapDirection {
2273    #[inline]
2274    unsafe fn from_glib(value: ffi::GskSnapDirection) -> Self {
2275        skip_assert_initialized!();
2276
2277        match value {
2278            ffi::GSK_SNAP_NONE => Self::None,
2279            ffi::GSK_SNAP_FLOOR => Self::Floor,
2280            ffi::GSK_SNAP_CEIL => Self::Ceil,
2281            ffi::GSK_SNAP_ROUND => Self::Round,
2282            value => Self::__Unknown(value),
2283        }
2284    }
2285}
2286
2287#[cfg(feature = "v4_24")]
2288#[cfg_attr(docsrs, doc(cfg(feature = "v4_24")))]
2289impl StaticType for SnapDirection {
2290    #[inline]
2291    #[doc(alias = "gsk_snap_direction_get_type")]
2292    fn static_type() -> glib::Type {
2293        unsafe { from_glib(ffi::gsk_snap_direction_get_type()) }
2294    }
2295}
2296
2297#[cfg(feature = "v4_24")]
2298#[cfg_attr(docsrs, doc(cfg(feature = "v4_24")))]
2299impl glib::HasParamSpec for SnapDirection {
2300    type ParamSpec = glib::ParamSpecEnum;
2301    type SetValue = Self;
2302    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
2303
2304    fn param_spec_builder() -> Self::BuilderFn {
2305        Self::ParamSpec::builder_with_default
2306    }
2307}
2308
2309#[cfg(feature = "v4_24")]
2310#[cfg_attr(docsrs, doc(cfg(feature = "v4_24")))]
2311impl glib::value::ValueType for SnapDirection {
2312    type Type = Self;
2313}
2314
2315#[cfg(feature = "v4_24")]
2316#[cfg_attr(docsrs, doc(cfg(feature = "v4_24")))]
2317unsafe impl<'a> glib::value::FromValue<'a> for SnapDirection {
2318    type Checker = glib::value::GenericValueTypeChecker<Self>;
2319
2320    #[inline]
2321    unsafe fn from_value(value: &'a glib::Value) -> Self {
2322        skip_assert_initialized!();
2323        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
2324    }
2325}
2326
2327#[cfg(feature = "v4_24")]
2328#[cfg_attr(docsrs, doc(cfg(feature = "v4_24")))]
2329impl ToValue for SnapDirection {
2330    #[inline]
2331    fn to_value(&self) -> glib::Value {
2332        let mut value = glib::Value::for_value_type::<Self>();
2333        unsafe {
2334            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
2335        }
2336        value
2337    }
2338
2339    #[inline]
2340    fn value_type(&self) -> glib::Type {
2341        Self::static_type()
2342    }
2343}
2344
2345#[cfg(feature = "v4_24")]
2346#[cfg_attr(docsrs, doc(cfg(feature = "v4_24")))]
2347impl From<SnapDirection> for glib::Value {
2348    #[inline]
2349    fn from(v: SnapDirection) -> Self {
2350        skip_assert_initialized!();
2351        ToValue::to_value(&v)
2352    }
2353}
2354
2355/// = GSK_TRANSFORM_CATEGORY_2D` is the way to do this.
2356///
2357/// Also keep in mind that rounding errors may cause matrices to not
2358/// conform to their categories. Otherwise, matrix operations done via
2359/// multiplication will not worsen categories. So for the matrix
2360/// multiplication `C = A * B`, `category(C) = MIN (category(A), category(B))`.
2361#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
2362#[non_exhaustive]
2363#[doc(alias = "GskTransformCategory")]
2364pub enum TransformCategory {
2365    /// The category of the matrix has not been
2366    ///   determined.
2367    #[doc(alias = "GSK_TRANSFORM_CATEGORY_UNKNOWN")]
2368    Unknown,
2369    /// Analyzing the matrix concluded that it does
2370    ///   not fit in any other category.
2371    #[doc(alias = "GSK_TRANSFORM_CATEGORY_ANY")]
2372    Any,
2373    /// The matrix is a 3D matrix. This means that
2374    ///   the w column (the last column) has the values (0, 0, 0, 1).
2375    #[doc(alias = "GSK_TRANSFORM_CATEGORY_3D")]
2376    _3d,
2377    /// The matrix is a 2D matrix. This is equivalent
2378    ///   to graphene_matrix_is_2d() returning [`true`]. In particular, this
2379    ///   means that Cairo can deal with the matrix.
2380    #[doc(alias = "GSK_TRANSFORM_CATEGORY_2D")]
2381    _2d,
2382    /// The matrix is a combination of 2D scale
2383    ///   and 2D translation operations. In particular, this means that any
2384    ///   rectangle can be transformed exactly using this matrix.
2385    #[doc(alias = "GSK_TRANSFORM_CATEGORY_2D_AFFINE")]
2386    _2dAffine,
2387    /// The matrix is a 2D translation.
2388    #[doc(alias = "GSK_TRANSFORM_CATEGORY_2D_TRANSLATE")]
2389    _2dTranslate,
2390    /// The matrix is the identity matrix.
2391    #[doc(alias = "GSK_TRANSFORM_CATEGORY_IDENTITY")]
2392    Identity,
2393    #[doc(hidden)]
2394    __Unknown(i32),
2395}
2396
2397#[doc(hidden)]
2398impl IntoGlib for TransformCategory {
2399    type GlibType = ffi::GskTransformCategory;
2400
2401    #[inline]
2402    fn into_glib(self) -> ffi::GskTransformCategory {
2403        match self {
2404            Self::Unknown => ffi::GSK_TRANSFORM_CATEGORY_UNKNOWN,
2405            Self::Any => ffi::GSK_TRANSFORM_CATEGORY_ANY,
2406            Self::_3d => ffi::GSK_TRANSFORM_CATEGORY_3D,
2407            Self::_2d => ffi::GSK_TRANSFORM_CATEGORY_2D,
2408            Self::_2dAffine => ffi::GSK_TRANSFORM_CATEGORY_2D_AFFINE,
2409            Self::_2dTranslate => ffi::GSK_TRANSFORM_CATEGORY_2D_TRANSLATE,
2410            Self::Identity => ffi::GSK_TRANSFORM_CATEGORY_IDENTITY,
2411            Self::__Unknown(value) => value,
2412        }
2413    }
2414}
2415
2416#[doc(hidden)]
2417impl FromGlib<ffi::GskTransformCategory> for TransformCategory {
2418    #[inline]
2419    unsafe fn from_glib(value: ffi::GskTransformCategory) -> Self {
2420        skip_assert_initialized!();
2421
2422        match value {
2423            ffi::GSK_TRANSFORM_CATEGORY_UNKNOWN => Self::Unknown,
2424            ffi::GSK_TRANSFORM_CATEGORY_ANY => Self::Any,
2425            ffi::GSK_TRANSFORM_CATEGORY_3D => Self::_3d,
2426            ffi::GSK_TRANSFORM_CATEGORY_2D => Self::_2d,
2427            ffi::GSK_TRANSFORM_CATEGORY_2D_AFFINE => Self::_2dAffine,
2428            ffi::GSK_TRANSFORM_CATEGORY_2D_TRANSLATE => Self::_2dTranslate,
2429            ffi::GSK_TRANSFORM_CATEGORY_IDENTITY => Self::Identity,
2430            value => Self::__Unknown(value),
2431        }
2432    }
2433}
2434
2435impl StaticType for TransformCategory {
2436    #[inline]
2437    #[doc(alias = "gsk_transform_category_get_type")]
2438    fn static_type() -> glib::Type {
2439        unsafe { from_glib(ffi::gsk_transform_category_get_type()) }
2440    }
2441}
2442
2443impl glib::HasParamSpec for TransformCategory {
2444    type ParamSpec = glib::ParamSpecEnum;
2445    type SetValue = Self;
2446    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
2447
2448    fn param_spec_builder() -> Self::BuilderFn {
2449        Self::ParamSpec::builder_with_default
2450    }
2451}
2452
2453impl glib::value::ValueType for TransformCategory {
2454    type Type = Self;
2455}
2456
2457unsafe impl<'a> glib::value::FromValue<'a> for TransformCategory {
2458    type Checker = glib::value::GenericValueTypeChecker<Self>;
2459
2460    #[inline]
2461    unsafe fn from_value(value: &'a glib::Value) -> Self {
2462        skip_assert_initialized!();
2463        unsafe { from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0)) }
2464    }
2465}
2466
2467impl ToValue for TransformCategory {
2468    #[inline]
2469    fn to_value(&self) -> glib::Value {
2470        let mut value = glib::Value::for_value_type::<Self>();
2471        unsafe {
2472            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
2473        }
2474        value
2475    }
2476
2477    #[inline]
2478    fn value_type(&self) -> glib::Type {
2479        Self::static_type()
2480    }
2481}
2482
2483impl From<TransformCategory> for glib::Value {
2484    #[inline]
2485    fn from(v: TransformCategory) -> Self {
2486        skip_assert_initialized!();
2487        ToValue::to_value(&v)
2488    }
2489}