summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xtools/fonts/fontchain_lint.py77
1 files changed, 50 insertions, 27 deletions
diff --git a/tools/fonts/fontchain_lint.py b/tools/fonts/fontchain_lint.py
index fb172d4fca78..c16de7b3dfc3 100755
--- a/tools/fonts/fontchain_lint.py
+++ b/tools/fonts/fontchain_lint.py
@@ -164,6 +164,7 @@ def check_emoji_availability():
def check_emoji_defaults():
default_emoji_chars = _emoji_properties['Emoji_Presentation']
+ missing_text_chars = _emoji_properties['Emoji'] - default_emoji_chars
emoji_font_seen = False
for name, scripts, variant, weight, style, font in _fallback_chain:
if 'Zsye' in scripts:
@@ -176,32 +177,39 @@ def check_emoji_defaults():
if emoji_font_seen and not scripts:
continue
- if font[1] is None:
- emoji_to_skip = set()
- else:
- # CJK font, skip checking the following characters for now.
- # See b/26153752
- emoji_to_skip = ({
- 0x26BD, # SOCCER BALL
- 0x26BE, # BASEBALL
- 0x1F18E, # NEGATIVE SQUARED AB
- 0x1F201, # SQUARED KATAKANA KOKO
- 0x1F21A, # SQUARED CJK UNIFIED IDEOGRAPH-7121
- 0x1F22F, # SQUARED CJK UNIFIED IDEOGRAPH-6307
- } | set(xrange(0x1F191, 0x1F19A+1))
- | set(xrange(0x1F232, 0x1F236+1))
- | set(xrange(0x1F238, 0x1F23A+1))
- | set(xrange(0x1F250, 0x1F251+1)))
-
- assert_font_supports_none_of_chars(font,
- sorted(default_emoji_chars - emoji_to_skip))
-
-
-def parse_ucd(ucd_path):
- global _emoji_properties
- _emoji_properties = collections.defaultdict(set)
- with open(path.join(ucd_path, 'emoji-data.txt')) as emoji_data_txt:
- for line in emoji_data_txt:
+ # Check default emoji-style characters
+ assert_font_supports_none_of_chars(font, sorted(default_emoji_chars))
+
+ # Mark default text-style characters appearing in fonts above the emoji
+ # font as seen
+ if not emoji_font_seen:
+ missing_text_chars -= set(get_best_cmap(font))
+
+ # Noto does not have monochrome symbols for Unicode 7.0 wingdings and
+ # webdings
+ missing_text_chars -= _chars_by_age['7.0']
+ # TODO: Remove these after b/26113320 is fixed
+ missing_text_chars -= {
+ 0x263A, # WHITE SMILING FACE
+ 0x270C, # VICTORY HAND
+ 0x2744, # SNOWFLAKE
+ 0x2764, # HEAVY BLACK HEART
+ }
+ assert missing_text_chars == set(), (
+ 'Text style version of some emoji characters are missing.')
+
+
+# Setting reverse to true returns a dictionary that maps the values to sets of
+# characters, useful for some binary properties. Otherwise, we get a
+# dictionary that maps characters to the property values, assuming there's only
+# one property in the file.
+def parse_unicode_datafile(file_path, reverse=False):
+ if reverse:
+ output_dict = collections.defaultdict(set)
+ else:
+ output_dict = {}
+ with open(file_path) as datafile:
+ for line in datafile:
if '#' in line:
line = line[:line.index('#')]
line = line.strip()
@@ -216,7 +224,22 @@ def parse_ucd(ucd_path):
char_start = char_end = char_range
char_start = int(char_start, 16)
char_end = int(char_end, 16)
- _emoji_properties[prop].update(xrange(char_start, char_end+1))
+ char_range = xrange(char_start, char_end+1)
+ if reverse:
+ output_dict[prop].update(char_range)
+ else:
+ for char in char_range:
+ assert char not in output_dict
+ output_dict[char] = prop
+ return output_dict
+
+
+def parse_ucd(ucd_path):
+ global _emoji_properties, _chars_by_age
+ _emoji_properties = parse_unicode_datafile(
+ path.join(ucd_path, 'emoji-data.txt'), reverse=True)
+ _chars_by_age = parse_unicode_datafile(
+ path.join(ucd_path, 'DerivedAge.txt'), reverse=True)
def main():