Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[subset] Revert use of NameVisitor to fix speed regression #3214

Merged
merged 2 commits into from
Jul 20, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
55 changes: 42 additions & 13 deletions Lib/fontTools/subset/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
from fontTools.subset.cff import *
from fontTools.subset.svg import *
from fontTools.varLib import varStore # for subset_varidxes
from fontTools.ttLib.tables._n_a_m_e import NameRecordVisitor
import sys
import struct
import array
Expand Down Expand Up @@ -2586,10 +2585,25 @@ def collect_colors_by_index(paint):

if self.version == 1:
kept_labels = []
dropped_labels = []
for i, label in enumerate(self.paletteEntryLabels):
if i in retained_palette_indices:
kept_labels.append(label)
else:
dropped_labels.append(label)
self.paletteEntryLabels = kept_labels
# Remove dropped labels from the name table.
name_table = font["name"]
name_table.names = [
n
for n in name_table.names
if (
n.nameID not in dropped_labels
# Only remove nameIDs in the user range and if they're not explicitly kept
or n.nameID < 256
or n.nameID in options.name_IDs
)
]
return bool(self.numPaletteEntries)


Expand Down Expand Up @@ -2901,10 +2915,32 @@ def prune_pre_subset(self, font, options):


@_add_method(ttLib.getTableClass("name"))
def prune_post_subset(self, font, options):
visitor = NameRecordVisitor()
visitor.visit(font)
nameIDs = set(options.name_IDs) | visitor.seen
def prune_pre_subset(self, font, options):
nameIDs = set(options.name_IDs)
fvar = font.get("fvar")
if fvar:
nameIDs.update([axis.axisNameID for axis in fvar.axes])
nameIDs.update([inst.subfamilyNameID for inst in fvar.instances])
nameIDs.update(
[
inst.postscriptNameID
for inst in fvar.instances
if inst.postscriptNameID != 0xFFFF
]
)
stat = font.get("STAT")
if stat:
if stat.table.AxisValueArray:
nameIDs.update(
[val_rec.ValueNameID for val_rec in stat.table.AxisValueArray.AxisValue]
)
nameIDs.update(
[axis_rec.AxisNameID for axis_rec in stat.table.DesignAxisRecord.Axis]
)
cpal = font.get("CPAL")
if cpal and cpal.version == 1:
nameIDs.update(cpal.paletteLabels)
nameIDs.update(cpal.paletteEntryLabels)
if "*" not in options.name_IDs:
self.names = [n for n in self.names if n.nameID in nameIDs]
if not options.name_legacy:
Expand Down Expand Up @@ -3427,14 +3463,7 @@ def _subset_glyphs(self, font):
font.setGlyphOrder(self.new_glyph_order)

def _prune_post_subset(self, font):
tableTags = font.keys()
# Prune the name table last because when we're pruning the name table,
# we visit each table in the font to see what name table records are
# still in use.
if "name" in tableTags:
tableTags.remove("name")
tableTags.append("name")
for tag in tableTags:
for tag in font.keys():
if tag == "GlyphOrder":
continue
if tag == "OS/2":
Expand Down
3 changes: 0 additions & 3 deletions Lib/fontTools/ttLib/tables/_n_a_m_e.py
Original file line number Diff line number Diff line change
Expand Up @@ -242,9 +242,6 @@ def removeUnusedNames(ttFont):
if record.nameID not in visitor.seen:
toDelete.add(record.nameID)

if not toDelete:
return
log.info(f"Deleting name records with NameIDs {toDelete}")
for nameID in toDelete:
ttFont["name"].removeNames(nameID)
return toDelete
Expand Down