Skip to content

Commit 8ca8130

Browse files
committed
Move progress reporting into separate trait.
1 parent 40adaed commit 8ca8130

File tree

4 files changed

+99
-16
lines changed

4 files changed

+99
-16
lines changed

src/bin/cli.rs

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,51 @@
77
extern crate geometrify;
88
extern crate image;
99
extern crate clap;
10-
10+
extern crate pbr;
1111

1212
use clap::{Arg, App, AppSettings};
1313

14-
use geometrify::{RandomPointGenerator, Filter};
14+
use geometrify::{ProgressReporter, RandomPointGenerator, Filter};
1515
use geometrify::geometrify::Geometrify;
1616

1717
use image::open;
1818
use std::path::Path;
19+
use std::io::Stdout;
20+
21+
use pbr::ProgressBar;
22+
23+
struct PbrProgressReporter {
24+
bar: Option<ProgressBar<Stdout>>,
25+
}
26+
27+
impl PbrProgressReporter {
28+
fn new() -> PbrProgressReporter {
29+
PbrProgressReporter {
30+
bar: None,
31+
}
32+
}
33+
}
34+
35+
impl ProgressReporter for PbrProgressReporter {
36+
fn init(&mut self, steps: u64) {
37+
let mut progress = ProgressBar::new(steps);
38+
progress.format("|#--|");
39+
self.bar = Some(progress);
40+
}
41+
42+
fn step(&mut self) {
43+
let ref mut bar = self.bar.as_mut().expect("ProgressReporter was not initialized");
44+
bar.inc();
45+
}
46+
47+
fn finish(&mut self) {
48+
{
49+
let ref mut bar = self.bar.as_mut().expect("ProgressReporter was not initialized");
50+
bar.finish();
51+
}
52+
self.bar = None;
53+
}
54+
}
1955

2056
fn main() {
2157
let matches = App::new("Geometrify Filter")
@@ -72,8 +108,8 @@ fn main() {
72108
.expect("invalid samples parameter"),
73109
);
74110

75-
76-
let outputbuf = filter.apply(&sourcebuf);
111+
let mut progress = PbrProgressReporter::new();
112+
let outputbuf = filter.apply(&sourcebuf, &mut progress);
77113

78114
outputbuf
79115
.save(&Path::new(matches.value_of("OUTPUT").expect("expected output file")))

src/bin/web.rs

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,43 @@
88
#![plugin(rocket_codegen)]
99

1010
extern crate rocket;
11+
extern crate geometrify;
12+
extern crate image;
13+
14+
use rocket::Data;
15+
16+
use std::io::Read;
17+
18+
use geometrify::{Filter, RandomPointGenerator};
19+
use geometrify::geometrify::Geometrify;
1120

1221
#[get("/")]
1322
fn index() -> &'static str {
1423
"Hello world!"
1524
}
1625

26+
#[post("/geometrify", format="image/png", data = "<data>")]
27+
fn geometrify_process(data: Data) -> &'static str {
28+
let mut buf = vec!();
29+
data.open().read_to_end(&mut buf).expect("Can't read into memory");
30+
let image = image::load_from_memory(&buf).expect("Can't load image").to_rgba();
31+
drop(buf);
32+
33+
let pointgen = Box::new(RandomPointGenerator::new());
34+
let mut filter = Geometrify::new(
35+
pointgen,
36+
4,
37+
6,
38+
);
39+
40+
let out = filter.apply(&image);
41+
42+
"ok"
43+
}
44+
1745
fn main() {
18-
rocket::ignite().mount("/", routes![index]).launch();
19-
}
46+
rocket::ignite().mount("/", routes![
47+
index,
48+
geometrify_process
49+
]).launch();
50+
}

src/geometrify.rs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,9 @@
44
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
55
*/
66

7-
use super::{Point, BoundingBox, PointGenerator, Filter};
7+
use super::{Point, BoundingBox, PointGenerator, Filter, ProgressReporter};
88
use image::{Rgba, RgbaImage, Pixel};
99

10-
use pbr::ProgressBar;
11-
1210
use rayon::prelude::*;
1311

1412
trait Primitive {
@@ -296,9 +294,8 @@ impl Geometrify {
296294
}
297295

298296
impl Filter for Geometrify {
299-
fn apply(&mut self, image: &RgbaImage) -> RgbaImage {
300-
let mut progress = ProgressBar::new(self.iterations as u64);
301-
progress.format("|#--|");
297+
fn apply(&mut self, image: &RgbaImage, progress: &mut ProgressReporter) -> RgbaImage {
298+
progress.init(self.iterations as u64);
302299

303300
let mut destination = RgbaImage::new(image.width(), image.height());
304301

@@ -335,9 +332,9 @@ impl Filter for Geometrify {
335332
&mut destination,
336333
&min_primitive.expect("no fitting triangle found").0,
337334
);
338-
progress.inc();
335+
progress.step();
339336
}
340-
progress.finish_print("done");
337+
progress.finish();
341338

342339
destination
343340
}

src/lib.rs

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
extern crate image;
88
extern crate rand;
99
extern crate rayon;
10-
extern crate pbr;
1110

1211
pub mod geometrify;
1312

@@ -62,8 +61,28 @@ impl PointGenerator for RandomPointGenerator {
6261
}
6362
}
6463

64+
pub trait ProgressReporter {
65+
fn init(&mut self, count: u64);
66+
fn step(&mut self);
67+
fn finish(&mut self);
68+
}
69+
70+
pub struct SilentProgressReporter;
71+
72+
impl ProgressReporter {
73+
pub fn new() -> SilentProgressReporter {
74+
SilentProgressReporter { }
75+
}
76+
}
77+
78+
impl ProgressReporter for SilentProgressReporter {
79+
fn init(&mut self, _: u64) { }
80+
fn step(&mut self) { }
81+
fn finish(&mut self) { }
82+
}
83+
6584
pub trait Filter {
66-
fn apply(&mut self, image: &RgbaImage) -> RgbaImage;
85+
fn apply(&mut self, image: &RgbaImage, progress: &mut ProgressReporter) -> RgbaImage;
6786
}
6887

6988
#[cfg(test)]

0 commit comments

Comments
 (0)