core: Clamp RGBA when un-multiplying alpha

Fixes some bad pixels sometimes appearing in decoded JPEGs (such
as in #437 and in Dad 'n' Me).
This commit is contained in:
Mike Welsh 2020-03-16 16:11:59 -07:00
parent 26914d7b62
commit c2ce9892b1
1 changed files with 3 additions and 3 deletions

View File

@ -336,9 +336,9 @@ pub fn unmultiply_alpha_rgba(rgba: &mut [u8]) {
rgba.chunks_exact_mut(4).for_each(|rgba| {
if rgba[3] > 0 {
let a = f32::from(rgba[3]) / 255.0;
rgba[0] = (f32::from(rgba[0]) / a) as u8;
rgba[1] = (f32::from(rgba[1]) / a) as u8;
rgba[2] = (f32::from(rgba[2]) / a) as u8;
rgba[0] = f32::min(f32::from(rgba[0]) / a, 255.0) as u8;
rgba[1] = f32::min(f32::from(rgba[1]) / a, 255.0) as u8;
rgba[2] = f32::min(f32::from(rgba[2]) / a, 255.0) as u8;
}
})
}