From 28f29e9d40ceec7e260caa2312eb899812654857 Mon Sep 17 00:00:00 2001 From: ahocevar Date: Sat, 23 Mar 2013 11:34:38 +0100 Subject: [PATCH] Don't create tile if rendering needs to be deferred Rendering vector tiles with mixed geometry types does not work as expected, because the tile is created without the geometries that need another rendering pass because of missing icons. This was discovered by @bartvde when working on the KML parser, where mixed geometry types are common. This change fixes the issue by breaking out from rendering entirely when renderFeaturesByGeometryType returns a deferred state. In addition, there was a related bug because icons are added to the cache regardless of its loaded state. This is also fixed now. --- src/ol/renderer/canvas/canvasvectorlayerrenderer.js | 10 ++++++---- src/ol/renderer/canvas/canvasvectorrenderer.js | 1 - 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/ol/renderer/canvas/canvasvectorlayerrenderer.js b/src/ol/renderer/canvas/canvasvectorlayerrenderer.js index fff3f51c3c..4b8019342f 100644 --- a/src/ol/renderer/canvas/canvasvectorlayerrenderer.js +++ b/src/ol/renderer/canvas/canvasvectorlayerrenderer.js @@ -341,6 +341,7 @@ ol.renderer.canvas.VectorLayer.prototype.renderFrame = } } + renderByGeometryType: for (type in featuresToRender) { groups = layer.groupFeaturesBySymbolizerLiteral(featuresToRender[type]); numGroups = groups.length; @@ -350,12 +351,13 @@ ol.renderer.canvas.VectorLayer.prototype.renderFrame = /** @type {ol.geom.GeometryType} */ (type), group[0], group[1]); if (deferred) { - break; + break renderByGeometryType; } } - if (!deferred) { - goog.object.extend(tilesToRender, tilesOnSketchCanvas); - } + } + + if (!deferred) { + goog.object.extend(tilesToRender, tilesOnSketchCanvas); } for (key in tilesToRender) { diff --git a/src/ol/renderer/canvas/canvasvectorrenderer.js b/src/ol/renderer/canvas/canvasvectorrenderer.js index 4eeb7004da..29d87fb035 100644 --- a/src/ol/renderer/canvas/canvasvectorrenderer.js +++ b/src/ol/renderer/canvas/canvasvectorrenderer.js @@ -379,7 +379,6 @@ ol.renderer.canvas.VectorRenderer.renderIcon = function(icon, opt_callback) { opt_callback), false, ol.renderer.canvas.VectorRenderer.renderIcon); image.setAttribute('src', url); - ol.renderer.canvas.VectorRenderer.icons_[url] = image; } else if (!goog.isNull(image)) { var width = icon.width, height = icon.height;