[Libreoffice-commits] online.git: loleaflet/src
Mihai Varga
mihai.varga at collabora.com
Thu Jul 16 07:48:36 PDT 2015
loleaflet/src/geometry/PolyUtil.js | 141 +++++++++++++++++++++++++++++++++
loleaflet/src/layer/tile/TileLayer.js | 143 ----------------------------------
2 files changed, 142 insertions(+), 142 deletions(-)
New commits:
commit 8d22cb30899e747d7c6d2f5f8a4807d0c48eb927
Author: Mihai Varga <mihai.varga at collabora.com>
Date: Thu Jul 16 17:47:40 2015 +0300
loleaflet: moved 'rectanglesToPolygons' method to PolyUtils
diff --git a/loleaflet/src/geometry/PolyUtil.js b/loleaflet/src/geometry/PolyUtil.js
index f5afe08..f024159 100644
--- a/loleaflet/src/geometry/PolyUtil.js
+++ b/loleaflet/src/geometry/PolyUtil.js
@@ -51,3 +51,144 @@ L.PolyUtil.clipPolygon = function (points, bounds, round) {
return points;
};
+
+L.PolyUtil.rectanglesToPolygons = function (rectangles, docLayer) {
+ // algorithm found here http://stackoverflow.com/questions/13746284/merging-multiple-adjacent-rectangles-into-one-polygon
+ var eps = 20;
+ // Glue rectangles if the space between them is less then eps
+ for (var i = 0; i < rectangles.length - 1; i++) {
+ for (var j = i + 1; j < rectangles.length; j++) {
+ for (var k = 0; k < rectangles[i].length; k++) {
+ for (var l = 0; l < rectangles[j].length; l++) {
+ if (Math.abs(rectangles[i][k].x - rectangles[j][l].x) < eps) {
+ rectangles[j][l].x = rectangles[i][k].x;
+ }
+ if (Math.abs(rectangles[i][k].y - rectangles[j][l].y) < eps) {
+ rectangles[j][l].y = rectangles[i][k].y;
+ }
+ }
+ }
+ }
+ }
+
+ var points = {};
+ for (i = 0; i < rectangles.length; i++) {
+ for (j = 0; j < rectangles[i].length; j++) {
+ if (points[rectangles[i][j]]) {
+ delete points[rectangles[i][j]];
+ }
+ else {
+ points[rectangles[i][j]] = rectangles[i][j];
+ }
+ }
+ }
+
+ function getKeys(points) {
+ var keys = [];
+ for (var key in points) {
+ if (points.hasOwnProperty(key)) {
+ keys.push(key);
+ }
+ }
+ return keys;
+ }
+
+ function xThenY(aStr, bStr) {
+ var a = aStr.match(/\d+/g);
+ a[0] = parseInt(a[0]);
+ a[1] = parseInt(a[1]);
+ var b = bStr.match(/\d+/g);
+ b[0] = parseInt(b[0]);
+ b[1] = parseInt(b[1]);
+
+ if (a[0] < b[0] || (a[0] === b[0] && a[1] < b[1])) {
+ return -1;
+ }
+ else if (a[0] === b[0] && a[1] === b[1]) {
+ return 0;
+ }
+ else {
+ return 1;
+ }
+ }
+
+ function yThenX(aStr, bStr) {
+ var a = aStr.match(/\d+/g);
+ a[0] = parseInt(a[0]);
+ a[1] = parseInt(a[1]);
+ var b = bStr.match(/\d+/g);
+ b[0] = parseInt(b[0]);
+ b[1] = parseInt(b[1]);
+
+ if (a[1] < b[1] || (a[1] === b[1] && a[0] < b[0])) {
+ return -1;
+ }
+ else if (a[0] === b[0] && a[1] === b[1]) {
+ return 0;
+ }
+ else {
+ return 1;
+ }
+ }
+
+ var sortX = getKeys(points).sort(xThenY);
+ var sortY = getKeys(points).sort(yThenX);
+
+ var edgesH = {};
+ var edgesV = {};
+
+ var len = getKeys(points).length;
+ i = 0;
+ while (i < len) {
+ var currY = points[sortY[i]].y;
+ while (i < len && points[sortY[i]].y === currY) {
+ edgesH[sortY[i]] = sortY[i + 1];
+ edgesH[sortY[i + 1]] = sortY[i];
+ i += 2;
+ }
+ }
+
+ i = 0;
+ while (i < len) {
+ var currX = points[sortX[i]].x;
+ while (i < len && points[sortX[i]].x === currX) {
+ edgesV[sortX[i]] = sortX[i + 1];
+ edgesV[sortX[i + 1]] = sortX[i];
+ i += 2;
+ }
+ }
+
+ var polygons = [];
+ var edgesHKeys = getKeys(edgesH);
+ while (edgesHKeys.length > 0) {
+ var p = [[edgesHKeys[0], 0]];
+ while (true) {
+ var curr = p[p.length - 1][0];
+ var e = p[p.length - 1][1];
+ if (e === 0) {
+ var nextVertex = edgesV[curr];
+ delete edgesV[curr];
+ p.push([nextVertex, 1]);
+ }
+ else {
+ nextVertex = edgesH[curr];
+ delete edgesH[curr];
+ p.push([nextVertex, 0]);
+ }
+ if (p[p.length - 1][0] === p[0][0] && p[p.length - 1][1] === p[0][1]) {
+ p.pop();
+ break;
+ }
+ }
+ var polygon = [];
+ for (i = 0; i < p.length; i++) {
+ polygon.push(docLayer._twipsToLatLng(points[p[i][0]]));
+ delete edgesH[p[i][0]];
+ delete edgesV[p[i][0]];
+ }
+ polygon.push(docLayer._twipsToLatLng(points[p[0][0]]));
+ edgesHKeys = getKeys(edgesH);
+ polygons.push(polygon);
+ }
+ return polygons;
+};
diff --git a/loleaflet/src/layer/tile/TileLayer.js b/loleaflet/src/layer/tile/TileLayer.js
index ac74511..42a59f4 100644
--- a/loleaflet/src/layer/tile/TileLayer.js
+++ b/loleaflet/src/layer/tile/TileLayer.js
@@ -402,7 +402,7 @@ L.TileLayer = L.GridLayer.extend({
$('#scroll-container').mCustomScrollbar('scrollTo', [center.y, center.x]);
}
- var polygons = this._rectanglesToPolygons(rectangles);
+ var polygons = L.PolyUtil.rectanglesToPolygons(rectangles, this);
for (i = 0; i < polygons.length; i++) {
var selection = new L.Polygon(polygons[i], {
pointerEvents: 'none',
@@ -511,147 +511,6 @@ L.TileLayer = L.GridLayer.extend({
e.tile.onload = null;
},
- _rectanglesToPolygons: function(rectangles) {
- // algorithm found here http://stackoverflow.com/questions/13746284/merging-multiple-adjacent-rectangles-into-one-polygon
- var eps = 20;
- // Glue rectangles if the space between them is less then eps
- for (var i = 0; i < rectangles.length - 1; i++) {
- for (var j = i + 1; j < rectangles.length; j++) {
- for (var k = 0; k < rectangles[i].length; k++) {
- for (var l = 0; l < rectangles[j].length; l++) {
- if (Math.abs(rectangles[i][k].x - rectangles[j][l].x) < eps) {
- rectangles[j][l].x = rectangles[i][k].x;
- }
- if (Math.abs(rectangles[i][k].y - rectangles[j][l].y) < eps) {
- rectangles[j][l].y = rectangles[i][k].y;
- }
- }
- }
- }
- }
-
- var points = {};
- for (i = 0; i < rectangles.length; i++) {
- for (j = 0; j < rectangles[i].length; j++) {
- if (points[rectangles[i][j]]) {
- delete points[rectangles[i][j]];
- }
- else {
- points[rectangles[i][j]] = rectangles[i][j];
- }
- }
- }
-
- function getKeys(points) {
- var keys = [];
- for (var key in points) {
- if (points.hasOwnProperty(key)) {
- keys.push(key);
- }
- }
- return keys;
- }
-
- function xThenY(aStr, bStr) {
- var a = aStr.match(/\d+/g);
- a[0] = parseInt(a[0]);
- a[1] = parseInt(a[1]);
- var b = bStr.match(/\d+/g);
- b[0] = parseInt(b[0]);
- b[1] = parseInt(b[1]);
-
- if (a[0] < b[0] || (a[0] === b[0] && a[1] < b[1])) {
- return -1;
- }
- else if (a[0] === b[0] && a[1] === b[1]) {
- return 0;
- }
- else {
- return 1;
- }
- }
-
- function yThenX(aStr, bStr) {
- var a = aStr.match(/\d+/g);
- a[0] = parseInt(a[0]);
- a[1] = parseInt(a[1]);
- var b = bStr.match(/\d+/g);
- b[0] = parseInt(b[0]);
- b[1] = parseInt(b[1]);
-
- if (a[1] < b[1] || (a[1] === b[1] && a[0] < b[0])) {
- return -1;
- }
- else if (a[0] === b[0] && a[1] === b[1]) {
- return 0;
- }
- else {
- return 1;
- }
- }
-
- var sortX = getKeys(points).sort(xThenY);
- var sortY = getKeys(points).sort(yThenX);
-
- var edgesH = {};
- var edgesV = {};
-
- var len = getKeys(points).length;
- i = 0;
- while (i < len) {
- var currY = points[sortY[i]].y;
- while (i < len && points[sortY[i]].y === currY) {
- edgesH[sortY[i]] = sortY[i + 1];
- edgesH[sortY[i + 1]] = sortY[i];
- i += 2;
- }
- }
-
- i = 0;
- while (i < len) {
- var currX = points[sortX[i]].x;
- while (i < len && points[sortX[i]].x === currX) {
- edgesV[sortX[i]] = sortX[i + 1];
- edgesV[sortX[i + 1]] = sortX[i];
- i += 2;
- }
- }
-
- var polygons = [];
- var edgesHKeys = getKeys(edgesH);
- while (edgesHKeys.length > 0) {
- var p = [[edgesHKeys[0], 0]];
- while (true) {
- var curr = p[p.length - 1][0];
- var e = p[p.length - 1][1];
- if (e === 0) {
- var nextVertex = edgesV[curr];
- delete edgesV[curr];
- p.push([nextVertex, 1]);
- }
- else {
- nextVertex = edgesH[curr];
- delete edgesH[curr];
- p.push([nextVertex, 0]);
- }
- if (p[p.length - 1][0] === p[0][0] && p[p.length - 1][1] === p[0][1]) {
- p.pop();
- break;
- }
- }
- var polygon = [];
- for (i = 0; i < p.length; i++) {
- polygon.push(this._twipsToLatLng(points[p[i][0]]));
- delete edgesH[p[i][0]];
- delete edgesV[p[i][0]];
- }
- polygon.push(this._twipsToLatLng(points[p[0][0]]));
- edgesHKeys = getKeys(edgesH);
- polygons.push(polygon);
- }
- return polygons;
- },
-
_clearSelections: function () {
this._selections.clearLayers();
},
More information about the Libreoffice-commits
mailing list