From 8d79008e9e9da830327fc29fef93c009b3d4244d Mon Sep 17 00:00:00 2001 From: Dane Springmeyer Date: Wed, 25 Sep 2013 14:02:52 -0700 Subject: [PATCH 1/8] move over other colortable test to visual tests --- .../images/support/tif_colortable.png | Bin 26701 -> 0 bytes .../images/support/vrt_colortable.png | Bin 7305 -> 0 bytes tests/python_tests/raster_colormapped_test.py | 40 ---------- ...colortable-256-256-1.0-grid-reference.json | 72 ++++++++++++++++++ ...t_colortable-256-256-1.0-agg-reference.png | Bin 0 -> 1863 bytes ...t_colortable-256-256-2.0-agg-reference.png | Bin 0 -> 1863 bytes .../styles}/vrt_colortable.xml | 2 +- tests/visual_tests/test.py | 1 + 8 files changed, 74 insertions(+), 41 deletions(-) delete mode 100644 tests/python_tests/images/support/tif_colortable.png delete mode 100644 tests/python_tests/images/support/vrt_colortable.png delete mode 100644 tests/python_tests/raster_colormapped_test.py create mode 100644 tests/visual_tests/grids/vrt_colortable-256-256-1.0-grid-reference.json create mode 100644 tests/visual_tests/images/vrt_colortable-256-256-1.0-agg-reference.png create mode 100644 tests/visual_tests/images/vrt_colortable-256-256-2.0-agg-reference.png rename tests/{data/good_maps => visual_tests/styles}/vrt_colortable.xml (85%) diff --git a/tests/python_tests/images/support/tif_colortable.png b/tests/python_tests/images/support/tif_colortable.png deleted file mode 100644 index aa055bb459326cf1515aa78b2589672623b62193..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26701 zcmeFZ`9IX{_XmExUb7fmjfzkhL|K!q1~*m>CQ5iSq#f1do{* zo&o@cFHt}u!XJylU8?|iY&&MCZyo$}I_00@DeZecdXIC*W^(4bxZKpGX9cF0#OqJQ zF;49e(wV6o`$1E9G;o(<61KD%k4Dfa^JI$RmQRdQu54(KD z6a)J3oxPT!xQxY-SZa8?4?FGBgE|fL$;vRbQ~B-s^2|sCg%rs+>E%mvC|`+v)52ZV zxrr#QR?G)&jJfy?zH$75ABEyd$SUZ4!+9B7#~BWb-gvLnVp`DTA0rWPsYEK(f8F%) zaT@&Zw#@7rMA}~36=&q1`J%P%`z)QiHv99i+s3>d7{7@Xn&Rp4=qVM`Lox8mKYAVmh2#VIBxYI{ZQgKL! zf1xGU^-uWwccO1ekOFs#)7oV_R}7^wOLD2=Bh;`mYnLjsoa&+x+Bcp z7_*KuS;sjx=(F*CuXAe<`hB-Wp`!v$>ftAQF0&ix?1t_6hn={;_Hws`psK8l`>j1#L z$n74&sQ+kOoLCkEMa^9Cbu0fmfi+IzJFqUXeg+RN9gPm{a^kM`QunMK8tjFSkW0@_ z3pxw$n**V8jO*(<~1g2PI@AW)z767azdmP-3gEc%rYMnrP}1;r@=n#P1w_@8fg zZ6h%}aj;hq4)O!q$Jv}nuo*;?X)(I1bW$K25oUFzVqLUn#M zexS+E&}T-kqyk`18n1o)zmJ6Mpz*J(4iZmtoe;zx&R+M>FDG8mO^%C*ob=z3$@8YL zMEFIoc~B_)cx2AC=SnYHpWm8ZcN75?4W|LK8#zsG^Wj*6glo0sr!6`>lgXA=nZ&|% z2@23}d;gHGzI|vcMBw_AwGxGi1Iq<;F;F4x+{1g*pw>p4p8#!iQ08N<7^6_D&>H5zHx%-A!U|0^=51B+o;W*i(>g7tGX7k zd-zDkn8LE*rLMa7iw8+XXgK zx6J4o>R&LjN!&z=bXXj78Z!M=U&)SM2|c;23FZu#J|<`TR%5cc66CmjOe>d|0pmT5 zDD&ls*V1X@gZrdOhs@}lmo5z9Q6~b}hUOsH8D1uWr3>Is6Ti5A-u)J{mL(^Ok86jv z2DX=c#cVop9rGxjG9JG=vNy}pflMAOtZQN`-~#~mm{1|O-qlX;-Wg_drUWqG(%fdQ z_Y~<7buSFrkjaDy0Taj8s^`v2+wgdOEBL&sRW)}h!TZU)aVDgdn*b*nBc+j32P zemuT%Sz%C-l%T~OKg1mzrEkGEzhio(om=lyQkND3U+mLK`f)kK;d2Qt+kmZj9RXN+ z0`g6;SHMLuz%7=e3bIh7gnQ#vh9 zC`cki88E+06g1%t^_d~5KLw1mNQV78_SM*=E%9{@XE!a@ZRguGPLdvvDK0nEYx$#t zIBRdE(Ww_6cg?AgveefV)lPeIgyo+cTeC~#@KF+PMn1}w|Gy_ze{QbdE#~v`@|pdo z4kDmF_2uB8n>0l|^7m)1DX=*Bb2bwARw)_3kr<`RfZ!9l#r!e=MBZ!jr3TOV*}Afa zbaJNE=_)v9eI^NQ|E%*@Lejod?_&W|aiQ=)!5-jp@~~{|ys;p4m6L1C9$Ms1^)&JX zM3NV6*MA@Rp`DrA#S1h)>6d`Mm`EdXW58?4h0Ayjuwe zk~WRwrN{H{&)$38$(990@7Qu6j>1$7Xi92~zUD<{X>k?(@9s1v0-4cN1?w{eg4m6i zQlIh_D=;@8AvC&K|8}EyQ*O&JKa$(*gu@)k7V$>QBA`H%y9aNGFuj6$*s}6f{cLjp zyl0@>zTl4EgE3mf>jHY8EON?CGXbWxE|fUZoOCRmVW!bC#jb3qR-`x+fnp22C&2v_ zTiC}D;p+*t$>3OS1^WF;UCEorA^?+KZw6VaW8=%$tttyzK(Okrj z;4nqmmL%`YmD#_spS6@LXYK0nq8Q`KJUwATGZh7v3(#+t)E{rT>{glDP;E=2Z37jr zFZZ4=jVqIpRr4;WV#)QtZd`ti66=5OZ1Xf|%QWF!aBZ+gKuW#uRkvJY*T-*99myPZ zu$EPb0T%HU5yX)Em>F9cJ{=5qrD)wAd`=DngH7K?B&3e8dr=ISG(1Yew7F1_Ps59!(qKcBIEPFs0R*twFIblZ`i)O22v%BCCh(75Zipzjoxw=W9!+)l(KuF(xULPIm;Dm;PLDs=AzU`}LSU?>sN8i;|qnNo-LxaOXs>0v}kkJ zFAdDfTCiGBKP|8g)E@$yK)rY4g%c2W4RaY$5&6}%InF`9-~1|#(Mf%zR)hjwvY%t< zvd3Eb!zxz}hTB6~(=W+pIg*R|7TtAv^1d1Osn>?P^ih&OygJvPOkn*6qAjUz$O}M= z8Imo$d^M3X<#EWr=34V`sA|nvXELD;(B6D5;Q0LAGRf8aV8$ID^lU|$ybVA?c1>S+ z;eD<&D_~(v;LSVs%S{~*ZZc9&?goA-3xZ$(+7CEzr$x&)A!iKHGTv`KRW* z==fDzL6Di~AqSoYUTh1T*v#s=JzOUxWfw1)p!IJj!qg#<_ifHjD?RktX6~<(`~1ih zVf3Da#^6>O4r@;@t%z~j!h>&D3^E;{-z7nxGZ9$4Fa6?$P zfR`KG9jD#ioM*40WkJA38Yg0j?R5=%>ehevQ=>xf{T2^MH%r9q(%!Y@VPZEVAV?y8niE-;0f*mI@3cqDPOO3#6 zMrRSgi{|}y2h1uy8j3|*o*NBczTLGbN2-vj`_zmeWZ88@Xrc9@T<8^fhK#UeerO|L z4q6tNAg1;=8ZUcyB18XSb`2-&2!3RUN3{QH0ho)2C7A^nC~6zcdHFh|g^D8GfR(>5 zk$_2{fcBw7%8wqOUgr&1govCIG=g%T_WB)VT0pvjUOC@A^`j9xfghQs7?eFGxDNoW?^2%wVu1k3 z_o)a1fOUH1_9#FjqHg-mPgdLk<&Yrjm_jT1Zqve8N120hiz}i@inE1lwh$6FWo5lO zECFO-umLlDzfdsf74jOyp&K}x58)9NE;X9p9n*hPtPL2N0vDO)zOkpztx zw#YHZVhRS^j*2Y1K^E&1k-Ukq6)0gBy6UhM4T<{eI{oFX|!hTz#+f1aN2Gue341h(L(+ zg#bDZHch?sgAgkNr@OE&v=Hlpdqbi8#d&Imf)@5($1#8Q2>{GUMc}-;TTXbwVIZ%_&!JaY2&Wuy%c?bC)~9^jRFKOIisnMlDGRDKZD% z{>c|$-czOtlMO%1*;UJ_2tIs_JH7-)S|Z0ez(E8{dg?k?UU@BWTh}G+A0I`h#Me!o z(^HZ!fi`fe59d7UM%w~{Tf(M}*qI4h`)a2r((!oZ_fI}wtB>+b*0q18vrfk`mlD=` z+NH9Rwiid!Meu>iT(9>q_*zjYC|FE*X@dkAAMQaL|Q8W_V>uyo?Si98bpeIhelArR#fSieH& z1HD>TF;A)#u%$6O5!OFs)=92u!*m2t*TsKGZguoA-}1_;c$$1pwjBSc`in7seNHJ~zO` z;k(#nd3OotmnRMH$fzV#IgJq^lko~Cz}^WMga}!(3&pwjQbc@jmr>zknc1y3F=bM8 zN>Q(eO#OotkvRh(Q5LfVw%|=DR3J>^Eb^A@N?nVgfSJ@6wkV2@`QOYAmr2#+d@PF_%inwEcYd)o~Z(o&N@x9B7ddcc!d<_%9vK zZgb`2N@Jh++J-F`3L~+`FXePO9>O zp)3@Hgyj*j6Z(Bt6xKG-Mq!A9@p-4&<;X?4ATY_8iHO{TZw5@yQ96pB(hQ$m(jYT@ zmKEQEo7ldstVGEukvuoM+lGY?YNb42S@W z!aGUarJ)hZH;@)i1cuT~9Pe4Y?d@1Z|lppDbx!?As>--P<5=+)dypFol% z7&J;Z(SkI0E>j7igtQzTw!&fat8sS_m`f!ZF!L0ha<`x`ix`GNqo_nnO0g8a0`GpwR#u^X;oeE&W?gm|AxsF8%fh=q>|E^Zuh$)vdJ!mADgY z2LUSrcyXTO3H3~Qto~ie6?#RO20rMME+ zkG|5dP_qh+OXOn}r0@aJLY{2xU3_3*Yz6^7iZt~f(fYR8D5_Wj#PNocpc*hFG6T+* zrUaC={TU>HT?j1_>mRRNjz9FddEB*p#rRxR$D+m(q9ZW;b1`3UL50LngKSUHPr?Dw zwqjJwq|t3t`s~{&&A$V~96CW_6pG=I#f9>W8+m`x6t)%_49UDv#y`b_l1>n>j0K(; zXmr}KK0F))S7;C7JijP|fEbRsCU>f_&gQnyu9)AeW zi<$xG+;?@OE-()ev)}=SN)t6?3qfF>Oq@&L9{80B)WY{R%zi*J26@2QF^BVi&dtqb z>@}BInN??tEwqZRp72m(sqi%$V7o5eVe;cdfZ;dF87nm$+M!idOm1reM-f^wkp-9< zf<>LhVn@vDM)L zrA`FWxrIVa_IS-VEz!82NX53f6OI@Gb=Y@ags5x(_r;U?L~%0$fFqsaVV=YV_rCCV z%hl_VjTLf`y#RARn_rfok;Xg@SQLuJSnJ@yhd69fT$fo93Yb5g?X)!S*G{R?XY|a} z*P~Zj#cS-66g;dD4N6=@M6_E8kH&|;EkzR)@OdcKtclt3yg0dTSPc5O##Xs%tIA{( zg)5$w1IqXfle}K44A#HujQJ)~finOF{*K+u`5RHqPBYqEiT`70zPNHk@WK3O6+&5M zH;x49Gd-0Mx1V6<0$e!(8H#7CF2p9JJ>-QOc7~r!*zou$ST50oC&8Qse82)Yvy1aJ zxvx6!qO`JkyCmv#WAUxoec_+kX&Js^f6S@t+aCXB@8C;U#vb#=2}q+j@ok2Z-ifPx zAR$pC0m0VZj<#NPaFAf$5y0Gfo;6&S_;M#c{N+lhAa^X4Zf1JphSH0p=ZB&( zErTA#-!-=`>h7L}TZ)z_TDS3aoh zC0me+PQB|X#oV*c{zp1<18m;aR_8w4ABpo;r0_vFS@ihEl~B|pwai_d*@Om1Fhj?V zO&VE0)+IZ4<19#V0J>Xc5+v6&%i{KNFE5%SXT?2+hHv0bRBZ>g`Zt~6zGkK6%KZtayW zr}G@)G|nEf1z?bAtq+KZxIpl8=bP$&ao1vmfuB=y3E`y%yq=%ML9jF}c}tPevLvH1 zfqNW!LYko^DN1!;w8+jY+4MuJQhIJ|)qv0uC4d=V+d=xoKZ@kjVa=AEy#iEz&~cr< z8w8htbEG*YQ`O#&vfiSu^LZ-YlOTv{f-DS7tUgU4MggoLpyt-O^Q%4H1w`z)=v=`z zXw4T^os_hl947;@z8z#DSUug!qX`+sC*gVOoJZN*;|os!4D6rCrQ-a)&)w_)&2_R< z4{cq@QAgT6F?&)1gc$rxeawcRA~usC!KmwfrsMsmU702VApbcf61)X(*piyNN{?T0 z^6~|+oZ@!wfdO-=YHKsMD*+NGO*d3qJK;N1F2H{w^G1864Gx52n!02wD&j z5fHqLkNf@6-^$z-PX$lUQ-^QX=Ota}TI=$03@517hZTBespTPQ&*-C@z zl!h}t>~^yQ#kKVPz~TW5U^jsGN7t@uJ1?U8uHZI4f~Pz)hX;n7Of?I2I?TCU86{*! zV#T9_ap%0Zg8{Ph2Bhe2+9vclq0TldJCVA7c6j>6j;?XGZu(yPXteGxMVbR&Bf=EG2h*7R1P#K=q3qqJ4t!_T^=FNa z3@O7TxO%iOtf%h|*o0Pi#_d4!6e1c`V|U}2Bt!>c;*b(gZsSHc30h;imF)+snTMJo z?;g8iCyaMkgJmh!zFUrDn5zd%v+i5-t0ghq6|7z5nM&r|qg#V{i+Fp{L?1f~+Av2;1RQl*x_Yt*X7x>&GAL36Wh>FYGY^Jj7G5 z3}Pi~or(uGWX6(@2+1V_achBq6%KR?4pbNbPP?)*lk0duHJKa{p|~fi+RkWXet>G4 z$iE3q7l1X9ITr(48unYv8y*GV!S#jnN;-eh6Qro{3=qJnR1pQfvj@joUvhk}F0b)q z)gWzlbRzaBqc9QryWEy@Av=RUIe(%klM_CY^VELv9rKZFY17!Q>O)S?Hz}e}LVS#i z_4)#$Y{(`NdshABP3K%d(dw%^2Fzx4s^^bFgcg)akLue2!pfw;i}K%&KAc6pJZ0K; z{8KN^$YqmGRFmH?S!{o+iqE|*3U?mD5!W58pt*XG)k@?Rnl<%z0~cxL&-aRO_aPa? z1K7vlG1n&XU>*?9$FBI#o`>r~wvh5bq>Yi30=~QB`$(%S-mep!+Aa1GHCe;^HP|Ac z!y4O;R=m6~DLR*zb=p!&t%Q%khr01|+>F=zh*Zgi*_pA;ur|vm`~~9v$y#XzkZP{E z3M5I5qN9A|1TA*+&Pwh5s;)@7SCA?{Yw)RuJU@BmdM?0vNG6?xq0qh7=7eA)&X7uk z9P}0#JY%t?_v}u1T^G%->2SXSkk>*o?EF3SIt0*~Hd0m3Yss%I?*twD;RPCD4!b57 zZNc=3-ZtoTo(M{l$q>RsfMb>mtr^R5?{80RRKXegcDLo%^S6Rx@|*%--NdE_))heo z7jnnD9=uROWj-N6I0%xqfl|Q-c?zhY=!;K0b_vimujK%-Tz6%6fZ0%(Rn~K_BLl3dVCT-7|@c}>iT^pOof4o6>1wsvwn60<_NoR zPqUHJ1VrpX>b@{9&fxm&|MuD7>o^`v*61A~0A;l=^Wqx_lvy!Wvl}`yjCiDLyadGE z1iYX$30c)W^pYXG`3jkaP#y@e7_>9S!#JL-Ozraft|71|D{&mf_!j6WaA`TG zvEKaZa;sR2Wxvc9NOM0X9QTJ*qF?HWG8kx3ILT`gD&mJxy0>^F3mzjo`;Z@MaT8ZD z6?xcQJA z#fS3mTO_QutaJ_r#7Ou|ET9F|tv!b}zOC)z6cK~5V+$O`vPM&_LqrhGYl-j>!El&I zcO3zVPvXgzlr4UcR+<>E{gTp6@Teldf({R=dn;9C>isx(4|KCvauhd&0xN|?@W~~w zH@5jhXbG8~&>aM&0u_E10ef}we!G9_q#|H6 zw63RWgl(eeY9VL$v4U0QNRTRB(!`d&NQ}nDbFXYnPVui(!fJkzE1?&NXkcQU>(p1d zn?r$@XXWzw;uL!-g^>|W=F*`acHMTMJK7o%yZrP@k&Mqd7uPMNEw|ETOj{q)+#Dcr zC3ZSaa!iZv&F>Pz9$cTfy)n-tLJ#h|qixi&){c`J?o?{JQG|xGBXq8 z1O+R!NOjpRFVdI9rc}WeihA1G;OO3#BknBhb?3sl3nH{66y75P42A;{rhkeni1XQH)nta@_!=%6E(jVE2a%;8<74kyrBv?D7Ka2e6{&ms@TGlXHsI0ULT-G ztLUE$qxxup=^`y4+FyeL8T$y*7fVXp=Y03$v@??9mG*5PL7do%Rovez8^=RVi$-iP zrd7+Z`b|C%b=bXrF;^XNNIG-eDU=UU!21Eeavc=(EKRKM%&$9^TDY`gER9`KG(>0) z(ySU!G7q97NLBy2oKrO$mIx=d@6J7k7jcXaTU)sIj)Mf`me~6-?WeCUy)s28IH{4S zC2jd^GGwtU#33r~8`EA(JYKl(^#@dUcFZ@z#wCp*06fZ&r01=o^qbJRmF>0L@VX`S zQW1#KGZ*%SWa$4J;nuEDDhtVN&{#FbA-J{WL+~M%DQ^HR0V!pBVeB*Apo; zQL;>f8+e`%UqU7;h&LyM|NEzE&3-&+15y0kKT^kqd9ji-L&p}S)w8ug(TwKy2uy5G z+i%?5B|gp9%hrH3)atc)SsbQIUZ~85$KHxCs$y@RF5AyqayY*VF~}*y6Ytmlc=QdI z*hiPfMsIj446Wwhcv6=ak3I|XTNFYZr$F2=#|c~Vf{k$ko+NT?70R>Qk=SS zpCe8VFj9{YfCZ^BsSb|}t}CTOw@}!*>3!iXOyYdmZhonu3whdHQ=yTuOA1Q*G}mtw z9;MRL)7l{gH+o?(Lz}}zB*EOd{XJT8>#5$k+7dK`_QnaCRQm)*B3lFI%bCL>SKxUU zo_ey9x(PYEBXGNn8$#2tX+1X&QxG*PDK$x+{eph(NZupJ@ZmnyFA0^@&UQ(1L7*>8yK8DhjlE?Ey=`)S+13 zCaW_PXEI$qZ1rZSI2)Fo#;w$Bf9W74XzLD$)ALD;T(lyZ*)-YzW=OZ*ys#A# z>cw!{hWkl(XxRQEZG*7}FTH%34WIfEC`ytbTO|I3p^5MP*yweQ1@6exIiHO97fdJ^ z>i?|5^Kb@2e`du;!Tl;~53&;?fJ)~s$GaU@n;gwMR+^`HX|5{yu*$FWzhO-wbdK%q z1kSthdDO7cpCDfK=v}e=3kzo_N8DQ-Z!Eg2 z^83L+G9esv(sQf}W<2$@9>E(g45XzNyAi=Z!8S1$0T@f7_I?bdKp~SI3TxvPa?T>8 z(+#eO0TE4~JY&l39JcSZkpp=cHt!!fUw3XAK4>qG17CbOHW^a;=$;aPCV(0a33$Xj zElWOVG;3{)hd4bh-2EidHff5(R7s3fp=NG3+#lml-c7KkC5QK@uYUih((KR$_S2Qq zx17p&X#f663k8NPO_AWUOND`c!RNPDv(DW@E(M{}eM@H>Bmt}7HiRt{%)lXNm?ZK1 zH}QI&+sVou5K7QAetN4eJu@FXD9m{2rScwTkdjB6p^d1MY5I_hP7-EN)E=y~6@;zo zRd7=)AIk#9Nt^|x*b8w}ht@9>@DS?Dgpv~bdjvbmc%(r5o<57jtOcE2g;``!avE@+<^c=0?{64@2La@P8_jDr$y5SNuY;d` zy4vw{;^@h9$+-pU+^^pXknmHw~5?AsVaoDjB0gQCGM9U@`6Y9ulZ}~`B0DSB!5ySC;4v$`M zmM}ebk2gDU(mdp>ivu&qS<0AuR^C|?Dl9}>1$n@7YsXcy!fTuGnhS*}h-N=Oy0O-Y zbY&XPhJ+2;wKXqL>R9ataW%j58akty!Dk)hbhI>8*L{VFFdtc52%hTGq8fnxt52Gx z;0?)w=l4_{6zxFW&NFxHPT+nyW(o_=^!!s{*PHX^Lj|cJDXxe8`O(s7tgNBNjdSWG z&E+E_@bGNwGlPi0f{M0c`HpcXB^2^gGqvPH8)kW+C7^jXjaDilL~gWYx8{kk4teG` z#^6A!yq<_?vpBbTPu;IKRjp1Us7DQk=Ya@fznn87=99`JFn&!^gV2{XjGmYYad?GT z1W`$P25?N1mVnQhG@2aAB|20@Tp6_SaWp$K-A2CtyZg-eevNXd`tnFSoBiDpMFfd5 zsgD*{PScoS?s+dv4>=lm@36hd=^W%Sh=pn3VcV)hBc0OD_0>u+m>pk>{grfQw+4hH zCP%q25?=4wY2r%3J_#7=JKLU}mtRgaSwcmC-_jOYkoRT1uxj>(BotC!PY-NuFSvzy zoGBiyLnX(vY;Zv7Ki?SLlB4wam)CQfslUYh)m$UMeifz|1J5%sTq$>BC&i<6euj1+ z{O~|odSV?O3`HJGpq83!tgrpyx1VNJ#c74=ydN8DEVWjb0lbU3fTI4LdcJG#u^sac z6w1qY2Q|hp+6|s#r)>3`=KQp9N$vjM@1?%3M4@}u8^649x4klM=pm%ydQ0I)6VOqW z-utS~v0tDL{+UgPz)sjQlP|w&PRZTN>X>|{aBDtn_V>M1F}=f3@!1gZU${jHw9oh? ziSv5GsF^x_GdSJNdG_$K%MdqUAv5)xDrqhfdlVl}!#;u2WajiyKYGTo#)de_T%(Q+av5zYNf(7Z1R*VZYRI9%tAE$OW> zC^Gm@Tgk5Y8^G6*hX6JixgkId*|XtT(%p2vbz;sLDfbf%OL)Et0Qchoi?b>s4*;e? zpLO7PjTBbAF7@{%^vbtBtt1deo>uP;b?ycx|1OmQ5LWJ;dFw`V~`_lHn;yfpJY%RAn465Fg4(3g2 zJrIj)?mpuzsx`c}JYbEL&uKsqN-8QA9bA_V$lKUz2cLJ3FF)07$V-e|3Xc6|h5H4V zc`Ii=gg=W33rt+|0;1d*LT_X7A%0?B9@sC)O#Hc_``s%}->tG^XC_aDw}JPOz)q>z zuA@OtBncRxujd6KOvS4%+ijzR8y1e9{MX7_UYLFDgp&s6UVIn<7|LAWKw3%~)-(FC z?5{(&=<93mH&d^-3!=-z1r4UTn|F~K0nNJ9<5d;+hUEVaBG3&S7DE-Aqct9TxK_Gy zzFKl2`-MPFf*s1dDDMmv$zAkh?jAm*=ZgMxjUA2_#O2X5+AwTaqwL)%Q}IA!t=;JL zQx{&{`Lt_KRP?IcLh8-rsIL%zY0C5lLz!$YXxA_Ixd0M{F(Q3f! zZ>Z$$-D)1R!bV;U(2}GSp~m^J*#K#Fy8hYpfV(s;#3{FUKzz`6^iNO> z(_L^lDH2w0gnLaichEZLp1iu3#_eaDPy6YBz^G zg$H>#3Bh3X)rgVlAp&($&NZ`8LEK-VvtA1&aK%DZu&M_2RTXevtHa@I)7u@Xq3Xyf zeFhKASm-zqRyPyAIb1y-B;D!!DkQ{Dzo2PQ1-h-h z&6msDLu0-qt9(Rh+EuW^m^kKj6%1@+x~@7wxyE)!va>5-yqDjkaz{`vN%hd zeu)pmflJ#q18fuIZVsF2w9sKfD^?qnJNTfP$_Mtt8ZG_Ok68lneY}egzZ(TXgH|BU z7Kw(;Cs4bzdFty{DAZZ(}XrkhPkpJOh=KHu3MzhD(?GWY(Th=ZR*UTjX zm33+Xo~4bue+NvoMDDWhXTM`V7u+~j#g2KK=(hZ^e07iM8F%~l%Vt*%W9s^TG?do8 zJpSGZ0hU<~yg;NGlE;rZy~Q9v$9ZNHs!vN()^*p|IKcSdC|*lZbuxld`~HkS4GZ{N zDy5bs(4_NbIf4G~fcv9;>yWUDE|vvq55i!XdV1|40z#}9mkAgVY99b#9N7TWol}i) z1!vz}&s=e*fKjK7dhluDPOUEw05cM_E4725!?1gTR6!r*<7&cE26krM zV1s;-N`uny#2zPCjwC56q1L_Nt2)>INUF`zle7$|XFP3=2L<_$p<20(;*3XphBg{U zX3ullAScage{-mRa@fQD$v$p(Jw&V7+zGO#;|D>rdqSK9M>$$vZ$ zr+=CBmH(a;xlv#-^lYCLa88CY-d&!zR8MY((vT|O8_x=NfTz9I^c$%ec@v?BDxeF$ zVOX}}O?;pgUbs@I8TyHxn@OxMQn%2!wfYZG%iv7-U`j32Bq40&h*(VTuO<4W?1?2f z9n>|3+EIC|UcynjNTZ68So`>wR7;(g)ibY7?ozMQQCFxDKu`UY0<5*6Xupu;+EUb6 zb436&XK<_5w8pPrzM<-U#&cx#Cp9b6vuwpQ5jI^E{*C3WICU5;K?H?@a|=%KyjgG$ zPa>yf>3s@DMv!J}j^gmM~!veiPSgp9;W>?3Z;1RWwU16ac<0RWT9SLX`g zo1+tQFj@8Qg#)Q|RpW&yG4CA}(3;tv4F@vVFS{VAtMQ0)stLm9qc#Zm@n({mwL7=( zPpWFmuDt(3AB_(C{1GP^=5k*~nc;MKL2;aN3|nO(bCNB$(28QE6Xro&f}ZKA_}5qO zdIF}wTec54&;on0#&Fp0l=h7Lig+pkc-C<5wAYm``3BVy^vnm2tGp>DfHuYn;~s>k z#NzvOg`Upu%cH6G`|GZB6$*pTd8DWUE)~|Nq@6`T=^No})~xpT_U1}QZs|4dotSX7 zRqlzHUW=eJ)j_H3v5__Nq1}5ftO|?Wc$C797W4343reo-{gdYAE6i)V4TQ^pW~d`1 zYGf(08u*dvfPz!Utl)6`Q5%x%T4HziN+J2PJDB19Po)%lqfHE(So+ z8~so(y?DhPq3F!k;Xt4P&0PZW7(Lo`i*qPC(hmGrj=vdJ0?fZWB_5Y= z)q9oJBQO-|UJLKxzRbF`KfZ3_&T_ENVO0TUG2BE0Dqy-FcTl;q+L*c(ILCY3F3ah3 z^jVd>QO>tkAJyD%Jl1BX|E_5w;-UzX9}GEQiX}q`fP%IioM=F4S&7XsN3g0+DXrfZ zp&`%d9=j^DT(IQwxAgLc~S9S~r0_c9Xwm|m%t1sLyy|vZR36| zX`&UvLooFj-)u&(#xe5(9Xp>+xGQoG0#O}5C>+^F`!G(gc2x=}&@9OmkKram81Z7} zxB13Oo^*fAAHN1 zy$#fIR=u~P^}_Ol4I4a(@u#2TX5+!II=mwjWvY_?7=nb#*Y3^3IMC5Sz4X}@1+((B zJ?yoeElFHKC|YTg%eXy_{|cvnd~(Y6UbSsP_*H9^wp0L1v{B$~CQAFg`dPfrea7j` zviX?L!G%mQ%w$!nYF+P4TDGZMtEVP+^6Dj01=IPu3g43vEq{~1jio$vD-!cBmt|0ES8^pb zn`_xSdkIuHnMZ!Qaft|<@)|y>_vRh63w*OXxh}|xVZSg;Kx73BC8b)>V1xy~BV~3u zoink?{qaiYrlcESLjG`HOBevH?LI%Awbwpe&77dGhKPfm0WqcfS@BJQwN;0vRTrp2 zuul&FX9*B|>CcG7x?M8Wh}+r$+u%r|sTwE*vjgL)Rj)TynL+S!z*QYQyY^?R5%=6e zL7N$v>mpgZ;b3LIz}u4mn(uKY)>{=o^p4jiDF=J??Eq7H;SD*hKhO9Wph-t`dcby_ z(+gaH-Tu_S5^|!hc;vG<*DLMG(1raQ^3>g=Jp6{t^G!WfXLYQD`>cyvzG!}YGPG-O zzkW5`uThDJi00Cch+Y#Iz%rv>&0?5Ui&MznmZx^G7X}SvGQGg~Ev)f#__>AHbgnOm z8+9xDUKhP`VUeDZ9#3}@rz!4y2-%0Z^LIqArKfQWLD7(@`Y6oNw&14#W=6`wgOK-9 zK4a8FaJ%fYZ`@j;KhF9JwI=0HyOL}VX>Qoq%NIr-daA!dpg5RD(*jes!0eg}pmf|j zPCAXCRe-Toz%3KN#x`4b|7F1F|8pD#PnEpp&Xx3L#8j-yRwN%k_KCBp25xAP^<%_H zK%?)iTPn4G!U%y<^J*cjiL43Za}bkt)7p4JrYq`Z3r{$vRlF!5;IPCH+qh8J#z!U}! zz;E)BRnRbT-Tr<=Y)0!p;?*vH+RqpSrEWetE%-(LQ}hc<0vMQt*`~14iQ$mVu@j+A z-dcF;ZCjweuHFoi>OXcn-uT)Jsj7ls{W#FYk{h|bLOqgp%~*2BzVPWG@?e86yr*Ye z#f&v`TAV^#BsxJ*o+f=&QrK!!3fW>`n6oR*V+w^Eeh@U)?&m=?0A;#cwT0VR$!#Au zj)8~JN;xA8=H3R~yy(jew9gQVaRlUvYC9Ksx7gc8kZ^FCH6$Gnf=QMX0qn)MDFYrb z!iMoRq~Y}rQ2l|Pv=VF4G5AFPa0`Ihtkg439o(zw98HOAt7rcteqNt(u7U`@R_X9< zWxO@I(b3@zOR;Tz8aNQJG7Rf|vr5yJkayN!x+7YrJ-ZnkII9$$spy8#)CXYCt7oTh zd@H5nchqxt8v?p}qZdpGR`#HT9%>)s7rBBvdbWI+IV_O#q<0aDV(G94dK$JSXc(O# z03D+>8=qfKm&ae(BwqhfrcS23J;DP{yU~*wc<|M`wFxSG)Krn3u=P6J9k4>E(*-vN z!$eBWghw}n;3!*H#O=^KM__@F9{JosnVU$B)wX!Fbn5LT0A*D?;DvtwYd$c(N`G^9 zGGsmUZ}?E5TMHNYK!-Nhmh-3+SeE2y)2G97)d`t6=K33r`qXQVd+|?EAhgk%7PK}V zI@<)I{b71$(!mqW_AT4bun{(5O?2hmyZi`B1SGUZn=iW!z4xyTN}&JnPmKV%;WV#U zw{fwBa>(I860{<=1qag}=sP=>B+_? zrv*K1{uL-DPV9T{STC8~anI=YlI@8)lfo(#4&(rv7M9pO7c@qx1~dXNX(;0d6*izR zg|})=Wn4gSfW3EPSwcs$G>xZy#jKVyB1%kO7so?d8Q+}1X(Sp9e7gwAA&7Gq9P+My)bRLg z*xWtX+MpbF27#(pDCJA7N`O@>O9@h9HBMs(7kKbAsTaSAJEdn$ivD_7 z-N`PyN99LKF5jPrrH%SO)xCr3s{>1{n^k!${@rsBVD+;bQh+gFR8_@@K>-8+ZMR{H zX1u49mx_Qqi6H>W03{{$I4C+i+|*T9DpHFBsxfZL2(xAjgjSkYm(R4F3u6{jVPd>9 zEvLP%hxeKKYH9?Qc;Mrr5};hU=LWDUN!?T*?dd|FzmEic9Qln#NmBJ}Lj+@|zXMi> zAP6`}aYSfOkfAr;u(c^JJoYbU5HFbfmLt0EFCVv$Qy>7%HB0TMhj7?`t83#+YW}J) zm#ANa?K~lQu<}(5(n`fQ3PAMidPf|z9n$fQH7NFd^_EwIK0~xooZAU|?tj_GwaMTj zzOoK4n?Xq}GQOk{`t*X%O9d=c+UgnU;&C)RaJk59dJ}>8+6jQI0X;m)Yna^ z8s32E`-&grsPjseI0zygW9L$Sw*uH~*l|_(V7SWreXlKX*ba1D6Y3%~Nh}O2*jCZk zJLs-&0a^3|r!*uEPdCCkHV&r&ikg~pMkj+3py23htD<<{7(A$nkl;5*p6%aCu6*oS zHDQLq{-{n6py>Q`6XO&5a;>&g0xsa2~$vU^iq|zi{{&=FcN3-a;PYeomQH&)p5CB^EqRE&7Mm>%;&IIb`Kv1)% zMRe|C#;niCCIF=zU-{S)ATF^ZTb&cN;-CD(gG~NNJJz7}+F!X5wwNdJ&AFfz6NoB* z+u+`-O-;M5mTx`<(V4MlhAfO`y0ay4i=-LvARve3-4Z}Pws7Xmw-60PlGJwZ?mdnI zXft45)`ELfaghoCv_-u#P{CinAczsXG0b=aI(A0$rn;@R2kJp!mPr3^%u?@XYeJp7 z>`u?)*gK3s9Gc+eg=QkULF@4nFU1vI+PPRS!)$ct0S6qW1%scyK^T1=GP5;XK@P>4 z2UsUvFPjhTa+epV0EPVdq!$O>B9- zhJaQ~ih{X~Qnls%X#bb<;gPWT3v8L}WqnLbLKaw}cn!dL*ZXoG?#un|i=SUe>V z_u~uMgAC^iTD~Fn%1;{`Qd`5UdH#bW6|kEW_pYM{B=Nl7C|e#tp3LymdBjC zB4Sx!t0jOgW&d@YhL+r$&GkZ6m6Wa0;nun-p%MA!8b{h4s13Q&V(2 z{dXTsC#x{ppEP-nsJ!{TlET*W822LZj&1`xj1=Tmm5!F9Q}nt_#ywo@j|JHcNo{k! z81=_#Q{v7r$tmr{r%RmPxj)B?uQ?>28L>UP5?{^Yd99NU%Asr{VAY&!^6}bZw}#oP zJ!JZ!DV*D8i>-z0M9+T5uoeui8Ah653KAR*2+i3iP<{Xab?suQ6e zNBmb)J(?yYtT!IrvZwNy%qeW>*%}uL>D3hMdll7-&po{B`}*ZK6vO7P|EN@Vbk;z% zQk&%V%8B+Mg{2QoEPnu#NZ0mVq+o3$)+;Edaya3+x>gm#R;%8{2@1pm$nP}WBK|eV z^l3kH555McBb`DbejU7|J6^08e2&Rw9IzyMSflURbo%zrH0V>2Y;y3i`F{v{@#B?g z?=((P&_Zn10)ZS;qQnIESN zzCQ|^YR8Vy>-?$<%Jj)z!1>mU0CRx9cRp?iUx8}dQCsac?{%Y9OEyp(Gm$C^r>;!) zURZ4bWb9EwN?X17XVREOcfU>pG>poeOdFsby%X|Z#xl~YCC{pDmyJDyrZbu@{wwwI zqY8rwHnA$GApCcpEX_k(c5+>5j&|Id2yTE3>JD06oP1jpGumgHeu!i?>qEHiS_plQ zuB)`QzlP8dsK@12cZ0RZAvEna6r1?boO+oA+)*9W;)eV&-&%PfZIx%%9CCRjsoIFn zfAX}qzsQ}8KjqfbO~}R-=~&)ak(Q-R?{)iH?U!286zWJ-h&!+lsmb z?mhx8a$77T)isQ&S#YY2PPq*~^~yw(B7Xf~KWd;`~3DN*ikd9rKu z7MB^Tqcz=o+GJgA+lx@z9i@g%3bX3idFY^#%ATv;oe$l^E$i=u^o&$?9?ofL!t?EX z?9t~aNv42D!oaj(eNbnN_-^d$Po>(@QzOESzbWyTqadd^u(L_1r25AsZm2(dx<~n; z61BzDd<$ocNnFlx@>m1ObthLWt==zHYvRZwo0Lhb+n(w2Ul8baZSc|Ry{h!!oW^CV)CWf+w_sFUkUZx*Vqt-qPXU#h_b5@W7 zQC&!Z9O`{T5nA2qEquX^l9{h;=ul{hOlW09Rl@qyOMM-U>NbgZ7cR8kE>h*xS3yfA z@Ib$xeTTV$DR#`u4dZs|6sqc!ij97K-#hV|cC?++L$Z4um{TM8_bjflJGO;hhmM6N zb&SGQqFzptl zwOHGnJFmZy>~v{>kT1amB*XV%Pta&kJt@>RB%RTADNU^d68__sbpCTrn9r#QbBiZ{}!TA!?ki zC$c$nsuQFI@BXpyX|~B;f{NDoj+&fLtarP^`R9SpyP$jk?KBfWrEzC#McF~KbBz*x zx?L(OOX&%nU&FY_SA^mBe}gLg!)qHQW^^;4L2IL8;cqAQ@+`U|Sp3M5sh+c2x35l< z+t~J#^!Eu*3`^*rs+V|vkzr9VHm+|Tb+@&BRu$Q0oCJ6wrl zHS*gOvCg_DAHL|1o-H4b?fuKxOmsjEm?}y04kLY!Is^fqE5HEj664Cn3o~b`{Qg0E zvb1iSaK?dPwM+L~I6=(jnc{uJC0jT}VKCFVS^9sSxmy?u23i8UeiQZw$l7WbLAyWEv`VOkad$G;ec7Ce2S_SF@s*B&3lp%AI{Lq}YdHb= z&9>98IKiD8I9n;M7hf8P233(+4{0fK6n!K%f70$m^z3@?+Gc6$xU6+fFh6oc2Y{yljn&Wbd-i+hK4_2bwM)Vq*%E{#DS(@c&d6)liCZ5!e%FA@n)hi z9rBl~csb;6CSR(l9I~m$3MiH~@~~z7)xfzl?_etD=4BiBv2e~u6|`3^8K|vaR@o}JDHD>ID@b6-=nqeQ{kW;z z0?r}`Vs0R&jv5S-ttYtSx&8PnxK8wV4w^!-h-p3Y>FG@y$P*HKi5nmfWn!^bu^H~I2a(J|_U)Rp% zB5aHKP6VjMqNS~tGBlx^k9Sqiz(xUH8Hz0++8V{7YE0%-{>=c%TszVNc?`fa&%kvr zNR55gx{0CH38#uTJy>|ZOknvzTs$t!0zP{2p;IeR?$^kPoWD57QA;=_7otQgskjMd zm``XWj3Lva0#BY(c&|u#G5fwoK6I3iBWP9tMNtWrKg07#OhdAZBHDm{qPxLxhd}WN z&~lB#;_7^XUj!0{3bh0Q3(FAyH+y_w^;9h=08xuQz7-|m=k0M%RW6$W5UQ;+zUA|! z{m>Af3ps{cM&2CU>xT%D3z#o3IS9+RfSq2tdb zjyu^MPUu349HfSp6IX5vMxWg;>Hb0D4Sfs!usczs0?;eGiqJriM))n7)U`+p6A31cbl@aYtY(5>Z z-cPnaye3NoyR>xsXAm^yw;rKYyqV5v+sBAq!baRI{3zvthAaR>;3nn_E8N&K^TVxg zmOb}j#s259z|;b=XfR77p;LkE%&gI4fPV$eMrkogD14F;X~y4x9J^0O^C)(N1gnvC z?{g{%M52L3IJ=3n&KMqy&R+!Qk269(9N#;#LTd9$06R|53cBY!!%GVO3lp`(UQaMe zp12xL@PP|vs1Qscc?2u&7`9vJ|K=_ z>zHuB!y*nOMj63-UI3mPMB_{2ERgGMK_HWrBijTmg!Zd~yBd*FFt*eowl2PaY zqk8@z1=$pGLS)_I`!%Tvd|)Q{W*QKQIut7Sqyd?{G}SdV_yGKV&Tx%y z`n7N`7(GN*1B`@&349RPaKBHy9Vka}9I;h13&tHk z;Oc;)I%Gkm1a63`2naMv@Br7{u+6k}=$9_1tj>pV4&?_OFk9FF9B}dqo8m2a0jeAS zIgWJ%m5xMUTo&crmF%mIU+@s3?M~3^|2^!cL3QB3jR9TW=skJRBWncX?ajOtCpOfG zSjLsq@!$~GWz?eqvSrk?w`R6W)seZVTS@j{J~l(@F=Va`c8M-(-=6yo>Gch^f#I1? zExQ8?Ek{PnV?B(5&nqj=5CV1Ls+AHcr5PqKS|S(}hEJN;mnULfMVyXWBIR z$fM>KLplHz0B!9La5rjPC7g;&8IKt{i{E&NyQfGD?eVUdi}Sl$z9WWPX7=b8G*SNO z>>fZLniynYRkz5Yjt;jwjOchPk+=yLW^r=IBG&oczgIIEuavL^*5jM+GsDh?3BGz7 z4&8qvfxvTI4Z4)IVa@82fVUef{@6)E5etkPUsJO*zczyQR*?LoXOCxVnnLfHfA%pBzX>XKGdyTv z@CX9t)OVTU(YJe}2Qj}_tWU@etG>`~hKS5n2wfT?*-+jUHEEllSMvPrW#iX>P->b&}5L~uRa}7N<#pZ9O zlWDxCq<&&3yJMhx)<% z%yJ9Pf~fM-=IV}AYuV%uQUYHlZ`9f(sa>x|iwnEW8IZ8){N6dUagN~^Tf_75#eR9t z(zT*nXQiS~pA|%x_yqRq{AY6^8!?@wUYT-552lPqcotmOj;Hvx1KZ!W zKFOPpuYRBUZmvF(%~;8x5M8$dGFq8)yTk`Cb$LyBg@6x zwwbg?k4i^MjHRV*vcpexDRvG3A2#~u4V6aDEk{R3N?z2pHwjL>=k2}dpd`mu83>&l zu!=}68~smxfaY`8A$Fd`)*5e()L*?Q^*AGzqfv-qO`9RrT2kDdvJzjP$yxiQne~_R zB4u}zAmpu}ZMv%a@A#7P)GV2C<1E;7X6V0}6LT z7JAA!QE$CWWexUrhKWFR14fOiQnBAq#;iv^CsZORn;dk)+lN;&awd161UjfJk3M`b zbEG*?(Z&O9(ryU@pNgXxwba&P3z{}wu5-de&Q5WJKW5(QQKG37J|P6O*dgCJ^Sfn2nT#v8~Bqk|``t)t+$PIx*uacGiy* zS_(4eeY$sx#cKbW76_>ov0f#s#+x1Q>SeLzUNOUWFyfJUSJaUUpsaw%$AGQ8L2WrAG zn2`E0Fbg!-z%HE3@Kpd;8)k=Vsa)hT7Ma;GSJ>nHi*Em`Zc|y%HC^w#(>~h$gS)5+ zeQ=mVFnl?XY=F^Cmu||88L=wOi6;nDut5U#Gl>x@1G)w@bh&(D$>|mXz4VHP0;W#6 zzo;6;L~`6ry~-r>Bk3xSw<~Y)lX?Cy`00UG|KI_&4(lnI*s0ta^Jg@x6w3wAvT)|04m_-e}BvvkR@R($i^vwC`1 zgSi%duDK=j(PE9foeSt3&i%ZNI^8Arsqa`2RCKom{>3_?ijkMk5L4B4`zs($X3Vfa z3J2gf8PUJV8A5XdFwm!*Fo2t)5i4?M5t5%~|0MlzE7h!dtxUNZDgc7Igy*_Qr8*7apG^DM=Nt?u_z59O+=#u1-7>X!O2KyE4 zrzPzN&}Aakw;#TR_z$@eK&C`|W5r^5fJ(|LH=7PlWscrDJ4;5)mQcuax(iQe@yV#R z29LQ_7qf5BdiilhbS)07N$4-Q@(S58@nO$>%;LhX@Z88PQtt$M5VYFPH2-)R=aUv`0ZFhIc0749XYq=hwOIWU&{2jKi9Uob>B zQJq0=WK;Hq!J!|eXD@^zLvfctE-WDJBirI zK%VK9EG|LQJG!#ED<*gO_E)YCksbaYAF)^=fgcR;K&KW)k1eP(7*5@%09=N*F&jC6(^vr4!pgs?yvp6wwmK-p0(nGZHclm2}c|)pTIYTb+njdFG;i=o&O}w{ahwe|Y?Q`iHWlF=T>a(Xe zN5dIq18K9QzsUFhpE|jGIX&I@~inIO0XcOnBE16dFi;~b(T}DCi z(@-rR-16)KC**7QVA;IXNhFXPzQlJYegzzxhrlSEng$&N^BR_9y~bk9=$KVbMpE3( zuN7V$l@T!x)2!~Kz&S$|?N>|fbRlxo9_~l9Lft3dguZm&{R*cV7uJfVWS`bPGL;?D zL1R0X(!K@Mb9wflw8Fke4J%NH5R!L!?657jT$%3PGP=KA;BhHW0Zvd1=yNXb((D zu5Xnr<>q$qy(f%NE;pE|GLvK0tAlIjleJLro9!gPRzW-9mA{|af3i56Fmi;^hI16PE{EzXpqN%kQw}v$hmXo#l@&MU6 zdXR!0Y9@uG1o{}rBfwuG*@GZ!Ur0!_UJ}C5-ul?1>gsB+(I=3T7WziA%b6PANt5fv zqaidC8PEE_r2OvwQ5`rM;2>lU2*y-D3H0txrjoJ6D4sJo>^lO0Le~R1c>-5cG_`|x zmjZ!eaW7XcQXCPO+)XF$;QZ*Vy1iPc2?MD^Ba*JCjKJCBFLOYRh8L4s{<-ravf>+_9yb z;vkM8Uhv>V{H?XpddOIj^y(zg9i|3>65EWQ$0s96@Q#RdSc7T50)|YZXX2_vW}CoI zh1`~Ysgi|d|G^CHD9OWrkili>LZ^v&;53Ldm%`Sy%m7^6r;ZS>nTSh*TV@r2aig#B zf3Fg5Tevh2_c^YN_>`rJW=}^=>K1VV7mAu50D?GHR+Cj z`x5bqUa&LSA*UPkIkri%HE`FV<;hjb!=PPNQJsnruVsMzp84~2aI<2>sXW>^wu5** zMi8N}*SHE#wFPs(E`SQO+3he}o@>LceVQeQW)dh?-MW9Xo-hkA>Javm%;(?6^h*= zto$*icPvS=@Ug@vUN(qJ2fuzLj{gU~62;#Hwn4-p3)}v;hr+K@6TU+1BL<{Q5O;w1 zs2860|Fd)Wf8vM2rQ{358)p9eNJ89i|4{}A>;M1f|K21FKB#M5P35Ne~Dwuz&>+5OgUC3W1;kWn(g<{x`wd% zRDs>#h4*3KU(cHq(glzE))iX=<^VX?0|1}V0>JCT{|$ns18=Xpt_?`%Di&7l zRz^;Z%HvS*=X0+XD#UyizZSz28(*#5!qNs$h7`8zc8#@Ovzln$u3lxWEH0*Rxx>W* z!ZAj*^w>CEA@4t{{5DZjtJDXn4?Cf;!5-Ef-%(9K$zlQn!}-95{S(c*jANnzy!E&p z_{B;_0U&>9FL0;J(g2_|{{YEVZ6SDI()}yA7Ylz=ZH1I3hpp;^+?Wo|jRA)e<#}jZpA@G_0itpSflT zHZ|fL2oNv{I|w%8E|#Wvi8QvL0Wb6ohSza+-*EjG-@x<{FD)V`q#Di3LPd?{J)UZ{ z-?qA4>YVV(1q4QD!%j(bk%wpa(vjwYFP-7gOkWdNcN9?Qel3xuH)oxHA&E=Hvn>qu z)CWT#!#jZHo15@Xj_Qk=4Frui^+NHXiuZZ$%p-zpzoU#LyiCeaVe9rSz6=9S#TUq? z^6G%~58+#ye);Th(fi>?=geKve)a!=4Et?n&QpKF5(NP?CS?}9y!q#poGy>$9o>fE zi9D(0_s2VOb5~E2Fni_t;IQ>J>dWTtztrB%sMOCCR6zB1!1OG}c{BmIb7#!@bz*ZM zV@qd2T$P5grM>Yv>Dws^TB(m$O8(!h@RvS%&v|2Li#- zM$GAg@xTtrFxl{daxL$L@U0u|;&hz>M@P9nm|E+2a}#-em6~zk1K8F9!wVE??qa)Y z1cd;vp{l`(olac%II?Eg49qgr2hF*~au@0$7XkehUu}os*i#19k9pmtT-Spg3n7o5$X?to)=&)i zGZ;SxatHfl`-76W8YN<}ndRXGoSb&H%i-Js;MG(+ZPn%3z0*i7b+9E;qvBV|S#xUR zu5tmNpq9>eJ-1(_;=M~2Xb7baHi4@o%RG84dvUtb$&3rihEH4VR~l*G2|NQVzYeB{ZA-C_{i&2=AYiQTExh& z4^I}O%6eX)i=M~5+FqyJB<9zxJuvLbmxk0=aDC;8vn&Ttl=#D_OCRwcYj5iP_OBX8 zM|)U98)GD%D6De1FIl!tNNi02NHw_{+vl4!b7 z*|{JB^hwO$#0s|XHPzrmN7>73cVnGkPt%=U8bV$SA-*+GXamt0Xt}!8*0P zQDtcj=OftBg&`3Wf?uG?qRSiDhh7}74*mH^P+eRKl_VNmz`|)MN^yS8R<9^tZ4!GE$trS{iNl=NS z8luA}tM!Z+xTgiE9fd6(FZ-k`epCC+0B|El+o6)^KrBP{`i2qsLKGyqUNpTKHhii| zES~PB7uMhIn^zW{@QYEB(~HTW5q;|KC_!Pm2{lA|>~(S#c_{%hWG)emjdYdm%63(d zHz2`GafoF=)vru93Fbg06_1FK14*67X7^$HEd>uEeDsdE!^hQsFqd(fs+H1x*mnqUuREme<6Z4g!<%_+^0nA3D+P(j z(yhjjSI>>QU8}kOwVtkv&esV3gtApqLD_l)v@DcwU>9`%Hle9DP^Z`lFGVg0W%1Pd zw7d`Co|(kMlv=s%5I}sfw1zAiu({BQ;#?8p((8_oC(c+&j%HIHwSdrY_0N3q#6Fkt zfaI+~MqsT6H}s;jFhp4{tgqaEy?Dwl5`9wS6=)Lt^Yh{IEWMHnMzgY*$C%K;1)|RNe_^elz@iMa1BJK~qW&k2Xj4~=Qh1nRA^(=~lh3C(9N-QO+K28G@Us9;z16I^y~lzQsJSCHQXgDF|( zOPZgT+voY<#JD3USYc=gD7^P_$C4s6c~Cq%xX(q-^CbOUj|4jTv)_PgD%>-Y3YX@M zKFyUzMAhoR=A{$Co}~7A(K}$HR$zN`b_H*diJ)0GxvIEowAfS&KIcvvtoN4%LRJb| z=|9#FGoYwob$7leNgVJCn!GVDcgE96(sN=wyCd{Cu(wA}MQ*Otl7QmqHTufzvRoJE zMW)-wUq^8o=FRMnocB-;XGkrUtHhXhjX|>8iu>!qa|8Jba^H6F#181|F~|mm)79M; z8AJYuz>nFP`cauae3vzy4mG3-QG1KcnRiB4qG&g-Sbtb)66||Eg$s?X`ggwFrPhkW zL=zS00ejVN9O|w0;2NUICVAMT%0qOS*_ZGbkco%Vc8#&VF%^4&y{QDA$%Krj__y>* zrcO-s@ZX%xtw*w%#P}u((FhH3M*R+u5%|ES;=Vp@XFBos_@F(vCf)3XmU~> zJs81-f71|3u$BlrCmGk*)dHcvD5bWV{_&5)IK^oF`Au5zMGvk}3s{C&DfZcb-v(YInGFtFAmYuU6hB1ljN+L5EB+0c%6(3J zuLcOcM4DUKITz!#V4weFegdI8L@CIW`Bo^-pZ|`LXu%W@?u@DBFFE^w{R)YP1=ZIb zS#eFHHHCWLFx&>{uc@@iqhDqFn{*%=#*(v^)Y80NXfiCs6_|cWb;Sd03UiM)ZBTd_ z8Y>av?we*MBRLTE0`s+Z(>Ht)G=^wCH2sz~j%X$`zk4^e<8$YjPfQKdoV8$#JC|cN z=+(Cu_%D^8x>8We1NST>8dlU#!F$2th4Q>B1(m^dz`{aOy_y>Mnhp8+i8O=Q&rg}5 zILLbCrnRS6qsbbL*0I!Ur~ZqI$K>L{5_hi9Z2mMJWc`~`A=DBNB49_OJypDaDT0bp zV^3%xDJ?>&v!gXa=6Gm!^jcDkU>=IY7QQ9Zeg>yQepFEkoh?|TV&SSxx4hP$qbmLz zRjJyHN27HjHSV+vnrzl+%|s{@E!aB`3#f6|a-E_wAwM_K9%D<-s3aA2%Q)=E^SWj0 z-hz9^lBf*-qT<%!SHk+<)`4fyb-X`Rb70OC*j6ekN^R9Ri&ZOb+|VTN#>q)^Fk=LL z&&4j@5BwK0{JdWB?Lqg>nH3-tVdyeKsVkbrVCK-k1K@|iwnKE%tT5;kq&vF=SkwZG zRT3WCzi99yQLYKyLZdjRgc~=}%I`pe5M}Cn)n-&;E*A)vh}V-fR1jmX6hwPq!M$p5 z&s5UDwx{@|s4%&;JS>&7R5bx=BTeZRjwZV`V$SVNU|nA)Ioh!9zZf4Kq^0!ilq&5Z zyVz4uRI_MrnybyR;)S>b6#4ckb3DL#5Or5%r*L;J__=P{2e#GGLiyE zsK;!n&o`;JL|CnDsBOQY4)IC?{ItJF?tsKaLqTEDox8&Y*5vel&feBBy z!MW{s$?O3Tq|5LV9=*-_%9`mJT?xI^HQ3q{_dKzR0C4U^d`D4V_AGYSk4WYwB#WRO ziSkbyxB*3N6}`T-FF@(R(s)l6F$&5AsZI4xD8U^e%6<4OeT<}aQYfX2sE1@Sy9q$U zo%oAn*CJA{BY3vxMu4O|1aV%*)q8dIl6u7xMSpd7w!CynZ|LBkE|W4lu;9Gw<|o@G zLZl(q)33N*4c4HAl6t$eW=c5O04z);WWufMt^69RnGkMYBnZ8rn3^tQ##`xwv+l%I zm10q~atM@(4gw+fx%I-tuhM-lr^=V9gjSW)eHzMU53c08UWTj0zG>e}S(i4vArG6K z^IPI_?96>$w_llji5ki{Tx9lk-x07_mr)}6dMo8v5>C0%gtr}{QAoBfb!alwnDohF zNu`i(0Nr-w=yBpi-<$SHhs3rWqaocH!nX%9@9V%x+=YTb=$dDzmCK!{t#QQ?`R8Q| z8D*)oDJW`>dXS+S8om?S*kar*hi5QL^L@Sf24p`@bXtk#M5 z{m=Rb&OuQdMc-|A2DUc8QYIGaMIF?|gFMD|V(0AeOnAH@S9$mDK(fj>-);BCSSdof zLkjgu9MpBV1hCOlYUNTi**g0%F8UyN#sg)@i6WHl#8r2g1iPYrDhbeAO7HFgtFNT= z;fb}(@gDxiqwheOg#;!%zJ_~ePJtm#jD5uT8z)&=5#x5G>fU50y9QGpO=~=!F4kNp zKM1r4;X4!3B6mGYmu<+KJ~2NFR-V_t?q+#fcL!ps=hf@YdF#QJ zoR@ebeaJTzLJ2PYH28X#w6wNe@)zrTO5CVQr$G4jNMBBcuEQENE!Z=DDC6$xPbmyd zobqdq`CBZUAERi*m`iMymEW~KbC*I+TOJIY*-%D9j~em#<4AcNI|6w9eiuU?bPERl zqlLMHjTeOjLB92uzpDzo(?!#o1QePquQ@)w?WnqLWV}IM?ok&PPc1O$o1P9(9L2sv zpx|i#pAY2DM*=QDV@nyjVW}6=PG=DpF*+$f&O_vcBG=ueIZ2O@WWPHPYm(O5kL!K5H?emZ67bCD320AS62V}y}&*y7#Yg5BY+l%kCSgf zsDMYy36c$qhxtmS#0jJVZ$kfiCVNX$*82P zf+vr(;k;2II)jOHIf#hVL3tc77a8ve0f_|A6uN~pRXj^qJA)j5mOF8WYBVnd%_BA< zV<*1Id?D`XoH>y{`=g^W4R^nSCA9a`m-rzy0A1K*j1 zq`8=BQn>jxE1Rd)W!`H8d@i__m}VW8_@aF`3Vuc!-Z(4WtA*yxS8X(U3r;#4cwQOX zaIXv7y9W3qt8|A4dPv-#tZziXA59>)M=F!G;L~~7mDB@LM6wKu;fs@P`O{ko0OL+X zz?ho6t!(#DjtnSq65o00rkx|TZ@{{_8|O~HSeA`b()emKv$3eZqn+&50G(vlXUHP0 z^V((&ecvOU|5g994GF*o1|J8_BdP4sw&Cl1>(kpZ;2aG)*w43Jly*nsi_x%8i!8 z@j%0-0XjR8jGR`@39!VFMJJK;fP=AAonvTu*h7w^is`mI>;`8$!Zei#GFl=VoKR%8 z58A}bMRhnAQW+ZgUL+N{m?~G#w*gg1Sy*%G5?QSPY!)#- zcpb9FXQ^Om^EzaX|4T&){u`A)H5GrBrISsH!C!?+dYbp>GK{H}qN*`p50+JSBueWu z*zx%IJa;06hOM=hHDA{QBXh2iTwrvKJ~M#gwCaI;Ta~jU7kmv=d{#<*os58uElR)< zp7t8LMMnj{{2Ai_j5Sr9jYy%$vQpgC1|QymbrzCfcKinbGw}f9LEKCmmQPkHtE>3{ zevSt#uV9c2%Cxk5$XbEKlhA8WNy!Ogca_>BMGvdvk=&V4=?Ste8ZHQANNy_Q%V$`89j{+UK(gzR zg01@B#fqd<1kvp4EG0`(lY<8Pk#5q(aLXgLoP*+Coyj$ z{jj7ods?#xGj2RxQK7?9WCUG`bK^G8agIB(Tas>U(K*sbs1d^NK+EN^rWS?nk6xrTR0#cryNX#KO2?Bnirgs3v&ButIR>G0V5C{-(KNZGSpMi}@T_<_ z;#V}sN0oIa4P%H)L(?H+v!BCL_mykl zUlFik6n}(eB1vxHZ0`2i9ptCyj6h@z_LlJN&K2J#PSGbHASOIV1ZM8UHrn|sq{(8% zIDChoihn&#UvgfKu~@4(acG`LV^VobG+C+zU(dttEUbp7392lqjJ63HL9(z5uE%aK zRg(mR#Y-78-i;8$2CO*mdgk^$7)eu*V&NUlolHb(l+R3M*4W!W?h_iYD8X_HY^#n0 z-`EU@a|tEc3!FdCYq$q7)&Qe}AhZRp!UISPq~RNIC}X%-Ei@Bm5`Y`R(QU9s87D)W zZj|I8P#+HmQ$`JrDB}!0PR<<14k)DZPE)H3iZ04f`0T*tr=u8QE~MKx#hhFMk2(bp zBWZh-vS>!sT3kWm_@c>Y2J^BL!R8pG4!tcE=jo3wLU7a-4A_PMnKXcfQ$~wNJ=S)c zHyELe$H1ODUaS z)8mHrCQkQeNv>MSY#dZO_fzaO8aZG8bU=zhEU3HR6{Nyz(7fg@M;=m2b6ST-iTT#| zE7i#aRrPOO^aw*&avPlD%3Fjq z6h5<(ctXvnW1!^#u-~r;fQ6bRDI{JSQg^4$EP>Zr$-rY3Z4W?bHq^k$!2p05O~0j= zWe!xxYY!a&0Ku8FXEhc81ZVq)Um!qMB6F8Y!Vyjgu#Zr@LOr)Z@6K5RHb&iu;bcLA z9;}UyXS{hH2H6&GhrzJnd40eqw*IaWY~eF?(OnDRSn!(l?M@5V0)S8Nt+eyify1JJ zjZux%_|PsHW0n}a*++abvuvz>ww=T)GZ;T@>7oYkmmwQG@+k!=0HN|3R7nlMx7|h} zq9v4Zs@e5Ysb&>|f{%}E{}mjI+e9=ruVHOqo+g4IG%#L{0$`yn_#Xruz~`F7tN;+a z!zXqdQWGNIO7=y+M3FZjU&T!K1MvUE{{jRhitqJMzV;IL6!M7?P(6Iyi#7zG`VZ0h B%boxL diff --git a/tests/python_tests/raster_colormapped_test.py b/tests/python_tests/raster_colormapped_test.py deleted file mode 100644 index de56346e0..000000000 --- a/tests/python_tests/raster_colormapped_test.py +++ /dev/null @@ -1,40 +0,0 @@ -#coding=utf8 -import os -import mapnik -from utilities import execution_path, run_all -from nose.tools import * - -def setup(): - # All of the paths used are relative, if we run the tests - # from another directory we need to chdir() - os.chdir(execution_path('.')) - -if 'gdal' in mapnik.DatasourceCache.plugin_names(): - - def test_vrt_rendering(): - m = mapnik.Map(512,512) - mapnik.load_map(m,'../data/good_maps/vrt_colortable.xml') - m.zoom_all() - im = mapnik.Image(512,512) - mapnik.render(m,im) - actual = '/tmp/vrt_colortable.png' - expected = 'images/support/vrt_colortable.png' - im.save(actual) - expected_im = mapnik.Image.open(expected) - eq_(im.tostring(),expected_im.tostring(), 'failed comparing actual (%s) and expected(%s)' % (actual,'tests/python_tests/'+ expected)) - - def test_tif_rendering_nodata(): - m = mapnik.Map(512,512) - mapnik.load_map(m,'../data/good_maps/tiff_colortable.xml') - m.zoom_all() - im = mapnik.Image(512,512) - mapnik.render(m,im) - actual = '/tmp/tif_colortable.png' - expected = 'images/support/tif_colortable.png' - im.save(actual) - expected_im = mapnik.Image.open(expected) - eq_(im.tostring(),expected_im.tostring(), 'failed comparing actual (%s) and expected(%s)' % (actual,'tests/python_tests/'+ expected)) - -if __name__ == "__main__": - setup() - run_all(eval(x) for x in dir() if x.startswith("test_")) diff --git a/tests/visual_tests/grids/vrt_colortable-256-256-1.0-grid-reference.json b/tests/visual_tests/grids/vrt_colortable-256-256-1.0-grid-reference.json new file mode 100644 index 000000000..e023c5e7e --- /dev/null +++ b/tests/visual_tests/grids/vrt_colortable-256-256-1.0-grid-reference.json @@ -0,0 +1,72 @@ +{ + "keys": [ + "" + ], + "data": {}, + "grid": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ] +} \ No newline at end of file diff --git a/tests/visual_tests/images/vrt_colortable-256-256-1.0-agg-reference.png b/tests/visual_tests/images/vrt_colortable-256-256-1.0-agg-reference.png new file mode 100644 index 0000000000000000000000000000000000000000..3fa463b515d559795eb9c46f2bb6c1892a709137 GIT binary patch literal 1863 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 2011_5km_vrt_nodata_style - ../raster/dataraster.vrt + ../../data/raster/dataraster.vrt gdal diff --git a/tests/visual_tests/test.py b/tests/visual_tests/test.py index 47ff731b1..846cb3888 100755 --- a/tests/visual_tests/test.py +++ b/tests/visual_tests/test.py @@ -176,6 +176,7 @@ files = { 'dst-over-compositing':{'sizes':[(512,512)]}, 'tiff_colortable':{'sizes':[(256,256)]}, 'tiff_colortable_custom_nodata':{'sizes':[(256,256)]}, + 'vrt_colortable':{'sizes':[(256,256)]}, } class Reporting: From 09544849b992690602069b00f85ddacf3b2c4477 Mon Sep 17 00:00:00 2001 From: Dane Springmeyer Date: Wed, 25 Sep 2013 14:08:47 -0700 Subject: [PATCH 2/8] move colorizer tests to visual suite --- tests/python_tests/raster_colorizer_test.py | 16 --- tests/python_tests/raster_symbolizer_test.py | 2 +- ..._colorizer-512-512-1.0-grid-reference.json | 136 ++++++++++++++++++ ...symbolizer-512-512-1.0-grid-reference.json | 136 ++++++++++++++++++ ...er_colorizer-512-512-1.0-agg-reference.png | Bin 0 -> 7787 bytes ...er_colorizer-512-512-2.0-agg-reference.png | Bin 0 -> 7787 bytes ...r_symbolizer-512-512-1.0-agg-reference.png | Bin 0 -> 19638 bytes ...r_symbolizer-512-512-2.0-agg-reference.png | Bin 0 -> 19638 bytes .../styles}/raster_colorizer.xml | 2 +- .../styles}/raster_symbolizer.xml | 2 +- tests/visual_tests/test.py | 2 + 11 files changed, 277 insertions(+), 19 deletions(-) create mode 100644 tests/visual_tests/grids/raster_colorizer-512-512-1.0-grid-reference.json create mode 100644 tests/visual_tests/grids/raster_symbolizer-512-512-1.0-grid-reference.json create mode 100644 tests/visual_tests/images/raster_colorizer-512-512-1.0-agg-reference.png create mode 100644 tests/visual_tests/images/raster_colorizer-512-512-2.0-agg-reference.png create mode 100644 tests/visual_tests/images/raster_symbolizer-512-512-1.0-agg-reference.png create mode 100644 tests/visual_tests/images/raster_symbolizer-512-512-2.0-agg-reference.png rename tests/{data/good_maps => visual_tests/styles}/raster_colorizer.xml (96%) rename tests/{data/good_maps => visual_tests/styles}/raster_symbolizer.xml (92%) diff --git a/tests/python_tests/raster_colorizer_test.py b/tests/python_tests/raster_colorizer_test.py index 3bdb50941..9b8778d3f 100644 --- a/tests/python_tests/raster_colorizer_test.py +++ b/tests/python_tests/raster_colorizer_test.py @@ -9,22 +9,6 @@ def setup(): # from another directory we need to chdir() os.chdir(execution_path('.')) -def test_gen_map(): - mapxmlfile = '../data/good_maps/raster_colorizer.xml' - mapxmloutputfile = 'raster_colorizer_test_save.xml' - outputfile = 'raster_colorizer_test.png' - - m = mapnik.Map(800, 600) - try: - mapnik.load_map(m, mapxmlfile) - mapnik.save_map(m, mapxmloutputfile) - m.zoom_all() - mapnik.render_to_file(m, outputfile) - except RuntimeError,e: - # only test datasources that we have installed - if not 'Could not create datasource' in str(e): - raise RuntimeError(str(e)) - #test discrete colorizer mode def test_get_color_discrete(): #setup diff --git a/tests/python_tests/raster_symbolizer_test.py b/tests/python_tests/raster_symbolizer_test.py index 826514af1..74ec4d990 100644 --- a/tests/python_tests/raster_symbolizer_test.py +++ b/tests/python_tests/raster_symbolizer_test.py @@ -90,7 +90,7 @@ def test_dataraster_query_point(): def test_load_save_map(): map = mapnik.Map(256,256) - in_map = "../data/good_maps/raster_symbolizer.xml" + in_map = "../visual_tests/styles/raster_symbolizer.xml" try: mapnik.load_map(map, in_map) diff --git a/tests/visual_tests/grids/raster_colorizer-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/raster_colorizer-512-512-1.0-grid-reference.json new file mode 100644 index 000000000..53162f357 --- /dev/null +++ b/tests/visual_tests/grids/raster_colorizer-512-512-1.0-grid-reference.json @@ -0,0 +1,136 @@ +{ + "keys": [ + "" + ], + "data": {}, + "grid": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ] +} \ No newline at end of file diff --git a/tests/visual_tests/grids/raster_symbolizer-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/raster_symbolizer-512-512-1.0-grid-reference.json new file mode 100644 index 000000000..53162f357 --- /dev/null +++ b/tests/visual_tests/grids/raster_symbolizer-512-512-1.0-grid-reference.json @@ -0,0 +1,136 @@ +{ + "keys": [ + "" + ], + "data": {}, + "grid": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ] +} \ No newline at end of file diff --git a/tests/visual_tests/images/raster_colorizer-512-512-1.0-agg-reference.png b/tests/visual_tests/images/raster_colorizer-512-512-1.0-agg-reference.png new file mode 100644 index 0000000000000000000000000000000000000000..dec77cf5d959264d5a09412165dbce1efbc88b59 GIT binary patch literal 7787 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 literal 0 HcmV?d00001 diff --git a/tests/visual_tests/images/raster_colorizer-512-512-2.0-agg-reference.png b/tests/visual_tests/images/raster_colorizer-512-512-2.0-agg-reference.png new file mode 100644 index 0000000000000000000000000000000000000000..dec77cf5d959264d5a09412165dbce1efbc88b59 GIT binary patch literal 7787 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 literal 0 HcmV?d00001 diff --git a/tests/visual_tests/images/raster_symbolizer-512-512-1.0-agg-reference.png b/tests/visual_tests/images/raster_symbolizer-512-512-1.0-agg-reference.png new file mode 100644 index 0000000000000000000000000000000000000000..a7c34dc229e4a85b0bf2a3a828deeee384851d74 GIT binary patch literal 19638 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 O$A+~$_s47e&-@!FLj DISCRETE RAINBOW - ../raster/dataraster.tif + ../../data/raster/dataraster.tif gdal 1 diff --git a/tests/data/good_maps/raster_symbolizer.xml b/tests/visual_tests/styles/raster_symbolizer.xml similarity index 92% rename from tests/data/good_maps/raster_symbolizer.xml rename to tests/visual_tests/styles/raster_symbolizer.xml index 429701ca5..14632b103 100644 --- a/tests/data/good_maps/raster_symbolizer.xml +++ b/tests/visual_tests/styles/raster_symbolizer.xml @@ -26,7 +26,7 @@ ramped - ../raster/dataraster.tif + ../../data/raster/dataraster.tif gdal 1 diff --git a/tests/visual_tests/test.py b/tests/visual_tests/test.py index 846cb3888..7140900d0 100755 --- a/tests/visual_tests/test.py +++ b/tests/visual_tests/test.py @@ -177,6 +177,8 @@ files = { 'tiff_colortable':{'sizes':[(256,256)]}, 'tiff_colortable_custom_nodata':{'sizes':[(256,256)]}, 'vrt_colortable':{'sizes':[(256,256)]}, + 'raster_colorizer':{'sizes':[(512,512)]}, + 'raster_symbolizer':{'sizes':[(512,512)]}, } class Reporting: From df3a455e19d31edf15b71213ca671361e7eb6461 Mon Sep 17 00:00:00 2001 From: Dane Springmeyer Date: Wed, 25 Sep 2013 14:37:21 -0700 Subject: [PATCH 3/8] refactor nodata related code dropping support for user-overide nodata where it does not make sense - refs #2023 --- include/mapnik/raster.hpp | 14 +++ include/mapnik/raster_colorizer.hpp | 1 - plugins/input/gdal/gdal_datasource.cpp | 2 + plugins/input/gdal/gdal_featureset.cpp | 156 ++++++++----------------- 4 files changed, 63 insertions(+), 110 deletions(-) diff --git a/include/mapnik/raster.hpp b/include/mapnik/raster.hpp index 4b1ce1cfb..b1069b7cc 100644 --- a/include/mapnik/raster.hpp +++ b/include/mapnik/raster.hpp @@ -28,6 +28,9 @@ #include #include + // boost +#include + namespace mapnik { class raster : private mapnik::noncopyable { @@ -35,11 +38,22 @@ public: box2d ext_; image_data_32 data_; bool premultiplied_alpha_; + boost::optional nodata_; raster(box2d const& ext, unsigned width, unsigned height, bool premultiplied_alpha = false) : ext_(ext), data_(width,height), premultiplied_alpha_(premultiplied_alpha) {} + + void set_nodata(double nodata) + { + nodata_ = nodata; + } + + boost::optional const& nodata() const + { + return nodata_; + } }; } diff --git a/include/mapnik/raster_colorizer.hpp b/include/mapnik/raster_colorizer.hpp index 76c09fd94..8a743e2d7 100644 --- a/include/mapnik/raster_colorizer.hpp +++ b/include/mapnik/raster_colorizer.hpp @@ -199,7 +199,6 @@ public: //! \brief Colorize a raster //! //! \param[in, out] raster A raster stored in float32 single channel format, which gets colorized in place. - //! \param[in] f The feature used to find 'NODATA' information if available void colorize(boost::shared_ptr const& raster, feature_impl const& f) const; diff --git a/plugins/input/gdal/gdal_datasource.cpp b/plugins/input/gdal/gdal_datasource.cpp index ceb6fc86d..29abdc5be 100644 --- a/plugins/input/gdal/gdal_datasource.cpp +++ b/plugins/input/gdal/gdal_datasource.cpp @@ -108,6 +108,8 @@ gdal_datasource::gdal_datasource(parameters const& params) nbands_ = dataset->GetRasterCount(); width_ = dataset->GetRasterXSize(); height_ = dataset->GetRasterYSize(); + desc_.add_descriptor(mapnik::attribute_descriptor("nodata", mapnik::Integer)); + desc_.add_descriptor(mapnik::attribute_descriptor("value", mapnik::Double,false,8)); double tr[6]; bool bbox_override = false; diff --git a/plugins/input/gdal/gdal_featureset.cpp b/plugins/input/gdal/gdal_featureset.cpp index b87555add..6052dc2f8 100644 --- a/plugins/input/gdal/gdal_featureset.cpp +++ b/plugins/input/gdal/gdal_featureset.cpp @@ -76,7 +76,7 @@ gdal_featureset::gdal_featureset(GDALDataset& dataset, first_(true) { ctx_->push("value"); - ctx_->push("NODATA"); + ctx_->push("nodata"); } gdal_featureset::~gdal_featureset() @@ -115,7 +115,8 @@ feature_ptr gdal_featureset::next() feature_ptr gdal_featureset::get_feature(mapnik::query const& q) { feature_ptr feature = feature_factory::create(ctx_,1); - + int raster_has_nodata = 0; + double raster_nodata = 0; GDALRasterBand * red = 0; GDALRasterBand * green = 0; GDALRasterBand * blue = 0; @@ -229,91 +230,60 @@ feature_ptr gdal_featureset::get_feature(mapnik::query const& q) { throw datasource_exception((boost::format("GDAL Plugin: '%d' is an invalid band, dataset only has '%d' bands\n") % band_ % nbands_).str()); } - float* imageData = (float*)image.getBytes(); GDALRasterBand * band = dataset_.GetRasterBand(band_); - int hasNoData(0); - double nodata(0); - if (nodata_value_) - { - hasNoData = 1; - nodata = *nodata_value_; - } - else - { - nodata = band->GetNoDataValue(&hasNoData); - } + raster_nodata = band->GetNoDataValue(&raster_has_nodata); band->RasterIO(GF_Read, x_off, y_off, width, height, imageData, image.width(), image.height(), GDT_Float32, 0, 0); - - if (hasNoData) - { - feature->put("NODATA",nodata); - } } else // working with all bands { for (int i = 0; i < nbands_; ++i) { GDALRasterBand * band = dataset_.GetRasterBand(i + 1); - #ifdef MAPNIK_LOG get_overview_meta(band); #endif - GDALColorInterp color_interp = band->GetColorInterpretation(); switch (color_interp) { case GCI_RedBand: red = band; - MAPNIK_LOG_DEBUG(gdal) << "gdal_featureset: Found red band"; - break; case GCI_GreenBand: green = band; - MAPNIK_LOG_DEBUG(gdal) << "gdal_featureset: Found green band"; - break; case GCI_BlueBand: blue = band; - MAPNIK_LOG_DEBUG(gdal) << "gdal_featureset: Found blue band"; - break; case GCI_AlphaBand: alpha = band; - MAPNIK_LOG_DEBUG(gdal) << "gdal_featureset: Found alpha band"; - break; case GCI_GrayIndex: grey = band; - MAPNIK_LOG_DEBUG(gdal) << "gdal_featureset: Found gray band"; - break; case GCI_PaletteIndex: { grey = band; #ifdef MAPNIK_LOG MAPNIK_LOG_DEBUG(gdal) << "gdal_featureset: Found gray band, and colortable..."; - GDALColorTable *color_table = band->GetColorTable(); if (color_table) { int count = color_table->GetColorEntryCount(); - MAPNIK_LOG_DEBUG(gdal) << "gdal_featureset: Color Table count=" << count; for (int j = 0; j < count; j++) { const GDALColorEntry *ce = color_table->GetColorEntry (j); if (! ce) continue; - MAPNIK_LOG_DEBUG(gdal) << "gdal_featureset: Color entry RGB=" << ce->c1 << "," <c2 << "," << ce->c3; } } @@ -322,50 +292,33 @@ feature_ptr gdal_featureset::get_feature(mapnik::query const& q) } case GCI_Undefined: MAPNIK_LOG_DEBUG(gdal) << "gdal_featureset: Found undefined band (assumming gray band)"; - grey = band; break; default: MAPNIK_LOG_WARN(gdal) << "gdal_featureset: Band type unknown!"; - break; } } - if (red && green && blue) { MAPNIK_LOG_DEBUG(gdal) << "gdal_featureset: Processing rgb bands..."; - - int hasNoData = 0; - double nodata = 0.0; - if (nodata_value_) - { - hasNoData = 1; - nodata = *nodata_value_; - } - else - { - nodata = red->GetNoDataValue(&hasNoData); - } - if (hasNoData) - { - feature->put("NODATA",nodata); - } + raster_nodata = red->GetNoDataValue(&raster_has_nodata); GDALColorTable *color_table = red->GetColorTable(); - - if (! alpha && hasNoData && ! color_table) + if (!alpha && raster_has_nodata && !color_table) { - // first read the data in and create an alpha channel from the nodata values + // read the data in and create an alpha channel from the nodata values + // NOTE: we intentionally ignore user supplied nodata value since it only + // works for grayscale images or a single band (as a double) + // TODO - we assume here the nodata value for the red band applies to all band + // but that may not always be the case: http://trac.osgeo.org/gdal/ticket/2734 float* imageData = (float*)image.getBytes(); red->RasterIO(GF_Read, x_off, y_off, width, height, imageData, image.width(), image.height(), GDT_Float32, 0, 0); - int len = image.width() * image.height(); - for (int i = 0; i < len; ++i) { - if (nodata == imageData[i]) + if (std::fabs(raster_nodata - imageData[i]) < 1e-12) { *reinterpret_cast(&imageData[i]) = 0; } @@ -374,9 +327,7 @@ feature_ptr gdal_featureset::get_feature(mapnik::query const& q) *reinterpret_cast(&imageData[i]) = 0xFFFFFFFF; } } - } - red->RasterIO(GF_Read, x_off, y_off, width, height, image.getBytes() + 0, image.width(), image.height(), GDT_Byte, 4, 4 * image.width()); green->RasterIO(GF_Read, x_off, y_off, width, height, image.getBytes() + 1, @@ -387,46 +338,31 @@ feature_ptr gdal_featureset::get_feature(mapnik::query const& q) else if (grey) { MAPNIK_LOG_DEBUG(gdal) << "gdal_featureset: Processing gray band..."; - - int hasNoData(0); - double nodata(0); - if (nodata_value_) - { - hasNoData = 1; - nodata = *nodata_value_; - } - else - { - nodata = grey->GetNoDataValue(&hasNoData); - } + raster_nodata = grey->GetNoDataValue(&raster_has_nodata); GDALColorTable* color_table = grey->GetColorTable(); - - if (hasNoData && ! color_table) + bool has_nodata = nodata_value_ || raster_has_nodata; + if (!color_table && has_nodata) { - MAPNIK_LOG_DEBUG(gdal) << "gdal_featureset: No data value for layer=" << nodata; - - feature->put("NODATA",nodata); + double apply_nodata = nodata_value_ ? *nodata_value_ : raster_nodata; + MAPNIK_LOG_DEBUG(gdal) << "gdal_featureset: applying nodata value for layer=" << apply_nodata; // first read the data in and create an alpha channel from the nodata values float* imageData = (float*)image.getBytes(); grey->RasterIO(GF_Read, x_off, y_off, width, height, imageData, image.width(), image.height(), GDT_Float32, 0, 0); - int len = image.width() * image.height(); - for (int i = 0; i < len; ++i) { - if (nodata == imageData[i]) + if (std::fabs(apply_nodata - imageData[i]) < 1e-12) { *reinterpret_cast(&imageData[i]) = 0; } else { - *reinterpret_cast (&imageData[i]) = 0xFFFFFFFF; + *reinterpret_cast(&imageData[i]) = 0xFFFFFFFF; } } } - grey->RasterIO(GF_Read, x_off, y_off, width, height, image.getBytes() + 0, image.width(), image.height(), GDT_Byte, 4, 4 * image.width()); grey->RasterIO(GF_Read,x_off, y_off, width, height, image.getBytes() + 1, @@ -436,38 +372,23 @@ feature_ptr gdal_featureset::get_feature(mapnik::query const& q) if (color_table) { - MAPNIK_LOG_DEBUG(gdal) << "gdal_featureset: Loading colour table..."; - - unsigned nodata_value = static_cast(std::floor(nodata+.5)); // FIXME: is it realy unsigned ? - if (hasNoData) - { - feature->put("NODATA",static_cast(nodata_value)); - } + MAPNIK_LOG_DEBUG(gdal) << "gdal_featureset: Loading color table..."; for (unsigned y = 0; y < image.height(); ++y) { unsigned int* row = image.getRow(y); for (unsigned x = 0; x < image.width(); ++x) { unsigned value = row[x] & 0xff; - if (hasNoData && (value == nodata_value)) + const GDALColorEntry *ce = color_table->GetColorEntry(value); + if (ce) { - // make no data fully alpha - row[x] = 0; + row[x] = (ce->c4 << 24)| (ce->c3 << 16) | (ce->c2 << 8) | (ce->c1) ; } else { - const GDALColorEntry *ce = color_table->GetColorEntry(value); - if (ce) - { - // TODO - big endian support - row[x] = (ce->c4 << 24)| (ce->c3 << 16) | (ce->c2 << 8) | (ce->c1) ; - } - else - { - // make lacking color entry fully alpha - // note - gdal_translate makes black - row[x] = 0; - } + // make lacking color entry fully alpha + // note - gdal_translate makes black + row[x] = 0; } } } @@ -476,11 +397,28 @@ feature_ptr gdal_featureset::get_feature(mapnik::query const& q) if (alpha) { MAPNIK_LOG_DEBUG(gdal) << "gdal_featureset: processing alpha band..."; - + if (raster_has_nodata) + { + MAPNIK_LOG_ERROR(gdal) << "warning: alpha channel being used instead of nodata value"; + } alpha->RasterIO(GF_Read, x_off, y_off, width, height, image.getBytes() + 3, image.width(), image.height(), GDT_Byte, 4, 4 * image.width()); } } + // set nodata value to be used in raster colorizer + if (nodata_value_) + { + raster->set_nodata(*nodata_value_); + } + else + { + raster->set_nodata(raster_nodata); + } + // report actual/original source nodata in feature attributes + if (raster_has_nodata) + { + feature->put("nodata",raster_nodata); + } return feature; } } @@ -514,12 +452,12 @@ feature_ptr gdal_featureset::get_feature_at_point(mapnik::coord2d const& pt) MAPNIK_LOG_DEBUG(gdal) << "gdal_featureset: x=" << x << " y=" << y; GDALRasterBand* band = dataset_.GetRasterBand(band_); - int hasNoData; - double nodata = band->GetNoDataValue(&hasNoData); + int raster_has_nodata; + double nodata = band->GetNoDataValue(&raster_has_nodata); double value; band->RasterIO(GF_Read, x, y, 1, 1, &value, 1, 1, GDT_Float64, 0, 0); - if (! hasNoData || value != nodata) + if (! raster_has_nodata || value != nodata) { // construct feature feature_ptr feature = feature_factory::create(ctx_,1); From 7aeff3fb5982133370715398d0f19a9e7093394e Mon Sep 17 00:00:00 2001 From: Dane Springmeyer Date: Wed, 25 Sep 2013 14:38:07 -0700 Subject: [PATCH 4/8] followup nodata refactor - refs #2023 --- src/raster_colorizer.cpp | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/src/raster_colorizer.cpp b/src/raster_colorizer.cpp index fbacb1212..dd1dd126a 100644 --- a/src/raster_colorizer.cpp +++ b/src/raster_colorizer.cpp @@ -127,25 +127,19 @@ void raster_colorizer::colorize(raster_ptr const& raster, feature_impl const& f) unsigned *imageData = raster->data_.getData(); int len = raster->data_.width() * raster->data_.height(); - - bool hasNoData = false; - float noDataValue = 0; - - //std::map::const_iterator fi = Props.find("NODATA"); - if (f.has_key("NODATA")) - { - hasNoData = true; - noDataValue = static_cast(f.get("NODATA").to_double()); - } - + boost::optional const& nodata = raster->nodata(); for (int i=0; i (&imageData[i]); - if (hasNoData && noDataValue == value) - imageData[i] = color(0,0,0,0).rgba(); + if (nodata && (std::fabs(value - *nodata) < epsilon_)) + { + imageData[i] = 0; + } else + { imageData[i] = get_color(value).rgba(); + } } } From 8e047aa98ee462793e04fcfd8e14aca1bc754f92 Mon Sep 17 00:00:00 2001 From: Dane Springmeyer Date: Wed, 25 Sep 2013 14:58:32 -0700 Subject: [PATCH 5/8] raster_colorizer: avoid color copy by return unsigned from get_color --- include/mapnik/raster_colorizer.hpp | 2 +- src/raster_colorizer.cpp | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/include/mapnik/raster_colorizer.hpp b/include/mapnik/raster_colorizer.hpp index 8a743e2d7..d7dbf65ad 100644 --- a/include/mapnik/raster_colorizer.hpp +++ b/include/mapnik/raster_colorizer.hpp @@ -206,7 +206,7 @@ public: //! //! \param[in] value Input value //! \return color associated with the value - color get_color(float value) const; + unsigned get_color(float value) const; //! \brief Set the epsilon value for exact mode diff --git a/src/raster_colorizer.cpp b/src/raster_colorizer.cpp index dd1dd126a..6bc0c052b 100644 --- a/src/raster_colorizer.cpp +++ b/src/raster_colorizer.cpp @@ -138,7 +138,7 @@ void raster_colorizer::colorize(raster_ptr const& raster, feature_impl const& f) } else { - imageData[i] = get_color(value).rgba(); + imageData[i] = get_color(value); } } } @@ -148,14 +148,14 @@ inline unsigned interpolate(unsigned start, unsigned end, float fraction) return static_cast(fraction * ((float)end - (float)start) + start); } -color raster_colorizer::get_color(float value) const +unsigned raster_colorizer::get_color(float value) const { int stopCount = stops_.size(); //use default color if no stops if(stopCount == 0) { - return default_color_; + return default_color_.rgba(); } //1 - Find the stop that the value is in @@ -278,7 +278,7 @@ color raster_colorizer::get_color(float value) const MAPNIK_LOG_DEBUG(raster_colorizer) << "\toutputColor: " << outputColor.to_string(); */ - return outputColor; + return outputColor.rgba(); } From feaddaeed0431fc45dee8f1edef9cba9532e3ece Mon Sep 17 00:00:00 2001 From: Dane Springmeyer Date: Wed, 25 Sep 2013 15:22:57 -0700 Subject: [PATCH 6/8] fix raster colorizer via python --- bindings/python/mapnik_raster_colorizer.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/bindings/python/mapnik_raster_colorizer.cpp b/bindings/python/mapnik_raster_colorizer.cpp index 7d9d6b755..758d19dd2 100644 --- a/bindings/python/mapnik_raster_colorizer.cpp +++ b/bindings/python/mapnik_raster_colorizer.cpp @@ -60,6 +60,15 @@ void add_stop5(raster_colorizer_ptr &rc, float v, colorizer_mode_enum m, color c colorizer_stop stop(v, m, c); rc->add_stop(stop); } +mapnik::color get_color(raster_colorizer_ptr &rc, float value) { + unsigned rgba = rc->get_color(value); + unsigned r = (rgba & 0xff); + unsigned g = (rgba >> 8 ) & 0xff; + unsigned b = (rgba >> 16) & 0xff; + unsigned a = (rgba >> 24) & 0xff; + return mapnik::color(r,g,b,a); +} + colorizer_stops const& get_stops(raster_colorizer_ptr & rc) { return rc->get_stops(); @@ -142,7 +151,7 @@ void export_raster_colorizer() ">>> colorizer = mapnik.RasterColorizer(mapnik.COLORIZER_LINEAR, default_color)\n" ">>> colorizer.add_stop(100, mapnik.COLORIZER_DISCRETE, mapnik.Color(\"#112233\"))\n" ) - .def("get_color", &raster_colorizer::get_color, + .def("get_color", get_color, "Get the color assigned to a certain value in raster data.\n" "\n" "Usage:\n" From 226e5b2d7a5fa56072cb90ea9a6ba01f55283bca Mon Sep 17 00:00:00 2001 From: Dane Springmeyer Date: Wed, 25 Sep 2013 15:24:08 -0700 Subject: [PATCH 7/8] no need to set 'value' attribute on rasters except for point query --- plugins/input/gdal/gdal_datasource.cpp | 1 - plugins/input/gdal/gdal_featureset.cpp | 8 +++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/plugins/input/gdal/gdal_datasource.cpp b/plugins/input/gdal/gdal_datasource.cpp index 29abdc5be..3cb238974 100644 --- a/plugins/input/gdal/gdal_datasource.cpp +++ b/plugins/input/gdal/gdal_datasource.cpp @@ -109,7 +109,6 @@ gdal_datasource::gdal_datasource(parameters const& params) width_ = dataset->GetRasterXSize(); height_ = dataset->GetRasterYSize(); desc_.add_descriptor(mapnik::attribute_descriptor("nodata", mapnik::Integer)); - desc_.add_descriptor(mapnik::attribute_descriptor("value", mapnik::Double,false,8)); double tr[6]; bool bbox_override = false; diff --git a/plugins/input/gdal/gdal_featureset.cpp b/plugins/input/gdal/gdal_featureset.cpp index 6052dc2f8..5c22eddcb 100644 --- a/plugins/input/gdal/gdal_featureset.cpp +++ b/plugins/input/gdal/gdal_featureset.cpp @@ -75,7 +75,6 @@ gdal_featureset::gdal_featureset(GDALDataset& dataset, nodata_value_(nodata), first_(true) { - ctx_->push("value"); ctx_->push("nodata"); } @@ -456,7 +455,6 @@ feature_ptr gdal_featureset::get_feature_at_point(mapnik::coord2d const& pt) double nodata = band->GetNoDataValue(&raster_has_nodata); double value; band->RasterIO(GF_Read, x, y, 1, 1, &value, 1, 1, GDT_Float64, 0, 0); - if (! raster_has_nodata || value != nodata) { // construct feature @@ -464,7 +462,11 @@ feature_ptr gdal_featureset::get_feature_at_point(mapnik::coord2d const& pt) geometry_type * point = new geometry_type(mapnik::Point); point->move_to(pt.x, pt.y); feature->add_geometry(point); - feature->put("value",value); + feature->put_new("value",value); + if (raster_has_nodata) + { + feature->put_new("nodata",nodata); + } return feature; } } From 843fdc087189e5af44471b1f8ae69135fd3249e4 Mon Sep 17 00:00:00 2001 From: Dane Springmeyer Date: Wed, 25 Sep 2013 15:33:10 -0700 Subject: [PATCH 8/8] stub in colorize-alpha filter output to avoid crash - refs #2021 --- include/mapnik/image_filter_types.hpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/include/mapnik/image_filter_types.hpp b/include/mapnik/image_filter_types.hpp index 2b399f6a7..c3f0d54e9 100644 --- a/include/mapnik/image_filter_types.hpp +++ b/include/mapnik/image_filter_types.hpp @@ -203,6 +203,13 @@ inline std::ostream& operator<< (std::ostream& os, invert) return os; } +inline std::ostream& operator<< (std::ostream& os, colorize_alpha const& filter) +{ + os << "colorize-alpha(TODO)"; + return os; +} + + template struct to_string_visitor : boost::static_visitor {