From: <md...@us...> - 2009-11-03 16:11:25
|
Revision: 7921 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7921&view=rev Author: mdboom Date: 2009-11-03 16:11:07 +0000 (Tue, 03 Nov 2009) Log Message: ----------- [2890979] Close paths correctly in PolyCollection Modified Paths: -------------- trunk/matplotlib/lib/matplotlib/collections.py trunk/matplotlib/lib/matplotlib/tests/baseline_images/test_axes/imshow_clip.pdf trunk/matplotlib/lib/matplotlib/tests/test_axes.py trunk/matplotlib/src/_backend_agg.cpp trunk/matplotlib/src/_backend_agg.h Added Paths: ----------- trunk/matplotlib/lib/matplotlib/tests/baseline_images/test_axes/polycollection_joinstyle.pdf trunk/matplotlib/lib/matplotlib/tests/baseline_images/test_axes/polycollection_joinstyle.png trunk/matplotlib/lib/matplotlib/tests/baseline_images/test_axes/polycollection_joinstyle.svg Modified: trunk/matplotlib/lib/matplotlib/collections.py =================================================================== --- trunk/matplotlib/lib/matplotlib/collections.py 2009-11-03 16:00:13 UTC (rev 7920) +++ trunk/matplotlib/lib/matplotlib/collections.py 2009-11-03 16:11:07 UTC (rev 7921) @@ -574,14 +574,19 @@ if closed: self._paths = [] for xy in verts: - if np.ma.isMaskedArray(xy): - if len(xy) and (xy[0] != xy[-1]).any(): - xy = np.ma.concatenate([xy, [xy[0]]]) + if len(xy): + if np.ma.isMaskedArray(xy): + xy = np.ma.concatenate([xy, np.zeros((1,2))]) + else: + xy = np.asarray(xy) + xy = np.concatenate([xy, np.zeros((1,2))]) + codes = np.empty(xy.shape[0], dtype=mpath.Path.code_type) + codes[:] = mpath.Path.LINETO + codes[0] = mpath.Path.MOVETO + codes[-1] = mpath.Path.CLOSEPOLY + self._paths.append(mpath.Path(xy, codes)) else: - xy = np.asarray(xy) - if len(xy) and (xy[0] != xy[-1]).any(): - xy = np.concatenate([xy, [xy[0]]]) - self._paths.append(mpath.Path(xy)) + self._paths.append(mpath.Path(xy)) else: self._paths = [mpath.Path(xy) for xy in verts] Modified: trunk/matplotlib/lib/matplotlib/tests/baseline_images/test_axes/imshow_clip.pdf =================================================================== (Binary files differ) Added: trunk/matplotlib/lib/matplotlib/tests/baseline_images/test_axes/polycollection_joinstyle.pdf =================================================================== (Binary files differ) Property changes on: trunk/matplotlib/lib/matplotlib/tests/baseline_images/test_axes/polycollection_joinstyle.pdf ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/matplotlib/lib/matplotlib/tests/baseline_images/test_axes/polycollection_joinstyle.png =================================================================== (Binary files differ) Property changes on: trunk/matplotlib/lib/matplotlib/tests/baseline_images/test_axes/polycollection_joinstyle.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/matplotlib/lib/matplotlib/tests/baseline_images/test_axes/polycollection_joinstyle.svg =================================================================== --- trunk/matplotlib/lib/matplotlib/tests/baseline_images/test_axes/polycollection_joinstyle.svg (rev 0) +++ trunk/matplotlib/lib/matplotlib/tests/baseline_images/test_axes/polycollection_joinstyle.svg 2009-11-03 16:11:07 UTC (rev 7921) @@ -0,0 +1,50 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" + "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Created with matplotlib (http://matplotlib.sourceforge.net/) --> +<svg width="576pt" height="432pt" viewBox="0 0 576 432" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + version="1.1" + id="svg1"> +<filter id="colorAdd"><feComposite in="SourceGraphic" in2="BackgroundImage" operator="arithmetic" k2="1" k3="1"/></filter> +<g id="figure1"> +<g id="patch1"> +<path style="fill: #ffffff; stroke: #ffffff; stroke-width: 1.000000; stroke-linejoin: round; stroke-linecap: square; opacity: 1.000000" d="M0.000000 432.000000L576.000000 432.000000L576.000000 0.000000 +L0.000000 0.000000L0.000000 432.000000"/> +</g> +<g id="axes1"> +<g id="patch2"> +<path style="fill: #ffffff; opacity: 1.000000" d="M72.000000 388.800000L518.400000 388.800000L518.400000 43.200000 +L72.000000 43.200000L72.000000 388.800000"/> +</g> +<g id="PolyCollection1"> +<defs> +<path id="coll0_0_19e93e5df12bdd5a95009dd1dd45c12d" d="M220.800000 -158.400000L220.800000 -273.600000L369.600000 -273.600000 +L369.600000 -158.400000z"/> +</defs> +<defs> + <clipPath id="p50431ccdcb28178602d99d9270004dde"> +<rect x="72.000000" y="43.200000" width="446.400000" height="345.600000"/> + </clipPath> +</defs><g clip-path="url(#p50431ccdcb28178602d99d9270004dde)"><use style="fill: #0000ff; stroke: #000000; stroke-width: 40.000000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#coll0_0_19e93e5df12bdd5a95009dd1dd45c12d" x="0.000000" y="432.000000"/> +</g></g> +<g id="matplotlib.axis1"> +</g> +<g id="matplotlib.axis2"> +</g> +<g id="patch3"> +<path style="fill: none; stroke: #000000; stroke-width: 1.000000; stroke-linejoin: round; stroke-linecap: square; opacity: 1.000000" d="M72.000000 43.200000L518.400000 43.200000"/> +</g> +<g id="patch4"> +<path style="fill: none; stroke: #000000; stroke-width: 1.000000; stroke-linejoin: round; stroke-linecap: square; opacity: 1.000000" d="M518.400000 388.800000L518.400000 43.200000"/> +</g> +<g id="patch5"> +<path style="fill: none; stroke: #000000; stroke-width: 1.000000; stroke-linejoin: round; stroke-linecap: square; opacity: 1.000000" d="M72.000000 388.800000L518.400000 388.800000"/> +</g> +<g id="patch6"> +<path style="fill: none; stroke: #000000; stroke-width: 1.000000; stroke-linejoin: round; stroke-linecap: square; opacity: 1.000000" d="M72.000000 388.800000L72.000000 43.200000"/> +</g> +</g> +</g> +</svg> Modified: trunk/matplotlib/lib/matplotlib/tests/test_axes.py =================================================================== --- trunk/matplotlib/lib/matplotlib/tests/test_axes.py 2009-11-03 16:00:13 UTC (rev 7920) +++ trunk/matplotlib/lib/matplotlib/tests/test_axes.py 2009-11-03 16:11:07 UTC (rev 7921) @@ -407,7 +407,24 @@ ax.imshow(r, clip_path=clip_path) fig.savefig('imshow_clip') +@image_comparison(baseline_images=['polycollection_joinstyle']) +def test_polycollection_joinstyle(): + # Bug #2890979 reported by Matthew West + from matplotlib import collections as mcoll + + fig = plt.figure() + ax = fig.add_subplot(111) + verts = np.array([[1,1], [1,2], [2,2], [2,1]]) + c = mcoll.PolyCollection([verts], linewidths = 40) + ax.add_collection(c) + ax.set_xbound(0, 3) + ax.set_ybound(0, 3) + ax.set_xticks([]) + ax.set_yticks([]) + + fig.savefig('polycollection_joinstyle') + if __name__=='__main__': import nose nose.runmodule(argv=['-s','--with-doctest'], exit=False) Modified: trunk/matplotlib/src/_backend_agg.cpp =================================================================== --- trunk/matplotlib/src/_backend_agg.cpp 2009-11-03 16:00:13 UTC (rev 7920) +++ trunk/matplotlib/src/_backend_agg.cpp 2009-11-03 16:11:07 UTC (rev 7921) @@ -147,8 +147,7 @@ } GCAgg::GCAgg(const Py::Object &gc, double dpi) : - dpi(dpi), isaa(true), linewidth(1.0), alpha(1.0), - dashOffset(0.0) + dpi(dpi), isaa(true), dashOffset(0.0) { _VERBOSE("GCAgg::GCAgg"); linewidth = points_to_pixels ( gc.getAttr("_linewidth") ) ; @@ -164,13 +163,6 @@ _set_hatch_path(gc); } -GCAgg::GCAgg(double dpi) : - dpi(dpi), isaa(true), linewidth(1.0), alpha(1.0), - dashOffset(0.0) -{ - -} - void GCAgg::_set_antialiased(const Py::Object& gc) { _VERBOSE("GCAgg::antialiased"); @@ -219,11 +211,11 @@ std::string joinstyle = Py::String( gc.getAttr("_joinstyle") ); - if (joinstyle=="miter") - join = agg::miter_join_revert; - else if (joinstyle=="round") + if (joinstyle == "miter") + join = agg::miter_join_revert; + else if (joinstyle == "round") join = agg::round_join; - else if(joinstyle=="bevel") + else if (joinstyle == "bevel") join = agg::bevel_join; else throw Py::ValueError(Printf("GC _joinstyle attribute must be one of butt, round, projecting; found %s", joinstyle.c_str()).str()); @@ -532,7 +524,7 @@ if (args.size() == 6) face_obj = args[5]; - GCAgg gc = GCAgg(gc_obj, dpi); + GCAgg gc(gc_obj, dpi); // Deal with the difference in y-axis direction marker_trans *= agg::trans_affine_scaling(1.0, -1.0); @@ -775,7 +767,7 @@ double angle = Py::Float( args[3] ); - GCAgg gc = GCAgg(args[4], dpi); + GCAgg gc(args[4], dpi); theRasterizer.reset_clipping(); rendererBase.reset_clipping(true); @@ -1081,7 +1073,8 @@ template<class PathGenerator, int check_snap, int has_curves> Py::Object RendererAgg::_draw_path_collection_generic - (agg::trans_affine master_transform, + (GCAgg& gc, + agg::trans_affine master_transform, const Py::Object& cliprect, const Py::Object& clippath, const agg::trans_affine& clippath_trans, @@ -1101,8 +1094,6 @@ typedef agg::conv_curve<quantized_t> quantized_curve_t; typedef agg::conv_curve<clipped_t> curve_t; - GCAgg gc(dpi); - PyArrayObject* offsets = NULL; PyArrayObject* facecolors = NULL; PyArrayObject* edgecolors = NULL; @@ -1312,7 +1303,8 @@ try { _draw_path_collection_generic<PathListGenerator, 0, 1> - (master_transform, + (gc, + master_transform, gc.cliprect, gc.clippath, gc.clippath_trans, @@ -1449,7 +1441,8 @@ try { try { _draw_path_collection_generic<QuadMeshGenerator, 0, 0> - (master_transform, + (gc, + master_transform, gc.cliprect, gc.clippath, gc.clippath_trans, Modified: trunk/matplotlib/src/_backend_agg.h =================================================================== --- trunk/matplotlib/src/_backend_agg.h 2009-11-03 16:00:13 UTC (rev 7920) +++ trunk/matplotlib/src/_backend_agg.h 2009-11-03 16:11:07 UTC (rev 7921) @@ -104,7 +104,6 @@ class GCAgg { public: GCAgg(const Py::Object& gc, double dpi); - GCAgg(double dpi); double dpi; bool isaa; @@ -224,15 +223,16 @@ bool render_clippath(const Py::Object& clippath, const agg::trans_affine& clippath_trans); template<class PathIteratorType> void _draw_path(PathIteratorType& path, bool has_clippath, - const facepair_t& face, const GCAgg& gc); + const facepair_t& face, const GCAgg& gc); template<class PathGenerator, int check_snap, int has_curves> Py::Object _draw_path_collection_generic - (agg::trans_affine master_transform, - const Py::Object& cliprect, - const Py::Object& clippath, + (GCAgg& gc, + agg::trans_affine master_transform, + const Py::Object& cliprect, + const Py::Object& clippath, const agg::trans_affine& clippath_trans, - const PathGenerator& path_generator, + const PathGenerator& path_generator, const Py::SeqBase<Py::Object>& transforms_obj, const Py::Object& offsets_obj, const agg::trans_affine& offset_trans, @@ -262,7 +262,7 @@ BufferRegion::init_type(); add_keyword_method("RendererAgg", &_backend_agg_module::new_renderer, - "RendererAgg(width, height, dpi)"); + "RendererAgg(width, height, dpi)"); initialize( "The agg rendering backend" ); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |