Dirty push

This commit is contained in:
Tim Visée
2017-12-29 17:34:29 +01:00
parent d61f01451b
commit 5a9b7f9944
3 changed files with 333 additions and 21 deletions

254
Cargo.lock generated Normal file
View File

@@ -0,0 +1,254 @@
[[package]]
name = "adler32"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "bitflags"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "bufstream"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "byteorder"
version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "coco"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"either 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
"scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "color_quant"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "deflate"
version = "0.7.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"adler32 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
"byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "either"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "enum_primitive"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "fuchsia-zircon"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
"fuchsia-zircon-sys 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "fuchsia-zircon-sys"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "gif"
version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"color_quant 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
"lzw 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "image"
version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
"enum_primitive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
"gif 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
"jpeg-decoder 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",
"num-iter 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)",
"num-rational 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
"num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
"png 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
"scoped_threadpool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "inflate"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"adler32 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "jpeg-decoder"
version = "0.1.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
"rayon 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "lazy_static"
version = "0.2.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "libc"
version = "0.2.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "lzw"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "num-integer"
version = "0.1.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "num-iter"
version = "0.1.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"num-integer 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
"num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "num-rational"
version = "0.1.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"num-integer 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
"num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "num-traits"
version = "0.1.41"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "num_cpus"
version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "pixelpwn"
version = "0.1.0"
dependencies = [
"bufstream 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
"image 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "png"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
"deflate 0.7.17 (registry+https://github.com/rust-lang/crates.io-index)",
"inflate 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
"num-iter 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "rand"
version = "0.3.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"fuchsia-zircon 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "rayon"
version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"rayon-core 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "rayon-core"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"coco 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
"lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)",
"num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
"rand 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "scoped_threadpool"
version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "scopeguard"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
[metadata]
"checksum adler32 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6cbd0b9af8587c72beadc9f72d35b9fbb070982c9e6203e46e93f10df25f8f45"
"checksum bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b3c30d3802dfb7281680d6285f2ccdaa8c2d8fee41f93805dba5c4cf50dc23cf"
"checksum bufstream 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "f2f382711e76b9de6c744cc00d0497baba02fb00a787f088c879f01d09468e32"
"checksum byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "652805b7e73fada9d85e9a6682a4abd490cb52d96aeecc12e33a0de34dfd0d23"
"checksum coco 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c06169f5beb7e31c7c67ebf5540b8b472d23e3eade3b2ec7d1f5b504a85f91bd"
"checksum color_quant 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a475fc4af42d83d28adf72968d9bcfaf035a1a9381642d8e85d8a04957767b0d"
"checksum deflate 0.7.17 (registry+https://github.com/rust-lang/crates.io-index)" = "4dddda59aaab719767ab11d3efd9a714e95b610c4445d4435765021e9d52dfb1"
"checksum either 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "740178ddf48b1a9e878e6d6509a1442a2d42fd2928aae8e7a6f8a36fb01981b3"
"checksum enum_primitive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "be4551092f4d519593039259a9ed8daedf0da12e5109c5280338073eaeb81180"
"checksum fuchsia-zircon 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bd510087c325af53ba24f3be8f1c081b0982319adcb8b03cad764512923ccc19"
"checksum fuchsia-zircon-sys 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "08b3a6f13ad6b96572b53ce7af74543132f1a7055ccceb6d073dd36c54481859"
"checksum gif 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e2e41945ba23db3bf51b24756d73d81acb4f28d85c3dccc32c6fae904438c25f"
"checksum image 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)" = "545f000e8aa4e569e93f49c446987133452e0091c2494ac3efd3606aa3d309f2"
"checksum inflate 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "10ec05638adf7c5c788bc0cfa608cd479a13572beda20feb4898fe1d85d2c64b"
"checksum jpeg-decoder 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2805ccb10ffe4d10e06ef68a158ff94c255211ecbae848fbde2146b098f93ce7"
"checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73"
"checksum libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)" = "36fbc8a8929c632868295d0178dd8f63fc423fd7537ad0738372bd010b3ac9b0"
"checksum lzw 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d947cbb889ed21c2a84be6ffbaebf5b4e0f4340638cba0444907e38b56be084"
"checksum num-integer 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)" = "d1452e8b06e448a07f0e6ebb0bb1d92b8890eea63288c0b627331d53514d0fba"
"checksum num-iter 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)" = "7485fcc84f85b4ecd0ea527b14189281cf27d60e583ae65ebc9c088b13dffe01"
"checksum num-rational 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "0c7cb72a95250d8a370105c828f388932373e0e94414919891a0f945222310fe"
"checksum num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "cacfcab5eb48250ee7d0c7896b51a2c5eec99c1feea5f32025635f5ae4b00070"
"checksum num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c51a3322e4bca9d212ad9a158a02abc6934d005490c054a2778df73a70aa0a30"
"checksum png 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f0b0cabbbd20c2d7f06dbf015e06aad59b6ca3d9ed14848783e98af9aaf19925"
"checksum rand 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "9e7944d95d25ace8f377da3ac7068ce517e4c646754c43a1b1849177bbf72e59"
"checksum rayon 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b614fe08b6665cb9a231d07ac1364b0ef3cb3698f1239ee0c4c3a88a524f54c8"
"checksum rayon-core 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e64b609139d83da75902f88fd6c01820046840a18471e4dfcd5ac7c0f46bea53"
"checksum scoped_threadpool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "4ea459fe3ceff01e09534847c49860891d3ff1c12b4eb7731b67f2778fb60190"
"checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27"

View File

@@ -4,4 +4,5 @@ version = "0.1.0"
authors = ["Tim Visée <timvisee@gmail.com>"] authors = ["Tim Visée <timvisee@gmail.com>"]
[dependencies] [dependencies]
bufstream = "*" bufstream = "0.1"
image = "0.18"

View File

@@ -1,12 +1,17 @@
extern crate bufstream; extern crate bufstream;
extern crate image;
use std::env;
use std::fs::File;
use std::io::Error; use std::io::Error;
use std::io::prelude::*; use std::io::prelude::*;
use std::net::TcpStream; use std::net::TcpStream;
use std::path::Path;
use std::thread; use std::thread;
use std::thread::JoinHandle; use std::thread::JoinHandle;
use bufstream::BufStream; use bufstream::BufStream;
use image::{GenericImage, DynamicImage, FilterType};
@@ -22,11 +27,16 @@ fn main() {
// Start // Start
println!("Starting..."); println!("Starting...");
// let range = Range::new(1, 1000); // Define the size to use
// let mut rng = rand::thread_rng(); // TODO: get the size from the screen
let size = (1000u32, 1000u32);
// Define the image to use
// TODO: get the image path from the CLI
let image_path = "/home/timvisee/Pictures/sample.jpg";
// Create a new pixelflut canvas // Create a new pixelflut canvas
let canvas = PixCanvas::new(HOST, (1000, 1000), 10); let canvas = PixCanvas::new(HOST, image_path, size, 10);
loop {} loop {}
} }
@@ -39,23 +49,47 @@ fn create_stream(host: String) -> Result<TcpStream, Error> {
TcpStream::connect(host) TcpStream::connect(host)
} }
/// Load the image at the given path, and size it correctly
fn load_image(path: &str, size: &(u32, u32)) -> DynamicImage {
// Create a path instance
let path = Path::new(&path);
// TODO: make sure the path exists.
// Load the image
println!("Loading image...");
let image = image::open(&path).unwrap();
// Start processing the image for the screen
println!("Processing image...");
// Resize the image to fit the screen
image.resize_exact(
size.0,
size.1,
FilterType::Gaussian,
)
}
/// A pixflut instance /// A pixflut instance
struct PixCanvas { struct PixCanvas {
host: &'static str, host: &'static str,
size: (u16, u16), size: (u32, u32),
painters: Vec<JoinHandle<u32>>, painters: Vec<JoinHandle<u32>>,
image: DynamicImage,
} }
impl PixCanvas { impl PixCanvas {
/// Create a new pixelflut canvas. /// Create a new pixelflut canvas.
pub fn new(host: &'static str, size: (u16, u16), painter_count: usize) -> PixCanvas { pub fn new(host: &'static str, image_path: &str, size: (u32, u32), painter_count: usize) -> PixCanvas {
// Initialize the object // Initialize the object
let mut canvas = PixCanvas { let mut canvas = PixCanvas {
host, host,
size, size,
painters: Vec::with_capacity(painter_count), painters: Vec::with_capacity(painter_count),
image: load_image(image_path, &size),
}; };
// Spawn some painters // Spawn some painters
@@ -78,6 +112,14 @@ impl PixCanvas {
// Get the host that will be used // Get the host that will be used
let host = self.host.to_string(); let host = self.host.to_string();
// Get the part of the image to draw by this painter
let image = self.image.crop(
area.x,
area.y,
area.w,
area.h
);
// Create the painter thread // Create the painter thread
let thread = thread::spawn(move || { let thread = thread::spawn(move || {
// Create a new stream // Create a new stream
@@ -88,7 +130,7 @@ impl PixCanvas {
let client = PixClient::new(stream); let client = PixClient::new(stream);
// Create a painter // Create a painter
let mut painter = Painter::new(client, area); let mut painter = Painter::new(client, area, image);
// Do some work // Do some work
loop { loop {
@@ -106,27 +148,42 @@ impl PixCanvas {
struct Painter { struct Painter {
client: PixClient, client: PixClient,
area: Rect, area: Rect,
image: DynamicImage,
} }
impl Painter { impl Painter {
/// Create a new painter. /// Create a new painter.
pub fn new(client: PixClient, area: Rect) -> Painter { pub fn new(client: PixClient, area: Rect, image: DynamicImage) -> Painter {
Painter { Painter {
client, client,
area, area,
image,
} }
} }
/// Perform work. /// Perform work.
/// Paint the whole defined area. /// Paint the whole defined area.
pub fn work(&mut self) { pub fn work(&mut self) {
// Get an RGB image
let image = self.image.to_rgb();
// Define the color to draw with // Define the color to draw with
let color = Color::from(0, 155, 0); let color = Color::from(0, 155, 0);
// Loop through all the pixels, and set their color // Loop through all the pixels, and set their color
for x in self.area.x..self.area.x + self.area.w { for x in 0..self.area.w {
for y in self.area.y..self.area.y + self.area.h { for y in 0..self.area.h {
self.client.write_pixel(x, y, &color); // Get the pixel at this location
let pixel = image.get_pixel(x, y);
pixel.channels();
// Set the pixel
self.client.write_pixel(
x + self.area.x,
y + self.area.y,
&color,
);
} }
} }
} }
@@ -150,7 +207,7 @@ impl PixClient {
} }
/// Write a pixel to the given stream. /// Write a pixel to the given stream.
fn write_pixel(&mut self, x: u16, y: u16, color: &Color) { fn write_pixel(&mut self, x: u32, y: u32, color: &Color) {
// Write the command to set a pixel // Write the command to set a pixel
self.write_command( self.write_command(
format!("PX {} {} {}", x, y, color.as_hex()), format!("PX {} {} {}", x, y, color.as_hex()),
@@ -195,14 +252,14 @@ impl PixClient {
/// Color structure. /// Color structure.
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
struct Color { struct Color {
r: u16, r: u32,
g: u16, g: u32,
b: u16, b: u32,
} }
impl Color { impl Color {
/// Create a new color instance /// Create a new color instance
pub fn from(r: u16, g: u16, b: u16) -> Color { pub fn from(r: u32, g: u32, b: u32) -> Color {
Color { Color {
r, r,
g, g,
@@ -222,14 +279,14 @@ impl Color {
/// Rectangle struct. /// Rectangle struct.
pub struct Rect { pub struct Rect {
// TODO: Make these properties private // TODO: Make these properties private
pub x: u16, pub x: u32,
pub y: u16, pub y: u32,
pub w: u16, pub w: u32,
pub h: u16, pub h: u32,
} }
impl Rect { impl Rect {
pub fn from(x: u16, y: u16, w: u16, h: u16) -> Rect { pub fn from(x: u32, y: u32, w: u32, h: u32) -> Rect {
Rect { Rect {
x, x,
y, y,