[Libreoffice-commits] online.git: Branch 'feature/calc-canvas' - 2 commits - loleaflet/Makefile.am loleaflet/src
Michael Meeks (via logerrit)
logerrit at kemper.freedesktop.org
Wed Sep 9 21:49:05 UTC 2020
loleaflet/Makefile.am | 1
loleaflet/src/core/Socket.js | 7 -
loleaflet/src/layer/CalcGridLines.js | 112 ----------------------------
loleaflet/src/layer/tile/CalcTileLayer.js | 101 +++++++++++++++++++++++--
loleaflet/src/layer/tile/CanvasTileLayer.js | 26 ++++--
loleaflet/src/map/Map.js | 1
6 files changed, 111 insertions(+), 137 deletions(-)
New commits:
commit 6c1d69e248e36c2afc9499bcacbf5750d47e19c6
Author: Michael Meeks <michael.meeks at collabora.com>
AuthorDate: Wed Sep 9 22:47:14 2020 +0100
Commit: Michael Meeks <michael.meeks at collabora.com>
CommitDate: Wed Sep 9 22:47:14 2020 +0100
calc canvas: remove svg grid-line background layer.
occluded by opaque canvas above it anyway.
Change-Id: I954da92c43ae680e6041cbff6092f9a2ac71ebe2
diff --git a/loleaflet/Makefile.am b/loleaflet/Makefile.am
index 44c4886fa..62036d993 100644
--- a/loleaflet/Makefile.am
+++ b/loleaflet/Makefile.am
@@ -221,7 +221,6 @@ LOLEAFLET_JS =\
src/layer/marker/Marker.Popup.js \
src/layer/LayerGroup.js \
src/layer/FeatureGroup.js \
- src/layer/CalcGridLines.js \
src/layer/vector/Renderer.js \
src/layer/vector/Path.js \
src/layer/vector/Path.Popup.js \
diff --git a/loleaflet/src/core/Socket.js b/loleaflet/src/core/Socket.js
index fa78bf1a3..473c85ce5 100644
--- a/loleaflet/src/core/Socket.js
+++ b/loleaflet/src/core/Socket.js
@@ -994,13 +994,6 @@ L.Socket = L.Class.extend({
tileHeightTwips: tileHeightTwips,
docType: command.type
});
-
- this._map.options.backgroundLayerEnabled = !(docLayer instanceof L.CanvasTileLayer);
-
- if (this._map.options.backgroundLayerEnabled) {
- docLayer.backgroundLayer = new L.CalcBackground().addTo(this._map);
- (new L.CalcGridLines()).addTo(this._map);
- }
}
else {
if (command.type === 'presentation' &&
diff --git a/loleaflet/src/layer/CalcGridLines.js b/loleaflet/src/layer/CalcGridLines.js
deleted file mode 100644
index fce802101..000000000
--- a/loleaflet/src/layer/CalcGridLines.js
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * A Leaflet layer that draws grid lines for spreadsheet row/column separators.
- */
-
-L.CalcGridLines = L.LayerGroup.extend({
- // Options given to L.CalcGridLines will be propagated into the spawned
- // L.PolyLines. Default is thin grey lines.
- options: {
- color: '#c0c0c0',
- weight: 1,
- interactive: false
- },
-
-
- initialize: function(options) {
- L.LayerGroup.prototype.initialize.call(this, options);
- this._rowLines = L.layerGroup();
- this._colLines = L.layerGroup();
- },
-
- onAdd: function(map) {
-
- // The SVG renderer needs some specific customizations
- if (!this.options.renderer) {
- map.createPane('calc-background');
-
- this.options.renderer = new L.SVG({
- pane: 'calc-background'
- });
-
- // Hack the _updatePoly private method so it offsets all SVG path coordinates
- // to 0.5. This makes the rendered lines align to the screen pixel grid
- // nicely (at least in non-HPI screens)
- this.options.renderer._updatePoly = function(layer, closed) {
- var str = '', i, j, len, len2, points, p, rings = layer._parts;
-
- for (i = 0, len = rings.length; i < len; i++) {
- points = rings[i];
-
- for (j = 0, len2 = points.length; j < len2; j++) {
- p = points[j];
- str += (j ? 'L' : 'M') + (Math.ceil(p.x) - 0.5) + ' ' + (Math.ceil(p.y) - 0.5);
- }
-
- // closes the ring for polygons; "x" is VML syntax
- str += closed ? (L.Browser.svg ? 'z' : 'x') : '';
- }
-
- // SVG complains about empty path strings
- if (str === '') {
- str = 'M0 0';
- }
-
- this._setPath(layer, str, closed);
- }.bind(this.options.renderer);
- }
-
- this._map.on('viewrowcolumnheaders', this.onUpdate, this);
-
- this.addLayer(this._rowLines);
- this.addLayer(this._colLines);
-
- },
-
- remove: function() {
- this._map.off('viewrowcolumnheaders', this.onUpdate, this);
-
- this.removeLayer(this._rowLines);
- this.removeLayer(this._colLines);
- },
-
- // Redraw col/row lines whenever new information about them is available.
- // One websocket message might have info about cols, rows, or both
- onUpdate: function onUpdate(ev) {
- var headerInfo, pos;
-
- // Aux stuff to convert css pixels to map coordinate units
- var pixelToMapUnitRatio = this._map.options.crs.scale(this._map.getZoom());
-
- if (ev.updatecolumns) {
- headerInfo = new L.Control.Header.HeaderInfo(this._map, true /* isCol */);
- this._colLines.clearLayers();
-
- headerInfo.forEachElement(function(columnData) {
- pos = headerInfo.headerToDocPos(columnData.pos) / pixelToMapUnitRatio;
- this._colLines.addLayer(
- L.polyline([[[ L.Util.MIN_SAFE_INTEGER, pos ],[ L.Util.MAX_SAFE_INTEGER, pos ]]],
- this.options
- )
- );
- }.bind(this));
- }
-
- if (ev.updaterows) {
- headerInfo = new L.Control.Header.HeaderInfo(this._map, false /* isCol */);
- this._rowLines.clearLayers();
-
- headerInfo.forEachElement(function(rowData) {
- pos = headerInfo.headerToDocPos(rowData.pos) / pixelToMapUnitRatio;
- this._rowLines.addLayer(
- // Note that y-coordinates are inverted: Leaflet's CRS.Simple assumes
- // down = negative latlngs, whereas loolkit assumes down = positive twips
- L.polyline([[[ -pos, L.Util.MIN_SAFE_INTEGER ],[ -pos, L.Util.MAX_SAFE_INTEGER ]]],
- this.options
- )
- );
- }.bind(this));
- }
- }
-
-});
-
diff --git a/loleaflet/src/map/Map.js b/loleaflet/src/map/Map.js
index 673af34b8..312fbd45b 100644
--- a/loleaflet/src/map/Map.js
+++ b/loleaflet/src/map/Map.js
@@ -42,7 +42,6 @@ L.Map = L.Evented.extend({
urlPrefix: 'lool',
wopiSrc: '',
cursorURL: L.LOUtil.getURL('cursors'),
- backgroundLayerEnabled: true,
},
// Control.UIManager instance, set in main.js
commit f9f07d165357bb9e431371a77874aed0932e0404
Author: Michael Meeks <michael.meeks at collabora.com>
AuthorDate: Wed Sep 9 10:05:44 2020 +0100
Commit: Michael Meeks <michael.meeks at collabora.com>
CommitDate: Wed Sep 9 22:43:22 2020 +0100
calc canvas: start of direct grid rendering.
Change-Id: If471fc4ff94b3cb8e2897ac76e712aa3958fc7d2
diff --git a/loleaflet/src/layer/tile/CalcTileLayer.js b/loleaflet/src/layer/tile/CalcTileLayer.js
index fc96f0546..7cf1318a7 100644
--- a/loleaflet/src/layer/tile/CalcTileLayer.js
+++ b/loleaflet/src/layer/tile/CalcTileLayer.js
@@ -735,6 +735,67 @@ L.CalcTileLayer = L.CanvasTileLayer.extend({
converter: this._twipsToPixels,
context: this
});
+ var that = this;
+ this._painter.renderBackground = function(canvas, ctx)
+ {
+ if (this._layer._debug)
+ this._canvasCtx.fillStyle = 'rgba(255, 0, 0, 0.5)';
+ else
+ this._canvasCtx.fillStyle = 'white'; // FIXME: sheet bg color
+ this._canvasCtx.fillRect(0, 0, ctx.canvasSize.x, ctx.canvasSize.y);
+
+ if (that._debug)
+ canvas.strokeStyle = 'blue';
+ else // now fr some grid-lines ...
+ canvas.strokeStyle = '#c0c0c0';
+ canvas.lineWidth = 1.0;
+
+ canvas.beginPath();
+ for (var i = 0; i < ctx.paneBoundsList.length; ++i) {
+ // FIXME: de-duplicate before firing myself:
+
+ // co-ordinates of this pane in core document pixels
+ var paneBounds = that._cssBoundsToCore(ctx.paneBoundsList[i]);
+ // co-ordinates of the main-(bottom right) pane in core document pixels
+ var viewBounds = that._cssBoundsToCore(ctx.viewBounds);
+ // into real pixel-land ...
+ paneBounds.round();
+ viewBounds.round();
+
+ var paneOffset = paneBounds.getTopLeft(); // allocates
+ // Cute way to detect the in-canvas pixel offset of each pane
+ paneOffset.x = Math.min(paneOffset.x, viewBounds.min.x);
+ paneOffset.y = Math.min(paneOffset.y, viewBounds.min.y);
+
+ // when using the pinch to zoom, set additional translation based */
+ // on the pinch movement
+ if (that._map._animatingZoom) {
+ var centerOffset = this._map._getCenterOffset(this._map._animateToCenter);
+ paneOffset.x += Math.round(centerOffset.x);
+ paneOffset.y += Math.round(centerOffset.y);
+ }
+
+ // URGH -> zooming etc. (!?) ...
+ if (that.sheetGeometry._columns)
+ that.sheetGeometry._columns.forEachInCorePixelRange(
+ paneBounds.min.x, paneBounds.max.x,
+ function(pos) {
+ canvas.moveTo(pos - paneOffset.x - 0.5, paneBounds.min.y - paneOffset.y - 0.5);
+ canvas.lineTo(pos - paneOffset.x - 0.5, paneBounds.max.y - paneOffset.y - 0.5);
+ canvas.stroke();
+ });
+
+ if (that.sheetGeometry._rows)
+ that.sheetGeometry._rows.forEachInCorePixelRange(
+ paneBounds.min.y, paneBounds.max.y,
+ function(pos) {
+ canvas.moveTo(paneBounds.min.x - paneOffset.x - 0.5, pos - paneOffset.y - 0.5);
+ canvas.lineTo(paneBounds.max.x - paneOffset.x - 0.5, pos - paneOffset.y - 0.5);
+ canvas.stroke();
+ });
+ }
+ canvas.closePath();
+ };
},
_handleSheetGeometryDataMsg: function (jsonMsgObj) {
@@ -912,12 +973,15 @@ L.CalcTileLayer = L.CanvasTileLayer.extend({
comment.tab = parseInt(comment.tab);
comment.cellPos = L.LOUtil.stringToBounds(comment.cellPos);
comment.cellPos = L.latLngBounds(this._twipsToLatLng(comment.cellPos.getBottomLeft()),
- this._twipsToLatLng(comment.cellPos.getTopRight()));
- var annotation = this._annotations[comment.tab][comment.id];
- if (annotation) {
- annotation.setLatLngBounds(comment.cellPos);
- if (annotation.mark) {
- annotation.mark.setLatLng(comment.cellPos.getNorthEast());
+ this._twipsToLatLng(comment.cellPos.getTopRight()));
+ if (this._annotations && this._annotations[comment.tab])
+ {
+ var annotation = this._annotations[comment.tab][comment.id];
+ if (annotation) {
+ annotation.setLatLngBounds(comment.cellPos);
+ if (annotation.mark) {
+ annotation.mark.setLatLng(comment.cellPos.getNorthEast());
+ }
}
}
}
@@ -1767,6 +1831,25 @@ L.SheetDimension = L.Class.extend({
});
},
+ // callback with a position for each grid line in this pixel range
+ forEachInCorePixelRange: function(startPix, endPix, callback) {
+ this._visibleSizes.forEachSpan(function (spanData) {
+ // do we overlap ?
+ var spanFirstCorePx = spanData.data.poscorepx -
+ (spanData.data.sizecore * (spanData.end - spanData.start + 1));
+ if (spanFirstCorePx < endPix && spanData.data.poscorepx > startPix)
+ {
+ var firstCorePx = startPix + spanData.data.sizecore -
+ ((startPix - spanFirstCorePx) % spanData.data.sizecore);
+ var lastCorePx = Math.min(endPix, spanData.data.poscorepx);
+
+ for (var pos = firstCorePx; pos <= lastCorePx; pos += spanData.data.sizecore) {
+ callback(pos);
+ }
+ }
+ });
+ },
+
// computes element index from tile-twips position and returns
// an object with this index and the span data.
_getSpanAndIndexFromTileTwipsPos: function (pos) {
@@ -2147,6 +2230,12 @@ L.SpanList = L.Class.extend({
}
},
+ forEachSpan: function(callback) {
+ for (var id = 0; id < this._spanlist.length; ++id) {
+ callback(this._getSpanData(id));
+ }
+ },
+
_getSpanData: function (spanid) {
var span = this._spanlist[spanid];
diff --git a/loleaflet/src/layer/tile/CanvasTileLayer.js b/loleaflet/src/layer/tile/CanvasTileLayer.js
index ab7850853..e60042334 100644
--- a/loleaflet/src/layer/tile/CanvasTileLayer.js
+++ b/loleaflet/src/layer/tile/CanvasTileLayer.js
@@ -91,7 +91,6 @@ L.CanvasTilePainter = L.Class.extend({
this._canvasCtx.imageSmoothingEnabled = false;
this._canvasCtx.msImageSmoothingEnabled = false;
var mapSize = this._map.getPixelBounds().getSize();
- this._lastSize = mapSize;
this._lastMapSize = mapSize;
this._setCanvasSize(mapSize.x, mapSize.y);
this._canvasCtx.setTransform(1,0,0,1,0,0);
@@ -116,6 +115,8 @@ L.CanvasTilePainter = L.Class.extend({
this._height = parseInt(this._canvas.style.height);
this.clear();
this._syncTileContainerSize();
+
+ this._lastSize = new L.Point(widthCSSPx, heightCSSPx);
},
canvasDPIScale: function () {
@@ -148,13 +149,13 @@ L.CanvasTilePainter = L.Class.extend({
splitPanesContext.getPxBoundList(viewBounds) :
[viewBounds];
- return { tileSize: tileSize,
+ return { canvasSize: this._lastSize,
+ tileSize: tileSize,
viewBounds: viewBounds,
paneBoundsList: paneBoundsList };
},
paint: function (tile, ctx) {
-
if (!ctx)
ctx = this._paintContext();
@@ -251,9 +252,9 @@ L.CanvasTilePainter = L.Class.extend({
var mapSizeChanged = !newMapSize.equals(this._lastMapSize);
// To avoid flicker, only resize the canvas element if width or height of the map increases.
- var newSize = new L.Point(Math.max(newMapSize.x, this._lastSize.x),
- Math.max(newMapSize.y, this._lastSize.y));
- var resizeCanvas = !newSize.equals(this._lastSize);
+ var newSize = new L.Point(Math.max(newMapSize.x, this._lastSize ? this._lastSize.x : 0),
+ Math.max(newMapSize.y, this._lastSize ? this._lastSize.y : 0));
+ var resizeCanvas = !this._lastSize || !newSize.equals(this._lastSize);
var topLeftChanged = this._topLeft === undefined || !newTopLeft.equals(this._topLeft);
var splitPosChanged = !newSplitPos.equals(this._splitPos);
@@ -273,7 +274,6 @@ L.CanvasTilePainter = L.Class.extend({
if (resizeCanvas || scaleChanged) {
this._setCanvasSize(newSize.x, newSize.y);
- this._lastSize = newSize;
}
else if (mapSizeChanged && topLeftChanged) {
this.clear();
@@ -298,14 +298,16 @@ L.CanvasTilePainter = L.Class.extend({
_paintWholeCanvas: function () {
- if (this._layer._debug)
- this.clear();
-
var zoom = this._lastZoom || Math.round(this._map.getZoom());
var part = this._lastPart || this._layer._selectedPart;
// Calculate all this here intead of doing it per tile.
var ctx = this._paintContext();
+
+ // First render the background / sheet grid if we can
+ if (this.renderBackground)
+ this.renderBackground(this._canvasCtx, ctx);
+
var tileRanges = ctx.paneBoundsList.map(this._layer._pxBoundsToTileRange, this._layer);
for (var rangeIdx = 0; rangeIdx < tileRanges.length; ++rangeIdx) {
@@ -331,6 +333,10 @@ L.CanvasTilePainter = L.Class.extend({
}
}
}
+
+ // Render on top to check matchup
+ if (this._layer._debug && this.renderBackground)
+ this.renderBackground(this._canvasCtx, ctx);
},
});
More information about the Libreoffice-commits
mailing list