NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #1254 most downloaded on crates.io
ttf-parser plus support for owned data
Last release 1 years ago
24 Jul 2025
Release timing varies
gaps range from 3 weeks to 10 months
Nearly every release is documented
notes for 30 of 30 stable releases
Nothing withdrawn
no release was ever pulled
6 years old
30 releases · first in 2020
One column per quarter.
Reduce size of published crate archive (148 KiB -> 9 KiB).
0.25.1.0.25.1.Update ttf-parser to 0.25.0 , changelog .
0.25.0, changelog.STAT table parsing. Thanks to inferiorhumanorgans.UnicodeRanges internal field is public now.cargo-c metadata to C API. Thanks to lu-zero.Face::is_italic checks for italic angle as well.Face::italic_angle returns just a f32 and not Option<f32> now.avar table to the variation axis being set.
Thanks to maxmelander.Update ttf-parser to 0.24.0 , changelog .
0.24.0, changelog.no-std-float is required for no-std builds.core_maths dependency optional.
When building for no_std one must enable no-std-float build feature now.Update ttf-parser to 0.23.0 , changelog .
0.23.0, changelog.no-std-float.core_maths instead of libm. Should simplify the build process.
Thanks to LaurenzV.no-std-float build flag. Should be handled automatically now.Update ttf-parser to 0.22.0 , changelog .
0.22.0, changelog.no-std-float is required for no-std builds.Face::glyph_phantom_pointshvar::Table::right_side_bearing_offset. Thanks to LaurenzV.vvar::Table::advance_offset. Thanks to LaurenzV.vvar::Table::top_side_bearing_offset. Thanks to LaurenzV.vvar::Table::bottom_side_bearing_offset. Thanks to LaurenzV.vvar::Table::vertical_origin_offset. Thanks to LaurenzV.colr::Table::clip_box. Thanks to LaurenzV.no_std build of ttf-parser requires --features=no-std-float now.
This is because we need trigonometry functions to flatten transforms in COLR.
Thanks to LaurenzV.colr::Painter no longer has push_translate, push_scale, push_rotate and push_skew.
Only push_transform left.
Thanks to LaurenzV.hvar::Table into hvar::Table and vvar::Table.
Previously, we treated both HVAR and VVAR tables as identical,
but VVAR actually has additional fields.
Thanks to LaurenzV.hvar::Table::side_bearing_offset into hvar::Table::left_side_bearing_offset.
Thanks to LaurenzV.Face::glyph_hor_advance and Face::glyph_ver_advance include gvar's phantom points
when HVAR/VVAR tables are missing. Affects only variable fonts.CFF) Allow MoveTo with width commands in nested subroutines.opentype_layout::LookupFlags::mark_attachment_type parsing.CFF) Allow empty charsets in cff::parse_charset.
Thanks to LaurenzV.gvar) Empty sub-glyphs/components is no longer an error.
Thanks to LaurenzV.GSUB/GPOS) Allow NULL offsets in ChainedContextLookup Format2 subtables.
Thanks to LaurenzV.Face::glyph_y_origin properly handles variable fonts now.
Thanks to LaurenzV.kerx) Fix AnchorPoints parsing.
Thanks to LaurenzV.push_translate, push_scale, push_rotate and push_skew from colr::Painter.
Use colr::Painter::push_transform instead.
Thanks to LaurenzV.Update ttf-parser to 0.21.0 , changelog .
0.21.0, changelog.COLR / CPAL v1 support.
Thanks to LaurenzV.Face::is_bitmap_embedding_allowed with Face::is_outline_embedding_allowed.
The old one had a bool flag flipped.
Thanks to Fuzzyzilla.Update ttf-parser to 0.20.0 , changelog .
0.20.0, changelog.Face were to implement Drop.COLR / CPAL v0 support.
Thanks to laurmaedje.Face::is_color_glyphFace::color_palettescpal::Table::palettessvg::SvgDocumentsList returns svg::SvgDocument and not just &[u8] now.
Thanks to wjian23.Face::set_variation allows duplicated axes now.cpal::Color is called cpal::BgraColor now, and cpal::Table::get returns it.Update ttf-parser to 0.19.0 , changelog .
0.19.0, changelog.bdat, bloc, EBDT and EBLC tables support.
Thanks to dzamkov.BitmapMono, BitmapMonoPacked, BitmapGray2, BitmapGray2Packed, BitmapGray4,
BitmapGray4Packed, BitmapGray8 and BitmapPremulBgra32 variants to RasterImageFormat.CBLC table parsing.
Thanks to dzamkov.Make PreParsedSubtables face field public. This allows referencing and unwrapping the underlying face.
PreParsedSubtables face field public. This allows referencing and unwrapping the underlying face.Update ttf-parser to 0.18.0 , changelog .
0.18.0, changelog.Add PreParsedSubtables::glyph_variation_index.
PreParsedSubtables::glyph_variation_index.Face::permissionsFace::is_subsetting_allowedFace::is_bitmap_embedding_allowedFace::unicode_rangesos2::Table::permissionsos2::Table::is_subsetting_allowedos2::Table::is_bitmap_embedding_allowedos2::Table::unicode_rangesFace::parse for a regular font will return
FaceParsingError::FaceIndexOutOfBounds now. Thanks to Pietrek14.Update _ttf-parser_ to 0.17.0, changelog.
Update _ttf-parser_ to 0.16.0, changelog.
0.16.0, changelog.cff::Table::glyph_indexcff::Table::glyph_index_by_namecff::Table::glyph_widthcff::Table::number_of_glyphscff::Table::matrixpost::Table::glyph_namepost::Table::glyph_index_by_namepost::Table::namesFace::glyph_index_by_nameRawFace fields and TableRecord struct are public now.Face::from_slice was replaced by Face::parse.RawFace::from_slice was replaced by RawFace::parse.post::Table::names is a method and not a field now.post::Table::glyph_name instead of post::Table::names.get().post::Names::len was returning a wrong value. Now this method is gone completely.
You can use post::Table::names().count() instead.Add FaceMut::set_variation trait abstraction for calling mutable Face::set_variation via OwnedFace.
FaceMut::set_variation trait abstraction for calling mutable Face::set_variation via OwnedFace.HVAR/VVAR is not an error. Simply ignore them.Add OwnedFace::as_slice, OwnedFace::into_vec.
OwnedFace::as_slice, OwnedFace::into_vec.cmap::Subtable4::glyph_index correctly handles malformed glyph offsets now.cmap::Subtable4::codepoints no longer includes 0xFFFF codepoint.Update _ttf-parser_ to 0.15.0, add apple-layout feature changelog.
0.15.0, add apple-layout feature changelog.apple-layout build feature.ankr, feat, kerx, morx and trak tables.kern AAT subtable format 1.RawFaceparser module is private now again.Update _ttf-parser_ to 0.14.0, changelog.
0.14.0, changelog.cmap::Subtable::glyph_index and cmap::Subtable::glyph_variation_index accept
u32 instead of char now.Add PreParsedSubtables struct allowing pre-parsing of cmap & kern face subtables at initialization time for re-use. This allows much faster glyph_inde
PreParsedSubtables struct allowing pre-parsing of cmap & kern face subtables at initialization
time for re-use. This allows much faster glyph_index & glyphs_hor_kerning avoiding the need
to parse subtables inside each call.0.13.2, add gvar-alloc feature changelog.gvar-alloc build feature that unlocks gvar table limits by using heap.
Thanks to OrionNebulaUpdate _ttf-parser_ to 0.13.1 changelog.
0.13.1 changelog.Update _ttf-parser_ to 0.13 changelog.
0.13 changelog.opentype-layout feature.Style enum and Face::style method.Face::glyph_name can be disabled via the glyph-names feature to reduce binary size.Face methods: has_glyph_classes, glyph_class, glyph_mark_attachment_class,
is_mark_glyph and glyph_variation_delta are moved to gdef::Table.Names struct is no longer an iterator, but a container.
You have to call into_iter() manually.VariationAxes struct is no longer an iterator, but a container.
You have to call into_iter() manually.Name struct methods become public fields.Face::units_per_em no longer returns Option.cmap) Improved subtable 12 performance. Thanks to xnukttfp_glyph_class, ttfp_get_glyph_class, ttfp_get_glyph_mark_attachment_class,
ttfp_is_mark_glyph, ttfp_glyph_variation_delta and ttfp_has_table.TableName enum and Face::has_table. Tables can be access directly now.Face::character_mapping_subtables. Use Face::tables().cmap instead.Face::kerning_subtables. Use Face::tables().kern instead.Iterator::count implementation for cmap::Subtables, name::Names and LazyArrayIter32.Update _ttf-parser_ to 0.12.3 to ensure consistent glyph bounding box behaviour.
0.12.3 to ensure consistent glyph bounding box behaviour.Face::ascender and Face::descender will use usWinAscent and usWinDescent when USE_TYPO_METRICS flag is not set in OS/2 table. Previously, those values
Face::ascender and Face::descender will use
usWinAscent and
usWinDescent
when USE_TYPO_METRICS flag is not set in OS/2 table.
Previously, those values were ignored and
hhea::ascender and
hhea::descender
were used. Now hhea table values will be used only when OS/2 table is not present.Face::outline_glyph and Face::glyph_bounding_box in case of a glyf table
can fallback to a calculated bbox when the embedded bbox is malformed now.FaceTables, which allowed to load Face not only from a single chunk of data, but also in a per-table way. Which is useful for WOFF parsing. No changes
FaceTables, which allowed to load Face not only from a single chunk of data,
but also in a per-table way. Which is useful for WOFF parsing.
No changes to the API.
Thanks to fschuttvariable-fonts build feature. Enabled by default. By disabling it you can reduce ttf-parser binary size overhead almost twice.
variable-fonts build feature. Enabled by default.
By disabling it you can reduce ttf-parser binary size overhead almost twice.gvar) Increase the maximum number of variation tuples from 16 to 32.
Increases stack usage and makes gvar parsing 10% slower now.CFF) Fix seac processing. Thanks to wezmkern AAT subtable 1 aka kern::state_machine. Mainly because it's useless without a proper shaping.
kern AAT subtable 1 aka kern::state_machine.
Mainly because it's useless without a proper shaping.Face::has_non_default_variation_coordinates
true magic.FaceParsingErrorNormalizedCoordinateFace::variation_coordinatesFace::has_non_default_variation_coordinatesFace::glyph_name can lookup CFF names too.Face::table_dataFace::character_mapping_subtablesFace::from_slice returns Result now.Name::platform_id returns PlatformId instead of Option<PlatformId> now.cmap module became public.Face::width parsing.Face::from_slice.Face::glyph_variation_index processing when the encoding table has only one glyph.Rename Font to Face, because this is what it actually is.
seac support.Font::global_bounding_boxFont to Face, because this is what it actually is.Font::from_data to Font::from_slice to match serde and other libraries.Name::name_utf8 to Name::to_string.Font::family_name and Font::post_script_name. They were a bit confusing.
Prefer:face.names().find(|name| name.name_id() == name_id::FULL_NAME).and_then(|name| name.to_string())
sbix, CBLC, CBDT and SVG tables support.
sbix, CBLC, CBDT and SVG tables support.Font::glyph_raster_image and Font::glyph_svg_image.Font::kerning_subtables with subtable formats 0..3 support.ttfp_font anymore. All allocations should be
handled by the caller from now.Font::glyphs_kerning. Use Font::kerning_subtables instead.ttfp_create_font and ttfp_destroy_font.
Use ttfp_font_size_of + ttfp_font_init instead.ttfp_font *font = (ttfp_font*)alloca(ttfp_font_size_of());
ttfp_font_init(font_data, font_data_size, 0, font);
gvar) Integer overflow.cmap) Integer overflow during subtable format 2 parsing.CFF, CFF2) DICT number parsing.Font::glyph_*_advance will return None when glyph ID
is larger than the number of metrics in the table.Font::glyph_*_advance and Font::glyph_*_side_bearing
when HVAR/VVAR tables are missing.
Previously returned None which is incorrect.* Support no_std.
gvar, CFF2, avar, fvar, HVAR, VVAR and MVAR tables support.
gvar, CFF2, avar, fvar, HVAR, VVAR and MVAR tables support.Font::variation_axesFont::set_variationFont::is_variableTag type.Your coding agent can read these notes before it upgrades. Set up the MCP server →