packed-font 0.1.0

Compile-time font rasterizer and packer for embedded systems
Documentation
use core::iter::Fuse;

use packed_font_structs::{AA_BITS, AaColor};

pub struct Unpacker<I> {
    packed: Fuse<I>,
    covered: bool,
    count: i16,
}

impl<I> Unpacker<I>
where
    I: Iterator<Item = u8>,
{
    pub fn new(packed: I) -> Self {
        let mut packed = packed.fuse();
        let count = packed.next().unwrap_or(0) as i16;
        Self {
            packed,
            covered: false,
            count,
        }
    }
}

impl<I> Iterator for Unpacker<I>
where
    I: Iterator<Item = u8>,
{
    type Item = AaColor;
    fn next(&mut self) -> Option<Self::Item> {
        const MAX: u8 = 255 >> (8 - AA_BITS);
        loop {
            if self.count > 0 {
                let coverage = if self.count < MAX as i16 {
                    self.count.try_into().unwrap()
                } else {
                    MAX
                };
                self.count -= MAX as i16;
                break Some(AaColor::new(if self.covered {
                    coverage
                } else {
                    MAX - coverage
                }));
            } else {
                self.covered = !self.covered;
                let Some(count) = self.packed.next() else {
                    break None;
                };
                self.count += count as i16;
            }
        }
    }
}