use super::{DrawOptions, DrawnMetrics, PathSink};
use crate::model::Error;
use crate::{
model::glyph::outline::OutlineSource,
model::variation::NormalizedCoord,
ps::{
cff::{CffFontRef, Subfont},
charstring::{NopFilterSink, TransformSink},
},
types::{F2Dot14, GlyphId},
};
#[derive(Clone, Copy)]
pub struct CffGlyph<'a> {
pub(super) cff: &'a CffFontRef<'a>,
pub(super) coords: &'a [F2Dot14],
pub(super) glyph: GlyphId,
pub(super) subfont_index: u16,
pub(super) subfont: Subfont,
pub(super) source: OutlineSource,
}
impl<'a> CffGlyph<'a> {
pub fn glyph(&self) -> GlyphId {
self.glyph
}
pub fn source(&self) -> OutlineSource {
self.source
}
pub fn cff_font(&self) -> &'a CffFontRef<'a> {
self.cff
}
pub fn normalized_coords(&self) -> &'a [NormalizedCoord] {
self.coords
}
pub fn subfont_index(&self) -> u32 {
self.subfont_index as u32
}
pub fn subfont(&self) -> &Subfont {
&self.subfont
}
pub(super) fn draw(
&self,
options: &DrawOptions,
mut sink: &mut dyn PathSink,
) -> Result<DrawnMetrics, Error> {
let mut filter = NopFilterSink::new(&mut sink);
let transform = self.cff.transform(&self.subfont, options.ppem);
let mut transformer = TransformSink::new(&mut filter, transform);
let width = self.cff.evaluate_charstring(
&self.subfont,
self.glyph,
self.coords,
&mut transformer,
)?;
Ok(DrawnMetrics {
h_advance: width.map(|width| transform.transform_h_metric(width).to_f32()),
..Default::default()
})
}
}