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, [$($delta_index:expr),*] $(- $start_index:expr)?,
)*
) => {
$(
pub fn $fn_ident(glyph_metrics: &GlyphMetrics, offset: Vector) -> ImageCluster {
let Grid(points) = &glyph_metrics.block;
let start_index = 0 $(+ $start_index)?;
let blocks = [$($delta_index - start_index),*].map(|index| {
let x0_index = index % 2;
let x1_index = x0_index + 1;
let y0_index = index / 2;
let y1_index = y0_index + 1;
let x0_index = Points::map_index::<2>(x0_index);
let x1_index = Points::map_index::<2>(x1_index);
let y0_index = Points::map_index::<4>(y0_index);
let y1_index = Points::map_index::<4>(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! {
block_octant_3, [3] - 1,
block_octant_4, [4] - 1,
block_octant_5, [5] - 1,
block_octant_6, [6] - 1,
block_octant_14, [1, 4] - 1,
block_octant_15, [1, 5] - 1,
block_octant_16, [1, 6] - 1,
block_octant_17, [1, 7] - 1,
block_octant_18, [1, 8] - 1,
block_octant_23, [2, 3] - 1,
block_octant_25, [2, 5] - 1,
block_octant_26, [2, 6] - 1,
block_octant_27, [2, 7] - 1,
block_octant_28, [2, 8] - 1,
block_octant_34, [3, 4] - 1,
block_octant_36, [3, 6] - 1,
block_octant_37, [3, 7] - 1,
block_octant_38, [3, 8] - 1,
block_octant_45, [4, 5] - 1,
block_octant_47, [4, 7] - 1,
block_octant_48, [4, 8] - 1,
block_octant_56, [5, 6] - 1,
block_octant_58, [5, 8] - 1,
block_octant_67, [6, 7] - 1,
block_octant_123, [1, 2, 3] - 1,
block_octant_124, [1, 2, 4] - 1,
block_octant_125, [1, 2, 5] - 1,
block_octant_126, [1, 2, 6] - 1,
block_octant_127, [1, 2, 7] - 1,
block_octant_128, [1, 2, 8] - 1,
block_octant_134, [1, 3, 4] - 1,
block_octant_135, [1, 3, 5] - 1,
block_octant_136, [1, 3, 6] - 1,
block_octant_137, [1, 3, 7] - 1,
block_octant_138, [1, 3, 8] - 1,
block_octant_145, [1, 4, 5] - 1,
block_octant_146, [1, 4, 6] - 1,
block_octant_147, [1, 4, 7] - 1,
block_octant_148, [1, 4, 8] - 1,
block_octant_156, [1, 5, 6] - 1,
block_octant_157, [1, 5, 7] - 1,
block_octant_158, [1, 5, 8] - 1,
block_octant_167, [1, 6, 7] - 1,
block_octant_168, [1, 6, 8] - 1,
block_octant_178, [1, 7, 8] - 1,
block_octant_234, [2, 3, 4] - 1,
block_octant_235, [2, 3, 5] - 1,
block_octant_236, [2, 3, 6] - 1,
block_octant_237, [2, 3, 7] - 1,
block_octant_238, [2, 3, 8] - 1,
block_octant_245, [2, 4, 5] - 1,
block_octant_246, [2, 4, 6] - 1,
block_octant_247, [2, 4, 7] - 1,
block_octant_248, [2, 4, 8] - 1,
block_octant_256, [2, 5, 6] - 1,
block_octant_257, [2, 5, 7] - 1,
block_octant_258, [2, 5, 8] - 1,
block_octant_267, [2, 6, 7] - 1,
block_octant_268, [2, 6, 8] - 1,
block_octant_278, [2, 7, 8] - 1,
block_octant_345, [3, 4, 5] - 1,
block_octant_346, [3, 4, 6] - 1,
block_octant_347, [3, 4, 7] - 1,
block_octant_348, [3, 4, 8] - 1,
block_octant_356, [3, 5, 6] - 1,
block_octant_357, [3, 5, 7] - 1,
block_octant_358, [3, 5, 8] - 1,
block_octant_367, [3, 6, 7] - 1,
block_octant_368, [3, 6, 8] - 1,
block_octant_378, [3, 7, 8] - 1,
block_octant_456, [4, 5, 6] - 1,
block_octant_457, [4, 5, 7] - 1,
block_octant_458, [4, 5, 8] - 1,
block_octant_467, [4, 6, 7] - 1,
block_octant_468, [4, 6, 8] - 1,
block_octant_478, [4, 7, 8] - 1,
block_octant_567, [5, 6, 7] - 1,
block_octant_568, [5, 6, 8] - 1,
block_octant_578, [5, 7, 8] - 1,
block_octant_678, [6, 7, 8] - 1,
block_octant_1235, [1, 2, 3, 5] - 1,
block_octant_1236, [1, 2, 3, 6] - 1,
block_octant_1237, [1, 2, 3, 7] - 1,
block_octant_1238, [1, 2, 3, 8] - 1,
block_octant_1245, [1, 2, 4, 5] - 1,
block_octant_1246, [1, 2, 4, 6] - 1,
block_octant_1247, [1, 2, 4, 7] - 1,
block_octant_1248, [1, 2, 4, 8] - 1,
block_octant_1256, [1, 2, 5, 6] - 1,
block_octant_1257, [1, 2, 5, 7] - 1,
block_octant_1258, [1, 2, 5, 8] - 1,
block_octant_1267, [1, 2, 6, 7] - 1,
block_octant_1268, [1, 2, 6, 8] - 1,
block_octant_1278, [1, 2, 7, 8] - 1,
block_octant_1345, [1, 3, 4, 5] - 1,
block_octant_1346, [1, 3, 4, 6] - 1,
block_octant_1347, [1, 3, 4, 7] - 1,
block_octant_1348, [1, 3, 4, 8] - 1,
block_octant_1356, [1, 3, 5, 6] - 1,
block_octant_1358, [1, 3, 5, 8] - 1,
block_octant_1367, [1, 3, 6, 7] - 1,
block_octant_1378, [1, 3, 7, 8] - 1,
block_octant_1456, [1, 4, 5, 6] - 1,
block_octant_1457, [1, 4, 5, 7] - 1,
block_octant_1458, [1, 4, 5, 8] - 1,
block_octant_1467, [1, 4, 6, 7] - 1,
block_octant_1468, [1, 4, 6, 8] - 1,
block_octant_1478, [1, 4, 7, 8] - 1,
block_octant_1567, [1, 5, 6, 7] - 1,
block_octant_1568, [1, 5, 6, 8] - 1,
block_octant_1578, [1, 5, 7, 8] - 1,
block_octant_1678, [1, 6, 7, 8] - 1,
block_octant_2345, [2, 3, 4, 5] - 1,
block_octant_2346, [2, 3, 4, 6] - 1,
block_octant_2347, [2, 3, 4, 7] - 1,
block_octant_2348, [2, 3, 4, 8] - 1,
block_octant_2356, [2, 3, 5, 6] - 1,
block_octant_2357, [2, 3, 5, 7] - 1,
block_octant_2358, [2, 3, 5, 8] - 1,
block_octant_2367, [2, 3, 6, 7] - 1,
block_octant_2368, [2, 3, 6, 8] - 1,
block_octant_2378, [2, 3, 7, 8] - 1,
block_octant_2456, [2, 4, 5, 6] - 1,
block_octant_2458, [2, 4, 5, 8] - 1,
block_octant_2467, [2, 4, 6, 7] - 1,
block_octant_2478, [2, 4, 7, 8] - 1,
block_octant_2567, [2, 5, 6, 7] - 1,
block_octant_2568, [2, 5, 6, 8] - 1,
block_octant_2578, [2, 5, 7, 8] - 1,
block_octant_2678, [2, 6, 7, 8] - 1,
block_octant_3456, [3, 4, 5, 6] - 1,
block_octant_3457, [3, 4, 5, 7] - 1,
block_octant_3458, [3, 4, 5, 8] - 1,
block_octant_3467, [3, 4, 6, 7] - 1,
block_octant_3468, [3, 4, 6, 8] - 1,
block_octant_3478, [3, 4, 7, 8] - 1,
block_octant_3567, [3, 5, 6, 7] - 1,
block_octant_3568, [3, 5, 6, 8] - 1,
block_octant_3578, [3, 5, 7, 8] - 1,
block_octant_3678, [3, 6, 7, 8] - 1,
block_octant_4567, [4, 5, 6, 7] - 1,
block_octant_4568, [4, 5, 6, 8] - 1,
block_octant_4578, [4, 5, 7, 8] - 1,
block_octant_4678, [4, 6, 7, 8] - 1,
block_octant_12345, [1, 2, 3, 4, 5] - 1,
block_octant_12346, [1, 2, 3, 4, 6] - 1,
block_octant_12347, [1, 2, 3, 4, 7] - 1,
block_octant_12348, [1, 2, 3, 4, 8] - 1,
block_octant_12356, [1, 2, 3, 5, 6] - 1,
block_octant_12357, [1, 2, 3, 5, 7] - 1,
block_octant_12358, [1, 2, 3, 5, 8] - 1,
block_octant_12367, [1, 2, 3, 6, 7] - 1,
block_octant_12368, [1, 2, 3, 6, 8] - 1,
block_octant_12378, [1, 2, 3, 7, 8] - 1,
block_octant_12456, [1, 2, 4, 5, 6] - 1,
block_octant_12457, [1, 2, 4, 5, 7] - 1,
block_octant_12458, [1, 2, 4, 5, 8] - 1,
block_octant_12467, [1, 2, 4, 6, 7] - 1,
block_octant_12468, [1, 2, 4, 6, 8] - 1,
block_octant_12478, [1, 2, 4, 7, 8] - 1,
block_octant_12567, [1, 2, 5, 6, 7] - 1,
block_octant_12568, [1, 2, 5, 6, 8] - 1,
block_octant_12578, [1, 2, 5, 7, 8] - 1,
block_octant_12678, [1, 2, 6, 7, 8] - 1,
block_octant_13456, [1, 3, 4, 5, 6] - 1,
block_octant_13457, [1, 3, 4, 5, 7] - 1,
block_octant_13458, [1, 3, 4, 5, 8] - 1,
block_octant_13467, [1, 3, 4, 6, 7] - 1,
block_octant_13468, [1, 3, 4, 6, 8] - 1,
block_octant_13478, [1, 3, 4, 7, 8] - 1,
block_octant_13567, [1, 3, 5, 6, 7] - 1,
block_octant_13568, [1, 3, 5, 6, 8] - 1,
block_octant_13578, [1, 3, 5, 7, 8] - 1,
block_octant_13678, [1, 3, 6, 7, 8] - 1,
block_octant_14567, [1, 4, 5, 6, 7] - 1,
block_octant_14568, [1, 4, 5, 6, 8] - 1,
block_octant_14578, [1, 4, 5, 7, 8] - 1,
block_octant_14678, [1, 4, 6, 7, 8] - 1,
block_octant_15678, [1, 5, 6, 7, 8] - 1,
block_octant_23456, [2, 3, 4, 5, 6] - 1,
block_octant_23457, [2, 3, 4, 5, 7] - 1,
block_octant_23458, [2, 3, 4, 5, 8] - 1,
block_octant_23467, [2, 3, 4, 6, 7] - 1,
block_octant_23468, [2, 3, 4, 6, 8] - 1,
block_octant_23478, [2, 3, 4, 7, 8] - 1,
block_octant_23567, [2, 3, 5, 6, 7] - 1,
block_octant_23568, [2, 3, 5, 6, 8] - 1,
block_octant_23578, [2, 3, 5, 7, 8] - 1,
block_octant_23678, [2, 3, 6, 7, 8] - 1,
block_octant_24567, [2, 4, 5, 6, 7] - 1,
block_octant_24568, [2, 4, 5, 6, 8] - 1,
block_octant_24578, [2, 4, 5, 7, 8] - 1,
block_octant_24678, [2, 4, 6, 7, 8] - 1,
block_octant_25678, [2, 5, 6, 7, 8] - 1,
block_octant_34567, [3, 4, 5, 6, 7] - 1,
block_octant_34568, [3, 4, 5, 6, 8] - 1,
block_octant_34578, [3, 4, 5, 7, 8] - 1,
block_octant_34678, [3, 4, 6, 7, 8] - 1,
block_octant_35678, [3, 5, 6, 7, 8] - 1,
block_octant_45678, [4, 5, 6, 7, 8] - 1,
block_octant_123458, [1, 2, 3, 4, 5, 8] - 1,
block_octant_123467, [1, 2, 3, 4, 6, 7] - 1,
block_octant_123478, [1, 2, 3, 4, 7, 8] - 1,
block_octant_123567, [1, 2, 3, 5, 6, 7] - 1,
block_octant_123568, [1, 2, 3, 5, 6, 8] - 1,
block_octant_123578, [1, 2, 3, 5, 7, 8] - 1,
block_octant_123678, [1, 2, 3, 6, 7, 8] - 1,
block_octant_124567, [1, 2, 4, 5, 6, 7] - 1,
block_octant_124568, [1, 2, 4, 5, 6, 8] - 1,
block_octant_124578, [1, 2, 4, 5, 7, 8] - 1,
block_octant_124678, [1, 2, 4, 6, 7, 8] - 1,
block_octant_125678, [1, 2, 5, 6, 7, 8] - 1,
block_octant_134567, [1, 3, 4, 5, 6, 7] - 1,
block_octant_134568, [1, 3, 4, 5, 6, 8] - 1,
block_octant_134578, [1, 3, 4, 5, 7, 8] - 1,
block_octant_134678, [1, 3, 4, 6, 7, 8] - 1,
block_octant_145678, [1, 4, 5, 6, 7, 8] - 1,
block_octant_234567, [2, 3, 4, 5, 6, 7] - 1,
block_octant_234568, [2, 3, 4, 5, 6, 8] - 1,
block_octant_234578, [2, 3, 4, 5, 7, 8] - 1,
block_octant_234678, [2, 3, 4, 6, 7, 8] - 1,
block_octant_235678, [2, 3, 5, 6, 7, 8] - 1,
block_octant_1234567, [1, 2, 3, 4, 5, 6, 7] - 1,
block_octant_1234568, [1, 2, 3, 4, 5, 6, 8] - 1,
block_octant_1234578, [1, 2, 3, 4, 5, 7, 8] - 1,
block_octant_1234678, [1, 2, 3, 4, 6, 7, 8] - 1,
block_octant_1235678, [1, 2, 3, 5, 6, 7, 8] - 1,
block_octant_1245678, [1, 2, 4, 5, 6, 7, 8] - 1,
block_octant_1345678, [1, 3, 4, 5, 6, 7, 8] - 1,
block_octant_2345678, [2, 3, 4, 5, 6, 7, 8] - 1,
}