1
0
mirror of https://github.com/ryanoasis/nerd-fonts.git synced 2024-12-25 20:18:01 +02:00

Merge pull request #736 from ryanoasis/feature/remove-selection-todo

font-patcher: Copy selection instead of continuously regenerating
This commit is contained in:
Ryan L McIntyre 2021-12-24 14:39:36 -08:00 committed by GitHub
commit a5b43f63bb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -659,10 +659,8 @@ class font_patcher:
careful = True careful = True
if exactEncoding is False: if exactEncoding is False:
sourceFontList = [] sourceFontList = list(range(sourceFontStart, sourceFontEnd + 1))
sourceFontCounter = 0 sourceFontCounter = 0
for i in range(sourceFontStart, sourceFontEnd + 1):
sourceFontList.append(format(i, 'X'))
scale_factor = 0 scale_factor = 0
if scaleGlyph: if scaleGlyph:
@ -675,21 +673,18 @@ class font_patcher:
# and only copy those that are not already contained in the source font # and only copy those that are not already contained in the source font
if symbolFontStart == 0: if symbolFontStart == 0:
symbolFont.selection.all() symbolFont.selection.all()
self.sourceFont.selection.all()
careful = True careful = True
else: else:
symbolFont.selection.select((str("ranges"), str("unicode")), symbolFontStart, symbolFontEnd) symbolFont.selection.select((str("ranges"), str("unicode")), symbolFontStart, symbolFontEnd)
self.sourceFont.selection.select((str("ranges"), str("unicode")), sourceFontStart, sourceFontEnd)
# Get number of selected non-empty glyphs @TODO FIXME # Get number of selected non-empty glyphs
for index, sym_glyph in enumerate(symbolFont.selection.byGlyphs): symbolFontSelection = list(symbolFont.selection.byGlyphs)
glyphSetLength += 1 glyphSetLength = len(symbolFontSelection)
# end for
if self.args.quiet is False: if self.args.quiet is False:
sys.stdout.write("Adding " + str(max(1, glyphSetLength)) + " Glyphs from " + setName + " Set \n") sys.stdout.write("Adding " + str(max(1, glyphSetLength)) + " Glyphs from " + setName + " Set \n")
for index, sym_glyph in enumerate(symbolFont.selection.byGlyphs): for index, sym_glyph in enumerate(symbolFontSelection):
index = max(1, index) index = max(1, index)
try: try:
@ -700,25 +695,16 @@ class font_patcher:
if exactEncoding: if exactEncoding:
# use the exact same hex values for the source font as for the symbol font # use the exact same hex values for the source font as for the symbol font
currentSourceFontGlyph = sym_glyph.encoding currentSourceFontGlyph = sym_glyph.encoding
# Save as a hex string without the '0x' prefix
copiedToSlot = format(sym_glyph.unicode, 'X')
else: else:
# use source font defined hex values based on passed in start and end # use source font defined hex values based on passed in start and end
# convince that this string really is a hex: currentSourceFontGlyph = sourceFontList[sourceFontCounter]
currentSourceFontGlyph = int("0x" + sourceFontList[sourceFontCounter], 16)
copiedToSlot = sourceFontList[sourceFontCounter]
sourceFontCounter += 1 sourceFontCounter += 1
if int(copiedToSlot, 16) < 0:
print("Found invalid glyph slot number. Skipping.")
continue
if self.args.quiet is False: if self.args.quiet is False:
if self.args.progressbars: if self.args.progressbars:
update_progress(round(float(index + 1) / glyphSetLength, 2)) update_progress(round(float(index + 1) / glyphSetLength, 2))
else: else:
progressText = "\nUpdating glyph: " + str(sym_glyph) + " " + str(sym_glyph.glyphname) + " putting at: " + copiedToSlot progressText = "\nUpdating glyph: {} {} putting at: {:X}".format(sym_glyph, sym_glyph.glyphname, currentSourceFontGlyph)
sys.stdout.write(progressText) sys.stdout.write(progressText)
sys.stdout.flush() sys.stdout.flush()
@ -726,20 +712,17 @@ class font_patcher:
sym_dim = get_glyph_dimensions(sym_glyph) sym_dim = get_glyph_dimensions(sym_glyph)
# check if a glyph already exists in this location # check if a glyph already exists in this location
if copiedToSlot.startswith("uni"):
copiedToSlot = copiedToSlot[3:]
codepoint = int("0x" + copiedToSlot, 16)
if careful or 'careful' in sym_attr['params']: if careful or 'careful' in sym_attr['params']:
if codepoint in self.sourceFont: if currentSourceFontGlyph in self.sourceFont:
if self.args.quiet is False: if self.args.quiet is False:
print(" Found existing Glyph at {}. Skipping...".format(copiedToSlot)) print(" Found existing Glyph at {:X}. Skipping...".format(currentSourceFontGlyph))
# We don't want to touch anything so move to next Glyph # We don't want to touch anything so move to next Glyph
continue continue
else: else:
# If we overwrite an existing glyph all subtable entries regarding it will be wrong # If we overwrite an existing glyph all subtable entries regarding it will be wrong
# (Probably; at least if we add a symbol and do not substitude a ligature or such) # (Probably; at least if we add a symbol and do not substitude a ligature or such)
if codepoint in self.sourceFont: if currentSourceFontGlyph in self.sourceFont:
self.sourceFont[codepoint].removePosSub("*") self.sourceFont[currentSourceFontGlyph].removePosSub("*")
# Select and copy symbol from its encoding point # Select and copy symbol from its encoding point
# We need to do this select after the careful check, this way we don't # We need to do this select after the careful check, this way we don't
@ -791,7 +774,7 @@ class font_patcher:
if 'overlap' in sym_attr['params']: if 'overlap' in sym_attr['params']:
scale_ratio_x *= 1 + sym_attr['params']['overlap'] scale_ratio_x *= 1 + sym_attr['params']['overlap']
scale_ratio_y *= 1 + sym_attr['params']['overlap'] scale_ratio_y *= 1 + sym_attr['params']['overlap']
self.sourceFont.transform(psMat.scale(scale_ratio_x, scale_ratio_y)) self.sourceFont[currentSourceFontGlyph].transform(psMat.scale(scale_ratio_x, scale_ratio_y))
# Use the dimensions from the newly pasted and stretched glyph # Use the dimensions from the newly pasted and stretched glyph
sym_dim = get_glyph_dimensions(self.sourceFont[currentSourceFontGlyph]) sym_dim = get_glyph_dimensions(self.sourceFont[currentSourceFontGlyph])
@ -822,7 +805,7 @@ class font_patcher:
x_align_distance += overlap_width x_align_distance += overlap_width
align_matrix = psMat.translate(x_align_distance, y_align_distance) align_matrix = psMat.translate(x_align_distance, y_align_distance)
self.sourceFont.transform(align_matrix) self.sourceFont[currentSourceFontGlyph].transform(align_matrix)
# Needed for setting 'advance width' on each glyph so they do not overlap, # Needed for setting 'advance width' on each glyph so they do not overlap,
# also ensures the font is considered monospaced on Windows by setting the # also ensures the font is considered monospaced on Windows by setting the
@ -834,12 +817,6 @@ class font_patcher:
# does not overlap the bearings (edges) # does not overlap the bearings (edges)
self.remove_glyph_neg_bearings(self.sourceFont[currentSourceFontGlyph]) self.remove_glyph_neg_bearings(self.sourceFont[currentSourceFontGlyph])
# reset selection so iteration works properly @TODO fix? rookie misunderstanding?
# This is likely needed because the selection was changed when the glyph was copy/pasted
if symbolFontStart == 0:
symbolFont.selection.all()
else:
symbolFont.selection.select((str("ranges"), str("unicode")), symbolFontStart, symbolFontEnd)
# end for # end for
if self.args.quiet is False or self.args.progressbars: if self.args.quiet is False or self.args.progressbars: