1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
|
# Change upm
# Jens Kutilek 2013-01-02
from mojo.roboFont import version
def scalePoints(glyph, factor):
if version == "1.4":
# stupid workaround for bug in RoboFont 1.4
for contour in glyph:
for point in contour.points:
point.x *= factor
point.y *= factor
glyph.width *= factor
else:
glyph *= factor
def scaleGlyph(glyph, factor, scaleWidth=True, roundCoordinates=True):
if not(scaleWidth):
oldWidth = glyph.width
if len(glyph.components) == 0:
scalePoints(glyph, factor)
if roundCoordinates:
glyph.round()
else:
# save components
# this may be a tad too convoluted ...
components = []
for i in range(len(glyph.components)):
components.append(glyph.components[i])
for c in components:
glyph.removeComponent(c)
scalePoints(glyph, factor)
if roundCoordinates:
glyph.round()
# restore components
for i in range(len(components)):
newOffset = (int(round(components[i].offset[0] * factor)),
int(round(components[i].offset[1] * factor)))
glyph.appendComponent(components[i].baseGlyph, newOffset, components[i].scale)
if not(scaleWidth):
# restore width
glyph.width = oldWidth
def changeUPM(font, factor, roundCoordinates=True):
# Glyphs
for g in font:
scaleGlyph(g, factor)
for guide in g.guides:
# another thing that doesn't work in RoboFont 1.4 - 1.5.1
guide.x *= factor
guide.y *= factor
# Glyph layers
mainLayer = "foreground"
for layerName in font.layerOrder:
if layerName != mainLayer:
for g in font:
g.flipLayers(mainLayer, layerName)
scaleGlyph(g, factor, scaleWidth=False)
g.flipLayers(layerName, mainLayer)
# Kerning
if font.kerning:
font.kerning.scale(factor)
if roundCoordinates:
if not version in ["1.4", "1.5", "1.5.1"]:
font.kerning.round(1)
else:
print "WARNING: kerning values cannot be rounded to integer in this RoboFont version"
# TODO: Change positioning feature code?
# Vertical dimensions
font.info.descender = int(round(font.info.descender * factor))
font.info.xHeight = int(round(font.info.xHeight * factor))
font.info.capHeight = int(round(font.info.capHeight * factor))
font.info.ascender = int(round(font.info.ascender * factor))
# Finally set new UPM
font.info.unitsPerEm = newUpm
font.update()
if __name__ == "__main__":
from robofab.interface.all.dialogs import AskString
print "Change Units Per Em"
if CurrentFont() is not None:
oldUpm = CurrentFont().info.unitsPerEm
newUpm = CurrentFont().info.unitsPerEm
try:
newUpm = int(AskString("New units per em size?", oldUpm))
except:
pass
if newUpm == oldUpm:
print " Not changing upm size."
else:
factor = float(newUpm) / oldUpm
print " Scaling all font measurements by", factor
changeUPM(CurrentFont(), factor)
else:
print " Open a font first to change upm, please."
print " Done."
|