Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add flags-only CBDT font #458

Merged
merged 2 commits into from
Feb 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions BUILD.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,3 +54,13 @@ $ emojicompat --op check --font Noto-COLRv1-emojicompat.ttf
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
```
36 changes: 36 additions & 0 deletions flags-only-unicodes.txt
Original file line number Diff line number Diff line change
@@ -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
Binary file added fonts/NotoColorEmoji-flagsonly.ttf
Binary file not shown.
57 changes: 50 additions & 7 deletions tests/basic_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand All @@ -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
Expand All @@ -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),
]
36 changes: 36 additions & 0 deletions update_flag_name.py
Original file line number Diff line number Diff line change
@@ -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)
Loading