Revision: 3722
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3722&view=rev
Author:   mdboom
Date:     2007-08-21 08:19:04 -0700 (Tue, 21 Aug 2007)

Log Message:
-----------
Prevent the mathtext cache from getting out of hand, by clearing it
after every plot.

Modified Paths:
--------------
    trunk/matplotlib/lib/matplotlib/backends/backend_agg.py
    trunk/matplotlib/lib/matplotlib/backends/backend_agg2.py
    trunk/matplotlib/lib/matplotlib/backends/backend_cairo.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_qt.py
    trunk/matplotlib/lib/matplotlib/backends/backend_qt4.py
    trunk/matplotlib/lib/matplotlib/backends/backend_svg.py
    trunk/matplotlib/lib/matplotlib/mathtext.py

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_agg.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_agg.py     2007-08-21 
15:13:49 UTC (rev 3721)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_agg.py     2007-08-21 
15:19:04 UTC (rev 3722)
@@ -83,7 +83,7 @@
 from matplotlib.figure import Figure
 from matplotlib.font_manager import findfont
 from matplotlib.ft2font import FT2Font, LOAD_DEFAULT
-from matplotlib.mathtext import math_parse_s_ft2font
+from matplotlib.mathtext import MathTextParser
 from matplotlib.transforms import lbwh_to_bbox
 
 from _backend_agg import RendererAgg as _RendererAgg
@@ -125,8 +125,8 @@
 
         self.copy_from_bbox = self._renderer.copy_from_bbox
         self.restore_region = self._renderer.restore_region
+        self.mathtext_parser = MathTextParser('Agg')
 
-
         self.bbox = lbwh_to_bbox(0,0, self.width, self.height)
         if __debug__: verbose.report('RendererAgg.__init__ done',
                                      'debug-annoying')
@@ -173,7 +173,7 @@
         """
         if __debug__: verbose.report('RendererAgg.draw_mathtext',
                                      'debug-annoying')
-        width, height, fonts, used_characters = math_parse_s_ft2font(
+        width, height, fonts, used_characters = self.mathtext_parser.parse(
             s, self.dpi.get(), prop)
 
         if angle == 90:
@@ -230,7 +230,7 @@
             return n,m
 
         if ismath:
-            width, height, fonts, used_characters = math_parse_s_ft2font(
+            width, height, fonts, used_characters = self.mathtext_parser.parse(
                 s, self.dpi.get(), prop)
             return width, height
         font = self._get_agg_font(prop)

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_agg2.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_agg2.py    2007-08-21 
15:13:49 UTC (rev 3721)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_agg2.py    2007-08-21 
15:19:04 UTC (rev 3722)
@@ -16,7 +16,7 @@
 from matplotlib.cbook import enumerate, is_string_like, exception_to_str
 from matplotlib.figure import Figure
 from matplotlib.ft2font import FT2Font
-from matplotlib.mathtext import math_parse_s_ft2font
+from matplotlib.mathtext import MathTextParser
 
 
 from _backend_agg import RendererAgg as _RendererAgg

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_cairo.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_cairo.py   2007-08-21 
15:13:49 UTC (rev 3721)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_cairo.py   2007-08-21 
15:19:04 UTC (rev 3722)
@@ -38,7 +38,7 @@
      FigureManagerBase, FigureCanvasBase
 from matplotlib.cbook        import enumerate, izip
 from matplotlib.figure       import Figure
-from matplotlib.mathtext     import math_parse_s_cairo
+from matplotlib.mathtext     import MathTextParser
 from matplotlib.transforms   import Bbox
 from matplotlib.font_manager import ttfFontProperty
 from matplotlib import rcParams
@@ -92,8 +92,8 @@
         self.dpi = dpi
         self.text_ctx = cairo.Context (
            cairo.ImageSurface (cairo.FORMAT_ARGB32,1,1))
+        self.mathtext_parser = MathTextParser('Cairo')
 
-
     def set_ctx_from_surface (self, surface):
        self.ctx = cairo.Context (surface)
        self.ctx.save() # restore, save  - when call new_gc()
@@ -304,7 +304,7 @@
         if _debug: print '%s.%s()' % (self.__class__.__name__, _fn_name())
 
         ctx = gc.ctx
-        width, height, glyphs, rects = math_parse_s_cairo(
+        width, height, glyphs, rects = self.mathtext_parser.parse(
             s, self.dpi.get(), prop)
 
         ctx.save()
@@ -352,7 +352,7 @@
     def get_text_width_height(self, s, prop, ismath):
         if _debug: print '%s.%s()' % (self.__class__.__name__, _fn_name())
         if ismath:
-            width, height, fonts, used_characters = math_parse_s_cairo(
+            width, height, fonts, used_characters = self.mathtext_parser.parse(
                s, self.dpi.get(), prop)
             return width, height
 

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_gdk.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_gdk.py     2007-08-21 
15:13:49 UTC (rev 3721)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_gdk.py     2007-08-21 
15:19:04 UTC (rev 3722)
@@ -24,7 +24,7 @@
      FigureManagerBase, FigureCanvasBase
 from matplotlib.cbook import is_string_like, enumerate
 from matplotlib.figure import Figure
-from matplotlib.mathtext import math_parse_s_ft2font
+from matplotlib.mathtext import MathTextParser
 
 from matplotlib.backends._backend_gdk import pixbuf_get_pixels_array
 
@@ -71,6 +71,7 @@
         self.gtkDA = gtkDA
         self.dpi   = dpi
         self._cmap = gtkDA.get_colormap()
+        self.mathtext_parser = MathTextParser("Agg")
 
     def set_pixmap (self, pixmap):
         self.gdkDrawable = pixmap
@@ -198,7 +199,7 @@
 
 
     def _draw_mathtext(self, gc, x, y, s, prop, angle):
-        width, height, fonts, used_characters = math_parse_s_ft2font(
+        width, height, fonts, used_characters = self.mathtext_parser.parse(
             s, self.dpi.get(), prop)
 
         if angle==90:
@@ -341,7 +342,7 @@
 
     def get_text_width_height(self, s, prop, ismath):
         if ismath:
-            width, height, fonts, used_characters = math_parse_s_ft2font(
+            width, height, fonts, used_characters = self.mathtext_parser.parse(
                 s, self.dpi.get(), prop)
             return width, height
 

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_pdf.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_pdf.py     2007-08-21 
15:13:49 UTC (rev 3721)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_pdf.py     2007-08-21 
15:19:04 UTC (rev 3722)
@@ -29,7 +29,7 @@
 from matplotlib.dviread import Dvi
 from matplotlib.ft2font import FT2Font, FIXED_WIDTH, ITALIC, LOAD_NO_SCALE, \
     LOAD_NO_HINTING, KERNING_UNFITTED
-from matplotlib.mathtext import math_parse_s_pdf
+from matplotlib.mathtext import MathTextParser
 from matplotlib.transforms import Bbox
 from matplotlib import ttconv
 
@@ -1032,6 +1032,7 @@
             self.encode_string = self.encode_string_type3
         else:
             self.encode_string = self.encode_string_type42
+        self.mathtext_parser = MathTextParser("Pdf")
 
     def finalize(self):
         self.gc.finalize()
@@ -1219,7 +1220,7 @@
     def draw_mathtext(self, gc, x, y, s, prop, angle):
         # TODO: fix positioning and encoding
         width, height, glyphs, rects, used_characters = \
-            math_parse_s_pdf(s, 72, prop)
+            self.mathtext_parser.parse(s, 72, prop)
         self.merge_used_characters(used_characters)
 
         # When using Type 3 fonts, we can't use character codes higher
@@ -1466,7 +1467,7 @@
 
         if ismath:
             w, h, glyphs, rects, used_characters = \
-                math_parse_s_pdf(s, 72, prop)
+                self.mathtext_parser.parse(s, 72, prop)
 
         elif rcParams['pdf.use14corefonts']:
             font = self._get_font_afm(prop)

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_ps.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_ps.py      2007-08-21 
15:13:49 UTC (rev 3721)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_ps.py      2007-08-21 
15:19:04 UTC (rev 3722)
@@ -21,7 +21,7 @@
 from matplotlib.font_manager import findfont
 from matplotlib.ft2font import FT2Font, KERNING_DEFAULT, LOAD_NO_HINTING
 from matplotlib.ttconv import convert_ttf_to_ps
-from matplotlib.mathtext import math_parse_s_ps
+from matplotlib.mathtext import MathTextParser
 from matplotlib.text import Text
 
 from matplotlib.transforms import get_vec6_scales
@@ -144,6 +144,7 @@
         self.fontd = {}
         self.afmfontd = {}
         self.used_characters = {}
+        self.mathtext_parser = MathTextParser("PS")
 
     def track_characters(self, font, s):
         """Keeps track of which characters are required from
@@ -277,8 +278,8 @@
             return w, h
 
         if ismath:
-            width, height, pswriter, used_characters = math_parse_s_ps(
-                s, 72, prop)
+            width, height, pswriter, used_characters = \
+                self.mathtext_parser.parse(s, 72, prop)
             return width, height
 
         if rcParams['ps.useafm']:
@@ -814,7 +815,7 @@
             self._pswriter.write("% mathtext\n")
 
         width, height, pswriter, used_characters = \
-            math_parse_s_ps(s, 72, prop)
+            self.mathtext_parser.parse(s, 72, prop)
         self.merge_used_characters(used_characters)
         self.set_color(*gc.get_rgb())
         thetext = pswriter.getvalue()

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_qt.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_qt.py      2007-08-21 
15:13:49 UTC (rev 3721)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_qt.py      2007-08-21 
15:19:04 UTC (rev 3722)
@@ -10,7 +10,7 @@
      FigureManagerBase, FigureCanvasBase, NavigationToolbar2, cursors
 from matplotlib._pylab_helpers import Gcf
 from matplotlib.figure import Figure
-from matplotlib.mathtext import math_parse_s_ft2font
+from matplotlib.mathtext import MathTextParser
 from matplotlib.widgets import SubplotTool
 
 import qt

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_qt4.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_qt4.py     2007-08-21 
15:13:49 UTC (rev 3721)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_qt4.py     2007-08-21 
15:19:04 UTC (rev 3722)
@@ -10,7 +10,7 @@
      FigureManagerBase, FigureCanvasBase, NavigationToolbar2, cursors
 from matplotlib._pylab_helpers import Gcf
 from matplotlib.figure import Figure
-from matplotlib.mathtext import math_parse_s_ft2font
+from matplotlib.mathtext import MathTextParser
 from matplotlib.widgets import SubplotTool
 
 from PyQt4 import QtCore, QtGui

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_svg.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_svg.py     2007-08-21 
15:13:49 UTC (rev 3721)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_svg.py     2007-08-21 
15:19:04 UTC (rev 3722)
@@ -9,7 +9,7 @@
 from matplotlib.figure import Figure
 from matplotlib.font_manager import findfont, FontProperties
 from matplotlib.ft2font import FT2Font, KERNING_DEFAULT, LOAD_NO_HINTING
-from matplotlib.mathtext import math_parse_s_ft2font_svg
+from matplotlib.mathtext import MathTextParser
 
 from xml.sax.saxutils import escape as escape_xml_text
 
@@ -40,6 +40,7 @@
             self._imaged = {}
         self._clipd = {}
         self._char_defs = {}
+        self.mathtext_parser = MathTextParser('SVG')
         svgwriter.write(svgProlog%(width,height,width,height))
 
     def _draw_svg_element(self, element, details, gc, rgbFace):
@@ -338,7 +339,7 @@
         Draw math text using matplotlib.mathtext
         """
         width, height, svg_elements, used_characters = \
-            math_parse_s_ft2font_svg(s, 72, prop)
+            self.mathtext_parser.parse(s, 72, prop)
         svg_glyphs = svg_elements.svg_glyphs
         svg_rects = svg_elements.svg_rects
         color = rgb2hex(gc.get_rgb())
@@ -428,7 +429,7 @@
     def get_text_width_height(self, s, prop, ismath):
         if ismath:
             width, height, trash, used_characters = \
-                math_parse_s_ft2font_svg(s, 72, prop)
+                self.mathtext_parser.parse(s, 72, prop)
             return width, height
         font = self._get_font(prop)
         font.set_text(s, 0.0, flags=LOAD_NO_HINTING)

Modified: trunk/matplotlib/lib/matplotlib/mathtext.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/mathtext.py 2007-08-21 15:13:49 UTC (rev 
3721)
+++ trunk/matplotlib/lib/matplotlib/mathtext.py 2007-08-21 15:19:04 UTC (rev 
3722)
@@ -532,7 +532,7 @@
             slanted = slanted
             )
 
-        self.glyphd[key] = Bunch(
+        result = self.glyphd[key] = Bunch(
             font            = font,
             fontsize        = fontsize,
             postscript_name = font.postscript_name,
@@ -542,7 +542,7 @@
             glyph           = glyph,
             offset          = offset
             )
-        return self.glyphd[key]
+        return result
 
     def get_xheight(self, font, fontsize, dpi):
         cached_font = self._get_font(font)
@@ -2343,7 +2343,7 @@
 ##############################################################################
 # MAIN
 
-class math_parse_s_ft2font_common:
+class MathTextParser:
     """
     Parse the math expression s, return the (bbox, fonts) tuple needed
     to render it.
@@ -2352,40 +2352,38 @@
 
     return is width, height, fonts
     """
-    major, minor1, minor2, tmp, tmp = sys.version_info
-    if major==2 and minor1==2:
-        raise SystemExit('mathtext broken on python2.2.  We hope to get this 
fixed soon')
-
     _parser = None
-
+    
     _backend_mapping = {
         'Agg'   : MathtextBackendAgg,
         'PS'    : MathtextBackendPs,
-        'PDF'   : MathtextBackendPdf,
+        'Pdf'   : MathtextBackendPdf,
         'SVG'   : MathtextBackendSvg,
         'Cairo' : MathtextBackendCairo
         }
 
     def __init__(self, output):
-        self.output = output
-        self.cache = {}
+        self._output = output
+        self._cache = {}
 
-    def __call__(self, s, dpi, prop):
+    def parse(self, s, dpi, prop):
         cacheKey = (s, dpi, hash(prop))
-        if self.cache.has_key(cacheKey):
-            result = self.cache[cacheKey]
+        result = self._cache.get(cacheKey)
+        if result is not None:
             return result
 
-        if self.output == 'PS' and rcParams['ps.useafm']:
+        if self._output == 'PS' and rcParams['ps.useafm']:
             font_output = StandardPsFonts(prop)
         else:
-            backend = self._backend_mapping[self.output]()
+            backend = self._backend_mapping[self._output]()
             if rcParams['mathtext.use_cm']:
                 font_output = BakomaFonts(prop, backend)
             else:
                 font_output = UnicodeFonts(prop, backend)
 
         fontsize = prop.get_size_in_points()
+        # This is a class variable so we don't rebuild the parser
+        # with each request.
         if self._parser is None:
             self.__class__._parser = Parser()
         box = self._parser.parse(s, font_output, fontsize, dpi)
@@ -2395,7 +2393,7 @@
         font_output.set_canvas_size(w, h)
         ship(2, 2, box)
         result = font_output.get_results()
-        self.cache[cacheKey] = result
+        self._cache[cacheKey] = result
         # Free up the transient data structures
         self._parser.clear()
         # Remove a cyclical reference
@@ -2403,8 +2401,8 @@
 
         return result
 
-math_parse_s_ft2font = math_parse_s_ft2font_common('Agg')
-math_parse_s_ft2font_svg = math_parse_s_ft2font_common('SVG')
-math_parse_s_ps = math_parse_s_ft2font_common('PS')
-math_parse_s_pdf = math_parse_s_ft2font_common('PDF')
-math_parse_s_cairo = math_parse_s_ft2font_common('Cairo')
+# math_parse_s_ft2font = math_parse_s_ft2font_common('Agg')
+# math_parse_s_ft2font_svg = math_parse_s_ft2font_common('SVG')
+# math_parse_s_ps = math_parse_s_ft2font_common('PS')
+# math_parse_s_pdf = math_parse_s_ft2font_common('PDF')
+# math_parse_s_cairo = math_parse_s_ft2font_common('Cairo')


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