Revision: 3787
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3787&view=rev
Author:   mdboom
Date:     2007-09-05 08:23:09 -0700 (Wed, 05 Sep 2007)

Log Message:
-----------
Use cmex for symbols that don't have any equivalent in Unicode (the
vertically sized things, in particular).  Simplify fallback_to_cm
code, now that font buffers are handled differently.

Modified Paths:
--------------
    trunk/matplotlib/lib/matplotlib/_mathtext_data.py
    trunk/matplotlib/lib/matplotlib/mathtext.py

Modified: trunk/matplotlib/lib/matplotlib/_mathtext_data.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/_mathtext_data.py   2007-09-05 15:21:08 UTC 
(rev 3786)
+++ trunk/matplotlib/lib/matplotlib/_mathtext_data.py   2007-09-05 15:23:09 UTC 
(rev 3787)
@@ -243,6 +243,29 @@
     r'\spadesuit'           : ('cmsy10',   7),
     }
 
+latex_to_cmex = {
+    r'\__sqrt__'   : 112,
+    r'\bigcap'     : 92,
+    r'\bigcup'     : 91,
+    r'\bigodot'    : 75,
+    r'\bigoplus'   : 77,
+    r'\bigotimes'  : 79,
+    r'\biguplus'   : 93,
+    r'\bigvee'     : 95,
+    r'\bigwedge'   : 94,
+    r'\coprod'     : 97,
+    r'\int'        : 90,
+    r'\leftangle'  : 173,
+    r'\leftbrace'  : 169,
+    r'\oint'       : 73,
+    r'\prod'       : 89,
+    r'\rightangle' : 174,
+    r'\rightbrace' : 170,
+    r'\sum'        : 88,
+    r'\widehat'    : 98,
+    r'\widetilde'  : 101,
+}
+
 latex_to_standard = {
     r'\cong'            : ('psyr', 64),
     r'\Delta'           : ('psyr', 68),

Modified: trunk/matplotlib/lib/matplotlib/mathtext.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/mathtext.py 2007-09-05 15:21:08 UTC (rev 
3786)
+++ trunk/matplotlib/lib/matplotlib/mathtext.py 2007-09-05 15:23:09 UTC (rev 
3787)
@@ -146,7 +146,8 @@
 from matplotlib.ft2font import FT2Font, FT2Image, KERNING_DEFAULT, 
LOAD_DEFAULT, LOAD_NO_HINTING
 from matplotlib.font_manager import findfont, FontProperties
 from matplotlib._mathtext_data import latex_to_bakoma, \
-        latex_to_standard, tex2uni, type12uni, tex2type1, uni2type1
+        latex_to_standard, tex2uni, type12uni, tex2type1, uni2type1, \
+        latex_to_cmex
 from matplotlib import get_data_path, rcParams
 
 ####################
@@ -581,10 +582,9 @@
             self.fonts[font.postscript_name.lower()] = cached_font
         return cached_font
 
-    def get_fonts(self):
-        return list(set([x.font for x in self.fonts.values()]))
-
     def _get_offset(self, cached_font, glyph, fontsize, dpi):
+        if cached_font.font.postscript_name == 'Cmex10':
+            return glyph.height/64.0/2.0 + 256.0/64.0 * dpi/72.0
         return 0.
 
     def _get_info (self, fontname, sym, fontsize, dpi, mark_as_used=True):
@@ -676,11 +676,6 @@
                 self.fontmap[key] = fullpath
                 self.fontmap[val] = fullpath
 
-    def _get_offset(self, cached_font, glyph, fontsize, dpi):
-        if cached_font.font.postscript_name == 'Cmex10':
-            return glyph.height/64.0/2.0 + 256.0/64.0 * dpi/72.0
-        return 0.
-
     _slanted_symbols = Set(r"\int \oint".split())
 
     def _get_glyph(self, fontname, sym, fontsize):
@@ -719,21 +714,21 @@
                         ('ex', '\x22')],
         ']'          : [('rm', ']'), ('ex', '\xa4'), ('ex', '\x69'),
                         ('ex', '\x23')],
-        r'\lfloor'   : [('cal', '\x62'), ('ex', '\xa5'), ('ex', '\x6a'),
+        r'\lfloor'   : [('ex', '\xa5'), ('ex', '\x6a'),
                         ('ex', '\xb9'), ('ex', '\x24')],
-        r'\rfloor'   : [('cal', '\x63'), ('ex', '\xa6'), ('ex', '\x6b'),
+        r'\rfloor'   : [('ex', '\xa6'), ('ex', '\x6b'),
                         ('ex', '\xba'), ('ex', '\x25')],
-        r'\lceil'    : [('cal', '\x64'), ('ex', '\xa7'), ('ex', '\x6c'),
+        r'\lceil'    : [('ex', '\xa7'), ('ex', '\x6c'),
                         ('ex', '\xbb'), ('ex', '\x26')],
-        r'\rceil'    : [('cal', '\x65'), ('ex', '\xa8'), ('ex', '\x6d'),
+        r'\rceil'    : [('ex', '\xa8'), ('ex', '\x6d'),
                         ('ex', '\xbc'), ('ex', '\x27')],
-        r'\langle'   : [('cal', '\x68'), ('ex', '\xad'), ('ex', '\x44'),
+        r'\langle'   : [('ex', '\xad'), ('ex', '\x44'),
                         ('ex', '\xbf'), ('ex', '\x2a')],
-        r'\rangle'   : [('cal', '\x69'), ('ex', '\xae'), ('ex', '\x45'),
+        r'\rangle'   : [('ex', '\xae'), ('ex', '\x45'),
                         ('ex', '\xc0'), ('ex', '\x2b')],
-        r'\__sqrt__' : [('cal', '\x70'), ('ex', '\x70'), ('ex', '\x71'),
+        r'\__sqrt__' : [('ex', '\x70'), ('ex', '\x71'),
                         ('ex', '\x72'), ('ex', '\x73')],
-        r'\backslash': [('cal', '\x6e'), ('ex', '\xb2'), ('ex', '\x2f'),
+        r'\backslash': [('ex', '\xb2'), ('ex', '\x2f'),
                         ('ex', '\xc2'), ('ex', '\x2d')],
         r'/'         : [('rm', '/'), ('ex', '\xb1'), ('ex', '\x2e'),
                         ('ex', '\xcb'), ('ex', '\x2c')],
@@ -775,24 +770,27 @@
                 prop = rcParams['mathtext.' + texfont]
                 font = findfont(prop)
                 self.fontmap[texfont] = font
+            prop = FontProperties('cmex10')
+            font = findfont(prop)
+            self.fontmap['ex'] = font
 
-    def _get_offset(self, cached_font, glyph, fontsize, dpi):
-        return 0.
-
+    _slanted_symbols = Set(r"\int \oint".split())
+            
     def _get_glyph(self, fontname, sym, fontsize):
         found_symbol = False
 
-        try:
-            uniindex = get_unicode_index(sym)
+        uniindex = latex_to_cmex.get(sym)
+        if uniindex is not None:
+            fontname = 'ex'
             found_symbol = True
-        except ValueError:
-            # This is a total hack, but it works for now
-            if sym.startswith('\\big'):
-                uniindex = get_unicode_index(sym[4:])
-                fontsize *= GROW_FACTOR
-            else:
+        else:
+            try:
+                uniindex = get_unicode_index(sym)
+                found_symbol = True
+            except ValueError:
                 uniindex = ord('?')
-                warn("No TeX to unicode mapping for '%s'" % 
sym.encode('ascii', 'replace'),
+                warn("No TeX to unicode mapping for '%s'" %
+                     sym.encode('ascii', 'replace'),
                      MathTextWarning)
 
         # Only characters in the "Letter" class should be italicized in 'it'
@@ -806,19 +804,20 @@
                     or unicodedata.name(unistring).startswith("GREEK 
CAPITAL")):
                     new_fontname = 'rm'
 
-            slanted = (new_fontname == 'it')
+            slanted = (new_fontname == 'it') or sym in self._slanted_symbols
             cached_font = self._get_font(new_fontname)
             try:
                 glyphindex = cached_font.charmap[uniindex]
             except KeyError:
                 warn("Font '%s' does not have a glyph for '%s'" %
-                     (cached_font.font.postscript_name, sym.encode('ascii', 
'replace')),
+                     (cached_font.font.postscript_name,
+                      sym.encode('ascii', 'replace')),
                      MathTextWarning)
                 found_symbol = False
 
         if not found_symbol:
             if self.cm_fallback:
-                warn("Substituting with a symbol from the Computer Modern 
family.",
+                warn("Substituting with a symbol from Computer Modern.",
                      MathTextWarning)
                 return self.cm_fallback._get_glyph(fontname, sym, fontsize)
             else:
@@ -831,26 +830,12 @@
         symbol_name = cached_font.font.get_glyph_name(glyphindex)
         return cached_font, uniindex, symbol_name, fontsize, slanted
 
-    def set_canvas_size(self, w, h):
-        'Dimension the drawing canvas; may be a noop'
-        TruetypeFonts.set_canvas_size(self, w, h)
+    def get_sized_alternatives_for_symbol(self, fontname, sym):
         if self.cm_fallback:
-            self.cm_fallback.set_canvas_size(w, h)
-
-    def get_used_characters(self):
-        used_characters = dict(self.used_characters)
-        if self.cm_fallback:
-            fallback_characters = self.cm_fallback.get_used_characters()
-            for key, val in fallback_characters:
-                used_characters.setdefault(key, Set()).update(val)
-        return used_characters
-
-    def get_fonts(self):
-        fonts = [x.font for x in self.fonts.values()]
-        if self.cm_fallback:
-            fonts.extend(self.cm_fallback.get_fonts())
-        return list(set(fonts))
-
+            return self.cm_fallback.get_sized_alternatives_for_symbol(
+                fontname, sym)
+        return [(fontname, sym)]
+    
 class StandardPsFonts(Fonts):
     """
     Use the standard postscript fonts for rendering to backend_ps
@@ -896,9 +881,6 @@
             self.fonts[cached_font.get_fontname()] = cached_font
         return cached_font
 
-    def get_fonts(self):
-        return list(set(self.fonts.values()))
-
     def _get_info (self, fontname, sym, fontsize, dpi):
         'load the cmfont, metrics and glyph with caching'
         key = fontname, sym, fontsize, dpi


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