/* Zoom animation logic for L.TileLayer. */ L.TileLayer.include({ _animateZoom: function (e) { if (!this._animating) { this._animating = true; this._prepareBgBuffer(); } var bg = this._bgBuffer, transform = L.DomUtil.TRANSFORM, initialTransform = e.delta ? L.DomUtil.getTranslateString(e.delta) : bg.style[transform], scaleStr = L.DomUtil.getScaleString(e.scale, e.origin); bg.style[transform] = e.backwards ? scaleStr + ' ' + initialTransform : initialTransform + ' ' + scaleStr; }, _endZoomAnim: function () { var front = this._tileContainer, bg = this._bgBuffer; front.style.visibility = ''; front.parentNode.appendChild(front); // Bring to fore // force reflow L.Util.falseFn(bg.offsetWidth); var zoom = this._map.getZoom(); if (zoom > this.options.maxZoom || zoom < this.options.minZoom) { this._clearBgBuffer(); } this._animating = false; }, _clearBgBuffer: function () { var map = this._map; if (map && !map._animatingZoom && !map.touchZoom._zooming) { this._bgBuffer.innerHTML = ''; this._bgBuffer.style[L.DomUtil.TRANSFORM] = ''; } }, _prepareBgBuffer: function () { var front = this._tileContainer, bg = this._bgBuffer; // if foreground layer doesn't have many tiles but bg layer does, // keep the existing bg layer and just zoom it some more var bgLoaded = this._getLoadedTilesPercentage(bg), frontLoaded = this._getLoadedTilesPercentage(front); if (bg && bgLoaded > 0.5 && frontLoaded < 0.5) { front.style.visibility = 'hidden'; this._stopLoadingImages(front); return; } // prepare the buffer to become the front tile pane bg.style.visibility = 'hidden'; bg.style[L.DomUtil.TRANSFORM] = ''; // switch out the current layer to be the new bg layer (and vice-versa) this._tileContainer = bg; bg = this._bgBuffer = front; this._stopLoadingImages(bg); //prevent bg buffer from clearing right after zoom clearTimeout(this._clearBgBufferTimer); }, _getLoadedTilesPercentage: function (container) { var tiles = container.getElementsByTagName('img'), i, len, count = 0; for (i = 0, len = tiles.length; i < len; i++) { if (tiles[i].complete) { count++; } } return count / len; }, // stops loading all tiles in the background layer _stopLoadingImages: function (container) { var tiles = Array.prototype.slice.call(container.getElementsByTagName('img')), i, len, tile; for (i = 0, len = tiles.length; i < len; i++) { tile = tiles[i]; if (!tile.complete) { tile.onload = L.Util.falseFn; tile.onerror = L.Util.falseFn; tile.src = L.Util.emptyImageUrl; tile.parentNode.removeChild(tile); } } } });