MoonBit port of Fontations skrifa (font parsing, metrics, color/bitmap glyph helpers).
import {
"moonbitlang/core/prelude",
"moonbitlang/core/bytes",
"Milky2018/moon_skrifa" @moon_skrifa,
"Milky2018/moon_skrifa/outline" @moon_skrifa_outline,
}let font = @moon_skrifa.FontRef::from_bytes(font_bytes).unwrap()
let outlines = @moon_skrifa_outline.OutlineGlyphCollection::from_font(font)
let cmap = font.charmap().unwrap()
let gid = cmap.glyph_id(0x41).unwrap() // 'A'
let settings =
@moon_skrifa_outline.DrawSettings::unhinted(
@moon_skrifa.Size::Size(16.0),
@moon_skrifa.LocationRef::default(),
)
let svg_path = outlines.svg_path(gid, settings).unwrap()let axes = font.axes()
let settings : Array[@moon_skrifa.VariationSetting] = Array::from_fixed_array([
@moon_skrifa.Setting::Setting(@moon_skrifa.Tag::from_str("wght").unwrap(), 700.0),
])
let loc = axes.location(settings.op_as_view()).as_ref()let cmap = font.charmap().unwrap()
let gid = cmap.glyph_id(0x4F60).unwrap() // example codepointlet family = font.localized_strings(@moon_skrifa.STRING_ID_FAMILY_NAME)
match family.english_or_first() {
None => ()
Some(s) => {
let lang = s.language() // Option[String]
let value = s.to_string()
lang |> ignore
value |> ignore
}
}let fm = font.metrics(
@moon_skrifa.Size::Size(16.0),
@moon_skrifa.LocationRef::default(),
)
let gm = font.glyph_metrics(
@moon_skrifa.Size::unscaled(),
@moon_skrifa.LocationRef::default(),
)
let aw = gm.advance_width(gid)
let lsb = gm.left_side_bearing(gid)
let bounds = gm.bounds(gid)
fm |> ignore
aw |> ignore
lsb |> ignore
bounds |> ignorelet strikes = font.bitmap_strikes()
for i in 0..<strikes.len() {
let strike = strikes.get(i).unwrap()
let bmp = strike.get(gid)
bmp |> ignore
}let loc = @moon_skrifa.LocationRef::default()
try! font.paint_colr_v1_at(gid, loc, painter) |> ignorelet settings =
@moon_skrifa_outline.DrawSettings::unhinted(
@moon_skrifa.Size::Size(16.0),
@moon_skrifa.LocationRef::default(),
)
let path = outlines.path(gid, settings)
path |> ignorelet hinter =
@moon_skrifa_outline.HintingInstance::create(
outlines,
@moon_skrifa.Size::Size(16.0),
@moon_skrifa.LocationRef::default(),
@moon_skrifa_outline.HintingOptions::default(),
).unwrap()
let settings = @moon_skrifa_outline.DrawSettings::hinted(hinter, false)
let svg = outlines.svg_path(gid, settings)
svg |> ignorelet settings =
@moon_skrifa_outline.DrawSettings::unhinted(
@moon_skrifa.Size::Size(16.0),
@moon_skrifa.LocationRef::default(),
).with_path_style(@moon_skrifa_outline.PathStyle::HarfBuzz)
settings |> ignoretype NormalizedCoord = Inttype StringId = UInt16pub(open) trait MetadataProvider {
fn attributes(Self) -> Attributes
fn axes(Self) -> AxisCollection
fn named_instances(Self) -> NamedInstanceCollection
fn localized_strings(Self, UInt16) -> LocalizedStrings
fn glyph_names(Self) -> GlyphNames
fn metrics(Self, Size, LocationRef) -> Metrics
fn glyph_metrics(Self, Size, LocationRef) -> GlyphMetrics
fn charmap(Self) -> Charmap
fn outline_glyphs(Self) -> OutlineGlyphCollection
fn bitmap_strikes(Self) -> BitmapStrikes
fn color_glyphs(Self) -> ColorGlyphCollection
fn color_palettes(Self) -> ColorPalettes
}impl MetadataProvider for FontReflet STRING_ID_COMPATIBLE_FULL_NAME : UInt16let STRING_ID_DARK_BACKGROUND_PALETTE : UInt16let STRING_ID_LAST_ALLOWED_NAME_ID : UInt16let STRING_ID_LAST_RESERVED_NAME_ID : UInt16let STRING_ID_LIGHT_BACKGROUND_PALETTE : UInt16let STRING_ID_POSTSCRIPT_CID_NAME : UInt16let STRING_ID_TYPOGRAPHIC_FAMILY_NAME : UInt16let STRING_ID_TYPOGRAPHIC_SUBFAMILY_NAME : UInt16let STRING_ID_VARIATIONS_POSTSCRIPT_NAME_PREFIX : UInt16MoonBit port of Fontations skrifa (font parsing, metrics, color/bitmap glyph helpers).