add optional spacers
This commit is contained in:
		
							parent
							
								
									d7b7036f51
								
							
						
					
					
						commit
						9f5d256963
					
				
					 5 changed files with 48 additions and 108 deletions
				
			
		
							
								
								
									
										82
									
								
								Cargo.lock
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										82
									
								
								Cargo.lock
									
										
									
										generated
									
									
									
								
							|  | @ -1136,81 +1136,6 @@ dependencies = [ | ||||||
|  "jni-sys", |  "jni-sys", | ||||||
| ] | ] | ||||||
| 
 | 
 | ||||||
| [[package]] |  | ||||||
| name = "num" |  | ||||||
| version = "0.4.3" |  | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" |  | ||||||
| checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" |  | ||||||
| dependencies = [ |  | ||||||
|  "num-bigint", |  | ||||||
|  "num-complex", |  | ||||||
|  "num-integer", |  | ||||||
|  "num-iter", |  | ||||||
|  "num-rational", |  | ||||||
|  "num-traits", |  | ||||||
| ] |  | ||||||
| 
 |  | ||||||
| [[package]] |  | ||||||
| name = "num-bigint" |  | ||||||
| version = "0.4.5" |  | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" |  | ||||||
| checksum = "c165a9ab64cf766f73521c0dd2cfdff64f488b8f0b3e621face3462d3db536d7" |  | ||||||
| dependencies = [ |  | ||||||
|  "num-integer", |  | ||||||
|  "num-traits", |  | ||||||
| ] |  | ||||||
| 
 |  | ||||||
| [[package]] |  | ||||||
| name = "num-complex" |  | ||||||
| version = "0.4.6" |  | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" |  | ||||||
| checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" |  | ||||||
| dependencies = [ |  | ||||||
|  "num-traits", |  | ||||||
| ] |  | ||||||
| 
 |  | ||||||
| [[package]] |  | ||||||
| name = "num-derive" |  | ||||||
| version = "0.4.2" |  | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" |  | ||||||
| checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" |  | ||||||
| dependencies = [ |  | ||||||
|  "proc-macro2", |  | ||||||
|  "quote", |  | ||||||
|  "syn", |  | ||||||
| ] |  | ||||||
| 
 |  | ||||||
| [[package]] |  | ||||||
| name = "num-integer" |  | ||||||
| version = "0.1.46" |  | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" |  | ||||||
| checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" |  | ||||||
| dependencies = [ |  | ||||||
|  "num-traits", |  | ||||||
| ] |  | ||||||
| 
 |  | ||||||
| [[package]] |  | ||||||
| name = "num-iter" |  | ||||||
| version = "0.1.45" |  | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" |  | ||||||
| checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" |  | ||||||
| dependencies = [ |  | ||||||
|  "autocfg", |  | ||||||
|  "num-integer", |  | ||||||
|  "num-traits", |  | ||||||
| ] |  | ||||||
| 
 |  | ||||||
| [[package]] |  | ||||||
| name = "num-rational" |  | ||||||
| version = "0.4.2" |  | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" |  | ||||||
| checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" |  | ||||||
| dependencies = [ |  | ||||||
|  "num-bigint", |  | ||||||
|  "num-integer", |  | ||||||
|  "num-traits", |  | ||||||
| ] |  | ||||||
| 
 |  | ||||||
| [[package]] | [[package]] | ||||||
| name = "num-traits" | name = "num-traits" | ||||||
| version = "0.2.19" | version = "0.2.19" | ||||||
|  | @ -1707,17 +1632,14 @@ dependencies = [ | ||||||
| 
 | 
 | ||||||
| [[package]] | [[package]] | ||||||
| name = "servicepoint2" | name = "servicepoint2" | ||||||
| version = "0.1.3" | version = "0.2.0" | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
| checksum = "ff3f24a6ee5fa2b73d57b78d8d35efefb9397d0ea012978fe52b396f601e8948" | checksum = "8d434890b6d1a4c886f384639bf79ba7f127221cad7bff45acabf99d2fccee5f" | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "bzip2", |  "bzip2", | ||||||
|  "flate2", |  "flate2", | ||||||
|  "log", |  "log", | ||||||
|  "lz4", |  "lz4", | ||||||
|  "num", |  | ||||||
|  "num-derive", |  | ||||||
|  "num-traits", |  | ||||||
|  "zstd", |  "zstd", | ||||||
| ] | ] | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -7,7 +7,7 @@ license = "GPL-3.0-or-later" | ||||||
| 
 | 
 | ||||||
| [dependencies] | [dependencies] | ||||||
| # packet parsing | # packet parsing | ||||||
| servicepoint2 = "0.1.3" | servicepoint2 = "0.2.0" | ||||||
| 
 | 
 | ||||||
| # gui | # gui | ||||||
| winit = { version = "0.30", features = ["rwh_05"] } # for creating a window | winit = { version = "0.30", features = ["rwh_05"] } # for creating a window | ||||||
|  |  | ||||||
|  | @ -36,7 +36,7 @@ impl BitmapFont { | ||||||
|                 HintingOptions::None, |                 HintingOptions::None, | ||||||
|                 RasterizationOptions::GrayscaleAa, |                 RasterizationOptions::GrayscaleAa, | ||||||
|             ) |             ) | ||||||
|             .unwrap(); |                 .unwrap(); | ||||||
| 
 | 
 | ||||||
|             assert_eq!(canvas.pixels.len(), 64); |             assert_eq!(canvas.pixels.len(), 64); | ||||||
|             assert_eq!(canvas.stride, 8); |             assert_eq!(canvas.stride, 8); | ||||||
|  |  | ||||||
							
								
								
									
										53
									
								
								src/gui.rs
									
										
									
									
									
								
							
							
						
						
									
										53
									
								
								src/gui.rs
									
										
									
									
									
								
							|  | @ -2,10 +2,10 @@ use std::sync::mpsc::Sender; | ||||||
| use std::sync::RwLock; | use std::sync::RwLock; | ||||||
| 
 | 
 | ||||||
| use log::{info, warn}; | use log::{info, warn}; | ||||||
| use pixels::wgpu::TextureFormat; |  | ||||||
| use pixels::{Pixels, PixelsBuilder, SurfaceTexture}; | use pixels::{Pixels, PixelsBuilder, SurfaceTexture}; | ||||||
|  | use pixels::wgpu::TextureFormat; | ||||||
| use servicepoint2::{ | use servicepoint2::{ | ||||||
|     ByteGrid, PixelGrid, PIXEL_HEIGHT, PIXEL_WIDTH, TILE_SIZE, |     ByteGrid, PIXEL_HEIGHT, PIXEL_WIDTH, PixelGrid, TILE_SIZE, | ||||||
| }; | }; | ||||||
| use winit::application::ApplicationHandler; | use winit::application::ApplicationHandler; | ||||||
| use winit::dpi::{LogicalSize, Size}; | use winit::dpi::{LogicalSize, Size}; | ||||||
|  | @ -19,8 +19,11 @@ pub struct App<'t> { | ||||||
|     window: Option<Window>, |     window: Option<Window>, | ||||||
|     pixels: Option<Pixels>, |     pixels: Option<Pixels>, | ||||||
|     stop_udp_tx: Sender<()>, |     stop_udp_tx: Sender<()>, | ||||||
|  |     spacers: bool, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | const SPACER_HEIGHT: u16 = 4; | ||||||
|  | 
 | ||||||
| #[derive(Debug)] | #[derive(Debug)] | ||||||
| pub enum AppEvents { | pub enum AppEvents { | ||||||
|     UdpPacketHandled, |     UdpPacketHandled, | ||||||
|  | @ -32,6 +35,7 @@ impl<'t> App<'t> { | ||||||
|         display: &'t RwLock<PixelGrid>, |         display: &'t RwLock<PixelGrid>, | ||||||
|         luma: &'t RwLock<ByteGrid>, |         luma: &'t RwLock<ByteGrid>, | ||||||
|         stop_udp_tx: Sender<()>, |         stop_udp_tx: Sender<()>, | ||||||
|  |         spacers: bool, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         App { |         App { | ||||||
|             display, |             display, | ||||||
|  | @ -39,42 +43,44 @@ impl<'t> App<'t> { | ||||||
|             stop_udp_tx, |             stop_udp_tx, | ||||||
|             pixels: None, |             pixels: None, | ||||||
|             window: None, |             window: None, | ||||||
|  |             spacers, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl ApplicationHandler<AppEvents> for App<'_> { | impl ApplicationHandler<AppEvents> for App<'_> { | ||||||
|     fn resumed(&mut self, event_loop: &ActiveEventLoop) { |     fn resumed(&mut self, event_loop: &ActiveEventLoop) { | ||||||
|         let size = Size::from(LogicalSize::new( |         let height = if self.spacers { | ||||||
|             PIXEL_WIDTH as f64, |             let num_spacers = (PIXEL_HEIGHT / TILE_SIZE) - 1; | ||||||
|             PIXEL_HEIGHT as f64, |             PIXEL_HEIGHT + num_spacers * SPACER_HEIGHT | ||||||
|         )); |         } else { | ||||||
|  |             PIXEL_HEIGHT | ||||||
|  |         } as f64; | ||||||
|  | 
 | ||||||
|  |         let size = Size::from(LogicalSize::new(PIXEL_WIDTH as f64, height)); | ||||||
|         let attributes = Window::default_attributes() |         let attributes = Window::default_attributes() | ||||||
|             .with_title("pixel-receiver-rs") |             .with_title("servicepoint-simulator") | ||||||
|             .with_inner_size(size); |             .with_inner_size(size); | ||||||
| 
 | 
 | ||||||
|         let window = event_loop.create_window(attributes).unwrap(); |         let window = event_loop.create_window(attributes).unwrap(); | ||||||
|         self.window = Some(window); |         self.window = Some(window); | ||||||
|         let window = self.window.as_ref().unwrap(); |         let window = self.window.as_ref().unwrap(); | ||||||
| 
 | 
 | ||||||
|         self.pixels = { |         self.pixels = Some({ | ||||||
|             let window_size = window.inner_size(); |             let window_size = window.inner_size(); | ||||||
|             let surface_texture = SurfaceTexture::new( |             PixelsBuilder::new( | ||||||
|                 window_size.width, |                 window_size.width, | ||||||
|                 window_size.height, |                 window_size.height, | ||||||
|                 &window, |                 SurfaceTexture::new( | ||||||
|             ); |                     window_size.width, | ||||||
|             Some( |                     window_size.height, | ||||||
|                 PixelsBuilder::new( |                     &window, | ||||||
|                     PIXEL_WIDTH as u32, |                 ), | ||||||
|                     PIXEL_HEIGHT as u32, |             ) | ||||||
|                     surface_texture, |  | ||||||
|                 ) |  | ||||||
|                 .render_texture_format(TextureFormat::Bgra8UnormSrgb) |                 .render_texture_format(TextureFormat::Bgra8UnormSrgb) | ||||||
|                 .build() |                 .build() | ||||||
|                 .expect("could not create pixels"), |                 .expect("could not create pixels") | ||||||
|             ) |         }); | ||||||
|         }; |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn user_event(&mut self, event_loop: &ActiveEventLoop, event: AppEvents) { |     fn user_event(&mut self, event_loop: &ActiveEventLoop, event: AppEvents) { | ||||||
|  | @ -116,6 +122,13 @@ impl ApplicationHandler<AppEvents> for App<'_> { | ||||||
|         let luma = self.luma.read().unwrap(); |         let luma = self.luma.read().unwrap(); | ||||||
| 
 | 
 | ||||||
|         for y in 0..PIXEL_HEIGHT as usize { |         for y in 0..PIXEL_HEIGHT as usize { | ||||||
|  |             if self.spacers && y != 0 && y % TILE_SIZE as usize == 0 { | ||||||
|  |                 // cannot just frame.skip(PIXEL_WIDTH as usize * SPACER_HEIGHT as usize) because of typing
 | ||||||
|  |                 for _ in 0..PIXEL_WIDTH as usize * SPACER_HEIGHT as usize { | ||||||
|  |                     frame.next().unwrap(); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|             for x in 0..PIXEL_WIDTH as usize { |             for x in 0..PIXEL_WIDTH as usize { | ||||||
|                 let is_set = display.get(x, y); |                 let is_set = display.get(x, y); | ||||||
|                 let brightness = |                 let brightness = | ||||||
|  |  | ||||||
							
								
								
									
										17
									
								
								src/main.rs
									
										
									
									
									
								
							
							
						
						
									
										17
									
								
								src/main.rs
									
										
									
									
									
								
							|  | @ -8,8 +8,8 @@ use std::time::Duration; | ||||||
| use clap::Parser; | use clap::Parser; | ||||||
| use log::{debug, error, info, warn}; | use log::{debug, error, info, warn}; | ||||||
| use servicepoint2::{ | use servicepoint2::{ | ||||||
|     ByteGrid, Command, Origin, Packet, PixelGrid, PIXEL_COUNT, PIXEL_HEIGHT, |     ByteGrid, Command, Origin, Packet, PIXEL_COUNT, PIXEL_HEIGHT, PIXEL_WIDTH, | ||||||
|     PIXEL_WIDTH, TILE_HEIGHT, TILE_SIZE, TILE_WIDTH, |     PixelGrid, TILE_HEIGHT, TILE_SIZE, TILE_WIDTH, | ||||||
| }; | }; | ||||||
| use winit::event_loop::{ControlFlow, EventLoop}; | use winit::event_loop::{ControlFlow, EventLoop}; | ||||||
| 
 | 
 | ||||||
|  | @ -21,8 +21,10 @@ mod gui; | ||||||
| 
 | 
 | ||||||
| #[derive(Parser, Debug)] | #[derive(Parser, Debug)] | ||||||
| struct Cli { | struct Cli { | ||||||
|     #[arg(long, default_value = "0.0.0.0:2342")] |     #[arg(short, long, default_value = "0.0.0.0:2342")] | ||||||
|     bind: String, |     bind: String, | ||||||
|  |     #[arg(short, long, default_value_t = false)] | ||||||
|  |     spacers: bool, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn main() { | fn main() { | ||||||
|  | @ -51,7 +53,7 @@ fn main() { | ||||||
| 
 | 
 | ||||||
|     let (stop_udp_tx, stop_udp_rx) = mpsc::channel(); |     let (stop_udp_tx, stop_udp_rx) = mpsc::channel(); | ||||||
| 
 | 
 | ||||||
|     let mut app = App::new(display_ref, luma_ref, stop_udp_tx); |     let mut app = App::new(display_ref, luma_ref, stop_udp_tx, cli.spacers); | ||||||
| 
 | 
 | ||||||
|     let event_loop = EventLoop::with_user_event() |     let event_loop = EventLoop::with_user_event() | ||||||
|         .build() |         .build() | ||||||
|  | @ -237,12 +239,15 @@ fn print_cp437_data( | ||||||
|     display: &mut RwLockWriteGuard<PixelGrid>, |     display: &mut RwLockWriteGuard<PixelGrid>, | ||||||
| ) { | ) { | ||||||
|     let Origin(x, y) = origin; |     let Origin(x, y) = origin; | ||||||
|  |     let x = x as usize; | ||||||
|  |     let y = y as usize; | ||||||
|  | 
 | ||||||
|     for char_y in 0usize..grid.height { |     for char_y in 0usize..grid.height { | ||||||
|         for char_x in 0usize..grid.width { |         for char_x in 0usize..grid.width { | ||||||
|             let char_code = grid.get(char_x, char_y); |             let char_code = grid.get(char_x, char_y); | ||||||
| 
 | 
 | ||||||
|             let tile_x = char_x + x as usize; |             let tile_x = char_x + x; | ||||||
|             let tile_y = char_y + y as usize; |             let tile_y = char_y + y; | ||||||
| 
 | 
 | ||||||
|             let bitmap = font.get_bitmap(char_code); |             let bitmap = font.get_bitmap(char_code); | ||||||
|             print_pixel_grid( |             print_pixel_grid( | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Vinzenz Schroeter
						Vinzenz Schroeter