mplusfonts-macros 0.3.4

Procedural macros re-exported in the mplusfonts crate
Documentation
use swash::zeno::{Fill, Vector};

use crate::mplus::bitmap::units::Grid;

use super::render_image;
use super::{Block, BlockList, GlyphMetrics, ImageCluster, MapIndex, Points};

macro_rules! def_unicode_char {
    (
        $(
            $fn_ident:ident,
            $max_y:literal $(* $max_x:literal)?,
            [$($delta_index:expr),*] $(- $start_index:expr)?,
        )*
    ) => {
        $(
            pub fn $fn_ident(glyph_metrics: &GlyphMetrics, offset: Vector) -> ImageCluster {
                const MAX_X: usize = 1 $(* $max_x)?;
                const MAX_Y: usize = $max_y;

                let Grid(points) = &glyph_metrics.block;
                let start_index = 0 $(+ $start_index)?;
                let blocks = [$($delta_index - start_index),*].map(|index| {
                    let x0_index = 0 $(+ index % $max_x)?;
                    let x1_index = x0_index + 1;
                    let y0_index = index $(/ $max_x)?;
                    let y1_index = y0_index + 1;

                    let x0_index = Points::map_index::<MAX_X>(x0_index);
                    let x1_index = Points::map_index::<MAX_X>(x1_index);
                    let y0_index = Points::map_index::<MAX_Y>(y0_index);
                    let y1_index = Points::map_index::<MAX_Y>(y1_index);

                    Block(points[y0_index][x0_index] + offset, points[y1_index][x1_index] + offset)
                });

                let blocks = BlockList::from(blocks);
                let image = render_image(&blocks, Fill::NonZero);

                Vec::from([image])
            }
        )*
    }
}

def_unicode_char! {
    quadrant_upper_left, 2 * 2, [1] - 1,
    quadrant_lower_left, 2 * 2, [3] - 1,
    quadrant_upper_left_and_lower_right, 2 * 2, [1, 4] - 1,

    quadrant_upper_right, 2 * 2, [2] - 1,
    quadrant_lower_right, 2 * 2, [4] - 1,
    quadrant_upper_right_and_lower_left, 2 * 2, [2, 3] - 1,

    quadrant_upper_left_and_upper_right_and_lower_left, 2 * 2, [1, 2, 3] - 1,
    quadrant_upper_left_and_upper_right_and_lower_right, 2 * 2, [1, 2, 4] - 1,
    quadrant_upper_left_and_lower_left_and_lower_right, 2 * 2, [1, 3, 4] - 1,
    quadrant_upper_right_and_lower_left_and_lower_right, 2 * 2, [2, 3, 4] - 1,

    upper_left_one_sixteenth_block, 4 * 4, [1] - 1,
    upper_centre_left_one_sixteenth_block, 4 * 4, [2] - 1,
    upper_centre_right_one_sixteenth_block, 4 * 4, [3] - 1,
    upper_right_one_sixteenth_block, 4 * 4, [4] - 1,

    upper_middle_left_one_sixteenth_block, 4 * 4, [5] - 1,
    upper_middle_centre_left_one_sixteenth_block, 4 * 4, [6] - 1,
    upper_middle_centre_right_one_sixteenth_block, 4 * 4, [7] - 1,
    upper_middle_right_one_sixteenth_block, 4 * 4, [8] - 1,

    lower_middle_left_one_sixteenth_block, 4 * 4, [9] - 1,
    lower_middle_centre_left_one_sixteenth_block, 4 * 4, [10] - 1,
    lower_middle_centre_right_one_sixteenth_block, 4 * 4, [11] - 1,
    lower_middle_right_one_sixteenth_block, 4 * 4, [12] - 1,

    lower_left_one_sixteenth_block, 4 * 4, [13] - 1,
    lower_centre_left_one_sixteenth_block, 4 * 4, [14] - 1,
    lower_centre_right_one_sixteenth_block, 4 * 4, [15] - 1,
    lower_right_one_sixteenth_block, 4 * 4, [16] - 1,

    right_half_lower_one_quarter_block, 4 * 2, [8] - 1,
    right_three_quarters_lower_one_quarter_block, 4 * 4, [6, 7, 8] - 1,
    left_three_quarters_lower_one_quarter_block, 4 * 4, [5, 6, 7] - 1,
    left_half_lower_one_quarter_block, 4 * 2, [7] - 1,

    lower_half_left_one_quarter_block, 2 * 4, [5] - 1,
    lower_three_quarters_left_one_quarter_block, 4 * 4, [5, 9, 13] - 1,
    upper_three_quarters_left_one_quarter_block, 4 * 4, [1, 5, 9] - 1,
    upper_half_left_one_quarter_block, 2 * 4, [1] - 1,

    left_half_upper_one_quarter_block, 4 * 2, [1] - 1,
    left_three_quarters_upper_one_quarter_block, 4 * 4, [1, 2, 3] - 1,
    right_three_quarters_upper_one_quarter_block, 4 * 4, [2, 3, 4] - 1,
    right_half_upper_one_quarter_block, 4 * 2, [2] - 1,

    lower_half_right_one_quarter_block, 2 * 4, [8] - 1,
    lower_three_quarters_right_one_quarter_block, 4 * 4, [8, 12, 16] - 1,
    upper_three_quarters_right_one_quarter_block, 4 * 4, [4, 8, 12] - 1,
    upper_half_right_one_quarter_block, 2 * 4, [4] - 1,

    upper_centre_one_quarter_block, 2 * 4, [2, 3] - 1,
    lower_centre_one_quarter_block, 2 * 4, [6, 7] - 1,
    middle_left_one_quarter_block, 4 * 2, [3, 5] - 1,
    middle_right_one_quarter_block, 4 * 2, [4, 6] - 1,

    checker_board_fill, 4 * 4, [1, 3, 6, 8, 9, 11, 14, 16] - 1,
    inverse_checker_board_fill, 4 * 4, [2, 4, 5, 7, 10, 12, 13, 15] - 1,

    heavy_horizontal_fill, 4, [2, 4] - 1,
}