read_fonts/tables/
postscript.rsuse std::fmt;
mod blend;
mod fd_select;
mod index;
mod stack;
mod string;
pub mod charstring;
pub mod dict;
include!("../../generated/generated_postscript.rs");
pub use blend::BlendState;
pub use index::Index;
pub use stack::{Number, Stack};
pub use string::{Latin1String, StringId, STANDARD_STRINGS};
#[derive(Clone, Debug)]
pub enum Error {
InvalidIndexOffsetSize(u8),
ZeroOffsetInIndex,
InvalidVariationStoreIndex(u16),
StackOverflow,
StackUnderflow,
InvalidStackAccess(usize),
ExpectedI32StackEntry(usize),
InvalidNumber,
InvalidDictOperator(u8),
InvalidCharstringOperator(u8),
CharstringNestingDepthLimitExceeded,
MissingSubroutines,
MissingBlendState,
MissingPrivateDict,
MissingCharstrings,
Read(ReadError),
}
impl From<ReadError> for Error {
fn from(value: ReadError) -> Self {
Self::Read(value)
}
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::InvalidIndexOffsetSize(size) => {
write!(f, "invalid offset size of {size} for INDEX (expected 1-4)")
}
Self::ZeroOffsetInIndex => {
write!(f, "invalid offset of 0 in INDEX (must be >= 1)")
}
Self::InvalidVariationStoreIndex(index) => {
write!(
f,
"variation store index {index} referenced an invalid variation region"
)
}
Self::StackOverflow => {
write!(f, "attempted to push a value to a full stack")
}
Self::StackUnderflow => {
write!(f, "attempted to pop a value from an empty stack")
}
Self::InvalidStackAccess(index) => {
write!(f, "invalid stack access for index {index}")
}
Self::ExpectedI32StackEntry(index) => {
write!(f, "attempted to read an integer at stack index {index}, but found a fixed point value")
}
Self::InvalidNumber => {
write!(f, "number is in an invalid format")
}
Self::InvalidDictOperator(operator) => {
write!(f, "dictionary operator {operator} is invalid")
}
Self::InvalidCharstringOperator(operator) => {
write!(f, "charstring operator {operator} is invalid")
}
Self::CharstringNestingDepthLimitExceeded => {
write!(
f,
"exceeded subroutine nesting depth limit {} while evaluating a charstring",
charstring::NESTING_DEPTH_LIMIT
)
}
Self::MissingSubroutines => {
write!(
f,
"encountered a callsubr operator but no subroutine index was provided"
)
}
Self::MissingBlendState => {
write!(
f,
"encountered a blend operator but no blend state was provided"
)
}
Self::MissingPrivateDict => {
write!(f, "CFF table does not contain a private dictionary")
}
Self::MissingCharstrings => {
write!(f, "CFF table does not contain a charstrings index")
}
Self::Read(err) => write!(f, "{err}"),
}
}
}