diff --git a/Lib/fontTools/feaLib/ast.py b/Lib/fontTools/feaLib/ast.py index bbe6e6e74..17c6cc3fb 100644 --- a/Lib/fontTools/feaLib/ast.py +++ b/Lib/fontTools/feaLib/ast.py @@ -1272,15 +1272,18 @@ class MultipleSubstStatement(Statement): replaces.append(replace) replaces = list(zip(*replaces)) + seen_originals = set() for i, original in enumerate(originals): - builder.add_multiple_subst( - self.location, - prefix, - original, - suffix, - replaces and replaces[i] or (), - self.forceChain, - ) + if original not in seen_originals: + seen_originals.add(original) + builder.add_multiple_subst( + self.location, + prefix, + original, + suffix, + replaces and replaces[i] or (), + self.forceChain, + ) def asFea(self, indent=""): res = "sub " diff --git a/Tests/feaLib/data/GSUB_2.fea b/Tests/feaLib/data/GSUB_2.fea index 078cbec39..21db452b5 100644 --- a/Tests/feaLib/data/GSUB_2.fea +++ b/Tests/feaLib/data/GSUB_2.fea @@ -29,3 +29,7 @@ lookup l1 { feature f5 { sub @class' lookup l1 [i l]; } f5; + +feature f6 { + sub [f_i f_i]' j by [f f] [i i]; +} f6; diff --git a/Tests/feaLib/data/GSUB_2.ttx b/Tests/feaLib/data/GSUB_2.ttx index b2bd21bd7..fb87a0590 100644 --- a/Tests/feaLib/data/GSUB_2.ttx +++ b/Tests/feaLib/data/GSUB_2.ttx @@ -10,19 +10,20 @@ - + @@ -58,9 +59,16 @@ + + + + + + + - + @@ -135,6 +143,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +