[Libreoffice-commits] online.git: Branch 'feature/calc-canvas' - loleaflet/src

Jan Holesovsky (via logerrit) logerrit at kemper.freedesktop.org
Wed Sep 9 22:10:00 UTC 2020


 loleaflet/src/layer/tile/CanvasTileLayer.js   |   20 ++++++++++++++++----
 loleaflet/src/layer/tile/GridLayer.js         |    2 +-
 loleaflet/src/map/anim/Map.ZoomAnimation.js   |    4 ++--
 loleaflet/src/map/handler/Map.TouchGesture.js |    4 ++--
 4 files changed, 21 insertions(+), 9 deletions(-)

New commits:
commit b7295e51e2a3a6a82e359eaf107a7819935ea0ce
Author:     Jan Holesovsky <kendy at collabora.com>
AuthorDate: Thu Sep 10 00:03:10 2020 +0200
Commit:     Jan Holesovsky <kendy at collabora.com>
CommitDate: Thu Sep 10 00:09:35 2020 +0200

    calc canvas: Zoom during the pinch-to-zoom too.
    
    Set the canvas' scale and translate back so that the zoom happens in the
    middle of the pinch.  Also change some getZoom() calls to accessing the
    map's _zoom directly, because the getZoom()'s value depend on whether we
    are in the middle of the animation or not.
    
    Change-Id: Iced7d67e49044c901a2c21496d9d12dbe718207b

diff --git a/loleaflet/src/layer/tile/CanvasTileLayer.js b/loleaflet/src/layer/tile/CanvasTileLayer.js
index e60042334..d035f6ee9 100644
--- a/loleaflet/src/layer/tile/CanvasTileLayer.js
+++ b/loleaflet/src/layer/tile/CanvasTileLayer.js
@@ -182,7 +182,13 @@ L.CanvasTilePainter = L.Class.extend({
 
 			// when using the pinch to zoom, set additional translation based */
 			// on the pinch movement
+			var scale = 1;
 			if (this._map._animatingZoom) {
+				// set the canvas' scale according to the pinch-to-zoom
+				this._canvasCtx.save();
+				scale = this._map.getZoomScale(this._map._animateToZoom, this._lastZoom);
+				this._canvasCtx.scale(scale, scale);
+
 				var centerOffset = this._map._getCenterOffset(this._map._animateToCenter);
 				paneOffset.x += Math.round(centerOffset.x);
 				paneOffset.y += Math.round(centerOffset.y);
@@ -202,14 +208,19 @@ L.CanvasTilePainter = L.Class.extend({
 						  crop.min.x - tileBounds.min.x,
 						  crop.min.y - tileBounds.min.y,
 						  cropWidth, cropHeight,
-						  crop.min.x - paneOffset.x,
-						  crop.min.y - paneOffset.y,
+						  (crop.min.x - paneOffset.x) / scale,
+						  (crop.min.y - paneOffset.y) / scale,
 						  cropWidth, cropHeight);
 			if (this._layer._debug)
 			{
 				this._canvasCtx.strokeStyle = 'rgba(255, 0, 0, 0.5)';
 				this._canvasCtx.strokeRect(tile.coords.x, tile.coords.y, 256, 256);
 			}
+
+			if (this._map._animatingZoom) {
+				// we have set a scale, restore the state
+				this._canvasCtx.restore();
+			}
 		}
 	},
 
@@ -432,12 +443,13 @@ L.CanvasTileLayer = L.TileLayer.extend({
 			movestart: this._moveStart,
 			moveend: this._move,
 			// update tiles on move, but not more often than once per given interval
-			move: L.Util.throttle(this._move, this.options.updateInterval, this), // TODO we might want to make the updates more often (?)
+			move: L.Util.throttle(this._move, this.options.updateInterval, this),
 			splitposchanged: this._move,
 		};
 
 		if (this._zoomAnimated) {
-			events.zoomanim = L.Util.throttle(this._animateZoom, this.options.updateInterval, this); // TODO we might want to make the updates more often (?)
+			// update tiles on zoom, but not more often than once per given interval
+			events.zoomanim = L.Util.throttle(this._animateZoom, this.options.updateInterval, this);
 		}
 
 		return events;
diff --git a/loleaflet/src/layer/tile/GridLayer.js b/loleaflet/src/layer/tile/GridLayer.js
index 4ad07d8fa..4eaeb2f45 100644
--- a/loleaflet/src/layer/tile/GridLayer.js
+++ b/loleaflet/src/layer/tile/GridLayer.js
@@ -12,7 +12,7 @@ L.GridLayer = L.Layer.extend({
 		opacity: 1,
 
 		updateWhenIdle: (window.mode.isMobile() || window.mode.isTablet()),
-		updateInterval: 200,
+		updateInterval: 50, // 20x per second should be hopefully enough
 
 		attribution: null,
 		zIndex: null,
diff --git a/loleaflet/src/map/anim/Map.ZoomAnimation.js b/loleaflet/src/map/anim/Map.ZoomAnimation.js
index 0a8a23133..e365f4b39 100644
--- a/loleaflet/src/map/anim/Map.ZoomAnimation.js
+++ b/loleaflet/src/map/anim/Map.ZoomAnimation.js
@@ -100,8 +100,8 @@ L.Map.include(!zoomAnimated ? {} : {
 
 			L.DomUtil.addClass(this._mapPane, 'leaflet-zoom-anim');
 		} else if (endAnim) {
-			// explicitly end the zoom
-			this._animatingZoom = false;
+			// explicitly end the zoom & redraw
+			this._onZoomTransitionEnd();
 		}
 
 		this.fire('zoomanim', {
diff --git a/loleaflet/src/map/handler/Map.TouchGesture.js b/loleaflet/src/map/handler/Map.TouchGesture.js
index 6e74651be..b7bfad7b9 100644
--- a/loleaflet/src/map/handler/Map.TouchGesture.js
+++ b/loleaflet/src/map/handler/Map.TouchGesture.js
@@ -543,7 +543,7 @@ L.Map.TouchGesture = L.Handler.extend({
 		// we need to invert the offset or the map is moved in the opposite direction
 		var offset = {x: e.center.x - this._pinchStartCenter.x, y: e.center.y - this._pinchStartCenter.y};
 		var center = {x: this._pinchStartCenter.x - offset.x, y: this._pinchStartCenter.y - offset.y};
-		this._zoom = this._map._limitZoom(this._map.getScaleZoom(e.scale));
+		this._zoom = this._map._limitZoom(this._map.getScaleZoom(e.scale, this._map._zoom));
 		this._center = this._map._limitCenter(this._map.mouseEventToLatLng({clientX: center.x, clientY: center.y}),
 						      this._zoom, this._map.options.maxBounds);
 
@@ -555,7 +555,7 @@ L.Map.TouchGesture = L.Handler.extend({
 	},
 
 	_onPinchEnd: function () {
-		var oldZoom = this._map.getZoom(),
+		var oldZoom = this._map._zoom,
 		    zoomDelta = this._zoom - oldZoom,
 		    finalZoom = this._map._limitZoom(zoomDelta > 0 ? Math.ceil(this._zoom) : Math.floor(this._zoom));
 


More information about the Libreoffice-commits mailing list