diff --git a/about_fonts.py b/about_fonts.py new file mode 100644 index 000000000..c1d8d1abb --- /dev/null +++ b/about_fonts.py @@ -0,0 +1,37 @@ +"""Prints info about emoji fonts.""" + +from fontTools import ttLib +from pathlib import Path +import sys + + +NAME_ID_VERSION = 5 + + +def name(font, name_id): + return ",".join(n.toUnicode() for n in font["name"].names if n.isUnicode() and n.nameID == name_id) + + +def main(): + font_files = sorted(p for p in (Path(__file__).parent / "fonts").iterdir() if p.suffix == ".ttf") + max_name_len = max(len(p.name) for p in font_files) + + for font_file in font_files: + font = ttLib.TTFont(font_file) + + font_type = [] + if "CBDT" in font: + font_type.append("CBDT") + if "COLR" in font: + font_type.append("COLR") + if "meta" in font and "Emji" in font["meta"].data: + font_type.append("EmojiCompat") + font_type.append(f"fontRevision:{font['head'].fontRevision:.3f}") + font_type.append(name(font, NAME_ID_VERSION)) + font_type = ", ".join(font_type) + + print(f"{font_file.name:{max_name_len + 1}} {font_type}") + + +if __name__ == '__main__': + main() diff --git a/colrv1_postproc.py b/colrv1_postproc.py index a6b4d158d..f40aedcbd 100644 --- a/colrv1_postproc.py +++ b/colrv1_postproc.py @@ -283,6 +283,14 @@ def _add_fallback_subs_for_unknown_flags(colr_font): font_data.delete_from_cmap(colr_font, [UNKNOWN_FLAG_PUA]) +def _set_no_font_embedding_restrictions(colr_font): + # The CBDT/CBLC NotoColorEmoji has OS/2.fsType = 0 (i.e. no embedding restrictions) + # so the COLRv1 variant must also have no such restrictions. + # https://github.com/notofonts/noto-fonts/issues/2408 + # https://github.com/google/fonts/issues/5729 + colr_font["OS/2"].fsType = 0 + + def _font(path, check_fn, check_fail_str): assert path.is_file(), path font = ttLib.TTFont(path) @@ -314,6 +322,8 @@ def main(_): _add_fallback_subs_for_unknown_flags(colr_font) + _set_no_font_embedding_restrictions(colr_font) + print("Writing", colr_file) colr_font.save(colr_file) diff --git a/drop_flags.py b/drop_flags.py new file mode 100644 index 000000000..aaee55830 --- /dev/null +++ b/drop_flags.py @@ -0,0 +1,48 @@ +"""Removes regional indicators from a font.""" + +from fontTools import subset +from fontTools import ttLib +import functools +from pathlib import Path +import sys +from typing import Set + + +def codepoints(font: ttLib.TTFont) -> Set[int]: + unicode_cmaps = (t.cmap.keys() for t in font['cmap'].tables if t.isUnicode()) + return functools.reduce(lambda acc, u: acc | u, unicode_cmaps, set()) + + +def is_regional_indicator(cp: int) -> bool: + return 0x1F1E6 <= cp <= 0x1F1FF + + +def main(argv): + for font_file in sorted(argv[1:]): + font_file = Path(font_file) + assert font_file.is_file(), font_file + noflags_file = font_file.with_stem(font_file.stem + "-noflags") + + if noflags_file.is_file(): + print(font_file, "already has", noflags_file, "; nop") + continue + + font = ttLib.TTFont(font_file) + + cps = codepoints(font) + cps_without_flags = {cp for cp in cps if not is_regional_indicator(cp)} + + if cps == cps_without_flags: + print(font_file, "has no regional indicators") + continue + + subsetter = subset.Subsetter() + subsetter.populate(unicodes=cps_without_flags) + subsetter.subset(font) + + font.save(noflags_file) + print(font_file, "=>" , noflags_file) + + +if __name__ == '__main__': + main(sys.argv) diff --git a/fix_colr_font_revision.py b/fix_colr_font_revision.py new file mode 100644 index 000000000..76b65b72b --- /dev/null +++ b/fix_colr_font_revision.py @@ -0,0 +1,36 @@ +"""Set COLRv1 fontRevision from CBDT. + +Used for bugfix, should fix to set properly on build instead. +""" + +from fontTools import ttLib +from pathlib import Path +import sys + + +NAME_ID_VERSION = 5 + + +def name(font, name_id): + return ",".join(n.toUnicode() for n in font["name"].names if n.isUnicode() and n.nameID == name_id) + + +def main(): + colr_font_files = sorted(p for p in (Path(__file__).parent / "fonts").iterdir() if p.name.startswith("Noto-COLRv1")) + + for colr_font_file in colr_font_files: + cbdt_font_file = colr_font_file.with_stem(colr_font_file.stem.replace("Noto-COLRv1", "NotoColorEmoji")) + + colr_font = ttLib.TTFont(colr_font_file) + cbdt_font = ttLib.TTFont(cbdt_font_file) + + assert "CBDT" in cbdt_font + assert "COLR" in colr_font + + colr_font["head"].fontRevision = cbdt_font["head"].fontRevision + + colr_font.save(colr_font_file) + + +if __name__ == '__main__': + main() diff --git a/fonts/Noto-COLRv1-emojicompat.ttf b/fonts/Noto-COLRv1-emojicompat.ttf new file mode 100644 index 000000000..889440cb1 Binary files /dev/null and b/fonts/Noto-COLRv1-emojicompat.ttf differ diff --git a/fonts/Noto-COLRv1-noflags.ttf b/fonts/Noto-COLRv1-noflags.ttf index 3487ad881..daa7629e8 100644 Binary files a/fonts/Noto-COLRv1-noflags.ttf and b/fonts/Noto-COLRv1-noflags.ttf differ diff --git a/fonts/Noto-COLRv1.ttf b/fonts/Noto-COLRv1.ttf index 59968a609..37d4655ac 100644 Binary files a/fonts/Noto-COLRv1.ttf and b/fonts/Noto-COLRv1.ttf differ diff --git a/fonts/NotoColorEmoji-emojicompat.ttf b/fonts/NotoColorEmoji-emojicompat.ttf new file mode 100644 index 000000000..c48cd2671 Binary files /dev/null and b/fonts/NotoColorEmoji-emojicompat.ttf differ diff --git a/fonts/NotoColorEmoji-noflags.ttf b/fonts/NotoColorEmoji-noflags.ttf new file mode 100644 index 000000000..cbb609e59 Binary files /dev/null and b/fonts/NotoColorEmoji-noflags.ttf differ