From bfb6378550b5c5fc8b1ecce38c5096a5b95de3ec Mon Sep 17 00:00:00 2001 From: LongCat is Looong <31859944+LongCatIsLooong@users.noreply.github.com> Date: Sun, 14 Apr 2024 12:30:00 +0800 Subject: [PATCH 1/5] Remove ligature tables. Gegenerate font. --- build/generate_font.py | 45 ++++----------------------------------- fonts/CupertinoIcons.ttf | Bin 283464 -> 240484 bytes 2 files changed, 4 insertions(+), 41 deletions(-) diff --git a/build/generate_font.py b/build/generate_font.py index a4e2c91..2cccbc6 100755 --- a/build/generate_font.py +++ b/build/generate_font.py @@ -20,7 +20,6 @@ OUTPUT_FONT_DIR = os.path.join(SCRIPT_PATH, '..', 'fonts') MANIFEST_PATH = os.path.join(SCRIPT_PATH, 'manifest.json') AUTO_WIDTH = True -KERNING = 15 def createGlyph(name, codepoint, file): glyph = f.createChar(codepoint, name) @@ -31,38 +30,6 @@ def createGlyph(name, codepoint, file): build_data['icons'][name].append(codepoint) glyph.importOutlines(file) - # Add ligatures - ligature = []; - for c in name: - if (c == '_'): - c = "underscore" - if (c == '-'): - c = "hyphen" - if (c == ' '): - c = "space" - if (c == '1'): - c = "one" - if (c == '2'): - c = "two" - if (c == '3'): - c = "three" - if (c == '4'): - c = "four" - if (c == '5'): - c = "five" - if (c == '6'): - c = "six" - if (c == '7'): - c = "seven" - if (c == '8'): - c = "eight" - if (c == '9'): - c = "nine" - if (c == '0'): - c = "zero" - ligature.append(c) - glyph.addPosSub('ligatable1', ligature) - # set glyph size explicitly or automatically depending on autowidth if AUTO_WIDTH: glyph.left_side_bearing = glyph.right_side_bearing = 0 @@ -87,15 +54,11 @@ def createGlyph(name, codepoint, file): f.ascent = 448 f.descent = 64 -# Add lookup table -f.addLookup("ligatable","gsub_ligature",(),(("liga",(("latn",("dflt")),)),)) -f.addLookupSubtable("ligatable","ligatable1") - # Import base characters -for char in "0123456789abcdefghijklmnopqrstuvwzxyz_- ": - glyph = f.createChar(ord(char)) - glyph.importOutlines(BLANK_PATH) - glyph.width = 0 +blank_glyph = f.createChar(-1, "BLANK") +blank_glyph.importOutlines(BLANK_PATH) +blank_glyph.width = 0 +blank_glyph.altuni = [ord(c) for c in "0123456789abcdefghijklmnopqrstuvwzxyz_- "] manifest_file = open(MANIFEST_PATH, 'r') manifest_data = json.loads(manifest_file.read()) diff --git a/fonts/CupertinoIcons.ttf b/fonts/CupertinoIcons.ttf index 0b13b5007efd3681c35d03fa17918f70e736f096..11e5aa750faebf040a875011e9b0fc33fd535113 100644 GIT binary patch delta 13416 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 z%0D&XXRN#8Hy^9hZckf~wmfZp+81ecfs8*FvEy;DpLN4KNpjI3FzHBjfd~VT}&Ju~^GN3d)-8Id1X~)!C*sP6iDJ$31#t_T;R8PV%7e z+Kp|m{mih@rXGy=1ABu{NxJODmob_^{9zl15#FF9|HYw_cV_lUHse$c#Ve2POhz+c z9Mv0)v(RN~bD2*`jB`=X&IjM){GZqP5P%GRGttW@v*{}IGSsuAJe#L*GJ_p1`IC&U zVcW*(C!GJc786a46XOV8f9K5>+xR@xGXqv$fLpb)M@MsbdnwL9)mP7(kFe1Ri&9fS zUjOT%#E)1WFs?+kBcJ^tT@ZA<_e`g8LR&NCVhlko`?j{O(Au7n(ANI`vmL{XR`F^s zVFzKwJC^4kp-v1j4pYNWXAP;O5oHWC+wpv1A8~*Nd3C_{H_A|HZL$-N1|u=YheRDc z=yv95wL9vV1QX)vS0A_sutwyr%q2GJT-{xS8m8zBX{>*F?t_FzdsI12=ka`_0?RL_ zMjOAzIViXN7)-?7*x<9CZYS}9X!Nqn*=_Aj20LS}=1 zY};YTJT-_rq$CV}Q`VK+mHKon+$?;}+l&?{#r~H+Evh+-QI2AFd^`3%El$GP2b;0d z_zk7@k4|Yyz6zzhj$ly=Y$t6@PodP+icL3S@O!z1rt)}$<#fmAJrlgx;IE!C0qv`& zMqj(kTGyN3|1r9u%%aFUAO5^`*to)jXFl{YF2K?a=ifCKGWwy&4a6QjLSSwvAz&higZxT{N6SScLI}9X5KJSFnF8ikYW33+R69uQ3SU zYi)rpv#~TCfKQ6ep(l*P@DYxF=Fe?G63t^Yxki}f+Dpo)(=$VyEAbnnFm(CBJs2_l zAJVw0`5l$@bYxr&D{|_MM~Abl8VTjw#CR-$7C*M{iqFr^re(B|cHkvl!>EEIa-y%L zX#$5vz2Cq16R6e>m><1cE|*&3YamA|!Wy>m2gIv~8p|IBpH8B|?apzPG3NM41lG8v8Lv8Q@SW(2PJ0#XfEI{HA zY}pi6NT~cOK;={M2XPZlz>))S03&Frhp#* zmJ)LPf7bd=6q*VHZ?d5SH2n`_#$2y$eEgDj0YlAUi1A;qbnT+I(+o9F>d>Ao|43Hx_0jNggyiJzdCjTQ{Wj1?bJ)5dKc${_He`JMLt!u zi+t`IdW75V&-$uwb_MQZ7lA3tQf*`cmb!&$i!&t^oO8sOU$I&Lv8^L=GVzqMf0ns$ZA7_{g1zF*(ETUp$Q4?roz)@Gh)hekKD?+5(8SvZMTRuyzQ|5 z&uAoWL)d*nA$q9~o@`c_LNdFCeq>e?E6cF^3EC^l)6j=`Su|cyfd6CULjG{)#~xuc z5(M7cp5PI From cb11da0d1e6b7af3d4a36918e6f2159c84b76f80 Mon Sep 17 00:00:00 2001 From: LongCat is Looong <31859944+LongCatIsLooong@users.noreply.github.com> Date: Sun, 14 Apr 2024 20:13:02 +0800 Subject: [PATCH 2/5] Fix overlapping outlines --- build/cupertino_generated_icons.dart | 4 +- build/existing_map.py | 245 ++++++++++++++------------- build/generate_font.py | 89 +++++----- build/manifest.json | 2 +- fonts/CupertinoIcons.ttf | Bin 240484 -> 236700 bytes src/sf/car_fill.svg | 1 - 6 files changed, 175 insertions(+), 166 deletions(-) delete mode 100644 src/sf/car_fill.svg diff --git a/build/cupertino_generated_icons.dart b/build/cupertino_generated_icons.dart index 8f7f43b..1330c72 100644 --- a/build/cupertino_generated_icons.dart +++ b/build/cupertino_generated_icons.dart @@ -2085,9 +2085,7 @@ /// This is the same icon as [create_solid] which is available in cupertino_icons 0.1.3. static const IconData square_pencil = IconData(0xf417, fontFamily: iconFont, fontPackage: iconFontPackage); /// square_pencil_fill — Cupertino icon named "square_pencil_fill". Available on cupertino_icons package 1.0.0+ only. - /// This is the same icon as [create] which is available in cupertino_icons 0.1.3. - /// This is the same icon as [create_solid] which is available in cupertino_icons 0.1.3. - static const IconData square_pencil_fill = IconData(0xf417, fontFamily: iconFont, fontPackage: iconFontPackage); + static const IconData square_pencil_fill = IconData(0xf418, fontFamily: iconFont, fontPackage: iconFontPackage); /// square_righthalf_fill — Cupertino icon named "square_righthalf_fill". Available on cupertino_icons package 1.0.0+ only. static const IconData square_righthalf_fill = IconData(0xf80e, fontFamily: iconFont, fontPackage: iconFontPackage); /// square_split_1x2 — Cupertino icon named "square_split_1x2". Available on cupertino_icons package 1.0.0+ only. diff --git a/build/existing_map.py b/build/existing_map.py index 79eb984..383608a 100644 --- a/build/existing_map.py +++ b/build/existing_map.py @@ -1,123 +1,130 @@ mapped_codepoints = { - "square_arrow_up": (0xf4ca, 0xf220), - "square_arrow_up_fill": (0xf4cb), - "book": (0xf3e7), - "book_fill": (0xf3e8), - "bookmark": (0xf3e9), - "bookmark_fill": (0xf3ea), - "info_circle": (0xf44c), - "arrowshape_turn_up_left": (0xf4c6), - "chat_bubble": (0xf3fb), - "person_crop_circle": (0xf419), - "plus_circle": (0xf48a), - "minus_circle": (0xf463), - "flag": (0xf42c), - "search": (0xf4a5), - "checkmark": (0xf3fd), - "checkmark_circle": (0xf3fe), - "checkmark_circle_fill": (0xf3ff), - "circle": (0xf401), - "circle_fill": (0xf400), - "chevron_left": (0xf3d2), - "chevron_right": (0xf3d3), - "chevron_back": (0xf3cf), - "chevron_forward": (0xf3d1), - "house": (0xf447), - "car": (0xf36f), - "cart": (0xf3f7), - "ellipsis": (0xf46a), - "phone": (0xf4b8), - "phone_fill": (0xf4b9), - "arrow_down": (0xf35d), - "arrow_up": (0xf366), - "battery_100": (0xf113, 0xf111, 0xf114), - "battery_0": (0xf112), - "battery_25": (0xf115), - "bluetooth": (0xf116), - "arrow_counterclockwise": (0xf21c), - "arrowshape_turn_up_left_2": (0xf21d), - "arrowshape_turn_up_left_2_fill": (0xf21e), - "shuffle": (0xf4a9, 0xf4a8, 0xf221), - "camera": (0xf3f5), - "camera_fill": (0xf3f6), - "videocam": (0xf4cc), - "videocam_fill": (0xf4cd), - "camera_rotate": (0xf49e), - "camera_rotate_fill": (0xf49f), - "rectangle_stack": (0xf3c9), - "rectangle_stack_fill": (0xf3ca), - "folder": (0xf434, 0xf38a), - "folder_fill": (0xf435), - "trash": (0xf4c4, 0xf37f), - "trash_fill": (0xf4c5), - "pencil": (0xf37e, 0xf2bf), - "square_pencil": (0xf417), - "square_pencil_fill": (0xf417), - "arrow_clockwise": (0xf49a, 0xf49d, 0xf3a8), - "arrow_clockwise_circle": (0xf49b), - "arrow_clockwise_circle_fill": (0xf49c), - "xmark": (0xf404, 0xf2d7), - "xmark_circle": (0xf405), - "xmark_circle_fill": (0xf36e, 0xf406), - "plus": (0xf489), - "plus_circle": (0xf48a), - "plus_circle_fill": (0xf48b), - "gear_alt": (0xf43c, 0xf2f7), - "gear_alt_fill": (0xf43d), - "gear": (0xf411, 0xf412), - "music_note": (0xf46b), - "music_note_2": (0xf46c), - "play": (0xf487), - "play_fill": (0xf488), - "pause": (0xf477), - "pause_fill": (0xf478), - "infinite": (0xf449, 0xf44a), - "speaker_1_fill": (0xf3b7), - "speaker_fill": (0xf3b8), - "speaker_slash_fill": (0xf3b9), - "speaker_3_fill": (0xf3ba), - "arrow_up_left_arrow_down_right": (0xf386), - "arrow_down_right_arrow_up_left": (0xf37d), - "mic_slash": (0xf45f), - "mic": (0xf460), - "mic_fill": (0xf461), - "clock": (0xf402, 0xf4be), - "clock_fill": (0xf403, 0xf4bf), - "lock": (0xf4c8), - "lock_fill": (0xf4c9), - "eye": (0xf424), - "eye_fill": (0xf425), - "person": (0xf47d), - "person_fill": (0xf47e), - "person_badge_plus": (0xf47f), - "person_badge_plus_fill": (0xf480), - "person_3": (0xf47b), - "person_3_fill": (0xf47c), - "envelope": (0xf422), - "envelope_fill": (0xf423), - "placemark": (0xf455), - "placemark_fill": (0xf456), - "tag": (0xf48c, 0xf48e), - "tag_fill": (0xf48d, 0xf48f), - "bus": (0xf36d), - "car_fill": (0xf36f), - "car_detailed": (0xf2c1), - "train_style_one": (0xf3af), - "train_style_two": (0xf3b4), - "paw": (0xf47a, 0xf479), - "gamecontroller": (0xf43a), - "gamecontroller_fill": (0xf43b), - "lab_flask": (0xf430), - "lab_flask_solid": (0xf431), - "heart": (0xf442), - "heart_fill": (0xf443), - "bell": (0xf3e1), - "bell_fill": (0xf3e2), - "news": (0xf471), - "news_solid": (0xf472), - "sun_max": (0xf4b6), - "sun_max_fill": (0xf4b7), -}, + "square_arrow_up": [0xf4ca, 0xf220], + "square_arrow_up_fill": [0xf4cb], + "book": [0xf3e7], + "book_fill": [0xf3e8], + "bookmark": [0xf3e9], + "bookmark_fill": [0xf3ea], + "info_circle": [0xf44c], + "arrowshape_turn_up_left": [0xf4c6], + "chat_bubble": [0xf3fb], + "person_crop_circle": [0xf419], + "plus_circle": [0xf48a], + "minus_circle": [0xf463], + "flag": [0xf42c], + "search": [0xf4a5], + "checkmark": [0xf3fd], + "checkmark_circle": [0xf3fe], + "checkmark_circle_fill": [0xf3ff], + "circle": [0xf401], + "circle_fill": [0xf400], + "chevron_left": [0xf3d2], + "chevron_right": [0xf3d3], + "chevron_back": [0xf3cf], + "chevron_forward": [0xf3d1], + "house": [0xf447], + "car": [0xf36f], + "cart": [0xf3f7], + "ellipsis": [0xf46a], + "phone": [0xf4b8], + "phone_fill": [0xf4b9], + "arrow_down": [0xf35d], + "arrow_up": [0xf366], + "battery_100": [0xf113, 0xf111, 0xf114], + "battery_0": [0xf112], + "battery_25": [0xf115], + "bluetooth": [0xf116], + "arrow_counterclockwise": [0xf21c], + "arrowshape_turn_up_left_2": [0xf21d], + "arrowshape_turn_up_left_2_fill": [0xf21e], + "shuffle": [0xf4a9, 0xf4a8, 0xf221], + "camera": [0xf3f5], + "camera_fill": [0xf3f6], + "videocam": [0xf4cc], + "videocam_fill": [0xf4cd], + "camera_rotate": [0xf49e], + "camera_rotate_fill": [0xf49f], + "rectangle_stack": [0xf3c9], + "rectangle_stack_fill": [0xf3ca], + "folder": [0xf434, 0xf38a], + "folder_fill": [0xf435], + "trash": [0xf4c4, 0xf37f], + "trash_fill": [0xf4c5], + "pencil": [0xf37e, 0xf2bf], + "square_pencil": [0xf417], + "square_pencil_fill": [0xf418], + "arrow_clockwise": [0xf49a, 0xf49d, 0xf3a8], + "arrow_clockwise_circle": [0xf49b], + "arrow_clockwise_circle_fill": [0xf49c], + "xmark": [0xf404, 0xf2d7], + "xmark_circle": [0xf405], + "xmark_circle_fill": [0xf36e, 0xf406], + "plus": [0xf489], + "plus_circle": [0xf48a], + "plus_circle_fill": [0xf48b], + "gear_alt": [0xf43c, 0xf2f7], + "gear_alt_fill": [0xf43d], + "gear": [0xf411, 0xf412], + "music_note": [0xf46b], + "music_note_2": [0xf46c], + "play": [0xf487], + "play_fill": [0xf488], + "pause": [0xf477], + "pause_fill": [0xf478], + "infinite": [0xf449, 0xf44a], + "speaker_1_fill": [0xf3b7], + "speaker_fill": [0xf3b8], + "speaker_slash_fill": [0xf3b9], + "speaker_3_fill": [0xf3ba], + "arrow_up_left_arrow_down_right": [0xf386], + "arrow_down_right_arrow_up_left": [0xf37d], + "mic_slash": [0xf45f], + "mic": [0xf460], + "mic_fill": [0xf461], + "clock": [0xf402, 0xf4be], + "clock_fill": [0xf403, 0xf4bf], + "lock": [0xf4c8], + "lock_fill": [0xf4c9], + "eye": [0xf424], + "eye_fill": [0xf425], + "person": [0xf47d], + "person_fill": [0xf47e], + "person_badge_plus": [0xf47f], + "person_badge_plus_fill": [0xf480], + "person_3": [0xf47b], + "person_3_fill": [0xf47c], + "envelope": [0xf422], + "envelope_fill": [0xf423], + "placemark": [0xf455], + "placemark_fill": [0xf456], + "tag": [0xf48c, 0xf48e], + "tag_fill": [0xf48d, 0xf48f], + "bus": [0xf36d], + "car_detailed": [0xf2c1], + "train_style_one": [0xf3af], + "train_style_two": [0xf3b4], + "paw": [0xf47a, 0xf479], + "gamecontroller": [0xf43a], + "gamecontroller_fill": [0xf43b], + "lab_flask": [0xf430], + "lab_flask_solid": [0xf431], + "heart": [0xf442], + "heart_fill": [0xf443], + "bell": [0xf3e1], + "bell_fill": [0xf3e2], + "news": [0xf471], + "news_solid": [0xf472], + "sun_max": [0xf4b6], + "sun_max_fill": [0xf4b7], +} + +# A list of glyphs that are bound to more than one dart names, +# for example, `CupertinoIcons.car_fill` refers to the same glyph +# as `CupertinoIcons.car`. The "main" name, and only the "main" name, +# must correspond to a svg file in the "src" directory. +aliases = { + "car": ["car_fill"], +} old_names = { "left_chevron": 0xf3d2, diff --git a/build/generate_font.py b/build/generate_font.py index 2cccbc6..65784fd 100755 --- a/build/generate_font.py +++ b/build/generate_font.py @@ -12,7 +12,7 @@ import copy import collections -from existing_map import mapped_codepoints +from existing_map import mapped_codepoints, aliases SCRIPT_PATH = os.path.dirname(os.path.abspath(__file__)) BLANK_PATH = os.path.join(SCRIPT_PATH, 'blank.svg') @@ -21,15 +21,21 @@ MANIFEST_PATH = os.path.join(SCRIPT_PATH, 'manifest.json') AUTO_WIDTH = True -def createGlyph(name, codepoint, file): +def createGlyph(name, codepoints, file): + assert len(codepoints) == len(set(codepoints)) + assert len(codepoints) != 0 + codepoint, *tail = codepoints glyph = f.createChar(codepoint, name) + assert not glyph.changed, ("Glyph %s is already assigned. Check for duplicated SVGs.") % glyph + if tail: + glyph.altuni = tail - if not name in build_data['icons']: - build_data['icons'][name] = [codepoint] - else: - build_data['icons'][name].append(codepoint) - glyph.importOutlines(file) + assert name not in build_data['icons'] + build_data['icons'][name] = codepoints + for alias in aliases.pop(name, []): + build_data['icons'][alias] = codepoints + glyph.importOutlines(file) # set glyph size explicitly or automatically depending on autowidth if AUTO_WIDTH: glyph.left_side_bearing = glyph.right_side_bearing = 0 @@ -41,6 +47,7 @@ def createGlyph(name, codepoint, file): # There are legacy font glyphs from different svg sources. Leave them as is. else: glyph.width = 512 + return glyph unusable_names = { # Keywords in Dart we can't use as names. @@ -71,60 +78,55 @@ def createGlyph(name, codepoint, file): # Start at this codepoint since it's the last manually used codepoint from # cupertino_icons 0.1.3. -codepoint = 0xf4d4 +last_new_codepoint = 0xf4d3 for dirname, dirnames, filenames in os.walk(INPUT_SVG_DIR): for filename in sorted(filenames): name, ext = os.path.splitext(filename) filePath = os.path.join(dirname, filename) size = os.path.getsize(filePath) - if ext in ['.svg', '.eps']: + if ext not in ['.svg', '.eps']: + continue + # hack removal of tags + svgfile = open(filePath, 'r+') + tmpsvgfile = tempfile.NamedTemporaryFile(suffix=ext, delete=False, mode='w') + svgtext = svgfile.read() + svgfile.seek(0) - # hack removal of tags - svgfile = open(filePath, 'r+') - tmpsvgfile = tempfile.NamedTemporaryFile(suffix=ext, delete=False, mode='w') - svgtext = svgfile.read() - svgfile.seek(0) + # replace the tags with 'nothing' + svgtext = svgtext.replace('', '') + svgtext = svgtext.replace('', '') - # replace the tags with 'nothing' - svgtext = svgtext.replace('', '') - svgtext = svgtext.replace('', '') + tmpsvgfile.file.write(svgtext) - tmpsvgfile.file.write(svgtext) + svgfile.close() + tmpsvgfile.file.close() - svgfile.close() - tmpsvgfile.file.close() + filePath = tmpsvgfile.name + # end hack - filePath = tmpsvgfile.name - # end hack + if (name in unusable_names): + name = unusable_names[name] - if (name in unusable_names): - name = unusable_names[name] + mapped_value = mapped_codepoints.pop(name, None) + codepoints = [(last_new_codepoint:=last_new_codepoint + 1)] if mapped_value is None else mapped_value + glyph = createGlyph(name, codepoints, filePath); - if (name in mapped_codepoints[0]): - mapped_value = mapped_codepoints[0][name] - if isinstance(mapped_value, int): - createGlyph(name, mapped_codepoints[0][name], filePath) - else: - for repeated_codepoint in mapped_codepoints[0][name]: - createGlyph(name, repeated_codepoint, filePath) - mapped_codepoints[0].pop(name) - else: - createGlyph(name, codepoint, filePath) - codepoint += 1 + # if we created a temporary file, let's clean it up + os.unlink(tmpsvgfile.name) - # if we created a temporary file, let's clean it up - os.unlink(tmpsvgfile.name) - # resize glyphs if autowidth is enabled - if AUTO_WIDTH: - f.autoWidth(0, 0, 512) +# resize glyphs if autowidth is enabled +if AUTO_WIDTH: + f.autoWidth(0, 0, 512) - fontfile = '%s/CupertinoIcons' % (OUTPUT_FONT_DIR) +fontfile = '%s/CupertinoIcons' % (OUTPUT_FONT_DIR) f.fontname = font_name f.familyname = font_name f.fullname = font_name +f.version = "1.07" +f.copyright = "" f.generate(fontfile + '.ttf') scriptPath = os.path.dirname(os.path.realpath(__file__)) @@ -135,7 +137,10 @@ def createGlyph(name, codepoint, file): manifest_data['icons'] = collections.OrderedDict(sorted(build_data['icons'].items(), key=lambda glyph: glyph[0])) print("Save Manifest, Icons: %s" % ( len(manifest_data['icons']) )) -print(f"Unused mappings {mapped_codepoints}") +if mapped_codepoints: + print(f"Unused mappings {mapped_codepoints}") +if aliases: + print(f"Unused aliases {aliases}") f = open(MANIFEST_PATH, 'w') f.write( json.dumps(manifest_data, indent=2, separators=(',', ': ')) ) f.close() diff --git a/build/manifest.json b/build/manifest.json index 8d54a57..745a6a4 100755 --- a/build/manifest.json +++ b/build/manifest.json @@ -3113,7 +3113,7 @@ 62487 ], "square_pencil_fill": [ - 62487 + 62488 ], "square_righthalf_fill": [ 63502 diff --git a/fonts/CupertinoIcons.ttf b/fonts/CupertinoIcons.ttf index 11e5aa750faebf040a875011e9b0fc33fd535113..aac97d03de6bd70face980a3e47c445ae7d2d5e3 100644 GIT binary patch delta 6951 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 Un6%ZfcFo{h6TbPmCu8IP0IkLGy8r+H delta 9447 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 \ No newline at end of file From ef645681e1b6b0c9bb7b9190a7dfe8a2dd564ddd Mon Sep 17 00:00:00 2001 From: LongCat is Looong <31859944+LongCatIsLooong@users.noreply.github.com> Date: Mon, 15 Apr 2024 08:38:38 +0800 Subject: [PATCH 3/5] bump ttf version to 1.08 --- build/generate_font.py | 2 +- fonts/CupertinoIcons.ttf | Bin 236700 -> 236700 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/build/generate_font.py b/build/generate_font.py index 65784fd..92002de 100755 --- a/build/generate_font.py +++ b/build/generate_font.py @@ -125,7 +125,7 @@ def createGlyph(name, codepoints, file): f.fontname = font_name f.familyname = font_name f.fullname = font_name -f.version = "1.07" +f.version = "1.08" f.copyright = "" f.generate(fontfile + '.ttf') diff --git a/fonts/CupertinoIcons.ttf b/fonts/CupertinoIcons.ttf index aac97d03de6bd70face980a3e47c445ae7d2d5e3..88d8e1bc46555d6772b9778ac6dd8451e14e408b 100644 GIT binary patch delta 167 zcmbQUlW)#WJ`n~+1_lORh6V;^h5$FW5Z@)ylCBd)Vwoo|zCW?V*PcmKj)B?9f`NhY zM?rpZiJe$eC9NL2@KFLyk@%~u9)CZJIa43C`Di=lKy6Jr}A5HW3I yWG;4MG@V}J%xnatmOC^1@B`R!1w%ap^XcoHnf13Dx-ch1a3h%j0Qy)f As{jB1 From 8cabb59988e1bc284446769ff9ae6eab4fc1b0b9 Mon Sep 17 00:00:00 2001 From: LongCat is Looong <31859944+LongCatIsLooong@users.noreply.github.com> Date: Mon, 15 Apr 2024 11:30:57 +0800 Subject: [PATCH 4/5] add ligature back and optimize --- build/generate_font.py | 19 ++++++++++++------- fonts/CupertinoIcons.ttf | Bin 236700 -> 257608 bytes 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/build/generate_font.py b/build/generate_font.py index 92002de..dfe82ed 100755 --- a/build/generate_font.py +++ b/build/generate_font.py @@ -15,12 +15,16 @@ from existing_map import mapped_codepoints, aliases SCRIPT_PATH = os.path.dirname(os.path.abspath(__file__)) -BLANK_PATH = os.path.join(SCRIPT_PATH, 'blank.svg') INPUT_SVG_DIR = os.path.join(SCRIPT_PATH, '..', 'src') OUTPUT_FONT_DIR = os.path.join(SCRIPT_PATH, '..', 'fonts') MANIFEST_PATH = os.path.join(SCRIPT_PATH, 'manifest.json') AUTO_WIDTH = True +def getOrCreateLigatureCompChar(char): + glyph = f.createChar(ord(char)) + glyph.width = 0 + return glyph.glyphname + def createGlyph(name, codepoints, file): assert len(codepoints) == len(set(codepoints)) assert len(codepoints) != 0 @@ -30,6 +34,8 @@ def createGlyph(name, codepoints, file): if tail: glyph.altuni = tail + glyph.addPosSub('ligacomp', [getOrCreateLigatureCompChar(c) for c in name]) + assert name not in build_data['icons'] build_data['icons'][name] = codepoints for alias in aliases.pop(name, []): @@ -61,11 +67,9 @@ def createGlyph(name, codepoints, file): f.ascent = 448 f.descent = 64 -# Import base characters -blank_glyph = f.createChar(-1, "BLANK") -blank_glyph.importOutlines(BLANK_PATH) -blank_glyph.width = 0 -blank_glyph.altuni = [ord(c) for c in "0123456789abcdefghijklmnopqrstuvwzxyz_- "] +# Add lookup table +f.addLookup("ligatable","gsub_ligature",None,(("liga",(("latn",("dflt")),)),)) +f.addLookupSubtable("ligatable","ligacomp") manifest_file = open(MANIFEST_PATH, 'r') manifest_data = json.loads(manifest_file.read()) @@ -127,7 +131,8 @@ def createGlyph(name, codepoints, file): f.fullname = font_name f.version = "1.08" f.copyright = "" -f.generate(fontfile + '.ttf') +# Generate the ttf without the glyphnames in the post table to reduce size +f.generate(fontfile + '.ttf', flags=('opentype','short-post')) scriptPath = os.path.dirname(os.path.realpath(__file__)) diff --git a/fonts/CupertinoIcons.ttf b/fonts/CupertinoIcons.ttf index 88d8e1bc46555d6772b9778ac6dd8451e14e408b..7fae6aa44ef0db950c0a5298b626c60057ab1976 100644 GIT binary patch delta 50617 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%0D_>-|aS228)@s4pIH*R=yYaVBQ&iuSN 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 z Date: Mon, 15 Apr 2024 14:37:14 +0800 Subject: [PATCH 5/5] Add ligature to aliases too --- build/generate_font.py | 8 +++++--- fonts/CupertinoIcons.ttf | Bin 257608 -> 257628 bytes 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/build/generate_font.py b/build/generate_font.py index dfe82ed..85c6113 100755 --- a/build/generate_font.py +++ b/build/generate_font.py @@ -20,7 +20,7 @@ MANIFEST_PATH = os.path.join(SCRIPT_PATH, 'manifest.json') AUTO_WIDTH = True -def getOrCreateLigatureCompChar(char): +def getOrCreateLigatureComponentFor(char): glyph = f.createChar(ord(char)) glyph.width = 0 return glyph.glyphname @@ -34,12 +34,14 @@ def createGlyph(name, codepoints, file): if tail: glyph.altuni = tail - glyph.addPosSub('ligacomp', [getOrCreateLigatureCompChar(c) for c in name]) - assert name not in build_data['icons'] build_data['icons'][name] = codepoints + glyph.addPosSub('ligacomp', [getOrCreateLigatureComponentFor(c) for c in name]) for alias in aliases.pop(name, []): + assert alias != name + assert alias build_data['icons'][alias] = codepoints + glyph.addPosSub('ligacomp', [getOrCreateLigatureComponentFor(c) for c in alias]) glyph.importOutlines(file) # set glyph size explicitly or automatically depending on autowidth diff --git a/fonts/CupertinoIcons.ttf b/fonts/CupertinoIcons.ttf index 7fae6aa44ef0db950c0a5298b626c60057ab1976..d580ce749ea55b12b92f5db7747290419c975070 100644 GIT binary patch delta 654 zcmYL{e@IhN6vxkfcYE*czF+s<_ZSnztW1W8tTZ7pk>w9sDq*w40>f&FMGgOuVUeOj zB2o>+EM!?($q0!MCK3`6G5kaNLuAB|h!F7)F(K)X5#5Qp4-SC3x?tn<#gESbZ&gPI9d~!P$TpRGr~8l z;wl`*Q+OF?99~Dz(eHTcNI4x&pYxJ)*!kX>7Ddq~wuwXHteBDnsaQHM^-FPSMfxjy z<+E}`o|2RDw#(zHc6GWQx#nHpiAah`Gl`HG`AjwxRq-i7C89j-Q$8qbDyWCl8a1R2 zt8sNn-PDLyqy@AtZA6P}OWLMR^ddc=cj+T~Twl^R4ACes{KjSDo-t`G7%5|yGFn0d zG(-nzj4sesx@{7(z^pP`&2Dqld~Gh8tL7FHSsp8A4XlGj*aJ4r7TEExY@KB+W))f$ zR+H6X^;jcT%z9^ivR15hYu6TSw_RwL*?zmpZnHyn*zUE55^J~d6r*quWDvm(PEbGx z`gn8zm-af#u9Cq(;eE~l7rME}Bx{bw p`2J*_Y&6a(hr1JWj8nF;hkpU@(NVYx6YvFg5+#F}-XQkc451SMKL6Lg`kUb&htFy@LZg8aycuTvpm27 z0A@)52!~r+Qs*yi11eM}JbT^Wi>z1IaHcKv=+}v>fa-q(%TYAXmw)^01tiSLGe0QaPza zl^NxoQgFFlM_s+Hd#)wdhAOC4>S;BqCe^pd&(Qk|yX(MaoO~v$?jb^_&W~R-oxn&7fg>}s8w1%u{YuQ@2iWuW++=zSd zEu6&5cnue9#jdb}cDp@bkJ~BxwY_F<6M>YGL!^mxlPI}M=EyRsT_N8{iDG(y9;VH- zn-0=3nxrr28@ft2=?{l@h*R$Pog+@zi8vRWUS}Zl^*Wj*CYJyiC=j-KH_*xZF;si- zB1m8|ssIL++s~K;HmFRIxGNy;s!VZD7GlV|r-nTSBjDj4FvL8-;T|&NWxi@AFp4TJ ItN)Mw7ZabK4gdfE