#![deny(missing_docs)]
pub mod cbdt;
pub mod sbix;
use num_traits as num;
use crate::error::ParseError;
use alloc::boxed::Box;
#[derive(Debug, PartialEq, Eq, Copy, Clone, PartialOrd)]
pub enum BitDepth {
One = 1,
Two = 2,
Four = 4,
Eight = 8,
ThirtyTwo = 32,
}
pub struct BitmapGlyph {
pub ppem_x: Option<u16>,
pub ppem_y: Option<u16>,
pub metrics: Metrics,
pub bitmap: Bitmap,
}
#[allow(missing_docs)]
pub enum Bitmap {
Embedded(EmbeddedBitmap),
Encapsulated(EncapsulatedBitmap),
}
pub struct EmbeddedBitmap {
pub width: u8,
pub height: u8,
pub format: BitDepth,
pub data: Box<[u8]>,
}
pub struct EncapsulatedBitmap {
pub format: EncapsulatedFormat,
pub data: Box<[u8]>,
}
#[allow(missing_docs)]
pub enum EncapsulatedFormat {
Jpeg,
Png,
Tiff,
Svg,
Other(u32),
}
pub enum Metrics {
Embedded(EmbeddedMetrics),
HmtxVmtx(OriginOffset),
}
#[derive(Debug)]
pub struct OriginOffset {
pub x: i16,
pub y: i16,
}
#[derive(Debug)]
pub struct EmbeddedMetrics {
pub ppem_x: u8,
pub ppem_y: u8,
hori: Option<BitmapMetrics>,
vert: Option<BitmapMetrics>,
}
#[derive(Debug)]
pub struct BitmapMetrics {
pub origin_offset_x: i16,
pub origin_offset_y: i16,
pub advance: u8,
pub ascender: i8,
pub descender: i8,
}
impl EmbeddedMetrics {
fn new(
ppem_x: u8,
ppem_y: u8,
hori: Option<BitmapMetrics>,
vert: Option<BitmapMetrics>,
) -> Result<Self, ParseError> {
if hori.is_none() && vert.is_none() {
return Err(ParseError::MissingValue);
}
Ok(EmbeddedMetrics {
ppem_x,
ppem_y,
hori,
vert,
})
}
pub fn hori(&self) -> Option<&BitmapMetrics> {
self.hori.as_ref()
}
pub fn vert(&self) -> Option<&BitmapMetrics> {
self.vert.as_ref()
}
}
fn bigger_or_closer_to_zero<V>(value: V, current_best: V) -> bool
where
V: PartialOrd + num::Signed + num::Zero,
{
if value == V::zero() {
return true;
} else if current_best == V::zero() {
return false;
}
match (current_best.is_positive(), value.is_positive()) {
(true, true) if value < current_best => true,
(true, false) => false,
(false, true) => true,
(false, false) if value > current_best => true,
_ => false,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_bigger_or_closer_to_zero() {
assert!(bigger_or_closer_to_zero(0, -1));
assert!(bigger_or_closer_to_zero(0, 0));
assert!(bigger_or_closer_to_zero(0, 1));
assert!(!bigger_or_closer_to_zero(-1, 0));
assert!(!bigger_or_closer_to_zero(1, 0));
assert!(bigger_or_closer_to_zero(10, -5)); assert!(bigger_or_closer_to_zero(-2, -5)); assert!(!bigger_or_closer_to_zero(-7, -5));
assert!(bigger_or_closer_to_zero(2, 5)); assert!(!bigger_or_closer_to_zero(-2, 5)); assert!(!bigger_or_closer_to_zero(7, 5));
}
}