12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- def lookupKerningValue(
- pair, kerning, groups, fallback=0, glyphToFirstGroup=None, glyphToSecondGroup=None
- ):
- """
- Note: This expects kerning to be a flat dictionary
- of kerning pairs, not the nested structure used
- in kerning.plist.
- >>> groups = {
- ... "public.kern1.O" : ["O", "D", "Q"],
- ... "public.kern2.E" : ["E", "F"]
- ... }
- >>> kerning = {
- ... ("public.kern1.O", "public.kern2.E") : -100,
- ... ("public.kern1.O", "F") : -200,
- ... ("D", "F") : -300
- ... }
- >>> lookupKerningValue(("D", "F"), kerning, groups)
- -300
- >>> lookupKerningValue(("O", "F"), kerning, groups)
- -200
- >>> lookupKerningValue(("O", "E"), kerning, groups)
- -100
- >>> lookupKerningValue(("O", "O"), kerning, groups)
- 0
- >>> lookupKerningValue(("E", "E"), kerning, groups)
- 0
- >>> lookupKerningValue(("E", "O"), kerning, groups)
- 0
- >>> lookupKerningValue(("X", "X"), kerning, groups)
- 0
- >>> lookupKerningValue(("public.kern1.O", "public.kern2.E"),
- ... kerning, groups)
- -100
- >>> lookupKerningValue(("public.kern1.O", "F"), kerning, groups)
- -200
- >>> lookupKerningValue(("O", "public.kern2.E"), kerning, groups)
- -100
- >>> lookupKerningValue(("public.kern1.X", "public.kern2.X"), kerning, groups)
- 0
- """
- # quickly check to see if the pair is in the kerning dictionary
- if pair in kerning:
- return kerning[pair]
- # create glyph to group mapping
- if glyphToFirstGroup is not None:
- assert glyphToSecondGroup is not None
- if glyphToSecondGroup is not None:
- assert glyphToFirstGroup is not None
- if glyphToFirstGroup is None:
- glyphToFirstGroup = {}
- glyphToSecondGroup = {}
- for group, groupMembers in groups.items():
- if group.startswith("public.kern1."):
- for glyph in groupMembers:
- glyphToFirstGroup[glyph] = group
- elif group.startswith("public.kern2."):
- for glyph in groupMembers:
- glyphToSecondGroup[glyph] = group
- # get group names and make sure first and second are glyph names
- first, second = pair
- firstGroup = secondGroup = None
- if first.startswith("public.kern1."):
- firstGroup = first
- first = None
- else:
- firstGroup = glyphToFirstGroup.get(first)
- if second.startswith("public.kern2."):
- secondGroup = second
- second = None
- else:
- secondGroup = glyphToSecondGroup.get(second)
- # make an ordered list of pairs to look up
- pairs = [
- (first, second),
- (first, secondGroup),
- (firstGroup, second),
- (firstGroup, secondGroup),
- ]
- # look up the pairs and return any matches
- for pair in pairs:
- if pair in kerning:
- return kerning[pair]
- # use the fallback value
- return fallback
- if __name__ == "__main__":
- import doctest
- doctest.testmod()
|