From 3ad27a2c463cbaeb6989828ed1925869e55e193a Mon Sep 17 00:00:00 2001 From: Antonio Ospite Date: Fri, 12 Jun 2015 18:16:25 +0200 Subject: [PATCH] Diagram.py: make aligning to the baseline optional in draw_centered_text() --- Diagram.py | 39 +++++++++++++++++++++++++++------------ RadialSymmetryDiagram.py | 3 ++- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/Diagram.py b/Diagram.py index 457d3ba..8d958f9 100755 --- a/Diagram.py +++ b/Diagram.py @@ -208,16 +208,28 @@ class Diagram(object): cr.restore() - def draw_centered_text(self, cx, cy, text, theta=0, color=[0, 0, 0], bounding_box=False): + def draw_centered_text(self, cx, cy, text, theta=0, + color=[0, 0, 0], + align_baseline=False, + bb_fill=True, bb_fill_color=[1, 1, 1, 0.8], + bb_stroke=False, bb_stroke_color=[0, 0, 0, 0.5]): cr = self.cr x_bearing, y_bearing, width, height, x_advance = cr.text_extents(text)[:5] ascent, descent = cr.font_extents()[:2] # The offset of the lower-left corner of the text. - # NOTE: y is kept on the baseline tx = width / 2.0 + x_bearing - ty = 0 + + if align_baseline: + # When aligning to the baseline it is convenient the make the + # bounding box depend on the font vertical extent and not from the + # text content. + ty = 0 + bb = [0, -descent, width, ascent] + else: + ty = height / 2.0 + y_bearing + bb = [0, y_bearing, width, height] # Angles are intended clockwise by the caller, but the trigonometric # functions below consider angles counter-clockwise @@ -230,7 +242,10 @@ class Diagram(object): cr.save() cr.translate(rx, ry) cr.rotate(theta) - self.draw_rect(0, -descent, width, ascent, fill_color=[1, 1, 1, 0.8], stroke=bounding_box) + + if bb_fill or bb_stroke: + self.draw_rect(bb[0], bb[1], bb[2], bb[3], bb_fill, bb_fill_color, bb_stroke, bb_stroke_color) + r, g, b, a = self.color_to_rgba(color) cr.set_source_rgba(r, g, b, a) cr.move_to(0, 0) @@ -253,28 +268,28 @@ if __name__ == "__main__": theta = 0 - advance = diagram.draw_centered_text(x_offset, y, "Ciao", theta, bounding_box=True) + advance = diagram.draw_centered_text(x_offset, y, "Ciao", theta, align_baseline=True, bb_stroke=True) x_offset += advance - advance = diagram.draw_centered_text(x_offset, y, "____", theta + pi / 4, bounding_box=True) + advance = diagram.draw_centered_text(x_offset, y, "____", theta + pi / 4, align_baseline=True, bb_stroke=True) x_offset += advance - advance = diagram.draw_centered_text(x_offset, y, "jxpqdlf", theta + pi / 2, bounding_box=True) + advance = diagram.draw_centered_text(x_offset, y, "jxpqdlf", theta + pi / 2, align_baseline=True, bb_stroke=True) x_offset += advance - advance = diagram.draw_centered_text(x_offset, y, "pppp", theta + 3 * pi / 4, bounding_box=True) + advance = diagram.draw_centered_text(x_offset, y, "pppp", theta + 3 * pi / 4, align_baseline=True, bb_stroke=True) x_offset += advance - advance = diagram.draw_centered_text(x_offset, y, "dddd", theta + pi, bounding_box=True) + advance = diagram.draw_centered_text(x_offset, y, "dddd", theta + pi, align_baseline=True, bb_stroke=True) x_offset += advance - advance = diagram.draw_centered_text(x_offset, y, "Jjjj", theta + 5 * pi / 4, bounding_box=True) + advance = diagram.draw_centered_text(x_offset, y, "Jjjj", theta + 5 * pi / 4, align_baseline=True, bb_stroke=True) x_offset += advance - advance = diagram.draw_centered_text(x_offset, y, "1369", theta + 3 * pi / 2, bounding_box=True) + advance = diagram.draw_centered_text(x_offset, y, "1369", theta + 3 * pi / 2, align_baseline=True, bb_stroke=True) x_offset += advance - advance = diagram.draw_centered_text(x_offset, y, "qqqq", theta + 7 * pi / 4, bounding_box=True) + advance = diagram.draw_centered_text(x_offset, y, "qqqq", theta + 7 * pi / 4, align_baseline=True, bb_stroke=True) x_offset += advance diagram.draw_line(0, y, 400, y, [0, 0, 1, 0.2]) diff --git a/RadialSymmetryDiagram.py b/RadialSymmetryDiagram.py index a54c1bb..581ad30 100755 --- a/RadialSymmetryDiagram.py +++ b/RadialSymmetryDiagram.py @@ -91,7 +91,8 @@ class RadialSymmetryDiagram(Diagram.Diagram): text = ("%.2f" % (ta * 360)).rstrip('0').rstrip('.') color = colorsys.hsv_to_rgb(a, 1.0, 1.0) self.draw_centered_text(v[0], v[1], text, - rotated_radial_orientation_angle, color) + rotated_radial_orientation_angle, color, + align_baseline=True) def draw_element(self, x, y, model, theta, color=[0, 0, 0]): if model.show_elements: -- 2.1.4