pub struct OriginTopLeft;
pub struct OriginTopRight;
mod private {
use core::ops::BitXor;
use embedded_graphics_core::{prelude::Point, primitives::Rectangle};
use crate::{AreaImgInfo, DevInfo};
pub trait Sealed {
fn transform(area_img_info: &mut AreaImgInfo, dev_info: &DevInfo);
fn bit_and_byte_pos(
area: &Rectangle,
point: Point,
nibbles_per_row: usize,
row: usize,
start_row: usize,
) -> (usize, i32);
}
impl Sealed for super::OriginTopLeft {
#[inline(always)]
fn transform(_: &mut AreaImgInfo, _: &DevInfo) {
}
#[inline(always)]
fn bit_and_byte_pos(
area: &Rectangle,
point: Point,
nibbles_per_row: usize,
row: usize,
start_row: usize,
) -> (usize, i32) {
let u16_pos = ((point.x - (area.top_left.x / 4 * 4)) / 2) as usize
+ nibbles_per_row * (row - start_row);
let byte_pos = u16_pos.bitxor(0x00001);
let bit_pos = (point.x % 2) * 4;
(byte_pos, bit_pos)
}
}
impl Sealed for super::OriginTopRight {
#[inline(always)]
fn transform(area_img_info: &mut AreaImgInfo, dev_info: &DevInfo) {
area_img_info.area_x =
dev_info.panel_width - area_img_info.area_x - area_img_info.area_w;
}
#[inline(always)]
fn bit_and_byte_pos(
area: &Rectangle,
point: Point,
nibbles_per_row: usize,
row: usize,
start_row: usize,
) -> (usize, i32) {
let u16_pos =
nibbles_per_row - 1 - ((point.x - (area.top_left.x / 4 * 4)) / 2) as usize
+ nibbles_per_row * (row - start_row);
let byte_pos = u16_pos.bitxor(0x00001);
let bit_pos = ((point.x + 1) % 2) * 4;
(byte_pos, bit_pos)
}
}
}
pub trait Origin: private::Sealed {}
impl Origin for OriginTopLeft {}
impl Origin for OriginTopRight {}