Merge pull request #458 from googlefonts/flags-only

Add flags-only CBDT font
diff --git a/BUILD.md b/BUILD.md
index ef67e28..e3137e9 100644
--- a/BUILD.md
+++ b/BUILD.md
@@ -54,3 +54,13 @@
 0 PUA point at wrong glyph
 3835 PUA correct
 0 Emji entries did NOT match a glyph
+```
+
+## Flags only
+
+```bash
+$ 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/flags-only-unicodes.txt b/flags-only-unicodes.txt
new file mode 100644
index 0000000..421896a
--- /dev/null
+++ b/flags-only-unicodes.txt
@@ -0,0 +1,36 @@
+U+1f1e6
+U+1f1e7
+U+1f1e8
+U+1f1e9
+U+1f1ea
+U+1f1eb
+U+1f1ec
+U+1f1ed
+U+1f1ee
+U+1f1ef
+U+1f1f0
+U+1f1f1
+U+1f1f2
+U+1f1f3
+U+1f1f4
+U+1f1f5
+U+1f1f6
+U+1f1f7
+U+1f1f8
+U+1f1f9
+U+1f1fa
+U+1f1fb
+U+1f1fc
+U+1f1fd
+U+1f1fe
+U+1f1ff
+U+fe4e5
+U+fe4e6
+U+fe4e7
+U+fe4e8
+U+fe4e9
+U+fe4ea
+U+fe4eb
+U+fe4ec
+U+fe4ed
+U+fe4ee
\ No newline at end of file
diff --git a/fonts/NotoColorEmoji-flagsonly.ttf b/fonts/NotoColorEmoji-flagsonly.ttf
new file mode 100644
index 0000000..f40a13b
--- /dev/null
+++ b/fonts/NotoColorEmoji-flagsonly.ttf
Binary files differ
diff --git a/tests/basic_test.py b/tests/basic_test.py
index 06d823c..f73b7cd 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 @@
         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 @@
             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 0000000..d43d405
--- /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)