From 8eb7491de6badce6d51c656d789a23af90103ec7 Mon Sep 17 00:00:00 2001 From: rsheeter Date: Wed, 14 Feb 2024 13:28:31 -0800 Subject: [PATCH] Flags-only name values --- BUILD.md | 1 + fonts/NotoColorEmoji-flagsonly.ttf | Bin 912332 -> 912352 bytes tests/basic_test.py | 57 +++++++++++++++++++++++++---- update_flag_name.py | 36 ++++++++++++++++++ 4 files changed, 87 insertions(+), 7 deletions(-) create mode 100644 update_flag_name.py diff --git a/BUILD.md b/BUILD.md index 56ece42c59..e3137e9458 100644 --- a/BUILD.md +++ b/BUILD.md @@ -62,4 +62,5 @@ $ emojicompat --op check --font Noto-COLRv1-emojicompat.ttf $ hb-subset --unicodes-file=flags-only-unicodes.txt \ --output-file=fonts/NotoColorEmoji-flagsonly.ttf \ fonts/NotoColorEmoji.ttf +$ python update_flag_name.py ``` \ No newline at end of file diff --git a/fonts/NotoColorEmoji-flagsonly.ttf b/fonts/NotoColorEmoji-flagsonly.ttf index d3b8f2c8e4e5326c2c3a7e8137f3e2605874ba74..f40a13bfd116391bbd1a637131eb52a476d8e6cf 100644 GIT binary patch delta 500 zcmYk1KS*0q6vn@M-^(*E<^>e{YQaLpv|U6+;-7AyoOEc# z4i1$&w{^`Tf(2bf1SiQV5fsT#K?j#ovMAaw64Bwu`Mz_`{Vpe$?v$N@f4_@==<;e)|6mn@fVt2gZ*I-Vi98@U$LN^rcw!(I1+;VewPeB> zugwLPs82|Hl8vfyzs~&{`bg4E&znUmh;2YNxz4;NKH@dv5S{FXryVy@_q6>RKPO_v zo0&^ry~0<(C1_=)NA zj)9jVs7|#uwX21nh0%i)986#iLrAcGzVoxHTKn~)4>L%U7)g;?bi-wx!sNrd)$95% sS$jEa3nGa|bmAihsUUu0k^reB!L6)qH5_iH{cR!jRy0U+|Nhj#f7Hl!e*gdg delta 459 zcmYj~Pbh<79LK-U`#$e$FWyPnQmA)Xkpt3Zl!HtyrTi}(@Mg2sHWssX;y}qk$)jAf z9OXpRN;&v*kSGV*fdjeB#R(S!0PswyF>A&{Rl}Z3D(L`ACFT~AKXq88 z&N^VEXrX$<`83SQsm{Mo;+kQuF*FG*99%Xj?;pc|KE9gec8=RlWA{4;)r#F8}}l diff --git a/tests/basic_test.py b/tests/basic_test.py index 06d823c493..f73b7cd602 100644 --- a/tests/basic_test.py +++ b/tests/basic_test.py @@ -3,11 +3,18 @@ import pytest import re + +NAME_ID_FAMILY = 1 +NAME_ID_UNIQUE_ID = 3 +NAME_ID_FULLNAME = 4 +NAME_ID_POSTSCRIPT_NAME = 6 + + def test_consistent_version(): fonts_dir = Path("fonts") assert fonts_dir.is_dir() - name5_re = re.compile(r'^Version (\d+.\d+);GOOG;noto-emoji:\d+:[a-z0-9]+$') + name5_re = re.compile(r"^Version (\d+.\d+);GOOG;noto-emoji:\d+:[a-z0-9]+$") debug_versions = [] versions = set() @@ -16,7 +23,7 @@ def test_consistent_version(): head_ver = f"{font['head'].fontRevision:.03f}" versions.add(head_ver) debug_versions.append(f"{font_file.name} head {head_ver}") - for name in font['name'].names: + for name in font["name"].names: # name 5 is version if name.nameID != 5: continue @@ -27,32 +34,68 @@ def test_consistent_version(): versions.add(match.group(1)) debug_versions.append(f"{font_file.name} name {match.group(1)}") debug_versions = "\n".join(debug_versions) - assert len(versions) == 1, f"Should have a consistent version, found\n{debug_versions}" + assert ( + len(versions) == 1 + ), f"Should have a consistent version, found\n{debug_versions}" + def test_consistent_fstype(): fonts_dir = Path("fonts") assert fonts_dir.is_dir() - name5_re = re.compile(r'^Version (\d+.\d+);GOOG;noto-emoji:\d+:[a-z0-9]+$') + name5_re = re.compile(r"^Version (\d+.\d+);GOOG;noto-emoji:\d+:[a-z0-9]+$") debug_fstypes = [] fstypes = set() for font_file in fonts_dir.rglob("*.ttf"): font = ttLib.TTFont(font_file) - fstype = font['OS/2'].fsType + fstype = font["OS/2"].fsType fstypes.add(fstype) debug_fstypes.append(f"{font_file.name} fsType {fstype}") debug_fstypes = "\n".join(debug_fstypes) assert fstypes == {0}, f"All fsType's should be 0, found\n{debug_fstypes}" + def test_has_emojicompat(): fonts_dir = Path("fonts") assert fonts_dir.is_dir() ec_fonts = set(fonts_dir.rglob("*-emojicompat.ttf")) - assert {f.name for f in ec_fonts} == {"Noto-COLRv1-emojicompat.ttf", "NotoColorEmoji-emojicompat.ttf"} + assert {f.name for f in ec_fonts} == { + "Noto-COLRv1-emojicompat.ttf", + "NotoColorEmoji-emojicompat.ttf", + } for font_file in ec_fonts: font = ttLib.TTFont(font_file) assert "meta" in font, f"{font_file.name} should have a meta table" - assert "Emji" in font["meta"].data, f"{font_file.name} should have emojicompat data" + assert ( + "Emji" in font["meta"].data + ), f"{font_file.name} should have emojicompat data" + + +def name(font, name_id): + values = set() + for name in font["name"].names: + if name.nameID == name_id: + values.add(name.toUnicode()) + assert len(values) == 1, f"{name_id} has multiple definitions: {values}" + return next(iter(values)) + + +def test_flagsonly_name(): + fonts_dir = Path("fonts") + assert fonts_dir.is_dir() + font_file = fonts_dir / "NotoColorEmoji-flagsonly.ttf" + font = ttLib.TTFont(font_file) + assert [ + "Noto Color Emoji Flags", + "Noto Color Emoji Flags", + "Noto Color Emoji Flags", + "NotoColorEmojiFlags", + ] == [ + name(font, NAME_ID_FAMILY), + name(font, NAME_ID_FULLNAME), + name(font, NAME_ID_UNIQUE_ID), + name(font, NAME_ID_POSTSCRIPT_NAME), + ] diff --git a/update_flag_name.py b/update_flag_name.py new file mode 100644 index 0000000000..d43d405008 --- /dev/null +++ b/update_flag_name.py @@ -0,0 +1,36 @@ +"""Updates the name table for the CBDT flagsonly font.""" + +from fontTools import subset +from fontTools import ttLib +import functools +from pathlib import Path +import sys +from typing import Set + + +NAME_ID_FAMILY = 1 +NAME_ID_UNIQUE_ID = 3 +NAME_ID_FULLNAME = 4 +NAME_ID_POSTSCRIPT_NAME = 6 + + +_NAME_VALUES = [ + (NAME_ID_FAMILY, "Noto Color Emoji Flags"), + (NAME_ID_UNIQUE_ID, "Noto Color Emoji Flags"), + (NAME_ID_FULLNAME, "Noto Color Emoji Flags"), + (NAME_ID_POSTSCRIPT_NAME, "NotoColorEmojiFlags"), +] + + +def main(argv): + font_file = "fonts/NotoColorEmoji-flagsonly.ttf" + font = ttLib.TTFont(font_file) + name_table = font["name"] + for (name_id, value) in _NAME_VALUES: + name = name_table.getName(name_id, 3, 1, 0x409) + name.string = value + font.save(font_file) + + +if __name__ == '__main__': + main(sys.argv)