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:
commit
a5b43f63bb
49
font-patcher
49
font-patcher
@ -659,10 +659,8 @@ class font_patcher:
|
||||
careful = True
|
||||
|
||||
if exactEncoding is False:
|
||||
sourceFontList = []
|
||||
sourceFontList = list(range(sourceFontStart, sourceFontEnd + 1))
|
||||
sourceFontCounter = 0
|
||||
for i in range(sourceFontStart, sourceFontEnd + 1):
|
||||
sourceFontList.append(format(i, 'X'))
|
||||
|
||||
scale_factor = 0
|
||||
if scaleGlyph:
|
||||
@ -675,21 +673,18 @@ class font_patcher:
|
||||
# and only copy those that are not already contained in the source font
|
||||
if symbolFontStart == 0:
|
||||
symbolFont.selection.all()
|
||||
self.sourceFont.selection.all()
|
||||
careful = True
|
||||
else:
|
||||
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
|
||||
for index, sym_glyph in enumerate(symbolFont.selection.byGlyphs):
|
||||
glyphSetLength += 1
|
||||
# end for
|
||||
# Get number of selected non-empty glyphs
|
||||
symbolFontSelection = list(symbolFont.selection.byGlyphs)
|
||||
glyphSetLength = len(symbolFontSelection)
|
||||
|
||||
if self.args.quiet is False:
|
||||
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)
|
||||
|
||||
try:
|
||||
@ -700,25 +695,16 @@ class font_patcher:
|
||||
if exactEncoding:
|
||||
# use the exact same hex values for the source font as for the symbol font
|
||||
currentSourceFontGlyph = sym_glyph.encoding
|
||||
|
||||
# Save as a hex string without the '0x' prefix
|
||||
copiedToSlot = format(sym_glyph.unicode, 'X')
|
||||
else:
|
||||
# use source font defined hex values based on passed in start and end
|
||||
# convince that this string really is a hex:
|
||||
currentSourceFontGlyph = int("0x" + sourceFontList[sourceFontCounter], 16)
|
||||
copiedToSlot = sourceFontList[sourceFontCounter]
|
||||
currentSourceFontGlyph = sourceFontList[sourceFontCounter]
|
||||
sourceFontCounter += 1
|
||||
|
||||
if int(copiedToSlot, 16) < 0:
|
||||
print("Found invalid glyph slot number. Skipping.")
|
||||
continue
|
||||
|
||||
if self.args.quiet is False:
|
||||
if self.args.progressbars:
|
||||
update_progress(round(float(index + 1) / glyphSetLength, 2))
|
||||
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.flush()
|
||||
|
||||
@ -726,20 +712,17 @@ class font_patcher:
|
||||
sym_dim = get_glyph_dimensions(sym_glyph)
|
||||
|
||||
# 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 codepoint in self.sourceFont:
|
||||
if currentSourceFontGlyph in self.sourceFont:
|
||||
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
|
||||
continue
|
||||
else:
|
||||
# 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)
|
||||
if codepoint in self.sourceFont:
|
||||
self.sourceFont[codepoint].removePosSub("*")
|
||||
if currentSourceFontGlyph in self.sourceFont:
|
||||
self.sourceFont[currentSourceFontGlyph].removePosSub("*")
|
||||
|
||||
# Select and copy symbol from its encoding point
|
||||
# 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']:
|
||||
scale_ratio_x *= 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
|
||||
sym_dim = get_glyph_dimensions(self.sourceFont[currentSourceFontGlyph])
|
||||
@ -822,7 +805,7 @@ class font_patcher:
|
||||
x_align_distance += overlap_width
|
||||
|
||||
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,
|
||||
# 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)
|
||||
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
|
||||
|
||||
if self.args.quiet is False or self.args.progressbars:
|
||||
|
Loading…
Reference in New Issue
Block a user