(&mut self, image: &mut Image, mut output_pixels: RowBitmapMut<'_, MaybeUninit<PalIndexRemap>>)
| 81 | |
| 82 | #[inline(never)] |
| 83 | pub(crate) fn write_remapped_image_rows_internal(&mut self, image: &mut Image, mut output_pixels: RowBitmapMut<'_, MaybeUninit<PalIndexRemap>>) -> Result<(), Error> { |
| 84 | let progress_stage1 = if self.use_dither_map != DitherMapMode::None { 20 } else { 0 }; |
| 85 | if self.remap_progress(progress_stage1 as f32 * 0.25) { |
| 86 | return Err(Error::Aborted); |
| 87 | } |
| 88 | |
| 89 | image.free_histogram_inputs(); |
| 90 | |
| 91 | let mut palette = self.palette.clone(); |
| 92 | let mut remapped = Box::new(Remapped { |
| 93 | int_palette: Palette { count: 0, entries: [RGBA::default(); MAX_COLORS] }, |
| 94 | palette_error: None, |
| 95 | }); |
| 96 | if self.dither_level == 0. { |
| 97 | palette.init_int_palette(&mut remapped.int_palette, self.gamma, self.min_posterization_output); |
| 98 | remapped.palette_error = Some(remap_to_palette(&mut image.px, image.background.as_deref_mut(), image.importance_map.as_deref(), &mut output_pixels, &mut palette)?.0); |
| 99 | } else { |
| 100 | let uses_background = image.background.is_some(); |
| 101 | let dither_map_error = Self::optionally_generate_dither_map(self.use_dither_map, image, uses_background, &mut output_pixels, &mut palette)?; |
| 102 | if self.remap_progress(progress_stage1 as f32 * 0.5) { |
| 103 | return Err(Error::Aborted); |
| 104 | } |
| 105 | |
| 106 | let output_image_is_remapped = dither_map_error.is_some(); |
| 107 | let palette_error = dither_map_error.or(self.palette_error); |
| 108 | |
| 109 | // remapping above was the last chance to do K-Means iteration, hence the final palette is set after remapping |
| 110 | palette.init_int_palette(&mut remapped.int_palette, self.gamma, self.min_posterization_output); |
| 111 | remapped.palette_error = palette_error; |
| 112 | let max_dither_error = (palette_error.unwrap_or(quality_to_mse(80)) * 2.4).max(quality_to_mse(35)) as f32; |
| 113 | remap_to_palette_floyd(image, output_pixels, &palette, self, max_dither_error, output_image_is_remapped)?; |
| 114 | } |
| 115 | self.remapped = Some(remapped); |
| 116 | Ok(()) |
| 117 | } |
| 118 | |
| 119 | fn optionally_generate_dither_map(use_dither_map: DitherMapMode, image: &mut Image<'_>, uses_background: bool, output_pixels: &mut RowBitmapMut<'_, MaybeUninit<PalIndexRemap>>, palette: &mut PalF) -> Result<Option<f64>, Error> { |
| 120 | let is_image_huge = (image.px.width * image.px.height) > 2000 * 2000; |
no test coverage detected