From 2b851724a61b52ef8f9c9214c75723ea7fd433a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maximilian=20Kr=C3=B6g?= Date: Mon, 5 Apr 2021 22:09:46 +0200 Subject: [PATCH 1/2] Add regression test for multipolygon text rendering --- .../spec/ol/render/canvas/textbuilder.test.js | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/test/spec/ol/render/canvas/textbuilder.test.js b/test/spec/ol/render/canvas/textbuilder.test.js index 06ed544ba2..c306013224 100644 --- a/test/spec/ol/render/canvas/textbuilder.test.js +++ b/test/spec/ol/render/canvas/textbuilder.test.js @@ -320,4 +320,50 @@ describe('ol.render.canvas.TextBuilder', function () { expect(builder.instructions.length).to.be(3); executeInstructions(builder, 1, 2); }); + + it('generates a matching geometry widths array for multipolygons', function () { + const feature = new Feature( + new MultiPolygon([ + [ + [ + [-180, -90], + [-180, 90], + [-50, 90], + [-50, -90], + [-180, -90], + ], + ], + [ + [ + [-50, -90], + [-50, 90], + [70, 90], + [70, -90], + [-50, -90], + ], + ], + [ + [ + [70, -90], + [70, 90], + [180, 90], + [180, -90], + [70, -90], + ], + ], + ]) + ); + const builder = new TextBuilder(1, [-50, -90, 70, 90], 1, 1); + builder.setTextStyle( + new Text({ + text: 'text', + }) + ); + builder.drawText(feature.getGeometry(), feature); + expect(builder.coordinates).to.have.length(2); + expect(builder.instructions).to.have.length(3); + const geometryWidths = builder.instructions[1][24]; + expect(geometryWidths).to.have.length(1); + expect(geometryWidths[0]).to.be(120); + }); }); From 4f962a651a94719f9b8ddf0f219e136c766d6dd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maximilian=20Kr=C3=B6g?= Date: Sun, 4 Apr 2021 23:54:33 +0200 Subject: [PATCH 2/2] Fix rendering of MultiPolygon text styles When overflow is false and some of a MultiPolygon's polygons are outside the rendered extent the coordinates and geometryWidths arrays are not kept in sync. Therefore the width check will filter on wrong data and some texts may not be rendered. --- src/ol/render/canvas/TextBuilder.js | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/ol/render/canvas/TextBuilder.js b/src/ol/render/canvas/TextBuilder.js index cca8a26d40..c9c4c809d7 100644 --- a/src/ol/render/canvas/TextBuilder.js +++ b/src/ol/render/canvas/TextBuilder.js @@ -232,7 +232,7 @@ class CanvasTextBuilder extends CanvasBuilder { } this.endGeometry(feature); } else { - const geometryWidths = textState.overflow ? null : []; + let geometryWidths = textState.overflow ? null : []; switch (geometryType) { case GeometryType.POINT: case GeometryType.MULTI_POINT: @@ -275,6 +275,21 @@ class CanvasTextBuilder extends CanvasBuilder { if (end === begin) { return; } + if ( + geometryWidths && + (end - begin) / 2 !== flatCoordinates.length / stride + ) { + let beg = begin / 2; + geometryWidths = geometryWidths.filter((w, i) => { + const keep = + coordinates[(beg + i) * 2] === flatCoordinates[i * stride] && + coordinates[(beg + i) * 2 + 1] === flatCoordinates[i * stride + 1]; + if (!keep) { + --beg; + } + return keep; + }); + } this.saveTextStates_();