Compare commits

...

3 commits

Author SHA1 Message Date
v cfa8044ea2 shard image across threads 2023-12-30 04:15:13 +01:00
v 20c591769c use kame turtle 2023-12-30 04:03:24 +01:00
v 019d87ba62 change ip 2023-12-30 02:55:21 +01:00
3 changed files with 23 additions and 12 deletions

BIN
ipv4_nein_danke.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
kame-mosaic.apng Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 KiB

View file

@ -1,5 +1,4 @@
use png::{ColorType, Decoder};
use rand::{thread_rng, Rng};
use sscanf::sscanf;
use std::error::Error;
use std::fs::File;
@ -8,15 +7,16 @@ use std::net::TcpStream;
use std::thread;
fn main() -> Result<(), Box<dyn Error>> {
let decoder = Decoder::new(File::open("nopslide.png")?);
let decoder = Decoder::new(File::open("kame-mosaic.apng")?);
let mut reader = decoder.read_info()?;
let mut pixelbuf = vec![0; reader.output_buffer_size()];
let info = reader.next_frame(&mut pixelbuf)?;
thread::scope(|s| {
for _ in 0..32 {
s.spawn(|| -> Result<(), Box<dyn Error + Send + Sync>> {
let stream = TcpStream::connect("151.217.15.79:1337")?;
for i in 0..3 {
let pixelbuf = &pixelbuf;
s.spawn(move || -> Result<(), Box<dyn Error + Send + Sync>> {
let stream = TcpStream::connect("151.217.15.90:1337")?;
// disable Nagle's algorithm
stream.set_nodelay(true)?;
let mut reader = BufReader::new(stream.try_clone()?);
@ -28,16 +28,27 @@ fn main() -> Result<(), Box<dyn Error>> {
// XXX sscanf does not like \n after numbers ... O_o
// XXX sscanf returns Result<(), Box<dyn Error>> which is not + Send + Sync
let size = sscanf!(&buf[..buf.len() - 1], "SIZE {u32} {u32}").unwrap();
println!("SIZE {} {}", size.0, size.1);
let mut rng = thread_rng();
let pos = ((size.0 - info.width) / 2, (size.1 - info.height) / 2);
loop {
let pos = (
rng.gen_range(0..size.0 - info.width),
rng.gen_range(0..size.1 - info.height),
);
for x in 0..info.width {
for y in 0..info.height {
for y in (i..info.height).step_by(3) {
for x in 0..info.width {
match info.color_type {
ColorType::Rgba => {
let offset = ((x + y * info.width) * 4) as usize;
if pixelbuf[offset + 3] != 0 {
write!(
writer,
"PX {} {} {:02x}{:02x}{:02x}\n",
x + pos.0,
y + pos.1,
pixelbuf[offset],
pixelbuf[offset + 1],
pixelbuf[offset + 2]
)?;
}
}
ColorType::GrayscaleAlpha => {
let offset = ((x + y * info.width) * 2) as usize;
if pixelbuf[offset + 1] != 0 {