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}