1 line
216 KiB
XML
1 line
216 KiB
XML
{"version":3,"file":"ext-server_opensave.js","sources":["../../../src/external/canvg/rgbcolor.js","../../../src/external/stackblur-canvas/dist/stackblur-es.js","../../../src/external/canvg/canvg.js","../../../src/editor/extensions/ext-server_opensave.js"],"sourcesContent":["/**\n * For parsing color values.\n * @module RGBColor\n * @author Stoyan Stefanov <sstoo@gmail.com>\n * @see https://www.phpied.com/rgb-color-parser-in-javascript/\n * @license MIT\n*/\nconst simpleColors = {\n aliceblue: 'f0f8ff',\n antiquewhite: 'faebd7',\n aqua: '00ffff',\n aquamarine: '7fffd4',\n azure: 'f0ffff',\n beige: 'f5f5dc',\n bisque: 'ffe4c4',\n black: '000000',\n blanchedalmond: 'ffebcd',\n blue: '0000ff',\n blueviolet: '8a2be2',\n brown: 'a52a2a',\n burlywood: 'deb887',\n cadetblue: '5f9ea0',\n chartreuse: '7fff00',\n chocolate: 'd2691e',\n coral: 'ff7f50',\n cornflowerblue: '6495ed',\n cornsilk: 'fff8dc',\n crimson: 'dc143c',\n cyan: '00ffff',\n darkblue: '00008b',\n darkcyan: '008b8b',\n darkgoldenrod: 'b8860b',\n darkgray: 'a9a9a9',\n darkgreen: '006400',\n darkkhaki: 'bdb76b',\n darkmagenta: '8b008b',\n darkolivegreen: '556b2f',\n darkorange: 'ff8c00',\n darkorchid: '9932cc',\n darkred: '8b0000',\n darksalmon: 'e9967a',\n darkseagreen: '8fbc8f',\n darkslateblue: '483d8b',\n darkslategray: '2f4f4f',\n darkturquoise: '00ced1',\n darkviolet: '9400d3',\n deeppink: 'ff1493',\n deepskyblue: '00bfff',\n dimgray: '696969',\n dodgerblue: '1e90ff',\n feldspar: 'd19275',\n firebrick: 'b22222',\n floralwhite: 'fffaf0',\n forestgreen: '228b22',\n fuchsia: 'ff00ff',\n gainsboro: 'dcdcdc',\n ghostwhite: 'f8f8ff',\n gold: 'ffd700',\n goldenrod: 'daa520',\n gray: '808080',\n green: '008000',\n greenyellow: 'adff2f',\n honeydew: 'f0fff0',\n hotpink: 'ff69b4',\n indianred: 'cd5c5c',\n indigo: '4b0082',\n ivory: 'fffff0',\n khaki: 'f0e68c',\n lavender: 'e6e6fa',\n lavenderblush: 'fff0f5',\n lawngreen: '7cfc00',\n lemonchiffon: 'fffacd',\n lightblue: 'add8e6',\n lightcoral: 'f08080',\n lightcyan: 'e0ffff',\n lightgoldenrodyellow: 'fafad2',\n lightgrey: 'd3d3d3',\n lightgreen: '90ee90',\n lightpink: 'ffb6c1',\n lightsalmon: 'ffa07a',\n lightseagreen: '20b2aa',\n lightskyblue: '87cefa',\n lightslateblue: '8470ff',\n lightslategray: '778899',\n lightsteelblue: 'b0c4de',\n lightyellow: 'ffffe0',\n lime: '00ff00',\n limegreen: '32cd32',\n linen: 'faf0e6',\n magenta: 'ff00ff',\n maroon: '800000',\n mediumaquamarine: '66cdaa',\n mediumblue: '0000cd',\n mediumorchid: 'ba55d3',\n mediumpurple: '9370d8',\n mediumseagreen: '3cb371',\n mediumslateblue: '7b68ee',\n mediumspringgreen: '00fa9a',\n mediumturquoise: '48d1cc',\n mediumvioletred: 'c71585',\n midnightblue: '191970',\n mintcream: 'f5fffa',\n mistyrose: 'ffe4e1',\n moccasin: 'ffe4b5',\n navajowhite: 'ffdead',\n navy: '000080',\n oldlace: 'fdf5e6',\n olive: '808000',\n olivedrab: '6b8e23',\n orange: 'ffa500',\n orangered: 'ff4500',\n orchid: 'da70d6',\n palegoldenrod: 'eee8aa',\n palegreen: '98fb98',\n paleturquoise: 'afeeee',\n palevioletred: 'd87093',\n papayawhip: 'ffefd5',\n peachpuff: 'ffdab9',\n peru: 'cd853f',\n pink: 'ffc0cb',\n plum: 'dda0dd',\n powderblue: 'b0e0e6',\n purple: '800080',\n red: 'ff0000',\n rosybrown: 'bc8f8f',\n royalblue: '4169e1',\n saddlebrown: '8b4513',\n salmon: 'fa8072',\n sandybrown: 'f4a460',\n seagreen: '2e8b57',\n seashell: 'fff5ee',\n sienna: 'a0522d',\n silver: 'c0c0c0',\n skyblue: '87ceeb',\n slateblue: '6a5acd',\n slategray: '708090',\n snow: 'fffafa',\n springgreen: '00ff7f',\n steelblue: '4682b4',\n tan: 'd2b48c',\n teal: '008080',\n thistle: 'd8bfd8',\n tomato: 'ff6347',\n turquoise: '40e0d0',\n violet: 'ee82ee',\n violetred: 'd02090',\n wheat: 'f5deb3',\n white: 'ffffff',\n whitesmoke: 'f5f5f5',\n yellow: 'ffff00',\n yellowgreen: '9acd32'\n};\n\n// array of color definition objects\nconst colorDefs = [\n {\n re: /^rgb\\((\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3})\\)$/,\n // re: /^rgb\\((?<r>\\d{1,3}),\\s*(?<g>\\d{1,3}),\\s*(?<b>\\d{1,3})\\)$/,\n example: ['rgb(123, 234, 45)', 'rgb(255,234,245)'],\n process (_, ...bits) {\n return bits.map((b) => Number.parseInt(b));\n }\n },\n {\n re: /^(\\w{2})(\\w{2})(\\w{2})$/,\n // re: /^(?<r>\\w{2})(?<g>\\w{2})(?<b>\\w{2})$/,\n example: ['#00ff00', '336699'],\n process (_, ...bits) {\n return bits.map((b) => Number.parseInt(b, 16));\n }\n },\n {\n re: /^(\\w)(\\w)(\\w)$/,\n // re: /^(?<r>\\w{1})(?<g>\\w{1})(?<b>\\w{1})$/,\n example: ['#fb0', 'f0f'],\n process (_, ...bits) {\n return bits.map((b) => Number.parseInt(b + b, 16));\n }\n }\n];\n\n/**\n * A class to parse color values.\n */\nexport default class RGBColor {\n /**\n * @param {string} colorString\n */\n constructor (colorString) {\n this.ok = false;\n\n // strip any leading #\n if (colorString.charAt(0) === '#') { // remove # if any\n colorString = colorString.substr(1, 6);\n }\n\n colorString = colorString.replace(/ /g, '');\n colorString = colorString.toLowerCase();\n\n // before getting into regexps, try simple matches\n // and overwrite the input\n if (colorString in simpleColors) {\n colorString = simpleColors[colorString];\n }\n // end of simple type-in colors\n\n // search through the definitions to find a match\n\n colorDefs.forEach(({re, process: processor}) => {\n const bits = re.exec(colorString);\n if (bits) {\n const [r, g, b] = processor(...bits);\n Object.assign(this, {r, g, b});\n this.ok = true;\n }\n });\n\n // validate/cleanup values\n this.r = (this.r < 0 || isNaN(this.r)) ? 0 : ((this.r > 255) ? 255 : this.r);\n this.g = (this.g < 0 || isNaN(this.g)) ? 0 : ((this.g > 255) ? 255 : this.g);\n this.b = (this.b < 0 || isNaN(this.b)) ? 0 : ((this.b > 255) ? 255 : this.b);\n }\n\n // some getters\n /**\n * @returns {string}\n */\n toRGB () {\n return 'rgb(' + this.r + ', ' + this.g + ', ' + this.b + ')';\n }\n\n /**\n * @returns {string}\n */\n toHex () {\n let r = this.r.toString(16);\n let g = this.g.toString(16);\n let b = this.b.toString(16);\n if (r.length === 1) { r = '0' + r; }\n if (g.length === 1) { g = '0' + g; }\n if (b.length === 1) { b = '0' + b; }\n return '#' + r + g + b;\n }\n\n /**\n * Offers a bulleted list of help.\n * @returns {HTMLUListElement}\n */\n static getHelpXML () {\n const examples = [\n // add regexps\n ...colorDefs.flatMap(({example}) => {\n return example;\n }),\n // add type-in colors\n ...Object.keys(simpleColors)\n ];\n\n const xml = document.createElement('ul');\n xml.setAttribute('id', 'rgbcolor-examples');\n\n xml.append(...examples.map((example) => {\n try {\n const listItem = document.createElement('li');\n const listColor = new RGBColor(example);\n const exampleDiv = document.createElement('div');\n exampleDiv.style.cssText = `\n margin: 3px;\n border: 1px solid black;\n background: ${listColor.toHex()};\n color: ${listColor.toHex()};`;\n exampleDiv.append('test');\n const listItemValue = ` ${example} -> ${listColor.toRGB()} -> ${listColor.toHex()}`;\n listItem.append(exampleDiv, listItemValue);\n return listItem;\n } catch (e) {\n return '';\n }\n }));\n return xml;\n }\n}\n","function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\n/* eslint-disable no-bitwise, unicorn/prefer-query-selector */\n\n/**\n* StackBlur - a fast almost Gaussian Blur For Canvas\n*\n* In case you find this class useful - especially in commercial projects -\n* I am not totally unhappy for a small donation to my PayPal account\n* mario@quasimondo.de\n*\n* Or support me on flattr:\n* {@link https://flattr.com/thing/72791/StackBlur-a-fast-almost-Gaussian-Blur-Effect-for-CanvasJavascript}.\n*\n* @module StackBlur\n* @author Mario Klingemann\n* Contact: mario@quasimondo.com\n* Website: {@link http://www.quasimondo.com/StackBlurForCanvas/StackBlurDemo.html}\n* Twitter: @quasimondo\n*\n* @copyright (c) 2010 Mario Klingemann\n*\n* Permission is hereby granted, free of charge, to any person\n* obtaining a copy of this software and associated documentation\n* files (the \"Software\"), to deal in the Software without\n* restriction, including without limitation the rights to use,\n* copy, modify, merge, publish, distribute, sublicense, and/or sell\n* copies of the Software, and to permit persons to whom the\n* Software is furnished to do so, subject to the following\n* conditions:\n*\n* The above copyright notice and this permission notice shall be\n* included in all copies or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n* OTHER DEALINGS IN THE SOFTWARE.\n*/\n\n/* eslint-disable max-len */\nvar mulTable = [512, 512, 456, 512, 328, 456, 335, 512, 405, 328, 271, 456, 388, 335, 292, 512, 454, 405, 364, 328, 298, 271, 496, 456, 420, 388, 360, 335, 312, 292, 273, 512, 482, 454, 428, 405, 383, 364, 345, 328, 312, 298, 284, 271, 259, 496, 475, 456, 437, 420, 404, 388, 374, 360, 347, 335, 323, 312, 302, 292, 282, 273, 265, 512, 497, 482, 468, 454, 441, 428, 417, 405, 394, 383, 373, 364, 354, 345, 337, 328, 320, 312, 305, 298, 291, 284, 278, 271, 265, 259, 507, 496, 485, 475, 465, 456, 446, 437, 428, 420, 412, 404, 396, 388, 381, 374, 367, 360, 354, 347, 341, 335, 329, 323, 318, 312, 307, 302, 297, 292, 287, 282, 278, 273, 269, 265, 261, 512, 505, 497, 489, 482, 475, 468, 461, 454, 447, 441, 435, 428, 422, 417, 411, 405, 399, 394, 389, 383, 378, 373, 368, 364, 359, 354, 350, 345, 341, 337, 332, 328, 324, 320, 316, 312, 309, 305, 301, 298, 294, 291, 287, 284, 281, 278, 274, 271, 268, 265, 262, 259, 257, 507, 501, 496, 491, 485, 480, 475, 470, 465, 460, 456, 451, 446, 442, 437, 433, 428, 424, 420, 416, 412, 408, 404, 400, 396, 392, 388, 385, 381, 377, 374, 370, 367, 363, 360, 357, 354, 350, 347, 344, 341, 338, 335, 332, 329, 326, 323, 320, 318, 315, 312, 310, 307, 304, 302, 299, 297, 294, 292, 289, 287, 285, 282, 280, 278, 275, 273, 271, 269, 267, 265, 263, 261, 259];\nvar shgTable = [9, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24];\n/* eslint-enable max-len */\n\n/**\n * @param {string|HTMLImageElement} img\n * @param {string|HTMLCanvasElement} canvas\n * @param {Float} radius\n * @param {boolean} blurAlphaChannel\n * @returns {undefined}\n */\n\nfunction processImage(img, canvas, radius, blurAlphaChannel) {\n if (typeof img === 'string') {\n img = document.getElementById(img);\n }\n\n if (!img || !('naturalWidth' in img)) {\n return;\n }\n\n var w = img.naturalWidth;\n var h = img.naturalHeight;\n\n if (typeof canvas === 'string') {\n canvas = document.getElementById(canvas);\n }\n\n if (!canvas || !('getContext' in canvas)) {\n return;\n }\n\n canvas.style.width = w + 'px';\n canvas.style.height = h + 'px';\n canvas.width = w;\n canvas.height = h;\n var context = canvas.getContext('2d');\n context.clearRect(0, 0, w, h);\n context.drawImage(img, 0, 0);\n\n if (isNaN(radius) || radius < 1) {\n return;\n }\n\n if (blurAlphaChannel) {\n processCanvasRGBA(canvas, 0, 0, w, h, radius);\n } else {\n processCanvasRGB(canvas, 0, 0, w, h, radius);\n }\n}\n/**\n * @param {string|HTMLCanvasElement} canvas\n * @param {Integer} topX\n * @param {Integer} topY\n * @param {Integer} width\n * @param {Integer} height\n * @throws {Error|TypeError}\n * @returns {ImageData} See {@link https://html.spec.whatwg.org/multipage/canvas.html#imagedata}\n */\n\n\nfunction getImageDataFromCanvas(canvas, topX, topY, width, height) {\n if (typeof canvas === 'string') {\n canvas = document.getElementById(canvas);\n }\n\n if (!canvas || _typeof(canvas) !== 'object' || !('getContext' in canvas)) {\n throw new TypeError('Expecting canvas with `getContext` method ' + 'in processCanvasRGB(A) calls!');\n }\n\n var context = canvas.getContext('2d');\n\n try {\n return context.getImageData(topX, topY, width, height);\n } catch (e) {\n throw new Error('unable to access image data: ' + e);\n }\n}\n/**\n * @param {HTMLCanvasElement} canvas\n * @param {Integer} topX\n * @param {Integer} topY\n * @param {Integer} width\n * @param {Integer} height\n * @param {Float} radius\n * @returns {undefined}\n */\n\n\nfunction processCanvasRGBA(canvas, topX, topY, width, height, radius) {\n if (isNaN(radius) || radius < 1) {\n return;\n }\n\n radius |= 0;\n var imageData = getImageDataFromCanvas(canvas, topX, topY, width, height);\n imageData = processImageDataRGBA(imageData, topX, topY, width, height, radius);\n canvas.getContext('2d').putImageData(imageData, topX, topY);\n}\n/**\n * @param {ImageData} imageData\n * @param {Integer} topX\n * @param {Integer} topY\n * @param {Integer} width\n * @param {Integer} height\n * @param {Float} radius\n * @returns {ImageData}\n */\n\n\nfunction processImageDataRGBA(imageData, topX, topY, width, height, radius) {\n var pixels = imageData.data;\n var x, y, i, p, yp, yi, yw, rSum, gSum, bSum, aSum, rOutSum, gOutSum, bOutSum, aOutSum, rInSum, gInSum, bInSum, aInSum, pr, pg, pb, pa, rbs;\n var div = 2 * radius + 1; // const w4 = width << 2;\n\n var widthMinus1 = width - 1;\n var heightMinus1 = height - 1;\n var radiusPlus1 = radius + 1;\n var sumFactor = radiusPlus1 * (radiusPlus1 + 1) / 2;\n var stackStart = new BlurStack();\n var stack = stackStart;\n var stackEnd;\n\n for (i = 1; i < div; i++) {\n stack = stack.next = new BlurStack();\n\n if (i === radiusPlus1) {\n stackEnd = stack;\n }\n }\n\n stack.next = stackStart;\n var stackIn = null;\n var stackOut = null;\n yw = yi = 0;\n var mulSum = mulTable[radius];\n var shgSum = shgTable[radius];\n\n for (y = 0; y < height; y++) {\n rInSum = gInSum = bInSum = aInSum = rSum = gSum = bSum = aSum = 0;\n rOutSum = radiusPlus1 * (pr = pixels[yi]);\n gOutSum = radiusPlus1 * (pg = pixels[yi + 1]);\n bOutSum = radiusPlus1 * (pb = pixels[yi + 2]);\n aOutSum = radiusPlus1 * (pa = pixels[yi + 3]);\n rSum += sumFactor * pr;\n gSum += sumFactor * pg;\n bSum += sumFactor * pb;\n aSum += sumFactor * pa;\n stack = stackStart;\n\n for (i = 0; i < radiusPlus1; i++) {\n stack.r = pr;\n stack.g = pg;\n stack.b = pb;\n stack.a = pa;\n stack = stack.next;\n }\n\n for (i = 1; i < radiusPlus1; i++) {\n p = yi + ((widthMinus1 < i ? widthMinus1 : i) << 2);\n rSum += (stack.r = pr = pixels[p]) * (rbs = radiusPlus1 - i);\n gSum += (stack.g = pg = pixels[p + 1]) * rbs;\n bSum += (stack.b = pb = pixels[p + 2]) * rbs;\n aSum += (stack.a = pa = pixels[p + 3]) * rbs;\n rInSum += pr;\n gInSum += pg;\n bInSum += pb;\n aInSum += pa;\n stack = stack.next;\n }\n\n stackIn = stackStart;\n stackOut = stackEnd;\n\n for (x = 0; x < width; x++) {\n pixels[yi + 3] = pa = aSum * mulSum >> shgSum;\n\n if (pa !== 0) {\n pa = 255 / pa;\n pixels[yi] = (rSum * mulSum >> shgSum) * pa;\n pixels[yi + 1] = (gSum * mulSum >> shgSum) * pa;\n pixels[yi + 2] = (bSum * mulSum >> shgSum) * pa;\n } else {\n pixels[yi] = pixels[yi + 1] = pixels[yi + 2] = 0;\n }\n\n rSum -= rOutSum;\n gSum -= gOutSum;\n bSum -= bOutSum;\n aSum -= aOutSum;\n rOutSum -= stackIn.r;\n gOutSum -= stackIn.g;\n bOutSum -= stackIn.b;\n aOutSum -= stackIn.a;\n p = yw + ((p = x + radius + 1) < widthMinus1 ? p : widthMinus1) << 2;\n rInSum += stackIn.r = pixels[p];\n gInSum += stackIn.g = pixels[p + 1];\n bInSum += stackIn.b = pixels[p + 2];\n aInSum += stackIn.a = pixels[p + 3];\n rSum += rInSum;\n gSum += gInSum;\n bSum += bInSum;\n aSum += aInSum;\n stackIn = stackIn.next;\n rOutSum += pr = stackOut.r;\n gOutSum += pg = stackOut.g;\n bOutSum += pb = stackOut.b;\n aOutSum += pa = stackOut.a;\n rInSum -= pr;\n gInSum -= pg;\n bInSum -= pb;\n aInSum -= pa;\n stackOut = stackOut.next;\n yi += 4;\n }\n\n yw += width;\n }\n\n for (x = 0; x < width; x++) {\n gInSum = bInSum = aInSum = rInSum = gSum = bSum = aSum = rSum = 0;\n yi = x << 2;\n rOutSum = radiusPlus1 * (pr = pixels[yi]);\n gOutSum = radiusPlus1 * (pg = pixels[yi + 1]);\n bOutSum = radiusPlus1 * (pb = pixels[yi + 2]);\n aOutSum = radiusPlus1 * (pa = pixels[yi + 3]);\n rSum += sumFactor * pr;\n gSum += sumFactor * pg;\n bSum += sumFactor * pb;\n aSum += sumFactor * pa;\n stack = stackStart;\n\n for (i = 0; i < radiusPlus1; i++) {\n stack.r = pr;\n stack.g = pg;\n stack.b = pb;\n stack.a = pa;\n stack = stack.next;\n }\n\n yp = width;\n\n for (i = 1; i <= radius; i++) {\n yi = yp + x << 2;\n rSum += (stack.r = pr = pixels[yi]) * (rbs = radiusPlus1 - i);\n gSum += (stack.g = pg = pixels[yi + 1]) * rbs;\n bSum += (stack.b = pb = pixels[yi + 2]) * rbs;\n aSum += (stack.a = pa = pixels[yi + 3]) * rbs;\n rInSum += pr;\n gInSum += pg;\n bInSum += pb;\n aInSum += pa;\n stack = stack.next;\n\n if (i < heightMinus1) {\n yp += width;\n }\n }\n\n yi = x;\n stackIn = stackStart;\n stackOut = stackEnd;\n\n for (y = 0; y < height; y++) {\n p = yi << 2;\n pixels[p + 3] = pa = aSum * mulSum >> shgSum;\n\n if (pa > 0) {\n pa = 255 / pa;\n pixels[p] = (rSum * mulSum >> shgSum) * pa;\n pixels[p + 1] = (gSum * mulSum >> shgSum) * pa;\n pixels[p + 2] = (bSum * mulSum >> shgSum) * pa;\n } else {\n pixels[p] = pixels[p + 1] = pixels[p + 2] = 0;\n }\n\n rSum -= rOutSum;\n gSum -= gOutSum;\n bSum -= bOutSum;\n aSum -= aOutSum;\n rOutSum -= stackIn.r;\n gOutSum -= stackIn.g;\n bOutSum -= stackIn.b;\n aOutSum -= stackIn.a;\n p = x + ((p = y + radiusPlus1) < heightMinus1 ? p : heightMinus1) * width << 2;\n rSum += rInSum += stackIn.r = pixels[p];\n gSum += gInSum += stackIn.g = pixels[p + 1];\n bSum += bInSum += stackIn.b = pixels[p + 2];\n aSum += aInSum += stackIn.a = pixels[p + 3];\n stackIn = stackIn.next;\n rOutSum += pr = stackOut.r;\n gOutSum += pg = stackOut.g;\n bOutSum += pb = stackOut.b;\n aOutSum += pa = stackOut.a;\n rInSum -= pr;\n gInSum -= pg;\n bInSum -= pb;\n aInSum -= pa;\n stackOut = stackOut.next;\n yi += width;\n }\n }\n\n return imageData;\n}\n/**\n * @param {HTMLCanvasElement} canvas\n * @param {Integer} topX\n * @param {Integer} topY\n * @param {Integer} width\n * @param {Integer} height\n * @param {Float} radius\n * @returns {undefined}\n */\n\n\nfunction processCanvasRGB(canvas, topX, topY, width, height, radius) {\n if (isNaN(radius) || radius < 1) {\n return;\n }\n\n radius |= 0;\n var imageData = getImageDataFromCanvas(canvas, topX, topY, width, height);\n imageData = processImageDataRGB(imageData, topX, topY, width, height, radius);\n canvas.getContext('2d').putImageData(imageData, topX, topY);\n}\n/**\n * @param {ImageData} imageData\n * @param {Integer} topX\n * @param {Integer} topY\n * @param {Integer} width\n * @param {Integer} height\n * @param {Float} radius\n * @returns {ImageData}\n */\n\n\nfunction processImageDataRGB(imageData, topX, topY, width, height, radius) {\n var pixels = imageData.data;\n var x, y, i, p, yp, yi, yw, rSum, gSum, bSum, rOutSum, gOutSum, bOutSum, rInSum, gInSum, bInSum, pr, pg, pb, rbs;\n var div = 2 * radius + 1; // const w4 = width << 2;\n\n var widthMinus1 = width - 1;\n var heightMinus1 = height - 1;\n var radiusPlus1 = radius + 1;\n var sumFactor = radiusPlus1 * (radiusPlus1 + 1) / 2;\n var stackStart = new BlurStack();\n var stack = stackStart;\n var stackEnd;\n\n for (i = 1; i < div; i++) {\n stack = stack.next = new BlurStack();\n\n if (i === radiusPlus1) {\n stackEnd = stack;\n }\n }\n\n stack.next = stackStart;\n var stackIn = null;\n var stackOut = null;\n yw = yi = 0;\n var mulSum = mulTable[radius];\n var shgSum = shgTable[radius];\n\n for (y = 0; y < height; y++) {\n rInSum = gInSum = bInSum = rSum = gSum = bSum = 0;\n rOutSum = radiusPlus1 * (pr = pixels[yi]);\n gOutSum = radiusPlus1 * (pg = pixels[yi + 1]);\n bOutSum = radiusPlus1 * (pb = pixels[yi + 2]);\n rSum += sumFactor * pr;\n gSum += sumFactor * pg;\n bSum += sumFactor * pb;\n stack = stackStart;\n\n for (i = 0; i < radiusPlus1; i++) {\n stack.r = pr;\n stack.g = pg;\n stack.b = pb;\n stack = stack.next;\n }\n\n for (i = 1; i < radiusPlus1; i++) {\n p = yi + ((widthMinus1 < i ? widthMinus1 : i) << 2);\n rSum += (stack.r = pr = pixels[p]) * (rbs = radiusPlus1 - i);\n gSum += (stack.g = pg = pixels[p + 1]) * rbs;\n bSum += (stack.b = pb = pixels[p + 2]) * rbs;\n rInSum += pr;\n gInSum += pg;\n bInSum += pb;\n stack = stack.next;\n }\n\n stackIn = stackStart;\n stackOut = stackEnd;\n\n for (x = 0; x < width; x++) {\n pixels[yi] = rSum * mulSum >> shgSum;\n pixels[yi + 1] = gSum * mulSum >> shgSum;\n pixels[yi + 2] = bSum * mulSum >> shgSum;\n rSum -= rOutSum;\n gSum -= gOutSum;\n bSum -= bOutSum;\n rOutSum -= stackIn.r;\n gOutSum -= stackIn.g;\n bOutSum -= stackIn.b;\n p = yw + ((p = x + radius + 1) < widthMinus1 ? p : widthMinus1) << 2;\n rInSum += stackIn.r = pixels[p];\n gInSum += stackIn.g = pixels[p + 1];\n bInSum += stackIn.b = pixels[p + 2];\n rSum += rInSum;\n gSum += gInSum;\n bSum += bInSum;\n stackIn = stackIn.next;\n rOutSum += pr = stackOut.r;\n gOutSum += pg = stackOut.g;\n bOutSum += pb = stackOut.b;\n rInSum -= pr;\n gInSum -= pg;\n bInSum -= pb;\n stackOut = stackOut.next;\n yi += 4;\n }\n\n yw += width;\n }\n\n for (x = 0; x < width; x++) {\n gInSum = bInSum = rInSum = gSum = bSum = rSum = 0;\n yi = x << 2;\n rOutSum = radiusPlus1 * (pr = pixels[yi]);\n gOutSum = radiusPlus1 * (pg = pixels[yi + 1]);\n bOutSum = radiusPlus1 * (pb = pixels[yi + 2]);\n rSum += sumFactor * pr;\n gSum += sumFactor * pg;\n bSum += sumFactor * pb;\n stack = stackStart;\n\n for (i = 0; i < radiusPlus1; i++) {\n stack.r = pr;\n stack.g = pg;\n stack.b = pb;\n stack = stack.next;\n }\n\n yp = width;\n\n for (i = 1; i <= radius; i++) {\n yi = yp + x << 2;\n rSum += (stack.r = pr = pixels[yi]) * (rbs = radiusPlus1 - i);\n gSum += (stack.g = pg = pixels[yi + 1]) * rbs;\n bSum += (stack.b = pb = pixels[yi + 2]) * rbs;\n rInSum += pr;\n gInSum += pg;\n bInSum += pb;\n stack = stack.next;\n\n if (i < heightMinus1) {\n yp += width;\n }\n }\n\n yi = x;\n stackIn = stackStart;\n stackOut = stackEnd;\n\n for (y = 0; y < height; y++) {\n p = yi << 2;\n pixels[p] = rSum * mulSum >> shgSum;\n pixels[p + 1] = gSum * mulSum >> shgSum;\n pixels[p + 2] = bSum * mulSum >> shgSum;\n rSum -= rOutSum;\n gSum -= gOutSum;\n bSum -= bOutSum;\n rOutSum -= stackIn.r;\n gOutSum -= stackIn.g;\n bOutSum -= stackIn.b;\n p = x + ((p = y + radiusPlus1) < heightMinus1 ? p : heightMinus1) * width << 2;\n rSum += rInSum += stackIn.r = pixels[p];\n gSum += gInSum += stackIn.g = pixels[p + 1];\n bSum += bInSum += stackIn.b = pixels[p + 2];\n stackIn = stackIn.next;\n rOutSum += pr = stackOut.r;\n gOutSum += pg = stackOut.g;\n bOutSum += pb = stackOut.b;\n rInSum -= pr;\n gInSum -= pg;\n bInSum -= pb;\n stackOut = stackOut.next;\n yi += width;\n }\n }\n\n return imageData;\n}\n/**\n *\n */\n\n\nvar BlurStack =\n/**\n * Set properties.\n */\nfunction BlurStack() {\n _classCallCheck(this, BlurStack);\n\n this.r = 0;\n this.g = 0;\n this.b = 0;\n this.a = 0;\n this.next = null;\n};\n\nexport { BlurStack, processCanvasRGB as canvasRGB, processCanvasRGBA as canvasRGBA, processImage as image, processImageDataRGB as imageDataRGB, processImageDataRGBA as imageDataRGBA };\n","/* eslint-disable new-cap, class-methods-use-this, jsdoc/require-jsdoc */\n// Todo: Compare with latest canvg (add any improvements of ours) and add full JSDocs (denoting links to standard APIs and which are custom): https://github.com/canvg/canvg\n/**\n * Javascript SVG parser and renderer on Canvas.\n * @file canvg.js\n * @module canvg\n * @license MIT\n * @author Gabe Lerner <gabelerner@gmail.com>\n * @see https://github.com/canvg/canvg\n */\n\nimport RGBColor from './rgbcolor.js';\nimport {canvasRGBA} from '../../external/stackblur-canvas/dist/stackblur-es.js';\n\n/**\n * Whether a value is `null` or `undefined`.\n * @param {any} val\n * @returns {boolean}\n */\nconst isNullish = (val) => {\n return val === null || val === undefined;\n};\n\n/**\n* @callback module:canvg.ForceRedraw\n* @returns {boolean}\n*/\n\n/**\n* @typedef {PlainObject} module:canvg.CanvgOptions\n* @property {boolean} ignoreMouse true => ignore mouse events\n* @property {boolean} ignoreAnimation true => ignore animations\n* @property {boolean} ignoreDimensions true => does not try to resize canvas\n* @property {boolean} ignoreClear true => does not clear canvas\n* @property {Integer} offsetX int => draws at a x offset\n* @property {Integer} offsetY int => draws at a y offset\n* @property {Integer} scaleWidth int => scales horizontally to width\n* @property {Integer} scaleHeight int => scales vertically to height\n* @property {module:canvg.ForceRedraw} forceRedraw function => will call the function on every frame, if it returns true, will redraw\n* @property {boolean} log Adds log function\n* @property {boolean} useCORS Whether to set CORS `crossOrigin` for the image to `Anonymous`\n*/\n\n/**\n* If called with no arguments, it will replace all `<svg>` elements on the page\n* with `<canvas>` elements.\n* @function module:canvg.canvg\n* @param {HTMLCanvasElement|string} target canvas element or the id of a canvas element\n* @param {string|XMLDocument} s - svg string, url to svg file, or xml document\n* @param {module:canvg.CanvgOptions} [opts] Optional hash of options\n* @returns {Promise<XMLDocument|XMLDocument[]>} All the function after the first render is completed with dom\n*/\nexport const canvg = function (target, s, opts) {\n // no parameters\n if (isNullish(target) && isNullish(s) && isNullish(opts)) {\n const svgTags = document.querySelectorAll('svg');\n return Promise.all([...svgTags].map((svgTag) => {\n const c = document.createElement('canvas');\n c.width = svgTag.clientWidth;\n c.height = svgTag.clientHeight;\n svgTag.before(c);\n svgTag.remove();\n const div = document.createElement('div');\n div.append(svgTag);\n return canvg(c, div.innerHTML);\n }));\n }\n\n if (typeof target === 'string') {\n target = document.getElementById(target);\n }\n\n // store class on canvas\n if (!isNullish(target.svg)) target.svg.stop();\n const svg = build(opts || {});\n // on i.e. 8 for flash canvas, we can't assign the property so check for it\n if (!(target.childNodes.length === 1 && target.childNodes[0].nodeName === 'OBJECT')) {\n target.svg = svg;\n }\n\n const ctx = target.getContext('2d');\n if (typeof s.documentElement !== 'undefined') {\n // load from xml doc\n return svg.loadXmlDoc(ctx, s);\n }\n if (s.substr(0, 1) === '<') {\n // load from xml string\n return svg.loadXml(ctx, s);\n }\n // load from url\n return svg.load(ctx, s);\n};\n\n/* eslint-disable jsdoc/check-types */\n/**\n* @param {module:canvg.CanvgOptions} opts\n* @returns {object}\n* @todo Flesh out exactly what object is returned here (after updating to latest and reincluding our changes here and those of StackBlur)\n*/\nfunction build (opts) {\n /* eslint-enable jsdoc/check-types */\n const svg = {opts};\n\n svg.FRAMERATE = 30;\n svg.MAX_VIRTUAL_PIXELS = 30000;\n\n svg.log = function (msg) { /* */ };\n if (svg.opts.log === true && typeof console !== 'undefined') {\n svg.log = function (msg) { console.log(msg); }; // eslint-disable-line no-console\n }\n\n // globals\n svg.init = function (ctx) {\n let uniqueId = 0;\n svg.UniqueId = function () {\n uniqueId++;\n return 'canvg' + uniqueId;\n };\n svg.Definitions = {};\n svg.Styles = {};\n svg.Animations = [];\n svg.Images = [];\n svg.ctx = ctx;\n svg.ViewPort = {\n viewPorts: [],\n Clear () { this.viewPorts = []; },\n SetCurrent (width, height) { this.viewPorts.push({width, height}); },\n RemoveCurrent () { this.viewPorts.pop(); },\n Current () { return this.viewPorts[this.viewPorts.length - 1]; },\n width () { return this.Current().width; },\n height () { return this.Current().height; },\n ComputeSize (d) {\n if (!isNullish(d) && typeof d === 'number') return d;\n if (d === 'x') return this.width();\n if (d === 'y') return this.height();\n return Math.sqrt(\n (this.width() ** 2) + (this.height() ** 2)\n ) / Math.sqrt(2);\n }\n };\n };\n svg.init();\n\n // images loaded\n svg.ImagesLoaded = function () {\n return svg.Images.every((img) => img.loaded);\n };\n\n // trim\n svg.trim = function (s) {\n return s.replace(/^\\s+|\\s+$/g, '');\n };\n\n // compress spaces\n svg.compressSpaces = function (s) {\n return s.replace(/\\s+/gm, ' ');\n };\n\n // ajax\n // Todo: Replace with `fetch` and polyfill\n svg.ajax = function (url, asynch) {\n const AJAX = window.XMLHttpRequest\n ? new XMLHttpRequest()\n : new window.ActiveXObject('Microsoft.XMLHTTP');\n if (asynch) {\n return new Promise((resolve, reject) => { // eslint-disable-line promise/avoid-new\n const req = AJAX.open('GET', url, true);\n req.addEventListener('load', () => {\n resolve(AJAX.responseText);\n });\n AJAX.send(null);\n });\n }\n\n AJAX.open('GET', url, false);\n AJAX.send(null);\n return AJAX.responseText;\n };\n\n // parse xml\n svg.parseXml = function (xml) {\n if (window.DOMParser) {\n const parser = new DOMParser();\n return parser.parseFromString(xml, 'text/xml');\n }\n xml = xml.replace(/<!DOCTYPE svg[^>]*>/, '');\n const xmlDoc = new window.ActiveXObject('Microsoft.XMLDOM');\n xmlDoc.async = 'false';\n xmlDoc.loadXML(xml);\n return xmlDoc;\n };\n\n // text extensions\n // get the text baseline\n const textBaselineMapping = {\n baseline: 'alphabetic',\n 'before-edge': 'top',\n 'text-before-edge': 'top',\n middle: 'middle',\n central: 'middle',\n 'after-edge': 'bottom',\n 'text-after-edge': 'bottom',\n ideographic: 'ideographic',\n alphabetic: 'alphabetic',\n hanging: 'hanging',\n mathematical: 'alphabetic'\n };\n\n svg.Property = class Property {\n constructor (name, value) {\n this.name = name;\n this.value = value;\n }\n\n getValue () {\n return this.value;\n }\n\n hasValue () {\n return (!isNullish(this.value) && this.value !== '');\n }\n\n // return the numerical value of the property\n numValue () {\n if (!this.hasValue()) return 0;\n\n let n = Number.parseFloat(this.value);\n if (String(this.value).endsWith('%')) {\n n /= 100.0;\n }\n return n;\n }\n\n valueOrDefault (def) {\n if (this.hasValue()) return this.value;\n return def;\n }\n\n numValueOrDefault (def) {\n if (this.hasValue()) return this.numValue();\n return def;\n }\n\n // color extensions\n // augment the current color value with the opacity\n addOpacity (opacityProp) {\n let newValue = this.value;\n if (!isNullish(opacityProp.value) && opacityProp.value !== '' && typeof this.value === 'string') { // can only add opacity to colors, not patterns\n const color = new RGBColor(this.value);\n if (color.ok) {\n newValue = 'rgba(' + color.r + ', ' + color.g + ', ' + color.b + ', ' + opacityProp.numValue() + ')';\n }\n }\n return new svg.Property(this.name, newValue);\n }\n\n // definition extensions\n // get the definition from the definitions table\n getDefinition () {\n let name = this.value.match(/#([^)'\"]+)/);\n if (name) { name = name[1]; }\n if (!name) { name = this.value; }\n return svg.Definitions[name];\n }\n\n isUrlDefinition () {\n return this.value.startsWith('url(');\n }\n\n getFillStyleDefinition (e, opacityProp) {\n let def = this.getDefinition();\n\n // gradient\n if (!isNullish(def) && def.createGradient) {\n return def.createGradient(svg.ctx, e, opacityProp);\n }\n\n // pattern\n if (!isNullish(def) && def.createPattern) {\n if (def.getHrefAttribute().hasValue()) {\n const pt = def.attribute('patternTransform');\n def = def.getHrefAttribute().getDefinition();\n if (pt.hasValue()) { def.attribute('patternTransform', true).value = pt.value; }\n }\n return def.createPattern(svg.ctx, e);\n }\n\n return null;\n }\n\n // length extensions\n getDPI (viewPort) {\n return 96.0; // TODO: compute?\n }\n\n getEM (viewPort) {\n let em = 12;\n\n const fontSize = new svg.Property('fontSize', svg.Font.Parse(svg.ctx.font).fontSize);\n if (fontSize.hasValue()) em = fontSize.toPixels(viewPort);\n\n return em;\n }\n\n getUnits () {\n return String(this.value).replace(/[\\d.-]/g, '');\n }\n\n // get the length as pixels\n toPixels (viewPort, processPercent) {\n if (!this.hasValue()) return 0;\n const s = String(this.value);\n if (s.endsWith('em')) return this.numValue() * this.getEM(viewPort);\n if (s.endsWith('ex')) return this.numValue() * this.getEM(viewPort) / 2.0;\n if (s.endsWith('px')) return this.numValue();\n if (s.endsWith('pt')) return this.numValue() * this.getDPI(viewPort) * (1.0 / 72.0);\n if (s.endsWith('pc')) return this.numValue() * 15;\n if (s.endsWith('cm')) return this.numValue() * this.getDPI(viewPort) / 2.54;\n if (s.endsWith('mm')) return this.numValue() * this.getDPI(viewPort) / 25.4;\n if (s.endsWith('in')) return this.numValue() * this.getDPI(viewPort);\n if (s.endsWith('%')) return this.numValue() * svg.ViewPort.ComputeSize(viewPort);\n const n = this.numValue();\n if (processPercent && n < 1.0) return n * svg.ViewPort.ComputeSize(viewPort);\n return n;\n }\n\n // time extensions\n // get the time as milliseconds\n toMilliseconds () {\n if (!this.hasValue()) return 0;\n const s = String(this.value);\n if (s.endsWith('ms')) return this.numValue();\n if (s.endsWith('s')) return this.numValue() * 1000;\n return this.numValue();\n }\n\n // angle extensions\n // get the angle as radians\n toRadians () {\n if (!this.hasValue()) return 0;\n const s = String(this.value);\n if (s.endsWith('deg')) return this.numValue() * (Math.PI / 180.0);\n if (s.endsWith('grad')) return this.numValue() * (Math.PI / 200.0);\n if (s.endsWith('rad')) return this.numValue();\n return this.numValue() * (Math.PI / 180.0);\n }\n\n toTextBaseline () {\n if (!this.hasValue()) return null;\n return textBaselineMapping[this.value];\n }\n };\n\n // fonts\n svg.Font = {\n Styles: 'normal|italic|oblique|inherit',\n Variants: 'normal|small-caps|inherit',\n Weights: 'normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900|inherit',\n\n CreateFont (fontStyle, fontVariant, fontWeight, fontSize, fontFamily, inherit) {\n const f = !isNullish(inherit) ? this.Parse(inherit) : this.CreateFont('', '', '', '', '', svg.ctx.font);\n return {\n fontFamily: fontFamily || f.fontFamily,\n fontSize: fontSize || f.fontSize,\n fontStyle: fontStyle || f.fontStyle,\n fontWeight: fontWeight || f.fontWeight,\n fontVariant: fontVariant || f.fontVariant,\n toString () {\n return [\n this.fontStyle, this.fontVariant, this.fontWeight,\n this.fontSize, this.fontFamily\n ].join(' ');\n }\n };\n },\n\n Parse (s) {\n const f = {};\n const ds = svg.trim(svg.compressSpaces(s || '')).split(' ');\n const set = {\n fontSize: false, fontStyle: false, fontWeight: false, fontVariant: false\n };\n let ff = '';\n ds.forEach((d) => {\n if (!set.fontStyle && this.Styles.includes(d)) {\n if (d !== 'inherit') {\n f.fontStyle = d;\n }\n set.fontStyle = true;\n } else if (!set.fontVariant && this.Variants.includes(d)) {\n if (d !== 'inherit') {\n f.fontVariant = d;\n }\n set.fontStyle = set.fontVariant = true;\n } else if (!set.fontWeight && this.Weights.includes(d)) {\n if (d !== 'inherit') {\n f.fontWeight = d;\n }\n set.fontStyle = set.fontVariant = set.fontWeight = true;\n } else if (!set.fontSize) {\n if (d !== 'inherit') {\n f.fontSize = d.split('/')[0];\n }\n set.fontStyle = set.fontVariant = set.fontWeight = set.fontSize = true;\n } else if (d !== 'inherit') {\n ff += d;\n }\n });\n if (ff !== '') { f.fontFamily = ff; }\n return f;\n }\n };\n\n // points and paths\n svg.ToNumberArray = function (s) {\n const a = svg.trim(svg.compressSpaces((s || '').replace(/,/g, ' '))).split(' ');\n return a.map((_a) => Number.parseFloat(_a));\n };\n svg.Point = class {\n constructor (x, y) {\n this.x = x;\n this.y = y;\n }\n\n angleTo (p) {\n return Math.atan2(p.y - this.y, p.x - this.x);\n }\n\n applyTransform (v) {\n const xp = this.x * v[0] + this.y * v[2] + v[4];\n const yp = this.x * v[1] + this.y * v[3] + v[5];\n this.x = xp;\n this.y = yp;\n }\n };\n\n svg.CreatePoint = function (s) {\n const a = svg.ToNumberArray(s);\n return new svg.Point(a[0], a[1]);\n };\n svg.CreatePath = function (s) {\n const a = svg.ToNumberArray(s);\n const path = [];\n for (let i = 0; i < a.length; i += 2) {\n path.push(new svg.Point(a[i], a[i + 1]));\n }\n return path;\n };\n\n // bounding box\n svg.BoundingBox = class {\n constructor (x1, y1, x2, y2) { // pass in initial points if you want\n this.x1 = Number.NaN;\n this.y1 = Number.NaN;\n this.x2 = Number.NaN;\n this.y2 = Number.NaN;\n this.addPoint(x1, y1);\n this.addPoint(x2, y2);\n }\n\n x () { return this.x1; }\n y () { return this.y1; }\n width () { return this.x2 - this.x1; }\n height () { return this.y2 - this.y1; }\n\n addPoint (x, y) {\n if (!isNullish(x)) {\n if (isNaN(this.x1) || isNaN(this.x2)) {\n this.x1 = x;\n this.x2 = x;\n }\n if (x < this.x1) this.x1 = x;\n if (x > this.x2) this.x2 = x;\n }\n\n if (!isNullish(y)) {\n if (isNaN(this.y1) || isNaN(this.y2)) {\n this.y1 = y;\n this.y2 = y;\n }\n if (y < this.y1) this.y1 = y;\n if (y > this.y2) this.y2 = y;\n }\n }\n addX (x) { this.addPoint(x, null); }\n addY (y) { this.addPoint(null, y); }\n\n addBoundingBox (bb) {\n this.addPoint(bb.x1, bb.y1);\n this.addPoint(bb.x2, bb.y2);\n }\n\n addQuadraticCurve (p0x, p0y, p1x, p1y, p2x, p2y) {\n const cp1x = p0x + 2 / 3 * (p1x - p0x); // CP1 = QP0 + 2/3 *(QP1-QP0)\n const cp1y = p0y + 2 / 3 * (p1y - p0y); // CP1 = QP0 + 2/3 *(QP1-QP0)\n const cp2x = cp1x + 1 / 3 * (p2x - p0x); // CP2 = CP1 + 1/3 *(QP2-QP0)\n const cp2y = cp1y + 1 / 3 * (p2y - p0y); // CP2 = CP1 + 1/3 *(QP2-QP0)\n this.addBezierCurve(p0x, p0y, cp1x, cp2x, cp1y, cp2y, p2x, p2y);\n }\n\n addBezierCurve (p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) {\n // from http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html\n const p0 = [p0x, p0y], p1 = [p1x, p1y], p2 = [p2x, p2y], p3 = [p3x, p3y];\n this.addPoint(p0[0], p0[1]);\n this.addPoint(p3[0], p3[1]);\n\n for (let i = 0; i <= 1; i++) {\n const f = function (t) {\n return ((1 - t) ** 3) * p0[i] +\n 3 * ((1 - t) ** 2) * t * p1[i] +\n 3 * (1 - t) * (t ** 2) * p2[i] +\n (t ** 3) * p3[i];\n };\n\n const b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i];\n const a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i];\n const c = 3 * p1[i] - 3 * p0[i];\n\n if (a === 0) {\n if (b === 0) continue;\n const t = -c / b;\n if (t > 0 && t < 1) {\n if (i === 0) this.addX(f(t));\n if (i === 1) this.addY(f(t));\n }\n continue;\n }\n\n const b2ac = (b ** 2) - 4 * c * a;\n if (b2ac < 0) continue;\n const t1 = (-b + Math.sqrt(b2ac)) / (2 * a);\n if (t1 > 0 && t1 < 1) {\n if (i === 0) this.addX(f(t1));\n if (i === 1) this.addY(f(t1));\n }\n const t2 = (-b - Math.sqrt(b2ac)) / (2 * a);\n if (t2 > 0 && t2 < 1) {\n if (i === 0) this.addX(f(t2));\n if (i === 1) this.addY(f(t2));\n }\n }\n }\n\n isPointInBox (x, y) {\n return (this.x1 <= x && x <= this.x2 && this.y1 <= y && y <= this.y2);\n }\n };\n\n // transforms\n svg.Transform = class {\n constructor (v) {\n this.Type = {\n translate: class {\n constructor (s) {\n this.p = svg.CreatePoint(s);\n this.apply = function (ctx) {\n ctx.translate(this.p.x || 0.0, this.p.y || 0.0);\n };\n this.unapply = function (ctx) {\n ctx.translate(-1.0 * this.p.x || 0.0, -1.0 * this.p.y || 0.0);\n };\n this.applyToPoint = function (p) {\n p.applyTransform([1, 0, 0, 1, this.p.x || 0.0, this.p.y || 0.0]);\n };\n }\n },\n rotate: class {\n constructor (s) {\n const a = svg.ToNumberArray(s);\n this.angle = new svg.Property('angle', a[0]);\n this.cx = a[1] || 0;\n this.cy = a[2] || 0;\n this.apply = function (ctx) {\n ctx.translate(this.cx, this.cy);\n ctx.rotate(this.angle.toRadians());\n ctx.translate(-this.cx, -this.cy);\n };\n this.unapply = function (ctx) {\n ctx.translate(this.cx, this.cy);\n ctx.rotate(-1.0 * this.angle.toRadians());\n ctx.translate(-this.cx, -this.cy);\n };\n this.applyToPoint = function (p) {\n const _a = this.angle.toRadians();\n p.applyTransform([1, 0, 0, 1, this.p.x || 0.0, this.p.y || 0.0]);\n p.applyTransform([Math.cos(_a), Math.sin(_a), -Math.sin(_a), Math.cos(_a), 0, 0]);\n p.applyTransform([1, 0, 0, 1, -this.p.x || 0.0, -this.p.y || 0.0]);\n };\n }\n },\n scale: class {\n constructor (s) {\n this.p = svg.CreatePoint(s);\n this.apply = function (ctx) {\n ctx.scale(this.p.x || 1.0, this.p.y || this.p.x || 1.0);\n };\n this.unapply = function (ctx) {\n ctx.scale(1.0 / this.p.x || 1.0, 1.0 / this.p.y || this.p.x || 1.0);\n };\n this.applyToPoint = function (p) {\n p.applyTransform([this.p.x || 0.0, 0, 0, this.p.y || 0.0, 0, 0]);\n };\n }\n },\n matrix: class {\n constructor (s) {\n this.m = svg.ToNumberArray(s);\n this.apply = function (ctx) {\n ctx.transform(this.m[0], this.m[1], this.m[2], this.m[3], this.m[4], this.m[5]);\n };\n this.applyToPoint = function (p) {\n p.applyTransform(this.m);\n };\n }\n }\n };\n Object.assign(this.Type, {\n SkewBase: class extends this.Type.matrix {\n constructor (s) {\n super(s);\n this.angle = new svg.Property('angle', s);\n }\n }\n });\n Object.assign(this.Type, {\n skewX: class extends this.Type.SkewBase {\n constructor (s) {\n super(s);\n this.m = [1, 0, Math.tan(this.angle.toRadians()), 1, 0, 0];\n }\n },\n skewY: class extends this.Type.SkewBase {\n constructor (s) {\n super(s);\n this.m = [1, Math.tan(this.angle.toRadians()), 0, 1, 0, 0];\n }\n }\n });\n\n const data = svg.trim(svg.compressSpaces(v)).replace(\n /\\)([a-zA-Z])/g, ') $1'\n ).replace(/\\)(\\s?,\\s?)/g, ') ').split(/\\s(?=[a-z])/);\n this.transforms = data.map((d) => {\n const type = svg.trim(d.split('(')[0]);\n const s = d.split('(')[1].replace(')', '');\n const transform = new this.Type[type](s);\n transform.type = type;\n return transform;\n });\n }\n\n apply (ctx) {\n this.transforms.forEach((transform) => {\n transform.apply(ctx);\n });\n }\n\n unapply (ctx) {\n for (let i = this.transforms.length - 1; i >= 0; i--) {\n this.transforms[i].unapply(ctx);\n }\n }\n\n applyToPoint (p) {\n this.transforms.forEach((transform) => {\n transform.applyToPoint(p);\n });\n }\n };\n\n // aspect ratio\n svg.AspectRatio = function (ctx, aspectRatio, width, desiredWidth, height, desiredHeight, minX, minY, refX, refY) {\n // aspect ratio - https://www.w3.org/TR/SVG/coords.html#PreserveAspectRatioAttribute\n aspectRatio = svg.compressSpaces(aspectRatio);\n aspectRatio = aspectRatio.replace(/^defer\\s/, ''); // ignore defer\n const align = aspectRatio.split(' ')[0] || 'xMidYMid';\n const meetOrSlice = aspectRatio.split(' ')[1] || 'meet';\n\n // calculate scale\n const scaleX = width / desiredWidth;\n const scaleY = height / desiredHeight;\n const scaleMin = Math.min(scaleX, scaleY);\n const scaleMax = Math.max(scaleX, scaleY);\n if (meetOrSlice === 'meet') { desiredWidth *= scaleMin; desiredHeight *= scaleMin; }\n if (meetOrSlice === 'slice') { desiredWidth *= scaleMax; desiredHeight *= scaleMax; }\n\n refX = new svg.Property('refX', refX);\n refY = new svg.Property('refY', refY);\n if (refX.hasValue() && refY.hasValue()) {\n ctx.translate(-scaleMin * refX.toPixels('x'), -scaleMin * refY.toPixels('y'));\n } else {\n // align\n if (align.startsWith('xMid') &&\n ((meetOrSlice === 'meet' && scaleMin === scaleY) || (meetOrSlice === 'slice' && scaleMax === scaleY))) {\n ctx.translate(width / 2.0 - desiredWidth / 2.0, 0);\n }\n if (align.endsWith('YMid') &&\n ((meetOrSlice === 'meet' && scaleMin === scaleX) || (meetOrSlice === 'slice' && scaleMax === scaleX))) {\n ctx.translate(0, height / 2.0 - desiredHeight / 2.0);\n }\n if (align.startsWith('xMax') &&\n ((meetOrSlice === 'meet' && scaleMin === scaleY) || (meetOrSlice === 'slice' && scaleMax === scaleY))) {\n ctx.translate(width - desiredWidth, 0);\n }\n if (align.endsWith('YMax') &&\n ((meetOrSlice === 'meet' && scaleMin === scaleX) ||\n (meetOrSlice === 'slice' && scaleMax === scaleX)\n )\n ) {\n ctx.translate(0, height - desiredHeight);\n }\n }\n\n // scale\n if (align === 'none') ctx.scale(scaleX, scaleY);\n else if (meetOrSlice === 'meet') ctx.scale(scaleMin, scaleMin);\n else if (meetOrSlice === 'slice') ctx.scale(scaleMax, scaleMax);\n\n // translate\n ctx.translate(isNullish(minX) ? 0 : -minX, isNullish(minY) ? 0 : -minY);\n };\n\n // elements\n svg.Element = {};\n\n svg.EmptyProperty = new svg.Property('EMPTY', '');\n\n svg.Element.ElementBase = class {\n constructor (node) {\n // Argument from inheriting class\n this.captureTextNodes = arguments[1]; // eslint-disable-line prefer-rest-params\n this.attributes = {};\n this.styles = {};\n this.children = [];\n if (!isNullish(node) && node.nodeType === 1) { // ELEMENT_NODE\n // add children\n [...node.childNodes].forEach((childNode) => {\n if (childNode.nodeType === 1) {\n this.addChild(childNode, true); // ELEMENT_NODE\n }\n if (this.captureTextNodes && (\n childNode.nodeType === 3 || childNode.nodeType === 4\n )) {\n const text = childNode.nodeValue || childNode.text || '';\n if (svg.trim(svg.compressSpaces(text)) !== '') {\n this.addChild(new svg.Element.tspan(childNode), false); // TEXT_NODE\n }\n }\n });\n\n // add attributes\n [...node.attributes].forEach(({nodeName, nodeValue}) => {\n this.attributes[nodeName] = new svg.Property(\n nodeName,\n nodeValue\n );\n });\n // add tag styles\n let styles = svg.Styles[node.nodeName];\n if (!isNullish(styles)) {\n Object.entries(styles).forEach(([name, styleValue]) => {\n this.styles[name] = styleValue;\n });\n }\n\n // add class styles\n if (this.attribute('class').hasValue()) {\n const classes = svg.compressSpaces(this.attribute('class').value).split(' ');\n classes.forEach((clss) => {\n styles = svg.Styles['.' + clss];\n if (!isNullish(styles)) {\n Object.entries(styles).forEach(([name, styleValue]) => {\n this.styles[name] = styleValue;\n });\n }\n styles = svg.Styles[node.nodeName + '.' + clss];\n if (!isNullish(styles)) {\n Object.entries(styles).forEach(([name, styleValue]) => {\n this.styles[name] = styleValue;\n });\n }\n });\n }\n\n // add id styles\n if (this.attribute('id').hasValue()) {\n const _styles = svg.Styles['#' + this.attribute('id').value];\n if (!isNullish(_styles)) {\n Object.entries(_styles).forEach(([name, styleValue]) => {\n this.styles[name] = styleValue;\n });\n }\n }\n\n // add inline styles\n if (this.attribute('style').hasValue()) {\n const _styles = this.attribute('style').value.split(';');\n _styles.forEach((style) => {\n if (svg.trim(style) !== '') {\n let {name, value} = style.split(':');\n name = svg.trim(name);\n value = svg.trim(value);\n this.styles[name] = new svg.Property(name, value);\n }\n });\n }\n\n // add id\n if (this.attribute('id').hasValue()) {\n if (isNullish(svg.Definitions[this.attribute('id').value])) {\n svg.Definitions[this.attribute('id').value] = this;\n }\n }\n }\n }\n\n // get or create attribute\n attribute (name, createIfNotExists) {\n let a = this.attributes[name];\n if (!isNullish(a)) return a;\n\n if (createIfNotExists === true) { a = new svg.Property(name, ''); this.attributes[name] = a; }\n return a || svg.EmptyProperty;\n }\n\n getHrefAttribute () {\n for (const a in this.attributes) {\n if (a.endsWith(':href')) {\n return this.attributes[a];\n }\n }\n return svg.EmptyProperty;\n }\n\n // get or create style, crawls up node tree\n style (name, createIfNotExists, skipAncestors) {\n let s = this.styles[name];\n if (!isNullish(s)) return s;\n\n const a = this.attribute(name);\n if (!isNullish(a) && a.hasValue()) {\n this.styles[name] = a; // move up to me to cache\n return a;\n }\n\n if (skipAncestors !== true) {\n const p = this.parent;\n if (!isNullish(p)) {\n const ps = p.style(name);\n if (!isNullish(ps) && ps.hasValue()) {\n return ps;\n }\n }\n }\n\n if (createIfNotExists === true) { s = new svg.Property(name, ''); this.styles[name] = s; }\n return s || svg.EmptyProperty;\n }\n\n // base render\n render (ctx) {\n // don't render display=none\n if (this.style('display').value === 'none') return;\n\n // don't render visibility=hidden\n if (this.style('visibility').value === 'hidden') return;\n\n ctx.save();\n if (this.attribute('mask').hasValue()) { // mask\n const mask = this.attribute('mask').getDefinition();\n if (!isNullish(mask)) mask.apply(ctx, this);\n } else if (this.style('filter').hasValue()) { // filter\n const filter = this.style('filter').getDefinition();\n if (!isNullish(filter)) filter.apply(ctx, this);\n } else {\n this.setContext(ctx);\n this.renderChildren(ctx);\n this.clearContext(ctx);\n }\n ctx.restore();\n }\n\n // base set context\n setContext (ctx) {\n // OVERRIDE ME!\n }\n\n // base clear context\n clearContext (ctx) {\n // OVERRIDE ME!\n }\n\n // base render children\n renderChildren (ctx) {\n this.children.forEach((child) => {\n child.render(ctx);\n });\n }\n\n addChild (childNode, create) {\n const child = create\n ? svg.CreateElement(childNode)\n : childNode;\n child.parent = this;\n if (child.type !== 'title') { this.children.push(child); }\n }\n };\n\n svg.Element.RenderedElementBase = class extends svg.Element.ElementBase {\n setContext (ctx) {\n // fill\n if (this.style('fill').isUrlDefinition()) {\n const fs = this.style('fill').getFillStyleDefinition(this, this.style('fill-opacity'));\n if (!isNullish(fs)) ctx.fillStyle = fs;\n } else if (this.style('fill').hasValue()) {\n const fillStyle = this.style('fill');\n if (fillStyle.value === 'currentColor') fillStyle.value = this.style('color').value;\n ctx.fillStyle = (fillStyle.value === 'none' ? 'rgba(0,0,0,0)' : fillStyle.value);\n }\n if (this.style('fill-opacity').hasValue()) {\n let fillStyle = new svg.Property('fill', ctx.fillStyle);\n fillStyle = fillStyle.addOpacity(this.style('fill-opacity'));\n ctx.fillStyle = fillStyle.value;\n }\n\n // stroke\n if (this.style('stroke').isUrlDefinition()) {\n const fs = this.style('stroke').getFillStyleDefinition(this, this.style('stroke-opacity'));\n if (!isNullish(fs)) ctx.strokeStyle = fs;\n } else if (this.style('stroke').hasValue()) {\n const strokeStyle = this.style('stroke');\n if (strokeStyle.value === 'currentColor') strokeStyle.value = this.style('color').value;\n ctx.strokeStyle = (strokeStyle.value === 'none' ? 'rgba(0,0,0,0)' : strokeStyle.value);\n }\n if (this.style('stroke-opacity').hasValue()) {\n let strokeStyle = new svg.Property('stroke', ctx.strokeStyle);\n strokeStyle = strokeStyle.addOpacity(this.style('stroke-opacity'));\n ctx.strokeStyle = strokeStyle.value;\n }\n if (this.style('stroke-width').hasValue()) {\n const newLineWidth = this.style('stroke-width').toPixels();\n ctx.lineWidth = newLineWidth === 0 ? 0.001 : newLineWidth; // browsers don't respect 0\n }\n if (this.style('stroke-linecap').hasValue()) ctx.lineCap = this.style('stroke-linecap').value;\n if (this.style('stroke-linejoin').hasValue()) ctx.lineJoin = this.style('stroke-linejoin').value;\n if (this.style('stroke-miterlimit').hasValue()) ctx.miterLimit = this.style('stroke-miterlimit').value;\n if (this.style('stroke-dasharray').hasValue() && this.style('stroke-dasharray').value !== 'none') {\n const gaps = svg.ToNumberArray(this.style('stroke-dasharray').value);\n if (typeof ctx.setLineDash !== 'undefined') {\n ctx.setLineDash(gaps);\n } else if (typeof ctx.webkitLineDash !== 'undefined') {\n ctx.webkitLineDash = gaps;\n } else if (typeof ctx.mozDash !== 'undefined' && !(gaps.length === 1 && gaps[0] === 0)) {\n ctx.mozDash = gaps;\n }\n\n const offset = this.style('stroke-dashoffset').numValueOrDefault(1);\n if (typeof ctx.lineDashOffset !== 'undefined') {\n ctx.lineDashOffset = offset;\n } else if (typeof ctx.webkitLineDashOffset !== 'undefined') {\n ctx.webkitLineDashOffset = offset;\n } else if (typeof ctx.mozDashOffset !== 'undefined') {\n ctx.mozDashOffset = offset;\n }\n }\n\n // font\n if (typeof ctx.font !== 'undefined') {\n ctx.font = svg.Font.CreateFont(\n this.style('font-style').value,\n this.style('font-variant').value,\n this.style('font-weight').value,\n this.style('font-size').hasValue() ? this.style('font-size').toPixels() + 'px' : '',\n this.style('font-family').value\n ).toString();\n }\n\n // transform\n if (this.attribute('transform').hasValue()) {\n const transform = new svg.Transform(this.attribute('transform').value);\n transform.apply(ctx);\n }\n\n // clip\n if (this.style('clip-path', false, true).hasValue()) {\n const clip = this.style('clip-path', false, true).getDefinition();\n if (!isNullish(clip)) clip.apply(ctx);\n }\n\n // opacity\n if (this.style('opacity').hasValue()) {\n ctx.globalAlpha = this.style('opacity').numValue();\n }\n }\n };\n\n svg.Element.PathElementBase = class extends svg.Element.RenderedElementBase {\n path (ctx) {\n if (!isNullish(ctx)) ctx.beginPath();\n return new svg.BoundingBox();\n }\n\n renderChildren (ctx) {\n this.path(ctx);\n svg.Mouse.checkPath(this, ctx);\n if (ctx.fillStyle !== '') {\n if (this.style('fill-rule').valueOrDefault('inherit') !== 'inherit') {\n ctx.fill(this.style('fill-rule').value);\n } else {\n ctx.fill();\n }\n }\n if (ctx.strokeStyle !== '') ctx.stroke();\n\n const markers = this.getMarkers();\n if (!isNullish(markers)) {\n if (this.style('marker-start').isUrlDefinition()) {\n const marker = this.style('marker-start').getDefinition();\n marker.render(ctx, markers[0][0], markers[0][1]);\n }\n if (this.style('marker-mid').isUrlDefinition()) {\n const marker = this.style('marker-mid').getDefinition();\n for (let i = 1; i < markers.length - 1; i++) {\n marker.render(ctx, markers[i][0], markers[i][1]);\n }\n }\n if (this.style('marker-end').isUrlDefinition()) {\n const marker = this.style('marker-end').getDefinition();\n marker.render(ctx, markers[markers.length - 1][0], markers[markers.length - 1][1]);\n }\n }\n }\n\n getBoundingBox () {\n return this.path();\n }\n\n getMarkers () {\n return null;\n }\n };\n\n // svg element\n svg.Element.svg = class extends svg.Element.RenderedElementBase {\n clearContext (ctx) {\n super.clearContext(ctx);\n svg.ViewPort.RemoveCurrent();\n }\n\n setContext (ctx) {\n // initial values and defaults\n ctx.strokeStyle = 'rgba(0,0,0,0)';\n ctx.lineCap = 'butt';\n ctx.lineJoin = 'miter';\n ctx.miterLimit = 4;\n if (typeof ctx.font !== 'undefined' && typeof window.getComputedStyle !== 'undefined') {\n ctx.font = window.getComputedStyle(ctx.canvas).getPropertyValue('font');\n }\n\n super.setContext(ctx);\n\n // create new view port\n if (!this.attribute('x').hasValue()) this.attribute('x', true).value = 0;\n if (!this.attribute('y').hasValue()) this.attribute('y', true).value = 0;\n ctx.translate(this.attribute('x').toPixels('x'), this.attribute('y').toPixels('y'));\n\n let width = svg.ViewPort.width();\n let height = svg.ViewPort.height();\n\n if (!this.attribute('width').hasValue()) this.attribute('width', true).value = '100%';\n if (!this.attribute('height').hasValue()) this.attribute('height', true).value = '100%';\n if (typeof this.root === 'undefined') {\n width = this.attribute('width').toPixels('x');\n height = this.attribute('height').toPixels('y');\n\n let x = 0;\n let y = 0;\n if (this.attribute('refX').hasValue() && this.attribute('refY').hasValue()) {\n x = -this.attribute('refX').toPixels('x');\n y = -this.attribute('refY').toPixels('y');\n }\n\n if (this.attribute('overflow').valueOrDefault('hidden') !== 'visible') {\n ctx.beginPath();\n ctx.moveTo(x, y);\n ctx.lineTo(width, y);\n ctx.lineTo(width, height);\n ctx.lineTo(x, height);\n ctx.closePath();\n ctx.clip();\n }\n }\n svg.ViewPort.SetCurrent(width, height);\n\n // viewbox\n if (this.attribute('viewBox').hasValue()) {\n const viewBox = svg.ToNumberArray(this.attribute('viewBox').value);\n const minX = viewBox[0];\n const minY = viewBox[1];\n width = viewBox[2];\n height = viewBox[3];\n\n svg.AspectRatio(\n ctx,\n this.attribute('preserveAspectRatio').value,\n svg.ViewPort.width(),\n width,\n svg.ViewPort.height(),\n height,\n minX,\n minY,\n this.attribute('refX').value,\n this.attribute('refY').value\n );\n\n svg.ViewPort.RemoveCurrent();\n svg.ViewPort.SetCurrent(viewBox[2], viewBox[3]);\n }\n }\n };\n\n // rect element\n svg.Element.rect = class extends svg.Element.PathElementBase {\n path (ctx) {\n const x = this.attribute('x').toPixels('x');\n const y = this.attribute('y').toPixels('y');\n const width = this.attribute('width').toPixels('x');\n const height = this.attribute('height').toPixels('y');\n let rx = this.attribute('rx').toPixels('x');\n let ry = this.attribute('ry').toPixels('y');\n if (this.attribute('rx').hasValue() && !this.attribute('ry').hasValue()) ry = rx;\n if (this.attribute('ry').hasValue() && !this.attribute('rx').hasValue()) rx = ry;\n rx = Math.min(rx, width / 2.0);\n ry = Math.min(ry, height / 2.0);\n if (!isNullish(ctx)) {\n ctx.beginPath();\n ctx.moveTo(x + rx, y);\n ctx.lineTo(x + width - rx, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + ry);\n ctx.lineTo(x + width, y + height - ry);\n ctx.quadraticCurveTo(x + width, y + height, x + width - rx, y + height);\n ctx.lineTo(x + rx, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - ry);\n ctx.lineTo(x, y + ry);\n ctx.quadraticCurveTo(x, y, x + rx, y);\n ctx.closePath();\n }\n\n return new svg.BoundingBox(x, y, x + width, y + height);\n }\n };\n\n // circle element\n svg.Element.circle = class extends svg.Element.PathElementBase {\n path (ctx) {\n const cx = this.attribute('cx').toPixels('x');\n const cy = this.attribute('cy').toPixels('y');\n const r = this.attribute('r').toPixels();\n\n if (!isNullish(ctx)) {\n ctx.beginPath();\n ctx.arc(cx, cy, r, 0, Math.PI * 2, true);\n ctx.closePath();\n }\n\n return new svg.BoundingBox(cx - r, cy - r, cx + r, cy + r);\n }\n };\n\n // ellipse element\n const KAPPA = 4 * ((Math.sqrt(2) - 1) / 3);\n svg.Element.ellipse = class extends svg.Element.PathElementBase {\n path (ctx) {\n const rx = this.attribute('rx').toPixels('x');\n const ry = this.attribute('ry').toPixels('y');\n const cx = this.attribute('cx').toPixels('x');\n const cy = this.attribute('cy').toPixels('y');\n\n if (!isNullish(ctx)) {\n ctx.beginPath();\n ctx.moveTo(cx, cy - ry);\n ctx.bezierCurveTo(cx + (KAPPA * rx), cy - ry, cx + rx, cy - (KAPPA * ry), cx + rx, cy);\n ctx.bezierCurveTo(cx + rx, cy + (KAPPA * ry), cx + (KAPPA * rx), cy + ry, cx, cy + ry);\n ctx.bezierCurveTo(cx - (KAPPA * rx), cy + ry, cx - rx, cy + (KAPPA * ry), cx - rx, cy);\n ctx.bezierCurveTo(cx - rx, cy - (KAPPA * ry), cx - (KAPPA * rx), cy - ry, cx, cy - ry);\n ctx.closePath();\n }\n\n return new svg.BoundingBox(cx - rx, cy - ry, cx + rx, cy + ry);\n }\n };\n\n // line element\n svg.Element.line = class extends svg.Element.PathElementBase {\n getPoints () {\n return [\n new svg.Point(this.attribute('x1').toPixels('x'), this.attribute('y1').toPixels('y')),\n new svg.Point(this.attribute('x2').toPixels('x'), this.attribute('y2').toPixels('y'))\n ];\n }\n\n path (ctx) {\n const points = this.getPoints();\n\n if (!isNullish(ctx)) {\n ctx.beginPath();\n ctx.moveTo(points[0].x, points[0].y);\n ctx.lineTo(points[1].x, points[1].y);\n }\n\n return new svg.BoundingBox(points[0].x, points[0].y, points[1].x, points[1].y);\n }\n\n getMarkers () {\n const points = this.getPoints();\n const a = points[0].angleTo(points[1]);\n return [[points[0], a], [points[1], a]];\n }\n };\n\n // polyline element\n svg.Element.polyline = class extends svg.Element.PathElementBase {\n constructor (node) {\n super(node);\n\n this.points = svg.CreatePath(this.attribute('points').value);\n }\n path (ctx) {\n const {x, y} = this.points[0];\n const bb = new svg.BoundingBox(x, y);\n if (!isNullish(ctx)) {\n ctx.beginPath();\n ctx.moveTo(x, y);\n }\n for (let i = 1; i < this.points.length; i++) {\n const {x: _x, y: _y} = this.points[i];\n bb.addPoint(_x, _y);\n if (!isNullish(ctx)) ctx.lineTo(_x, _y);\n }\n return bb;\n }\n\n getMarkers () {\n const markers = [];\n for (let i = 0; i < this.points.length - 1; i++) {\n markers.push([this.points[i], this.points[i].angleTo(this.points[i + 1])]);\n }\n markers.push([this.points[this.points.length - 1], markers[markers.length - 1][1]]);\n return markers;\n }\n };\n\n // polygon element\n svg.Element.polygon = class extends svg.Element.polyline {\n path (ctx) {\n const bb = super.path(ctx);\n if (!isNullish(ctx)) {\n ctx.lineTo(this.points[0].x, this.points[0].y);\n ctx.closePath();\n }\n return bb;\n }\n };\n\n // path element\n svg.Element.path = class extends svg.Element.PathElementBase {\n constructor (node) {\n super(node);\n\n let d = this.attribute('d').value\n // TODO: convert to real lexer based on https://www.w3.org/TR/SVG11/paths.html#PathDataBNF\n .replace(/,/gm, ' ') // get rid of all commas\n .replace(/([MmZzLlHhVvCcSsQqTtAa])([MmZzLlHhVvCcSsQqTtAa])/gm, '$1 $2') // separate commands from commands\n .replace(/([MmZzLlHhVvCcSsQqTtAa])([MmZzLlHhVvCcSsQqTtAa])/gm, '$1 $2') // separate commands from commands\n .replace(/([MmZzLlHhVvCcSsQqTtAa])(\\S)/gm, '$1 $2') // separate commands from points\n .replace(/(\\S)([MmZzLlHhVvCcSsQqTtAa])/gm, '$1 $2') // separate commands from points\n .replace(/(\\d)([+-])/gm, '$1 $2') // separate digits when no comma\n .replace(/(\\.\\d*)(\\.)/gm, '$1 $2') // separate digits when no comma\n .replace(/([Aa](\\s+\\d+)(\\s+\\d+)(\\s+\\d+))\\s+([01])\\s*([01])/gm, '$1 $5 $6 '); // shorthand elliptical arc path syntax\n d = svg.compressSpaces(d); // compress multiple spaces\n d = svg.trim(d);\n this.PathParser = {\n tokens: d.split(' '),\n\n reset () {\n this.i = -1;\n this.command = '';\n this.previousCommand = '';\n this.start = new svg.Point(0, 0);\n this.control = new svg.Point(0, 0);\n this.current = new svg.Point(0, 0);\n this.points = [];\n this.angles = [];\n },\n\n isEnd () {\n return this.i >= this.tokens.length - 1;\n },\n\n isCommandOrEnd () {\n if (this.isEnd()) return true;\n return !isNullish(this.tokens[this.i + 1].match(/^[A-Za-z]$/));\n },\n\n isRelativeCommand () {\n switch (this.command) {\n case 'm':\n case 'l':\n case 'h':\n case 'v':\n case 'c':\n case 's':\n case 'q':\n case 't':\n case 'a':\n case 'z':\n return true;\n }\n return false;\n },\n\n getToken () {\n this.i++;\n return this.tokens[this.i];\n },\n\n getScalar () {\n return Number.parseFloat(this.getToken());\n },\n\n nextCommand () {\n this.previousCommand = this.command;\n this.command = this.getToken();\n },\n\n getPoint () {\n const p = new svg.Point(this.getScalar(), this.getScalar());\n return this.makeAbsolute(p);\n },\n\n getAsControlPoint () {\n const p = this.getPoint();\n this.control = p;\n return p;\n },\n\n getAsCurrentPoint () {\n const p = this.getPoint();\n this.current = p;\n return p;\n },\n\n getReflectedControlPoint () {\n if (this.previousCommand.toLowerCase() !== 'c' &&\n this.previousCommand.toLowerCase() !== 's' &&\n this.previousCommand.toLowerCase() !== 'q' &&\n this.previousCommand.toLowerCase() !== 't') {\n return this.current;\n }\n\n // reflect point\n const p = new svg.Point(2 * this.current.x - this.control.x, 2 * this.current.y - this.control.y);\n return p;\n },\n\n makeAbsolute (p) {\n if (this.isRelativeCommand()) {\n p.x += this.current.x;\n p.y += this.current.y;\n }\n return p;\n },\n\n addMarker (p, from, priorTo) {\n // if the last angle isn't filled in because we didn't have this point yet ...\n if (!isNullish(priorTo) && this.angles.length > 0 && isNullish(this.angles[this.angles.length - 1])) {\n this.angles[this.angles.length - 1] = this.points[this.points.length - 1].angleTo(priorTo);\n }\n this.addMarkerAngle(p, isNullish(from) ? null : from.angleTo(p));\n },\n\n addMarkerAngle (p, a) {\n this.points.push(p);\n this.angles.push(a);\n },\n\n getMarkerPoints () { return this.points; },\n getMarkerAngles () {\n for (let i = 0; i < this.angles.length; i++) {\n if (isNullish(this.angles[i])) {\n for (let j = i + 1; j < this.angles.length; j++) {\n if (!isNullish(this.angles[j])) {\n this.angles[i] = this.angles[j];\n break;\n }\n }\n }\n }\n return this.angles;\n }\n };\n }\n\n path (ctx) {\n const pp = this.PathParser;\n pp.reset();\n\n const bb = new svg.BoundingBox();\n if (!isNullish(ctx)) ctx.beginPath();\n while (!pp.isEnd()) {\n pp.nextCommand();\n switch (pp.command) {\n case 'M':\n case 'm': {\n const p = pp.getAsCurrentPoint();\n pp.addMarker(p);\n bb.addPoint(p.x, p.y);\n if (!isNullish(ctx)) ctx.moveTo(p.x, p.y);\n pp.start = pp.current;\n while (!pp.isCommandOrEnd()) {\n const _p = pp.getAsCurrentPoint();\n pp.addMarker(_p, pp.start);\n bb.addPoint(_p.x, _p.y);\n if (!isNullish(ctx)) ctx.lineTo(_p.x, _p.y);\n }\n break;\n } case 'L':\n case 'l':\n while (!pp.isCommandOrEnd()) {\n const c = pp.current;\n const p = pp.getAsCurrentPoint();\n pp.addMarker(p, c);\n bb.addPoint(p.x, p.y);\n if (!isNullish(ctx)) ctx.lineTo(p.x, p.y);\n }\n break;\n case 'H':\n case 'h':\n while (!pp.isCommandOrEnd()) {\n const newP = new svg.Point((pp.isRelativeCommand() ? pp.current.x : 0) + pp.getScalar(), pp.current.y);\n pp.addMarker(newP, pp.current);\n pp.current = newP;\n bb.addPoint(pp.current.x, pp.current.y);\n if (!isNullish(ctx)) ctx.lineTo(pp.current.x, pp.current.y);\n }\n break;\n case 'V':\n case 'v':\n while (!pp.isCommandOrEnd()) {\n const newP = new svg.Point(pp.current.x, (pp.isRelativeCommand() ? pp.current.y : 0) + pp.getScalar());\n pp.addMarker(newP, pp.current);\n pp.current = newP;\n bb.addPoint(pp.current.x, pp.current.y);\n if (!isNullish(ctx)) ctx.lineTo(pp.current.x, pp.current.y);\n }\n break;\n case 'C':\n case 'c':\n while (!pp.isCommandOrEnd()) {\n const curr = pp.current;\n const p1 = pp.getPoint();\n const cntrl = pp.getAsControlPoint();\n const cp = pp.getAsCurrentPoint();\n pp.addMarker(cp, cntrl, p1);\n bb.addBezierCurve(curr.x, curr.y, p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);\n if (!isNullish(ctx)) ctx.bezierCurveTo(p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);\n }\n break;\n case 'S':\n case 's':\n while (!pp.isCommandOrEnd()) {\n const curr = pp.current;\n const p1 = pp.getReflectedControlPoint();\n const cntrl = pp.getAsControlPoint();\n const cp = pp.getAsCurrentPoint();\n pp.addMarker(cp, cntrl, p1);\n bb.addBezierCurve(curr.x, curr.y, p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);\n if (!isNullish(ctx)) ctx.bezierCurveTo(p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);\n }\n break;\n case 'Q':\n case 'q':\n while (!pp.isCommandOrEnd()) {\n const curr = pp.current;\n const cntrl = pp.getAsControlPoint();\n const cp = pp.getAsCurrentPoint();\n pp.addMarker(cp, cntrl, cntrl);\n bb.addQuadraticCurve(curr.x, curr.y, cntrl.x, cntrl.y, cp.x, cp.y);\n if (!isNullish(ctx)) ctx.quadraticCurveTo(cntrl.x, cntrl.y, cp.x, cp.y);\n }\n break;\n case 'T':\n case 't':\n while (!pp.isCommandOrEnd()) {\n const curr = pp.current;\n const cntrl = pp.getReflectedControlPoint();\n pp.control = cntrl;\n const cp = pp.getAsCurrentPoint();\n pp.addMarker(cp, cntrl, cntrl);\n bb.addQuadraticCurve(curr.x, curr.y, cntrl.x, cntrl.y, cp.x, cp.y);\n if (!isNullish(ctx)) ctx.quadraticCurveTo(cntrl.x, cntrl.y, cp.x, cp.y);\n }\n break;\n case 'A':\n case 'a':\n while (!pp.isCommandOrEnd()) {\n const curr = pp.current;\n let rx = pp.getScalar();\n let ry = pp.getScalar();\n const xAxisRotation = pp.getScalar() * (Math.PI / 180.0);\n const largeArcFlag = pp.getScalar();\n const sweepFlag = pp.getScalar();\n const cp = pp.getAsCurrentPoint();\n\n // Conversion from endpoint to center parameterization\n // https://www.w3.org/TR/SVG11/implnote.html#ArcConversionEndpointToCenter\n\n // x1', y1'\n const currp = new svg.Point(\n Math.cos(xAxisRotation) * (curr.x - cp.x) / 2.0 + Math.sin(xAxisRotation) * (curr.y - cp.y) / 2.0,\n -Math.sin(xAxisRotation) * (curr.x - cp.x) / 2.0 + Math.cos(xAxisRotation) * (curr.y - cp.y) / 2.0\n );\n // adjust radii\n const l = (currp.x ** 2) / (rx ** 2) + (currp.y ** 2) / (ry ** 2);\n if (l > 1) {\n rx *= Math.sqrt(l);\n ry *= Math.sqrt(l);\n }\n // cx', cy'\n let s = (largeArcFlag === sweepFlag ? -1 : 1) * Math.sqrt(\n (((rx ** 2) * (ry ** 2)) - ((rx ** 2) * (currp.y ** 2)) - ((ry ** 2) * (currp.x ** 2))) /\n ((rx ** 2) * (currp.y ** 2) + (ry ** 2) * (currp.x ** 2))\n );\n if (isNaN(s)) s = 0;\n const cpp = new svg.Point(s * rx * currp.y / ry, s * -ry * currp.x / rx);\n // cx, cy\n const centp = new svg.Point(\n (curr.x + cp.x) / 2.0 + Math.cos(xAxisRotation) * cpp.x - Math.sin(xAxisRotation) * cpp.y,\n (curr.y + cp.y) / 2.0 + Math.sin(xAxisRotation) * cpp.x + Math.cos(xAxisRotation) * cpp.y\n );\n // vector magnitude\n const m = function (v) {\n return Math.sqrt((v[0] ** 2) + (v[1] ** 2));\n };\n // ratio between two vectors\n const r = function (u, v) {\n return (u[0] * v[0] + u[1] * v[1]) / (m(u) * m(v));\n };\n // angle between two vectors\n const a = function (u, v) {\n return (u[0] * v[1] < u[1] * v[0] ? -1 : 1) * Math.acos(r(u, v));\n };\n // initial angle\n const a1 = a([1, 0], [(currp.x - cpp.x) / rx, (currp.y - cpp.y) / ry]);\n // angle delta\n const u = [(currp.x - cpp.x) / rx, (currp.y - cpp.y) / ry];\n const v = [(-currp.x - cpp.x) / rx, (-currp.y - cpp.y) / ry];\n let ad = a(u, v);\n if (r(u, v) <= -1) ad = Math.PI;\n if (r(u, v) >= 1) ad = 0;\n\n // for markers\n const dir = 1 - sweepFlag ? 1.0 : -1.0;\n const ah = a1 + dir * (ad / 2.0);\n const halfWay = new svg.Point(\n centp.x + rx * Math.cos(ah),\n centp.y + ry * Math.sin(ah)\n );\n pp.addMarkerAngle(halfWay, ah - dir * Math.PI / 2);\n pp.addMarkerAngle(cp, ah - dir * Math.PI);\n\n bb.addPoint(cp.x, cp.y); // TODO: this is too naive, make it better\n if (!isNullish(ctx)) {\n const _r = rx > ry ? rx : ry;\n const sx = rx > ry ? 1 : rx / ry;\n const sy = rx > ry ? ry / rx : 1;\n\n ctx.translate(centp.x, centp.y);\n ctx.rotate(xAxisRotation);\n ctx.scale(sx, sy);\n ctx.arc(0, 0, _r, a1, a1 + ad, 1 - sweepFlag);\n ctx.scale(1 / sx, 1 / sy);\n ctx.rotate(-xAxisRotation);\n ctx.translate(-centp.x, -centp.y);\n }\n }\n break;\n case 'Z':\n case 'z':\n if (!isNullish(ctx)) ctx.closePath();\n pp.current = pp.start;\n }\n }\n\n return bb;\n }\n\n getMarkers () {\n const points = this.PathParser.getMarkerPoints();\n const angles = this.PathParser.getMarkerAngles();\n\n const markers = points.map((point, i) => {\n return [point, angles[i]];\n });\n return markers;\n }\n };\n\n // pattern element\n svg.Element.pattern = class extends svg.Element.ElementBase {\n createPattern (ctx, element) {\n const width = this.attribute('width').toPixels('x', true);\n const height = this.attribute('height').toPixels('y', true);\n\n // render me using a temporary svg element\n const tempSvg = new svg.Element.svg();\n tempSvg.attributes.viewBox = new svg.Property('viewBox', this.attribute('viewBox').value);\n tempSvg.attributes.width = new svg.Property('width', width + 'px');\n tempSvg.attributes.height = new svg.Property('height', height + 'px');\n tempSvg.attributes.transform = new svg.Property('transform', this.attribute('patternTransform').value);\n tempSvg.children = this.children;\n\n const c = document.createElement('canvas');\n c.width = width;\n c.height = height;\n const cctx = c.getContext('2d');\n if (this.attribute('x').hasValue() && this.attribute('y').hasValue()) {\n cctx.translate(this.attribute('x').toPixels('x', true), this.attribute('y').toPixels('y', true));\n }\n // render 3x3 grid so when we transform there's no white space on edges\n for (let x = -1; x <= 1; x++) {\n for (let y = -1; y <= 1; y++) {\n cctx.save();\n cctx.translate(x * c.width, y * c.height);\n tempSvg.render(cctx);\n cctx.restore();\n }\n }\n const pattern = ctx.createPattern(c, 'repeat');\n return pattern;\n }\n };\n\n // marker element\n svg.Element.marker = class extends svg.Element.ElementBase {\n render (ctx, point, angle) {\n ctx.translate(point.x, point.y);\n if (this.attribute('orient').valueOrDefault('auto') === 'auto') ctx.rotate(angle);\n if (this.attribute('markerUnits').valueOrDefault('strokeWidth') === 'strokeWidth') ctx.scale(ctx.lineWidth, ctx.lineWidth);\n ctx.save();\n\n // render me using a temporary svg element\n const tempSvg = new svg.Element.svg();\n tempSvg.attributes.viewBox = new svg.Property(\n 'viewBox', this.attribute('viewBox').value\n );\n tempSvg.attributes.refX = new svg.Property(\n 'refX', this.attribute('refX').value\n );\n tempSvg.attributes.refY = new svg.Property(\n 'refY', this.attribute('refY').value\n );\n tempSvg.attributes.width = new svg.Property(\n 'width', this.attribute('markerWidth').value\n );\n tempSvg.attributes.height = new svg.Property(\n 'height', this.attribute('markerHeight').value\n );\n tempSvg.attributes.fill = new svg.Property(\n 'fill', this.attribute('fill').valueOrDefault('black')\n );\n tempSvg.attributes.stroke = new svg.Property(\n 'stroke', this.attribute('stroke').valueOrDefault('none')\n );\n tempSvg.children = this.children;\n tempSvg.render(ctx);\n\n ctx.restore();\n if (this.attribute('markerUnits').valueOrDefault('strokeWidth') ===\n 'strokeWidth'\n ) ctx.scale(1 / ctx.lineWidth, 1 / ctx.lineWidth);\n if (this.attribute('orient').valueOrDefault('auto') === 'auto') {\n ctx.rotate(-angle);\n }\n ctx.translate(-point.x, -point.y);\n }\n };\n\n // definitions element\n svg.Element.defs = class extends svg.Element.ElementBase {\n render (ctx) {\n // NOOP\n }\n };\n\n // base for gradients\n svg.Element.GradientBase = class extends svg.Element.ElementBase {\n constructor (node) {\n super(node);\n\n this.gradientUnits = this.attribute('gradientUnits').valueOrDefault('objectBoundingBox');\n\n this.stops = [];\n this.children.forEach((child) => {\n if (child.type === 'stop') {\n this.stops.push(child);\n }\n });\n }\n\n getGradient () {\n // OVERRIDE ME!\n }\n\n createGradient (ctx, element, parentOpacityProp) {\n const stopsContainer = this.getHrefAttribute().hasValue()\n ? this.getHrefAttribute().getDefinition()\n : this;\n\n const addParentOpacity = function (color) {\n if (parentOpacityProp.hasValue()) {\n const p = new svg.Property('color', color);\n return p.addOpacity(parentOpacityProp).value;\n }\n return color;\n };\n\n const g = this.getGradient(ctx, element);\n if (isNullish(g)) return addParentOpacity(stopsContainer.stops[stopsContainer.stops.length - 1].color);\n stopsContainer.stops.forEach(({offset, color}) => {\n g.addColorStop(offset, addParentOpacity(color));\n });\n\n if (this.attribute('gradientTransform').hasValue()) {\n // render as transformed pattern on temporary canvas\n const rootView = svg.ViewPort.viewPorts[0];\n\n const rect = new svg.Element.rect();\n rect.attributes.x = new svg.Property('x', -svg.MAX_VIRTUAL_PIXELS / 3.0);\n rect.attributes.y = new svg.Property('y', -svg.MAX_VIRTUAL_PIXELS / 3.0);\n rect.attributes.width = new svg.Property('width', svg.MAX_VIRTUAL_PIXELS);\n rect.attributes.height = new svg.Property('height', svg.MAX_VIRTUAL_PIXELS);\n\n const group = new svg.Element.g();\n group.attributes.transform = new svg.Property('transform', this.attribute('gradientTransform').value);\n group.children = [rect];\n\n const tempSvg = new svg.Element.svg();\n tempSvg.attributes.x = new svg.Property('x', 0);\n tempSvg.attributes.y = new svg.Property('y', 0);\n tempSvg.attributes.width = new svg.Property('width', rootView.width);\n tempSvg.attributes.height = new svg.Property('height', rootView.height);\n tempSvg.children = [group];\n\n const c = document.createElement('canvas');\n c.width = rootView.width;\n c.height = rootView.height;\n const tempCtx = c.getContext('2d');\n tempCtx.fillStyle = g;\n tempSvg.render(tempCtx);\n return tempCtx.createPattern(c, 'no-repeat');\n }\n\n return g;\n }\n };\n\n // linear gradient element\n svg.Element.linearGradient = class extends svg.Element.GradientBase {\n getGradient (ctx, element) {\n const useBB = this.gradientUnits === 'objectBoundingBox' && element.getBoundingBox;\n const bb = useBB\n ? element.getBoundingBox()\n : null;\n\n if (!this.attribute('x1').hasValue() &&\n !this.attribute('y1').hasValue() &&\n !this.attribute('x2').hasValue() &&\n !this.attribute('y2').hasValue()\n ) {\n this.attribute('x1', true).value = 0;\n this.attribute('y1', true).value = 0;\n this.attribute('x2', true).value = 1;\n this.attribute('y2', true).value = 0;\n }\n\n const x1 = (useBB\n ? bb.x() + bb.width() * this.attribute('x1').numValue()\n : this.attribute('x1').toPixels('x'));\n const y1 = (useBB\n ? bb.y() + bb.height() * this.attribute('y1').numValue()\n : this.attribute('y1').toPixels('y'));\n const x2 = (useBB\n ? bb.x() + bb.width() * this.attribute('x2').numValue()\n : this.attribute('x2').toPixels('x'));\n const y2 = (useBB\n ? bb.y() + bb.height() * this.attribute('y2').numValue()\n : this.attribute('y2').toPixels('y'));\n\n if (x1 === x2 && y1 === y2) return null;\n return ctx.createLinearGradient(x1, y1, x2, y2);\n }\n };\n\n // radial gradient element\n svg.Element.radialGradient = class extends svg.Element.GradientBase {\n getGradient (ctx, element) {\n const useBB = this.gradientUnits === 'objectBoundingBox' && element.getBoundingBox;\n const bb = useBB ? element.getBoundingBox() : null;\n\n if (!this.attribute('cx').hasValue()) this.attribute('cx', true).value = '50%';\n if (!this.attribute('cy').hasValue()) this.attribute('cy', true).value = '50%';\n if (!this.attribute('r').hasValue()) this.attribute('r', true).value = '50%';\n\n const cx = (useBB\n ? bb.x() + bb.width() * this.attribute('cx').numValue()\n : this.attribute('cx').toPixels('x'));\n const cy = (useBB\n ? bb.y() + bb.height() * this.attribute('cy').numValue()\n : this.attribute('cy').toPixels('y'));\n\n let fx = cx;\n let fy = cy;\n if (this.attribute('fx').hasValue()) {\n fx = (useBB\n ? bb.x() + bb.width() * this.attribute('fx').numValue()\n : this.attribute('fx').toPixels('x'));\n }\n if (this.attribute('fy').hasValue()) {\n fy = (useBB\n ? bb.y() + bb.height() * this.attribute('fy').numValue()\n : this.attribute('fy').toPixels('y'));\n }\n\n const r = (useBB\n ? (bb.width() + bb.height()) / 2.0 * this.attribute('r').numValue()\n : this.attribute('r').toPixels());\n\n return ctx.createRadialGradient(fx, fy, 0, cx, cy, r);\n }\n };\n\n // gradient stop element\n svg.Element.stop = class extends svg.Element.ElementBase {\n constructor (node) {\n super(node);\n\n this.offset = this.attribute('offset').numValue();\n if (this.offset < 0) this.offset = 0;\n if (this.offset > 1) this.offset = 1;\n\n let stopColor = this.style('stop-color');\n if (this.style('stop-opacity').hasValue()) {\n stopColor = stopColor.addOpacity(this.style('stop-opacity'));\n }\n this.color = stopColor.value;\n }\n };\n\n // animation base element\n svg.Element.AnimateBase = class extends svg.Element.ElementBase {\n constructor (node) {\n super(node);\n\n svg.Animations.push(this);\n\n this.duration = 0.0;\n this.begin = this.attribute('begin').toMilliseconds();\n this.maxDuration = this.begin + this.attribute('dur').toMilliseconds();\n\n this.initialValue = null;\n this.initialUnits = '';\n this.removed = false;\n\n this.from = this.attribute('from');\n this.to = this.attribute('to');\n this.values = this.attribute('values');\n if (this.values.hasValue()) this.values.value = this.values.value.split(';');\n }\n\n getProperty () {\n const attributeType = this.attribute('attributeType').value;\n const attributeName = this.attribute('attributeName').value;\n\n if (attributeType === 'CSS') {\n return this.parent.style(attributeName, true);\n }\n return this.parent.attribute(attributeName, true);\n }\n\n calcValue () {\n // OVERRIDE ME!\n return '';\n }\n\n update (delta) {\n // set initial value\n if (isNullish(this.initialValue)) {\n this.initialValue = this.getProperty().value;\n this.initialUnits = this.getProperty().getUnits();\n }\n\n // if we're past the end time\n if (this.duration > this.maxDuration) {\n // loop for indefinitely repeating animations\n if (this.attribute('repeatCount').value === 'indefinite' ||\n this.attribute('repeatDur').value === 'indefinite') {\n this.duration = 0.0;\n } else if (this.attribute('fill').valueOrDefault('remove') === 'freeze' && !this.frozen) {\n this.frozen = true;\n this.parent.animationFrozen = true;\n this.parent.animationFrozenValue = this.getProperty().value;\n } else if (this.attribute('fill').valueOrDefault('remove') === 'remove' && !this.removed) {\n this.removed = true;\n this.getProperty().value = this.parent.animationFrozen ? this.parent.animationFrozenValue : this.initialValue;\n return true;\n }\n return false;\n }\n this.duration += delta;\n\n // if we're past the begin time\n let updated = false;\n if (this.begin < this.duration) {\n let newValue = this.calcValue(); // tween\n\n if (this.attribute('type').hasValue()) {\n // for transform, etc.\n const type = this.attribute('type').value;\n newValue = type + '(' + newValue + ')';\n }\n\n this.getProperty().value = newValue;\n updated = true;\n }\n\n return updated;\n }\n\n // fraction of duration we've covered\n progress () {\n const ret = {progress: (this.duration - this.begin) / (this.maxDuration - this.begin)};\n if (this.values.hasValue()) {\n const p = ret.progress * (this.values.value.length - 1);\n const lb = Math.floor(p), ub = Math.ceil(p);\n ret.from = new svg.Property('from', Number.parseFloat(this.values.value[lb]));\n ret.to = new svg.Property('to', Number.parseFloat(this.values.value[ub]));\n ret.progress = (p - lb) / (ub - lb);\n } else {\n ret.from = this.from;\n ret.to = this.to;\n }\n return ret;\n }\n };\n\n // animate element\n svg.Element.animate = class extends svg.Element.AnimateBase {\n calcValue () {\n const p = this.progress();\n\n // tween value linearly\n const newValue = p.from.numValue() + (p.to.numValue() - p.from.numValue()) * p.progress;\n return newValue + this.initialUnits;\n }\n };\n\n // animate color element\n svg.Element.animateColor = class extends svg.Element.AnimateBase {\n calcValue () {\n const p = this.progress();\n const from = new RGBColor(p.from.value);\n const to = new RGBColor(p.to.value);\n\n if (from.ok && to.ok) {\n // tween color linearly\n const r = from.r + (to.r - from.r) * p.progress;\n const g = from.g + (to.g - from.g) * p.progress;\n const b = from.b + (to.b - from.b) * p.progress;\n return 'rgb(' + Number.parseInt(r) + ',' + Number.parseInt(g) + ',' + Number.parseInt(b) + ')';\n }\n return this.attribute('from').value;\n }\n };\n\n // animate transform element\n svg.Element.animateTransform = class extends svg.Element.animate {\n calcValue () {\n const p = this.progress();\n\n // tween value linearly\n const from = svg.ToNumberArray(p.from.value);\n const to = svg.ToNumberArray(p.to.value);\n let newValue = '';\n from.forEach((fr, i) => {\n newValue += fr + (to[i] - fr) * p.progress + ' ';\n });\n return newValue;\n }\n };\n\n // font element\n svg.Element.font = class extends svg.Element.ElementBase {\n constructor (node) {\n super(node);\n\n this.horizAdvX = this.attribute('horiz-adv-x').numValue();\n\n this.isRTL = false;\n this.isArabic = false;\n this.fontFace = null;\n this.missingGlyph = null;\n this.glyphs = [];\n this.children.forEach((child) => {\n if (child.type === 'font-face') {\n this.fontFace = child;\n if (child.style('font-family').hasValue()) {\n svg.Definitions[child.style('font-family').value] = this;\n }\n } else if (child.type === 'missing-glyph') {\n this.missingGlyph = child;\n } else if (child.type === 'glyph') {\n if (child.arabicForm !== '') {\n this.isRTL = true;\n this.isArabic = true;\n if (typeof this.glyphs[child.unicode] === 'undefined') {\n this.glyphs[child.unicode] = [];\n }\n this.glyphs[child.unicode][child.arabicForm] = child;\n } else {\n this.glyphs[child.unicode] = child;\n }\n }\n });\n }\n };\n\n // font-face element\n svg.Element.fontface = class extends svg.Element.ElementBase {\n constructor (node) {\n super(node);\n\n this.ascent = this.attribute('ascent').value;\n this.descent = this.attribute('descent').value;\n this.unitsPerEm = this.attribute('units-per-em').numValue();\n }\n };\n\n // missing-glyph element\n svg.Element.missingglyph = class extends svg.Element.path {\n constructor (node) {\n super(node);\n\n this.horizAdvX = 0;\n }\n };\n\n // glyph element\n svg.Element.glyph = class extends svg.Element.path {\n constructor (node) {\n super(node);\n\n this.horizAdvX = this.attribute('horiz-adv-x').numValue();\n this.unicode = this.attribute('unicode').value;\n this.arabicForm = this.attribute('arabic-form').value;\n }\n };\n\n // text element\n svg.Element.text = class extends svg.Element.RenderedElementBase {\n constructor (node) {\n super(node, true);\n }\n\n setContext (ctx) {\n super.setContext(ctx);\n\n let textBaseline = this.style('dominant-baseline').toTextBaseline();\n if (isNullish(textBaseline)) textBaseline = this.style('alignment-baseline').toTextBaseline();\n if (!isNullish(textBaseline)) ctx.textBaseline = textBaseline;\n }\n\n getBoundingBox () {\n const x = this.attribute('x').toPixels('x');\n const y = this.attribute('y').toPixels('y');\n const fontSize = this.parent.style('font-size').numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize);\n return new svg.BoundingBox(x, y - fontSize, x + Math.floor(fontSize * 2.0 / 3.0) * this.children[0].getText().length, y);\n }\n\n renderChildren (ctx) {\n this.x = this.attribute('x').toPixels('x');\n this.y = this.attribute('y').toPixels('y');\n this.x += this.getAnchorDelta(ctx, this, 0);\n this.children.forEach((child, i) => {\n this.renderChild(ctx, this, i);\n });\n }\n\n getAnchorDelta (ctx, parent, startI) {\n const textAnchor = this.style('text-anchor').valueOrDefault('start');\n if (textAnchor !== 'start') {\n let width = 0;\n for (let i = startI; i < parent.children.length; i++) {\n const child = parent.children[i];\n if (i > startI && child.attribute('x').hasValue()) break; // new group\n width += child.measureTextRecursive(ctx);\n }\n return -1 * (textAnchor === 'end' ? width : width / 2.0);\n }\n return 0;\n }\n\n renderChild (ctx, parent, i) {\n const child = parent.children[i];\n if (child.attribute('x').hasValue()) {\n child.x = child.attribute('x').toPixels('x') + this.getAnchorDelta(ctx, parent, i);\n if (child.attribute('dx').hasValue()) child.x += child.attribute('dx').toPixels('x');\n } else {\n if (this.attribute('dx').hasValue()) this.x += this.attribute('dx').toPixels('x');\n if (child.attribute('dx').hasValue()) this.x += child.attribute('dx').toPixels('x');\n child.x = this.x;\n }\n this.x = child.x + child.measureText(ctx);\n\n if (child.attribute('y').hasValue()) {\n child.y = child.attribute('y').toPixels('y');\n if (child.attribute('dy').hasValue()) child.y += child.attribute('dy').toPixels('y');\n } else {\n if (this.attribute('dy').hasValue()) this.y += this.attribute('dy').toPixels('y');\n if (child.attribute('dy').hasValue()) this.y += child.attribute('dy').toPixels('y');\n child.y = this.y;\n }\n this.y = child.y;\n\n child.render(ctx);\n\n for (let j = 0; j < child.children.length; j++) {\n this.renderChild(ctx, child, j);\n }\n }\n };\n\n // text base\n svg.Element.TextElementBase = class extends svg.Element.RenderedElementBase {\n getGlyph (font, text, i) {\n const c = text[i];\n let glyph = null;\n if (font.isArabic) {\n let arabicForm = 'isolated';\n if ((i === 0 || text[i - 1] === ' ') && i < text.length - 2 && text[i + 1] !== ' ') arabicForm = 'terminal';\n if (i > 0 && text[i - 1] !== ' ' && i < text.length - 2 && text[i + 1] !== ' ') arabicForm = 'medial';\n if (i > 0 && text[i - 1] !== ' ' && (i === text.length - 1 || text[i + 1] === ' ')) arabicForm = 'initial';\n if (typeof font.glyphs[c] !== 'undefined') {\n glyph = font.glyphs[c][arabicForm];\n if (isNullish(glyph) && font.glyphs[c].type === 'glyph') glyph = font.glyphs[c];\n }\n } else {\n glyph = font.glyphs[c];\n }\n if (isNullish(glyph)) glyph = font.missingGlyph;\n return glyph;\n }\n\n renderChildren (ctx) {\n const customFont = this.parent.style('font-family').getDefinition();\n if (!isNullish(customFont)) {\n const fontSize = this.parent.style('font-size').numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize);\n const fontStyle = this.parent.style('font-style').valueOrDefault(svg.Font.Parse(svg.ctx.font).fontStyle);\n let text = this.getText();\n if (customFont.isRTL) text = text.split('').reverse().join('');\n\n const dx = svg.ToNumberArray(this.parent.attribute('dx').value);\n for (let i = 0; i < text.length; i++) {\n const glyph = this.getGlyph(customFont, text, i);\n const scale = fontSize / customFont.fontFace.unitsPerEm;\n ctx.translate(this.x, this.y);\n ctx.scale(scale, -scale);\n const lw = ctx.lineWidth;\n ctx.lineWidth = ctx.lineWidth * customFont.fontFace.unitsPerEm / fontSize;\n if (fontStyle === 'italic') ctx.transform(1, 0, 0.4, 1, 0, 0);\n glyph.render(ctx);\n if (fontStyle === 'italic') ctx.transform(1, 0, -0.4, 1, 0, 0);\n ctx.lineWidth = lw;\n ctx.scale(1 / scale, -1 / scale);\n ctx.translate(-this.x, -this.y);\n\n this.x += fontSize * (glyph.horizAdvX || customFont.horizAdvX) / customFont.fontFace.unitsPerEm;\n if (typeof dx[i] !== 'undefined' && !isNaN(dx[i])) {\n this.x += dx[i];\n }\n }\n return;\n }\n\n if (ctx.fillStyle !== '') ctx.fillText(svg.compressSpaces(this.getText()), this.x, this.y);\n if (ctx.strokeStyle !== '') ctx.strokeText(svg.compressSpaces(this.getText()), this.x, this.y);\n }\n\n getText () {\n // OVERRIDE ME\n }\n\n measureTextRecursive (ctx) {\n let width = this.measureText(ctx);\n this.children.forEach((child) => {\n width += child.measureTextRecursive(ctx);\n });\n return width;\n }\n\n measureText (ctx) {\n const customFont = this.parent.style('font-family').getDefinition();\n if (!isNullish(customFont)) {\n const fontSize = this.parent.style('font-size').numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize);\n let measure = 0;\n let text = this.getText();\n if (customFont.isRTL) text = text.split('').reverse().join('');\n const dx = svg.ToNumberArray(this.parent.attribute('dx').value);\n for (let i = 0; i < text.length; i++) {\n const glyph = this.getGlyph(customFont, text, i);\n measure += (glyph.horizAdvX || customFont.horizAdvX) * fontSize / customFont.fontFace.unitsPerEm;\n if (typeof dx[i] !== 'undefined' && !isNaN(dx[i])) {\n measure += dx[i];\n }\n }\n return measure;\n }\n\n const textToMeasure = svg.compressSpaces(this.getText());\n if (!ctx.measureText) return textToMeasure.length * 10;\n\n ctx.save();\n this.setContext(ctx);\n const {width} = ctx.measureText(textToMeasure);\n ctx.restore();\n return width;\n }\n };\n\n // tspan\n svg.Element.tspan = class extends svg.Element.TextElementBase {\n constructor (node) {\n super(node, true);\n\n this.text = node.nodeValue || node.text || '';\n }\n getText () {\n return this.text;\n }\n };\n\n // tref\n svg.Element.tref = class extends svg.Element.TextElementBase {\n getText () {\n const element = this.getHrefAttribute().getDefinition();\n if (!isNullish(element)) return element.children[0].getText();\n return undefined;\n }\n };\n\n // a element\n svg.Element.a = class extends svg.Element.TextElementBase {\n constructor (node) {\n super(node);\n\n this.hasText = true;\n [...node.childNodes].forEach((childNode) => {\n if (childNode.nodeType !== 3) {\n this.hasText = false;\n }\n });\n // this might contain text\n this.text = this.hasText ? node.childNodes[0].nodeValue : '';\n }\n\n getText () {\n return this.text;\n }\n\n renderChildren (ctx) {\n if (this.hasText) {\n // render as text element\n super.renderChildren(ctx);\n const fontSize = new svg.Property(\n 'fontSize', svg.Font.Parse(svg.ctx.font).fontSize\n );\n svg.Mouse.checkBoundingBox(\n this, new svg.BoundingBox(\n this.x,\n this.y - fontSize.toPixels('y'),\n this.x + this.measureText(ctx),\n this.y\n )\n );\n } else {\n // render as temporary group\n const g = new svg.Element.g();\n g.children = this.children;\n g.parent = this;\n g.render(ctx);\n }\n }\n\n onclick () {\n window.open(this.getHrefAttribute().value);\n }\n\n onmousemove () {\n svg.ctx.canvas.style.cursor = 'pointer';\n }\n };\n\n // image element\n svg.Element.image = class extends svg.Element.RenderedElementBase {\n constructor (node) {\n super(node);\n\n const href = this.getHrefAttribute().value;\n if (href === '') {\n return;\n }\n this._isSvg = href.match(/\\.svg$/);\n\n svg.Images.push(this);\n this.loaded = false;\n if (!this._isSvg) {\n this.img = document.createElement('img');\n if (svg.opts.useCORS === true) {\n this.img.crossOrigin = 'Anonymous';\n }\n this.img.addEventListener('load', () => {\n this.loaded = true;\n });\n this.img.addEventListener('error', () => {\n svg.log('ERROR: image \"' + href + '\" not found');\n this.loaded = true;\n });\n this.img.src = href;\n } else {\n svg.ajax(href, true).then((img) => { // eslint-disable-line promise/prefer-await-to-then, promise/always-return\n this.img = img;\n this.loaded = true;\n }).catch((err) => { // eslint-disable-line promise/prefer-await-to-callbacks\n this.erred = true;\n console.error('Ajax error for canvg', err); // eslint-disable-line no-console\n });\n }\n }\n renderChildren (ctx) {\n const x = this.attribute('x').toPixels('x');\n const y = this.attribute('y').toPixels('y');\n\n const width = this.attribute('width').toPixels('x');\n const height = this.attribute('height').toPixels('y');\n if (width === 0 || height === 0) return;\n\n ctx.save();\n if (this._isSvg) {\n ctx.drawSvg(this.img, x, y, width, height);\n } else {\n ctx.translate(x, y);\n svg.AspectRatio(\n ctx,\n this.attribute('preserveAspectRatio').value,\n width,\n this.img.width,\n height,\n this.img.height,\n 0,\n 0\n );\n ctx.drawImage(this.img, 0, 0);\n }\n ctx.restore();\n }\n\n getBoundingBox () {\n const x = this.attribute('x').toPixels('x');\n const y = this.attribute('y').toPixels('y');\n const width = this.attribute('width').toPixels('x');\n const height = this.attribute('height').toPixels('y');\n return new svg.BoundingBox(x, y, x + width, y + height);\n }\n };\n\n // group element\n svg.Element.g = class extends svg.Element.RenderedElementBase {\n getBoundingBox () {\n const bb = new svg.BoundingBox();\n this.children.forEach((child) => {\n bb.addBoundingBox(child.getBoundingBox());\n });\n return bb;\n }\n };\n\n // symbol element\n svg.Element.symbol = class extends svg.Element.RenderedElementBase {\n render (ctx) {\n // NO RENDER\n }\n };\n\n // style element\n svg.Element.style = class extends svg.Element.ElementBase {\n constructor (node) {\n super(node);\n\n // text, or spaces then CDATA\n let css = '';\n [...node.childNodes].forEach(({nodeValue}) => {\n css += nodeValue;\n });\n // remove comments\n css = css.replace(/(\\/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+\\/)|(^\\s*\\/\\/.*)/gm, ''); // eslint-disable-line unicorn/no-unsafe-regex\n // replace whitespace\n css = svg.compressSpaces(css);\n const cssDefs = css.split('}');\n cssDefs.forEach((cssDef) => {\n if (svg.trim(cssDef) !== '') {\n let [cssClasses, cssProps] = cssDef.split('{');\n cssClasses = cssClasses.split(',');\n cssProps = cssProps.split(';');\n cssClasses.forEach((cssClass) => {\n cssClass = svg.trim(cssClass);\n if (cssClass !== '') {\n const props = {};\n cssProps.forEach((cssProp) => {\n const prop = cssProp.indexOf(':');\n const name = cssProp.substr(0, prop);\n const value = cssProp.substr(prop + 1, cssProp.length - prop);\n if (!isNullish(name) && !isNullish(value)) {\n props[svg.trim(name)] = new svg.Property(svg.trim(name), svg.trim(value));\n }\n });\n svg.Styles[cssClass] = props;\n if (cssClass === '@font-face') {\n const fontFamily = props['font-family'].value.replace(/\"/g, '');\n const srcs = props.src.value.split(',');\n srcs.forEach((src) => {\n if (src.includes('format(\"svg\")')) {\n const urlStart = src.indexOf('url');\n const urlEnd = src.indexOf(')', urlStart);\n const url = src.substr(urlStart + 5, urlEnd - urlStart - 6);\n // Can this ajax safely be converted to async?\n const doc = svg.parseXml(svg.ajax(url));\n const fonts = doc.getElementsByTagName('font');\n [...fonts].forEach((font) => {\n font = svg.CreateElement(font);\n svg.Definitions[fontFamily] = font;\n });\n }\n });\n }\n }\n });\n }\n });\n }\n };\n\n // use element\n svg.Element.use = class extends svg.Element.RenderedElementBase {\n constructor (node) {\n super(node);\n\n this._el = this.getHrefAttribute().getDefinition();\n }\n\n setContext (ctx) {\n super.setContext(ctx);\n if (this.attribute('x').hasValue()) ctx.translate(this.attribute('x').toPixels('x'), 0);\n if (this.attribute('y').hasValue()) ctx.translate(0, this.attribute('y').toPixels('y'));\n }\n\n path (ctx) {\n const {_el: element} = this;\n if (!isNullish(element)) element.path(ctx);\n }\n\n getBoundingBox () {\n const {_el: element} = this;\n if (!isNullish(element)) return element.getBoundingBox();\n return undefined;\n }\n\n renderChildren (ctx) {\n const {_el: element} = this;\n if (!isNullish(element)) {\n let tempSvg = element;\n if (element.type === 'symbol') {\n // render me using a temporary svg element in symbol cases\n // (https://www.w3.org/TR/SVG/struct.html#UseElement)\n tempSvg = new svg.Element.svg();\n tempSvg.type = 'svg';\n tempSvg.attributes.viewBox = new svg.Property(\n 'viewBox', element.attribute('viewBox').value\n );\n tempSvg.attributes.preserveAspectRatio = new svg.Property(\n 'preserveAspectRatio', element.attribute('preserveAspectRatio').value\n );\n tempSvg.attributes.overflow = new svg.Property(\n 'overflow', element.attribute('overflow').value\n );\n tempSvg.children = element.children;\n }\n if (tempSvg.type === 'svg') {\n // if symbol or svg, inherit width/height from me\n if (this.attribute('width').hasValue()) {\n tempSvg.attributes.width = new svg.Property(\n 'width', this.attribute('width').value\n );\n }\n if (this.attribute('height').hasValue()) {\n tempSvg.attributes.height = new svg.Property(\n 'height', this.attribute('height').value\n );\n }\n }\n const oldParent = tempSvg.parent;\n tempSvg.parent = null;\n tempSvg.render(ctx);\n tempSvg.parent = oldParent;\n }\n }\n };\n\n // mask element\n svg.Element.mask = class extends svg.Element.ElementBase {\n apply (ctx, element) {\n // render as temp svg\n let x = this.attribute('x').toPixels('x');\n let y = this.attribute('y').toPixels('y');\n let width = this.attribute('width').toPixels('x');\n let height = this.attribute('height').toPixels('y');\n\n if (width === 0 && height === 0) {\n const bb = new svg.BoundingBox();\n this.children.forEach((child) => {\n bb.addBoundingBox(child.getBoundingBox());\n });\n x = Math.floor(bb.x1);\n y = Math.floor(bb.y1);\n width = Math.floor(bb.width());\n height = Math.floor(bb.height());\n }\n\n // temporarily remove mask to avoid recursion\n const mask = element.attribute('mask').value;\n element.attribute('mask').value = '';\n\n const cMask = document.createElement('canvas');\n cMask.width = x + width;\n cMask.height = y + height;\n const maskCtx = cMask.getContext('2d');\n this.renderChildren(maskCtx);\n\n const c = document.createElement('canvas');\n c.width = x + width;\n c.height = y + height;\n const tempCtx = c.getContext('2d');\n element.render(tempCtx);\n tempCtx.globalCompositeOperation = 'destination-in';\n tempCtx.fillStyle = maskCtx.createPattern(cMask, 'no-repeat');\n tempCtx.fillRect(0, 0, x + width, y + height);\n\n ctx.fillStyle = tempCtx.createPattern(c, 'no-repeat');\n ctx.fillRect(0, 0, x + width, y + height);\n\n // reassign mask\n element.attribute('mask').value = mask;\n }\n\n render (ctx) {\n // NO RENDER\n }\n };\n\n // clip element\n svg.Element.clipPath = class extends svg.Element.ElementBase {\n apply (ctx) {\n this.children.forEach((child) => {\n if (typeof child.path !== 'undefined') {\n let transform = null;\n if (child.attribute('transform').hasValue()) {\n transform = new svg.Transform(child.attribute('transform').value);\n transform.apply(ctx);\n }\n child.path(ctx);\n ctx.clip();\n if (transform) { transform.unapply(ctx); }\n }\n });\n }\n render (ctx) {\n // NO RENDER\n }\n };\n\n // filters\n svg.Element.filter = class extends svg.Element.ElementBase {\n apply (ctx, element) {\n // render as temp svg\n const bb = element.getBoundingBox();\n const x = Math.floor(bb.x1);\n const y = Math.floor(bb.y1);\n const width = Math.floor(bb.width());\n const height = Math.floor(bb.height());\n\n // temporarily remove filter to avoid recursion\n const filter = element.style('filter').value;\n element.style('filter').value = '';\n\n let px = 0, py = 0;\n this.children.forEach((child) => {\n const efd = child.extraFilterDistance || 0;\n px = Math.max(px, efd);\n py = Math.max(py, efd);\n });\n\n const c = document.createElement('canvas');\n c.width = width + 2 * px;\n c.height = height + 2 * py;\n const tempCtx = c.getContext('2d');\n tempCtx.translate(-x + px, -y + py);\n element.render(tempCtx);\n\n // apply filters\n this.children.forEach((child) => {\n child.apply(tempCtx, 0, 0, width + 2 * px, height + 2 * py);\n });\n\n // render on me\n ctx.drawImage(c, 0, 0, width + 2 * px, height + 2 * py, x - px, y - py, width + 2 * px, height + 2 * py);\n\n // reassign filter\n element.style('filter', true).value = filter;\n }\n\n render (ctx) {\n // NO RENDER\n }\n };\n\n svg.Element.feMorphology = class extends svg.Element.ElementBase {\n apply (ctx, x, y, width, height) {\n // TODO: implement\n }\n };\n\n svg.Element.feComposite = class extends svg.Element.ElementBase {\n apply (ctx, x, y, width, height) {\n // TODO: implement\n }\n };\n\n /**\n * @param {Uint8ClampedArray} img\n * @param {Integer} x\n * @param {Integer} y\n * @param {Float} width\n * @param {Float} height\n * @param {Integer} rgba\n * @returns {Integer}\n */\n function imGet (img, x, y, width, height, rgba) {\n return img[y * width * 4 + x * 4 + rgba];\n }\n\n /**\n * @param {Uint8ClampedArray} img\n * @param {Integer} x\n * @param {Integer} y\n * @param {Float} width\n * @param {Float} height\n * @param {Integer} rgba\n * @param {Float} val\n * @returns {void}\n */\n function imSet (img, x, y, width, height, rgba, val) {\n img[y * width * 4 + x * 4 + rgba] = val;\n }\n\n svg.Element.feColorMatrix = class extends svg.Element.ElementBase {\n constructor (node) {\n super(node);\n\n let matrix = svg.ToNumberArray(this.attribute('values').value);\n switch (this.attribute('type').valueOrDefault('matrix')) { // https://www.w3.org/TR/SVG/filters.html#feColorMatrixElement\n case 'saturate': {\n const s = matrix[0];\n matrix = [\n 0.213 + 0.787 * s, 0.715 - 0.715 * s, 0.072 - 0.072 * s, 0, 0,\n 0.213 - 0.213 * s, 0.715 + 0.285 * s, 0.072 - 0.072 * s, 0, 0,\n 0.213 - 0.213 * s, 0.715 - 0.715 * s, 0.072 + 0.928 * s, 0, 0,\n 0, 0, 0, 1, 0,\n 0, 0, 0, 0, 1\n ];\n break;\n } case 'hueRotate': {\n const a = matrix[0] * Math.PI / 180.0;\n const c = function (m1, m2, m3) {\n return m1 + Math.cos(a) * m2 + Math.sin(a) * m3;\n };\n matrix = [\n c(0.213, 0.787, -0.213), c(0.715, -0.715, -0.715), c(0.072, -0.072, 0.928), 0, 0,\n c(0.213, -0.213, 0.143), c(0.715, 0.285, 0.140), c(0.072, -0.072, -0.283), 0, 0,\n c(0.213, -0.213, -0.787), c(0.715, -0.715, 0.715), c(0.072, 0.928, 0.072), 0, 0,\n 0, 0, 0, 1, 0,\n 0, 0, 0, 0, 1\n ];\n break;\n } case 'luminanceToAlpha':\n matrix = [\n 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0,\n 0.2125, 0.7154, 0.0721, 0, 0,\n 0, 0, 0, 0, 1\n ];\n break;\n }\n this.matrix = matrix;\n\n this._m = (i, v) => {\n const mi = matrix[i];\n return mi * (mi < 0 ? v - 255 : v);\n };\n }\n apply (ctx, x, y, width, height) {\n const {_m: m} = this;\n // assuming x==0 && y==0 for now\n const srcData = ctx.getImageData(0, 0, width, height);\n for (let _y = 0; _y < height; _y++) {\n for (let _x = 0; _x < width; _x++) {\n const r = imGet(srcData.data, _x, _y, width, height, 0);\n const g = imGet(srcData.data, _x, _y, width, height, 1);\n const b = imGet(srcData.data, _x, _y, width, height, 2);\n const a = imGet(srcData.data, _x, _y, width, height, 3);\n imSet(srcData.data, _x, _y, width, height, 0, m(0, r) + m(1, g) + m(2, b) + m(3, a) + m(4, 1));\n imSet(srcData.data, _x, _y, width, height, 1, m(5, r) + m(6, g) + m(7, b) + m(8, a) + m(9, 1));\n imSet(srcData.data, _x, _y, width, height, 2, m(10, r) + m(11, g) + m(12, b) + m(13, a) + m(14, 1));\n imSet(srcData.data, _x, _y, width, height, 3, m(15, r) + m(16, g) + m(17, b) + m(18, a) + m(19, 1));\n }\n }\n ctx.clearRect(0, 0, width, height);\n ctx.putImageData(srcData, 0, 0);\n }\n };\n\n svg.Element.feGaussianBlur = class extends svg.Element.ElementBase {\n constructor (node) {\n super(node);\n\n this.blurRadius = Math.floor(this.attribute('stdDeviation').numValue());\n this.extraFilterDistance = this.blurRadius;\n }\n\n apply (ctx, x, y, width, height) {\n // Todo: This might not be a problem anymore with out `instanceof` fix\n // StackBlur requires canvas be on document\n ctx.canvas.id = svg.UniqueId();\n ctx.canvas.style.display = 'none';\n document.body.append(ctx.canvas);\n canvasRGBA(ctx.canvas, x, y, width, height, this.blurRadius);\n ctx.canvas.remove();\n }\n };\n\n // title element, do nothing\n svg.Element.title = class extends svg.Element.ElementBase {\n constructor (node) {\n super();\n }\n };\n\n // desc element, do nothing\n svg.Element.desc = class extends svg.Element.ElementBase {\n constructor (node) {\n super();\n }\n };\n\n svg.Element.MISSING = class extends svg.Element.ElementBase {\n constructor (node) {\n super();\n svg.log('ERROR: Element \\'' + node.nodeName + '\\' not yet implemented.');\n }\n };\n\n // element factory\n svg.CreateElement = function (node) {\n const className = node.nodeName\n .replace(/^[^:]+:/, '') // remove namespace\n .replace(/-/g, ''); // remove dashes\n let e;\n if (typeof svg.Element[className] !== 'undefined') {\n e = new svg.Element[className](node);\n } else {\n e = new svg.Element.MISSING(node);\n }\n\n e.type = node.nodeName;\n return e;\n };\n\n // load from url\n svg.load = async function (ctx, url) {\n const dom = await svg.ajax(url, true);\n return svg.loadXml(ctx, dom);\n };\n\n // load from xml\n svg.loadXml = function (ctx, xml) {\n return svg.loadXmlDoc(ctx, svg.parseXml(xml));\n };\n\n svg.loadXmlDoc = function (ctx, dom) {\n let res;\n svg.init(ctx);\n\n const mapXY = function (p) {\n let e = ctx.canvas;\n while (e) {\n p.x -= e.offsetLeft;\n p.y -= e.offsetTop;\n e = e.offsetParent;\n }\n if (window.scrollX) p.x += window.scrollX;\n if (window.scrollY) p.y += window.scrollY;\n return p;\n };\n\n // bind mouse\n if (svg.opts.ignoreMouse !== true) {\n ctx.canvas.addEventListener('click', function (e) {\n const args = !isNullish(e)\n ? [e.clientX, e.clientY]\n : [event.clientX, event.clientY]; // eslint-disable-line no-restricted-globals\n const {x, y} = mapXY(new svg.Point(...args));\n svg.Mouse.onclick(x, y);\n });\n ctx.canvas.addEventListener('mousemove', function (e) {\n const args = !isNullish(e)\n ? [e.clientX, e.clientY]\n : [event.clientX, event.clientY]; // eslint-disable-line no-restricted-globals\n const {x, y} = mapXY(new svg.Point(...args));\n svg.Mouse.onmousemove(x, y);\n });\n }\n\n const e = svg.CreateElement(dom.documentElement);\n e.root = true;\n\n // render loop\n let isFirstRender = true;\n const draw = function (resolve) {\n svg.ViewPort.Clear();\n if (ctx.canvas.parentNode) {\n svg.ViewPort.SetCurrent(\n ctx.canvas.parentNode.clientWidth,\n ctx.canvas.parentNode.clientHeight\n );\n }\n\n if (svg.opts.ignoreDimensions !== true) {\n // set canvas size\n if (e.style('width').hasValue()) {\n ctx.canvas.width = e.style('width').toPixels('x');\n ctx.canvas.style.width = ctx.canvas.width + 'px';\n }\n if (e.style('height').hasValue()) {\n ctx.canvas.height = e.style('height').toPixels('y');\n ctx.canvas.style.height = ctx.canvas.height + 'px';\n }\n }\n let cWidth = ctx.canvas.clientWidth || ctx.canvas.width;\n let cHeight = ctx.canvas.clientHeight || ctx.canvas.height;\n if (svg.opts.ignoreDimensions === true &&\n e.style('width').hasValue() && e.style('height').hasValue()\n ) {\n cWidth = e.style('width').toPixels('x');\n cHeight = e.style('height').toPixels('y');\n }\n svg.ViewPort.SetCurrent(cWidth, cHeight);\n\n if (!isNullish(svg.opts.offsetX)) {\n e.attribute('x', true).value = svg.opts.offsetX;\n }\n if (!isNullish(svg.opts.offsetY)) {\n e.attribute('y', true).value = svg.opts.offsetY;\n }\n if (!isNullish(svg.opts.scaleWidth) || !isNullish(svg.opts.scaleHeight)) {\n const viewBox = svg.ToNumberArray(e.attribute('viewBox').value);\n let xRatio = null, yRatio = null;\n\n if (!isNullish(svg.opts.scaleWidth)) {\n if (e.attribute('width').hasValue()) {\n xRatio = e.attribute('width').toPixels('x') / svg.opts.scaleWidth;\n } else if (!isNaN(viewBox[2])) {\n xRatio = viewBox[2] / svg.opts.scaleWidth;\n }\n }\n\n if (!isNullish(svg.opts.scaleHeight)) {\n if (e.attribute('height').hasValue()) {\n yRatio = e.attribute('height').toPixels('y') / svg.opts.scaleHeight;\n } else if (!isNaN(viewBox[3])) {\n yRatio = viewBox[3] / svg.opts.scaleHeight;\n }\n }\n\n if (isNullish(xRatio)) { xRatio = yRatio; }\n if (isNullish(yRatio)) { yRatio = xRatio; }\n\n e.attribute('width', true).value = svg.opts.scaleWidth;\n e.attribute('height', true).value = svg.opts.scaleHeight;\n e.attribute('viewBox', true).value = '0 0 ' + (cWidth * xRatio) + ' ' + (cHeight * yRatio);\n e.attribute('preserveAspectRatio', true).value = 'none';\n }\n\n // clear and render\n if (svg.opts.ignoreClear !== true) {\n ctx.clearRect(0, 0, cWidth, cHeight);\n }\n e.render(ctx);\n if (isFirstRender) {\n isFirstRender = false;\n resolve(dom);\n }\n };\n\n let waitingForImages = true;\n svg.intervalID = setInterval(function () {\n let needUpdate = false;\n\n if (waitingForImages && svg.ImagesLoaded()) {\n waitingForImages = false;\n needUpdate = true;\n }\n\n // need update from mouse events?\n if (svg.opts.ignoreMouse !== true) {\n needUpdate = needUpdate || svg.Mouse.hasEvents();\n }\n\n // need update from animations?\n if (svg.opts.ignoreAnimation !== true) {\n svg.Animations.forEach((animation) => {\n const needAnimationUpdate = animation.update(1000 / svg.FRAMERATE);\n needUpdate = needUpdate || needAnimationUpdate;\n });\n }\n\n // need update from redraw?\n if (typeof svg.opts.forceRedraw === 'function') {\n if (svg.opts.forceRedraw() === true) {\n needUpdate = true;\n }\n }\n\n // render if needed\n if (needUpdate) {\n draw(res);\n svg.Mouse.runEvents(); // run and clear our events\n }\n }, 1000 / svg.FRAMERATE);\n // Todo: Replace with an image loading Promise utility?\n // eslint-disable-next-line promise/avoid-new\n return new Promise((resolve, reject) => {\n if (svg.ImagesLoaded()) {\n waitingForImages = false;\n draw(resolve);\n return;\n }\n res = resolve;\n });\n };\n\n svg.stop = () => {\n if (svg.intervalID) {\n clearInterval(svg.intervalID);\n }\n };\n\n svg.Mouse = {\n events: [],\n hasEvents () { return this.events.length !== 0; },\n\n onclick (x, y) {\n this.events.push({\n type: 'onclick', x, y,\n run (e) { if (e.onclick) e.onclick(); }\n });\n },\n\n onmousemove (x, y) {\n this.events.push({\n type: 'onmousemove', x, y,\n run (e) { if (e.onmousemove) e.onmousemove(); }\n });\n },\n\n eventElements: [],\n\n checkPath (element, ctx) {\n this.events.forEach(({x, y}, i) => {\n if (ctx.isPointInPath && ctx.isPointInPath(x, y)) {\n this.eventElements[i] = element;\n }\n });\n },\n\n checkBoundingBox (element, bb) {\n this.events.forEach(({x, y}, i) => {\n if (bb.isPointInBox(x, y)) {\n this.eventElements[i] = element;\n }\n });\n },\n\n runEvents () {\n svg.ctx.canvas.style.cursor = '';\n\n this.events.forEach((e, i) => {\n let element = this.eventElements[i];\n while (element) {\n e.run(element);\n element = element.parent;\n }\n });\n\n // done running, clear\n this.events = [];\n this.eventElements = [];\n }\n };\n\n return svg;\n}\n\nif (typeof CanvasRenderingContext2D !== 'undefined') {\n CanvasRenderingContext2D.prototype.drawSvg = function (s, dx, dy, dw, dh) {\n canvg(this.canvas, s, {\n ignoreMouse: true,\n ignoreAnimation: true,\n ignoreDimensions: true,\n ignoreClear: true,\n offsetX: dx,\n offsetY: dy,\n scaleWidth: dw,\n scaleHeight: dh\n });\n };\n}\n","/**\n * @file ext-server_opensave.js\n *\n * @license MIT\n *\n * @copyright 2010 Alexis Deveria\n *\n */\nimport {canvg} from '../../external/canvg/canvg.js';\n\nexport default {\n name: 'server_opensave',\n async init ({$, decode64, encode64, importLocale}) {\n const strings = await importLocale();\n const svgEditor = this;\n const {\n curConfig: {\n extPath,\n avoidClientSide, // Deprecated\n avoidClientSideDownload, avoidClientSideOpen\n },\n canvas: svgCanvas\n } = svgEditor;\n\n /**\n *\n * @returns {string}\n */\n function getFileNameFromTitle () {\n const title = svgCanvas.getDocumentTitle();\n // We convert (to underscore) only those disallowed Win7 file name characters\n return title.trim().replace(/[/\\\\:*?\"<>|]/g, '_');\n }\n /**\n * Escapes XML predefined entities for quoted attributes.\n * @param {string} str\n * @returns {string}\n */\n function xhtmlEscape (str) {\n return str.replace(/&(?!amp;)/g, '&').replace(/\"/g, '"').replace(/</g, '<'); // < is actually disallowed above anyways\n }\n\n /**\n *\n * @param {string} [filename='image']\n * @param {string} suffix To add to file name\n * @param {string} uri\n * @returns {boolean}\n */\n function clientDownloadSupport (filename, suffix, uri) {\n if (avoidClientSide || avoidClientSideDownload) {\n return false;\n }\n const support = $('<a>')[0].download === '';\n let a;\n if (support) {\n a = $('<a>hidden</a>').attr({\n download: (filename || 'image') + suffix,\n href: uri\n }).css('display', 'none').appendTo('body');\n a[0].click();\n return true;\n }\n return false;\n }\n const\n saveSvgAction = extPath + 'filesave.php',\n saveImgAction = extPath + 'filesave.php';\n // Create upload target (hidden iframe)\n\n let cancelled = false;\n\n // Hiding by size instead of display to avoid FF console errors\n // with `getBBox` in browser.js `supportsPathBBox_`)\n $(\n `<iframe name=\"output_frame\" title=\"${strings.hiddenframe}\"\n style=\"width: 0; height: 0;\" src=\"data:text/html;base64,PGh0bWw+\"/>`\n ).appendTo('body');\n svgEditor.setCustomHandlers({\n save (win, data) {\n const svg = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n' + data, // Firefox doesn't seem to know it is UTF-8 (no matter whether we use or skip the clientDownload code) despite the Content-Disposition header containing UTF-8, but adding the encoding works\n filename = getFileNameFromTitle();\n\n if (clientDownloadSupport(filename, '.svg', 'data:image/svg+xml;charset=UTF-8;base64,' + encode64(svg))) {\n return;\n }\n\n $('<form>').attr({\n method: 'post',\n action: saveSvgAction,\n target: 'output_frame'\n }).append(`\n <input type=\"hidden\" name=\"output_svg\" value=\"${xhtmlEscape(svg)}\">\n <input type=\"hidden\" name=\"filename\" value=\"${xhtmlEscape(filename)}\">\n `).appendTo('body')\n .submit().remove();\n },\n exportPDF (win, data) {\n const filename = getFileNameFromTitle(),\n datauri = data.output;\n if (clientDownloadSupport(filename, '.pdf', datauri)) {\n return;\n }\n $('<form>').attr({\n method: 'post',\n action: saveImgAction,\n target: 'output_frame'\n }).append(`\n <input type=\"hidden\" name=\"output_img\" value=\"${datauri}\">\n <input type=\"hidden\" name=\"mime\" value=\"application/pdf\">\n <input type=\"hidden\" name=\"filename\" value=\"${xhtmlEscape(filename)}\">\n `).appendTo('body')\n .submit().remove();\n },\n // Todo: Integrate this extension with a new built-in exportWindowType, \"download\"\n async exportImage (win, data) {\n const {issues, mimeType, quality} = data;\n\n if (!$('#export_canvas').length) {\n $('<canvas>', {id: 'export_canvas'}).hide().appendTo('body');\n }\n const c = $('#export_canvas')[0];\n\n c.width = svgCanvas.contentW;\n c.height = svgCanvas.contentH;\n await canvg(c, data.svg);\n const datauri = quality ? c.toDataURL(mimeType, quality) : c.toDataURL(mimeType);\n // {uiStrings} = svgEditor;\n\n // Check if there are issues\n let pre, note = '';\n if (issues.length) {\n pre = '\\n \\u2022 '; // Bullet\n note += ('\\n\\n' + pre + issues.join(pre));\n }\n\n if (note.length) {\n await $.alert(note);\n }\n\n const filename = getFileNameFromTitle();\n const suffix = '.' + data.type.toLowerCase();\n\n if (clientDownloadSupport(filename, suffix, datauri)) {\n return;\n }\n\n $('<form>').attr({\n method: 'post',\n action: saveImgAction,\n target: 'output_frame'\n }).append(`\n <input type=\"hidden\" name=\"output_img\" value=\"${datauri}\">\n <input type=\"hidden\" name=\"mime\" value=\"${mimeType}\">\n <input type=\"hidden\" name=\"filename\" value=\"${xhtmlEscape(filename)}\">\n `).appendTo('body')\n .submit().remove();\n }\n });\n\n // Do nothing if client support is found\n if (window.FileReader && !avoidClientSideOpen) { return; }\n\n // Change these to appropriate script file\n const openSvgAction = extPath + 'fileopen.php?type=load_svg';\n const importSvgAction = extPath + 'fileopen.php?type=import_svg';\n const importImgAction = extPath + 'fileopen.php?type=import_img';\n\n // Set up function for PHP uploader to use\n svgEditor.processFile = function (str64, type) {\n let xmlstr;\n if (cancelled) {\n cancelled = false;\n return;\n }\n\n $('#dialog_box').hide();\n\n if (type !== 'import_img') {\n xmlstr = decode64(str64);\n }\n\n switch (type) {\n case 'load_svg':\n svgCanvas.clear();\n svgCanvas.setSvgString(xmlstr);\n svgEditor.updateCanvas();\n break;\n case 'import_svg':\n svgCanvas.importSvgString(xmlstr);\n svgEditor.updateCanvas();\n break;\n case 'import_img':\n svgCanvas.setGoodImage(str64);\n break;\n }\n };\n\n // Create upload form\n const openSvgForm = $('<form>');\n openSvgForm.attr({\n enctype: 'multipart/form-data',\n method: 'post',\n action: openSvgAction,\n target: 'output_frame'\n });\n\n // Create import form\n const importSvgForm = openSvgForm.clone().attr('action', importSvgAction);\n\n // Create image form\n const importImgForm = openSvgForm.clone().attr('action', importImgAction);\n\n // It appears necessary to rebuild this input every time a file is\n // selected so the same file can be picked and the change event can fire.\n\n /**\n *\n * @param {external:jQuery} form\n * @returns {void}\n */\n function rebuildInput (form) {\n form.empty();\n const inp = $('<input type=\"file\" name=\"svg_file\">').appendTo(form);\n\n /**\n * Submit the form, empty its contents for reuse and show\n * uploading message.\n * @returns {Promise<void>}\n */\n async function submit () {\n // This submits the form, which returns the file data using `svgEditor.processFile()`\n form.submit();\n\n rebuildInput(form);\n await $.process_cancel(strings.uploading);\n cancelled = true;\n $('#dialog_box').hide();\n }\n\n if (form[0] === openSvgForm[0]) {\n inp.change(async function () {\n // This takes care of the \"are you sure\" dialog box\n const ok = await svgEditor.openPrep();\n if (!ok) {\n rebuildInput(form);\n return;\n }\n await submit();\n });\n } else {\n inp.change(async function () {\n // This submits the form, which returns the file data using svgEditor.processFile()\n await submit();\n });\n }\n }\n\n // Create the input elements\n rebuildInput(openSvgForm);\n rebuildInput(importSvgForm);\n rebuildInput(importImgForm);\n\n // Add forms to buttons\n $('#tool_open').show().prepend(openSvgForm);\n $('#tool_import').show().prepend(importSvgForm);\n $('#tool_image').prepend(importImgForm);\n }\n};\n"],"names":["simpleColors","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dodgerblue","feldspar","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgrey","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslateblue","lightslategray","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","violetred","wheat","white","whitesmoke","yellow","yellowgreen","colorDefs","re","example","process","_","bits","map","b","Number","parseInt","RGBColor","colorString","ok","charAt","substr","replace","toLowerCase","forEach","processor","exec","r","g","Object","assign","_this","this","isNaN","toString","length","examples","flatMap","keys","xml","document","createElement","setAttribute","append","listItem","listColor","exampleDiv","style","cssText","toHex","listItemValue","toRGB","e","_typeof","obj","Symbol","iterator","constructor","prototype","mulTable","shgTable","getImageDataFromCanvas","canvas","topX","topY","width","height","getElementById","TypeError","context","getContext","getImageData","Error","processCanvasRGBA","radius","imageData","processImageDataRGBA","x","y","i","p","yp","yi","yw","rSum","gSum","bSum","aSum","rOutSum","gOutSum","bOutSum","aOutSum","rInSum","gInSum","bInSum","aInSum","pr","pg","pb","pa","rbs","stackEnd","pixels","data","div","widthMinus1","heightMinus1","radiusPlus1","sumFactor","stackStart","BlurStack","stack","next","stackIn","stackOut","mulSum","shgSum","a","putImageData","_classCallCheck","instance","Constructor","isNullish","val","canvg","target","s","opts","svgTags","querySelectorAll","Promise","all","_toConsumableArray","svgTag","c","clientWidth","clientHeight","before","remove","innerHTML","svg","stop","build","msg","log","console","init","ctx","uniqueId","UniqueId","Definitions","Styles","Animations","Images","ViewPort","viewPorts","Clear","SetCurrent","push","RemoveCurrent","pop","Current","ComputeSize","d","Math","sqrt","ImagesLoaded","every","img","loaded","trim","compressSpaces","ajax","url","asynch","AJAX","window","XMLHttpRequest","ActiveXObject","resolve","reject","open","addEventListener","responseText","send","parseXml","DOMParser","parseFromString","xmlDoc","async","loadXML","textBaselineMapping","baseline","middle","central","ideographic","alphabetic","hanging","mathematical","Property","name","value","hasValue","n","parseFloat","String","endsWith","def","numValue","opacityProp","newValue","color","match","startsWith","getDefinition","createGradient","createPattern","getHrefAttribute","pt","attribute","viewPort","em","fontSize","Font","Parse","font","toPixels","processPercent","getEM","getDPI","PI","Variants","Weights","CreateFont","fontStyle","fontVariant","fontWeight","fontFamily","inherit","f","join","ds","split","set","ff","includes","ToNumberArray","_a","Point","atan2","v","xp","CreatePoint","CreatePath","path","BoundingBox","x1","y1","x2","y2","NaN","addPoint","bb","p0x","p0y","p1x","p1y","p2x","p2y","cp1x","cp1y","cp2x","cp2y","addBezierCurve","p3x","p3y","p0","p1","p2","p3","t","_this2","addX","addY","b2ac","t1","t2","Transform","Type","translate","apply","unapply","applyToPoint","applyTransform","rotate","angle","cx","cy","toRadians","cos","sin","scale","matrix","m","transform","SkewBase","skewX","_this4","skewY","_this5","transforms","type","_this6","AspectRatio","aspectRatio","desiredWidth","desiredHeight","minX","minY","refX","refY","align","meetOrSlice","scaleX","scaleY","scaleMin","min","scaleMax","max","Element","EmptyProperty","ElementBase","node","captureTextNodes","arguments","attributes","styles","children","nodeType","childNodes","childNode","_this7","addChild","text","nodeValue","tspan","nodeName","entries","styleValue","clss","_styles","createIfNotExists","skipAncestors","parent","ps","save","mask","filter","setContext","renderChildren","clearContext","restore","child","render","create","CreateElement","RenderedElementBase","isUrlDefinition","fs","getFillStyleDefinition","fillStyle","addOpacity","strokeStyle","newLineWidth","lineWidth","lineCap","lineJoin","miterLimit","gaps","setLineDash","webkitLineDash","mozDash","offset","numValueOrDefault","lineDashOffset","webkitLineDashOffset","mozDashOffset","clip","globalAlpha","PathElementBase","beginPath","Mouse","checkPath","valueOrDefault","fill","stroke","markers","getMarkers","marker","getComputedStyle","getPropertyValue","root","moveTo","lineTo","closePath","viewBox","rect","rx","ry","quadraticCurveTo","circle","arc","KAPPA","imGet","rgba","imSet","ellipse","bezierCurveTo","line","points","getPoints","angleTo","polyline","_this8","_x","_y","polygon","PathParser","tokens","reset","command","previousCommand","start","control","current","angles","isEnd","isCommandOrEnd","isRelativeCommand","getToken","getScalar","nextCommand","getPoint","makeAbsolute","getAsControlPoint","getAsCurrentPoint","getReflectedControlPoint","addMarker","from","priorTo","addMarkerAngle","getMarkerPoints","getMarkerAngles","j","pp","_p","newP","curr","cntrl","cp","addQuadraticCurve","xAxisRotation","largeArcFlag","sweepFlag","currp","l","cpp","centp","u","acos","a1","ad","dir","ah","halfWay","_r","sx","sy","point","pattern","element","tempSvg","cctx","defs","GradientBase","gradientUnits","_this10","stops","parentOpacityProp","stopsContainer","addParentOpacity","getGradient","addColorStop","rootView","MAX_VIRTUAL_PIXELS","group","tempCtx","linearGradient","useBB","getBoundingBox","createLinearGradient","radialGradient","fx","fy","createRadialGradient","_this11","stopColor","AnimateBase","duration","begin","_this12","toMilliseconds","maxDuration","initialValue","initialUnits","removed","to","values","attributeType","attributeName","delta","getProperty","getUnits","frozen","animationFrozen","animationFrozenValue","updated","calcValue","ret","progress","lb","floor","ub","ceil","animate","animateColor","animateTransform","fr","horizAdvX","_this13","isRTL","isArabic","fontFace","missingGlyph","glyphs","arabicForm","unicode","fontface","ascent","_this14","descent","unitsPerEm","missingglyph","glyph","_this16","textBaseline","toTextBaseline","getText","getAnchorDelta","_this17","renderChild","startI","textAnchor","measureTextRecursive","measureText","TextElementBase","customFont","fillText","strokeText","reverse","dx","getGlyph","lw","measure","textToMeasure","tref","hasText","_this19","checkBoundingBox","cursor","image","href","_isSvg","_this20","then","err","erred","error","useCORS","crossOrigin","src","drawSvg","drawImage","addBoundingBox","symbol","css","cssDef","cssClasses","cssProps","cssClass","props","cssProp","prop","indexOf","urlStart","urlEnd","getElementsByTagName","use","_el","_this22","preserveAspectRatio","overflow","oldParent","cMask","maskCtx","globalCompositeOperation","fillRect","clipPath","px","py","efd","extraFilterDistance","feMorphology","feComposite","feColorMatrix","_this23","m1","m2","m3","_m","mi","srcData","clearRect","feGaussianBlur","blurRadius","_this24","id","display","body","canvasRGBA","title","desc","MISSING","className","load","dom","loadXml","loadXmlDoc","res","mapXY","offsetLeft","offsetTop","offsetParent","scrollX","scrollY","ignoreMouse","args","event","clientX","clientY","onclick","onmousemove","documentElement","isFirstRender","draw","parentNode","ignoreDimensions","cWidth","cHeight","offsetX","offsetY","scaleWidth","scaleHeight","xRatio","yRatio","ignoreClear","waitingForImages","intervalID","setInterval","needUpdate","hasEvents","ignoreAnimation","animation","needAnimationUpdate","update","FRAMERATE","forceRedraw","runEvents","clearInterval","events","run","eventElements","isPointInPath","_this26","isPointInBox","_this27","_this28","CanvasRenderingContext2D","dy","dw","dh","getFileNameFromTitle","xhtmlEscape","clientDownloadSupport","rebuildInput","form","empty","inp","$","appendTo","submit","process_cancel","strings","uploading","cancelled","hide","openSvgForm","change","svgEditor","openPrep","filename","suffix","uri","avoidClientSide","avoidClientSideDownload","download","attr","click","str","svgCanvas","getDocumentTitle","decode64","encode64","importLocale","curConfig","extPath","avoidClientSideOpen","saveSvgAction","saveImgAction","hiddenframe","setCustomHandlers","win","method","action","exportPDF","datauri","output","exportImage","issues","mimeType","quality","contentW","contentH","toDataURL","note","pre","alert","FileReader","openSvgAction","importSvgAction","importImgAction","processFile","str64","xmlstr","clear","setSvgString","updateCanvas","importSvgString","setGoodImage","enctype","importSvgForm","clone","importImgForm","show","prepend"],"mappings":"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,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAClwCC,EAAW,CAAC,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,I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"} |