Skip to content

Commit

Permalink
Merge pull request #1718 from googlefonts/gen-kern
Browse files Browse the repository at this point in the history
[fontra-workflow] Add generate-kern-feature filter, as an alternative to ufo2ft's kern feature generator
  • Loading branch information
justvanrossum authored Oct 14, 2024
2 parents 51adc31 + 296ee86 commit ddf241a
Show file tree
Hide file tree
Showing 7 changed files with 1,683 additions and 20 deletions.
53 changes: 33 additions & 20 deletions src/fontra/workflow/actions/features.py
Original file line number Diff line number Diff line change
Expand Up @@ -185,22 +185,18 @@ async def processFeatures(self, features: OpenTypeFeatures) -> OpenTypeFeatures:
return OpenTypeFeatures(text=featureText)


vkrnTopPrefix = "kern.top."
vkrnBottomPrefix = "kern.bottom."
class BaseGenerateKerningFeature(BaseFilter):
_kernFeatureTag = "kern"
_kern1Prefix = "public.kern1."
_kern2Prefix = "public.kern2."
_dropKernAttrName = "dropKern"


def _kernKeySortFunc(item):
key, _ = item
return key.startswith(vkrnTopPrefix) or key.startswith(vkrnBottomPrefix)


@registerFilterAction("generate-vkrn-feature")
@dataclass(kw_only=True)
class GenerateVkrnFeature(BaseFilter):
dropVkrn: bool = True
def _kernKeySortFunc(self, item):
key, _ = item
return key.startswith(self._kern1Prefix) or key.startswith(self._kern2Prefix)

async def processFeatures(self, features: OpenTypeFeatures) -> OpenTypeFeatures:
verticalKerning = (await self.inputKerning).get("vkrn")
verticalKerning = (await self.inputKerning).get(self._kernFeatureTag)
if verticalKerning is None:
return features

Expand All @@ -226,16 +222,16 @@ async def processFeatures(self, features: OpenTypeFeatures) -> OpenTypeFeatures:
for groupName, group in sorted(verticalKerning.groups.items()):
w.addGroup(groupName, group)

fea = w.addFeature("vkrn")
fea = w.addFeature(self._kernFeatureTag)

for left, rightDict in sorted(
verticalKerning.values.items(), key=_kernKeySortFunc
verticalKerning.values.items(), key=self._kernKeySortFunc
):
if left.startswith(vkrnTopPrefix):
if left.startswith(self._kern1Prefix):
left = "@" + left

for right, values in sorted(rightDict.items(), key=_kernKeySortFunc):
if right.startswith(vkrnBottomPrefix):
for right, values in sorted(rightDict.items(), key=self._kernKeySortFunc):
if right.startswith(self._kern2Prefix):
right = "@" + right

values = [0 if v is None else round(v) for v in values]
Expand Down Expand Up @@ -264,10 +260,27 @@ async def getKerning(
kerning = await self.inputKerning
return (
kerning
if not self.dropVkrn
if not getattr(self, self._dropKernAttrName)
else {
kernType: kernTable
for kernType, kernTable in kerning.items()
if kernType != "vkrn"
if kernType != self._kernFeatureTag
}
)


@registerFilterAction("generate-kern-feature")
@dataclass(kw_only=True)
class GenerateKernFeature(BaseGenerateKerningFeature):
dropKern: bool = True


@registerFilterAction("generate-vkrn-feature")
@dataclass(kw_only=True)
class GenerateVkrnFeature(BaseGenerateKerningFeature):
dropVkrn: bool = True

_kernFeatureTag = "vkrn"
_kern1Prefix = "kern.top."
_kern2Prefix = "kern.bottom."
_dropKernAttrName = "dropVkrn"
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@

feature kern {
pos A B (wdth=0,wght=100:-10 wdth=0,wght=900:-20 wdth=1000,wght=100:-15 wdth=1000,wght=900:-25);
} kern;
Original file line number Diff line number Diff line change
@@ -0,0 +1,179 @@
{
"axes": {
"axes": [
{
"name": "width",
"label": "width",
"tag": "wdth",
"minValue": 0,
"defaultValue": 0,
"maxValue": 1000
},
{
"name": "weight",
"label": "weight",
"tag": "wght",
"minValue": 100,
"defaultValue": 100,
"maxValue": 900,
"mapping": [
[
100,
150
],
[
900,
850
]
]
}
]
},
"sources": {
"3aa9223b": {
"name": "Support",
"location": {
"weight": 595,
"width": 0
},
"lineMetricsHorizontalLayout": {
"ascender": {
"value": 800,
"zone": 16
},
"capHeight": {
"value": 750,
"zone": 16
},
"xHeight": {
"value": 500,
"zone": 16
},
"baseline": {
"value": 0,
"zone": -16
},
"descender": {
"value": -250,
"zone": -16
}
}
},
"5bea6334": {
"name": "LightCondensed",
"location": {
"weight": 150,
"width": 0
},
"lineMetricsHorizontalLayout": {
"ascender": {
"value": 800,
"zone": 16
},
"capHeight": {
"value": 750,
"zone": 16
},
"xHeight": {
"value": 500,
"zone": 16
},
"baseline": {
"value": 0,
"zone": -16
},
"descender": {
"value": -250,
"zone": -16
}
}
},
"5d4e7f1d": {
"name": "BoldWide",
"location": {
"weight": 850,
"width": 1000
},
"lineMetricsHorizontalLayout": {
"ascender": {
"value": 800,
"zone": 16
},
"capHeight": {
"value": 750,
"zone": 16
},
"xHeight": {
"value": 500,
"zone": 16
},
"baseline": {
"value": 0,
"zone": -16
},
"descender": {
"value": -250,
"zone": -16
}
}
},
"d7abd222": {
"name": "LightWide",
"location": {
"weight": 150,
"width": 1000
},
"lineMetricsHorizontalLayout": {
"ascender": {
"value": 800,
"zone": 16
},
"capHeight": {
"value": 750,
"zone": 16
},
"xHeight": {
"value": 500,
"zone": 16
},
"baseline": {
"value": 0,
"zone": -16
},
"descender": {
"value": -250,
"zone": -16
}
}
},
"f22d1bbd": {
"name": "BoldCondensed",
"location": {
"weight": 850,
"width": 0
},
"lineMetricsHorizontalLayout": {
"ascender": {
"value": 800,
"zone": 16
},
"capHeight": {
"value": 750,
"zone": 16
},
"xHeight": {
"value": 500,
"zone": 16
},
"baseline": {
"value": 0,
"zone": -16
},
"descender": {
"value": -250,
"zone": -16
}
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
glyph name;code points
A;U+0041,U+0061
B;U+0042,U+0062
Loading

0 comments on commit ddf241a

Please sign in to comment.