···
use crate::bitmap::Bitmap;
2
+
use crate::bitmap::Pixel;
3
+
use crate::bitmap::Point;
3
-
use crate::bitmap::new_bitmap;
···
pub struct RnaProcessor {
17
-
position: (usize, usize),
18
-
mark: (usize, usize),
19
-
dir: (usize, usize),
···
35
-
fn current_pixel(&self) -> (u8, u8, u8, u8) {
36
-
let r = if self.count_rgb == 0 {
36
+
fn current_pixel(&self) -> Pixel {
37
+
let (r, g, b) = if self.count_rgb == 0 {
39
-
self.total_r / self.count_rgb
41
-
let g = if self.count_rgb == 0 {
44
-
self.total_g / self.count_rgb
46
-
let b = if self.count_rgb == 0 {
49
-
self.total_b / self.count_rgb
41
+
self.total_r / self.count_rgb,
42
+
self.total_g / self.count_rgb,
43
+
self.total_b / self.count_rgb,
let a = if self.count_a == 0 {
···
98
-
fn set_pixel(&mut self, x: usize, y: usize) {
93
+
fn set_pixel(&mut self, p: Point) {
if let Some(b) = self.bitmaps.last_mut() {
100
-
b[x][y] = self.bucket.current_pixel();
95
+
*b.pixel_mut(p) = self.bucket.current_pixel();
···
} else if r == "PCCIFFP" {
self.mark = self.position;
} else if r == "PFFICCP" {
136
+
// TODO: Can I rework this to reduce casts or locals?
let x0 = self.position.0 as isize;
let y0 = self.position.1 as isize;
let x1 = self.mark.0 as isize;
···
let mut x = x0 * d + (d - c) / 2;
let mut y = x0 * d + (d - c) / 2;
152
-
self.set_pixel((x / d) as usize, (y / d) as usize);
148
+
self.set_pixel(((x / d) as usize, (y / d) as usize));
156
-
self.set_pixel(x1 as usize, y1 as usize);
152
+
self.set_pixel((x1 as usize, y1 as usize));
} else if r == "PIIPIIP" {
158
-
let (x, y) = self.position;
if let Some(b) = self.bitmaps.last_mut() {
155
+
let old = *b.pixel(self.position);
let new = self.bucket.current_pixel();
let mut to_fill = Vec::new();
to_fill.push(self.position);
164
-
while let Some((x, y)) = to_fill.pop() {
165
-
if b[x][y] == old {
159
+
while let Some(p) = to_fill.pop() {
160
+
if *b.pixel(p) == old {
161
+
*b.pixel_mut(p) = new;
to_fill.push((x - 1, y));
···
} else if r == "PCCPFFP" {
if self.bitmaps.len() < 10 {
184
-
self.bitmaps.push(new_bitmap());
181
+
self.bitmaps.push(Bitmap::new());
} else if r == "PFFPCCP" {
187
-
if self.bitmaps.len() >= 2 {
188
-
let bmp0 = self.bitmaps[self.bitmaps.len() - 1];
189
-
let mut bmp1 = self.bitmaps[self.bitmaps.len() - 2];
192
-
let (r0, b0, g0, a0) = bmp0[x][y];
193
-
let (r1, b1, g1, a1) = bmp1[x][y];
194
-
let r = r0 + (((r1 as usize) * (255 - a0 as usize) / 255) as u8);
195
-
let g = g0 + (((g1 as usize) * (255 - a0 as usize) / 255) as u8);
196
-
let b = b0 + (((b1 as usize) * (255 - a0 as usize) / 255) as u8);
197
-
let a = a0 + (((a1 as usize) * (255 - a0 as usize) / 255) as u8);
198
-
bmp1[x][y] = (r, g, b, a);
184
+
if let Some(bmp0) = self.bitmaps.pop() {
185
+
if let Some(mut bmp1) = self.bitmaps.pop() {
188
+
let (r0, b0, g0, a0) = *bmp0.pixel((x, y));
189
+
let (r1, b1, g1, a1) = *bmp1.pixel((x, y));
190
+
let r = r0 + ((r1 as usize) * (255 - a0 as usize) / 255) as u8;
191
+
let g = g0 + ((g1 as usize) * (255 - a0 as usize) / 255) as u8;
192
+
let b = b0 + ((b1 as usize) * (255 - a0 as usize) / 255) as u8;
193
+
let a = a0 + ((a1 as usize) * (255 - a0 as usize) / 255) as u8;
194
+
*bmp1.pixel_mut((x, y)) = (r, g, b, a);
197
+
self.bitmaps.push(bmp1);
201
-
self.bitmaps.pop();
} else if r == "PFFICCF" {
204
-
if self.bitmaps.len() >= 2 {
205
-
let bmp0 = self.bitmaps[self.bitmaps.len() - 1];
206
-
let mut bmp1 = self.bitmaps[self.bitmaps.len() - 2];
209
-
let (_, _, _, a0) = bmp0[x][y];
210
-
let (r1, b1, g1, a1) = bmp1[x][y];
211
-
let r = ((r1 as usize) * (a0 as usize) / 255) as u8;
212
-
let g = ((g1 as usize) * (a0 as usize) / 255) as u8;
213
-
let b = ((b1 as usize) * (a0 as usize) / 255) as u8;
214
-
let a = ((a1 as usize) * (a0 as usize) / 255) as u8;
215
-
bmp1[x][y] = (r, g, b, a);
201
+
if let Some(bmp0) = self.bitmaps.pop() {
202
+
if let Some(mut bmp1) = self.bitmaps.pop() {
205
+
let (_, _, _, a0) = *bmp0.pixel((x, y));
206
+
let (r1, b1, g1, a1) = *bmp1.pixel((x, y));
207
+
let r = ((r1 as usize) * (a0 as usize) / 255) as u8;
208
+
let g = ((g1 as usize) * (a0 as usize) / 255) as u8;
209
+
let b = ((b1 as usize) * (a0 as usize) / 255) as u8;
210
+
let a = ((a1 as usize) * (a0 as usize) / 255) as u8;
211
+
*bmp1.pixel_mut((x, y)) = (r, g, b, a);
214
+
self.bitmaps.push(bmp1);
218
-
self.bitmaps.pop();