···
use crate::bitmap::Bitmap;
-
use crate::bitmap::new_bitmap;
···
pub struct RnaProcessor {
-
position: (usize, usize),
···
-
fn current_pixel(&self) -> (u8, u8, u8, u8) {
-
let r = if self.count_rgb == 0 {
-
self.total_r / self.count_rgb
-
let g = if self.count_rgb == 0 {
-
self.total_g / self.count_rgb
-
let b = if self.count_rgb == 0 {
-
self.total_b / self.count_rgb
let a = if self.count_a == 0 {
···
-
fn set_pixel(&mut self, x: usize, y: usize) {
if let Some(b) = self.bitmaps.last_mut() {
-
b[x][y] = self.bucket.current_pixel();
···
} else if r == "PCCIFFP" {
self.mark = self.position;
} else if r == "PFFICCP" {
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;
-
self.set_pixel((x / d) as usize, (y / d) as usize);
-
self.set_pixel(x1 as usize, y1 as usize);
} else if r == "PIIPIIP" {
-
let (x, y) = self.position;
if let Some(b) = self.bitmaps.last_mut() {
let new = self.bucket.current_pixel();
let mut to_fill = Vec::new();
to_fill.push(self.position);
-
while let Some((x, y)) = to_fill.pop() {
to_fill.push((x - 1, y));
···
} else if r == "PCCPFFP" {
if self.bitmaps.len() < 10 {
-
self.bitmaps.push(new_bitmap());
} else if r == "PFFPCCP" {
-
if self.bitmaps.len() >= 2 {
-
let bmp0 = self.bitmaps[self.bitmaps.len() - 1];
-
let mut bmp1 = self.bitmaps[self.bitmaps.len() - 2];
-
let (r0, b0, g0, a0) = bmp0[x][y];
-
let (r1, b1, g1, a1) = bmp1[x][y];
-
let r = r0 + (((r1 as usize) * (255 - a0 as usize) / 255) as u8);
-
let g = g0 + (((g1 as usize) * (255 - a0 as usize) / 255) as u8);
-
let b = b0 + (((b1 as usize) * (255 - a0 as usize) / 255) as u8);
-
let a = a0 + (((a1 as usize) * (255 - a0 as usize) / 255) as u8);
-
bmp1[x][y] = (r, g, b, a);
} else if r == "PFFICCF" {
-
if self.bitmaps.len() >= 2 {
-
let bmp0 = self.bitmaps[self.bitmaps.len() - 1];
-
let mut bmp1 = self.bitmaps[self.bitmaps.len() - 2];
-
let (_, _, _, a0) = bmp0[x][y];
-
let (r1, b1, g1, a1) = bmp1[x][y];
-
let r = ((r1 as usize) * (a0 as usize) / 255) as u8;
-
let g = ((g1 as usize) * (a0 as usize) / 255) as u8;
-
let b = ((b1 as usize) * (a0 as usize) / 255) as u8;
-
let a = ((a1 as usize) * (a0 as usize) / 255) as u8;
-
bmp1[x][y] = (r, g, b, a);
···
use crate::bitmap::Bitmap;
+
use crate::bitmap::Pixel;
+
use crate::bitmap::Point;
···
pub struct RnaProcessor {
···
+
fn current_pixel(&self) -> Pixel {
+
let (r, g, b) = if self.count_rgb == 0 {
+
self.total_r / self.count_rgb,
+
self.total_g / self.count_rgb,
+
self.total_b / self.count_rgb,
let a = if self.count_a == 0 {
···
+
fn set_pixel(&mut self, p: Point) {
if let Some(b) = self.bitmaps.last_mut() {
+
*b.pixel_mut(p) = self.bucket.current_pixel();
···
} else if r == "PCCIFFP" {
self.mark = self.position;
} else if r == "PFFICCP" {
+
// 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;
+
self.set_pixel(((x / d) as usize, (y / d) as usize));
+
self.set_pixel((x1 as usize, y1 as usize));
} else if r == "PIIPIIP" {
if let Some(b) = self.bitmaps.last_mut() {
+
let old = *b.pixel(self.position);
let new = self.bucket.current_pixel();
let mut to_fill = Vec::new();
to_fill.push(self.position);
+
while let Some(p) = to_fill.pop() {
+
if *b.pixel(p) == old {
to_fill.push((x - 1, y));
···
} else if r == "PCCPFFP" {
if self.bitmaps.len() < 10 {
+
self.bitmaps.push(Bitmap::new());
} else if r == "PFFPCCP" {
+
if let Some(bmp0) = self.bitmaps.pop() {
+
if let Some(mut bmp1) = self.bitmaps.pop() {
+
let (r0, b0, g0, a0) = *bmp0.pixel((x, y));
+
let (r1, b1, g1, a1) = *bmp1.pixel((x, y));
+
let r = r0 + ((r1 as usize) * (255 - a0 as usize) / 255) as u8;
+
let g = g0 + ((g1 as usize) * (255 - a0 as usize) / 255) as u8;
+
let b = b0 + ((b1 as usize) * (255 - a0 as usize) / 255) as u8;
+
let a = a0 + ((a1 as usize) * (255 - a0 as usize) / 255) as u8;
+
*bmp1.pixel_mut((x, y)) = (r, g, b, a);
+
self.bitmaps.push(bmp1);
} else if r == "PFFICCF" {
+
if let Some(bmp0) = self.bitmaps.pop() {
+
if let Some(mut bmp1) = self.bitmaps.pop() {
+
let (_, _, _, a0) = *bmp0.pixel((x, y));
+
let (r1, b1, g1, a1) = *bmp1.pixel((x, y));
+
let r = ((r1 as usize) * (a0 as usize) / 255) as u8;
+
let g = ((g1 as usize) * (a0 as usize) / 255) as u8;
+
let b = ((b1 as usize) * (a0 as usize) / 255) as u8;
+
let a = ((a1 as usize) * (a0 as usize) / 255) as u8;
+
*bmp1.pixel_mut((x, y)) = (r, g, b, a);
+
self.bitmaps.push(bmp1);