Revision: 3670
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3670&view=rev
Author:   mdboom
Date:     2007-08-03 10:27:20 -0700 (Fri, 03 Aug 2007)

Log Message:
-----------
Minor speed improvements from profiling.  Fix kerning corruption issue when
"shrinking" characters.

Modified Paths:
--------------
    trunk/matplotlib/examples/mathtext_examples.py
    trunk/matplotlib/lib/matplotlib/mathtext.py

Modified: trunk/matplotlib/examples/mathtext_examples.py
===================================================================
--- trunk/matplotlib/examples/mathtext_examples.py      2007-08-02 22:49:01 UTC 
(rev 3669)
+++ trunk/matplotlib/examples/mathtext_examples.py      2007-08-03 17:27:20 UTC 
(rev 3670)
@@ -9,6 +9,7 @@
     r'$100\%y\ x*y\ x/y x\$y$',
     r'$x\leftarrow y\ x\forall y\ x-y$',
     r'$x \sf x \bf x {\cal X} \rm x$',
+    r'$x\ x\,x\;x\quad x\qquad x\!x$',
     r'$\{ \rm braces \}$',
     r'$\left[\left\lfloor\frac{5}{\frac{\left(3\right)}{4}} y\right)\right]$',
     r'$\left(x\right)$',
@@ -35,13 +36,29 @@
     r"$f'$",
     r'$\frac{x_2888}{y}$',
     r"$\sqrt[3]{\frac{X_2}{Y}}=5$",
+    r"$\sqrt[5x\pi]{\prod^\frac{x}{2\pi^2}_\infty}$",
     r"$\sqrt[3]{x}=5$",
     r'$\frac{X}{\frac{X}{Y}}$',
+    # From UTR #25
+    r"$W^{3\beta}_{\delta_1 \rho_1 \sigma_2} = U^{3\beta}_{\delta_1 \rho_1} + 
\frac{1}{8 \pi 2} \int^{\alpha_2}_{\alpha_2} d \alpha^\prime_2 \left[\frac{ 
U^{2\beta}_{\delta_1 \rho_1} - \alpha^\prime_2U^{1\beta}_{\rho_1 \sigma_2} 
}{U^{0\beta}_{\rho_1 \sigma_2}}\right]$",
+    r'$\mathcal{H} = \int d \tau (\epsilon E^2 + \mu H^2)$',
     r'$\widehat{abc}\widetilde{def}$'
     ]
 
 from pylab import *
 
+def doall():
+    for i, s in enumerate(stests):
+        print "%02d: %s" % (i, s)
+        plot([0,0,3], 'r')
+        x = arange(0.0, 3.0, 0.1)
+
+        grid(True)
+        text(0.1, 1.6, s, fontsize=20, markup="tex")
+
+        savefig('mathtext_example%02d' % i)
+        figure()
+
 if '--latex' in sys.argv:
     fd = open("mathtext_examples.ltx", "w")
     fd.write("\\documentclass{article}\n")
@@ -57,14 +74,4 @@
 
     os.system("pdflatex mathtext_examples.ltx")
 else:
-    for i, s in enumerate(stests):
-        print "%02d: %s" % (i, s)
-        plot([1,2,3], 'r')
-        x = arange(0.0, 3.0, 0.1)
-
-        grid(True)
-        text(1, 1.6, s, fontsize=20, markup="tex")
-
-        savefig('mathtext_example%02d' % i)
-        figure()
-
+    doall()

Modified: trunk/matplotlib/lib/matplotlib/mathtext.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/mathtext.py 2007-08-02 22:49:01 UTC (rev 
3669)
+++ trunk/matplotlib/lib/matplotlib/mathtext.py 2007-08-03 17:27:20 UTC (rev 
3670)
@@ -135,8 +135,9 @@
 from sets import Set
 from unicodedata import category
 from warnings import warn
-import numpy
 
+from numpy import inf, isinf
+
 from matplotlib import verbose
 from matplotlib.pyparsing import Literal, Word, OneOrMore, ZeroOrMore, \
      Combine, Group, Optional, Forward, NotAny, alphas, nums, alphanums, \
@@ -554,7 +555,7 @@
         
     def _get_offset(self, cached_font, glyph, fontsize, dpi):
         if cached_font.font.postscript_name == 'Cmex10':
-            return glyph.height/64.0/2 + 256.0/64.0 * dpi/72.0
+            return glyph.height/64.0/2.0 + 256.0/64.0 * dpi/72.0
         return 0.
 
     def _get_glyph(self, fontname, sym, fontsize):
@@ -654,7 +655,7 @@
             # This is a total hack, but it works for now
             if sym.startswith('\\big'):
                 uniindex = get_unicode_index(sym[4:])
-                fontsize *= INV_SHRINK_FACTOR
+                fontsize *= GROW_FACTOR
             else:
                 warn("No TeX to unicode mapping for '%s'" % sym,
                      MathTextWarning)
@@ -848,7 +849,7 @@
 
 # How much text shrinks when going to the next-smallest level
 SHRINK_FACTOR   = 0.7
-INV_SHRINK_FACTOR = 1.0 / SHRINK_FACTOR
+GROW_FACTOR     = 1.0 / SHRINK_FACTOR
 # The number of different sizes of chars to use, beyond which they will not
 # get any smaller
 NUM_SIZE_LEVELS = 4
@@ -900,28 +901,22 @@
     @135"""
     def __init__(self, width, height, depth):
         Node.__init__(self)
-        self.width        = width
-        self.height       = height
-        self.depth        = depth
+        self.width  = width
+        self.height = height
+        self.depth  = depth
 
     def shrink(self):
         Node.shrink(self)
         if self.size < NUM_SIZE_LEVELS:
-            if self.width is not None:
-                self.width        *= SHRINK_FACTOR
-            if self.height is not None:
-                self.height       *= SHRINK_FACTOR
-            if self.depth is not None:
-                self.depth        *= SHRINK_FACTOR
+            self.width  *= SHRINK_FACTOR
+            self.height *= SHRINK_FACTOR
+            self.depth  *= SHRINK_FACTOR
 
     def grow(self):
         Node.grow(self)
-        if self.width is not None:
-            self.width        *= INV_SHRINK_FACTOR
-        if self.height is not None:
-            self.height       *= INV_SHRINK_FACTOR
-        if self.depth is not None:
-            self.depth        *= INV_SHRINK_FACTOR
+        self.width  *= GROW_FACTOR
+        self.height *= GROW_FACTOR
+        self.depth  *= GROW_FACTOR
                 
     def render(self, x1, y1, x2, y2):
         pass
@@ -992,12 +987,16 @@
         Node.shrink(self)
         if self.size < NUM_SIZE_LEVELS:
             self.fontsize *= SHRINK_FACTOR
-            self._update_metrics()
+            self.width    *= SHRINK_FACTOR
+            self.height   *= SHRINK_FACTOR
+            self.depth    *= SHRINK_FACTOR
 
     def grow(self):
         Node.grow(self)
-        self.fontsize *= INV_SHRINK_FACTOR
-        self._update_metrics()
+        self.fontsize *= GROW_FACTOR
+        self.width    *= GROW_FACTOR
+        self.height   *= GROW_FACTOR
+        self.depth    *= GROW_FACTOR
             
 class Accent(Char):
     """The font metrics need to be dealt with differently for accents, since 
they
@@ -1028,10 +1027,11 @@
         self.glue_order   = 0    # The order of infinity (0 - 3) for the glue
 
     def __repr__(self):
-        return '[%s <%d %d %d %d> %s]' % (self.__internal_repr__(),
-                                          self.width, self.height,
-                                          self.depth, self.shift_amount,
-                                          ' '.join([repr(x) for x in 
self.children]))
+        return '[%s <%.02f %.02f %.02f %.02f> %s]' % (
+            self.__internal_repr__(),
+            self.width, self.height,
+            self.depth, self.shift_amount,
+            ' '.join([repr(x) for x in self.children]))
 
     def _determine_order(self, totals):
         """A helper function to determine the highest order of glue
@@ -1069,8 +1069,8 @@
         for child in self.children:
             child.grow()
         Box.grow(self)
-        self.shift_amount *= INV_SHRINK_FACTOR
-        self.glue_set     *= INV_SHRINK_FACTOR
+        self.shift_amount *= GROW_FACTOR
+        self.glue_set     *= GROW_FACTOR
             
 class Hlist(List):
     """A horizontal list of boxes.
@@ -1131,7 +1131,7 @@
                 d = max(d, p.depth)
             elif isinstance(p, Box):
                 x += p.width
-                if p.height is not None and p.depth is not None:
+                if not isinf(p.height) and not isinf(p.depth):
                     s = getattr(p, 'shift_amount', 0.)
                     h = max(h, p.height - s)
                     d = max(d, p.depth + s)
@@ -1167,7 +1167,7 @@
         List.__init__(self, elements)
         self.vpack()
 
-    def vpack(self, h=0., m='additional', l=float(numpy.inf)):
+    def vpack(self, h=0., m='additional', l=float(inf)):
         """The main duty of vpack is to compute the dimensions of the
         resulting boxes, and to adjust the glue if one of those dimensions is
         pre-specified.
@@ -1192,7 +1192,7 @@
             if isinstance(p, Box):
                 x += d + p.height
                 d = p.depth
-                if p.width is not None:
+                if not isinf(p.width):
                     s = getattr(p, 'shift_amount', 0.)
                     w = max(w, p.width + s)
             elif isinstance(p, Glue):
@@ -1234,7 +1234,7 @@
 class Rule(Box):
     """A Rule node stands for a solid black rectangle; it has width,
     depth, and height fields just as in an Hlist. However, if any of these
-    dimensions is None, the actual value will be determined by running the
+    dimensions is inf, the actual value will be determined by running the
     rule up to the boundary of the innermost enclosing box. This is called
     a "running dimension." The width is never running in an Hlist; the
     height and depth are never running in a Vlist.
@@ -1252,14 +1252,14 @@
         thickness = state.font_output.get_underline_thickness(
             state.font, state.fontsize, state.dpi)
         height = depth = thickness * 0.5
-        Rule.__init__(self, None, height, depth, state)
+        Rule.__init__(self, inf, height, depth, state)
 
 class Vrule(Rule):
     """Convenience class to create a vertical rule."""
     def __init__(self, state):
         thickness = state.font_output.get_underline_thickness(
             state.font, state.fontsize, state.dpi)
-        Rule.__init__(self, thickness, None, None, state)
+        Rule.__init__(self, thickness, inf, inf, state)
         
 class Glue(Node):
     """Most of the information in this object is stored in the underlying
@@ -1291,7 +1291,7 @@
         Node.grow(self)
         if self.glue_spec.width != 0.:
             self.glue_spec = self.glue_spec.copy()
-            self.glue_spec.width *= INV_SHRINK_FACTOR
+            self.glue_spec.width *= GROW_FACTOR
                 
 class GlueSpec(object):
     """@150, @151"""
@@ -1379,6 +1379,9 @@
         Node.__init__(self)
         self.width = width
 
+    def __repr__(self):
+        return "k%.02f" % self.width
+        
     def shrink(self):
         Node.shrink(self)
         if self.size < NUM_SIZE_LEVELS:
@@ -1386,7 +1389,7 @@
 
     def grow(self):
         Node.grow(self)
-        self.width *= INV_SHRINK_FACTOR
+        self.width *= GROW_FACTOR
         
 class SubSuperCluster(Hlist):
     """This class is a sort of hack to get around that fact that this
@@ -1507,9 +1510,9 @@
                 rule_height = p.height
                 rule_depth  = p.depth
                 rule_width  = p.width
-                if rule_height is None:
+                if isinf(rule_height):
                     rule_height = box.height
-                if rule_depth is None:
+                if isinf(rule_depth):
                     rule_depth = box.depth
                 if rule_height > 0 and rule_width > 0:
                     self.cur_v = baseline + rule_depth
@@ -1566,7 +1569,7 @@
                 rule_height = p.height
                 rule_depth = p.depth
                 rule_width = p.width
-                if rule_width is None:
+                if isinf(rule_width):
                     rule_width = box.width
                 rule_height += rule_depth
                 if rule_height > 0 and rule_depth > 0:
@@ -1822,7 +1825,7 @@
 
         self._expression <<(
                          non_math
-                       + OneOrMore(
+                       + ZeroOrMore(
                            Suppress(math_delim)
                          + math
                          + Suppress(math_delim)
@@ -2178,7 +2181,8 @@
         else:
             if not isinstance(root, ParseResults):
                 raise ParseFatalException(
-                    "Can not parse root of radical.  Only simple symbols are 
allowed.")
+                    "Can not parse root of radical. "
+                    "Only simple symbols are allowed in the root.")
             root = Hlist(root.asList())
             root.shrink()
             root.shrink()


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
Matplotlib-checkins@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins

Reply via email to