katana-document-viewer 0.1.4

KatanA document viewer artifact, render evaluation, and export foundation.
Documentation
use crate::export_surface_helpers::SurfaceHelpers;
use image::RgbaImage;

use super::super::{ALERT_ICON_SIZE, TASK_MARKER_SIZE};
use super::icons_constants::STROKE_PIXEL_SIZE;
use super::icons_constants::{
    ALERT_TITLE_TEXT_TOP_MARGIN, CHECK_MARK_DOT_COUNT, CHECK_MARK_DOT_OFFSET1,
    CHECK_MARK_DOT_OFFSET2, CHECK_MARK_DOT_OFFSET3, CHECK_MARK_DOT_SIZE, CHECK_MARK_DOT_Y_BOTTOM,
    CHECK_MARK_DOT_Y_MIDDLE, CHECK_MARK_DOT_Y_TOP, CHECKMARK_DIAGONAL_PADDING,
    TASK_MARKER_DIAGONAL_X_OFFSET, TASK_MARKER_DIAGONAL_Y_OFFSET,
};

pub(super) fn draw_check_mark(image: &mut RgbaImage, x: u32, y: u32, color: image::Rgba<u8>) {
    for offset in 0..CHECK_MARK_DOT_COUNT {
        SurfaceHelpers::fill_rect(
            image,
            x + CHECK_MARK_DOT_OFFSET1 + offset,
            y + CHECK_MARK_DOT_Y_TOP + offset,
            CHECK_MARK_DOT_SIZE,
            CHECK_MARK_DOT_SIZE,
            color,
        );
        SurfaceHelpers::fill_rect(
            image,
            x + CHECK_MARK_DOT_OFFSET2 + offset,
            y + CHECK_MARK_DOT_Y_MIDDLE - offset,
            CHECK_MARK_DOT_SIZE,
            CHECK_MARK_DOT_SIZE,
            color,
        );
        SurfaceHelpers::fill_rect(
            image,
            x + CHECK_MARK_DOT_OFFSET3 + offset,
            y + CHECK_MARK_DOT_Y_BOTTOM - offset,
            CHECK_MARK_DOT_SIZE,
            CHECK_MARK_DOT_SIZE,
            color,
        );
    }
}

pub(super) fn draw_diagonal_mark(image: &mut RgbaImage, x: u32, y: u32, color: image::Rgba<u8>) {
    for offset in 0..TASK_MARKER_SIZE - CHECKMARK_DIAGONAL_PADDING {
        SurfaceHelpers::fill_rect(
            image,
            x + TASK_MARKER_DIAGONAL_X_OFFSET + offset,
            y + TASK_MARKER_SIZE - TASK_MARKER_DIAGONAL_Y_OFFSET - offset,
            STROKE_PIXEL_SIZE,
            STROKE_PIXEL_SIZE,
            color,
        );
    }
}

pub(super) fn alert_title_icon_y(line_y: u32, line_height: u32) -> u32 {
    let centered_y = line_height.saturating_sub(ALERT_ICON_SIZE) / 2;
    line_y + centered_y.saturating_sub(ALERT_TITLE_TEXT_TOP_MARGIN)
}