def get_line_height(font): # just a bunch of high and low characters, idk how to do this better _, bb_top, _, bb_bottom = font.getbbox("Ålgjpqvy") return bb_bottom - bb_top def min_with_none(*args): result = None for arg in args: if arg is not None: if result is None: result = arg else: result = min(result, arg) return result def max_with_none(*args): result = None for arg in args: if arg is not None: if result is None: result = arg else: result = max(result, arg) return result def line_intersection(line1, line2): # copied from https://stackoverflow.com/a/20677983 xdiff = (line1[0][0] - line1[1][0], line2[0][0] - line2[1][0]) ydiff = (line1[0][1] - line1[1][1], line2[0][1] - line2[1][1]) def det(a, b): return a[0] * b[1] - a[1] * b[0] div = det(xdiff, ydiff) if div == 0: print(line1, line2) raise Exception('lines do not intersect') d = (det(*line1), det(*line2)) x = det(d, xdiff) / div y = det(d, ydiff) / div return x, y