From 664e05b2ca86a37c19d47e9de66a47a19e912f50 Mon Sep 17 00:00:00 2001 From: Dane Springmeyer Date: Sun, 2 Dec 2012 19:53:44 -0800 Subject: [PATCH] Fix line placement of markers on points (#1548) REFS #1604,#1350,#1607,#1548,#1625 --- include/mapnik/grid/grid_marker_helpers.hpp | 20 ++++++++-- include/mapnik/marker_helpers.hpp | 6 ++- src/cairo_renderer.cpp | 20 ++++++++-- ...line_placement_on_points-500-reference.png | Bin 0 -> 2356 bytes .../marker_line_placement_on_points.xml | 36 ++++++++++++++++++ tests/visual_tests/test.py | 2 + 6 files changed, 74 insertions(+), 10 deletions(-) create mode 100644 tests/visual_tests/images/marker_line_placement_on_points-500-reference.png create mode 100644 tests/visual_tests/styles/marker_line_placement_on_points.xml diff --git a/include/mapnik/grid/grid_marker_helpers.hpp b/include/mapnik/grid/grid_marker_helpers.hpp index a77bd7510..f5e3629a7 100644 --- a/include/mapnik/grid/grid_marker_helpers.hpp +++ b/include/mapnik/grid/grid_marker_helpers.hpp @@ -78,11 +78,17 @@ struct raster_markers_rasterizer_dispatch_grid { marker_placement_e placement_method = sym_.get_marker_placement(); box2d bbox_(0,0, src_.width(),src_.height()); - if (placement_method != MARKER_LINE_PLACEMENT) + if (placement_method != MARKER_LINE_PLACEMENT || + path.type() == Point) { double x = 0; double y = 0; - if (placement_method == MARKER_INTERIOR_PLACEMENT) + if (path.type() == LineString) + { + if (!label::middle_point(path, x, y)) + return; + } + else if (placement_method == MARKER_INTERIOR_PLACEMENT) { if (!label::interior_position(path, x, y)) return; @@ -209,11 +215,17 @@ struct vector_markers_rasterizer_dispatch_grid void add_path(T & path) { marker_placement_e placement_method = sym_.get_marker_placement(); - if (placement_method != MARKER_LINE_PLACEMENT) + if (placement_method != MARKER_LINE_PLACEMENT || + path.type() == Point) { double x = 0; double y = 0; - if (placement_method == MARKER_INTERIOR_PLACEMENT) + if (path.type() == LineString) + { + if (!label::middle_point(path, x, y)) + return; + } + else if (placement_method == MARKER_INTERIOR_PLACEMENT) { if (!label::interior_position(path, x, y)) return; diff --git a/include/mapnik/marker_helpers.hpp b/include/mapnik/marker_helpers.hpp index 594617702..7d9861528 100644 --- a/include/mapnik/marker_helpers.hpp +++ b/include/mapnik/marker_helpers.hpp @@ -87,7 +87,8 @@ struct vector_markers_rasterizer_dispatch { marker_placement_e placement_method = sym_.get_marker_placement(); - if (placement_method != MARKER_LINE_PLACEMENT) + if (placement_method != MARKER_LINE_PLACEMENT || + path.type() == Point) { double x = 0; double y = 0; @@ -188,7 +189,8 @@ struct raster_markers_rasterizer_dispatch marker_placement_e placement_method = sym_.get_marker_placement(); box2d bbox_(0,0, src_.width(),src_.height()); - if (placement_method != MARKER_LINE_PLACEMENT) + if (placement_method != MARKER_LINE_PLACEMENT || + path.type() == Point) { double x = 0; double y = 0; diff --git a/src/cairo_renderer.cpp b/src/cairo_renderer.cpp index ced6f7cb3..6972c5028 100644 --- a/src/cairo_renderer.cpp +++ b/src/cairo_renderer.cpp @@ -1494,11 +1494,17 @@ struct markers_dispatch { marker_placement_e placement_method = sym_.get_marker_placement(); - if (placement_method != MARKER_LINE_PLACEMENT) + if (placement_method != MARKER_LINE_PLACEMENT || + path.type() == Point) { double x = 0; double y = 0; - if (placement_method == MARKER_INTERIOR_PLACEMENT) + if (path.type() == LineString) + { + if (!label::middle_point(path, x, y)) + return; + } + else if (placement_method == MARKER_INTERIOR_PLACEMENT) { if (!label::interior_position(path, x, y)) return; @@ -1577,11 +1583,17 @@ struct markers_dispatch_2 { marker_placement_e placement_method = sym_.get_marker_placement(); - if (placement_method != MARKER_LINE_PLACEMENT) + if (placement_method != MARKER_LINE_PLACEMENT || + path.type() == Point) { double x = 0; double y = 0; - if (placement_method == MARKER_INTERIOR_PLACEMENT) + if (path.type() == LineString) + { + if (!label::middle_point(path, x, y)) + return; + } + else if (placement_method == MARKER_INTERIOR_PLACEMENT) { if (!label::interior_position(path, x, y)) return; diff --git a/tests/visual_tests/images/marker_line_placement_on_points-500-reference.png b/tests/visual_tests/images/marker_line_placement_on_points-500-reference.png new file mode 100644 index 0000000000000000000000000000000000000000..71b1fb1f10acd634a249358b225acd66401101e8 GIT binary patch literal 2356 zcmcImdpy(o8~?H#QZ{}#T}%`a6_v>SM6~2Ymf_?!6djk4YoyKkog-8#X)>Wqxo=Wr zG$hSsri*LV##|=1xf>fh-*sN+_xqi{et(^RKCjQ~`8=QJc|Pyw{rbG0uRVHS0ZUn=&ti`oTG0)c2>Di z-br#3QrA{D`MlKAeY(g~1sr*P!Oc%D#}Dp^;O{dmYE*c6+&WmgcoVrOP`2tc*{{yB z*I;3~E@(IwrdI1kX2s;f;zln9u(pv-enCtz7*tL5Bz_`kCh>CAQcUyvR)Tg$%%MR!w9^K&H0FQppgH*;QKCfu4=(Dee z_(3XsE)xWFqdGS@3_T}f3II^`aR4yJ=0Si#00#xIkbm4*zWG|KN`{sOau zEXrk_dTkLHeSU`huj3CDA{(SwnYcM^*^?V3>YvKcg+W7y=h3?JiPg+{3+w^)acqZh zvsC_@)Gd7T6MhL5uYkVPJcx@dagJsWy~@1F#A_wt1&IbFZl!z&-pW{;^JyDJe zYF$@nT`81+)GyJl#ZdxNPbS3$&(`a`4U75ajj%lH*yMC(F`5V!*wn|Ssghw<(!q+V zr&Gc(0x8dU3_&lr&3*AwKa#lYc)ci*@o)q`*o1*#J!MSMiVHcbrRgkTV=ZN=pY_r@ zM|aBN42^Tca_v%$nhy3T_$IB7jjv}}Br|hF;X=0us_qRx_j9-?duQ^+qa}mC=X?$0{f9I zcHv@Tpb7nI?kYl;jbTioXyULZh7=dRJ9pPXf=h9N$Y{yitb9;_dEdkF3&Oquy`P|k z7}*@=UG~a~8iL17xpuB3XALqTyzsoduF}eTO4n&pMT)|&L<`qTw@0uA;!qE)cmj`&`k>LMYX?Zv2d{Rhj2PDG@;s<@Yp8h!DFYK; zDcoN>TFt|YKrZX;9><0t>qchSCR)5u)ck~(m(chPl2veQlx?P$i)Ttqid$l*-TXBJ z6G9SFy5}89vb2<=PpQ6vj7Qc|>?=q(+Uz?#enE|8O+F76IEcrqHU48f*0*a?L$h@D zd)Sf-{zVE2|oEjf}okBbS%=b@l`@aI;W1}>Z?sDh(Kn$(m?q4 zi{V#Nb6=p-dd?Rc@cX_Pt;Wh2=?`o4tqf8 z#`sqr2Juh@>!Sy}MPp}{yhR#diSXm%60?=KFjjY2=duGPVWN1k-ZJX5PePvYM0wDrSDTXZd1?q}+1DzW>W$9S+gBK?1C@V=AreOxnis778^c{>yG2e|nc(WR+$ajn)GQ3WO+}vtEUBt)j~Z_Bq$G?$mX5-^Z9)*JuW8&uNi_M`bQMXFa+&f$6W z=$<;s&>BoU@C%4^@22b9`A)wcd8)qV-1rVw(fNROJx*h2xiB^j9tQqRfcPx{AT1vW z0OHO7VZc9aME|Hid(_C}*^}hma<}B({azC?V=yr58*Ywm));TOYQ+yQHZ4s$0qgE& z8}h`e*8w+IgTvGfK+WrTmlr?|XbjVY8qnyr(cm4rLgYwki;dYjOcm^ropOlactQ4h;>WyF48ffnOf&>jOYt(lDJ6~-VR%}f{lsn$5D;kjV2s_g!t%>Sw}_b=^tQ0~&C z<&&SCZ8mHMbyC|_Guv;>(w$bCOb0VgsgJklTpuin&x;>R7L9bI+xhIXa4vpv;$nCc g6Tf}u-^U73|I58YW?{zd;4}o-**e&iTcdG*0NTlCBme*a literal 0 HcmV?d00001 diff --git a/tests/visual_tests/styles/marker_line_placement_on_points.xml b/tests/visual_tests/styles/marker_line_placement_on_points.xml new file mode 100644 index 000000000..db11328c6 --- /dev/null +++ b/tests/visual_tests/styles/marker_line_placement_on_points.xml @@ -0,0 +1,36 @@ + + + + + + 1 + + csv + + x,y,id + 0,0,1 + 5,0,1 + 5,5,1 + 0,5,1 + 2.5,2.5,2 + 2.5,3,3 + 2.5,2,3 + 3,2.5,3 + 2,2.5,3 + + + + \ No newline at end of file diff --git a/tests/visual_tests/test.py b/tests/visual_tests/test.py index d8fdd1ebd..ec05fde78 100755 --- a/tests/visual_tests/test.py +++ b/tests/visual_tests/test.py @@ -31,6 +31,8 @@ files = [ 'bbox': mapnik.Box2d(0, 0, 190, 180)}, {'name': "marker-on-line", 'sizes':[(600,400)], 'bbox': mapnik.Box2d(-10, 0, 15, 20)}, + {'name': "marker_line_placement_on_points", 'sizes':[(500,100)], + 'bbox': mapnik.Box2d(0, 0, 5, 5)}, {'name': "whole-centroid", 'sizes':[(600,400)], 'bbox': mapnik.Box2d(736908, 4390316, 2060771, 5942346)}, {'name': "simple-E"},