From: <md...@us...> - 2007-11-26 15:46:30
|
Revision: 4444 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=4444&view=rev Author: mdboom Date: 2007-11-26 07:46:17 -0800 (Mon, 26 Nov 2007) Log Message: ----------- Merged revisions 4437-4443 via svnmerge from http://matplotlib.svn.sf.net/svnroot/matplotlib/trunk/matplotlib ........ r4438 | mdboom | 2007-11-26 09:29:49 -0500 (Mon, 26 Nov 2007) | 2 lines Minor speed improvements in mathtext. Removing trailing whitespace. ........ r4441 | mdboom | 2007-11-26 10:31:54 -0500 (Mon, 26 Nov 2007) | 2 lines Fix colored text in SVG backend. ........ r4442 | mdboom | 2007-11-26 10:42:10 -0500 (Mon, 26 Nov 2007) | 2 lines Reduce SVG file sizes. ........ r4443 | mdboom | 2007-11-26 10:43:26 -0500 (Mon, 26 Nov 2007) | 2 lines One more SVG color detail (in mathtext) ........ Modified Paths: -------------- branches/transforms/lib/matplotlib/backends/backend_svg.py branches/transforms/lib/matplotlib/mathtext.py Property Changed: ---------------- branches/transforms/ Property changes on: branches/transforms ___________________________________________________________________ Name: svnmerge-integrated - /trunk/matplotlib:1-4436 + /trunk/matplotlib:1-4443 Modified: branches/transforms/lib/matplotlib/backends/backend_svg.py =================================================================== --- branches/transforms/lib/matplotlib/backends/backend_svg.py 2007-11-26 15:43:26 UTC (rev 4443) +++ branches/transforms/lib/matplotlib/backends/backend_svg.py 2007-11-26 15:46:17 UTC (rev 4444) @@ -29,7 +29,7 @@ _capstyle_d = {'projecting' : 'square', 'butt' : 'butt', 'round': 'round',} class RendererSVG(RendererBase): - FONT_SCALE = 1200.0 + FONT_SCALE = 100.0 def __init__(self, width, height, svgwriter, basename=None): self.width=width @@ -293,7 +293,6 @@ color = rgb2hex(gc.get_rgb()[:3]) if rcParams['svg.embed_char_paths']: - svg = ['<g style="fill: %s" transform="' % color] if angle != 0: svg.append('translate(%s,%s)rotate(%1.1f)' % (x,y,-angle)) @@ -453,7 +452,7 @@ svg.append('</text>\n') if len(svg_rects): - style = "fill: black; stroke: none" + style = "fill: %s; stroke: none" % color svg.append('<g style="%s" transform="' % style) if angle != 0: svg.append('translate(%s,%s) rotate(%1.1f)' Modified: branches/transforms/lib/matplotlib/mathtext.py =================================================================== --- branches/transforms/lib/matplotlib/mathtext.py 2007-11-26 15:43:26 UTC (rev 4443) +++ branches/transforms/lib/matplotlib/mathtext.py 2007-11-26 15:46:17 UTC (rev 4444) @@ -208,7 +208,7 @@ class MathtextBackendBbox(MathtextBackend): """A backend whose only purpose is to get a precise bounding box. Only required for the Agg backend.""" - + def __init__(self, real_backend): MathtextBackend.__init__(self) self.bbox = [0, 0, 0, 0] @@ -219,7 +219,7 @@ min(self.bbox[1], y1), max(self.bbox[2], x2), max(self.bbox[3], y2)] - + def render_glyph(self, ox, oy, info): self._update_bbox(ox + info.metrics.xmin, oy - info.metrics.ymax, @@ -251,14 +251,14 @@ self.real_backend.fonts_object = self.fonts_object self.real_backend.ox = self.bbox[0] self.real_backend.oy = self.bbox[1] - + class MathtextBackendAggRender(MathtextBackend): def __init__(self): self.ox = 0 self.oy = 0 self.image = None MathtextBackend.__init__(self) - + def set_canvas_size(self, w, h, d): MathtextBackend.set_canvas_size(self, w, h, d) self.image = FT2Image(ceil(w), ceil(h + d)) @@ -284,11 +284,11 @@ def MathtextBackendAgg(): return MathtextBackendBbox(MathtextBackendAggRender()) - + class MathtextBackendBitmapRender(MathtextBackendAggRender): def get_results(self, box): return self.image - + def MathtextBackendBitmap(): return MathtextBackendBbox(MathtextBackendBitmapRender()) @@ -310,7 +310,7 @@ """ % locals() self.lastfont = postscript_name, fontsize self.pswriter.write(ps) - + ps = """%(ox)f %(oy)f moveto /%(symbol_name)s glyphshow\n """ % locals() @@ -426,7 +426,7 @@ """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): """ @@ -737,7 +737,7 @@ fontmap = {} use_cmex = True - + def __init__(self, *args, **kwargs): # This must come first so the backend's owner is set correctly if rcParams['mathtext.fallback_to_cm']: @@ -758,7 +758,7 @@ def _map_virtual_font(self, fontname, font_class, uniindex): return fontname, uniindex - + def _get_glyph(self, fontname, font_class, sym, fontsize): found_symbol = False @@ -767,7 +767,7 @@ if uniindex is not None: fontname = 'ex' found_symbol = True - + if not found_symbol: try: uniindex = get_unicode_index(sym) @@ -780,7 +780,7 @@ fontname, uniindex = self._map_virtual_font( fontname, font_class, uniindex) - + # Only characters in the "Letter" class should be italicized in 'it' # mode. Greek capital letters should be Roman. if found_symbol: @@ -830,13 +830,16 @@ return [(fontname, sym)] class StixFonts(UnicodeFonts): + """ + A font handling class for the STIX fonts + """ _fontmap = { 'rm' : 'STIXGeneral', 'it' : 'STIXGeneralItalic', 'bf' : 'STIXGeneralBol', 'nonunirm' : 'STIXNonUni', 'nonuniit' : 'STIXNonUniIta', 'nonunibf' : 'STIXNonUniBol', - + 0 : 'STIXGeneral', 1 : 'STIXSiz1Sym', 2 : 'STIXSiz2Sym', @@ -849,7 +852,6 @@ cm_fallback = False def __init__(self, *args, **kwargs): - self._sans = kwargs.pop("sans", False) TruetypeFonts.__init__(self, *args, **kwargs) if not len(self.fontmap): for key, name in self._fontmap.iteritems(): @@ -891,14 +893,14 @@ # This will generate a dummy character uniindex = 0x1 fontname = 'it' - + # Handle private use area glyphs if (fontname in ('it', 'rm', 'bf') and uniindex >= 0xe000 and uniindex <= 0xf8ff): fontname = 'nonuni' + fontname return fontname, uniindex - + _size_alternatives = {} def get_sized_alternatives_for_symbol(self, fontname, sym): alternatives = self._size_alternatives.get(sym) @@ -919,7 +921,14 @@ self._size_alternatives[sym] = alternatives return alternatives - + +class StixSansFonts(StixFonts): + """ + A font handling class for the STIX fonts (using sans-serif + characters by default). + """ + _sans = True + class StandardPsFonts(Fonts): """ Use the standard postscript fonts for rendering to backend_ps @@ -1085,7 +1094,8 @@ # Note that (as TeX) y increases downward, unlike many other parts of # matplotlib. -# How much text shrinks when going to the next-smallest level +# How much text shrinks when going to the next-smallest level. GROW_FACTOR +# must be the inverse of SHRINK_FACTOR. SHRINK_FACTOR = 0.7 GROW_FACTOR = 1.0 / SHRINK_FACTOR # The number of different sizes of chars to use, beyond which they will not @@ -1160,10 +1170,16 @@ pass class Vbox(Box): + """ + A box with only height (zero width). + """ def __init__(self, height, depth): Box.__init__(self, 0., height, depth) class Hbox(Box): + """ + A box with only width (zero height and depth). + """ def __init__(self, width): Box.__init__(self, width, 0., 0.) @@ -1241,8 +1257,9 @@ self.depth *= GROW_FACTOR class Accent(Char): - """The font metrics need to be dealt with differently for accents, since they - are already offset correctly from the baseline in TrueType fonts.""" + """The font metrics need to be dealt with differently for accents, + since they are already offset correctly from the baseline in + TrueType fonts.""" def _update_metrics(self): metrics = self._metrics = self.font_output.get_metrics( self.font, self.font_class, self.c, self.fontsize, self.dpi) @@ -1741,7 +1758,7 @@ self.cur_s += 1 self.max_push = max(self.cur_s, self.max_push) clamp = self.clamp - + for p in box.children: if isinstance(p, Char): p.render(self.cur_h + self.off_h, self.cur_v + self.off_v) @@ -1864,7 +1881,7 @@ empty = Empty() empty.setParseAction(raise_error) return empty - + class Parser(object): _binary_operators = Set(r''' + * @@ -1922,7 +1939,7 @@ _dropsub_symbols = Set(r'''\int \oint'''.split()) _fontnames = Set("rm cal it tt sf bf default bb frak circled scr".split()) - + _function_names = Set(""" arccos csc ker min arcsin deg lg Pr arctan det lim sec arg dim liminf sin cos exp limsup sinh cosh gcd ln sup cot hom log tan @@ -1935,7 +1952,7 @@ _leftDelim = Set(r"( [ { \lfloor \langle \lceil".split()) _rightDelim = Set(r") ] } \rfloor \rangle \rceil".split()) - + def __init__(self): # All forward declarations are here font = Forward().setParseAction(self.font).setName("font") @@ -1947,7 +1964,7 @@ self._expression = Forward().setParseAction(self.finish).setName("finish") float = Regex(r"-?[0-9]+\.?[0-9]*") - + lbrace = Literal('{').suppress() rbrace = Literal('}').suppress() start_group = (Optional(latexfont) + lbrace) @@ -1993,7 +2010,7 @@ c_over_c =(Suppress(bslash) + oneOf(self._char_over_chars.keys()) ).setParseAction(self.char_over_chars) - + accent = Group( Suppress(bslash) + accent @@ -2055,7 +2072,7 @@ ) | Error("Expected symbol or group") simple <<(space - | customspace + | customspace | font | subsuper ) @@ -2105,11 +2122,11 @@ + (Suppress(math_delim) | Error("Expected end of math '$'")) + non_math - ) + ) ) + StringEnd() self._expression.enablePackrat() - + self.clear() def clear(self): @@ -2156,7 +2173,7 @@ self.font_class = name self._font = name font = property(_get_font, _set_font) - + def get_state(self): return self._state_stack[-1] @@ -2214,7 +2231,7 @@ def customspace(self, s, loc, toks): return [self._make_space(float(toks[1]))] - + def symbol(self, s, loc, toks): # print "symbol", toks c = toks[0] @@ -2240,7 +2257,7 @@ # (in multiples of underline height) r'AA' : ( ('rm', 'A', 1.0), (None, '\circ', 0.5), 0.0), } - + def char_over_chars(self, s, loc, toks): sym = toks[0] state = self.get_state() @@ -2251,7 +2268,7 @@ self._char_over_chars.get(sym, (None, None, 0.0)) if under_desc is None: raise ParseFatalException("Error parsing symbol") - + over_state = state.copy() if over_desc[0] is not None: over_state.font = over_desc[0] @@ -2265,19 +2282,19 @@ under = Char(under_desc[1], under_state) width = max(over.width, under.width) - + over_centered = HCentered([over]) over_centered.hpack(width, 'exactly') under_centered = HCentered([under]) under_centered.hpack(width, 'exactly') - + return Vlist([ over_centered, Vbox(0., thickness * space), under_centered ]) - + _accent_map = { r'hat' : r'\circumflexaccent', r'breve' : r'\combiningbreve', @@ -2601,7 +2618,7 @@ return is width, height, fonts """ _parser = None - + _backend_mapping = { 'Bitmap': MathtextBackendBitmap, 'Agg' : MathtextBackendAgg, @@ -2611,6 +2628,13 @@ 'Cairo' : MathtextBackendCairo } + _font_type_mapping = { + 'cm' : BakomaFonts, + 'stix' : StixFonts, + 'stixsans' : StixSansFonts, + 'custom' : UnicodeFonts + } + def __init__(self, output): self._output = output self._cache = {} @@ -2618,7 +2642,7 @@ def parse(self, s, dpi = 72, prop = None): if prop is None: prop = FontProperties() - + cacheKey = (s, dpi, hash(prop)) result = self._cache.get(cacheKey) if result is not None: @@ -2629,16 +2653,13 @@ else: backend = self._backend_mapping[self._output]() fontset = rcParams['mathtext.fontset'] - if fontset == 'cm': - font_output = BakomaFonts(prop, backend) - elif fontset == 'stix': - font_output = StixFonts(prop, backend) - elif fontset == 'stixsans': - font_output = StixFonts(prop, backend, sans=True) - elif fontset == 'custom': - font_output = UnicodeFonts(prop, backend) + fontset_class = self._font_type_mapping.get(fontset) + if fontset_class is not None: + font_output = fontset_class(prop, backend) else: - raise ValueError("mathtext.fontset must be either 'cm', 'stix', 'stixsans', or 'custom'") + raise ValueError( + "mathtext.fontset must be either 'cm', 'stix', " + "'stixsans', or 'custom'") fontsize = prop.get_size_in_points() @@ -2646,7 +2667,7 @@ # with each request. if self._parser is None: self.__class__._parser = Parser() - + box = self._parser.parse(s, font_output, fontsize, dpi) font_output.set_canvas_size(box.width, box.height, box.depth) result = font_output.get_results(box) @@ -2658,5 +2679,5 @@ 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. |