libnotcurses_sys/blitter/
mod.rs

1//! `NcBlitter`
2
3// functions already exported by bindgen: 4
4// ------------------------------------------
5// (#) test:  0
6// (W) wrap: 4
7// ------------------------------------------
8//W+ ncblit_bgrx
9//W+ ncblit_rgb_loose
10//W+ ncblit_rgb_packed
11//W+ ncblit_rgba
12
13mod methods;
14
15/// The blitter mode to use for rasterizing an [`NcVisual`][crate::NcVisual].
16///
17/// We never blit full blocks, but instead spaces (more efficient) with the
18/// background set to the desired foreground.
19///
20/// # Default
21/// *[`NcBlitter::Default`]*
22///
23/// # Degradation
24///
25/// There is a mechanism of graceful degradation, that works as follows:
26/// - without braille support, [`Braille`] decays to [`Sextant`].
27/// - without bitmap support, [`Pixel`] decays to [`Sextant`].
28/// - without sextant support, [`Sextant`] decays to [`Quadrant`].
29/// - without quadrant support, [`Quadrant`] decays to [`Half`].
30/// - the only viable blitters in ASCII are [`Ascii`] and [`Pixel`].
31///
32/// If you don't want this behaviour you have to set the
33/// *[`NcVisualFlag::NoDegrade`]* on [`NcVisualOptions`] or call
34/// *[`degrade(false)`]* on [`NcVisualOptionsBuilder`].
35///
36/// [`Braille`]: NcBlitter::Braille
37/// [`Pixel`]: NcBlitter::Pixel
38/// [`Ascii`]: NcBlitter::Ascii
39/// [`Half`]: NcBlitter::Half
40/// [`Quadrant`]: NcBlitter::Quadrant
41/// [`Sextant`]: NcBlitter::Sextant
42/// [`NcVisualFlag::noDegrade`]: crate::NcVisualFlag#associatedconstant.noDegrade
43/// [`NcVisualOptions`]: crate::NcVisualOptions
44/// [`degrade(false)`]: crate::NcVisualOptionsBuilder#method.degrade
45/// [`NcVisualOptionsBuilder`]: crate::NcVisualOptionsBuilder
46#[repr(u32)]
47#[non_exhaustive]
48#[derive(Clone, Copy, PartialEq, Eq)]
49pub enum NcBlitter {
50    Default = c_api::NCBLIT_DEFAULT,
51
52    /// Blitter mode using only spaces, compatible with ASCII (1x1).
53    Ascii = c_api::NCBLIT_1x1,
54
55    /// Blitter mode using halves + `Ascii` (2x1).
56    /// ▄▀
57    Half = c_api::NCBLIT_2x1,
58
59    /// Blitter mode using quadrants + `Half` (2x2).
60    /// ▗▐ ▖▀▟▌▙
61    Quadrant = c_api::NCBLIT_2x2,
62
63    /// Blitter mode using sextants + `Quadrant` (3x2).
64    /// 🬀🬁🬂🬃🬄🬅🬆🬇🬈🬉🬊🬋🬌🬍🬎🬏🬐🬑🬒🬓🬔🬕🬖🬗🬘🬙🬚🬛🬜🬝🬞🬟🬠🬡🬢🬣🬤🬥🬦🬧🬨🬩🬪🬫🬬🬭🬮🬯🬰🬱🬲🬳🬴🬵🬶🬷🬸🬹🬺🬻
65    Sextant = c_api::NCBLIT_3x2,
66
67    /// Blitter mode using braille (4x2).
68    /// ⡀⡄⡆⡇⢀⣀⣄⣆⣇⢠⣠⣤⣦⣧⢰⣰⣴⣶⣷⢸⣸⣼⣾⣿
69    Braille = c_api::NCBLIT_BRAILLE,
70
71    /// Blitter mode using Pixels/Sixels.
72    Pixel = c_api::NCBLIT_PIXEL,
73
74    /// NcBlitter mode using: four vertical levels (4x1).
75    /// █▆▄▂
76    _4x1 = c_api::NCBLIT_4x1,
77
78    /// NcBlitter mode using: eight vertical levels (8x1).
79    /// █▇▆▅▄▃▂▁
80    _8x1 = c_api::NCBLIT_8x1,
81}
82
83/// # Aliases
84impl NcBlitter {
85    pub const _1x1: NcBlitter = NcBlitter::Ascii;
86    pub const _2x1: NcBlitter = NcBlitter::Half;
87    pub const _2x2: NcBlitter = NcBlitter::Quadrant;
88    pub const _3x2: NcBlitter = NcBlitter::Sextant;
89}
90
91mod core_impls {
92    use super::{c_api, NcBlitter};
93    use core::fmt;
94
95    impl Default for NcBlitter {
96        fn default() -> Self {
97            Self::Default
98        }
99    }
100
101    impl fmt::Display for NcBlitter {
102        fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
103            use NcBlitter::*;
104            write!(
105                f,
106                "{}",
107                match self {
108                    Default => "Default",
109                    Ascii => "Ascii",
110                    Half => "Half",
111                    Quadrant => "Quadrant",
112                    Sextant => "Sextant",
113                    Braille => "Braille",
114                    Pixel => "Pixel",
115                    _4x1 => "4x1",
116                    _8x1 => "8x1",
117                }
118            )
119        }
120    }
121
122    impl fmt::Debug for NcBlitter {
123        fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
124            write!(f, "NcBlitter::{}", self)
125        }
126    }
127
128    impl From<c_api::NcBlitter_u32> for NcBlitter {
129        fn from(blitter: c_api::NcBlitter_u32) -> Self {
130            use {c_api::*, NcBlitter::*};
131            match blitter {
132                NCBLIT_DEFAULT => Default,
133                NCBLIT_1x1 => Ascii,
134                NCBLIT_2x1 => Half,
135                NCBLIT_2x2 => Quadrant,
136                NCBLIT_3x2 => Sextant,
137                NCBLIT_BRAILLE => Braille,
138                NCBLIT_PIXEL => Pixel,
139                NCBLIT_4x1 => _4x1,
140                NCBLIT_8x1 => _8x1,
141                _ => Self::default(),
142            }
143        }
144    }
145
146    impl From<NcBlitter> for c_api::NcBlitter_u32 {
147        fn from(blitter: NcBlitter) -> Self {
148            use {c_api::*, NcBlitter::*};
149            match blitter {
150                Default => NCBLIT_DEFAULT,
151                Ascii => NCBLIT_1x1,
152                Half => NCBLIT_2x1,
153                Quadrant => NCBLIT_2x2,
154                Sextant => NCBLIT_3x2,
155                Braille => NCBLIT_BRAILLE,
156                Pixel => NCBLIT_PIXEL,
157                _4x1 => NCBLIT_4x1,
158                _8x1 => NCBLIT_8x1,
159            }
160        }
161    }
162}
163
164pub(crate) mod c_api {
165    use crate::c_api::ffi;
166
167    /// The blitter mode to use for rasterizing an [`NcVisual`][crate::NcVisual].
168    ///
169    /// It's recommended to use [`NcBlitter`][crate::NcBlitter] instead.
170    ///
171    /// # Associated `c_api` constants
172    ///
173    /// - [`NCBLIT_DEFAULT`]
174    /// - [`NCBLIT_1x1`]
175    /// - [`NCBLIT_2x1`]
176    /// - [`NCBLIT_2x2`]
177    /// - [`NCBLIT_3x2`]
178    /// - [`NCBLIT_4x1`]
179    /// - [`NCBLIT_8x1`]
180    /// - [`NCBLIT_BRAILLE`]
181    /// - [`NCBLIT_PIXEL`]
182    pub type NcBlitter_u32 = ffi::ncblitter_e;
183
184    /// [`NcBlitter_u32`] mode where the blitter is automatically chosen.
185    pub const NCBLIT_DEFAULT: NcBlitter_u32 = ffi::ncblitter_e_NCBLIT_DEFAULT;
186    /// [`NcBlitter_u32`] mode using: space, compatible with ASCII.
187    pub const NCBLIT_1x1: NcBlitter_u32 = ffi::ncblitter_e_NCBLIT_1x1;
188    /// [`NcBlitter_u32`] mode using: halves + 1x1 (space).
189    /// ▄▀
190    pub const NCBLIT_2x1: NcBlitter_u32 = ffi::ncblitter_e_NCBLIT_2x1;
191    /// [`NcBlitter_u32`] mode using: quadrants + 2x1.
192    /// ▗▐ ▖▀▟▌▙
193    pub const NCBLIT_2x2: NcBlitter_u32 = ffi::ncblitter_e_NCBLIT_2x2;
194    /// [`NcBlitter_u32`] mode using: sextants.
195    /// 🬀🬁🬂🬃🬄🬅🬆🬇🬈🬉🬊🬋🬌🬍🬎🬏🬐🬑🬒🬓🬔🬕🬖🬗🬘🬙🬚🬛🬜🬝🬞🬟🬠🬡🬢🬣🬤🬥🬦🬧🬨🬩🬪🬫🬬🬭🬮🬯🬰🬱🬲🬳🬴🬵🬶🬷🬸🬹🬺🬻
196    pub const NCBLIT_3x2: NcBlitter_u32 = ffi::ncblitter_e_NCBLIT_3x2;
197    /// [`NcBlitter_u32`] mode using: four vertical levels.
198    /// █▆▄▂
199    pub const NCBLIT_4x1: NcBlitter_u32 = ffi::ncblitter_e_NCBLIT_4x1;
200    /// [`NcBlitter_u32`] mode using: eight vertical levels.
201    /// █▇▆▅▄▃▂▁
202    pub const NCBLIT_8x1: NcBlitter_u32 = ffi::ncblitter_e_NCBLIT_8x1;
203    /// [`NcBlitter_u32`] mode using: 4 rows, 2 cols (braille).
204    /// ⡀⡄⡆⡇⢀⣀⣄⣆⣇⢠⣠⣤⣦⣧⢰⣰⣴⣶⣷⢸⣸⣼⣾⣿
205    pub const NCBLIT_BRAILLE: NcBlitter_u32 = ffi::ncblitter_e_NCBLIT_BRAILLE;
206    /// Sixel/Pixel mode.
207    ///
208    /// See [Sixel in Wikipedia](https://en.wikipedia.org/wiki/Sixel).
209    pub const NCBLIT_PIXEL: NcBlitter_u32 = ffi::ncblitter_e_NCBLIT_PIXEL;
210}