{"version":3,"file":"svgParsing.mjs","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"],"names":["getSvgAttributes","type","commonAttributes","concat","parseUnit","value","fontSize","arguments","length","undefined","DEFAULT_SVG_FONT_SIZE","unit","exec","number","parseFloat","dpi","config","DPI","parseAlign","align","NONE","slice","parsePreserveAspectRatioAttribute","attribute","firstPart","secondPart","trim","split","alignX","alignY","meetOrSlice","colorPropToSVG","prop","inlineStyle","colorValue","opacityValue","toLive","escapeXml","id","color","Color","opacity","getAlpha","toRgb","toString","createSVGRect","_ref","left","top","width","height","precision","NUM_FRACTION_DIGITS","svgColor","FILL","x","y","w","h","map","toFixed"],"mappings":"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"}