MCPcopy Create free account
hub / github.com/ImageOptim/libimagequant / write_remapped_image_rows_internal

Method write_remapped_image_rows_internal

src/quant.rs:83–117  ·  view source on GitHub ↗
(&mut self, image: &mut Image, mut output_pixels: RowBitmapMut<'_, MaybeUninit<PalIndexRemap>>)

Source from the content-addressed store, hash-verified

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;

Callers 3

remap_intoMethod · 0.80

Calls 8

newFunction · 0.85
remap_to_paletteFunction · 0.85
quality_to_mseFunction · 0.85
remap_to_palette_floydFunction · 0.85
remap_progressMethod · 0.80
init_int_paletteMethod · 0.80
free_histogram_inputsMethod · 0.45
cloneMethod · 0.45

Tested by

no test coverage detected