lib.rsannotatedlib.rssource76 lines · 2.3 KB · raw
1use bincode::{Decode, Encode};
2use jgenesis_common::define_controller_inputs;
3use jgenesis_common::frontend::{FiniteF64, MappableInputs};
4use jgenesis_common::input::Player;
5use jgenesis_proc_macros::{EnumAll, EnumDisplay};
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Encode, Decode, EnumDisplay, EnumAll)]
8#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9#[cfg_attr(feature = "clap", derive(jgenesis_proc_macros::CustomValueEnum))]
10pub enum GbAspectRatio {
11    #[default]
12    SquarePixels,
13    Stretched,
14}
15
16impl GbAspectRatio {
17    #[inline]
18    #[must_use]
19    pub fn to_pixel_aspect_ratio(self) -> Option<FiniteF64> {
20        match self {
21            Self::SquarePixels => Some(FiniteF64::ONE),
22            Self::Stretched => None,
23        }
24    }
25}
26
27#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Encode, Decode, EnumDisplay, EnumAll)]
28#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
29#[cfg_attr(feature = "clap", derive(jgenesis_proc_macros::CustomValueEnum))]
30pub enum GbPalette {
31    BlackAndWhite,
32    #[default]
33    GreenTint,
34    LimeGreen,
35    Custom,
36}
37
38#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Encode, Decode, EnumDisplay, EnumAll)]
39#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
40#[cfg_attr(feature = "clap", derive(jgenesis_proc_macros::CustomValueEnum))]
41pub enum GbcColorCorrection {
42    None,
43    #[default]
44    GbcLcd,
45    GbaLcd,
46}
47
48#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Encode, Decode, EnumDisplay, EnumAll)]
49#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
50#[cfg_attr(feature = "clap", derive(jgenesis_proc_macros::CustomValueEnum))]
51pub enum GbAudioResampler {
52    LowPassNearestNeighbor,
53    #[default]
54    WindowedSinc,
55}
56
57define_controller_inputs! {
58    buttons: GameBoyButton {
59        Up -> up "Up",
60        Left -> left "Left",
61        Right -> right "Right",
62        Down -> down "Down",
63        A -> a "A",
64        B -> b "B",
65        Start -> start "Start",
66        Select -> select "Select",
67    },
68    joypad: GameBoyInputs impl with_allow_opposing_directions,
69}
70
71impl MappableInputs<GameBoyButton> for GameBoyInputs {
72    #[inline]
73    fn set_field(&mut self, button: GameBoyButton, _player: Player, pressed: bool) {
74        self.set_button(button, pressed);
75    }
76}