Revision: 4689
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=4689&view=rev
Author:   mdboom
Date:     2007-12-10 08:21:36 -0800 (Mon, 10 Dec 2007)

Log Message:
-----------
Merged revisions 4683-4688 via svnmerge from 
http://matplotlib.svn.sf.net/svnroot/matplotlib/trunk/matplotlib

........
  r4684 | mdboom | 2007-12-10 10:23:08 -0500 (Mon, 10 Dec 2007) | 2 lines
  
  Fix variable name.
........
  r4685 | mdboom | 2007-12-10 10:34:29 -0500 (Mon, 10 Dec 2007) | 2 lines
  
  Fix syntax for pre-Python 2.5
........
  r4686 | mdboom | 2007-12-10 11:15:30 -0500 (Mon, 10 Dec 2007) | 4 lines
  
  Support draw_path (importantly for ellipses) in Pdf, Svg and Cairo
  backends.
  Fix SVG text rendering bug.
........

Modified Paths:
--------------
    branches/transforms/CHANGELOG
    branches/transforms/lib/matplotlib/backends/backend_cairo.py
    branches/transforms/lib/matplotlib/backends/backend_pdf.py
    branches/transforms/lib/matplotlib/backends/backend_svg.py
    branches/transforms/lib/matplotlib/font_manager.py
    branches/transforms/lib/matplotlib/patches.py

Property Changed:
----------------
    branches/transforms/


Property changes on: branches/transforms
___________________________________________________________________
Name: svnmerge-integrated
   - /trunk/matplotlib:1-4682
   + /trunk/matplotlib:1-4688

Modified: branches/transforms/CHANGELOG
===================================================================
--- branches/transforms/CHANGELOG       2007-12-10 16:17:42 UTC (rev 4688)
+++ branches/transforms/CHANGELOG       2007-12-10 16:21:36 UTC (rev 4689)
@@ -1,3 +1,9 @@
+2007-12-10 Fix SVG text rendering bug.
+
+2007-12-10 Increase accuracy of circle and ellipse drawing by using an 8-piece
+           bezier approximation, rather than a 4-piece one.  Fix PDF, SVG and
+           Cairo backends so they can draw paths (meaning ellipses as well).
+
 2007-12-07 Issue a warning when drawing an image on a non-linear axis. - MGD
 
 2007-12-06 let widgets.Cursor initialize to the lower x and y bounds

Modified: branches/transforms/lib/matplotlib/backends/backend_cairo.py
===================================================================
--- branches/transforms/lib/matplotlib/backends/backend_cairo.py        
2007-12-10 16:17:42 UTC (rev 4688)
+++ branches/transforms/lib/matplotlib/backends/backend_cairo.py        
2007-12-10 16:21:36 UTC (rev 4689)
@@ -34,6 +34,7 @@
 backend_version = cairo.version
 del _version_required
 
+from matplotlib import agg
 from matplotlib.backend_bases import RendererBase, GraphicsContextBase,\
      FigureManagerBase, FigureCanvasBase
 from matplotlib.cbook        import enumerate, izip, is_string_like
@@ -117,6 +118,7 @@
         ctx.stroke()
 
 
+<<<<<<< .working
     [EMAIL PROTECTED]
     def convert_path(ctx, tpath):
         for points, code in tpath.iter_segments():
@@ -133,12 +135,48 @@
             elif code == Path.CLOSEPOLY:
                 ctx.close_path()
     convert_path = staticmethod(convert_path)
+=======
+    def draw_path(self, gc, rgbFace, path):
+        ctx = gc.ctx
+        ctx.new_path()
+>>>>>>> .merge-right.r4686
 
+<<<<<<< .working
 
     def draw_path(self, gc, path, transform, rgbFace=None):
         if len(path.vertices) > 18980:
            raise ValueError("The Cairo backend can not draw paths longer than 
18980 points.")
 
+=======
+        while 1:
+            code, xp, yp = path.vertex()
+            yp = self.height - yp
+
+            if code == agg.path_cmd_stop:
+                ctx.close_path()
+                break
+            elif code == agg.path_cmd_move_to:
+                ctx.move_to(xp, yp)
+            elif code == agg.path_cmd_line_to:
+                ctx.line_to(xp, yp)
+            elif code == agg.path_cmd_curve3:
+                _, xp1, yp1 = path.vertex()
+                yp1 = self.height - yp1
+                ctx.curve_to(xp, yp, xp, yp, xp1, yp1)
+            elif code == agg.path_cmd_curve4:
+                _, xp1, yp1 = path.vertex()
+                yp1 = self.height - yp1
+                _, xp2, yp2 = path.vertex()
+                yp2 = self.height - yp2
+                ctx.curve_to(xp, yp, xp1, yp1, xp2, yp2)
+            elif code == agg.path_cmd_end_poly:
+                ctx.close_path()
+        self._fill_and_stroke(ctx, rgbFace)
+
+    def draw_arc(self, gc, rgbFace, x, y, width, height, angle1, angle2,
+                 rotation):
+        if _debug: print '%s.%s()' % (self.__class__.__name__, _fn_name())
+>>>>>>> .merge-right.r4686
         ctx = gc.ctx
         transform = transform + \
             Affine2D().scale(1.0, -1.0).translate(0, self.height)

Modified: branches/transforms/lib/matplotlib/backends/backend_pdf.py
===================================================================
--- branches/transforms/lib/matplotlib/backends/backend_pdf.py  2007-12-10 
16:17:42 UTC (rev 4688)
+++ branches/transforms/lib/matplotlib/backends/backend_pdf.py  2007-12-10 
16:21:36 UTC (rev 4689)
@@ -1211,7 +1211,97 @@
                 stat_key, (realpath, Set()))
             used_characters[1].update(set)
 
+<<<<<<< .working
     def draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None):
+=======
+    def draw_arc(self, gcEdge, rgbFace, x, y, width, height,
+                 angle1, angle2, rotation):
+        """
+        Draw an arc using GraphicsContext instance gcEdge, centered at x,y,
+        with width and height and angles from 0.0 to 360.0
+        0 degrees is at 3-o'clock, rotated by `rotation` degrees
+        positive angles are anti-clockwise
+
+        If the color rgbFace is not None, fill the arc with it.
+        """
+        # source: agg_bezier_arc.cpp in agg23
+
+        def arc_to_bezier(cx, cy, rx, ry, angle1, sweep, rotation):
+            halfsweep = sweep / 2.0
+            x0, y0 = cos(halfsweep), sin(halfsweep)
+            tx = (1.0 - x0) * 4.0/3.0;
+            ty = y0 - tx * x0 / y0;
+            px =  x0, x0+tx, x0+tx, x0
+            py = -y0,   -ty,    ty, y0
+            sn, cs = sin(angle1 + halfsweep), cos(angle1 + halfsweep)
+            result = [ (rx * (pxi * cs - pyi * sn),
+                        ry * (pxi * sn + pyi * cs))
+                       for pxi, pyi in zip(px, py) ]
+            result = [ (cx + cos(rotation)*x - sin(rotation)*y,
+                        cy + sin(rotation)*x + cos(rotation)*y)
+                       for x, y in result ]
+            return reduce(lambda x, y: x + y, result)
+
+        epsilon = 0.01
+        angle1 *= pi/180.0
+        angle2 *= pi/180.0
+        rotation *= pi/180.0
+        sweep = angle2 - angle1
+        angle1 = angle1 % (2*pi)
+        sweep = min(max(-2*pi, sweep), 2*pi)
+
+        if sweep < 0.0:
+            sweep, angle1, angle2 = -sweep, angle2, angle1
+        bp = [ pi/2.0 * i
+               for i in range(4)
+               if pi/2.0 * i < sweep-epsilon ]
+        bp.append(sweep)
+        subarcs = [ arc_to_bezier(x, y, width/2.0, height/2.0,
+                                  bp[i], bp[i+1]-bp[i], rotation)
+                    for i in range(len(bp)-1) ]
+
+        self.check_gc(gcEdge, rgbFace)
+        self.file.output(subarcs[0][0], subarcs[0][1], Op.moveto)
+        for arc in subarcs:
+            self.file.output(*(arc[2:] + (Op.curveto,)))
+
+        self.file.output(self.gc.close_and_paint())
+
+    def draw_path(self, gc, rgbFace, path):
+        self.check_gc(gc, rgbFace)
+
+        cmds = []
+
+        while 1:
+            code, xp, yp = path.vertex()
+
+            if code == agg.path_cmd_stop:
+                cmds.append(Op.closepath)
+                break
+            elif code == agg.path_cmd_move_to:
+                cmds.extend([xp, yp, Op.moveto])
+            elif code == agg.path_cmd_line_to:
+                cmds.extend([xp, yp, Op.lineto])
+            elif code == agg.path_cmd_curve3:
+                cmds.extend([xp, yp])
+                cmds.extend([xp, yp])
+                cmds.extend(path.vertex()[1:])
+                cmds.append(Op.curveto)
+            elif code == agg.path_cmd_curve4:
+                cmds.extend([xp, yp])
+                cmds.extend(path.vertex()[1:])
+                cmds.extend(path.vertex()[1:])
+                cmds.append(Op.curveto)
+            elif code == agg.path_cmd_end_poly:
+                cmds.append(Op.closepath)
+        self.file.output(*cmds)
+        self.file.output(self.gc.paint())
+
+    def get_image_magnification(self):
+        return self.image_magnification
+
+    def draw_image(self, x, y, im, bbox):
+>>>>>>> .merge-right.r4686
         #print >>sys.stderr, "draw_image called"
 
         # MGDTODO: Support clippath here

Modified: branches/transforms/lib/matplotlib/backends/backend_svg.py
===================================================================
--- branches/transforms/lib/matplotlib/backends/backend_svg.py  2007-12-10 
16:17:42 UTC (rev 4688)
+++ branches/transforms/lib/matplotlib/backends/backend_svg.py  2007-12-10 
16:21:36 UTC (rev 4689)
@@ -2,6 +2,7 @@
 
 import os, codecs, base64, tempfile, urllib, gzip
 
+from matplotlib import agg
 from matplotlib import verbose, __version__, rcParams
 from matplotlib.backend_bases import RendererBase, GraphicsContextBase,\
      FigureManagerBase, FigureCanvasBase
@@ -139,6 +140,49 @@
     def close_group(self, s):
         self._svgwriter.write('</g>\n')
 
+<<<<<<< .working
+=======
+    def draw_path(self, gc, rgbFace, path):
+        cmd = []
+
+        while 1:
+            code, xp, yp = path.vertex()
+            yp = self.height - yp
+
+            if code == agg.path_cmd_stop:
+                cmd.append('z') # Hack, path_cmd_end_poly not found
+                break
+            elif code == agg.path_cmd_move_to:
+                cmd.append('M%g %g' % (xp, yp))
+            elif code == agg.path_cmd_line_to:
+                cmd.append('L%g %g' % (xp, yp))
+            elif code == agg.path_cmd_curve3:
+                verts = [xp, yp]
+                verts.extent(path.vertex()[1:])
+                verts[-1] = self.height - verts[-1]
+                cmd.append('Q%g %g %g %g' % tuple(verts))
+            elif code == agg.path_cmd_curve4:
+                verts = [xp, yp]
+                verts.extend(path.vertex()[1:])
+                verts[-1] = self.height - verts[-1]
+                verts.extend(path.vertex()[1:])
+                verts[-1] = self.height - verts[-1]
+                cmd.append('C%g %g %g %g %g %g'%tuple(verts))
+            elif code == agg.path_cmd_end_poly:
+                cmd.append('z')
+
+        path_data = "".join(cmd)
+        self._draw_svg_element("path", 'd="%s"' % path_data, gc, rgbFace)
+
+    def draw_arc(self, gc, rgbFace, x, y, width, height, angle1, angle2, 
rotation):
+        """
+        Ignores angles for now
+        """
+        details = 'cx="%s" cy="%s" rx="%s" ry="%s" transform="rotate(%1.1f %s 
%s)"' % \
+            (x,  self.height-y, width/2.0, height/2.0, -rotation, x, 
self.height-y)
+        self._draw_svg_element('ellipse', details, gc, rgbFace)
+
+>>>>>>> .merge-right.r4686
     def option_image_nocomposite(self):
         """
         if svg.image_noscale is True, compositing multiple images into one is 
prohibited
@@ -327,7 +371,7 @@
                     svg.append(' x="%s"' %
                                (currx * (self.FONT_SCALE / fontsize)))
                 svg.append('/>\n')
-                currx += (glyph.linearHoriAdvance / 65536.0)
+                currx += (glyph.linearHoriAdvance / 65536.0) / 
(self.FONT_SCALE / fontsize)
             svg.append('</g>\n')
             svg = ''.join(svg)
         else:

Modified: branches/transforms/lib/matplotlib/font_manager.py
===================================================================
--- branches/transforms/lib/matplotlib/font_manager.py  2007-12-10 16:17:42 UTC 
(rev 4688)
+++ branches/transforms/lib/matplotlib/font_manager.py  2007-12-10 16:21:36 UTC 
(rev 4689)
@@ -109,9 +109,10 @@
     else:
         user = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, MSFolders)
         try:
-            return _winreg.QueryValueEx(user, 'Fonts')[0]
-        except OSError:
-            pass # Fall through to default
+            try:
+                return _winreg.QueryValueEx(user, 'Fonts')[0]
+            except OSError:
+                pass # Fall through to default
         finally:
             _winreg.CloseKey(user)
     return os.path.join(os.environ['WINDIR'], 'Fonts')

Modified: branches/transforms/lib/matplotlib/patches.py
===================================================================
--- branches/transforms/lib/matplotlib/patches.py       2007-12-10 16:17:42 UTC 
(rev 4688)
+++ branches/transforms/lib/matplotlib/patches.py       2007-12-10 16:21:36 UTC 
(rev 4689)
@@ -820,49 +820,6 @@
     """
     A scale-free ellipse
     """
-<<<<<<< .working
-=======
-    MAGIC = 0.2652031
-    SQRT2 = npy.sqrt(0.5)
-    MAGIC45 = npy.sqrt((MAGIC*MAGIC) / 2.0)
-
-    circle = npy.array(
-        [[0.0, -1.0],
-
-         [MAGIC, -1.0],
-         [SQRT2-MAGIC45, -SQRT2-MAGIC45],
-         [SQRT2, -SQRT2],
-
-         [SQRT2+MAGIC45, -SQRT2+MAGIC45],
-         [1.0, -MAGIC],
-         [1.0, 0.0],
-
-         [1.0, MAGIC],
-         [SQRT2+MAGIC45, SQRT2-MAGIC45],
-         [SQRT2, SQRT2],
-
-         [SQRT2-MAGIC45, SQRT2+MAGIC45],
-         [MAGIC, 1.0],
-         [0.0, 1.0],
-
-         [-MAGIC, 1.0],
-         [-SQRT2+MAGIC45, SQRT2+MAGIC45],
-         [-SQRT2, SQRT2],
-
-         [-SQRT2-MAGIC45, SQRT2-MAGIC45],
-         [-1.0, MAGIC],
-         [-1.0, 0.0],
-
-         [-1.0, -MAGIC],
-         [-SQRT2-MAGIC45, -SQRT2+MAGIC45],
-         [-SQRT2, -SQRT2],
-
-         [-SQRT2+MAGIC45, -SQRT2-MAGIC45],
-         [-MAGIC, -1.0],
-         [0.0, -1.0]],
-        npy.float_)
-
->>>>>>> .merge-right.r4679
     def __str__(self):
         return 
"Ellipse(%d,%d;%dx%d)"%(self.center[0],self.center[1],self.width,self.height)
 
@@ -898,17 +855,10 @@
     def get_patch_transform(self):
         return self._patch_transform
 
-<<<<<<< .working
     def contains(self,ev):
         if ev.x is None or ev.y is None: return False,{}
         x, y = self.get_transform().inverted().transform_point((ev.x, ev.y))
         return (x*x + y*y) <= 1.0, {}
-=======
-        xcenter = self.convert_xunits(xcenter)
-        width = self.convert_xunits(width)
-        ycenter = self.convert_yunits(ycenter)
-        height = self.convert_xunits(height)
->>>>>>> .merge-right.r4679
 
     def _get_center(self):
         return self._center
@@ -932,105 +882,6 @@
     angle = property(_get_angle, _set_angle)
 
 
-<<<<<<< .working
-=======
-        rtheta = angle*npy.pi/180.
-        R = npy.array([
-            [npy.cos(rtheta),  -npy.sin(rtheta)],
-            [npy.sin(rtheta), npy.cos(rtheta)],
-            ])
-
-
-        x, y = npy.dot(R, npy.array([x, y]))
-        x += xcenter
-        y += ycenter
-
-        return zip(x, y)
-
-    def draw(self, renderer):
-        if not self.get_visible(): return
-        #renderer.open_group('patch')
-        gc = renderer.new_gc()
-        gc.set_foreground(self._edgecolor)
-        gc.set_linewidth(self._linewidth)
-        gc.set_alpha(self._alpha)
-        gc.set_antialiased(self._antialiased)
-        self._set_gc_clip(gc)
-
-        gc.set_capstyle('projecting')
-
-        if not self.fill or self._facecolor is None: rgbFace = None
-        else: rgbFace = colors.colorConverter.to_rgb(self._facecolor)
-
-        if self._hatch:
-            gc.set_hatch(self._hatch )
-
-
-        if not hasattr(renderer, 'draw_path'):
-            mpl.verbose.report('patches.Ellipse renderer does not support path 
drawing; falling back on vertex approximation for nonlinear transformation')
-            renderer.draw_polygon(gc, rgbFace, self.get_verts())
-            return
-
-
-        x, y = self.center
-        x = self.convert_xunits(x)
-        y = self.convert_yunits(y)
-        w = self.convert_xunits(self.width)/2.
-        h = self.convert_yunits(self.height)/2.
-
-        theta = self.angle * npy.pi/180.
-        T = npy.array([
-            [1, 0, x],
-            [0, 1, y],
-            [0, 0, 1]])
-
-
-
-
-        S = npy.array([
-            [w, 0, 0],
-            [0, h, 0],
-            [0, 0, 1]])
-
-
-
-        # rotate by theta
-        R = npy.array([
-            [npy.cos(theta),  -npy.sin(theta), 0],
-            [npy.sin(theta), npy.cos(theta), 0],
-            [0,           0,          1]])
-
-        # transform unit circle into ellipse
-        E = npy.dot(T, npy.dot(R, S))
-
-
-        # Apply the display affine
-        sx, b, c, sy, tx, ty = self.get_transform().as_vec6_val()
-
-        # display coords
-        D = npy.array([
-            [sx, b, tx],
-            [c, sy, ty],
-            [0, 0, 1]], npy.float_)
-
-        M = npy.dot(D,E)
-
-        C = npy.ones((3, len(self.circle)))
-        C[0:2,:] = self.circle.T
-
-        ellipse = npy.dot(M, C).T[:,:2]
-
-        path =  agg.path_storage()
-        path.move_to(*ellipse[0])
-        for i in range(1, 25, 3):
-            path.curve4(*ellipse[i:i+3].flat)
-        path.close_polygon()
-
-        renderer.draw_path(gc, rgbFace, path)
-
-
->>>>>>> .merge-right.r4679
-
 class Circle(Ellipse):
     """
     A circle patch


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

-------------------------------------------------------------------------
SF.Net email is sponsored by: 
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://sourceforge.net/services/buy/index.php
_______________________________________________
Matplotlib-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins

Reply via email to