+fn sine_encode(mut img: RgbImage, wave_offset: (u32, u32), amplitude: f32, freq_base: f32, run: u32, wave_color: Rgb<u8>,
+ data: &mut dyn Iterator<Item = u8>) -> Result<RgbImage, ImageError>
+{
+ let run: f32 = run as f32;
+ let (wave_offset_x, wave_offset_y) = wave_offset;
+ let (wave_offset_x, wave_offset_y) = (wave_offset_x as f32, wave_offset_y as f32);
+ let signal = &mut data.peekable();
+ let mut x: f32 = wave_offset_x as f32;
+ let max_x: f32 = (img.width() - 1) as f32;
+ let max_y: f32 = img.height() as f32;
+ while signal.peek().is_some() && (x < max_x) {
+ let px = x;
+ let s = signal.next().unwrap_or(0);
+ while ((x - px) < run) && (x < max_x) {
+ let y = if s != 0 {
+ (2.0 * PI * freq_base * x * s as f32).sin() * amplitude + wave_offset_y
+ }
+ else { wave_offset_y };
+ x += 0.001;
+ if (y > 0.0) && (y < max_y) {
+ img.put_pixel(x as u32, y as u32, wave_color);
+ }
+ }
+ }
+ Ok(img)
+}
+