@emasoft/svg-matrix 1.1.0 → 1.2.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.
Files changed (55) hide show
  1. package/bin/svg-matrix.js +7 -6
  2. package/bin/svgm.js +109 -40
  3. package/dist/svg-matrix.min.js +7 -7
  4. package/dist/svg-toolbox.min.js +148 -228
  5. package/dist/svgm.min.js +152 -232
  6. package/dist/version.json +5 -5
  7. package/package.json +1 -1
  8. package/scripts/postinstall.js +72 -41
  9. package/scripts/test-postinstall.js +18 -16
  10. package/scripts/version-sync.js +78 -60
  11. package/src/animation-optimization.js +190 -98
  12. package/src/animation-references.js +11 -3
  13. package/src/arc-length.js +23 -20
  14. package/src/bezier-analysis.js +9 -13
  15. package/src/bezier-intersections.js +18 -4
  16. package/src/browser-verify.js +35 -8
  17. package/src/clip-path-resolver.js +285 -114
  18. package/src/convert-path-data.js +20 -8
  19. package/src/css-specificity.js +33 -9
  20. package/src/douglas-peucker.js +272 -141
  21. package/src/geometry-to-path.js +79 -22
  22. package/src/gjk-collision.js +287 -126
  23. package/src/index.js +56 -21
  24. package/src/inkscape-support.js +122 -101
  25. package/src/logger.js +43 -27
  26. package/src/marker-resolver.js +201 -121
  27. package/src/mask-resolver.js +231 -98
  28. package/src/matrix.js +9 -5
  29. package/src/mesh-gradient.js +22 -14
  30. package/src/off-canvas-detection.js +53 -17
  31. package/src/path-optimization.js +356 -171
  32. package/src/path-simplification.js +671 -256
  33. package/src/pattern-resolver.js +1 -3
  34. package/src/polygon-clip.js +396 -78
  35. package/src/svg-boolean-ops.js +90 -23
  36. package/src/svg-collections.js +1546 -667
  37. package/src/svg-flatten.js +152 -38
  38. package/src/svg-matrix-lib.js +2 -2
  39. package/src/svg-parser.js +5 -1
  40. package/src/svg-rendering-context.js +3 -1
  41. package/src/svg-toolbox-lib.js +2 -2
  42. package/src/svg-toolbox.js +99 -457
  43. package/src/svg-validation-data.js +513 -345
  44. package/src/svg2-polyfills.js +156 -93
  45. package/src/svgm-lib.js +8 -4
  46. package/src/transform-optimization.js +168 -51
  47. package/src/transforms2d.js +73 -40
  48. package/src/transforms3d.js +34 -27
  49. package/src/use-symbol-resolver.js +175 -76
  50. package/src/vector.js +80 -44
  51. package/src/vendor/inkscape-hatch-polyfill.js +143 -108
  52. package/src/vendor/inkscape-hatch-polyfill.min.js +291 -1
  53. package/src/vendor/inkscape-mesh-polyfill.js +953 -766
  54. package/src/vendor/inkscape-mesh-polyfill.min.js +896 -1
  55. package/src/verification.js +3 -4
@@ -5,4 +5,294 @@
5
5
  *
6
6
  * Converts SVG 2 hatch elements to SVG 1.1 pattern elements for browser compatibility.
7
7
  */
8
- !function(){const t="http://www.w3.org/2000/svg",e=(t,e,r,n)=>{const u=(e-t)/2,i=r+u,s=t+u+n;let h=[];for(let t=r-(Math.round(i/n)+1)*n;t<s;t+=n)h.push(t);return h};class r{constructor(t,e){this.x=t,this.y=e}toString(){return`${this.x} ${this.y}`}isPoint(){return!0}clone(){return new r(this.x,this.y)}add(t){return new r(this.x+t.x,this.y+t.y)}distSquared(t){let e=this.x-t.x,r=this.y-t.y;return e*e+r*r}}document.querySelectorAll("rect,circle,ellipse,path,text").forEach((n,u)=>{let i=n.getAttribute("id");i||(i="hatch_shape_"+u,n.setAttribute("id",i));const s=(n.getAttribute("fill")||n.style.fill).match(/^url\(\s*"?\s*#([^\s"]+)"?\s*\)/);if(s&&s[1]){const u=document.getElementById(s[1]);if(u&&"hatch"===u.nodeName){const i=u.getAttributeNS("http://www.w3.org/1999/xlink","href");if(null!==i&&""!==i&&((t,e)=>{const r=["x","y","pitch","rotate","hatchUnits","hatchContentUnits","transform"],n=document.getElementById(e.slice(1));n&&"hatch"===n.nodeName&&(r.forEach(e=>{let r=n.getAttribute(e);null===t.getAttribute(e)&&null!==r&&t.setAttribute(e,r)}),0===t.children.length&&Array.from(n.children).forEach(e=>{t.appendChild(e.cloneNode(!0))}))})(u,i),0===u.children.length)return;const h=n.getBBox(),o=Math.ceil(Math.sqrt(h.width*h.width+h.height*h.height)),a=u.getAttribute("hatchUnits")||"objectBoundingBox",c=u.getAttribute("hatchContentUnits")||"userSpaceOnUse",b=Number(u.getAttribute("rotate"))||0,l=u.getAttribute("transform")||u.getAttribute("hatchTransform")||"",m=(t=>{const e=[];return t.forEach(t=>e.push(t)),e.sort((t,e)=>Number(e.getAttribute("offset"))-Number(t.getAttribute("offset")))})(u.querySelectorAll("hatchpath,hatchPath")),d="objectBoundingBox"===a?Number(u.getAttribute("x"))*h.width||0:Number(u.getAttribute("x"))||0,g="objectBoundingBox"===a?Number(u.getAttribute("y"))*h.width||0:Number(u.getAttribute("y"))||0;let p="objectBoundingBox"===a?Number(u.getAttribute("pitch"))*h.width||0:Number(u.getAttribute("pitch"))||0;if("objectBoundingBox"===c&&h.height&&(p/=h.height),p<=0)return void console.error("Non-positive pitch");const N=document.createElementNS(t,"pattern"),f=`${s[1]}_pattern`;let w=h.width-h.width%p,A=0;const y=e(w,o,d,p);m.forEach(n=>{let u=Number(n.getAttribute("offset"))||0;u=u>p?u%p:u;const i=y.map(t=>t+u),s=document.createElementNS(t,"path");let a="";for(let t=0;t<n.attributes.length;++t){const e=n.attributes.item(t);"d"!==e.name&&s.setAttribute(e.name,e.value)}if(null===n.getAttribute("d"))a+=i.reduce((t,e)=>`${t}M ${e} ${g} V ${o} `,""),A=o;else{const u=n.getAttribute("d"),c=(t=>{let e=[],n=0,u=t.length,i=0;for(;n<u;)switch(t[n].toUpperCase()){case"Z":e.push(t[n]),n+=1,i=0;break;case"M":case"L":case"T":e.push(t[n],new r(Number(t[n+1]),Number(t[n+2]))),n+=3,i=1;break;case"H":e.push(t[n],new r(Number(t[n+1]),null)),n+=2,i=2;break;case"V":e.push(t[n],new r(null,Number(t[n+1]))),n+=2,i=3;break;case"C":e.push(t[n],new r(Number(t[n+1]),Number(t[n+2])),new r(Number(t[n+3]),Number(t[n+4])),new r(Number(t[n+5]),Number(t[n+6]))),n+=7,i=4;break;case"S":case"Q":e.push(t[n],new r(Number(t[n+1]),Number(t[n+2])),new r(Number(t[n+3]),Number(t[n+4]))),n+=5,i=5;break;case"A":e.push(t[n],t[n+1],t[n+2],t[n+3],t[n+4],t[n+5],new r(Number(t[n+6]),Number(t[n+7]))),n+=8,i=6;break;case"B":e.push(t[n],t[n+1]),n+=2,i=7;break;default:switch(i){case 1:e.push(new r(Number(t[n]),Number(t[n+1]))),n+=2;break;case 2:e.push(new r(Number(t[n]),null)),n+=1;break;case 3:e.push(new r(null,Number(t[n]))),n+=1;break;case 4:e.push(new r(Number(t[n]),Number(t[n+1])),new r(Number(t[n+2]),Number(t[n+3])),new r(Number(t[n+4]),Number(t[n+5]))),n+=6;break;case 5:e.push(new r(Number(t[n]),Number(t[n+1])),new r(Number(t[n+2]),Number(t[n+3]))),n+=4;break;case 6:e.push(t[n],t[n+1],t[n+2],t[n+3],t[n+4],new r(Number(t[n+5]),Number(t[n+6]))),n+=7;break;default:e.push(t[n]),n+=1}}return e})(u.match(/([+-]?(\d+(\.\d+)?))|[MmZzLlHhVvCcSsQqTtAaBb]/g)),b=c.length,l="M"===c[0],m=c[0].toLowerCase()===c[0],d=new r(0,0);let p=(e=>{const r=document.createElementNS(t,"path");let n=e.getAttribute("d");return"M"!==n[0].toUpperCase()&&(n=`M 0,0 ${n}`),r.setAttribute("d",n),r.getPointAtLength(r.getTotalLength()).y-r.getPointAtLength(0).y})(n);if(void 0!==c[b-1].y&&p<c[b-1].y&&(p=c[b-1].y),p<=0)return void console.error("y offset is non-positive");A=h.height-h.height%p;const N=e(A,o,g,p);i.forEach(t=>{d.x=t,l||m||(a+=`M ${t} 0`),N.forEach(e=>{d.y=e,a+=m?`M ${t} ${e} ${u}`:c.map(t=>t.isPoint&&t.isPoint()?t.add(d):t).map(t=>t.isPoint&&t.isPoint()?t.toString():t).reduce((t,e)=>`${t} ${e}`,"")})}),s.style.fill="none"}s.setAttribute("d",a),N.appendChild(s)}),((t,e)=>{for(let r in e)t.setAttribute(r,e[r])})(N,{id:f,patternUnits:"userSpaceOnUse",patternContentUnits:c,width:w,height:A,x:h.x,y:h.y,patternTransform:`rotate(${b} 0 0) ${l}`}),u.parentElement.insertBefore(N,u),n.style.fill=`url(#${f})`,n.setAttribute("fill",`url(#${f})`)}}})}();
8
+ !(function () {
9
+ const t = "http://www.w3.org/2000/svg",
10
+ e = (t, e, r, n) => {
11
+ const u = (e - t) / 2,
12
+ i = r + u,
13
+ s = t + u + n;
14
+ let h = [];
15
+ for (let t = r - (Math.round(i / n) + 1) * n; t < s; t += n) h.push(t);
16
+ return h;
17
+ };
18
+ class r {
19
+ constructor(t, e) {
20
+ ((this.x = t), (this.y = e));
21
+ }
22
+ toString() {
23
+ return `${this.x} ${this.y}`;
24
+ }
25
+ isPoint() {
26
+ return !0;
27
+ }
28
+ clone() {
29
+ return new r(this.x, this.y);
30
+ }
31
+ add(t) {
32
+ return new r(this.x + t.x, this.y + t.y);
33
+ }
34
+ distSquared(t) {
35
+ let e = this.x - t.x,
36
+ r = this.y - t.y;
37
+ return e * e + r * r;
38
+ }
39
+ }
40
+ document.querySelectorAll("rect,circle,ellipse,path,text").forEach((n, u) => {
41
+ let i = n.getAttribute("id");
42
+ i || ((i = "hatch_shape_" + u), n.setAttribute("id", i));
43
+ const s = (n.getAttribute("fill") || n.style.fill).match(
44
+ /^url\(\s*"?\s*#([^\s"]+)"?\s*\)/,
45
+ );
46
+ if (s && s[1]) {
47
+ const u = document.getElementById(s[1]);
48
+ if (u && "hatch" === u.nodeName) {
49
+ const i = u.getAttributeNS("http://www.w3.org/1999/xlink", "href");
50
+ if (
51
+ (null !== i &&
52
+ "" !== i &&
53
+ ((t, e) => {
54
+ const r = [
55
+ "x",
56
+ "y",
57
+ "pitch",
58
+ "rotate",
59
+ "hatchUnits",
60
+ "hatchContentUnits",
61
+ "transform",
62
+ ],
63
+ n = document.getElementById(e.slice(1));
64
+ n &&
65
+ "hatch" === n.nodeName &&
66
+ (r.forEach((e) => {
67
+ let r = n.getAttribute(e);
68
+ null === t.getAttribute(e) &&
69
+ null !== r &&
70
+ t.setAttribute(e, r);
71
+ }),
72
+ 0 === t.children.length &&
73
+ Array.from(n.children).forEach((e) => {
74
+ t.appendChild(e.cloneNode(!0));
75
+ }));
76
+ })(u, i),
77
+ 0 === u.children.length)
78
+ )
79
+ return;
80
+ const h = n.getBBox(),
81
+ o = Math.ceil(Math.sqrt(h.width * h.width + h.height * h.height)),
82
+ a = u.getAttribute("hatchUnits") || "objectBoundingBox",
83
+ c = u.getAttribute("hatchContentUnits") || "userSpaceOnUse",
84
+ b = Number(u.getAttribute("rotate")) || 0,
85
+ l =
86
+ u.getAttribute("transform") ||
87
+ u.getAttribute("hatchTransform") ||
88
+ "",
89
+ m = ((t) => {
90
+ const e = [];
91
+ return (
92
+ t.forEach((t) => e.push(t)),
93
+ e.sort(
94
+ (t, e) =>
95
+ Number(e.getAttribute("offset")) -
96
+ Number(t.getAttribute("offset")),
97
+ )
98
+ );
99
+ })(u.querySelectorAll("hatchpath,hatchPath")),
100
+ d =
101
+ "objectBoundingBox" === a
102
+ ? Number(u.getAttribute("x")) * h.width || 0
103
+ : Number(u.getAttribute("x")) || 0,
104
+ g =
105
+ "objectBoundingBox" === a
106
+ ? Number(u.getAttribute("y")) * h.width || 0
107
+ : Number(u.getAttribute("y")) || 0;
108
+ let p =
109
+ "objectBoundingBox" === a
110
+ ? Number(u.getAttribute("pitch")) * h.width || 0
111
+ : Number(u.getAttribute("pitch")) || 0;
112
+ if (("objectBoundingBox" === c && h.height && (p /= h.height), p <= 0))
113
+ return void console.error("Non-positive pitch");
114
+ const N = document.createElementNS(t, "pattern"),
115
+ f = `${s[1]}_pattern`;
116
+ let w = h.width - (h.width % p),
117
+ A = 0;
118
+ const y = e(w, o, d, p);
119
+ (m.forEach((n) => {
120
+ let u = Number(n.getAttribute("offset")) || 0;
121
+ u = u > p ? u % p : u;
122
+ const i = y.map((t) => t + u),
123
+ s = document.createElementNS(t, "path");
124
+ let a = "";
125
+ for (let t = 0; t < n.attributes.length; ++t) {
126
+ const e = n.attributes.item(t);
127
+ "d" !== e.name && s.setAttribute(e.name, e.value);
128
+ }
129
+ if (null === n.getAttribute("d"))
130
+ ((a += i.reduce((t, e) => `${t}M ${e} ${g} V ${o} `, "")), (A = o));
131
+ else {
132
+ const u = n.getAttribute("d"),
133
+ c = ((t) => {
134
+ let e = [],
135
+ n = 0,
136
+ u = t.length,
137
+ i = 0;
138
+ for (; n < u; )
139
+ switch (t[n].toUpperCase()) {
140
+ case "Z":
141
+ (e.push(t[n]), (n += 1), (i = 0));
142
+ break;
143
+ case "M":
144
+ case "L":
145
+ case "T":
146
+ (e.push(t[n], new r(Number(t[n + 1]), Number(t[n + 2]))),
147
+ (n += 3),
148
+ (i = 1));
149
+ break;
150
+ case "H":
151
+ (e.push(t[n], new r(Number(t[n + 1]), null)),
152
+ (n += 2),
153
+ (i = 2));
154
+ break;
155
+ case "V":
156
+ (e.push(t[n], new r(null, Number(t[n + 1]))),
157
+ (n += 2),
158
+ (i = 3));
159
+ break;
160
+ case "C":
161
+ (e.push(
162
+ t[n],
163
+ new r(Number(t[n + 1]), Number(t[n + 2])),
164
+ new r(Number(t[n + 3]), Number(t[n + 4])),
165
+ new r(Number(t[n + 5]), Number(t[n + 6])),
166
+ ),
167
+ (n += 7),
168
+ (i = 4));
169
+ break;
170
+ case "S":
171
+ case "Q":
172
+ (e.push(
173
+ t[n],
174
+ new r(Number(t[n + 1]), Number(t[n + 2])),
175
+ new r(Number(t[n + 3]), Number(t[n + 4])),
176
+ ),
177
+ (n += 5),
178
+ (i = 5));
179
+ break;
180
+ case "A":
181
+ (e.push(
182
+ t[n],
183
+ t[n + 1],
184
+ t[n + 2],
185
+ t[n + 3],
186
+ t[n + 4],
187
+ t[n + 5],
188
+ new r(Number(t[n + 6]), Number(t[n + 7])),
189
+ ),
190
+ (n += 8),
191
+ (i = 6));
192
+ break;
193
+ case "B":
194
+ (e.push(t[n], t[n + 1]), (n += 2), (i = 7));
195
+ break;
196
+ default:
197
+ switch (i) {
198
+ case 1:
199
+ (e.push(new r(Number(t[n]), Number(t[n + 1]))),
200
+ (n += 2));
201
+ break;
202
+ case 2:
203
+ (e.push(new r(Number(t[n]), null)), (n += 1));
204
+ break;
205
+ case 3:
206
+ (e.push(new r(null, Number(t[n]))), (n += 1));
207
+ break;
208
+ case 4:
209
+ (e.push(
210
+ new r(Number(t[n]), Number(t[n + 1])),
211
+ new r(Number(t[n + 2]), Number(t[n + 3])),
212
+ new r(Number(t[n + 4]), Number(t[n + 5])),
213
+ ),
214
+ (n += 6));
215
+ break;
216
+ case 5:
217
+ (e.push(
218
+ new r(Number(t[n]), Number(t[n + 1])),
219
+ new r(Number(t[n + 2]), Number(t[n + 3])),
220
+ ),
221
+ (n += 4));
222
+ break;
223
+ case 6:
224
+ (e.push(
225
+ t[n],
226
+ t[n + 1],
227
+ t[n + 2],
228
+ t[n + 3],
229
+ t[n + 4],
230
+ new r(Number(t[n + 5]), Number(t[n + 6])),
231
+ ),
232
+ (n += 7));
233
+ break;
234
+ default:
235
+ (e.push(t[n]), (n += 1));
236
+ }
237
+ }
238
+ return e;
239
+ })(u.match(/([+-]?(\d+(\.\d+)?))|[MmZzLlHhVvCcSsQqTtAaBb]/g)),
240
+ b = c.length,
241
+ l = "M" === c[0],
242
+ m = c[0].toLowerCase() === c[0],
243
+ d = new r(0, 0);
244
+ let p = ((e) => {
245
+ const r = document.createElementNS(t, "path");
246
+ let n = e.getAttribute("d");
247
+ return (
248
+ "M" !== n[0].toUpperCase() && (n = `M 0,0 ${n}`),
249
+ r.setAttribute("d", n),
250
+ r.getPointAtLength(r.getTotalLength()).y -
251
+ r.getPointAtLength(0).y
252
+ );
253
+ })(n);
254
+ if (
255
+ (void 0 !== c[b - 1].y && p < c[b - 1].y && (p = c[b - 1].y),
256
+ p <= 0)
257
+ )
258
+ return void console.error("y offset is non-positive");
259
+ A = h.height - (h.height % p);
260
+ const N = e(A, o, g, p);
261
+ (i.forEach((t) => {
262
+ ((d.x = t),
263
+ l || m || (a += `M ${t} 0`),
264
+ N.forEach((e) => {
265
+ ((d.y = e),
266
+ (a += m
267
+ ? `M ${t} ${e} ${u}`
268
+ : c
269
+ .map((t) => (t.isPoint && t.isPoint() ? t.add(d) : t))
270
+ .map((t) =>
271
+ t.isPoint && t.isPoint() ? t.toString() : t,
272
+ )
273
+ .reduce((t, e) => `${t} ${e}`, "")));
274
+ }));
275
+ }),
276
+ (s.style.fill = "none"));
277
+ }
278
+ (s.setAttribute("d", a), N.appendChild(s));
279
+ }),
280
+ ((t, e) => {
281
+ for (let r in e) t.setAttribute(r, e[r]);
282
+ })(N, {
283
+ id: f,
284
+ patternUnits: "userSpaceOnUse",
285
+ patternContentUnits: c,
286
+ width: w,
287
+ height: A,
288
+ x: h.x,
289
+ y: h.y,
290
+ patternTransform: `rotate(${b} 0 0) ${l}`,
291
+ }),
292
+ u.parentElement.insertBefore(N, u),
293
+ (n.style.fill = `url(#${f})`),
294
+ n.setAttribute("fill", `url(#${f})`));
295
+ }
296
+ }
297
+ });
298
+ })();