{"version":3,"file":"svgParsing.min.mjs","names":[],"sources":["../../../../src/util/misc/svgParsing.ts"],"sourcesContent":["import { Color } from '../../color/Color';\nimport { config } from '../../config';\nimport { DEFAULT_SVG_FONT_SIZE, FILL, NONE } from '../../constants';\nimport type { TBBox, SVGElementName, SupportedSVGUnit } from '../../typedefs';\nimport { escapeXml } from '../lang_string';\nimport { toFixed } from './toFixed';\n\n/**\n * Returns array of attributes for given svg that fabric parses\n * @param {SVGElementName} type Type of svg element (eg. 'circle')\n * @return {Array} string names of supported attributes\n */\nexport const getSvgAttributes = (type: SVGElementName) => {\n  const commonAttributes = ['instantiated_by_use', 'style', 'id', 'class'];\n  switch (type) {\n    case 'linearGradient':\n      return commonAttributes.concat([\n        'x1',\n        'y1',\n        'x2',\n        'y2',\n        'gradientUnits',\n        'gradientTransform',\n      ]);\n    case 'radialGradient':\n      return commonAttributes.concat([\n        'gradientUnits',\n        'gradientTransform',\n        'cx',\n        'cy',\n        'r',\n        'fx',\n        'fy',\n        'fr',\n      ]);\n    case 'stop':\n      return commonAttributes.concat(['offset', 'stop-color', 'stop-opacity']);\n  }\n  return commonAttributes;\n};\n\n/**\n * Converts from attribute value to pixel value if applicable.\n * Returns converted pixels or original value not converted.\n * @param {string} value number to operate on\n * @param {number} fontSize\n * @return {number}\n */\nexport const parseUnit = (value: string, fontSize = DEFAULT_SVG_FONT_SIZE) => {\n  const unit = /\\D{0,2}$/.exec(value),\n    number = parseFloat(value);\n  const dpi = config.DPI;\n  switch (unit?.[0] as SupportedSVGUnit) {\n    case 'mm':\n      return (number * dpi) / 25.4;\n\n    case 'cm':\n      return (number * dpi) / 2.54;\n\n    case 'in':\n      return number * dpi;\n\n    case 'pt':\n      return (number * dpi) / 72; // or * 4 / 3\n\n    case 'pc':\n      return ((number * dpi) / 72) * 12; // or * 16\n\n    case 'em':\n      return number * fontSize;\n\n    default:\n      return number;\n  }\n};\n\nexport type MeetOrSlice = 'meet' | 'slice';\n\nexport type MinMidMax = 'Min' | 'Mid' | 'Max' | 'none';\n\nexport type TPreserveArParsed = {\n  meetOrSlice: MeetOrSlice;\n  alignX: MinMidMax;\n  alignY: MinMidMax;\n};\n\n// align can be either none or undefined or a combination of mid/max\nconst parseAlign = (align: string): MinMidMax[] => {\n  //divide align in alignX and alignY\n  if (align && align !== NONE) {\n    return [align.slice(1, 4) as MinMidMax, align.slice(5, 8) as MinMidMax];\n  } else if (align === NONE) {\n    return [align, align];\n  }\n  return ['Mid', 'Mid'];\n};\n\n/**\n * Parse preserveAspectRatio attribute from element\n * https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/preserveAspectRatio\n * @param {string} attribute to be parsed\n * @return {Object} an object containing align and meetOrSlice attribute\n */\nexport const parsePreserveAspectRatioAttribute = (\n  attribute: string,\n): TPreserveArParsed => {\n  const [firstPart, secondPart] = attribute.trim().split(' ') as [\n    MinMidMax,\n    MeetOrSlice | undefined,\n  ];\n  const [alignX, alignY] = parseAlign(firstPart);\n  return {\n    meetOrSlice: secondPart || 'meet',\n    alignX,\n    alignY,\n  };\n};\n\n/**\n * Adobe Illustrator (at least CS5) is unable to render rgba()-based fill values\n * we work around it by \"moving\" alpha channel into opacity attribute and setting fill's alpha to 1\n * @param prop\n * @param value\n * @param {boolean} inlineStyle The default is inline style, the separator used is \":\", The other is \"=\"\n * @returns\n */\nexport const colorPropToSVG = (\n  prop: string,\n  value?: any,\n  inlineStyle = true,\n) => {\n  let colorValue;\n  let opacityValue;\n  if (!value) {\n    colorValue = 'none';\n  } else if (value.toLive) {\n    colorValue = `url(#SVGID_${escapeXml(value.id)})`;\n  } else {\n    const color = new Color(value),\n      opacity = color.getAlpha();\n\n    colorValue = color.toRgb();\n    if (opacity !== 1) {\n      opacityValue = opacity.toString();\n    }\n  }\n  if (inlineStyle) {\n    return `${prop}: ${colorValue}; ${\n      opacityValue ? `${prop}-opacity: ${opacityValue}; ` : ''\n    }`;\n  } else {\n    return `${prop}=\"${colorValue}\" ${\n      opacityValue ? `${prop}-opacity=\"${opacityValue}\" ` : ''\n    }`;\n  }\n};\n\nexport const createSVGRect = (\n  color: string,\n  { left, top, width, height }: TBBox,\n  precision = config.NUM_FRACTION_DIGITS,\n) => {\n  const svgColor = colorPropToSVG(FILL, color, false);\n  const [x, y, w, h] = [left, top, width, height].map((value) =>\n    toFixed(value, precision),\n  );\n  return `<rect ${svgColor} x=\"${x}\" y=\"${y}\" width=\"${w}\" height=\"${h}\"></rect>`;\n};\n"],"mappings":"8OAYA,MAAa,EAAoB,GAAA,CAC/B,IAAM,EAAmB,CAAC,sBAAuB,QAAS,KAAM,QAAA,CAChE,OAAQ,EAAR,CACE,IAAK,iBACH,OAAO,EAAiB,OAAO,CAC7B,KACA,KACA,KACA,KACA,gBACA,oBAAA,CAAA,CAEJ,IAAK,iBACH,OAAO,EAAiB,OAAO,CAC7B,gBACA,oBACA,KACA,KACA,IACA,KACA,KACA,KAAA,CAAA,CAEJ,IAAK,OACH,OAAO,EAAiB,OAAO,CAAC,SAAU,aAAc,eAAA,CAAA,CAE5D,OAAO,GAUI,GAAa,EAAe,EAAA,KAAA,CACvC,IAAM,EAAO,WAAW,KAAK,EAAA,CAC3B,EAAS,WAAW,EAAA,CAChB,EAAM,EAAO,IACnB,OAAA,GAAA,KAAA,IAAA,GAAQ,EAAO,GAAf,CACE,IAAK,KACH,OAAQ,EAAS,EAAO,KAE1B,IAAK,KACH,OAAQ,EAAS,EAAO,KAE1B,IAAK,KACH,OAAO,EAAS,EAElB,IAAK,KACH,OAAQ,EAAS,EAAO,GAE1B,IAAK,KACH,OAAS,EAAS,EAAO,GAAM,GAEjC,IAAK,KACH,OAAO,EAAS,EAElB,QACE,OAAO,IA+BA,EACX,GAAA,CAEA,GAAA,CAAO,EAAW,GAAc,EAAU,MAAA,CAAO,MAAM,IAAA,CAAA,CAIhD,EAAQ,IAvBG,EAuBkB,IArBvB,IAAA,OACJ,CAAC,EAAM,MAAM,EAAG,EAAA,CAAiB,EAAM,MAAM,EAAG,EAAA,CAAA,CAC9C,IAAA,OACF,CAAC,EAAO,EAAA,CAEV,CAAC,MAAO,MAAA,CAPX,IAAc,EAwBlB,MAAO,CACL,YAAa,GAAc,OAC3B,OAAA,EACA,OAAA,EAAA,EAYS,GACX,EACA,EACA,EAAA,CAAc,IAAA,CAEd,IAAI,EACA,EACJ,GAAK,EAAA,GAEM,EAAM,OACf,EAAa,cAAc,EAAU,EAAM,GAAA,CAAA,OACtC,CACL,IAAM,EAAQ,IAAI,EAAM,EAAA,CACtB,EAAU,EAAM,UAAA,CAElB,EAAa,EAAM,OAAA,CACf,IAAY,IACd,EAAe,EAAQ,UAAA,OATzB,EAAa,OAYf,OAAI,EACK,GAAG,EAAA,IAAS,EAAA,IACjB,EAAe,GAAG,EAAA,YAAiB,EAAA,IAAmB,KAGjD,GAAG,EAAA,IAAS,EAAA,IACjB,EAAe,GAAG,EAAA,YAAiB,EAAA,IAAmB,MAK/C,GACX,EAAA,CACE,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,OAAA,GACpB,EAAY,EAAO,sBAAA,CAEnB,IAAM,EAAW,EAAe,EAAM,EAAA,CAAO,EAAA,CAAA,CACtC,EAAG,EAAG,EAAG,GAAK,CAAC,EAAM,EAAK,EAAO,EAAA,CAAQ,IAAK,GACnD,EAAQ,EAAO,EAAA,CAAA,CAEjB,MAAO,SAAS,EAAA,MAAe,EAAA,OAAS,EAAA,WAAa,EAAA,YAAc,EAAA,YAAA,OAAA,KAAA,eAAA,KAAA,cAAA,KAAA,iBAAA,KAAA,kCAAA,KAAA"}