android_mt6572_jiabo/external/noto-fonts/other/subset_noto_sans_symbols.py
2025-09-05 16:56:03 +08:00

216 lines
7 KiB
Python
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/python
# coding=UTF-8
#
# Copyright 2014 Google Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Create a curated subset of NotoSansSymbols for Android."""
__author__ = 'roozbeh@google.com (Roozbeh Pournader)'
import sys
from nototools import subset
from nototools import unicode_data
# Unicode blocks that we want to include in the font
BLOCKS_TO_INCLUDE = """
20D0..20FF; Combining Diacritical Marks for Symbols
2100..214F; Letterlike Symbols
2190..21FF; Arrows
2200..22FF; Mathematical Operators
2300..23FF; Miscellaneous Technical
2400..243F; Control Pictures
2440..245F; Optical Character Recognition
2460..24FF; Enclosed Alphanumerics
2500..257F; Box Drawing
2580..259F; Block Elements
25A0..25FF; Geometric Shapes
2600..26FF; Miscellaneous Symbols
2700..27BF; Dingbats
27C0..27EF; Miscellaneous Mathematical Symbols-A
27F0..27FF; Supplemental Arrows-A
2800..28FF; Braille Patterns
2A00..2AFF; Supplemental Mathematical Operators
"""
# One-off characters to be included, needed for backward compatibility and
# supporting various character sets, including ARIB sets and black and white
# emoji
ONE_OFF_ADDITIONS = {
0x27D0, # ⟐ WHITE DIAMOND WITH CENTRED DOT
0x2934, # ⤴ ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS
0x2935, # ⤵ ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS
0x2985, # ⦅ LEFT WHITE PARENTHESIS
0x2986, # ⦆ RIGHT WHITE PARENTHESIS
0x2B05, # ⬅ LEFTWARDS BLACK ARROW
0x2B06, # ⬆ UPWARDS BLACK ARROW
0x2B07, # ⬇ DOWNWARDS BLACK ARROW
0x2B24, # ⬤ BLACK LARGE CIRCLE
0x2B2E, # ⬮ BLACK VERTICAL ELLIPSE
0x2B2F, # ⬯ WHITE VERTICAL ELLIPSE
0x2B56, # ⭖ HEAVY OVAL WITH OVAL INSIDE
0x2B57, # ⭗ HEAVY CIRCLE WITH CIRCLE INSIDE
0x2B58, # ⭘ HEAVY CIRCLE
0x2B59, # ⭙ HEAVY CIRCLED SALTIRE
}
# letter-based characters, provided by Roboto
LETTERLIKE_CHARS_IN_ROBOTO = {
0x2100, # ℀ ACCOUNT OF
0x2101, # ℁ ADDRESSED TO THE SUBJECT
0x2103, # ℃ DEGREE CELSIUS
0x2105, # ℅ CARE OF
0x2106, # ℆ CADA UNA
0x2109, # ℉ DEGREE FAHRENHEIT
0x2113, # SCRIPT SMALL L
0x2116, # № NUMERO SIGN
0x2117, # ℗ SOUND RECORDING COPYRIGHT
0x211E, # ℞ PRESCRIPTION TAKE
0x211F, # ℟ RESPONSE
0x2120, # ℠ SERVICE MARK
0x2121, # ℡ TELEPHONE SIGN
0x2122, # ™ TRADE MARK SIGN
0x2123, # ℣ VERSICLE
0x2125, # ℥ OUNCE SIGN
0x2126, # Ω OHM SIGN
0x212A, # KELVIN SIGN
0x212B, # Å ANGSTROM SIGN
0x212E, # ESTIMATED SYMBOL
0x2132, # Ⅎ TURNED CAPITAL F
0x213B, # ℻ FACSIMILE SIGN
0x214D, # ⅍ AKTIESELSKAB
0x214F, # ⅏ SYMBOL FOR SAMARITAN SOURCE
}
# default emoji characters in the BMP, based on
# http://www.unicode.org/draft/Public/emoji/1.0/emoji-data.txt
# We exclude these, so we don't block color emoji.
BMP_DEFAULT_EMOJI = {
0x231A, # ⌚ WATCH
0x231B, # ⌛ HOURGLASS
0x23E9, # ⏩ BLACK RIGHT-POINTING DOUBLE TRIANGLE
0x23EA, # ⏪ BLACK LEFT-POINTING DOUBLE TRIANGLE
0x23EB, # ⏫ BLACK UP-POINTING DOUBLE TRIANGLE
0x23EC, # ⏬ BLACK DOWN-POINTING DOUBLE TRIANGLE
0x23F0, # ⏰ ALARM CLOCK
0x23F3, # ⏳ HOURGLASS WITH FLOWING SAND
0x25FD, # ◽ WHITE MEDIUM SMALL SQUARE
0x25FE, # ◾ BLACK MEDIUM SMALL SQUARE
0x2614, # ☔ UMBRELLA WITH RAIN DROPS
0x2615, # ☕ HOT BEVERAGE
0x2648, # ♈ ARIES
0x2649, # ♉ TAURUS
0x264A, # ♊ GEMINI
0x264B, # ♋ CANCER
0x264C, # ♌ LEO
0x264D, # ♍ VIRGO
0x264E, # ♎ LIBRA
0x264F, # ♏ SCORPIUS
0x2650, # ♐ SAGITTARIUS
0x2651, # ♑ CAPRICORN
0x2652, # ♒ AQUARIUS
0x2653, # ♓ PISCES
0x267F, # ♿ WHEELCHAIR SYMBOL
0x2693, # ⚓ ANCHOR
0x26A1, # ⚡ HIGH VOLTAGE SIGN
0x26AA, # ⚪ MEDIUM WHITE CIRCLE
0x26AB, # ⚫ MEDIUM BLACK CIRCLE
0x26BD, # ⚽ SOCCER BALL
0x26BE, # ⚾ BASEBALL
0x26C4, # ⛄ SNOWMAN WITHOUT SNOW
0x26C5, # ⛅ SUN BEHIND CLOUD
0x26CE, # ⛎ OPHIUCHUS
0x26D4, # ⛔ NO ENTRY
0x26EA, # ⛪ CHURCH
0x26F2, # ⛲ FOUNTAIN
0x26F3, # ⛳ FLAG IN HOLE
0x26F5, # ⛵ SAILBOAT
0x26FA, # ⛺ TENT
0x26FD, # ⛽ FUEL PUMP
0x2705, # ✅ WHITE HEAVY CHECK MARK
0x270A, # ✊ RAISED FIST
0x270B, # ✋ RAISED HAND
0x2728, # ✨ SPARKLES
0x274C, # ❌ CROSS MARK
0x274E, # ❎ NEGATIVE SQUARED CROSS MARK
0x2753, # ❓ BLACK QUESTION MARK ORNAMENT
0x2754, # ❔ WHITE QUESTION MARK ORNAMENT
0x2755, # ❕ WHITE EXCLAMATION MARK ORNAMENT
0x2757, # ❗ HEAVY EXCLAMATION MARK SYMBOL
0x2795, # HEAVY PLUS SIGN
0x2796, # HEAVY MINUS SIGN
0x2797, # ➗ HEAVY DIVISION SIGN
0x27B0, # ➰ CURLY LOOP
0x27BF, # ➿ DOUBLE CURLY LOOP
0x2B1B, # ⬛ BLACK LARGE SQUARE
0x2B1C, # ⬜ WHITE LARGE SQUARE
0x2B50, # ⭐ WHITE MEDIUM STAR
0x2B55, # ⭕ HEAVY LARGE CIRCLE
}
# Characters we have decided we are doing as emoji-style in Android,
# despite UTR#51's recommendation
ANDROID_EMOJI = {
0x2600, # ☀ BLACK SUN WITH RAYS
0x2601, # ☁ CLOUD
0X260E, # ☎ BLACK TELEPHONE
0x261D, # ☝ WHITE UP POINTING INDEX
0x263A, # ☺ WHITE SMILING FACE
0x2660, # ♠ BLACK SPADE SUIT
0x2663, # ♣ BLACK CLUB SUIT
0x2665, # ♥ BLACK HEART SUIT
0x2666, # ♦ BLACK DIAMOND SUIT
0x270C, # ✌ VICTORY HAND
0x2744, # ❄ SNOWFLAKE
0x2764, # ❤ HEAVY BLACK HEART
}
def main(argv):
"""Subset the Noto Symbols font.
The first argument is the source file name, and the second argument is
the target file name.
"""
target_coverage = set()
# Add all characters in BLOCKS_TO_INCLUDE
for first, last, _ in unicode_data._parse_code_ranges(BLOCKS_TO_INCLUDE):
target_coverage.update(range(first, last+1))
# Add one-off characters
target_coverage |= ONE_OFF_ADDITIONS
# Remove characters preferably coming from Roboto
target_coverage -= LETTERLIKE_CHARS_IN_ROBOTO
# Remove characters that are supposed to default to emoji
target_coverage -= BMP_DEFAULT_EMOJI | ANDROID_EMOJI
# Remove dentistry symbols, as their main use appears to be for CJK:
# http://www.unicode.org/L2/L2000/00098-n2195.pdf
target_coverage -= set(range(0x23BE, 0x23CC+1))
# Remove COMBINING ENCLOSING KEYCAP. It's needed for Android's color emoji
# mechanism to work properly
target_coverage.remove(0x20E3)
source_file_name = argv[1]
target_file_name = argv[2]
subset.subset_font(
source_file_name,
target_file_name,
include=target_coverage)
if __name__ == '__main__':
main(sys.argv)