mirror of
https://github.com/transistorfet/moa.git
synced 2024-12-22 12:29:51 +00:00
Minor changes
This commit is contained in:
parent
2cc7db8bf5
commit
0ac3f48b64
@ -1,11 +1,9 @@
|
||||
|
||||
use std::mem;
|
||||
use std::sync::{Arc, Mutex};
|
||||
|
||||
use crate::host::traits::{BlitableSurface, ClockedQueue, WindowUpdater};
|
||||
use crate::Clock;
|
||||
use crate::Error;
|
||||
use crate::host::traits::{WindowUpdater, BlitableSurface, ClockedQueue};
|
||||
|
||||
|
||||
pub const MASK_COLOUR: u32 = 0xFFFFFFFF;
|
||||
|
||||
@ -18,7 +16,11 @@ pub struct Frame {
|
||||
|
||||
impl Frame {
|
||||
pub fn new(width: u32, height: u32) -> Self {
|
||||
Self { width, height, bitmap: vec![0; (width * height) as usize] }
|
||||
Self {
|
||||
width,
|
||||
height,
|
||||
bitmap: vec![0; (width * height) as usize],
|
||||
}
|
||||
}
|
||||
|
||||
pub fn new_shared(width: u32, height: u32) -> Arc<Mutex<Frame>> {
|
||||
@ -26,7 +28,6 @@ impl Frame {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
impl BlitableSurface for Frame {
|
||||
fn set_size(&mut self, width: u32, height: u32) {
|
||||
self.width = width;
|
||||
@ -36,21 +37,37 @@ impl BlitableSurface for Frame {
|
||||
|
||||
fn set_pixel(&mut self, pos_x: u32, pos_y: u32, pixel: u32) {
|
||||
match pixel {
|
||||
MASK_COLOUR => { },
|
||||
MASK_COLOUR => {}
|
||||
value if pos_x < self.width && pos_y < self.height => {
|
||||
self.bitmap[(pos_x + (pos_y * self.width)) as usize] = value;
|
||||
},
|
||||
_ => { },
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
|
||||
fn blit<B: Iterator<Item = u32>>(&mut self, pos_x: u32, pos_y: u32, mut bitmap: B, width: u32, height: u32) {
|
||||
/*
|
||||
(pos_y..(pos_y + height))
|
||||
.for_each(|y| {
|
||||
self.bitmap[(y * self.width) as usize .. (y * self.width + self.width) as usize]
|
||||
.iter_mut()
|
||||
.for_each(|pixel|
|
||||
match bitmap.next().unwrap() {
|
||||
MASK_COLOUR => {},
|
||||
value => *pixel = value,
|
||||
}
|
||||
)
|
||||
});
|
||||
*/
|
||||
|
||||
for y in pos_y..(pos_y + height) {
|
||||
for x in pos_x..(pos_x + width) {
|
||||
match bitmap.next().unwrap() {
|
||||
MASK_COLOUR => { },
|
||||
value if x < self.width && y < self.height => { self.bitmap[(x + (y * self.width)) as usize] = value; },
|
||||
_ => { },
|
||||
MASK_COLOUR => {}
|
||||
value if x < self.width && y < self.height => {
|
||||
self.bitmap[(x + (y * self.width)) as usize] = value;
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -58,9 +75,7 @@ impl BlitableSurface for Frame {
|
||||
|
||||
fn clear(&mut self, value: u32) {
|
||||
let value = if value == MASK_COLOUR { 0 } else { value };
|
||||
for i in 0..((self.width as usize) * (self.height as usize)) {
|
||||
self.bitmap[i] = value;
|
||||
}
|
||||
self.bitmap.iter_mut().for_each(|pixel| *pixel = value);
|
||||
}
|
||||
}
|
||||
|
||||
@ -106,7 +121,6 @@ impl WindowUpdater for FrameSwapper {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct FrameQueue {
|
||||
max_size: (u32, u32),
|
||||
@ -136,7 +150,8 @@ impl WindowUpdater for FrameQueue {
|
||||
}
|
||||
|
||||
fn take_frame(&mut self) -> Result<Frame, Error> {
|
||||
self.latest().map(|(_, f)| f).ok_or_else(|| Error::new("No frame available"))
|
||||
self.latest()
|
||||
.map(|(_, f)| f)
|
||||
.ok_or_else(|| Error::new("No frame available"))
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,9 +1,10 @@
|
||||
|
||||
use std::rc::Rc;
|
||||
use std::cell::{Cell, RefCell, RefMut};
|
||||
use std::rc::Rc;
|
||||
|
||||
pub trait Observable<T> {
|
||||
fn set_observer<F>(&self, f: F) where F: Fn(&T) + 'static;
|
||||
fn set_observer<F>(&self, f: F)
|
||||
where
|
||||
F: Fn(&T) + 'static;
|
||||
fn notify(&self);
|
||||
}
|
||||
|
||||
@ -16,7 +17,6 @@ type Input<T> = Signal<T>;
|
||||
#[allow(dead_code)]
|
||||
type TriState<T> = Signal<T>;
|
||||
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Signal<T: Copy>(Rc<Cell<T>>);
|
||||
|
||||
@ -34,7 +34,6 @@ impl<T: Copy> Signal<T> {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct EdgeSignal(Signal<bool>);
|
||||
|
||||
@ -54,7 +53,6 @@ impl EdgeSignal {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct ObservableSignal<T>(Rc<RefCell<(T, Option<Box<dyn Fn(&T)>>)>>);
|
||||
|
||||
@ -69,7 +67,10 @@ impl<T> ObservableSignal<T> {
|
||||
}
|
||||
|
||||
impl<T> Observable<T> for ObservableSignal<T> {
|
||||
fn set_observer<F>(&self, f: F) where F: Fn(&T) + 'static {
|
||||
fn set_observer<F>(&self, f: F)
|
||||
where
|
||||
F: Fn(&T) + 'static,
|
||||
{
|
||||
self.0.borrow_mut().1 = Some(Box::new(f));
|
||||
}
|
||||
|
||||
@ -81,7 +82,6 @@ impl<T> Observable<T> for ObservableSignal<T> {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
pub struct ObservableEdgeSignal(ObservableSignal<bool>);
|
||||
|
||||
impl ObservableEdgeSignal {
|
||||
@ -103,7 +103,10 @@ impl ObservableEdgeSignal {
|
||||
}
|
||||
|
||||
impl Observable<bool> for ObservableEdgeSignal {
|
||||
fn set_observer<F>(&self, f: F) where F: Fn(&bool) + 'static {
|
||||
fn set_observer<F>(&self, f: F)
|
||||
where
|
||||
F: Fn(&bool) + 'static,
|
||||
{
|
||||
self.0.set_observer(f)
|
||||
}
|
||||
|
||||
@ -111,5 +114,3 @@ impl Observable<bool> for ObservableEdgeSignal {
|
||||
self.0.notify()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -545,17 +545,17 @@ impl Ym7101State {
|
||||
_ => [ pixel_sprite, pixel_a, pixel_b, bg_colour ],
|
||||
};
|
||||
|
||||
for i in 0..pixels.len() {
|
||||
if pixels[i].1 != 0 || i == pixels.len() - 1 {
|
||||
let mode = if pixels[i] == (3, 14) {
|
||||
for (i, pixel) in pixels.iter().enumerate() {
|
||||
if pixel.1 != 0 || i == pixels.len() - 1 {
|
||||
let mode = if *pixel == (3, 14) {
|
||||
ColourMode::Highlight
|
||||
} else if (!priority_a && !priority_b) || pixels[i] == (3, 15) {
|
||||
} else if (!priority_a && !priority_b) || *pixel == (3, 15) {
|
||||
ColourMode::Shadow
|
||||
} else {
|
||||
ColourMode::Normal
|
||||
};
|
||||
|
||||
frame.set_pixel(x as u32, y as u32, self.get_palette_colour(pixels[i].0, pixels[i].1, mode));
|
||||
frame.set_pixel(x as u32, y as u32, self.get_palette_colour(pixel.0, pixel.1, mode));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
3
todo.txt
3
todo.txt
@ -1,4 +1,7 @@
|
||||
|
||||
* if index access always does a bounds check, you should try to convert some of the copy loops to use iterators
|
||||
instead, such as frame updating, audio copying, etc
|
||||
|
||||
* can you refactor the update timeout to put it in rust? Would that make it faster? (the tricky part is the closure)
|
||||
* re-enable sound on webassembly, see if it works (it does not. Very lagged and jittery with what sounds like repeated frames)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user