From 129757578d41549b6c8b649c2199dfb6e5cf75d1 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Mon, 12 Sep 2016 23:42:54 +0200 Subject: [PATCH] Do not repeat first vertex when closed is true --- src/ol/render/canvas/replay.js | 9 +--- test/spec/ol/renderer/canvas/replay.test.js | 46 +++++++++++++++++++++ 2 files changed, 48 insertions(+), 7 deletions(-) diff --git a/src/ol/render/canvas/replay.js b/src/ol/render/canvas/replay.js index 8302579e8c..c092ebe04e 100644 --- a/src/ol/render/canvas/replay.js +++ b/src/ol/render/canvas/replay.js @@ -157,16 +157,11 @@ ol.render.canvas.Replay.prototype.appendFlatCoordinates = function(flatCoordinat lastRel = nextRel; } - // handle case where there is only one point to append - if (i === offset + stride) { + // When we want to close or there is only one point to append: + if ((close && skipped) || i === offset + stride) { this.coordinates[myEnd++] = lastCoord[0]; this.coordinates[myEnd++] = lastCoord[1]; } - - if (close) { - this.coordinates[myEnd++] = flatCoordinates[offset]; - this.coordinates[myEnd++] = flatCoordinates[offset + 1]; - } return myEnd; }; diff --git a/test/spec/ol/renderer/canvas/replay.test.js b/test/spec/ol/renderer/canvas/replay.test.js index 6c867d076f..493d538dea 100644 --- a/test/spec/ol/renderer/canvas/replay.test.js +++ b/test/spec/ol/renderer/canvas/replay.test.js @@ -169,6 +169,12 @@ describe('ol.render.canvas.Replay', function() { expect(replay.coordinates).to.eql(flat); }); + it('appends polygon coordinates that are within the max extent', function() { + var flat = [-110, 45, 110, 45, 110, -45, -110, -45, -110, 45]; + replay.appendFlatCoordinates(flat, 0, flat.length, 2, true); + expect(replay.coordinates).to.eql(flat); + }); + it('works with a single coordinate (inside)', function() { var flat = [-110, 45]; replay.appendFlatCoordinates(flat, 0, flat.length, 2, false); @@ -183,6 +189,14 @@ describe('ol.render.canvas.Replay', function() { expect(replay.coordinates).to.eql(flat); }); + it('always appends first polygon vertex (even if outside)', function() { + // this could be changed, but to make the code simpler for properly + // closing rings, we always add the first point + var flat = [-110, 145, -110, 145]; + replay.appendFlatCoordinates(flat, 0, flat.length, 2, true); + expect(replay.coordinates).to.eql(flat); + }); + it('appends points when segments cross (top to bottom)', function() { // this means we get a few extra points when coordinates are not // part of a linestring or ring, but only a few extra @@ -205,18 +219,50 @@ describe('ol.render.canvas.Replay', function() { expect(replay.coordinates).to.eql(flat); }); + it('always appends the first polygon segment (even when outside)', function() { + // this could be changed, but to make the code simpler for properly + // closing rings, we always add the first segment + var flat = [-10, 200, 10, 200, -10, 200]; + replay.appendFlatCoordinates(flat, 0, flat.length, 2, true); + expect(replay.coordinates).to.eql(flat); + }); + + it('eliminates segments outside (and not changing rel)', function() { + var flat = [0, 0, 0, 200, 5, 200, 10, 200]; + replay.appendFlatCoordinates(flat, 0, flat.length, 2, false); + expect(replay.coordinates).to.eql([0, 0, 0, 200]); + }); + + it('eliminates polygon segments outside (and not changing rel)', function() { + var flat = [0, 0, 0, 200, 5, 200, 10, 200, 0, 0]; + replay.appendFlatCoordinates(flat, 0, flat.length, 2, true); + expect(replay.coordinates).to.eql([0, 0, 0, 200, 10, 200, 0, 0]); + }); + it('eliminates segments outside (and not changing rel)', function() { var flat = [0, 0, 0, 200, 10, 200]; replay.appendFlatCoordinates(flat, 0, flat.length, 2, false); expect(replay.coordinates).to.eql([0, 0, 0, 200]); }); + it('includes polygon segments outside (and not changing rel) when on last segment', function() { + var flat = [0, 0, 0, 200, 10, 200, 0, 0]; + replay.appendFlatCoordinates(flat, 0, flat.length, 2, true); + expect(replay.coordinates).to.eql(flat); + }); + it('includes outside segments that change relationship', function() { var flat = [0, 0, 0, 200, 200, 200, 250, 200]; replay.appendFlatCoordinates(flat, 0, flat.length, 2, false); expect(replay.coordinates).to.eql([0, 0, 0, 200, 200, 200]); }); + it('includes outside polygon segments that change relationship when on last segment', function() { + var flat = [0, 0, 0, 200, 200, 200, 250, 200, 0, 0]; + replay.appendFlatCoordinates(flat, 0, flat.length, 2, true); + expect(replay.coordinates).to.eql(flat); + }); + }); });