Skip to content

Commit

Permalink
Implement a proper clampbits
Browse files Browse the repository at this point in the history
The C++ conversion to rust was just broken. Implement it naively and
maybe later we can find a fast way of doing it.
  • Loading branch information
pedrocr committed Nov 2, 2020
1 parent e93e0db commit 46d5208
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 22 deletions.
11 changes: 6 additions & 5 deletions src/decoders/basics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,13 @@ use rayon::prelude::*;
pub use crate::decoders::packed::*;
pub use crate::decoders::pumps::*;

pub fn clampbits(val: i32, bits: u32) -> i32 {
let temp = val >> bits;
if temp != 0 {
!temp >> (32-bits)
pub fn clampbits(val: i32, bits: u32) -> u16 {
if val < 0 {
0
} else if val > (1 << bits) {
1 << bits
} else {
val
val as u16
}
}

Expand Down
6 changes: 3 additions & 3 deletions src/decoders/cr2.rs
Original file line number Diff line number Diff line change
Expand Up @@ -196,9 +196,9 @@ impl<'a> Cr2Decoder<'a> {
let g = c2 * (y + ((-778*cb - (cr<<11)) >> 12));
let b = c3 * (y + cb);

pix[0] = clampbits(r >> 8, 16) as u16;
pix[1] = clampbits(g >> 8, 16) as u16;
pix[2] = clampbits(b >> 8, 16) as u16;
pix[0] = clampbits(r >> 8, 16);
pix[1] = clampbits(g >> 8, 16);
pix[2] = clampbits(b >> 8, 16);
}
Ok(())
}
Expand Down
26 changes: 13 additions & 13 deletions src/decoders/nef.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ lazy_static! {
} else {
((v+f)/(1.0+f)).powf(g)
};
clampbits((res*65535.0*4.0) as i32, 16) as u16
clampbits((res*65535.0*4.0) as i32, 16)
}).collect::<Vec<u16>>();
LookupTable::new(&curve)
};
Expand Down Expand Up @@ -324,8 +324,8 @@ impl<'a> NefDecoder<'a> {
pred_left1 += htable.huff_decode_nef(&mut pump)?;
pred_left2 += htable.huff_decode_nef(&mut pump)?;
}
out[row*width+col+0] = curve.dither(clampbits(pred_left1,15) as u16, &mut random);
out[row*width+col+1] = curve.dither(clampbits(pred_left2,15) as u16, &mut random);
out[row*width+col+0] = curve.dither(clampbits(pred_left1,14), &mut random);
out[row*width+col+1] = curve.dither(clampbits(pred_left2,14), &mut random);
}
}

Expand Down Expand Up @@ -356,21 +356,21 @@ impl<'a> NefDecoder<'a> {
let cb = (g4 | ((g5 & 0x0f) << 8)) as f32 - 2048.0;
let cr = ((g5 >> 4) | (g6 << 4)) as f32 - 2048.0;

let r = SNEF_CURVE.dither(clampbits((y1 + 1.370705 * cr) as i32, 12) as u16, &mut random);
let g = SNEF_CURVE.dither(clampbits((y1 - 0.337633 * cb - 0.698001 * cr) as i32, 12) as u16, &mut random);
let b = SNEF_CURVE.dither(clampbits((y1 + 1.732446 * cb) as i32, 12) as u16, &mut random);
let r = SNEF_CURVE.dither(clampbits((y1 + 1.370705 * cr) as i32, 12), &mut random);
let g = SNEF_CURVE.dither(clampbits((y1 - 0.337633 * cb - 0.698001 * cr) as i32, 12), &mut random);
let b = SNEF_CURVE.dither(clampbits((y1 + 1.732446 * cb) as i32, 12), &mut random);
// invert the white balance
o[0] = clampbits((inv_wb_r * r as i32 + (1<<9)) >> 10, 15) as u16;
o[0] = clampbits((inv_wb_r * r as i32 + (1<<9)) >> 10, 15);
o[1] = g;
o[2] = clampbits((inv_wb_b * b as i32 + (1<<9)) >> 10, 15) as u16;
o[2] = clampbits((inv_wb_b * b as i32 + (1<<9)) >> 10, 15);

let r = SNEF_CURVE.dither(clampbits((y2 + 1.370705 * cr) as i32, 12) as u16, &mut random);
let g = SNEF_CURVE.dither(clampbits((y2 - 0.337633 * cb - 0.698001 * cr) as i32, 12) as u16, &mut random);
let b = SNEF_CURVE.dither(clampbits((y2 + 1.732446 * cb) as i32, 12) as u16, &mut random);
let r = SNEF_CURVE.dither(clampbits((y2 + 1.370705 * cr) as i32, 12), &mut random);
let g = SNEF_CURVE.dither(clampbits((y2 - 0.337633 * cb - 0.698001 * cr) as i32, 12), &mut random);
let b = SNEF_CURVE.dither(clampbits((y2 + 1.732446 * cb) as i32, 12), &mut random);
// invert the white balance
o[3] = clampbits((inv_wb_r * r as i32 + (1<<9)) >> 10, 15) as u16;
o[3] = clampbits((inv_wb_r * r as i32 + (1<<9)) >> 10, 15);
o[4] = g;
o[5] = clampbits((inv_wb_b * b as i32 + (1<<9)) >> 10, 15) as u16;
o[5] = clampbits((inv_wb_b * b as i32 + (1<<9)) >> 10, 15);
}
}))
}
Expand Down
2 changes: 1 addition & 1 deletion src/decoders/srw.rs
Original file line number Diff line number Diff line change
Expand Up @@ -366,7 +366,7 @@ impl<'a> SrwDecoder<'a> {
} else {
((i&0x7) << 1) + (i>>3)
} + img + col;
out[pos] = clampbits((out[pos] as i32) + diff, bit_depth) as u16;
out[pos] = clampbits((out[pos] as i32) + diff, bit_depth);
}
}
}
Expand Down

0 comments on commit 46d5208

Please sign in to comment.