aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAkshay <[email protected]>2021-03-17 12:22:11 +0000
committerAkshay <[email protected]>2021-03-17 12:22:11 +0000
commit83732aed1a41a713cd8790fcebae90aabe78b789 (patch)
treedfa7bd4928e31704c81336263c46b8bc5f153987
parent8017f92785f936721cfc4bfa675859dc9aaf649e (diff)
read and write to .obi files
-rw-r--r--src/app.rs34
-rw-r--r--src/bitmap.rs3
-rw-r--r--src/symmetry.rs8
-rw-r--r--src/utils.rs2
4 files changed, 30 insertions, 17 deletions
diff --git a/src/app.rs b/src/app.rs
index 9a1155e..5b27422 100644
--- a/src/app.rs
+++ b/src/app.rs
@@ -1,17 +1,19 @@
1use crate::{ 1use crate::{
2 bitmap::{MapPoint, Pixmap}, 2 bitmap::{MapPoint, Pixmap},
3 command::CommandBox,
3 consts::colors::*, 4 consts::colors::*,
4 dither, rect, 5 dither, rect,
5 symmetry::Symmetry, 6 symmetry::Symmetry,
6 undo::{ModifyRecord, OpKind, Operation, UndoStack}, 7 undo::{ModifyRecord, OpKind, Operation, UndoStack},
7 utils::draw_text, 8 utils::{draw_text, is_copy_event, is_paste_event},
8}; 9};
9 10
10use std::convert::From; 11use std::{convert::From, fs::File, io::prelude::*};
11 12
13use obi::Image;
12use sdl2::{ 14use sdl2::{
13 event::Event, 15 event::Event,
14 keyboard::Keycode, 16 keyboard::{Keycode, Mod},
15 mouse::MouseButton, 17 mouse::MouseButton,
16 pixels::Color, 18 pixels::Color,
17 rect::{Point, Rect}, 19 rect::{Point, Rect},
@@ -286,15 +288,17 @@ impl<'ctx> AppState<'ctx> {
286 )) 288 ))
287 .unwrap(); 289 .unwrap();
288 let mouse_coords = if let Some((x, y)) = self.idx_at_coord(self.mouse) { 290 let mouse_coords = if let Some((x, y)) = self.idx_at_coord(self.mouse) {
289 format!("{:3}, {:3}", x, y) 291 format!("{:3}, {:3}", x + 1, y + 1)
290 } else { 292 } else {
291 format!("---, ---") 293 format!("---, ---")
292 }; 294 };
293 let status_text = format!( 295 let status_text = format!(
294 "[BRUSH {}] [SYM {}] {}", 296 "[DITHER {}][BRUSH {}][SYM {}][PT {}][ACTIVE {}]",
297 self.dither_level,
295 self.brush_size + 1, 298 self.brush_size + 1,
296 self.symmetry, 299 self.symmetry,
297 mouse_coords 300 mouse_coords,
301 if self.active_color { "WHT" } else { "BLK" }
298 ); 302 );
299 draw_text( 303 draw_text(
300 &mut self.canvas, 304 &mut self.canvas,
@@ -383,6 +387,7 @@ impl<'ctx> AppState<'ctx> {
383 height: u32, 387 height: u32,
384 context: &'ctx Sdl, 388 context: &'ctx Sdl,
385 ttf_context: &'ctx Sdl2TtfContext, 389 ttf_context: &'ctx Sdl2TtfContext,
390 start_data: Option<Vec<bool>>,
386 ) -> Self { 391 ) -> Self {
387 let video_subsystem = context.video().unwrap(); 392 let video_subsystem = context.video().unwrap();
388 393
@@ -401,26 +406,35 @@ impl<'ctx> AppState<'ctx> {
401 .map_err(|e| e.to_string()) 406 .map_err(|e| e.to_string())
402 .unwrap(); 407 .unwrap();
403 408
404 let pixmap = Pixmap::new_with(width, height, false); 409 let data = start_data.unwrap_or(vec![false; (width * height) as usize]);
410 let pixmap = Pixmap::new_with(width, height, data);
405 Self { 411 Self {
406 active_color: true, 412 active_color: true,
407 brush_size: 0, 413 brush_size: 0,
408 dither_level: 16,
409 canvas, 414 canvas,
410 context, 415 context,
411 ttf_context, 416 command_box: CommandBox::new(),
412 mouse: (0, 0),
413 current_operation: Vec::new(), 417 current_operation: Vec::new(),
418 dither_level: 16,
414 grid: Grid::new(), 419 grid: Grid::new(),
415 last_point: None, 420 last_point: None,
421 mode: Mode::Draw,
422 mouse: (0, 0),
416 pixmap, 423 pixmap,
417 start: Point::new(60, 60), 424 start: Point::new(60, 60),
418 symmetry: Default::default(), 425 symmetry: Default::default(),
426 ttf_context,
419 undo_stack: UndoStack::new(), 427 undo_stack: UndoStack::new(),
420 zoom: 5, 428 zoom: 5,
421 } 429 }
422 } 430 }
423 431
432 pub fn export(&self) -> Image {
433 let mut image = Image::new(self.width(), self.height());
434 image.data = self.pixmap.data.clone();
435 image
436 }
437
424 pub fn run(&mut self) { 438 pub fn run(&mut self) {
425 self.canvas.set_draw_color(BLACK); 439 self.canvas.set_draw_color(BLACK);
426 self.canvas.clear(); 440 self.canvas.clear();
diff --git a/src/bitmap.rs b/src/bitmap.rs
index 128a14e..d02cafb 100644
--- a/src/bitmap.rs
+++ b/src/bitmap.rs
@@ -113,8 +113,7 @@ where
113 } 113 }
114 } 114 }
115 115
116 pub fn new_with(width: u32, height: u32, start: T) -> Self { 116 pub fn new_with(width: u32, height: u32, data: Vec<T>) -> Self {
117 let data = vec![start; (width * height) as usize];
118 Pixmap { 117 Pixmap {
119 width, 118 width,
120 height, 119 height,
diff --git a/src/symmetry.rs b/src/symmetry.rs
index 7517317..60ff791 100644
--- a/src/symmetry.rs
+++ b/src/symmetry.rs
@@ -33,10 +33,10 @@ impl fmt::Display for Symmetry {
33 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 33 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
34 let Symmetry { x, y } = self; 34 let Symmetry { x, y } = self;
35 match (x, y) { 35 match (x, y) {
36 (None, None) => write!(f, " "), 36 (None, None) => write!(f, "OFF"),
37 (Some(_), None) => write!(f, "-"), 37 (Some(_), None) => write!(f, "HOR"),
38 (None, Some(_)) => write!(f, "|"), 38 (None, Some(_)) => write!(f, "VER"),
39 (Some(_), Some(_)) => write!(f, "+"), 39 (Some(_), Some(_)) => write!(f, "RAD"),
40 } 40 }
41 } 41 }
42} 42}
diff --git a/src/utils.rs b/src/utils.rs
index e36a8cc..a1b3624 100644
--- a/src/utils.rs
+++ b/src/utils.rs
@@ -14,7 +14,7 @@ pub fn draw_text<S: AsRef<str>>(
14 text: S, 14 text: S,
15 color: Color, 15 color: Color,
16 (x, y): (u32, u32), 16 (x, y): (u32, u32),
17) { 17) -> u32 {
18 let text = text.as_ref(); 18 let text = text.as_ref();
19 let texture_creator = canvas.texture_creator(); 19 let texture_creator = canvas.texture_creator();
20 let mut font = ttf_context.load_font(FONT_PATH, 17).unwrap(); 20 let mut font = ttf_context.load_font(FONT_PATH, 17).unwrap();