use crate::ppu::palette::EmphasisFlags;
use crate::ppu::registers::Registers;
use bitflags::bitflags;
use ringbuffer::RingBuffer;
bitflags! {
#[derive(Default, PartialEq, Eq, Copy, Clone, Debug)]
pub struct PpuMaskFlags: u8 {
const GREYSCALE = 0b00000001;
const SHOW_BG_LEFTMOST = 0b00000010;
const SHOW_SPRITES_LEFTMOST = 0b00000100;
const SHOW_BG = 0b00001000;
const SHOW_SPRITES = 0b00010000;
const EMPHASIZE_RED = 0b00100000;
const EMPHASIZE_GREEN = 0b01000000;
const EMPHASIZE_BLUE = 0b10000000;
}
}
impl From<EmphasisFlags> for PpuMaskFlags {
fn from(flags: EmphasisFlags) -> Self {
let mut mask = PpuMaskFlags::empty();
if flags.contains(EmphasisFlags::EMPHASIZE_RED) {
mask.insert(PpuMaskFlags::EMPHASIZE_RED);
}
if flags.contains(EmphasisFlags::EMPHASIZE_GREEN) {
mask.insert(PpuMaskFlags::EMPHASIZE_GREEN);
}
if flags.contains(EmphasisFlags::EMPHASIZE_BLUE) {
mask.insert(PpuMaskFlags::EMPHASIZE_BLUE);
}
mask
}
}
impl From<PpuMaskFlags> for EmphasisFlags {
fn from(flags: PpuMaskFlags) -> Self {
let mut emphasis = EmphasisFlags::empty();
if flags.contains(PpuMaskFlags::EMPHASIZE_RED) {
emphasis.insert(EmphasisFlags::EMPHASIZE_RED);
}
if flags.contains(PpuMaskFlags::EMPHASIZE_GREEN) {
emphasis.insert(EmphasisFlags::EMPHASIZE_GREEN);
}
if flags.contains(PpuMaskFlags::EMPHASIZE_BLUE) {
emphasis.insert(EmphasisFlags::EMPHASIZE_BLUE);
}
emphasis
}
}
impl Registers {
pub fn show_sprites_flag(&self) -> bool {
self.show_sprites_buffer[0]
}
pub fn show_bg_flag(&self) -> bool {
self.show_bg_buffer[0]
}
pub fn rendering_enabled(&self) -> bool {
self.show_sprites_flag() || self.show_bg_flag()
}
pub fn show_sprites_leftmost_flag(&self) -> bool {
self.ppu_mask.contains(PpuMaskFlags::SHOW_SPRITES_LEFTMOST)
}
pub fn show_bg_leftmost_flag(&self) -> bool {
self.ppu_mask.contains(PpuMaskFlags::SHOW_BG_LEFTMOST)
}
pub fn update_render_toggle_buffers(&mut self) {
self.show_bg_buffer
.push(self.ppu_mask.contains(PpuMaskFlags::SHOW_BG));
self.show_sprites_buffer
.push(self.ppu_mask.contains(PpuMaskFlags::SHOW_SPRITES));
}
pub fn ppu_mask(&self) -> PpuMaskFlags {
self.ppu_mask
}
pub fn greyscale_flag(&self) -> bool {
self.ppu_mask.contains(PpuMaskFlags::GREYSCALE)
}
}