redhotmagma-visualization 1.28.4 → 1.29.0
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.
- package/AlignTargetProvider.js +129 -0
- package/CommonUtils/Deferred.js +135 -0
- package/CommonUtils/Observable.js +126 -0
- package/CommonUtils/PropertyObserver.js +61 -0
- package/CommonUtils/SyncCurrentFunction.js +59 -0
- package/CommonUtils/SyncObservableEvent.js +19 -0
- package/CommonUtils/pointerEvent.js +415 -0
- package/Constants.js +23 -0
- package/DevApp.js +1049 -0
- package/ExposedModules.js +26 -0
- package/FallbackVisualization.js +26 -0
- package/PrintingEffects/ColorEmbossingEffect.js +58 -0
- package/PrintingEffects/DomingEffect.js +150 -0
- package/PrintingEffects/EmbossingEffect.js +65 -0
- package/PrintingEffects/EmbroideryEffect.js +541 -0
- package/PrintingEffects/EngravingEffect.js +65 -0
- package/PrintingEffects/PrintingEffects.js +117 -0
- package/PrintingEffects/PrintingEffectsUtils.js +53 -0
- package/PrintingEffects/resources/embroidery_multiply.jpg +0 -0
- package/PrintingEffects/resources/embroidery_screen.jpg +0 -0
- package/README.md +11 -4
- package/React/ReactBase.js +111 -0
- package/Three/Controls/OrbitControls.js +745 -0
- package/Three/Exporters/glTFExporter.js +48 -0
- package/Three/Loaders/ColladaLoader.js +2916 -0
- package/Three/Loaders/MTLLoader.js +449 -0
- package/Three/Loaders/OBJLoader.js +548 -0
- package/Three/Three2D.js +1790 -0
- package/Three/Three2DLayers.js +504 -0
- package/Three/Three3D.js +1412 -0
- package/Three/Three3DScene.js +1432 -0
- package/Three/ThreeBase.js +724 -0
- package/Utils/DesignArea/getDesignAreaCanvasSize.js +32 -0
- package/Utils/TextureBuilder/createTextureBuilder.js +334 -0
- package/Utils/TextureBuilder/textureBuilderFunctions.js +87 -0
- package/Utils/alignToElement.js +58 -0
- package/Utils/createAlphaMapFromAlphaChannel.js +50 -0
- package/Utils/createCache.js +46 -0
- package/Utils/createCanvas.js +29 -0
- package/Utils/createImageRepository.js +124 -0
- package/Utils/disposeMaterial.js +41 -0
- package/Utils/getImageSize.js +15 -0
- package/Utils/imagePreloader.js +76 -0
- package/Utils/initTextureCanvas.js +49 -0
- package/Utils/isMobileDevice.js +19 -0
- package/Utils/optimizeTextureImage.js +73 -0
- package/Utils/rememberCameraViewOffset.js +21 -0
- package/Utils/removeObject.js +22 -0
- package/Utils/restrictCameraMovement.js +45 -0
- package/Utils/setOrthographicCameraSize.js +16 -0
- package/Utils/updateFitSizeToElement.js +39 -0
- package/VisualizationContainer.js +279 -0
- package/VisualizationInterface.js +298 -0
- package/VisualizationProvider.js +38 -0
- package/__mocks__/exportedSample.svg +45 -0
- package/index.js +16 -0
- package/package.json +10 -70
- package/scripts/cpPublic.js +9 -12
- package/scripts/cpPublicLocal.js +30 -0
- package/src/CommonUtils/Observable.js +1 -0
- package/src/CommonUtils/pointerEvent.js +2 -1
- package/src/DevApp.js +2 -1
- package/src/FallbackVisualization.js +1 -5
- package/src/PrintingEffects/DomingEffect.js +1 -0
- package/src/PrintingEffects/EmbroideryEffect.js +3 -2
- package/src/React/ReactBase.js +1 -1
- package/src/Three/Controls/OrbitControls.js +2 -0
- package/src/Three/Loaders/ColladaLoader.js +111 -294
- package/src/Three/Loaders/MTLLoader.js +2 -0
- package/src/Three/Loaders/OBJLoader.js +2 -0
- package/src/Three/Three2D.js +18 -11
- package/src/Three/Three3D.js +9 -1
- package/src/Three/ThreeBase.js +14 -2
- package/src/Utils/DesignArea/getDesignAreaCanvasSize.js +1 -0
- package/src/Utils/TextureBuilder/createTextureBuilder.js +2 -0
- package/src/Utils/imagePreloader.js +1 -0
- package/src/Utils/initTextureCanvas.js +3 -0
- package/src/Utils/isMobileDevice.js +2 -0
- package/src/Utils/optimizeTextureImage.js +1 -0
- package/src/VisualizationContainer.js +3 -1
- package/src/VisualizationInterface.js +10 -1
- package/visualizationAdapterCreator.js +76 -0
- package/babel.config.js +0 -41
- package/scripts/cpPath.js +0 -151
- package/scripts/moveLibToPackageRoot.js +0 -44
- package/scripts/utils/fileSystem.js +0 -69
- package/scripts/utils/process.js +0 -19
- package/tsconfig.json +0 -22
|
@@ -0,0 +1,541 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.embroideryEffect = embroideryEffect;
|
|
7
|
+
|
|
8
|
+
var _createCanvas = require("../Utils/createCanvas");
|
|
9
|
+
|
|
10
|
+
var _imagePreloader = require("../Utils/imagePreloader");
|
|
11
|
+
|
|
12
|
+
var _createCache = require("../Utils/createCache");
|
|
13
|
+
|
|
14
|
+
var _embroidery_screen = _interopRequireDefault(require("./resources/embroidery_screen.jpg"));
|
|
15
|
+
|
|
16
|
+
var _embroidery_multiply = _interopRequireDefault(require("./resources/embroidery_multiply.jpg"));
|
|
17
|
+
|
|
18
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
|
19
|
+
|
|
20
|
+
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
|
|
21
|
+
|
|
22
|
+
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
23
|
+
|
|
24
|
+
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
25
|
+
|
|
26
|
+
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
27
|
+
|
|
28
|
+
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
29
|
+
|
|
30
|
+
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
|
31
|
+
|
|
32
|
+
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
|
33
|
+
|
|
34
|
+
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
|
35
|
+
|
|
36
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
37
|
+
|
|
38
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
39
|
+
|
|
40
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
41
|
+
|
|
42
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
43
|
+
|
|
44
|
+
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
45
|
+
|
|
46
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
47
|
+
|
|
48
|
+
var imagePreloader = (0, _imagePreloader.createImagePreloader)([_embroidery_screen["default"], _embroidery_multiply["default"]]);
|
|
49
|
+
var SVG_DATA_URL_HDR = "data:image/svg+xml;base64,";
|
|
50
|
+
|
|
51
|
+
var getScaleValues = function getScaleValues(node) {
|
|
52
|
+
var transform = node.getAttribute("transform") || "";
|
|
53
|
+
var matches = transform.match(/scale\(([^)]+)\)/);
|
|
54
|
+
|
|
55
|
+
if (matches) {
|
|
56
|
+
var _matches$1$split$map = matches[1].split(",").map(window.parseFloat),
|
|
57
|
+
_matches$1$split$map2 = _slicedToArray(_matches$1$split$map, 2),
|
|
58
|
+
x = _matches$1$split$map2[0],
|
|
59
|
+
y = _matches$1$split$map2[1];
|
|
60
|
+
|
|
61
|
+
return [x, y || x];
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return [1, 1];
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
var getRotateValue = function getRotateValue(node) {
|
|
68
|
+
var transform = node.getAttribute("transform") || "";
|
|
69
|
+
var matches = transform.match(/rotate\(([^)]+)\)/);
|
|
70
|
+
|
|
71
|
+
if (matches) {
|
|
72
|
+
return window.parseFloat(matches[1]);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return 0;
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
var getSizeValues = function getSizeValues(svgNode) {
|
|
79
|
+
return [parseFloat(svgNode.getAttribute("width")) || 0, parseFloat(svgNode.getAttribute("height")) || 0];
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
var findOutermostNode = function findOutermostNode(node, container) {
|
|
83
|
+
return node.parentNode ? node.parentNode === container ? node : findOutermostNode(node.parentNode, container) : node;
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
var svgToImg = /*#__PURE__*/function () {
|
|
87
|
+
var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(svgElement) {
|
|
88
|
+
var svgImg;
|
|
89
|
+
return regeneratorRuntime.wrap(function _callee$(_context) {
|
|
90
|
+
while (1) {
|
|
91
|
+
switch (_context.prev = _context.next) {
|
|
92
|
+
case 0:
|
|
93
|
+
_context.next = 2;
|
|
94
|
+
return new Promise(function (resolve, reject) {
|
|
95
|
+
var img = document.createElement("img");
|
|
96
|
+
|
|
97
|
+
img.onload = function () {
|
|
98
|
+
return resolve(img);
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
img.onerror = reject;
|
|
102
|
+
var xml = _typeof(svgElement) === "object" ? new XMLSerializer().serializeToString(svgElement) : svgElement;
|
|
103
|
+
var svg64 = btoa(xml);
|
|
104
|
+
img.src = "data:image/svg+xml;base64," + svg64;
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
case 2:
|
|
108
|
+
svgImg = _context.sent;
|
|
109
|
+
_context.next = 5;
|
|
110
|
+
return new Promise(function (resolve) {
|
|
111
|
+
setTimeout(function () {
|
|
112
|
+
// some browsers may have issues with applying effects on images with svg source
|
|
113
|
+
// therefore it has to be converted to a canvas before
|
|
114
|
+
// it also has to be performed in a new event to make sure the image content is available
|
|
115
|
+
var _createWorkingCanvas = (0, _createCanvas.createWorkingCanvas)(svgImg, true),
|
|
116
|
+
_createWorkingCanvas2 = _slicedToArray(_createWorkingCanvas, 1),
|
|
117
|
+
svgCanvas = _createWorkingCanvas2[0];
|
|
118
|
+
|
|
119
|
+
resolve(svgCanvas);
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
case 5:
|
|
124
|
+
return _context.abrupt("return", _context.sent);
|
|
125
|
+
|
|
126
|
+
case 6:
|
|
127
|
+
case "end":
|
|
128
|
+
return _context.stop();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}, _callee);
|
|
132
|
+
}));
|
|
133
|
+
|
|
134
|
+
return function svgToImg(_x) {
|
|
135
|
+
return _ref.apply(this, arguments);
|
|
136
|
+
};
|
|
137
|
+
}();
|
|
138
|
+
|
|
139
|
+
var applyOnEmbeddedSvg = /*#__PURE__*/function () {
|
|
140
|
+
var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(imageNode, imageCanvas, ctx, rootSvgElement) {
|
|
141
|
+
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;
|
|
142
|
+
|
|
143
|
+
return regeneratorRuntime.wrap(function _callee2$(_context2) {
|
|
144
|
+
while (1) {
|
|
145
|
+
switch (_context2.prev = _context2.next) {
|
|
146
|
+
case 0:
|
|
147
|
+
outermostGroup = findOutermostNode(imageNode, rootSvgElement);
|
|
148
|
+
_getScaleValues = getScaleValues(outermostGroup), _getScaleValues2 = _slicedToArray(_getScaleValues, 2), rootScaleX = _getScaleValues2[0], rootScaleY = _getScaleValues2[1];
|
|
149
|
+
_getScaleValues3 = getScaleValues(imageNode), _getScaleValues4 = _slicedToArray(_getScaleValues3, 2), imgScaleX = _getScaleValues4[0], imgScaleY = _getScaleValues4[1];
|
|
150
|
+
_getSizeValues = getSizeValues(rootSvgElement), _getSizeValues2 = _slicedToArray(_getSizeValues, 1), rootWidth = _getSizeValues2[0];
|
|
151
|
+
canvasWidth = imageCanvas.width;
|
|
152
|
+
svgToCanvasRatio = canvasWidth / rootWidth;
|
|
153
|
+
scaleX = imgScaleX * rootScaleX * svgToCanvasRatio;
|
|
154
|
+
scaleY = imgScaleY * rootScaleY * svgToCanvasRatio;
|
|
155
|
+
size = {
|
|
156
|
+
width: parseFloat(imageNode.getAttribute("width")) * scaleX,
|
|
157
|
+
height: parseFloat(imageNode.getAttribute("height")) * scaleY
|
|
158
|
+
};
|
|
159
|
+
_createWorkingCanvas3 = (0, _createCanvas.createWorkingCanvas)(size), _createWorkingCanvas4 = _slicedToArray(_createWorkingCanvas3, 2), tmpCanvas = _createWorkingCanvas4[0], tmpCtx = _createWorkingCanvas4[1];
|
|
160
|
+
_context2.prev = 10;
|
|
161
|
+
svgAsString = window.atob(getImageSrc(imageNode).substring(SVG_DATA_URL_HDR.length));
|
|
162
|
+
svgDoc = new DOMParser().parseFromString(svgAsString, "image/svg+xml");
|
|
163
|
+
svgElement = svgDoc.getElementsByTagName("svg")[0];
|
|
164
|
+
_context2.next = 16;
|
|
165
|
+
return Promise.all(Array.from(svgElement.childNodes).map(applyOnChildNode(tmpCanvas, tmpCtx, svgElement)));
|
|
166
|
+
|
|
167
|
+
case 16:
|
|
168
|
+
ctx.save(); // apply element transformations
|
|
169
|
+
|
|
170
|
+
x = parseFloat(imageNode.getAttribute("x"));
|
|
171
|
+
y = parseFloat(imageNode.getAttribute("y"));
|
|
172
|
+
angle = getRotateValue(imageNode) / 180 * Math.PI;
|
|
173
|
+
ctx.rotate(angle);
|
|
174
|
+
ctx.translate(x * scaleX, y * scaleY);
|
|
175
|
+
ctx.drawImage(tmpCanvas, 0, 0);
|
|
176
|
+
ctx.restore();
|
|
177
|
+
_context2.next = 29;
|
|
178
|
+
break;
|
|
179
|
+
|
|
180
|
+
case 26:
|
|
181
|
+
_context2.prev = 26;
|
|
182
|
+
_context2.t0 = _context2["catch"](10);
|
|
183
|
+
// eslint-disable-next-line no-console
|
|
184
|
+
console.error("Error during embedded svg image processing!", _context2.t0);
|
|
185
|
+
|
|
186
|
+
case 29:
|
|
187
|
+
case "end":
|
|
188
|
+
return _context2.stop();
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}, _callee2, null, [[10, 26]]);
|
|
192
|
+
}));
|
|
193
|
+
|
|
194
|
+
return function applyOnEmbeddedSvg(_x2, _x3, _x4, _x5) {
|
|
195
|
+
return _ref2.apply(this, arguments);
|
|
196
|
+
};
|
|
197
|
+
}();
|
|
198
|
+
|
|
199
|
+
var getImageSrc = function getImageSrc(imageNode) {
|
|
200
|
+
return imageNode.getAttribute("href") || imageNode.getAttribute("xlink:href");
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
var applyOnChildNode = function applyOnChildNode(imageCanvas, ctx, svgElement) {
|
|
204
|
+
return /*#__PURE__*/function () {
|
|
205
|
+
var _ref3 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3(node) {
|
|
206
|
+
var partialSvg, img, rotation, _createWorkingCanvas5, _createWorkingCanvas6, multiplyPatternCanvas, multiplyPatternContext, patternSize, _createWorkingCanvas7, _createWorkingCanvas8, screenPatternCanvas, screenPatternContext, _createWorkingCanvas9, _createWorkingCanvas10, ocvs, octx;
|
|
207
|
+
|
|
208
|
+
return regeneratorRuntime.wrap(function _callee3$(_context3) {
|
|
209
|
+
while (1) {
|
|
210
|
+
switch (_context3.prev = _context3.next) {
|
|
211
|
+
case 0:
|
|
212
|
+
if (!(node.getAttribute("visibility") === "hidden")) {
|
|
213
|
+
_context3.next = 2;
|
|
214
|
+
break;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
return _context3.abrupt("return");
|
|
218
|
+
|
|
219
|
+
case 2:
|
|
220
|
+
if (!(node.tagName === "image")) {
|
|
221
|
+
_context3.next = 7;
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
if (!getImageSrc(node).startsWith(SVG_DATA_URL_HDR)) {
|
|
226
|
+
_context3.next = 7;
|
|
227
|
+
break;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
_context3.next = 6;
|
|
231
|
+
return applyOnEmbeddedSvg(node, imageCanvas, ctx, svgElement);
|
|
232
|
+
|
|
233
|
+
case 6:
|
|
234
|
+
return _context3.abrupt("return");
|
|
235
|
+
|
|
236
|
+
case 7:
|
|
237
|
+
partialSvg = createSvgChunk(imageCanvas, svgElement, node);
|
|
238
|
+
|
|
239
|
+
if (partialSvg) {
|
|
240
|
+
_context3.next = 10;
|
|
241
|
+
break;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
return _context3.abrupt("return");
|
|
245
|
+
|
|
246
|
+
case 10:
|
|
247
|
+
_context3.next = 12;
|
|
248
|
+
return svgToImg(partialSvg);
|
|
249
|
+
|
|
250
|
+
case 12:
|
|
251
|
+
img = _context3.sent;
|
|
252
|
+
rotation = Math.random() * Math.PI;
|
|
253
|
+
_createWorkingCanvas5 = (0, _createCanvas.createWorkingCanvas)(imageCanvas), _createWorkingCanvas6 = _slicedToArray(_createWorkingCanvas5, 2), multiplyPatternCanvas = _createWorkingCanvas6[0], multiplyPatternContext = _createWorkingCanvas6[1];
|
|
254
|
+
multiplyPatternContext.fillStyle = ctx.createPattern(imagePreloader.get(_embroidery_multiply["default"]), "repeat");
|
|
255
|
+
patternSize = Math.max(img.width, img.height) * 4;
|
|
256
|
+
multiplyPatternContext.rotate(rotation);
|
|
257
|
+
multiplyPatternContext.fillRect(-patternSize / 2, -patternSize / 2, patternSize, patternSize);
|
|
258
|
+
_createWorkingCanvas7 = (0, _createCanvas.createWorkingCanvas)(imageCanvas), _createWorkingCanvas8 = _slicedToArray(_createWorkingCanvas7, 2), screenPatternCanvas = _createWorkingCanvas8[0], screenPatternContext = _createWorkingCanvas8[1];
|
|
259
|
+
screenPatternContext.fillStyle = ctx.createPattern(imagePreloader.get(_embroidery_screen["default"]), "repeat");
|
|
260
|
+
screenPatternContext.rotate(rotation);
|
|
261
|
+
screenPatternContext.fillRect(-patternSize / 2, -patternSize / 2, patternSize, patternSize);
|
|
262
|
+
_createWorkingCanvas9 = (0, _createCanvas.createWorkingCanvas)(imageCanvas), _createWorkingCanvas10 = _slicedToArray(_createWorkingCanvas9, 2), ocvs = _createWorkingCanvas10[0], octx = _createWorkingCanvas10[1]; // Add multiply Effect
|
|
263
|
+
|
|
264
|
+
octx.globalCompositeOperation = "destination-atop";
|
|
265
|
+
octx.drawImage(multiplyPatternCanvas, 0, 0);
|
|
266
|
+
octx.drawImage(img, 0, 0);
|
|
267
|
+
ctx.globalCompositeOperation = "screen";
|
|
268
|
+
ctx.drawImage(ocvs, 0, 0); // Add Screen Effect
|
|
269
|
+
|
|
270
|
+
octx.globalCompositeOperation = "destination-atop";
|
|
271
|
+
octx.drawImage(screenPatternCanvas, 0, 0);
|
|
272
|
+
octx.drawImage(img, 0, 0);
|
|
273
|
+
ctx.globalCompositeOperation = "multiply";
|
|
274
|
+
ctx.drawImage(ocvs, 0, 0); // Draw SVG again behind
|
|
275
|
+
|
|
276
|
+
ctx.globalCompositeOperation = "multiply";
|
|
277
|
+
ctx.drawImage(img, 0, 0);
|
|
278
|
+
|
|
279
|
+
case 36:
|
|
280
|
+
case "end":
|
|
281
|
+
return _context3.stop();
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}, _callee3);
|
|
285
|
+
}));
|
|
286
|
+
|
|
287
|
+
return function (_x6) {
|
|
288
|
+
return _ref3.apply(this, arguments);
|
|
289
|
+
};
|
|
290
|
+
}();
|
|
291
|
+
};
|
|
292
|
+
|
|
293
|
+
var createSvgChunk = function createSvgChunk(imageCanvas, svgRoot, endNode) {
|
|
294
|
+
var styleTags = ["style", "defs"];
|
|
295
|
+
|
|
296
|
+
if (endNode.nodeType === Node.TEXT_NODE || styleTags.indexOf(endNode.tagName) !== -1) {
|
|
297
|
+
return false;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
var chunk = svgRoot.cloneNode();
|
|
301
|
+
|
|
302
|
+
for (var _i2 = 0, _styleTags = styleTags; _i2 < _styleTags.length; _i2++) {
|
|
303
|
+
var tagName = _styleTags[_i2];
|
|
304
|
+
|
|
305
|
+
var elements = _toConsumableArray(svgRoot.getElementsByTagName(tagName));
|
|
306
|
+
|
|
307
|
+
var _iterator = _createForOfIteratorHelper(elements),
|
|
308
|
+
_step;
|
|
309
|
+
|
|
310
|
+
try {
|
|
311
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
312
|
+
var element = _step.value;
|
|
313
|
+
chunk.appendChild(element.cloneNode(true));
|
|
314
|
+
}
|
|
315
|
+
} catch (err) {
|
|
316
|
+
_iterator.e(err);
|
|
317
|
+
} finally {
|
|
318
|
+
_iterator.f();
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
chunk.appendChild(cloneWithParent(endNode, svgRoot));
|
|
323
|
+
var width = imageCanvas.width,
|
|
324
|
+
height = imageCanvas.height;
|
|
325
|
+
chunk.setAttribute("width", width);
|
|
326
|
+
chunk.setAttribute("height", height);
|
|
327
|
+
return chunk;
|
|
328
|
+
};
|
|
329
|
+
|
|
330
|
+
var setSvgSize = function setSvgSize(svgElement, _ref4) {
|
|
331
|
+
var width = _ref4.width,
|
|
332
|
+
height = _ref4.height;
|
|
333
|
+
var scale = svgElement.getAttribute("width") / width;
|
|
334
|
+
svgElement.setAttribute("width", width);
|
|
335
|
+
svgElement.setAttribute("height", height);
|
|
336
|
+
|
|
337
|
+
if (svgElement.hasAttribute("viewBox")) {
|
|
338
|
+
var _svgElement$getAttrib = svgElement.getAttribute("viewBox").split(","),
|
|
339
|
+
_svgElement$getAttrib2 = _slicedToArray(_svgElement$getAttrib, 2),
|
|
340
|
+
x = _svgElement$getAttrib2[0],
|
|
341
|
+
y = _svgElement$getAttrib2[1];
|
|
342
|
+
|
|
343
|
+
svgElement.setAttribute("viewBox", [x, y, width, height].join(" "));
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
updateViewGroupScale(svgElement, scale);
|
|
347
|
+
return scale;
|
|
348
|
+
};
|
|
349
|
+
|
|
350
|
+
var updateViewGroupScale = function updateViewGroupScale(svgElement, ratio) {
|
|
351
|
+
var viewGroup = svgElement.getElementById("viewGroup");
|
|
352
|
+
|
|
353
|
+
if (viewGroup) {
|
|
354
|
+
var _getScaleValues5 = getScaleValues(viewGroup),
|
|
355
|
+
_getScaleValues6 = _slicedToArray(_getScaleValues5, 2),
|
|
356
|
+
sx = _getScaleValues6[0],
|
|
357
|
+
sy = _getScaleValues6[1];
|
|
358
|
+
|
|
359
|
+
viewGroup.setAttribute("transform", "scale(".concat(sx / ratio, ",").concat(sy / ratio, ")"));
|
|
360
|
+
}
|
|
361
|
+
};
|
|
362
|
+
|
|
363
|
+
var cloneWithParent = function cloneWithParent(node, outermostParent) {
|
|
364
|
+
var n = node;
|
|
365
|
+
var clone = n.cloneNode(true); // the end node should be copied deeply
|
|
366
|
+
|
|
367
|
+
while (n.parentNode && n.parentNode !== outermostParent) {
|
|
368
|
+
var child = clone;
|
|
369
|
+
n = n.parentNode;
|
|
370
|
+
clone = n.cloneNode();
|
|
371
|
+
clone.appendChild(child);
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
return clone;
|
|
375
|
+
};
|
|
376
|
+
|
|
377
|
+
var traverseDOM = function traverseDOM(node, cb) {
|
|
378
|
+
cb(node);
|
|
379
|
+
var childNodes = node.childNodes;
|
|
380
|
+
var length = childNodes.length;
|
|
381
|
+
|
|
382
|
+
if (length > 0) {
|
|
383
|
+
for (var i = 0; i < length; i++) {
|
|
384
|
+
traverseDOM(childNodes[i], cb);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
};
|
|
388
|
+
|
|
389
|
+
var collectEndNodes = function collectEndNodes(node) {
|
|
390
|
+
var nodes = [];
|
|
391
|
+
traverseDOM(node, function (node) {
|
|
392
|
+
if (node.tagName === "path" || node.tagName === "image") {
|
|
393
|
+
nodes.push(node);
|
|
394
|
+
}
|
|
395
|
+
});
|
|
396
|
+
return nodes;
|
|
397
|
+
};
|
|
398
|
+
|
|
399
|
+
var getEffectKey = function getEffectKey(svgAsString, srcCanvas) {
|
|
400
|
+
var width = srcCanvas.width,
|
|
401
|
+
height = srcCanvas.height;
|
|
402
|
+
return [svgAsString, width, height].join("-");
|
|
403
|
+
};
|
|
404
|
+
|
|
405
|
+
var createEffectImg = function () {
|
|
406
|
+
var cache = (0, _createCache.createCache)(10);
|
|
407
|
+
return /*#__PURE__*/function () {
|
|
408
|
+
var _createEffectImg = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4(svgAsString, srcCanvas) {
|
|
409
|
+
var key, cachedResult, svgDoc, svgElement, _getSizeValues3, _getSizeValues4, cWidth, cHeight, aspectRatio, width, height, _createWorkingCanvas11, _createWorkingCanvas12, imageCanvas, ctx, designerLayer, childNodes, image, _getScaleValues7, _getScaleValues8, sx, sy, resultImgPromise;
|
|
410
|
+
|
|
411
|
+
return regeneratorRuntime.wrap(function _callee4$(_context4) {
|
|
412
|
+
while (1) {
|
|
413
|
+
switch (_context4.prev = _context4.next) {
|
|
414
|
+
case 0:
|
|
415
|
+
key = getEffectKey(svgAsString, srcCanvas);
|
|
416
|
+
_context4.next = 3;
|
|
417
|
+
return cache.get(key);
|
|
418
|
+
|
|
419
|
+
case 3:
|
|
420
|
+
cachedResult = _context4.sent;
|
|
421
|
+
|
|
422
|
+
if (!cachedResult) {
|
|
423
|
+
_context4.next = 6;
|
|
424
|
+
break;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
return _context4.abrupt("return", cachedResult);
|
|
428
|
+
|
|
429
|
+
case 6:
|
|
430
|
+
svgDoc = new DOMParser().parseFromString(svgAsString, "image/svg+xml");
|
|
431
|
+
svgElement = svgDoc.getElementsByTagName("svg")[0];
|
|
432
|
+
_getSizeValues3 = getSizeValues(svgElement), _getSizeValues4 = _slicedToArray(_getSizeValues3, 2), cWidth = _getSizeValues4[0], cHeight = _getSizeValues4[1];
|
|
433
|
+
aspectRatio = cWidth / cHeight;
|
|
434
|
+
width = srcCanvas.width;
|
|
435
|
+
height = Math.round(width / aspectRatio);
|
|
436
|
+
setSvgSize(svgElement, {
|
|
437
|
+
width: width,
|
|
438
|
+
height: height
|
|
439
|
+
});
|
|
440
|
+
_createWorkingCanvas11 = (0, _createCanvas.createWorkingCanvas)({
|
|
441
|
+
width: width,
|
|
442
|
+
height: height
|
|
443
|
+
}), _createWorkingCanvas12 = _slicedToArray(_createWorkingCanvas11, 2), imageCanvas = _createWorkingCanvas12[0], ctx = _createWorkingCanvas12[1];
|
|
444
|
+
designerLayer = svgElement.getElementById("designerLayer") || svgElement.firstElementChild;
|
|
445
|
+
childNodes = collectEndNodes(designerLayer);
|
|
446
|
+
_context4.next = 18;
|
|
447
|
+
return Promise.all(childNodes.map(applyOnChildNode(imageCanvas, ctx, svgElement)));
|
|
448
|
+
|
|
449
|
+
case 18:
|
|
450
|
+
// in case of SVGImageElements with non external source the onLoad event is not fired in every browser (eg. Safari)
|
|
451
|
+
// but it still does the operation sequentially so we can use it directly after setting the href attribute
|
|
452
|
+
image = document.createElementNS(svgElement.namespaceURI, "image");
|
|
453
|
+
image.width.baseVal.value = width;
|
|
454
|
+
image.height.baseVal.value = height;
|
|
455
|
+
image.href.baseVal = imageCanvas.toDataURL();
|
|
456
|
+
_getScaleValues7 = getScaleValues(findOutermostNode(designerLayer, svgElement)), _getScaleValues8 = _slicedToArray(_getScaleValues7, 2), sx = _getScaleValues8[0], sy = _getScaleValues8[1];
|
|
457
|
+
image.setAttribute("transform", "scale(".concat(1 / sx, ",").concat(1 / sy, ")"));
|
|
458
|
+
designerLayer.innerHTML = "";
|
|
459
|
+
designerLayer.appendChild(image);
|
|
460
|
+
resultImgPromise = svgToImg(svgDoc);
|
|
461
|
+
cache.set(key, resultImgPromise);
|
|
462
|
+
_context4.next = 30;
|
|
463
|
+
return resultImgPromise;
|
|
464
|
+
|
|
465
|
+
case 30:
|
|
466
|
+
return _context4.abrupt("return", _context4.sent);
|
|
467
|
+
|
|
468
|
+
case 31:
|
|
469
|
+
case "end":
|
|
470
|
+
return _context4.stop();
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
}, _callee4);
|
|
474
|
+
}));
|
|
475
|
+
|
|
476
|
+
function createEffectImg(_x7, _x8) {
|
|
477
|
+
return _createEffectImg.apply(this, arguments);
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
return createEffectImg;
|
|
481
|
+
}();
|
|
482
|
+
}();
|
|
483
|
+
|
|
484
|
+
function embroideryEffect(_x9) {
|
|
485
|
+
return _embroideryEffect.apply(this, arguments);
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
function _embroideryEffect() {
|
|
489
|
+
_embroideryEffect = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee5(srcCanvas) {
|
|
490
|
+
var options,
|
|
491
|
+
getSvg,
|
|
492
|
+
svgAsString,
|
|
493
|
+
img,
|
|
494
|
+
width,
|
|
495
|
+
height,
|
|
496
|
+
srcCtx,
|
|
497
|
+
_args5 = arguments;
|
|
498
|
+
return regeneratorRuntime.wrap(function _callee5$(_context5) {
|
|
499
|
+
while (1) {
|
|
500
|
+
switch (_context5.prev = _context5.next) {
|
|
501
|
+
case 0:
|
|
502
|
+
options = _args5.length > 1 && _args5[1] !== undefined ? _args5[1] : {};
|
|
503
|
+
_context5.next = 3;
|
|
504
|
+
return imagePreloader.loadAll();
|
|
505
|
+
|
|
506
|
+
case 3:
|
|
507
|
+
getSvg = options.getSvg;
|
|
508
|
+
|
|
509
|
+
if (getSvg) {
|
|
510
|
+
_context5.next = 6;
|
|
511
|
+
break;
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
throw new Error("The getSvg function must be provided for the embroidery effect!");
|
|
515
|
+
|
|
516
|
+
case 6:
|
|
517
|
+
_context5.next = 8;
|
|
518
|
+
return getSvg();
|
|
519
|
+
|
|
520
|
+
case 8:
|
|
521
|
+
svgAsString = _context5.sent;
|
|
522
|
+
_context5.next = 11;
|
|
523
|
+
return createEffectImg(svgAsString, srcCanvas);
|
|
524
|
+
|
|
525
|
+
case 11:
|
|
526
|
+
img = _context5.sent;
|
|
527
|
+
width = img.width, height = img.height; // copy the created image over the src canvas
|
|
528
|
+
|
|
529
|
+
srcCtx = srcCanvas.getContext("2d");
|
|
530
|
+
srcCtx.clearRect(0, 0, width, height);
|
|
531
|
+
srcCtx.drawImage(img, 0, 0);
|
|
532
|
+
|
|
533
|
+
case 16:
|
|
534
|
+
case "end":
|
|
535
|
+
return _context5.stop();
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
}, _callee5);
|
|
539
|
+
}));
|
|
540
|
+
return _embroideryEffect.apply(this, arguments);
|
|
541
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.engravingEffect = engravingEffect;
|
|
7
|
+
|
|
8
|
+
var _createCanvas = require("../Utils/createCanvas");
|
|
9
|
+
|
|
10
|
+
var _PrintingEffectsUtils = require("./PrintingEffectsUtils");
|
|
11
|
+
|
|
12
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
13
|
+
|
|
14
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
15
|
+
|
|
16
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
17
|
+
|
|
18
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
19
|
+
|
|
20
|
+
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
21
|
+
|
|
22
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
23
|
+
|
|
24
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
|
25
|
+
|
|
26
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
27
|
+
|
|
28
|
+
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
29
|
+
|
|
30
|
+
function engravingEffect(srcCanvas, options) {
|
|
31
|
+
var _options$effectOption = _objectSpread({}, options.effectOptions),
|
|
32
|
+
_options$effectOption2 = _options$effectOption.fillColor,
|
|
33
|
+
fillColor = _options$effectOption2 === void 0 ? "rgba(200,200,200,1.0)" : _options$effectOption2,
|
|
34
|
+
_options$effectOption3 = _options$effectOption.blur,
|
|
35
|
+
blur = _options$effectOption3 === void 0 ? 4 : _options$effectOption3;
|
|
36
|
+
|
|
37
|
+
var shadows = [];
|
|
38
|
+
shadows.push({
|
|
39
|
+
blur: Math.max(2, 1 / options.currentZoom) * blur * 4,
|
|
40
|
+
color: "rgba(0, 0, 0, 0.5)",
|
|
41
|
+
offsetX: 0,
|
|
42
|
+
offsetY: 1
|
|
43
|
+
});
|
|
44
|
+
modifyImage(srcCanvas, shadows, fillColor);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function modifyImage(srcCanvas, shadows, fillColor) {
|
|
48
|
+
var _createWorkingCanvas = (0, _createCanvas.createWorkingCanvas)(srcCanvas),
|
|
49
|
+
_createWorkingCanvas2 = _slicedToArray(_createWorkingCanvas, 2),
|
|
50
|
+
imageCanvas = _createWorkingCanvas2[0],
|
|
51
|
+
ctx = _createWorkingCanvas2[1];
|
|
52
|
+
|
|
53
|
+
if (fillColor !== undefined) {
|
|
54
|
+
var backgroundCanvas = (0, _PrintingEffectsUtils.createBackgroundCanvas)(srcCanvas, fillColor, imageCanvas.width, imageCanvas.height);
|
|
55
|
+
var negativeCanvas = (0, _PrintingEffectsUtils.createNegativeCanvas)(srcCanvas, "#888", imageCanvas.width, imageCanvas.height);
|
|
56
|
+
var shadowCanvas = (0, _PrintingEffectsUtils.createShadowCanvas)(negativeCanvas, shadows, imageCanvas.width, imageCanvas.height); // Draw shadow on background
|
|
57
|
+
|
|
58
|
+
ctx.drawImage(backgroundCanvas, 0, 0);
|
|
59
|
+
ctx.drawImage(shadowCanvas, 0, 0);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
var srcCtx = srcCanvas.getContext("2d");
|
|
63
|
+
srcCtx.clearRect(0, 0, imageCanvas.width, imageCanvas.height);
|
|
64
|
+
srcCtx.drawImage(imageCanvas, 0, 0);
|
|
65
|
+
}
|