summaryrefslogtreecommitdiff
path: root/misc/rf-scripts/GridAdjust.py
diff options
context:
space:
mode:
Diffstat (limited to 'misc/rf-scripts/GridAdjust.py')
-rw-r--r--misc/rf-scripts/GridAdjust.py83
1 files changed, 83 insertions, 0 deletions
diff --git a/misc/rf-scripts/GridAdjust.py b/misc/rf-scripts/GridAdjust.py
new file mode 100644
index 000000000..f14550b4a
--- /dev/null
+++ b/misc/rf-scripts/GridAdjust.py
@@ -0,0 +1,83 @@
+#
+# This script changes the width of any glyph which width is not an even multiple of 256.
+# For glyphs that are updated, the shape(s) inside the glyph are centered as well.
+#
+from mojo.roboFont import version
+from math import ceil, floor
+
+if __name__ == "__main__":
+ font = CurrentFont()
+ print "Fitting glyphs to EM grid at 256 %r" % font
+
+ # Strategy to use for centering a glyph when resizing its EM:
+ # "center" Ignore existing margins and center in EM at on integer units.
+ # "adjust-margins" Attempt to retain existing margins w/o centering inside EM.
+ centeringStrategy = 'center'
+
+ if font is not None:
+ for g in font:
+ # only consider adjusting the listed glyphs
+ # if g.unicode not in (0x212B, 0x005A, 0x0387):
+ # continue
+
+ if g.width < 2:
+ # ignore zero width glyph
+ # print 'ignoring %r -- zero width' % g
+ continue
+
+ if g.width % 256 == 0:
+ # ignore already aligned glyph
+ # print 'ignoring %r -- already aligned' % g
+ continue
+
+ width = g.width
+ if g.rightMargin < 128:
+ width = ceil(width / 256) * 256
+ else:
+ width = round(width / 256) * 256
+
+ # center glyph in EM
+ leftMargin = g.leftMargin
+ rightMargin = g.rightMargin
+
+ if centeringStrategy == 'adjust-margins':
+ # Adjust margins to place the glyph in the center while retaining original
+ # left/right margins.
+ widthDelta = width - g.width
+ leftMargin = g.leftMargin + int(floor(widthDelta / 2))
+ rightMargin = g.rightMargin + int(ceil(widthDelta / 2))
+ elif centeringStrategy == 'center':
+ # Read g.box (effective bounds of the glyph) and truly center the
+ # glyph, but we could run the risk of losing some intentionally-left or right
+ # aligned glyph, e.g. "|x |" -> "| x |"
+ if g.box is not None:
+ xMin, yMin, xMax, yMax = g.box
+ graphicWidth = xMax - xMin
+ leftMargin = round((width - graphicWidth) / 2)
+ else:
+ print 'Unexpected centeringStrategy value'
+ break
+
+ # log message
+ uniname = ''
+ if g.unicode is not None:
+ uniname = ' U+%04X' % g.unicode
+ print 'Adjusting "%s"%s from %g to %g' % (g.name, uniname, g.width, width)
+
+ # write changes to glyph
+ g.lib['interface.gridadjust.original'] = repr({
+ "rightMargin": g.rightMargin,
+ "leftMargin": g.leftMargin,
+ "width": g.width,
+ })
+
+ # order of assignment is probably important
+ g.rightMargin = int(rightMargin)
+ g.leftMargin = int(leftMargin)
+ g.width = int(width)
+
+ font.update()
+ else:
+ print "No fonts open"
+
+ print "Done"