loleaflet/src/map/Map.js | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-)
New commits: commit dfd77d44836661472908993cbedcef41996c3487 Author: Jan Holesovsky <ke...@collabora.com> AuthorDate: Tue Sep 1 01:39:07 2020 +0200 Commit: Jan Holesovsky <ke...@collabora.com> CommitDate: Tue Sep 1 01:49:04 2020 +0200 calc canvas: Fix occasional off-by-one error that results in a blurry canvas. The core of the fix is in _getNewPixelOrigin() where the round() behaves non-predictably / inconsistently with the rest of the code, causing random off-by-one error that shows (or not) depending on the window size. The biggest problem of this is that this off-by-one is then multiplied somewhere by the zoom factor, causing the canvas being completely blurry; but eventually when the user clicked into the sheet, it 'magically' fixed itself. The rest of the changes (in setZoom()) should actually do the same thing as the previous code, but using existing methods, instead of computing the shifts manually. Change-Id: If0ecb1301b7c1e65cfe8126385ef959c584c5d16 diff --git a/loleaflet/src/map/Map.js b/loleaflet/src/map/Map.js index 84a286eb6..718af8b05 100644 --- a/loleaflet/src/map/Map.js +++ b/loleaflet/src/map/Map.js @@ -474,6 +474,8 @@ L.Map = L.Evented.extend({ this._zoom = this._limitZoom(zoom); return this; } + + var curCenter = this.getCenter(); if (this._docLayer && this._docLayer._docType === 'spreadsheet') { // for spreadsheets, when the document is smaller than the viewing area // we want it to be glued to the row/column headers instead of being centered @@ -483,14 +485,18 @@ L.Map = L.Evented.extend({ var sheetGeom = calcLayer.sheetGeometry; var cellRange = sheetGeom.getViewCellRange(); var col = cellRange.columnrange.start, row = cellRange.rowrange.start; - var zoomScaleAbs = Math.pow(1.2, (zoom - this.options.zoom)); + var zoomScaleAbs = this.zoomToFactor(zoom); + var newTopLeftPx = sheetGeom.getCellRect(col, row, zoomScaleAbs).getTopLeft(); - var newCenterPx = newTopLeftPx.add(this.getSize().divideBy(2)._floor()); - var newCenterLatLng = this.unproject(newCenterPx, zoom); + var moveByPoint = this._getTopLeftPoint(curCenter, zoom).subtract(newTopLeftPx); + + // move the center (which is in LatLng) by the computed amount of pixels + var newCenterLatLng = this.unproject(this.project(curCenter, zoom).subtract(moveByPoint), zoom); + return this.setView(newCenterLatLng, zoom, {zoom: options}); } } - var curCenter = this.getCenter(); + if (this._docLayer && this._docLayer._visibleCursor && this.getBounds().contains(this._docLayer._visibleCursor.getCenter())) { // Calculate new center after zoom. The intent is that the caret // position stays the same. @@ -1671,13 +1677,13 @@ L.Map = L.Evented.extend({ var pixelOrigin = center && zoom !== undefined ? this._getNewPixelOrigin(center, zoom) : this.getPixelOrigin(); + return pixelOrigin.subtract(this._getMapPanePos()); }, _getNewPixelOrigin: function (center, zoom) { var viewHalf = this.getSize()._divideBy(2); - // TODO round on display, not calculation to increase precision? - return this.project(center, zoom)._subtract(viewHalf)._add(this._getMapPanePos())._round(); + return this.project(center, zoom)._subtract(viewHalf)._add(this._getMapPanePos())._floor(); }, _latLngToNewLayerPoint: function (latlng, zoom, center) { _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits