let is_flipped = buf.get_info().is_flipped();
let (w, h) = buf.get_dimensions(0);
let (w2, h2) = buf.get_dimensions(1);
+ let full_w = w2 * 2 > w;
let has_alpha = buf.get_info().get_format().has_alpha();
- let tot_h;
+ let mut tot_h = h + h2;
if has_alpha {
- tot_h = h * 2 + h2;
- } else {
- tot_h = h + h2;
+ tot_h += h;
+ }
+ if full_w {
+ tot_h += h2;
}
let hdr = format!("P5\n{} {}\n255\n", w, tot_h);
ofile.write_all(hdr.as_bytes()).unwrap();
let dta = buf.get_data();
let ls = buf.get_stride(0);
- let pad: Vec<u8> = vec![0xFF; (w - w2 * 2) / 2];
+ let pad: Vec<u8> = vec![0xFF; if !full_w { (w - w2 * 2) / 2 } else { w - w2 } ];
if !is_flipped {
let ylines = dta.chunks(ls).take(h);
for line in ylines {
let stride2 = buf.get_stride(2);
let u = &dta[base1..][..h2*stride1];
let v = &dta[base2..][..h2*stride2];
- if !is_flipped {
- for (uline, vline) in u.chunks(stride1).zip(v.chunks(stride2)) {
- ofile.write_all(&uline[..w2]).unwrap();
- ofile.write_all(pad.as_slice()).unwrap();
+ if !full_w {
+ if !is_flipped {
+ for (uline, vline) in u.chunks(stride1).zip(v.chunks(stride2)) {
+ ofile.write_all(&uline[..w2]).unwrap();
+ ofile.write_all(pad.as_slice()).unwrap();
- ofile.write_all(&vline[..w2]).unwrap();
- ofile.write_all(pad.as_slice()).unwrap();
+ ofile.write_all(&vline[..w2]).unwrap();
+ ofile.write_all(pad.as_slice()).unwrap();
+ }
+ } else {
+ for (uline, vline) in u.chunks(stride1).rev().zip(v.chunks(stride2).rev()) {
+ ofile.write_all(&uline[..w2]).unwrap();
+ ofile.write_all(pad.as_slice()).unwrap();
+
+ ofile.write_all(&vline[..w2]).unwrap();
+ ofile.write_all(pad.as_slice()).unwrap();
+ }
}
} else {
- for (uline, vline) in u.chunks(stride1).rev().zip(v.chunks(stride2).rev()) {
- ofile.write_all(&uline[..w2]).unwrap();
- ofile.write_all(pad.as_slice()).unwrap();
-
- ofile.write_all(&vline[..w2]).unwrap();
- ofile.write_all(pad.as_slice()).unwrap();
+ if !is_flipped {
+ for uline in u.chunks(stride1) {
+ ofile.write_all(&uline[..w2]).unwrap();
+ ofile.write_all(pad.as_slice()).unwrap();
+ }
+ for vline in v.chunks(stride2) {
+ ofile.write_all(&vline[..w2]).unwrap();
+ ofile.write_all(pad.as_slice()).unwrap();
+ }
+ } else {
+ for uline in u.chunks(stride1).rev() {
+ ofile.write_all(&uline[..w2]).unwrap();
+ ofile.write_all(pad.as_slice()).unwrap();
+ }
+ for vline in v.chunks(stride2).rev() {
+ ofile.write_all(&vline[..w2]).unwrap();
+ ofile.write_all(pad.as_slice()).unwrap();
+ }
}
}
if has_alpha {