Revision: 3760
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3760&view=rev
Author:   mdboom
Date:     2007-08-30 12:14:55 -0700 (Thu, 30 Aug 2007)

Log Message:
-----------
Add valignment = 'baseline' feature to align text by its baseline.

Modified Paths:
--------------
    trunk/matplotlib/lib/matplotlib/afm.py
    trunk/matplotlib/lib/matplotlib/backend_bases.py
    trunk/matplotlib/lib/matplotlib/backends/backend_agg.py
    trunk/matplotlib/lib/matplotlib/backends/backend_cairo.py
    trunk/matplotlib/lib/matplotlib/backends/backend_gd.py
    trunk/matplotlib/lib/matplotlib/backends/backend_gdk.py
    trunk/matplotlib/lib/matplotlib/backends/backend_pdf.py
    trunk/matplotlib/lib/matplotlib/backends/backend_ps.py
    trunk/matplotlib/lib/matplotlib/backends/backend_svg.py
    trunk/matplotlib/lib/matplotlib/backends/backend_template.py
    trunk/matplotlib/lib/matplotlib/backends/backend_wx.py
    trunk/matplotlib/lib/matplotlib/mathtext.py
    trunk/matplotlib/lib/matplotlib/text.py

Modified: trunk/matplotlib/lib/matplotlib/afm.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/afm.py      2007-08-30 15:32:25 UTC (rev 
3759)
+++ trunk/matplotlib/lib/matplotlib/afm.py      2007-08-30 19:14:55 UTC (rev 
3760)
@@ -334,7 +334,7 @@
 
         return totalw, maxy-miny
 
-    def get_str_bbox(self, s):
+    def get_str_bbox_and_descent(self, s):
         """
         Return the string bounding box
         """
@@ -369,9 +369,15 @@
             thismin = b
             if thismin<miny: miny = thismin
 
-        return left, miny, totalw, maxy-miny
+        return left, miny, totalw, maxy-miny, -miny
 
 
+    def get_str_bbox(self, s):
+        """
+        Return the string bounding box
+        """
+        return self.get_str_bbox_and_descent(s)[:4]
+    
     def get_name_char(self, c):
         """
         Get the name of the character, ie, ';' is 'semicolon'

Modified: trunk/matplotlib/lib/matplotlib/backend_bases.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backend_bases.py    2007-08-30 15:32:25 UTC 
(rev 3759)
+++ trunk/matplotlib/lib/matplotlib/backend_bases.py    2007-08-30 19:14:55 UTC 
(rev 3760)
@@ -421,12 +421,13 @@
         """
         return transforms.lbwh_to_bbox(0,0,1,1)  # your values here
 
-    def get_text_width_height(self, s, prop, ismath):
+    def get_text_width_height_descent(self, s, prop, ismath):
         """
-        get the width and height in display coords of the string s
-        with FontPropertry prop
+        get the width and height, and the offset from the bottom to the
+        baseline (descent), in display coords of the string s with
+        FontPropertry prop
         """
-        return 1,1
+        return 1,1,1
 
     def new_gc(self):
         """

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_agg.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_agg.py     2007-08-30 
15:32:25 UTC (rev 3759)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_agg.py     2007-08-30 
19:14:55 UTC (rev 3760)
@@ -172,7 +172,7 @@
         """
         if __debug__: verbose.report('RendererAgg.draw_mathtext',
                                      'debug-annoying')
-        ox, oy, width, height, fonts, used_characters = \
+        ox, oy, width, height, descent, fonts, used_characters = \
             self.mathtext_parser.parse(s, self.dpi.get(), prop)
 
         if angle == 90:
@@ -186,7 +186,7 @@
         for font in fonts:
             if angle == 90:
                 font.horiz_image_to_vert_image() # <-- Rotate
-            self._renderer.draw_text( font, x, y, gc)
+            self._renderer.draw_text( font, x, y + 1, gc)
         if 0:
             self._renderer.draw_rectangle(gc, None,
                                           int(x),
@@ -212,10 +212,10 @@
 
         #print x, y, int(x), int(y)
 
-        self._renderer.draw_text(font, int(x), int(y), gc)
+        self._renderer.draw_text(font, int(x), int(y) + 1, gc)
 
 
-    def get_text_width_height(self, s, prop, ismath, rgb=(0,0,0)):
+    def get_text_width_height_descent(self, s, prop, ismath, rgb=(0,0,0)):
         """
         get the width and height in display coords of the string s
         with FontPropertry prop
@@ -233,15 +233,17 @@
             return n,m
 
         if ismath:
-            ox, oy, width, height, fonts, used_characters = \
+            ox, oy, width, height, descent, fonts, used_characters = \
                 self.mathtext_parser.parse(s, self.dpi.get(), prop)
-            return width, height
+            return width, height, depth
         font = self._get_agg_font(prop)
         font.set_text(s, 0.0, flags=LOAD_DEFAULT)  # the width and height of 
unrotated string
         w, h = font.get_width_height()
+        d = font.get_descent()
         w /= 64.0  # convert from subpixels
         h /= 64.0
-        return w, h
+        d /= 64.0
+        return w, h, d
 
     def draw_tex(self, gc, x, y, s, prop, angle):
         # todo, handle props, angle, origins
@@ -250,7 +252,7 @@
         dpi = self.dpi.get()
 
         flip = angle==90
-        w,h = self.get_text_width_height(s, prop, 'TeX', rgb)
+        w,h,d = self.get_text_width_height_descent(s, prop, 'TeX', rgb)
         if flip:
             w,h = h,w
             x -= w

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_cairo.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_cairo.py   2007-08-30 
15:32:25 UTC (rev 3759)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_cairo.py   2007-08-30 
19:14:55 UTC (rev 3760)
@@ -304,7 +304,7 @@
         if _debug: print '%s.%s()' % (self.__class__.__name__, _fn_name())
 
         ctx = gc.ctx
-        width, height, glyphs, rects = self.mathtext_parser.parse(
+        width, height, descent, glyphs, rects = self.mathtext_parser.parse(
             s, self.dpi.get(), prop)
 
         ctx.save()
@@ -349,12 +349,12 @@
         return self.width, self.height
 
 
-    def get_text_width_height(self, s, prop, ismath):
+    def get_text_width_height_descent(self, s, prop, ismath):
         if _debug: print '%s.%s()' % (self.__class__.__name__, _fn_name())
         if ismath:
-            width, height, fonts, used_characters = self.mathtext_parser.parse(
+            width, height, descent, fonts, used_characters = 
self.mathtext_parser.parse(
                s, self.dpi.get(), prop)
-            return width, height
+            return width, height, descent
 
         ctx = self.text_ctx
         ctx.save()
@@ -373,10 +373,10 @@
         # save/restore prevents the problem
         ctx.set_font_size (size)
 
-        w, h = ctx.text_extents (s)[2:4]
+        y_bearing, w, h = ctx.text_extents (s)[1:4]
         ctx.restore()
 
-        return w, h
+        return w, h, h + y_bearing
 
 
     def new_gc(self):

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_gd.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_gd.py      2007-08-30 
15:32:25 UTC (rev 3759)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_gd.py      2007-08-30 
19:14:55 UTC (rev 3760)
@@ -59,7 +59,7 @@
         'return the canvas width and height in display coords'
         return self.width, self.height
 
-    def get_text_width_height(self, s, prop, ismath):
+    def get_text_width_height_descent(self, s, prop, ismath):
         """
         get the width and height in display coords of the string s
         with fontsize in points
@@ -78,7 +78,7 @@
 
         w = abs(lrx - llx)
         h = abs(lly - uly)
-        return w, h
+        return w, h, h
 
 
     def flipy(self):

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_gdk.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_gdk.py     2007-08-30 
15:32:25 UTC (rev 3759)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_gdk.py     2007-08-30 
19:14:55 UTC (rev 3760)
@@ -199,7 +199,7 @@
 
 
     def _draw_mathtext(self, gc, x, y, s, prop, angle):
-        width, height, fonts, used_characters = self.mathtext_parser.parse(
+        width, height, descent, fonts, used_characters = 
self.mathtext_parser.parse(
             s, self.dpi.get(), prop)
 
         if angle==90:
@@ -340,15 +340,15 @@
     def get_canvas_width_height(self):
         return self.width, self.height
 
-    def get_text_width_height(self, s, prop, ismath):
+    def get_text_width_height_descent(self, s, prop, ismath):
         if ismath:
-            width, height, fonts, used_characters = self.mathtext_parser.parse(
+            width, height, descent, fonts, used_characters = 
self.mathtext_parser.parse(
                 s, self.dpi.get(), prop)
-            return width, height
+            return width, height, descent
 
         layout, inkRect, logicalRect = self._get_pango_layout(s, prop)
         l, b, w, h = inkRect
-        return w, h+1
+        return w, h+1, h + 1
 
     def new_gc(self):
         return GraphicsContextGDK(renderer=self)

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_pdf.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_pdf.py     2007-08-30 
15:32:25 UTC (rev 3759)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_pdf.py     2007-08-30 
19:14:55 UTC (rev 3760)
@@ -1224,7 +1224,7 @@
 
     def draw_mathtext(self, gc, x, y, s, prop, angle):
         # TODO: fix positioning and encoding
-        width, height, glyphs, rects, used_characters = \
+        width, height, descent, glyphs, rects, used_characters = \
             self.mathtext_parser.parse(s, 72, prop)
         self.merge_used_characters(used_characters)
 
@@ -1465,31 +1465,28 @@
         else:
             return draw_text_woven(chunks)
 
-    def get_text_width_height(self, s, prop, ismath):
-        # FT2Font can handle unicode, and so can we
-        # if isinstance(s, unicode):
-        #     s = s.encode('cp1252', 'replace')
-
+    def get_text_width_height_descent(self, s, prop, ismath):
         if ismath:
-            w, h, glyphs, rects, used_characters = \
+            w, h, d, glyphs, rects, used_characters = \
                 self.mathtext_parser.parse(s, 72, prop)
 
         elif rcParams['pdf.use14corefonts']:
             font = self._get_font_afm(prop)
-            l, b, w, h = font.get_str_bbox(s)
-            fontsize = prop.get_size_in_points()
-            w *= fontsize / 1000
-            h *= fontsize / 1000
-
+            l, b, w, h, d = font.get_str_bbox_and_descent(s)
+            scale = prop.get_size_in_points() / 1000.0
+            w *= scale
+            h *= scale
+            d *= scale
         else:
             font = self._get_font_ttf(prop)
             font.set_text(s, 0.0, flags=LOAD_NO_HINTING)
             w, h = font.get_width_height()
             w /= 64.0
             h /= 64.0
+            d = font.get_descent()
+            d /= 64.0
+        return w, h, d
 
-        return w, h
-
     def _get_font_afm(self, prop):
         key = hash(prop)
         font = self.afm_font_cache.get(key)

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_ps.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_ps.py      2007-08-30 
15:32:25 UTC (rev 3759)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_ps.py      2007-08-30 
19:14:55 UTC (rev 3760)
@@ -263,7 +263,7 @@
         'return the canvas width and height in display coords'
         return self.width, self.height
 
-    def get_text_width_height(self, s, prop, ismath):
+    def get_text_width_height_descent(self, s, prop, ismath):
         """
         get the width and height in display coords of the string s
         with FontPropertry prop
@@ -276,30 +276,36 @@
             w = (r-l)
             h = (t-b)
             #print s, w, h
-            return w, h
+            # TODO: We need a way to get a good baseline from
+            # text.usetex
+            return w, h, h
 
         if ismath:
-            width, height, pswriter, used_characters = \
+            width, height, descent, pswriter, used_characters = \
                 self.mathtext_parser.parse(s, 72, prop)
-            return width, height
+            return width, height, descent
 
         if rcParams['ps.useafm']:
             if ismath: s = s[1:-1]
             font = self._get_font_afm(prop)
-            l,b,w,h = font.get_str_bbox(s)
+            l,b,w,h,d = font.get_str_bbox_and_descent(s)
 
             fontsize = prop.get_size_in_points()
-            w *= 0.001*fontsize
-            h *= 0.001*fontsize
-            return w, h
+            scale = 0.001*fontsize
+            w *= scale
+            h *= scale
+            d *= scale
+            return w, h, d
 
         font = self._get_font_ttf(prop)
         font.set_text(s, 0.0, flags=LOAD_NO_HINTING)
         w, h = font.get_width_height()
         w /= 64.0  # convert from subpixels
         h /= 64.0
+        d = font.get_descent()
+        d /= 64.0
         #print s, w, h
-        return w, h
+        return w, h, d
 
     def flipy(self):
         'return true if small y numbers are top for renderer'
@@ -661,7 +667,7 @@
         """
         draw a Text instance
         """
-        w, h = self.get_text_width_height(s, prop, ismath)
+        w, h, bl = self.get_text_width_height_baseline(s, prop, ismath)
         fontsize = prop.get_size_in_points()
         corr = 0#w/2*(fontsize-10)/10
         pos = _nums_to_str(x-corr, y)
@@ -857,7 +863,7 @@
         if debugPS:
             self._pswriter.write("% mathtext\n")
 
-        width, height, pswriter, used_characters = \
+        width, height, descent, pswriter, used_characters = \
             self.mathtext_parser.parse(s, 72, prop)
         self.merge_used_characters(used_characters)
         self.set_color(*gc.get_rgb())

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_svg.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_svg.py     2007-08-30 
15:32:25 UTC (rev 3759)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_svg.py     2007-08-30 
19:14:55 UTC (rev 3760)
@@ -232,7 +232,7 @@
 
     def draw_rectangle(self, gc, rgbFace, x, y, width, height):
         details = 'width="%f" height="%f" x="%f" y="%f"' % (width, height, x,
-                                                         self.height-y-height)
+                                                            
self.height-y-height)
         self._draw_svg_element('rect', details, gc, rgbFace)
 
     def draw_text(self, gc, x, y, s, prop, angle, ismath):
@@ -241,7 +241,9 @@
             return
 
         font = self._get_font(prop)
-
+        font.set_text(s, 0.0, flags=LOAD_NO_HINTING)
+        y -= font.get_descent() / 64.0
+        
         thetext = escape_xml_text(s)
         fontfamily = font.family_name
         fontstyle = font.style_name
@@ -277,7 +279,7 @@
                 currx += kern/64.0
 
                 svg.append('<use xlink:href="#%s" 
transform="translate(%s)"/>\n'
-                           % (charid, currx))
+                           % (charid, currx * (self.FONT_SCALE / fontsize)))
 
                 currx += (glyph.linearHoriAdvance / 65536.0)
             svg.append('</g>\n')
@@ -338,7 +340,7 @@
         """
         Draw math text using matplotlib.mathtext
         """
-        width, height, svg_elements, used_characters = \
+        width, height, descent, svg_elements, used_characters = \
             self.mathtext_parser.parse(s, 72, prop)
         svg_glyphs = svg_elements.svg_glyphs
         svg_rects = svg_elements.svg_rects
@@ -426,17 +428,19 @@
     def get_canvas_width_height(self):
         return self.width, self.height
 
-    def get_text_width_height(self, s, prop, ismath):
+    def get_text_width_height_descent(self, s, prop, ismath):
         if ismath:
-            width, height, trash, used_characters = \
+            width, height, descent, trash, used_characters = \
                 self.mathtext_parser.parse(s, 72, prop)
-            return width, height
+            return width, height, descent
         font = self._get_font(prop)
         font.set_text(s, 0.0, flags=LOAD_NO_HINTING)
         w, h = font.get_width_height()
         w /= 64.0  # convert from subpixels
         h /= 64.0
-        return w, h
+        d = font.get_descent()
+        d /= 64.0
+        return w, h, d
 
 
 class FigureCanvasSVG(FigureCanvasBase):

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_template.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_template.py        
2007-08-30 15:32:25 UTC (rev 3759)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_template.py        
2007-08-30 19:14:55 UTC (rev 3760)
@@ -93,8 +93,8 @@
     def get_canvas_width_height(self):
         return 100, 100
 
-    def get_text_width_height(self, s, prop, ismath):
-        return 1, 1
+    def get_text_width_height_descent(self, s, prop, ismath):
+        return 1, 1, 1
 
     def new_gc(self):
         return GraphicsContextTemplate()

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_wx.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_wx.py      2007-08-30 
15:32:25 UTC (rev 3759)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_wx.py      2007-08-30 
19:14:55 UTC (rev 3760)
@@ -253,7 +253,7 @@
     def offset_text_height(self):
         return True
 
-    def get_text_width_height(self, s, prop, ismath):
+    def get_text_width_height_descent(self, s, prop, ismath):
         """
         get the width and height in display coords of the string s
         with FontPropertry prop
@@ -264,9 +264,9 @@
         if self.gc is None: gc = self.new_gc()
         font = self.get_wx_font(s, prop)
         self.gc.SetFont(font)
-        w, h = self.gc.GetTextExtent(s)
+        w, h, descent, leading = self.gc.GetFullTextExtent(s)
 
-        return w, h
+        return w, h, descent
 
     def get_canvas_width_height(self):
         'return the canvas width and height in display coords'
@@ -376,7 +376,7 @@
         gc.SetFont(font)
         assert gc.Ok(), "wxMemoryDC not OK to use"
 
-        w, h = self.get_text_width_height(s, prop, ismath)
+        w, h, d = self.get_text_width_height_descent(s, prop, ismath)
         x = int(x)
         y = int(y-h)
 

Modified: trunk/matplotlib/lib/matplotlib/mathtext.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/mathtext.py 2007-08-30 15:32:25 UTC (rev 
3759)
+++ trunk/matplotlib/lib/matplotlib/mathtext.py 2007-08-30 19:14:55 UTC (rev 
3760)
@@ -217,10 +217,11 @@
     def __init__(self):
         self.fonts_object = None
 
-    def set_canvas_size(self, w, h):
+    def set_canvas_size(self, w, h, d):
         'Dimension the drawing canvas; may be a noop'
         self.width  = w
         self.height = h
+        self.depth  = d
 
     def render_glyph(self, ox, oy, info):
         raise NotImplementedError()
@@ -261,12 +262,16 @@
         self._update_bbox(x1, y1, x2, y2)
 
     def get_results(self, box):
+        orig_height = box.height
+        orig_depth  = box.depth
         ship(0, 0, box)
         bbox = self.bbox
-        bbox = [bbox[0] - 2, bbox[1] - 2, bbox[2] + 2, bbox[3] + 2]
+        bbox = [bbox[0] - 1, bbox[1] - 1, bbox[2] + 1, bbox[3] + 1]
         self._switch_to_real_backend()
         self.fonts_object.set_canvas_size(
-            bbox[2] - bbox[0], bbox[3] - bbox[1])
+            bbox[2] - bbox[0],
+            (bbox[3] - bbox[1]) - orig_depth,
+            (bbox[3] - bbox[1]) - orig_height)
         ship(-bbox[0], -bbox[1], box)
         return self.fonts_object.get_results(box)
 
@@ -285,10 +290,10 @@
         self.oy = 0
         MathtextBackend.__init__(self)
     
-    def set_canvas_size(self, w, h):
-        MathtextBackend.set_canvas_size(self, w, h)
+    def set_canvas_size(self, w, h, d):
+        MathtextBackend.set_canvas_size(self, w, h, d)
         for font in self.fonts_object.get_fonts():
-            font.set_bitmap_size(int(w), int(h))
+            font.set_bitmap_size(int(w), int(h) + int(d))
 
     def render_glyph(self, ox, oy, info):
         info.font.draw_glyph_to_bitmap(
@@ -302,7 +307,8 @@
         return (self.ox,
                 self.oy,
                 self.width,
-                self.height,
+                self.height + self.depth,
+                self.depth,
                 self.fonts_object.get_fonts(),
                 self.fonts_object.get_used_characters())
 
@@ -341,9 +347,11 @@
         self.pswriter.write(ps)
 
     def get_results(self, box):
-        ship(0, 0, box)
+        ship(0, -self.depth, box)
+        print self.depth
         return (self.width,
-                self.height,
+                self.height + self.depth,
+                self.depth,
                 self.pswriter,
                 self.fonts_object.get_used_characters())
 
@@ -363,9 +371,10 @@
         self.rects.append((x1, self.height - y2, x2 - x1, y2 - y1))
 
     def get_results(self, box):
-        ship(0, 0, box)
+        ship(0, -self.depth, box)
         return (self.width,
-                self.height,
+                self.height + self.depth,
+                self.depth,
                 self.glyphs,
                 self.rects,
                 self.fonts_object.get_used_characters())
@@ -386,11 +395,12 @@
             (x1, self.height - y1 + 1, x2 - x1, y2 - y1))
 
     def get_results(self, box):
-        ship(0, 0, box)
+        ship(0, -self.depth, box)
         svg_elements = Bunch(svg_glyphs = self.svg_glyphs,
                              svg_rects = self.svg_rects)
         return (self.width,
-                self.height,
+                self.height + self.depth,
+                self.depth,
                 svg_elements,
                 self.fonts_object.get_used_characters())
 
@@ -410,9 +420,10 @@
             (x1, y1 - self.height, x2 - x1, y2 - y1))
 
     def get_results(self, box):
-        ship(0, 0, box)
+        ship(0, -self.depth, box)
         return (self.width,
-                self.height,
+                self.height + self.depth,
+                self.depth,
                 self.glyphs,
                 self.rects)
 
@@ -477,10 +488,10 @@
         info = self._get_info(font, sym, fontsize, dpi)
         return info.metrics
 
-    def set_canvas_size(self, w, h):
+    def set_canvas_size(self, w, h, d):
         'Dimension the drawing canvas; may be a noop'
-        self.width, self.height = ceil(w), ceil(h)
-        self.mathtext_backend.set_canvas_size(self.width, self.height)
+        self.width, self.height, self.depth = ceil(w), ceil(h), ceil(d)
+        self.mathtext_backend.set_canvas_size(self.width, self.height, 
self.depth)
 
     def render_glyph(self, ox, oy, facename, sym, fontsize, dpi):
         info = self._get_info(facename, sym, fontsize, dpi)
@@ -2447,7 +2458,6 @@
         cacheKey = (s, dpi, hash(prop))
         result = self._cache.get(cacheKey)
         if result is not None:
-            del self._cache[cacheKey]
             return result
 
         if self._output == 'PS' and rcParams['ps.useafm']:
@@ -2467,8 +2477,7 @@
             self.__class__._parser = Parser()
             
         box = self._parser.parse(s, font_output, fontsize, dpi)
-        w, h = box.width, box.height + box.depth
-        font_output.set_canvas_size(w, h)
+        font_output.set_canvas_size(box.width, box.height, box.depth)
         result = font_output.get_results(box)
         self._cache[cacheKey] = result
         # Free up the transient data structures

Modified: trunk/matplotlib/lib/matplotlib/text.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/text.py     2007-08-30 15:32:25 UTC (rev 
3759)
+++ trunk/matplotlib/lib/matplotlib/text.py     2007-08-30 19:14:55 UTC (rev 
3760)
@@ -20,54 +20,6 @@
 
 import matplotlib.nxutils as nxutils
 
-def scanner(s):
-    """
-    Split a string into mathtext and non-mathtext parts.  mathtext is
-    surrounded by $ symbols.  quoted \$ are ignored
-
-    All slash quotes dollar signs are ignored
-
-    The number of unquoted dollar signs must be even
-
-    Return value is a list of (substring, inmath) tuples
-    """
-    if not len(s): return [(s, False)]
-    #print 'testing', s, type(s)
-    inddollar, = npy.nonzero(npy.asarray(npy.equal(s,'$')))
-    quoted = dict([ (ind,1) for ind in 
npy.nonzero(npy.asarray(npy.equal(s,'\\')))[0]])
-    indkeep = [ind for ind in inddollar if not quoted.has_key(ind-1)]
-    if len(indkeep)==0:
-        return [(s, False)]
-    if len(indkeep)%2:
-        raise ValueError('Illegal string "%s" (must have balanced dollar 
signs)'%s)
-
-    Ns = len(s)
-
-    indkeep = [ind for ind in indkeep]
-    # make sure we start with the first element
-    if indkeep[0]!=0: indkeep.insert(0,0)
-    # and end with one past the end of the string
-    indkeep.append(Ns+1)
-
-    Nkeep = len(indkeep)
-    results = []
-
-    inmath = s[0] == '$'
-    for i in range(Nkeep-1):
-        i0, i1 = indkeep[i], indkeep[i+1]
-        if not inmath:
-            if i0>0: i0 +=1
-        else:
-            i1 += 1
-        if i0>=Ns: break
-
-        results.append((s[i0:i1], inmath))
-        inmath = not inmath
-
-    return results
-
-
-
 def _process_text_args(override, fontdict=None, **kwargs):
     "Return an override dict.  See 'text' docstring for info"
 
@@ -117,7 +69,7 @@
     text: string
     transform: a matplotlib.transform transformation instance
     variant: [ 'normal' | 'small-caps' ]
-    verticalalignment or va: [ 'center' | 'top' | 'bottom' ]
+    verticalalignment or va: [ 'center' | 'top' | 'bottom' | 'baseline' ]
     visible: [True | False]
     weight or fontweight: [ 'normal' | 'bold' | 'heavy' | 'light' | 
'ultrabold' | 'ultralight']
     x: float
@@ -130,9 +82,6 @@
     Handle storing and drawing of text in window or data coordinates
 
     """
-    # special case superscripting to speedup logplots
-    _rgxsuper = re.compile('\$([\-+0-9]+)\^\{(-?[0-9]+)\}\$')
-
     zorder = 3
     def __str__(self):
         return "Text(%g,%g,%s)"%(self._y,self._y,self._text)
@@ -237,21 +186,21 @@
         height = 0
 
         xmin, ymin = thisx, thisy
-        if self.is_math_text():
-            lines = [self._text]
-        else:
-            lines = self._text.split('\n')
+        lines = self._text.split('\n')
             
         whs = []
         # Find full vertical extent of font,
         # including ascenders and descenders:
-        tmp, heightt = renderer.get_text_width_height(
+        tmp, heightt, bl = renderer.get_text_width_height_descent(
                 'lp', self._fontproperties, ismath=False)
         offsety = heightt * self._linespacing
 
+        baseline = None
         for line in lines:
-            w,h = renderer.get_text_width_height(
-                line, self._fontproperties, ismath=self.is_math_text())
+            w, h, d = renderer.get_text_width_height_descent(
+                line, self._fontproperties, ismath=self.is_math_text(line))
+            if baseline is None:
+                baseline = h - d
             whs.append( (w,h) )
             horizLayout.append((line, thisx, thisy, w, h))
             thisy -= offsety
@@ -307,6 +256,7 @@
 
         if valign=='center': offsety = ty - (ymin + height/2.0)
         elif valign=='top': offsety  = ty - (ymin + height)
+        elif valign=='baseline': offsety = ty - (ymin + height) + baseline
         else: offsety = ty - ymin
 
         xmin += offsetx
@@ -364,49 +314,9 @@
             bbox_artist(self, renderer, self._bbox)
         angle = self.get_rotation()
 
-        ismath = self.is_math_text()
-
-        if angle==0:
-            #print 'text', self._text
-            if ismath=='TeX': m = None
-            else: m = self._rgxsuper.match(self._text)
-            if m is not None:
-                bbox, info = self._get_layout_super(self._renderer, m)
-                base, xt, yt = info[0]
-                renderer.draw_text(gc, xt, yt, base,
-                                   self._fontproperties, angle,
-                                   ismath=False)
-
-                exponent, xt, yt, fp = info[1]
-                renderer.draw_text(gc, xt, yt, exponent,
-                                   fp, angle,
-                                   ismath=False)
-                return
-
-
-        if len(self._substrings)>1:
-            # embedded mathtext
-            thisx, thisy = self._get_xy_display()
-
-            for s,ismath in self._substrings:
-                w, h = renderer.get_text_width_height(
-                    s, self._fontproperties, ismath)
-
-                renderx, rendery = thisx, thisy
-                if renderer.flipy():
-                    canvasw, canvash = renderer.get_canvas_width_height()
-                    rendery = canvash-rendery
-
-                renderer.draw_text(gc, renderx, rendery, s,
-                                   self._fontproperties, angle,
-                                   ismath)
-                thisx += w
-
-
-            return
         bbox, info = self._get_layout(renderer)
         trans = self.get_transform()
-        if ismath=='TeX':
+        if rcParams['text.usetex']:
             canvasw, canvash = renderer.get_canvas_width_height()
             for line, wh, x, y in info:
                 x, y = trans.xy_tup((x, y))
@@ -426,7 +336,7 @@
 
             renderer.draw_text(gc, x, y, line,
                                self._fontproperties, angle,
-                               ismath=self.is_math_text())
+                               ismath=self.is_math_text(line))
 
     def get_color(self):
         "Return the color of the text"
@@ -523,13 +433,6 @@
             raise RuntimeError('Cannot get window extent w/o renderer')
 
         angle = self.get_rotation()
-        if angle==0:
-            ismath = self.is_math_text()
-            if ismath=='TeX': m = None
-            else: m = self._rgxsuper.match(self._text)
-            if m is not None:
-                bbox, tmp = self._get_layout_super(self._renderer, m)
-                return bbox
         bbox, info = self._get_layout(self._renderer)
         return bbox
 
@@ -734,9 +637,9 @@
         """
         Set the vertical alignment
 
-        ACCEPTS: [ 'center' | 'top' | 'bottom' ]
+        ACCEPTS: [ 'center' | 'top' | 'bottom' | 'baseline' ]
         """
-        legal = ('top', 'bottom', 'center')
+        legal = ('top', 'bottom', 'center', 'baseline')
         if align not in legal:
             raise ValueError('Vertical alignment must be one of %s' % 
str(legal))
 
@@ -749,15 +652,12 @@
         ACCEPTS: string or anything printable with '%s' conversion
         """
         self._text = '%s' % (s,)
-        #self._substrings = scanner(s)  # support embedded mathtext
-        self._substrings = []           # ignore embedded mathtext for now
 
-    def is_math_text(self):
+    def is_math_text(self, s):
         if rcParams['text.usetex']: return 'TeX'        
 
         # Did we find an even number of non-escaped dollar signs?
         # If so, treat is as math text.
-        s = self._text
         dollar_count = s.count(r'$') - s.count(r'\$')
         if dollar_count > 0 and dollar_count % 2 == 0:
             return True
@@ -772,56 +672,6 @@
         """
         self._fontproperties = fp
 
-    def _get_layout_super(self, renderer, m):
-        """
-        a special case optimization if a log super and angle = 0
-        Basically, mathtext is slow and we can do simple superscript layout 
"by hand"
-        """
-
-        key = self.get_prop_tup()
-        if self.cached.has_key(key): return self.cached[key]
-
-        base, exponent = m.group(1), m.group(2)
-        size =  self._fontproperties.get_size_in_points()
-        fpexp = self._fontproperties.copy()
-        fpexp.set_size(0.7*size)
-        wb,hb = renderer.get_text_width_height(base, self._fontproperties, 
False)
-        we,he = renderer.get_text_width_height(exponent, fpexp, False)
-
-        w = wb+we
-
-        xb, yb = self._get_xy_display()
-        xe = xb+1.1*wb
-        ye = yb+0.5*hb
-        h = ye+he-yb
-
-
-
-
-        if self._horizontalalignment=='center':  xo = -w/2.
-        elif self._horizontalalignment=='right':  xo = -w
-        else: xo = 0
-        if self._verticalalignment=='center':    yo = -hb/2.
-        elif self._verticalalignment=='top':  yo = -hb
-        else: yo = 0
-
-        xb += xo
-        yb += yo
-        xe += xo
-        ye += yo
-        bbox = lbwh_to_bbox(xb, yb, w, h)
-
-        if renderer.flipy():
-            canvasw, canvash = renderer.get_canvas_width_height()
-            yb = canvash-yb
-            ye = canvash-ye
-
-
-        val = ( bbox, ((base, xb, yb), (exponent, xe, ye, fpexp)))
-        self.cached[key] = val
-
-        return val
-
 artist.kwdocd['Text'] = artist.kwdoc(Text)
 
 


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/
_______________________________________________
Matplotlib-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins

Reply via email to