Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save frankrolf/e60e0966ef25915b9f55789b8c954962 to your computer and use it in GitHub Desktop.
Save frankrolf/e60e0966ef25915b9f55789b8c954962 to your computer and use it in GitHub Desktop.
Robofont: skew selected segments to Italic angle
import math
def calc_vector(p1, p2):
x1, y1 = p1
x2, y2 = p2
return x2 - x1, y2 - y1
def calc_distance(p1, p2):
return math.hypot(*calc_vector(p1, p2))
def calc_angle(p1, p2):
dx, dy = calc_vector(p1, p2)
return math.atan2(dy, dx)
def polar_point(center, radius, angle):
'''
Get points on a circle for arbitrary angle
'''
x = center[0] + radius * math.cos(angle)
y = center[1] + radius * math.sin(angle)
return x, y
g = CurrentGlyph()
italic_angle = (math.pi / 2) + math.radians(g.font.info.italicAngle)
sel_segments = [s for c in g.contours for s in c.segments if s.selected]
g.prepareUndo('skew segments')
for segment in sel_segments:
point = segment.points[-1]
contour = segment.contour
prev_segment = contour[segment.index - 1 % len(contour.segments)]
prev_point = prev_segment.points[-1]
point_a, point_b = prev_point.position, point.position
segment_angle = calc_angle(point_a, point_b)
segment_length = calc_distance(point_a, point_b)
segment_center = polar_point(point_a, segment_length / 2, segment_angle)
target_angle = italic_angle
if segment_angle < 0:
segment_angle += math.pi
skew = math.degrees(segment_angle) - math.degrees(target_angle)
prev_point.skewBy((skew, 0), segment_center)
point.skewBy((skew, 0), segment_center)
prev_point.round()
point.round()
g.changed()
g.performUndo()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment