loleaflet/src/layer/tile/GridLayer.js |  104 ++++++++++++++++++++++++++++++++++
 loleaflet/src/layer/tile/TileLayer.js |   15 ++++
 2 files changed, 118 insertions(+), 1 deletion(-)

New commits:
commit e1c3426b6e2e621694e2a7ea61c446a55a7b720e
Author: Mihai Varga <mihai.va...@collabora.com>
Date:   Fri Jul 10 09:25:32 2015 +0300

    loleaflet: keep prefetch borders if the view didn't change
    
    Also, only prefetch tiles from a 5 tiles widte border. Not more because
    it would freeze the UI

diff --git a/loleaflet/src/layer/tile/GridLayer.js 
b/loleaflet/src/layer/tile/GridLayer.js
index f77b575..fc67031 100644
--- a/loleaflet/src/layer/tile/GridLayer.js
+++ b/loleaflet/src/layer/tile/GridLayer.js
@@ -104,6 +104,7 @@ L.GridLayer = L.Layer.extend({
        getEvents: function () {
                var events = {
                        viewreset: this._viewReset,
+                       movestart: this._moveStart,
                        moveend: this._move
                };
 
@@ -449,8 +450,17 @@ L.GridLayer = L.Layer.extend({
                return this.options.tileSize;
        },
 
+       _moveStart: function () {
+               clearInterval(this._tilesPrefetcher);
+               this._tilesPrefetcher = null;
+               this._preFetchBorder = null;
+       },
+
        _move: function () {
                this._update();
+               if (!this._tilesPreFetcher) {
+                       this._tilesPreFetcher = 
setInterval(L.bind(this._preFetchTiles, this), 2000);
+               }
        },
 
        _update: function (center, zoom) {
@@ -786,36 +796,44 @@ L.GridLayer = L.Layer.extend({
                var center = map.getCenter();
                var zoom = map.getZoom();
 
-               var pixelBounds = map.getPixelBounds(center, zoom),
-                       tileRange = this._pxBoundsToTileRange(pixelBounds),
-                       queue = [],
-                       finalQueue = [];
-                       tilesToFetch = 10;
-
-               while ((tileRange.min.x >= 0 || tileRange.min.y >= 0 ||
-                               tileRange.max.x * this._tileWidthTwips < 
this._docWidthTwips ||
-                                tileRange.max.y * this._tileHeightTwips < 
this._docHeightTwips) &&
-                               tilesToFetch > 0) {
+               if (!this._preFetchBorder) {
+                       var pixelBounds = map.getPixelBounds(center, zoom),
+                               tileBorder = 
this._pxBoundsToTileRange(pixelBounds);
+                       this._preFetchBorder = tileBorder;
+               }
+               else {
+                       tileBorder = this._preFetchBorder;
+               }
+               var queue = [],
+                       finalQueue = [],
+                       tilesToFetch = 10,
+                       borderWidth = 0;
+                       // don't search on a border wider than 5 tiles because 
it will freeze the UI
+
+               while ((tileBorder.min.x >= 0 || tileBorder.min.y >= 0 ||
+                               tileBorder.max.x * this._tileWidthTwips < 
this._docWidthTwips ||
+                                tileBorder.max.y * this._tileHeightTwips < 
this._docHeightTwips) &&
+                               tilesToFetch > 0 && borderWidth < 5) {
                        // while the bounds do not fully contain the document
 
-                       for (var i = tileRange.min.x; i <= tileRange.max.x; 
i++) {
+                       for (var i = tileBorder.min.x; i <= tileBorder.max.x; 
i++) {
                                // tiles below the visible area
-                               var coords = new L.Point(i, tileRange.max.y);
+                               var coords = new L.Point(i, tileBorder.max.y);
                                queue.push(coords);
                        }
-                       for (i = tileRange.min.x; i <= tileRange.max.x; i++) {
+                       for (i = tileBorder.min.x; i <= tileBorder.max.x; i++) {
                                // tiles above the visible area
-                               coords = new L.Point(i, tileRange.min.y);
+                               coords = new L.Point(i, tileBorder.min.y);
                                queue.push(coords);
                        }
-                       for (i = tileRange.min.y; i <= tileRange.max.y; i++) {
+                       for (i = tileBorder.min.y; i <= tileBorder.max.y; i++) {
                                // tiles to the right of the visible area
-                               coords = new L.Point(tileRange.max.x, i);
+                               coords = new L.Point(tileBorder.max.x, i);
                                queue.push(coords);
                        }
-                       for (i = tileRange.min.y; i <= tileRange.max.y; i++) {
+                       for (i = tileBorder.min.y; i <= tileBorder.max.y; i++) {
                                // tiles to the left of the visible area
-                               coords = new L.Point(tileRange.min.x, i);
+                               coords = new L.Point(tileBorder.min.x, i);
                                queue.push(coords);
                        }
 
@@ -834,18 +852,24 @@ L.GridLayer = L.Layer.extend({
                                finalQueue.push(coords);
                                tilesToFetch -= 1;
                        }
-                       if (tileRange.min.x >= 0) {
-                               tileRange.min.x -= 1;
+                       if (tilesToFetch === 0) {
+                               // don't update the border as there are still
+                               // some tiles to be fetched
+                               continue;
+                       }
+                       if (tileBorder.min.x >= 0) {
+                               tileBorder.min.x -= 1;
                        }
-                       if (tileRange.min.y >= 0) {
-                               tileRange.min.y -= 1;
+                       if (tileBorder.min.y >= 0) {
+                               tileBorder.min.y -= 1;
                        }
-                       if (tileRange.max.x * this._tileWidthTwips <= 
this._docWidthTwips) {
-                               tileRange.max.x += 1;
+                       if (tileBorder.max.x * this._tileWidthTwips <= 
this._docWidthTwips) {
+                               tileBorder.max.x += 1;
                        }
-                       if (tileRange.max.y * this._tileHeightTwips <= 
this._docHeightTwips) {
-                               tileRange.max.y += 1;
+                       if (tileBorder.max.y * this._tileHeightTwips <= 
this._docHeightTwips) {
+                               tileBorder.max.y += 1;
                        }
+                       borderWidth += 1;
                }
 
                if (finalQueue.length > 0) {
diff --git a/loleaflet/src/layer/tile/TileLayer.js 
b/loleaflet/src/layer/tile/TileLayer.js
index 378c272..7599cf5 100644
--- a/loleaflet/src/layer/tile/TileLayer.js
+++ b/loleaflet/src/layer/tile/TileLayer.js
@@ -213,6 +213,7 @@ L.TileLayer = L.GridLayer.extend({
        getEvents: function () {
                var events = {
                        viewreset: this._viewReset,
+                       movestart: this._moveStart,
                        moveend: this._move,
                        keydown: this._signalKey,
                        keypress: this._signalKey,
@@ -1046,9 +1047,15 @@ L.TileLayer = L.GridLayer.extend({
 
        _onZoom: function (e) {
                if (e.type === 'zoomstart') {
+                       clearInterval(this._tilesPrefetcher);
+                       this._tilesPrefetcher = null;
+                       this._preFetchBorder = null;
                }
                else if (e.type === 'zoomend') {
                        this._onUpdateCursor();
+                       if (!this._tilesPreFetcher) {
+                               this._tilesPreFetcher = 
setInterval(L.bind(this._preFetchTiles, this), 2000);
+                       }
                }
        }
 });
commit 1cb3cfcc81903fd0ecf4f558d00d6471fdd059b7
Author: Mihai Varga <mihai.va...@collabora.com>
Date:   Fri Jul 10 09:04:03 2015 +0300

    loleaflet: prefetch tiles around the current visible area
    
    Tiles are prefetched from the border of the current visible area
    and the border expands as the tiles are fetched. In the end covering
    the whole document if left alone.

diff --git a/loleaflet/src/layer/tile/GridLayer.js 
b/loleaflet/src/layer/tile/GridLayer.js
index 6521d5f..f77b575 100644
--- a/loleaflet/src/layer/tile/GridLayer.js
+++ b/loleaflet/src/layer/tile/GridLayer.js
@@ -507,6 +507,7 @@ L.GridLayer = L.Layer.extend({
                                // we know that a new set of tiles that cover 
the whole view has been requested
                                // so we're able to cancel the previous 
requests that are being processed
                                this._map.socket.send('canceltiles');
+                               this._pendingTilesCount = 0;
                                for (key in this._tiles) {
                                        if (!this._tiles[key].loaded) {
                                                
L.DomUtil.remove(this._tiles[key].el);
@@ -651,6 +652,7 @@ L.GridLayer = L.Layer.extend({
                if (!this._tileCache[key]) {
                        if (this.options.useSocket && this._map.socket) {
                                var twips = this._coordsToTwips(coords);
+                               this._pendingTilesCount += 1;
                                this._map.socket.send('tile ' +
                                                                                
'part=' + this._currentPart + ' ' +
                                                                                
'width=' + this._tileSize + ' ' +
@@ -775,6 +777,84 @@ L.GridLayer = L.Layer.extend({
        _onScrollEnd: function (evt) {
                this._prevScrollY = -evt.mcs.top;
                this._prevScrollX = -evt.mcs.left;
+       },
+
+       _preFetchTiles: function () {
+               if (this._pendingTilesCount > 0) {
+                       return;
+               }
+               var center = map.getCenter();
+               var zoom = map.getZoom();
+
+               var pixelBounds = map.getPixelBounds(center, zoom),
+                       tileRange = this._pxBoundsToTileRange(pixelBounds),
+                       queue = [],
+                       finalQueue = [];
+                       tilesToFetch = 10;
+
+               while ((tileRange.min.x >= 0 || tileRange.min.y >= 0 ||
+                               tileRange.max.x * this._tileWidthTwips < 
this._docWidthTwips ||
+                                tileRange.max.y * this._tileHeightTwips < 
this._docHeightTwips) &&
+                               tilesToFetch > 0) {
+                       // while the bounds do not fully contain the document
+
+                       for (var i = tileRange.min.x; i <= tileRange.max.x; 
i++) {
+                               // tiles below the visible area
+                               var coords = new L.Point(i, tileRange.max.y);
+                               queue.push(coords);
+                       }
+                       for (i = tileRange.min.x; i <= tileRange.max.x; i++) {
+                               // tiles above the visible area
+                               coords = new L.Point(i, tileRange.min.y);
+                               queue.push(coords);
+                       }
+                       for (i = tileRange.min.y; i <= tileRange.max.y; i++) {
+                               // tiles to the right of the visible area
+                               coords = new L.Point(tileRange.max.x, i);
+                               queue.push(coords);
+                       }
+                       for (i = tileRange.min.y; i <= tileRange.max.y; i++) {
+                               // tiles to the left of the visible area
+                               coords = new L.Point(tileRange.min.x, i);
+                               queue.push(coords);
+                       }
+
+                       for (i = 0; i < queue.length && tilesToFetch > 0; i++) {
+                               coords = queue[i];
+                               coords.z = zoom;
+                               coords.part = this._currentPart,
+                               key = this._tileCoordsToKey(coords);
+
+                               if (!this._isValidTile(coords) ||
+                                               this._tiles[key] ||
+                                               this._tileCache[key]) {
+                                       continue;
+                               }
+
+                               finalQueue.push(coords);
+                               tilesToFetch -= 1;
+                       }
+                       if (tileRange.min.x >= 0) {
+                               tileRange.min.x -= 1;
+                       }
+                       if (tileRange.min.y >= 0) {
+                               tileRange.min.y -= 1;
+                       }
+                       if (tileRange.max.x * this._tileWidthTwips <= 
this._docWidthTwips) {
+                               tileRange.max.x += 1;
+                       }
+                       if (tileRange.max.y * this._tileHeightTwips <= 
this._docHeightTwips) {
+                               tileRange.max.y += 1;
+                       }
+               }
+
+               if (finalQueue.length > 0) {
+                       var fragment = document.createDocumentFragment();
+                       for (i = 0; i < finalQueue.length; i++) {
+                               this._addTile(finalQueue[i], fragment);
+                       }
+                       this._level.el.appendChild(fragment);
+               }
        }
 });
 
diff --git a/loleaflet/src/layer/tile/TileLayer.js 
b/loleaflet/src/layer/tile/TileLayer.js
index fa5100e..378c272 100644
--- a/loleaflet/src/layer/tile/TileLayer.js
+++ b/loleaflet/src/layer/tile/TileLayer.js
@@ -175,6 +175,7 @@ L.TileLayer = L.GridLayer.extend({
                        draggable: true
                });
                this._mouseEventsQueue = [];
+               this._pendingTilesCount = 0;
                this._textArea = L.DomUtil.get('clipboard');
                this._textArea.focus();
        },
@@ -399,6 +400,9 @@ L.TileLayer = L.GridLayer.extend({
                                this._parts = command.parts;
                                this._currentPart = command.currentPart;
                                this._update();
+                               if (!this._tilesPreFetcher) {
+                                       this._tilesPreFetcher = 
setInterval(L.bind(this._preFetchTiles, this), 2000);
+                               }
                        }
                }
                else if (textMsg.startsWith('statusindicatorstart:')) {
@@ -435,7 +439,9 @@ L.TileLayer = L.GridLayer.extend({
                        else {
                                this._tileCache[key] = 'data:image/png;base64,' 
+ window.btoa(strBytes);
                        }
-
+                       if (this._pendingTilesCount > 0) {
+                               this._pendingTilesCount -= 1;
+                       }
                }
                else if (textMsg.startsWith('textselection:')) {
                        strTwips = textMsg.match(/\d+/g);
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to