redhotmagma-visualization 1.46.2 → 1.46.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -47,6 +47,49 @@ var getRotateValue = function getRotateValue(node) {
47
47
  }
48
48
  return 0;
49
49
  };
50
+ var getTranslateValues = function getTranslateValues(node) {
51
+ var transform = node.getAttribute("transform") || "";
52
+ var matches = transform.match(/translate\(([^)]+)\)/);
53
+ if (matches) {
54
+ var _matches$1$split$map3 = matches[1].split(",").map(window.parseFloat),
55
+ _matches$1$split$map4 = _slicedToArray(_matches$1$split$map3, 2),
56
+ x = _matches$1$split$map4[0],
57
+ y = _matches$1$split$map4[1];
58
+ return [x, y || x];
59
+ }
60
+ return [0, 0];
61
+ };
62
+ var getPositionValues = function getPositionValues(node) {
63
+ var x = parseFloat(node.getAttribute("x")) || 0;
64
+ var y = parseFloat(node.getAttribute("y")) || 0;
65
+ return [x, y];
66
+ };
67
+ var getWorldTransformValues = function getWorldTransformValues(node) {
68
+ var _node$parentNode;
69
+ var values = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
70
+ translate: [0, 0],
71
+ scale: [1, 1],
72
+ rotate: 0
73
+ };
74
+ var _getScaleValues = getScaleValues(node),
75
+ _getScaleValues2 = _slicedToArray(_getScaleValues, 2),
76
+ sx = _getScaleValues2[0],
77
+ sy = _getScaleValues2[1];
78
+ var _getTranslateValues = getTranslateValues(node),
79
+ _getTranslateValues2 = _slicedToArray(_getTranslateValues, 2),
80
+ tx = _getTranslateValues2[0],
81
+ ty = _getTranslateValues2[1];
82
+ var r = getRotateValue(node);
83
+ values.translate[0] = values.translate[0] * sx + tx;
84
+ values.translate[1] = values.translate[1] * sy + ty;
85
+ values.scale[0] *= sx;
86
+ values.scale[1] *= sy;
87
+ values.rotate += r;
88
+ if ((_node$parentNode = node.parentNode) !== null && _node$parentNode !== void 0 && _node$parentNode.getAttribute) {
89
+ getWorldTransformValues(node.parentNode, values);
90
+ }
91
+ return values;
92
+ };
50
93
  var getSizeValues = function getSizeValues(svgNode) {
51
94
  return [parseFloat(svgNode.getAttribute("width")) || 0, parseFloat(svgNode.getAttribute("height")) || 0];
52
95
  };
@@ -98,52 +141,51 @@ var svgToImg = /*#__PURE__*/function () {
98
141
  }();
99
142
  var applyOnEmbeddedSvg = /*#__PURE__*/function () {
100
143
  var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(imageNode, imageCanvas, ctx, rootSvgElement) {
101
- var outermostGroup, _getScaleValues, _getScaleValues2, rootScaleX, rootScaleY, _getScaleValues3, _getScaleValues4, imgScaleX, imgScaleY, _getSizeValues, _getSizeValues2, rootWidth, canvasWidth, svgToCanvasRatio, scaleX, scaleY, size, _createWorkingCanvas3, _createWorkingCanvas4, tmpCanvas, tmpCtx, svgAsString, svgDoc, svgElement, x, y, angle;
144
+ var _getSizeValues, _getSizeValues2, rootWidth, canvasWidth, svgToCanvasRatio, worldTransformValues, scaleX, scaleY, size, _createWorkingCanvas3, _createWorkingCanvas4, tmpCanvas, tmpCtx, svgAsString, svgDoc, svgElement, _worldTransformValues, wx, wy, _getPositionValues, _getPositionValues2, px, py, angle;
102
145
  return _regeneratorRuntime().wrap(function _callee2$(_context2) {
103
146
  while (1) switch (_context2.prev = _context2.next) {
104
147
  case 0:
105
- outermostGroup = findOutermostNode(imageNode, rootSvgElement);
106
- _getScaleValues = getScaleValues(outermostGroup), _getScaleValues2 = _slicedToArray(_getScaleValues, 2), rootScaleX = _getScaleValues2[0], rootScaleY = _getScaleValues2[1];
107
- _getScaleValues3 = getScaleValues(imageNode), _getScaleValues4 = _slicedToArray(_getScaleValues3, 2), imgScaleX = _getScaleValues4[0], imgScaleY = _getScaleValues4[1];
108
148
  _getSizeValues = getSizeValues(rootSvgElement), _getSizeValues2 = _slicedToArray(_getSizeValues, 1), rootWidth = _getSizeValues2[0];
109
149
  canvasWidth = imageCanvas.width;
110
150
  svgToCanvasRatio = canvasWidth / rootWidth;
111
- scaleX = imgScaleX * rootScaleX * svgToCanvasRatio;
112
- scaleY = imgScaleY * rootScaleY * svgToCanvasRatio;
151
+ worldTransformValues = getWorldTransformValues(imageNode);
152
+ scaleX = worldTransformValues.scale[0] * svgToCanvasRatio;
153
+ scaleY = worldTransformValues.scale[1] * svgToCanvasRatio;
113
154
  size = {
114
155
  width: parseFloat(imageNode.getAttribute("width")) * scaleX,
115
156
  height: parseFloat(imageNode.getAttribute("height")) * scaleY
116
157
  };
117
158
  _createWorkingCanvas3 = (0, _createCanvas.createWorkingCanvas)(size), _createWorkingCanvas4 = _slicedToArray(_createWorkingCanvas3, 2), tmpCanvas = _createWorkingCanvas4[0], tmpCtx = _createWorkingCanvas4[1];
118
- _context2.prev = 10;
159
+ _context2.prev = 8;
119
160
  svgAsString = window.atob(getImageSrc(imageNode).substring(SVG_DATA_URL_HDR.length));
120
161
  svgDoc = new DOMParser().parseFromString(svgAsString, "image/svg+xml");
121
162
  svgElement = svgDoc.getElementsByTagName("svg")[0];
122
- _context2.next = 16;
163
+ _context2.next = 14;
123
164
  return Promise.all(Array.from(svgElement.childNodes).map(applyOnChildNode(tmpCanvas, tmpCtx, svgElement)));
124
- case 16:
165
+ case 14:
125
166
  ctx.save();
126
167
 
127
168
  // apply element transformations
128
- x = parseFloat(imageNode.getAttribute("x"));
129
- y = parseFloat(imageNode.getAttribute("y"));
130
- angle = getRotateValue(imageNode) / 180 * Math.PI;
169
+ _worldTransformValues = _slicedToArray(worldTransformValues.translate, 2), wx = _worldTransformValues[0], wy = _worldTransformValues[1];
170
+ _getPositionValues = getPositionValues(imageNode), _getPositionValues2 = _slicedToArray(_getPositionValues, 2), px = _getPositionValues2[0], py = _getPositionValues2[1];
171
+ angle = worldTransformValues.rotate / 180 * Math.PI;
172
+ ctx.translate(wx * svgToCanvasRatio, wy * svgToCanvasRatio);
131
173
  ctx.rotate(angle);
132
- ctx.translate(x * scaleX, y * scaleY);
174
+ ctx.translate(px * scaleX, py * scaleY);
133
175
  ctx.drawImage(tmpCanvas, 0, 0);
134
176
  ctx.restore();
135
- _context2.next = 29;
177
+ _context2.next = 28;
136
178
  break;
137
- case 26:
138
- _context2.prev = 26;
139
- _context2.t0 = _context2["catch"](10);
179
+ case 25:
180
+ _context2.prev = 25;
181
+ _context2.t0 = _context2["catch"](8);
140
182
  // eslint-disable-next-line no-console
141
183
  console.error("Error during embedded svg image processing!", _context2.t0);
142
- case 29:
184
+ case 28:
143
185
  case "end":
144
186
  return _context2.stop();
145
187
  }
146
- }, _callee2, null, [[10, 26]]);
188
+ }, _callee2, null, [[8, 25]]);
147
189
  }));
148
190
  return function applyOnEmbeddedSvg(_x2, _x3, _x4, _x5) {
149
191
  return _ref2.apply(this, arguments);
@@ -275,10 +317,10 @@ var setSvgSize = function setSvgSize(svgElement, _ref4) {
275
317
  var updateViewGroupScale = function updateViewGroupScale(svgElement, ratio) {
276
318
  var viewGroup = svgElement.getElementById("viewGroup");
277
319
  if (viewGroup) {
278
- var _getScaleValues5 = getScaleValues(viewGroup),
279
- _getScaleValues6 = _slicedToArray(_getScaleValues5, 2),
280
- sx = _getScaleValues6[0],
281
- sy = _getScaleValues6[1];
320
+ var _getScaleValues3 = getScaleValues(viewGroup),
321
+ _getScaleValues4 = _slicedToArray(_getScaleValues3, 2),
322
+ sx = _getScaleValues4[0],
323
+ sy = _getScaleValues4[1];
282
324
  viewGroup.setAttribute("transform", "scale(".concat(sx / ratio, ",").concat(sy / ratio, ")"));
283
325
  }
284
326
  };
@@ -321,7 +363,7 @@ var createEffectImg = function () {
321
363
  var cache = (0, _createCache.createCache)(10);
322
364
  return /*#__PURE__*/function () {
323
365
  var _createEffectImg = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(svgAsString, srcCanvas) {
324
- var key, cachedResult, svgDoc, svgElement, _getSizeValues3, _getSizeValues4, cWidth, cHeight, aspectRatio, width, height, _createWorkingCanvas11, _createWorkingCanvas12, imageCanvas, ctx, designerLayer, childNodes, image, _getScaleValues7, _getScaleValues8, sx, sy, resultImgPromise;
366
+ var key, cachedResult, svgDoc, svgElement, _getSizeValues3, _getSizeValues4, cWidth, cHeight, aspectRatio, width, height, _createWorkingCanvas11, _createWorkingCanvas12, imageCanvas, ctx, designerLayer, childNodes, image, _getScaleValues5, _getScaleValues6, sx, sy, resultImgPromise;
325
367
  return _regeneratorRuntime().wrap(function _callee4$(_context4) {
326
368
  while (1) switch (_context4.prev = _context4.next) {
327
369
  case 0:
@@ -361,7 +403,7 @@ var createEffectImg = function () {
361
403
  image.width.baseVal.value = width;
362
404
  image.height.baseVal.value = height;
363
405
  image.href.baseVal = imageCanvas.toDataURL();
364
- _getScaleValues7 = getScaleValues(findOutermostNode(designerLayer, svgElement)), _getScaleValues8 = _slicedToArray(_getScaleValues7, 2), sx = _getScaleValues8[0], sy = _getScaleValues8[1];
406
+ _getScaleValues5 = getScaleValues(findOutermostNode(designerLayer, svgElement)), _getScaleValues6 = _slicedToArray(_getScaleValues5, 2), sx = _getScaleValues6[0], sy = _getScaleValues6[1];
365
407
  image.setAttribute("transform", "scale(".concat(1 / sx, ",").concat(1 / sy, ")"));
366
408
  designerLayer.innerHTML = "";
367
409
  designerLayer.appendChild(image);
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "redhotmagma-visualization",
3
- "version": "1.46.2",
3
+ "version": "1.46.3",
4
4
  "license": "UNLICENSED",
5
5
  "private": false,
6
6
  "main": "./index.js",
7
7
  "dependencies": {
8
8
  "@babel/polyfill": "^7.12.1",
9
- "@configuratorware/scripts": "1.46.2",
9
+ "@configuratorware/scripts": "1.46.3",
10
10
  "@tweenjs/tween.js": "^17.6.0",
11
11
  "console-polyfill": "^0.3.0",
12
12
  "css-element-queries": "^1.2.3",
@@ -27,6 +27,37 @@ const getRotateValue = node => {
27
27
  return 0;
28
28
  };
29
29
 
30
+ const getTranslateValues = node => {
31
+ const transform = node.getAttribute("transform") || "";
32
+ const matches = transform.match(/translate\(([^)]+)\)/);
33
+ if (matches) {
34
+ const [x, y] = matches[1].split(",").map(window.parseFloat);
35
+ return [x, y || x];
36
+ }
37
+ return [0, 0];
38
+ };
39
+
40
+ const getPositionValues = node => {
41
+ const x = parseFloat(node.getAttribute("x")) || 0;
42
+ const y = parseFloat(node.getAttribute("y")) || 0;
43
+ return [x, y];
44
+ };
45
+
46
+ const getWorldTransformValues = (node, values = { translate: [0, 0], scale: [1, 1], rotate: 0 }) => {
47
+ const [sx, sy] = getScaleValues(node);
48
+ const [tx, ty] = getTranslateValues(node);
49
+ const r = getRotateValue(node);
50
+ values.translate[0] = values.translate[0] * sx + tx;
51
+ values.translate[1] = values.translate[1] * sy + ty;
52
+ values.scale[0] *= sx;
53
+ values.scale[1] *= sy;
54
+ values.rotate += r;
55
+ if (node.parentNode?.getAttribute) {
56
+ getWorldTransformValues(node.parentNode, values);
57
+ }
58
+ return values;
59
+ };
60
+
30
61
  const getSizeValues = svgNode => {
31
62
  return [
32
63
  parseFloat(svgNode.getAttribute("width")) || 0,
@@ -66,16 +97,14 @@ const svgToImg = async svgElement => {
66
97
  };
67
98
 
68
99
  const applyOnEmbeddedSvg = async (imageNode, imageCanvas, ctx, rootSvgElement) => {
69
- const outermostGroup = findOutermostNode(imageNode, rootSvgElement);
70
- const [rootScaleX, rootScaleY] = getScaleValues(outermostGroup);
71
- const [imgScaleX, imgScaleY] = getScaleValues(imageNode);
72
-
73
100
  const [rootWidth] = getSizeValues(rootSvgElement);
74
101
  const { width: canvasWidth } = imageCanvas;
75
102
  const svgToCanvasRatio = canvasWidth / rootWidth;
76
103
 
77
- const scaleX = imgScaleX * rootScaleX * svgToCanvasRatio;
78
- const scaleY = imgScaleY * rootScaleY * svgToCanvasRatio;
104
+ const worldTransformValues = getWorldTransformValues(imageNode);
105
+
106
+ const scaleX = worldTransformValues.scale[0] * svgToCanvasRatio;
107
+ const scaleY = worldTransformValues.scale[1] * svgToCanvasRatio;
79
108
 
80
109
  const size = {
81
110
  width: parseFloat(imageNode.getAttribute("width")) * scaleX,
@@ -95,12 +124,13 @@ const applyOnEmbeddedSvg = async (imageNode, imageCanvas, ctx, rootSvgElement) =
95
124
  ctx.save();
96
125
 
97
126
  // apply element transformations
98
- const x = parseFloat(imageNode.getAttribute("x"));
99
- const y = parseFloat(imageNode.getAttribute("y"));
100
- const angle = (getRotateValue(imageNode) / 180) * Math.PI;
127
+ const [wx, wy] = worldTransformValues.translate;
128
+ const [px, py] = getPositionValues(imageNode);
129
+ const angle = (worldTransformValues.rotate / 180) * Math.PI;
101
130
 
131
+ ctx.translate(wx * svgToCanvasRatio, wy * svgToCanvasRatio);
102
132
  ctx.rotate(angle);
103
- ctx.translate(x * scaleX, y * scaleY);
133
+ ctx.translate(px * scaleX, py * scaleY);
104
134
 
105
135
  ctx.drawImage(tmpCanvas, 0, 0);
106
136
  ctx.restore();
@@ -114,7 +144,10 @@ const getImageSrc = imageNode =>
114
144
  imageNode.getAttribute("href") || imageNode.getAttribute("xlink:href");
115
145
 
116
146
  const applyOnChildNode = (imageCanvas, ctx, svgElement) => async node => {
117
- if (node.nodeType === 3 /** ignore text nodes **/ || node.getAttribute("visibility") === "hidden") {
147
+ if (
148
+ node.nodeType === 3 /** ignore text nodes **/ ||
149
+ node.getAttribute("visibility") === "hidden"
150
+ ) {
118
151
  return;
119
152
  }
120
153
  if (node.tagName === "image") {