|
From: <md...@us...> - 2007-08-29 18:10:48
|
Revision: 3750
http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3750&view=rev
Author: mdboom
Date: 2007-08-29 10:54:42 -0700 (Wed, 29 Aug 2007)
Log Message:
-----------
Fix leaks of FT2Font objects.
Modified Paths:
--------------
trunk/matplotlib/lib/matplotlib/backends/backend_agg.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-28 20:29:37 UTC (rev 3749)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_agg.py 2007-08-29 17:54:42 UTC (rev 3750)
@@ -89,9 +89,7 @@
from _backend_agg import RendererAgg as _RendererAgg
backend_version = 'v2.2'
-_fontd = {} # a map from fname to font instances
-
class RendererAgg(RendererBase):
"""
The renderer handles all the drawing primitives using a graphics
@@ -126,7 +124,8 @@
self.copy_from_bbox = self._renderer.copy_from_bbox
self.restore_region = self._renderer.restore_region
self.mathtext_parser = MathTextParser('Agg')
-
+ self._fontd = {}
+
self.bbox = lbwh_to_bbox(0,0, self.width, self.height)
if __debug__: verbose.report('RendererAgg.__init__ done',
'debug-annoying')
@@ -298,12 +297,12 @@
'debug-annoying')
key = hash(prop)
- font = _fontd.get(key)
+ font = self._fontd.get(key)
if font is None:
fname = findfont(prop)
font = FT2Font(str(fname))
- _fontd[key] = font
+ self._fontd[key] = font
font.clear()
size = prop.get_size_in_points()
Modified: trunk/matplotlib/lib/matplotlib/backends/backend_svg.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_svg.py 2007-08-28 20:29:37 UTC (rev 3749)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_svg.py 2007-08-29 17:54:42 UTC (rev 3750)
@@ -23,7 +23,6 @@
return manager
-_fontd = {}
_capstyle_d = {'projecting' : 'square', 'butt' : 'butt', 'round': 'round',}
class RendererSVG(RendererBase):
FONT_SCALE = 1200.0
@@ -41,6 +40,7 @@
self._clipd = {}
self._char_defs = {}
self.mathtext_parser = MathTextParser('SVG')
+ self.fontd = {}
svgwriter.write(svgProlog%(width,height,width,height))
def _draw_svg_element(self, element, details, gc, rgbFace):
@@ -56,11 +56,11 @@
def _get_font(self, prop):
key = hash(prop)
- font = _fontd.get(key)
+ font = self.fontd.get(key)
if font is None:
fname = findfont(prop)
font = FT2Font(str(fname))
- _fontd[key] = font
+ self.fontd[key] = font
font.clear()
size = prop.get_size_in_points()
font.set_size(size, 72.0)
Modified: trunk/matplotlib/lib/matplotlib/mathtext.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/mathtext.py 2007-08-28 20:29:37 UTC (rev 3749)
+++ trunk/matplotlib/lib/matplotlib/mathtext.py 2007-08-29 17:54:42 UTC (rev 3750)
@@ -430,6 +430,11 @@
self.mathtext_backend.fonts_object = self
self.used_characters = {}
+ def destroy(self):
+ """Fix any cyclical references before the object is about
+ to be destroyed."""
+ self.used_characters = None
+
def get_kern(self, font1, sym1, fontsize1,
font2, sym2, fontsize2, dpi):
"""
@@ -461,7 +466,7 @@
xmin, xmax, ymin, ymax - the ink rectangle of the glyph
iceberg - the distance from the baseline to the top of the glyph.
horiBearingY in Truetype parlance, height in TeX parlance
- """
+ """
info = self._get_info(font, sym, fontsize, dpi)
return info.metrics
@@ -494,8 +499,10 @@
return self.mathtext_backend.get_results(box)
def get_sized_alternatives_for_symbol(self, fontname, sym):
- """Override if your font provides multiple sizes of the same
- symbol."""
+ """
+ Override if your font provides multiple sizes of the same
+ symbol.
+ """
return [(fontname, sym)]
class TruetypeFonts(Fonts):
@@ -503,10 +510,6 @@
A generic base class for all font setups that use Truetype fonts
(through ft2font)
"""
- """
- Use the Bakoma true type fonts for rendering
- """
- # allocate a new set of fonts
basepath = os.path.join( get_data_path(), 'fonts', 'ttf' )
class CachedFont:
@@ -529,6 +532,14 @@
self.fonts['default'] = default_font
+ def destroy(self):
+ self.glyphd = None
+ for cached_font in self.fonts.values():
+ cached_font.charmap = None
+ cached_font.glyphmap = None
+ cached_font.font = None
+ Fonts.destroy(self)
+
def _get_font(self, font):
"""Looks up a CachedFont with its charmap and inverse charmap.
font may be a TeX font name (cal, rm, it etc.), or postscript name."""
@@ -2401,7 +2412,7 @@
##############################################################################
# MAIN
-class MathTextParser:
+class MathTextParser(object):
"""
Parse the math expression s, return the (bbox, fonts) tuple needed
to render it.
@@ -2453,7 +2464,10 @@
self._cache[cacheKey] = result
# Free up the transient data structures
self._parser.clear()
- # Remove a cyclical reference
+
+ # Fix cyclical references
+ font_output.destroy()
font_output.mathtext_backend.fonts_object = None
-
+ font_output.mathtext_backend = None
+
return result
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|