loleaflet/src/geometry/Bounds.js            |    7 ++++++
 loleaflet/src/layer/tile/CanvasTileLayer.js |   31 ++++++++++++++++++++--------
 2 files changed, 30 insertions(+), 8 deletions(-)

New commits:
commit 02ff5aba43627e28b1ebf3726a370305edf97780
Author:     Michael Meeks <[email protected]>
AuthorDate: Tue Sep 8 16:03:34 2020 +0100
Commit:     Michael Meeks <[email protected]>
CommitDate: Tue Sep 8 16:04:06 2020 +0100

    calc canvas: use sub image blitting instead of clipping.
    
    Avoids thrashing the canvas rendering context / clip state.
    
    Change-Id: I547ce22a171874cd7be3a0fac50b4afc56faf084

diff --git a/loleaflet/src/layer/tile/CanvasTileLayer.js 
b/loleaflet/src/layer/tile/CanvasTileLayer.js
index 9f6f4c42b..c44e2ae47 100644
--- a/loleaflet/src/layer/tile/CanvasTileLayer.js
+++ b/loleaflet/src/layer/tile/CanvasTileLayer.js
@@ -178,7 +178,9 @@ L.CanvasTilePainter = L.Class.extend({
                        if (topLeft.y)
                                topLeft.y = viewBounds.min.y;
 
-                       this._canvasCtx.setTransform(1,0,0,1,-topLeft.x, 
-topLeft.y);
+                       this._canvasCtx.setTransform(1,0,
+                                                    0,1,
+                                                    -topLeft.x, -topLeft.y);
                        // when using the pinch to zoom, set additional 
translation based
                        // on the pinch movement
                        if (this._map._animatingZoom) {
@@ -186,13 +188,22 @@ L.CanvasTilePainter = L.Class.extend({
                                
this._canvasCtx.translate(-Math.round(centerOffset.x), 
-Math.round(centerOffset.y));
                        }
 
-                       // create a clip for the pane/view.
-                       this._canvasCtx.beginPath();
-                       var paneSize = paneBounds.getSize();
-                       this._canvasCtx.rect(paneBounds.min.x, 
paneBounds.min.y, paneSize.x + 1, paneSize.y + 1);
-                       this._canvasCtx.clip();
-
-                       this._canvasCtx.drawImage(tile.el, tile.coords.x, 
tile.coords.y);
+                       // intersect - to avoid state thrash through clipping
+                       var crop = new L.Bounds(tileBounds.min, tileBounds.max);
+                       crop.min.x = Math.max(paneBounds.min.x, 
tileBounds.min.x);
+                       crop.min.y = Math.max(paneBounds.min.y, 
tileBounds.min.y);
+                       crop.max.x = Math.min(paneBounds.max.x, 
tileBounds.max.x);
+                       crop.max.y = Math.min(paneBounds.max.y, 
tileBounds.max.y);
+
+                       var cropWidth = crop.max.x - crop.min.x;
+                       var cropHeight = crop.max.y - crop.min.y;
+
+                       this._canvasCtx.drawImage(tile.el,
+                                                 crop.min.x - tileBounds.min.x,
+                                                 crop.min.y - tileBounds.min.y,
+                                                 cropWidth, cropHeight,
+                                                 crop.min.x, crop.min.y,
+                                                 cropWidth, cropHeight);
                        if (this._layer._debug)
                        {
                                this._canvasCtx.strokeStyle = 'rgba(255, 0, 0, 
0.5)';
commit 53f3ef5bfb21d5a2ff0c61dd6500ca4c850a821a
Author:     Michael Meeks <[email protected]>
AuthorDate: Tue Sep 8 16:03:15 2020 +0100
Commit:     Michael Meeks <[email protected]>
CommitDate: Tue Sep 8 16:04:06 2020 +0100

    calc canvas: round view co-ordinates to the real pixels we need.
    
    Change-Id: I768cd9015da1f1301f3ddad242130d4eddb426d1

diff --git a/loleaflet/src/geometry/Bounds.js b/loleaflet/src/geometry/Bounds.js
index 8dacdc832..e9ac075e8 100644
--- a/loleaflet/src/geometry/Bounds.js
+++ b/loleaflet/src/geometry/Bounds.js
@@ -83,6 +83,13 @@ L.Bounds.prototype = {
                        (this.min.y + this.max.y) / 2, round);
        },
 
+       round: function() {
+               this.min.x = Math.round(this.min.x);
+               this.min.y = Math.round(this.min.y);
+               this.max.x = Math.round(this.max.x);
+               this.max.y = Math.round(this.max.y);
+       },
+
        getBottomLeft: function () { // -> Point
                return new L.Point(this.min.x, this.max.y);
        },
diff --git a/loleaflet/src/layer/tile/CanvasTileLayer.js 
b/loleaflet/src/layer/tile/CanvasTileLayer.js
index 5a030050a..9f6f4c42b 100644
--- a/loleaflet/src/layer/tile/CanvasTileLayer.js
+++ b/loleaflet/src/layer/tile/CanvasTileLayer.js
@@ -165,6 +165,10 @@ L.CanvasTilePainter = L.Class.extend({
                        var paneBounds = 
this._layer._cssBoundsToCore(ctx.paneBoundsList[i]);
                        var viewBounds = 
this._layer._cssBoundsToCore(ctx.viewBounds);
 
+                       // into real pixel-land ...
+                       paneBounds.round();
+                       viewBounds.round();
+
                        if (!paneBounds.intersects(tileBounds))
                                continue;
 
_______________________________________________
Libreoffice-commits mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to