aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/app.rs33
-rw-r--r--src/main.rs3
2 files changed, 31 insertions, 5 deletions
diff --git a/src/app.rs b/src/app.rs
index 059635a..9a1155e 100644
--- a/src/app.rs
+++ b/src/app.rs
@@ -1,7 +1,7 @@
1use crate::{ 1use crate::{
2 bitmap::{MapPoint, Pixmap}, 2 bitmap::{MapPoint, Pixmap},
3 consts::colors::*, 3 consts::colors::*,
4 rect, 4 dither, rect,
5 symmetry::Symmetry, 5 symmetry::Symmetry,
6 undo::{ModifyRecord, OpKind, Operation, UndoStack}, 6 undo::{ModifyRecord, OpKind, Operation, UndoStack},
7 utils::draw_text, 7 utils::draw_text,
@@ -24,6 +24,7 @@ use sdl2::{
24pub struct AppState<'ctx> { 24pub struct AppState<'ctx> {
25 active_color: bool, 25 active_color: bool,
26 brush_size: u8, 26 brush_size: u8,
27 dither_level: u8,
27 canvas: Canvas<Window>, 28 canvas: Canvas<Window>,
28 context: &'ctx Sdl, 29 context: &'ctx Sdl,
29 ttf_context: &'ctx Sdl2TtfContext, 30 ttf_context: &'ctx Sdl2TtfContext,
@@ -130,13 +131,18 @@ impl<'ctx> AppState<'ctx> {
130 ) -> Result<Vec<ModifyRecord>, ()> { 131 ) -> Result<Vec<ModifyRecord>, ()> {
131 let radius = self.brush_size as u32; 132 let radius = self.brush_size as u32;
132 let center = self.idx_at_coord(center).ok_or(())?; 133 let center = self.idx_at_coord(center).ok_or(())?;
134 let dither_level = self.dither_level;
133 135
134 let circle = self.pixmap.get_circle(center, radius, true); 136 let circle = self.pixmap.get_circle(center, radius, true);
135 let sym_circle = self.symmetry.apply(&circle); 137 let sym_circle = self.symmetry.apply(&circle);
136 138
137 let mut modify_record = vec![]; 139 let mut modify_record = vec![];
138 140
139 for point in circle.into_iter().chain(sym_circle) { 141 for point in circle
142 .into_iter()
143 .chain(sym_circle)
144 .filter(|&pt| dither::bayer(dither_level, pt))
145 {
140 let old_val = self.pixmap.set(point, val); 146 let old_val = self.pixmap.set(point, val);
141 modify_record.push(ModifyRecord::new(point, old_val, val)); 147 modify_record.push(ModifyRecord::new(point, old_val, val));
142 } 148 }
@@ -151,6 +157,7 @@ impl<'ctx> AppState<'ctx> {
151 ) -> Result<Vec<ModifyRecord>, ()> { 157 ) -> Result<Vec<ModifyRecord>, ()> {
152 let start = self.idx_at_coord(start).ok_or(())?; 158 let start = self.idx_at_coord(start).ok_or(())?;
153 let end = self.idx_at_coord(end).ok_or(())?; 159 let end = self.idx_at_coord(end).ok_or(())?;
160 let dither_level = self.dither_level;
154 161
155 let line = self.pixmap.get_line(start, end); 162 let line = self.pixmap.get_line(start, end);
156 let sym_line = self.symmetry.apply(&line); 163 let sym_line = self.symmetry.apply(&line);
@@ -158,7 +165,10 @@ impl<'ctx> AppState<'ctx> {
158 let mut line_modify_record = vec![]; 165 let mut line_modify_record = vec![];
159 for point in line.into_iter().chain(sym_line) { 166 for point in line.into_iter().chain(sym_line) {
160 let circle_around_point = self.pixmap.get_circle(point, self.brush_size as u32, true); 167 let circle_around_point = self.pixmap.get_circle(point, self.brush_size as u32, true);
161 for c in circle_around_point { 168 for c in circle_around_point
169 .into_iter()
170 .filter(|&pt| dither::bayer(dither_level, pt))
171 {
162 let old_val = self.pixmap.set(c, val); 172 let old_val = self.pixmap.set(c, val);
163 line_modify_record.push(ModifyRecord::new(c, old_val, val)); 173 line_modify_record.push(ModifyRecord::new(c, old_val, val));
164 } 174 }
@@ -215,6 +225,18 @@ impl<'ctx> AppState<'ctx> {
215 } 225 }
216 } 226 }
217 227
228 fn reduce_intensity(&mut self) {
229 if self.dither_level > 0 {
230 self.dither_level -= 1;
231 }
232 }
233
234 fn increase_intensity(&mut self) {
235 if self.dither_level < 16 {
236 self.dither_level += 1;
237 }
238 }
239
218 fn zoom_out(&mut self, p: (i32, i32)) { 240 fn zoom_out(&mut self, p: (i32, i32)) {
219 if self.zoom > 1 { 241 if self.zoom > 1 {
220 // attempt to center around cursor 242 // attempt to center around cursor
@@ -290,7 +312,7 @@ impl<'ctx> AppState<'ctx> {
290 if let Some(center) = pt { 312 if let Some(center) = pt {
291 let circle = self.pixmap.get_circle(center, brush_size as u32, false); 313 let circle = self.pixmap.get_circle(center, brush_size as u32, false);
292 for MapPoint { x, y } in circle.into_iter() { 314 for MapPoint { x, y } in circle.into_iter() {
293 self.canvas.set_draw_color(GREY); 315 self.canvas.set_draw_color(PINK);
294 self.canvas 316 self.canvas
295 .fill_rect(Rect::new( 317 .fill_rect(Rect::new(
296 x as i32 * cs as i32 + self.start.x(), 318 x as i32 * cs as i32 + self.start.x(),
@@ -383,6 +405,7 @@ impl<'ctx> AppState<'ctx> {
383 Self { 405 Self {
384 active_color: true, 406 active_color: true,
385 brush_size: 0, 407 brush_size: 0,
408 dither_level: 16,
386 canvas, 409 canvas,
387 context, 410 context,
388 ttf_context, 411 ttf_context,
@@ -431,6 +454,8 @@ impl<'ctx> AppState<'ctx> {
431 // brush ops 454 // brush ops
432 Keycode::Q => self.decrease_brush_size(), 455 Keycode::Q => self.decrease_brush_size(),
433 Keycode::E => self.increase_brush_size(), 456 Keycode::E => self.increase_brush_size(),
457 Keycode::Num1 => self.reduce_intensity(),
458 Keycode::Num3 => self.increase_intensity(),
434 // flip color 459 // flip color
435 Keycode::X => self.change_active_color(), 460 Keycode::X => self.change_active_color(),
436 // toggle grid 461 // toggle grid
diff --git a/src/main.rs b/src/main.rs
index c9c1bdd..14f4cf5 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,6 +1,7 @@
1mod app; 1mod app;
2mod bitmap; 2mod bitmap;
3mod consts; 3mod consts;
4mod dither;
4mod symmetry; 5mod symmetry;
5mod undo; 6mod undo;
6mod utils; 7mod utils;
@@ -10,5 +11,5 @@ use app::AppState;
10pub fn main() { 11pub fn main() {
11 let sdl_context = sdl2::init().unwrap(); 12 let sdl_context = sdl2::init().unwrap();
12 let ttf_context = sdl2::ttf::init().unwrap(); 13 let ttf_context = sdl2::ttf::init().unwrap();
13 AppState::init(160, 160, &sdl_context, &ttf_context).run(); 14 AppState::init(200, 200, &sdl_context, &ttf_context).run();
14} 15}