Browse Source

Fix elements disappearing when scaling them near 0.

element.getCTM() returns `null` if one of the transformation matrices
is zero. This fix uses get_transform_matrix instead.
dev_h
Finn Krein 4 years ago
parent
commit
d7b341d86e
2 changed files with 29 additions and 14 deletions
  1. 21
    2
      client-data/js/intersect.js
  2. 8
    12
      client-data/tools/hand/hand.js

+ 21
- 2
client-data/js/intersect.js View File

@@ -28,6 +28,25 @@ if (!SVGGraphicsElement.prototype.transformedBBox || !SVGGraphicsElement.prototy
28 28
     [pointInTransformedBBox,
29 29
      transformedBBoxIntersects] = (function () {
30 30
 
31
+	 var get_transform_matrix = function (elem) {
32
+	     // Returns the first translate or transform matrix or makes one
33
+	     var transform = null;
34
+	     for (var i = 0; i < elem.transform.baseVal.numberOfItems; ++i) {
35
+		 var baseVal = elem.transform.baseVal[i];
36
+		 // quick tests showed that even if one changes only the fields e and f or uses createSVGTransformFromMatrix
37
+		 // the brower may add a SVG_TRANSFORM_MATRIX instead of a SVG_TRANSFORM_TRANSLATE
38
+		 if (baseVal.type === SVGTransform.SVG_TRANSFORM_MATRIX) {
39
+		     transform = baseVal;
40
+		     break;
41
+		 }
42
+	     }
43
+	     if (transform == null) {
44
+		 transform = elem.transform.baseVal.createSVGTransformFromMatrix(Tools.svg.createSVGMatrix());
45
+		 elem.transform.baseVal.appendItem(transform);
46
+	     }
47
+	     return transform.matrix;
48
+	 }
49
+
31 50
 	var transformRelative = function (m,t) {
32 51
 	    return [
33 52
 		m.a*t[0]+m.c*t[1],
@@ -44,7 +63,7 @@ if (!SVGGraphicsElement.prototype.transformedBBox || !SVGGraphicsElement.prototy
44 63
 
45 64
 	SVGGraphicsElement.prototype.transformedBBox = function (scale=1) {
46 65
 	    bbox = this.getBBox();
47
-	    tmatrix = this.getCTM();
66
+	    tmatrix = get_transform_matrix(this);
48 67
 	    tmatrix.e /= scale;
49 68
 	    tmatrix.f /= scale;
50 69
 	    return {
@@ -61,7 +80,7 @@ if (!SVGGraphicsElement.prototype.transformedBBox || !SVGGraphicsElement.prototy
61 80
 		width: this.width.baseVal.value,
62 81
 		height: this.height.baseVal.value
63 82
 	    };
64
-	    tmatrix = this.getCTM();
83
+	    tmatrix = get_transform_matrix(this);
65 84
 	    tmatrix.e /= scale;
66 85
 	    tmatrix.f /= scale;
67 86
 	    return {

+ 8
- 12
client-data/tools/hand/hand.js View File

@@ -166,7 +166,7 @@
166 166
 
167 167
 	function showSelectionButtons() {
168 168
 		var scale = getScale();
169
-		var selectionBBox = selectionRect.transformedBBox(scale);
169
+		var selectionBBox = selectionRect.transformedBBox();
170 170
 		for (var i = 0; i < selectionButtons.length; i++) {
171 171
 			selectionButtons[i].drawCallback(selectionButtons[i],
172 172
 				selectionBBox,
@@ -209,14 +209,12 @@
209 209
 		evt.preventDefault();
210 210
 		hideSelectionButtons();
211 211
 		selectorState = selectorStates.transform;
212
-		var scale = getScale();
213
-		var bbox = selectionRect.transformedBBox(scale);
212
+		var bbox = selectionRect.transformedBBox();
214 213
 		selected = {
215 214
 			x: bbox.r[0],
216 215
 			y: bbox.r[1],
217 216
 			w: bbox.a[0],
218 217
 			h: bbox.b[1],
219
-			s: scale
220 218
 		};
221 219
 		transform_elements = selected_els.map(function(el) {
222 220
 			var tmatrix = get_transform_matrix(el);
@@ -250,12 +248,11 @@
250 248
 
251 249
 
252 250
 	function calculateSelection() {
253
-		var scale = getScale();
254
-		var selectionTBBox = selectionRect.transformedBBox(scale);
251
+		var selectionTBBox = selectionRect.transformedBBox();
255 252
 		var elements = Tools.drawingArea.children;
256 253
 		var selected = [];
257 254
 		for (var i=0; i < elements.length; i++) {
258
-			if (transformedBBoxIntersects(selectionTBBox, elements[i].transformedBBox(scale)))
255
+			if (transformedBBoxIntersects(selectionTBBox, elements[i].transformedBBox()))
259 256
 				selected.push(Tools.drawingArea.children[i]);
260 257
 		}
261 258
 		return selected;
@@ -297,11 +294,10 @@
297 294
 	function scaleSelection(x, y) {
298 295
 		var rx = (x - selected.x)/(selected.w);
299 296
 		var ry = (y - selected.y)/(selected.h);
300
-		var scale = getScale();
301 297
 		var msgs = selected_els.map(function(el, i) {
302 298
 			var oldTransform = transform_elements[i];
303
-			var x = el.transformedBBox(scale).r[0];
304
-			var y = el.transformedBBox(scale).r[1];
299
+			var x = el.transformedBBox().r[0];
300
+			var y = el.transformedBBox().r[1];
305 301
 			var a = oldTransform.a * rx;
306 302
 			var d = oldTransform.d * ry;
307 303
 			var e = selected.x * (1 - rx) - x * a +
@@ -349,7 +345,7 @@
349 345
 	}
350 346
 
351 347
 	function resetSelectionRect() {
352
-		var bbox = selectionRect.transformedBBox(getScale());
348
+		var bbox = selectionRect.transformedBBox();
353 349
 		var tmatrix = get_transform_matrix(selectionRect);
354 350
 		selectionRect.x.baseVal.value = bbox.r[0];
355 351
 		selectionRect.y.baseVal.value = bbox.r[1];
@@ -418,7 +414,7 @@
418 414
 		}
419 415
 		if (button) {
420 416
 			button.clickCallback(x, y, evt);
421
-		} else if (pointInTransformedBBox([x, y], selectionRect.transformedBBox(scale))) {
417
+		} else if (pointInTransformedBBox([x, y], selectionRect.transformedBBox())) {
422 418
 			hideSelectionButtons();
423 419
 			startMovingElements(x, y, evt);
424 420
 		} else if (Tools.drawingArea.contains(evt.target)) {

Loading…
Cancel
Save