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