From 0ed7f76ad07c5f35b15719250e888f09a6c31c6e Mon Sep 17 00:00:00 2001 From: Frederic Junod Date: Thu, 15 Nov 2018 17:09:19 +0100 Subject: [PATCH] Port polygon-style rendering test --- .../expected.png | Bin 0 -> 3872 bytes .../polygon-style-gradient-pattern/main.js | 84 +++++ rendering/cases/polygon-style/expected.png | Bin 0 -> 2481 bytes rendering/cases/polygon-style/main.js | 100 +++++ .../polygon-fill-and-strokes-canvas.png | Bin 517 -> 0 bytes .../polygon-fill-and-strokes-webgl.png | Bin 458 -> 0 bytes .../polygon-pattern-gradient-canvas.png | Bin 1700 -> 0 bytes .../expected/polygon-types-canvas-stroke.png | Bin 628 -> 0 bytes .../style/expected/polygon-types-canvas.png | Bin 276 -> 0 bytes .../expected/polygon-types-webgl-stroke.png | Bin 780 -> 0 bytes .../ol/style/expected/polygon-types-webgl.png | Bin 276 -> 0 bytes .../style/expected/polygon-zindex-canvas.png | Bin 300 -> 0 bytes .../style/expected/polygon-zindex-webgl.png | Bin 300 -> 0 bytes test/rendering/ol/style/polygon.test.js | 344 ------------------ 14 files changed, 184 insertions(+), 344 deletions(-) create mode 100644 rendering/cases/polygon-style-gradient-pattern/expected.png create mode 100644 rendering/cases/polygon-style-gradient-pattern/main.js create mode 100644 rendering/cases/polygon-style/expected.png create mode 100644 rendering/cases/polygon-style/main.js delete mode 100644 test/rendering/ol/style/expected/polygon-fill-and-strokes-canvas.png delete mode 100644 test/rendering/ol/style/expected/polygon-fill-and-strokes-webgl.png delete mode 100644 test/rendering/ol/style/expected/polygon-pattern-gradient-canvas.png delete mode 100644 test/rendering/ol/style/expected/polygon-types-canvas-stroke.png delete mode 100644 test/rendering/ol/style/expected/polygon-types-canvas.png delete mode 100644 test/rendering/ol/style/expected/polygon-types-webgl-stroke.png delete mode 100644 test/rendering/ol/style/expected/polygon-types-webgl.png delete mode 100644 test/rendering/ol/style/expected/polygon-zindex-canvas.png delete mode 100644 test/rendering/ol/style/expected/polygon-zindex-webgl.png delete mode 100644 test/rendering/ol/style/polygon.test.js diff --git a/rendering/cases/polygon-style-gradient-pattern/expected.png b/rendering/cases/polygon-style-gradient-pattern/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..c79f9e507f26dc5f4ed51c833a38d90a8ddb00c8 GIT binary patch literal 3872 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 M4q#m?o$;st1@HM0F#rGn literal 0 HcmV?d00001 diff --git a/rendering/cases/polygon-style/main.js b/rendering/cases/polygon-style/main.js new file mode 100644 index 0000000000..1e85099865 --- /dev/null +++ b/rendering/cases/polygon-style/main.js @@ -0,0 +1,100 @@ +import Map from '../../../src/ol/Map.js'; +import View from '../../../src/ol/View.js'; +import Feature from '../../../src/ol/Feature.js'; +import Polygon from '../../../src/ol/geom/Polygon.js'; +import VectorLayer from '../../../src/ol/layer/Vector.js'; +import VectorSource from '../../../src/ol/source/Vector.js'; +import Style from '../../../src/ol/style/Style.js'; +import Fill from '../../../src/ol/style/Fill.js'; +import Stroke from '../../../src/ol/style/Stroke.js'; + +const vectorSource = new VectorSource(); +let feature; + +// rectangle with 1 hole +feature = new Feature({ + geometry: new Polygon([ + [[-102.5, 75], [-102.5, 115], [-42.5, 115], [-42.5, 75], [-102.5, 75]], + [[-82.5, 87], [-62.5, 87], [-62.5, 103], [-82.5, 103], [-82.5, 87]] + ]) +}); + +feature.setStyle(new Style({ + stroke: new Stroke({ + width: 4, + color: '#000', + lineJoin: 'round', + lineCap: 'butt' + }) +})); +vectorSource.addFeature(feature); + +// rectangle with 2 holes +feature = new Feature({ + geometry: new Polygon([ + [[-117.5, 47.5], [-117.5, 97.5], [-47.5, 97.5], [-47.5, 47.5], [-117.5, 47.5]], + [[-113.5, 51.5], [-101.5, 51.5], [-101.5, 63.5], [-113.5, 63.5], [-113.5, 51.5]], + [[-67.5, 51.5], [-53.5, 51.5], [-53.5, 63.5], [-67.5, 63.5], [-67.5, 51.5]] + ]) +}); + +feature.setStyle(new Style({ + zIndex: -1, + fill: new Fill({ + color: '#1A5E42' + }), + stroke: new Stroke({ + color: '#9696EB', + width: 3 + }) +})); +vectorSource.addFeature(feature); + + +// rectangle with 1 hole +feature = new Feature({ + geometry: new Polygon([ + [[-22.5, -5], [-22.5, 35], [37.5, 35], [37.5, -5], [-22.5, -5]], + [[-2.5, 7], [17.5, 7], [17.5, 23], [-2.5, 23], [-2.5, 7]] + ]) +}); +feature.setStyle(new Style({ + stroke: new Stroke({ + width: 3, + color: '#777', + lineDash: [2, 4] + }) +})); +vectorSource.addFeature(feature); + +// rectangle with 2 holes +feature = new Feature({ + geometry: new Polygon([ + [[-37.5, -32.5], [-37.5, 17.5], [32.5, 17.5], [32.5, -32.5], [-37.5, -32.5]], + [[-33.5, -28.5], [-21.5, -28.5], [-21.5, -16.5], [-33.5, -16.5], [-33.5, -28.5]], + [[12.5, -28.5], [26.5, -28.5], [26.5, -16.5], [12.5, -16.5], [12.5, -28.5]] + ]) +}); +feature.setStyle(new Style({ + fill: new Fill({ + color: 'rgba(255, 0, 0, 0.85)' + }) +})); +vectorSource.addFeature(feature); + + +new Map({ + pixelRatio: 1, + layers: [ + new VectorLayer({ + source: vectorSource + }) + ], + target: 'map', + view: new View({ + center: [0, 0], + resolution: 1 + }) +}); + +render(); diff --git a/test/rendering/ol/style/expected/polygon-fill-and-strokes-canvas.png b/test/rendering/ol/style/expected/polygon-fill-and-strokes-canvas.png deleted file mode 100644 index b1b5d9d4d0ecc2a681120c79310705e5b63d8f67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 517 zcmV+g0{Z=lP)FvI2O5}Ct=z=yj zFNBEhku0Po6_FkhX#vEKUm7~(8INC2IW;|kSDsq72V&GYVmfxi?5xfa4b1mqy@|pO8mvx|N;R}(pGMN@mZYuH(Z9CjT3ZNDj00000NkvXX Hu0mjfP5JF2 diff --git a/test/rendering/ol/style/expected/polygon-fill-and-strokes-webgl.png b/test/rendering/ol/style/expected/polygon-fill-and-strokes-webgl.png deleted file mode 100644 index da2f9000f4ab0a470201e5c6d6b6ec8024ebe752..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 458 zcmV;*0X6=KP)>%% zQXyPw*LEUgz07y-{NCNWIN>akheyJLfrxD{dnN=q z7w+{s^TLWm!o`ivL6*hrzLdtv(E=uuSopJ9RZPmEkZ|> zn6=q4S{N-|0eA!+3FwQTP#7(Y7Dj8i0`Let0*}BWngV}*v*Q{c&@WiOQLf*B6XFf! z^*hMBdO!dtA_42S3T6DK+UjXMih+oSc#Wif1ATM9LW;T0ivR!s07*qoM6N<$f+ao7 A!TCa~U;ff?%<73i+H-L1JBYrD0*YIc+6HraW7`aS1& z&i8jF=qHcpCmi%&5OqCw;-r8Z!1!@@z!5jpxjWyr9&qCXXFj;{z%>z^dC=y9BS0OU z?^;N4x8lNs3wPk-#6ue1XeL9ojJ&(2id_^@%ejjjcHrs?p#izCLam}h=x;^1K++)c zJKs`1c%{JLgAm#~Rq-OB;6gzPz$m0f2ZBJ%t)y~icbKjqPa`v&N~CK+6n|F;4a%(* z)CO;a2`XZMNp*X>Kxj}gfGnt_a$9(ia%6I-3@WnqvsvDbB&$st($ru{J%8?$|F4!m za@InMC7I--!NFbPQZ6ts3HuZa!e$usRvCFouVSRrfQf1>Eg4ieJiSvHNdycAMq2m4Y{w+X}| z8Mz}eh(Qq}h!x-2o7w*s;M>T?upsd$TSnRT6jJ61L~!cw8pD`5^O^4t6(K^dk#7#> z|17V4+@WH%XY$AH!8HD&qBd?~)0SXk%UQluAac%F;&_ymk>{$Yp9q9S@8>(9 zR7SoWF3fe0TK}w(nqx!vZj?*+87p7r@|G=ZX*5i&QNV(pI*6vMj64JF zXiOyWw&!@RxwjDixgu3mjqu|?0626dlmrqcRZwxdFA&#)81@lujl8yUMzsY?uhxi) z>g-EdJNC>BG9DC&f%>4Etyl|JvFf+JLWEVs%&27{DJ7HZAF^NxLR_$7oxF-w_0d3t zRYcoI)~tPekc!3b;MAT-`^Y)6i+Wdf*ey4bGiHX zB)&%!HE|p@$1-ResreBJ#h-@vUKx2uJRriZk@zik)s~8Prwe6<4xvgY3ty$|8cz`m zR7geQb3{=sNPLp2c;^Nkq7!Ashb-I_%b$M#aPF5VF4?(CK7 z8`Sb>(6c-7RQ<+HtIdE2yGCLRpZhf>Sc>^xg%+I0Led|8EL zieC9_^FR!WL|W|9S|%vCzQ>i9tml5~aTZM>J-ydH+dPnN4lz^~W#)&Bt~qSsFmipm{?K$*|Lj{_Q5)YueOPj z&ld;svj3YWY&QPoH&-~`*#1(+=#t-Ufg7tPuGT6{mrIC?&yMG>5Yi!j@bygJ*n;1a zZk<{$^gBda$G)(Hd6Q@i18= uh`ZSk&yLJ)tN;E}joH7PS?%{5Mg9g-djDXX!@T7H0000AQBQ#GGtZtfR=DoGWovtp zVBPXrtNlIe3oX)~-T39pUUq%Q>+hOUrGM>Q7q7d&JmbvQ-y(&7^Hw07hH&ktrqc=n z#vDg@m<*d8&H$M?%$A${E7RgHY+Qfx#}=L^H*3Ah;xFu7U-{&+-h@|nPuJHrp5FIt zp8swKk>69?e={wwJ*zvvtWjg%W%;+Ak!!an-Rsz(7&HS2ur=VE%spi?{a!xs$fvXJlY_;QNE|;h*Hfo|CN3z=Xlz M>FVdQ&MBb@0GCWDdjJ3c diff --git a/test/rendering/ol/style/expected/polygon-types-canvas.png b/test/rendering/ol/style/expected/polygon-types-canvas.png deleted file mode 100644 index 4abfccb058171eacee2eb2426f37ed59671ecfd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 276 zcmV+v0qg#WP)jET03=7jv!=$$8BLRIF|AY>&Y>b8>VYQJkGZCafLN7POI ztImEPx(C1Q96`wZe2{VsT5g19{m963GdthdZl`brN8C)k`hgZ`f!6s3$Osup&d7{U z$1BVk`=9+S89|7E8IG*{X?!yZT4`tr^ITqHd1_rgrEr5SAwvJS66v2&+|+}C5R&Fn a8Al!(wt6$}x+3=g0000-z=CDS_zx_|=l|A9B zy=vop+Ryast@0~b8M$@e1c{c4k5BJ!Klv|Qj``<~Dx-ZL-97k!>83yuBO$?h43r_Mi znZd8<*l_b9$4ND*Gwl-;4!kL7NfG9KHd$O~&i$8%FPFbst}eyWfRJ$Z5J)JqaN5+# z_E}Md!@&BE?h~^O-`%IZQCeH`r}(1Mm72d>oW#y)&HbcZ|H}H#+v+~1kQNj3q?-ko zodg1(J(*V#d}g9<3kRp8+u9!0-M_brD{{P4R50U`Z4xkKN_u)hkwZ{fAM2rkNcJ?EpcuCzeGlnBU4GijHh3x#fIa<(tUe{mRKK&zVohe_QqfCpVLi)k9k(U zo?ay~+E!)tBheF%K98<*kH7wMZhdrn1-H|QE{76Ux5t7_ z0@=JivCk)(wyxFVP%O<^Zls*T6&)+!G$&{6*`-sD{od9g(Ea4ImD4C#Oc(9bEjET03=7jv!=$$8BLRIF|AY>&Y>b8>VYQJkGZCafLN7POI ztImEPx(C1Q96`wZe2{VsT5g19{m963GdthdZl`brN8C)k`hgZ`f!6s3$Osup&d7{U z$1BVk`=9+S89|7E8IG*{X?!yZT4`tr^ITqHd1_rgrEr5SAwvJS66v2&+|+}C5R&Fn a8Al!(wt6$}x+3=g0000%hAsNnZXKds>WFX=)mv_ZP z2PNeT7nIl%#nKW5w4QmWOjvP~!AdIW=rcWz+PJLyPROmUHzh~u z`qMWLeQFAK`peyTz$S4rp~b_s{(pRS?zY!mHOHpk>r;Qt7~sRAENLNdl0|s;);6E> z->qNg*4ur_zr7{*|3}6Eog*I0mMaDszgd``aw6vX+BNJ4!rNq(AJ30nFDl^a`MX;v z%}r}p+NY&Q&3`}1SITP;G<4W4qx8+=Xp?{-^OnV2CnqpAq~G P=zRuHS3j3^P6%hAsNnZXKds>WFX=)mv_ZP z2PNeT7nIl%#nKW5w4QmWOjvP~!AdIW=rcWz+PJLyPROmUHzh~u z`qMWLeQFAK`peyTz$S4rp~b_s{(pRS?zY!mHOHpk>r;Qt7~sRAENLNdl0|s;);6E> z->qNg*4ur_zr7{*|3}6Eog*I0mMaDszgd``aw6vX+BNJ4!rNq(AJ30nFDl^a`MX;v z%}r}p+NY&Q&3`}1SITP;G<4W4qx8+=Xp?{-^OnV2CnqpAq~G P=zRuHS3j3^P6