Diagram.py: make aligning to the baseline optional in draw_centered_text()
authorAntonio Ospite <ao2@ao2.it>
Fri, 12 Jun 2015 16:16:25 +0000 (18:16 +0200)
committerAntonio Ospite <ao2@ao2.it>
Fri, 12 Jun 2015 20:37:11 +0000 (22:37 +0200)
Diagram.py
RadialSymmetryDiagram.py

index 457d3ba..8d958f9 100755 (executable)
@@ -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])
index a54c1bb..581ad30 100755 (executable)
@@ -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: