]> git.lizzy.rs Git - rust.git/blob - src/test/bench/shootout-mandelbrot.rs
cf43f470e7177d55e2fcf77b0c57061fc03d02a7
[rust.git] / src / test / bench / shootout-mandelbrot.rs
1 use std::cast::transmute;
2 use std::from_str::FromStr;
3 use std::libc::{STDOUT_FILENO, c_int, fdopen, fputc};
4 use std::os;
5
6 static ITER: uint = 50;
7 static LIMIT: f64 = 2.0;
8
9 #[fixed_stack_segment]
10 fn main() {
11     unsafe {
12         let w: i32 = FromStr::from_str(os::args()[1]).unwrap();
13         let h = w;
14         let mut byte_acc: i8 = 0;
15         let mut bit_num: i32 = 0;
16
17         printfln!("P4\n%d %d", w as int, h as int);
18
19         let mode = "w";
20         let stdout = fdopen(STDOUT_FILENO as c_int, transmute(&mode[0]));
21
22         for y in range(0i32, h) {
23             let y = y as f64;
24             for x in range(0i32, w) {
25                 let mut Zr = 0f64;
26                 let mut Zi = 0f64;
27                 let mut Tr = 0f64;
28                 let mut Ti = 0f64;
29                 let Cr = 2.0 * (x as f64) / (w as f64) - 1.5;
30                 let Ci = 2.0 * (y as f64) / (h as f64) - 1.0;
31
32                 for _ in range(0i32, ITER as i32) {
33                     if Tr + Ti > LIMIT * LIMIT {
34                         break;
35                     }
36
37                     Zi = 2.0*Zr*Zi + Ci;
38                     Zr = Tr - Ti + Cr;
39                     Tr = Zr * Zr;
40                     Ti = Zi * Zi;
41                 }
42
43                 byte_acc <<= 1;
44                 if Tr + Ti <= LIMIT * LIMIT {
45                     byte_acc |= 1;
46                 }
47
48                 bit_num += 1;
49
50                 if bit_num == 8 {
51                     fputc(byte_acc as c_int, stdout);
52                     byte_acc = 0;
53                     bit_num = 0;
54                 } else if x == w - 1 {
55                     byte_acc <<= 8 - w%8;
56                     fputc(byte_acc as c_int, stdout);
57                     byte_acc = 0;
58                     bit_num = 0;
59                 }
60             }
61         }
62     }
63 }