From b08aa4951ee58c6231b5cff89a1c06bf120f6e9a Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Tue, 17 Dec 2019 19:42:56 -0500 Subject: [PATCH] Process clip paths the same way as regular Paths. Specifically, run NaN removal, clipping to figure boundary, snapping to pixel centers, and path simplification on it. This means if you plot a Path, and then clip some other artist with it, you will get properly aligned results. --- .../baseline_images/test_axes/imshow_clip.png | Bin 21375 -> 21416 bytes .../test_offsetbox/offsetbox_clipping.png | Bin 3969 -> 3999 bytes src/_backend_agg.cpp | 17 ++++++++++++++--- src/_backend_agg.h | 16 ++++++++-------- 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/lib/matplotlib/tests/baseline_images/test_axes/imshow_clip.png b/lib/matplotlib/tests/baseline_images/test_axes/imshow_clip.png index 3f38834b97588d8f01d9e42fd544fb22f5f5d793..e68b7c3c0bafd0af3ab30182e8053bcb1123e0f6 100644 GIT binary patch literal 21416 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 diff --git a/lib/matplotlib/tests/baseline_images/test_offsetbox/offsetbox_clipping.png b/lib/matplotlib/tests/baseline_images/test_offsetbox/offsetbox_clipping.png index 3b62fc31883bb3412b8de31100c9534445c1b0dd..a0c0aecb075dc6f01405e594f023b227c9de5bf5 100644 GIT binary patch delta 1075 zcmYk5ZA@BM7{|{=s2Ce<>n2-k3rU-jWmZJz1P4^RTIXVPjZIc{YOSKBQ?QCm2Lg7< z)cH8LetQBa(#v}Nwrbk!NfmtA~Gih8LETM^uqHr;am=iC2z`90@3 zbyO|2@kI7{aq>lRrl?r_ML`80log1}OGV;R!DX6+Ur{L#31g#}_$e1vieuu~tf(Ts zB>LSFW?>PV85fJ^#`|OS{!)cuKLARzqBs-)(EB0WO}YU;CJFG%R}Q{P>MJljw(aT`>szk-!P@iM>Lz6hiDlO_G|`2D>ncrhcTbm<6O55PRGhWCfI`v zczB`ATPNRK9-n2NXt1FDCQ}FZs~b{LyCP*@J;n45rp(7nFXQ@0MPxt&r2?BwIBRrkAGH-;ScLvu&;h*XQ0f+8(yY+M|j1>{0r-L+< z0gsTboHMj>l^aLZmhPFgW89o(exx-*O&Ph7zUp#G9B$8a zECBDXAwz)YubGy;#i=F*!%o5@`fpDi5I`O>hIeA5gwu8Na!;9ys1y*%=HXRq3j;4| zhL_)rgck`c>dTIFd8Rfl1T^nK1dQf$?+!k(5wG9Z#KujQ*+Mhh(X)>gr1)@))NVbL!cBH=qk*eN2PmYg7e=m3zQdH%ZWYFxdUzA8rvr{H}``v!U@30^O07XPH z0F4J}031xNl5CAdwmg=2^ccAbcO4h6+*(7tH$A20~O-?`Cb>`Cbe*rOT6srIL literal 3969 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV2a>i1B%QlYbpRzEX7WqAsj$Z!;#Vf4nJ@F#*W;|lxbnLviJr;B4q#hkadH|9n^mur7`Uc8A>nN^y9!8P5;RHpL<3B3>6 z=DHUwS5vllz$4|9bGM4YT!)Dw&9SzGJ*=btk& zFbMoO{{~1MsNxV{U{FwYU|?wIVE_skF|jZ(oER0v79hoj)eQAN{`~yBW9LrE>C>k_ zKH4q5`8fl_hu+=0cYl0&dHKg*UtfRx^z`)2VmVdDPYrkO-04}pdi70X28JKp@^&>6 z`SC>kYk6-hDSslLqS)by@`|po`{rdHdq|2S^STM4+tNUZIZr!?n z-*@)z_iwOK*uTH*>#M7)H{Q)tU%zm}&73<`t}wN=d-VSQ|Lp&Qfx*G80ho>?8JQRu zQdl^Aw&o@cte++c(WHDRbxP!prXSmcOpiFfj_~U8){XOOH@131@Q2E2ZzrR0z zdwUyLtS=K#VE8{tKYm}&{kq?|-+1I2f$TH$7z}#DH;`MQ#+;F3_z+@K|F7oHm&^W} z(?4*4*xy(hGFdnd?0@q1_V&lm=hx4(ZFW!Ce)}wCb`92Qp2(7nL|e{#i56wrPDIxY&C9 z?OR#S_S-jst?wUg=d=IMAwT~P);u+`n{^3`4nH)gW>Q3I`X(st-*D~d-s@oW@Hi)0 zKS+Et`-gU5yWa4aguH#-oINe4UY1B5e_Z&DN9o;OJus5nU+?$(Z?Sa!eOPL$`}_5J zVQHypHL#ag|L|}-|Kqc>%{QmpcmXTSpTu??K#li5!d9c1op5Fc7l}Xhll;GY%*a+g R11x?SJYD@<);T3K0RUCiPmurs diff --git a/src/_backend_agg.cpp b/src/_backend_agg.cpp index d14b3ee347f7..0ae17741d735 100644 --- a/src/_backend_agg.cpp +++ b/src/_backend_agg.cpp @@ -129,10 +129,15 @@ RendererAgg::restore_region(BufferRegion ®ion, int xx1, int yy1, int xx2, int } bool RendererAgg::render_clippath(py::PathIterator &clippath, - const agg::trans_affine &clippath_trans) + const agg::trans_affine &clippath_trans, + e_snap_mode snap_mode) { typedef agg::conv_transform transformed_path_t; - typedef agg::conv_curve curve_t; + typedef PathNanRemover nan_removed_t; + typedef PathClipper clipped_t; + typedef PathSnapper snapped_t; + typedef PathSimplifier simplify_t; + typedef agg::conv_curve curve_t; bool has_clippath = (clippath.total_vertices() != 0); @@ -145,7 +150,13 @@ bool RendererAgg::render_clippath(py::PathIterator &clippath, rendererBaseAlphaMask.clear(agg::gray8(0, 0)); transformed_path_t transformed_clippath(clippath, trans); - curve_t curved_clippath(transformed_clippath); + nan_removed_t nan_removed_clippath(transformed_clippath, true, clippath.has_curves()); + clipped_t clipped_clippath(nan_removed_clippath, !clippath.has_curves(), width, height); + snapped_t snapped_clippath(clipped_clippath, snap_mode, clippath.total_vertices(), 0.0); + simplify_t simplified_clippath(snapped_clippath, + clippath.should_simplify() && !clippath.has_curves(), + clippath.simplify_threshold()); + curve_t curved_clippath(simplified_clippath); theRasterizer.add_path(curved_clippath); rendererAlphaMask.color(agg::gray8(255, 255)); agg::render_scanlines(theRasterizer, scanlineAlphaMask, rendererAlphaMask); diff --git a/src/_backend_agg.h b/src/_backend_agg.h index 55af1950773f..c372cb12ea0a 100644 --- a/src/_backend_agg.h +++ b/src/_backend_agg.h @@ -251,7 +251,7 @@ class RendererAgg template void set_clipbox(const agg::rect_d &cliprect, R &rasterizer); - bool render_clippath(py::PathIterator &clippath, const agg::trans_affine &clippath_trans); + bool render_clippath(py::PathIterator &clippath, const agg::trans_affine &clippath_trans, e_snap_mode snap_mode); template void _draw_path(PathIteratorType &path, bool has_clippath, const facepair_t &face, GCAgg &gc); @@ -379,7 +379,7 @@ RendererAgg::_draw_path(path_t &path, bool has_clippath, const facepair_t &face, // function set_clipbox(gc.cliprect, theRasterizer); if (has_clippath) { - render_clippath(gc.clippath.path, gc.clippath.trans); + render_clippath(gc.clippath.path, gc.clippath.trans, gc.snap_mode); } // Transfer the hatch to the main image buffer @@ -468,7 +468,7 @@ RendererAgg::draw_path(GCAgg &gc, PathIterator &path, agg::trans_affine &trans, theRasterizer.reset_clipping(); rendererBase.reset_clipping(true); set_clipbox(gc.cliprect, theRasterizer); - bool has_clippath = render_clippath(gc.clippath.path, gc.clippath.trans); + bool has_clippath = render_clippath(gc.clippath.path, gc.clippath.trans, gc.snap_mode); trans *= agg::trans_affine_scaling(1.0, -1.0); trans *= agg::trans_affine_translation(0.0, (double)height); @@ -586,7 +586,7 @@ inline void RendererAgg::draw_markers(GCAgg &gc, theRasterizer.reset_clipping(); rendererBase.reset_clipping(true); set_clipbox(gc.cliprect, rendererBase); - bool has_clippath = render_clippath(gc.clippath.path, gc.clippath.trans); + bool has_clippath = render_clippath(gc.clippath.path, gc.clippath.trans, gc.snap_mode); double x, y; @@ -832,7 +832,7 @@ inline void RendererAgg::draw_image(GCAgg &gc, theRasterizer.reset_clipping(); rendererBase.reset_clipping(true); set_clipbox(gc.cliprect, theRasterizer); - bool has_clippath = render_clippath(gc.clippath.path, gc.clippath.trans); + bool has_clippath = render_clippath(gc.clippath.path, gc.clippath.trans, gc.snap_mode); agg::rendering_buffer buffer; buffer.attach( @@ -941,7 +941,7 @@ inline void RendererAgg::_draw_path_collection_generic(GCAgg &gc, theRasterizer.reset_clipping(); rendererBase.reset_clipping(true); set_clipbox(cliprect, theRasterizer); - bool has_clippath = render_clippath(clippath, clippath_trans); + bool has_clippath = render_clippath(clippath, clippath_trans, gc.snap_mode); // Set some defaults, assuming no face or edge gc.linewidth = 0.0; @@ -1249,7 +1249,7 @@ inline void RendererAgg::draw_gouraud_triangle(GCAgg &gc, theRasterizer.reset_clipping(); rendererBase.reset_clipping(true); set_clipbox(gc.cliprect, theRasterizer); - bool has_clippath = render_clippath(gc.clippath.path, gc.clippath.trans); + bool has_clippath = render_clippath(gc.clippath.path, gc.clippath.trans, gc.snap_mode); _draw_gouraud_triangle(points, colors, trans, has_clippath); } @@ -1263,7 +1263,7 @@ inline void RendererAgg::draw_gouraud_triangles(GCAgg &gc, theRasterizer.reset_clipping(); rendererBase.reset_clipping(true); set_clipbox(gc.cliprect, theRasterizer); - bool has_clippath = render_clippath(gc.clippath.path, gc.clippath.trans); + bool has_clippath = render_clippath(gc.clippath.path, gc.clippath.trans, gc.snap_mode); for (int i = 0; i < points.dim(0); ++i) { typename PointArray::sub_t point = points.subarray(i);