pic 0.1.4

Preview Image in CLI.
Documentation
use crate::options::Options;
use crate::result::Result;
use crate::utils::{fit_in_bounds, handle_spacing, move_cursor, TermSize};
use sixel_rs::encoder::Encoder;
use sixel_rs::optflags::{EncodePolicy, ResampleMethod, SizeSpecification::Pixel};
use std::io::Write;
use std::path::PathBuf;

pub fn display(stdout: &mut impl Write, image_path: &PathBuf, options: &Options) -> Result {
    let image_size = imagesize::size(image_path)?;
    let (width, height) = (image_size.width as u32, image_size.height as u32);
    let (cols, rows) = fit_in_bounds(width, height, options.cols, options.rows, options.upscale)?;

    let term_size = TermSize::from_ioctl()?;
    let (col_size, row_size) = match term_size.get_cell_size() {
        Some((0, 0)) | None => (15, 30),
        Some((c, r)) => (c, r),
    };

    let encoder = Encoder::new()?;
    encoder.set_width(Pixel(u64::from(cols * col_size)))?;
    encoder.set_height(Pixel(u64::from(rows * row_size)))?;
    encoder.set_resampling(ResampleMethod::Nearest)?;
    encoder.set_encode_policy(EncodePolicy::Fast)?;
    if options.gif_static {
        encoder.use_static()?;
    };

    move_cursor(stdout, options.x, options.y)?;
    encoder.encode_file(image_path)?;
    stdout.flush()?;

    Ok(())
}

pub fn preview(stdout: &mut impl Write, image_path: &PathBuf, options: &Options) -> Result {
    display(stdout, image_path, options)?;
    handle_spacing(stdout, options.spacing)?;
    Ok(())
}