96e7f94c30d1c93139fc5ce202ea24df.json 52.4 KB
{"ast":null,"code":"/**\r\n * @author NHN. FE Development Team <dl_javascript@nhn.com>\r\n * @fileoverview Shape resize helper\r\n */\nimport { forEach, map, extend } from 'tui-code-snippet';\nimport { capitalizeString, flipObject, setCustomProperty, getCustomProperty } from '../util';\nimport resizeHelper from '../helper/shapeResizeHelper';\nconst FILTER_OPTION_MAP = {\n  pixelate: 'blocksize',\n  blur: 'blur'\n};\nconst POSITION_DIMENSION_MAP = {\n  x: 'width',\n  y: 'height'\n};\nconst FILTER_NAME_VALUE_MAP = flipObject(FILTER_OPTION_MAP);\n/**\r\n * Cached canvas image element for fill image\r\n * @type {boolean}\r\n * @private\r\n */\n\n_c = FILTER_NAME_VALUE_MAP;\nlet cachedCanvasImageElement = null;\n/**\r\n * Get background image of fill\r\n * @param {fabric.Object} shapeObj - Shape object\r\n * @returns {fabric.Image}\r\n * @private\r\n */\n\nexport function getFillImageFromShape(shapeObj) {\n  const {\n    patternSourceCanvas\n  } = getCustomProperty(shapeObj, 'patternSourceCanvas');\n  const [fillImage] = patternSourceCanvas.getObjects();\n  return fillImage;\n}\n/**\r\n * Reset the image position in the filter type fill area.\r\n * @param {fabric.Object} shapeObj - Shape object\r\n * @private\r\n */\n\nexport function rePositionFilterTypeFillImage(shapeObj) {\n  const {\n    angle,\n    flipX,\n    flipY\n  } = shapeObj;\n  const fillImage = getFillImageFromShape(shapeObj);\n  const rotatedShapeCornerDimension = getRotatedDimension(shapeObj);\n  const {\n    right,\n    bottom\n  } = rotatedShapeCornerDimension;\n  let {\n    width,\n    height\n  } = rotatedShapeCornerDimension;\n  const diffLeft = (width - shapeObj.width) / 2;\n  const diffTop = (height - shapeObj.height) / 2;\n  const cropX = shapeObj.left - shapeObj.width / 2 - diffLeft;\n  const cropY = shapeObj.top - shapeObj.height / 2 - diffTop;\n  let left = width / 2 - diffLeft;\n  let top = height / 2 - diffTop;\n  const fillImageMaxSize = Math.max(width, height) + Math.max(diffLeft, diffTop);\n  [left, top, width, height] = calculateFillImageDimensionOutsideCanvas({\n    shapeObj,\n    left,\n    top,\n    width,\n    height,\n    cropX,\n    cropY,\n    flipX,\n    flipY,\n    right,\n    bottom\n  });\n  fillImage.set({\n    angle: flipX === flipY ? -angle : angle,\n    left,\n    top,\n    width,\n    height,\n    cropX,\n    cropY,\n    flipX,\n    flipY\n  });\n  setCustomProperty(fillImage, {\n    fillImageMaxSize\n  });\n}\n/**\r\n * Make filter option from fabric image\r\n * @param {fabric.Image} imageObject - fabric image object\r\n * @returns {object}\r\n */\n\nexport function makeFilterOptionFromFabricImage(imageObject) {\n  return map(imageObject.filters, filter => {\n    const [key] = Object.keys(filter);\n    return {\n      [FILTER_NAME_VALUE_MAP[key]]: filter[key]\n    };\n  });\n}\n/**\r\n * Calculate fill image position and size for out of Canvas\r\n * @param {Object} options - options for position dimension calculate\r\n *   @param {fabric.Object} shapeObj - shape object\r\n *   @param {number} left - original left position\r\n *   @param {number} top - original top position\r\n *   @param {number} width - image width\r\n *   @param {number} height - image height\r\n *   @param {number} cropX - image cropX\r\n *   @param {number} cropY - image cropY\r\n *   @param {boolean} flipX - shape flipX\r\n *   @param {boolean} flipY - shape flipY\r\n * @returns {Object}\r\n */\n\nfunction calculateFillImageDimensionOutsideCanvas({\n  shapeObj,\n  left,\n  top,\n  width,\n  height,\n  cropX,\n  cropY,\n  flipX,\n  flipY,\n  right,\n  bottom\n}) {\n  const overflowAreaPositionFixer = (type, outDistance, imageLeft, imageTop) => calculateDistanceOverflowPart({\n    type,\n    outDistance,\n    shapeObj,\n    flipX,\n    flipY,\n    left: imageLeft,\n    top: imageTop\n  });\n\n  const [originalWidth, originalHeight] = [width, height];\n  [left, top, width, height] = calculateDimensionLeftTopEdge(overflowAreaPositionFixer, {\n    left,\n    top,\n    width,\n    height,\n    cropX,\n    cropY\n  });\n  [left, top, width, height] = calculateDimensionRightBottomEdge(overflowAreaPositionFixer, {\n    left,\n    top,\n    insideCanvasRealImageWidth: width,\n    insideCanvasRealImageHeight: height,\n    right,\n    bottom,\n    cropX,\n    cropY,\n    originalWidth,\n    originalHeight\n  });\n  return [left, top, width, height];\n}\n/**\r\n * Calculate fill image position and size for for right bottom edge\r\n * @param {Function} overflowAreaPositionFixer - position fixer\r\n * @param {Object} options - options for position dimension calculate\r\n *   @param {fabric.Object} shapeObj - shape object\r\n *   @param {number} left - original left position\r\n *   @param {number} top - original top position\r\n *   @param {number} width - image width\r\n *   @param {number} height - image height\r\n *   @param {number} right - image right\r\n *   @param {number} bottom - image bottom\r\n *   @param {number} cropX - image cropX\r\n *   @param {number} cropY - image cropY\r\n *   @param {boolean} originalWidth - image original width\r\n *   @param {boolean} originalHeight - image original height\r\n * @returns {Object}\r\n */\n\n\nfunction calculateDimensionRightBottomEdge(overflowAreaPositionFixer, {\n  left,\n  top,\n  insideCanvasRealImageWidth,\n  insideCanvasRealImageHeight,\n  right,\n  bottom,\n  cropX,\n  cropY,\n  originalWidth,\n  originalHeight\n}) {\n  let [width, height] = [insideCanvasRealImageWidth, insideCanvasRealImageHeight];\n  const {\n    width: canvasWidth,\n    height: canvasHeight\n  } = cachedCanvasImageElement;\n\n  if (right > canvasWidth && cropX > 0) {\n    width = originalWidth - Math.abs(right - canvasWidth);\n  }\n\n  if (bottom > canvasHeight && cropY > 0) {\n    height = originalHeight - Math.abs(bottom - canvasHeight);\n  }\n\n  const diff = {\n    x: (insideCanvasRealImageWidth - width) / 2,\n    y: (insideCanvasRealImageHeight - height) / 2\n  };\n  forEach(['x', 'y'], type => {\n    const cropDistance2 = diff[type];\n\n    if (cropDistance2 > 0) {\n      [left, top] = overflowAreaPositionFixer(type, cropDistance2, left, top);\n    }\n  });\n  return [left, top, width, height];\n}\n/**\r\n * Calculate fill image position and size for for left top\r\n * @param {Function} overflowAreaPositionFixer - position fixer\r\n * @param {Object} options - options for position dimension calculate\r\n *   @param {fabric.Object} shapeObj - shape object\r\n *   @param {number} left - original left position\r\n *   @param {number} top - original top position\r\n *   @param {number} width - image width\r\n *   @param {number} height - image height\r\n *   @param {number} cropX - image cropX\r\n *   @param {number} cropY - image cropY\r\n * @returns {Object}\r\n */\n\n\nfunction calculateDimensionLeftTopEdge(overflowAreaPositionFixer, {\n  left,\n  top,\n  width,\n  height,\n  cropX,\n  cropY\n}) {\n  const dimension = {\n    width,\n    height\n  };\n  forEach(['x', 'y'], type => {\n    const cropDistance = type === 'x' ? cropX : cropY;\n    const compareSize = dimension[POSITION_DIMENSION_MAP[type]];\n    const standardSize = cachedCanvasImageElement[POSITION_DIMENSION_MAP[type]];\n\n    if (compareSize > standardSize) {\n      const outDistance = (compareSize - standardSize) / 2;\n      dimension[POSITION_DIMENSION_MAP[type]] = standardSize;\n      [left, top] = overflowAreaPositionFixer(type, outDistance, left, top);\n    }\n\n    if (cropDistance < 0) {\n      [left, top] = overflowAreaPositionFixer(type, cropDistance, left, top);\n    }\n  });\n  return [left, top, dimension.width, dimension.height];\n}\n/**\r\n * Make fill property of dynamic pattern type\r\n * @param {fabric.Image} canvasImage - canvas background image\r\n * @param {Array} filterOption - filter option\r\n * @param {fabric.StaticCanvas} patternSourceCanvas - fabric static canvas\r\n * @returns {Object}\r\n */\n\n\nexport function makeFillPatternForFilter(canvasImage, filterOption, patternSourceCanvas) {\n  const copiedCanvasElement = getCachedCanvasImageElement(canvasImage);\n  const fillImage = makeFillImage(copiedCanvasElement, canvasImage.angle, filterOption);\n  patternSourceCanvas.add(fillImage);\n  const fabricProperty = {\n    fill: new fabric.Pattern({\n      source: patternSourceCanvas.getElement(),\n      repeat: 'no-repeat'\n    })\n  };\n  setCustomProperty(fabricProperty, {\n    patternSourceCanvas\n  });\n  return fabricProperty;\n}\n/**\r\n * Reset fill pattern canvas\r\n * @param {fabric.StaticCanvas} patternSourceCanvas - fabric static canvas\r\n */\n\nexport function resetFillPatternCanvas(patternSourceCanvas) {\n  const [innerImage] = patternSourceCanvas.getObjects();\n  let {\n    fillImageMaxSize\n  } = getCustomProperty(innerImage, 'fillImageMaxSize');\n  fillImageMaxSize = Math.max(1, fillImageMaxSize);\n  patternSourceCanvas.setDimensions({\n    width: fillImageMaxSize,\n    height: fillImageMaxSize\n  });\n  patternSourceCanvas.renderAll();\n}\n/**\r\n * Remake filter pattern image source\r\n * @param {fabric.Object} shapeObj - Shape object\r\n * @param {fabric.Image} canvasImage - canvas background image\r\n */\n\nexport function reMakePatternImageSource(shapeObj, canvasImage) {\n  const {\n    patternSourceCanvas\n  } = getCustomProperty(shapeObj, 'patternSourceCanvas');\n  const [fillImage] = patternSourceCanvas.getObjects();\n  const filterOption = makeFilterOptionFromFabricImage(fillImage);\n  patternSourceCanvas.remove(fillImage);\n  const copiedCanvasElement = getCachedCanvasImageElement(canvasImage, true);\n  const newFillImage = makeFillImage(copiedCanvasElement, canvasImage.angle, filterOption);\n  patternSourceCanvas.add(newFillImage);\n}\n/**\r\n * Calculate a point line outside the canvas.\r\n * @param {fabric.Image} canvasImage - canvas background image\r\n * @param {boolean} reset - default is false\r\n * @returns {HTMLImageElement}\r\n */\n\nexport function getCachedCanvasImageElement(canvasImage, reset = false) {\n  if (!cachedCanvasImageElement || reset) {\n    cachedCanvasImageElement = canvasImage.toCanvasElement();\n  }\n\n  return cachedCanvasImageElement;\n}\n/**\r\n * Calculate fill image position for out of Canvas\r\n * @param {string} type - 'x' or 'y'\r\n * @param {fabric.Object} shapeObj - shape object\r\n * @param {number} outDistance - distance away\r\n * @param {number} left - original left position\r\n * @param {number} top - original top position\r\n * @returns {Array}\r\n */\n\nfunction calculateDistanceOverflowPart({\n  type,\n  shapeObj,\n  outDistance,\n  left,\n  top,\n  flipX,\n  flipY\n}) {\n  const shapePointNavigation = getShapeEdgePoint(shapeObj);\n  const shapeNeighborPointNavigation = [[1, 2], [0, 3], [0, 3], [1, 2]];\n  const linePointsOutsideCanvas = calculateLinePointsOutsideCanvas(type, shapePointNavigation, shapeNeighborPointNavigation);\n  const reatAngles = calculateLineAngleOfOutsideCanvas(type, shapePointNavigation, linePointsOutsideCanvas);\n  const {\n    startPointIndex\n  } = linePointsOutsideCanvas;\n  const diffPosition = getReversePositionForFlip({\n    outDistance,\n    startPointIndex,\n    flipX,\n    flipY,\n    reatAngles\n  });\n  return [left + diffPosition.left, top + diffPosition.top];\n}\n/**\r\n * Calculate fill image position for out of Canvas\r\n * @param {number} outDistance - distance away\r\n * @param {boolean} flipX - flip x statux\r\n * @param {boolean} flipY - flip y statux\r\n * @param {Array} reatAngles - Line angle of the rectangle vertex.\r\n * @returns {Object} diffPosition\r\n */\n\n\nfunction getReversePositionForFlip({\n  outDistance,\n  startPointIndex,\n  flipX,\n  flipY,\n  reatAngles\n}) {\n  const rotationChangePoint1 = outDistance * Math.cos(reatAngles[0] * Math.PI / 180);\n  const rotationChangePoint2 = outDistance * Math.cos(reatAngles[1] * Math.PI / 180);\n  const isForward = startPointIndex === 2 || startPointIndex === 3;\n  const diffPosition = {\n    top: isForward ? rotationChangePoint1 : rotationChangePoint2,\n    left: isForward ? rotationChangePoint2 : rotationChangePoint1\n  };\n\n  if (isReverseLeftPositionForFlip(startPointIndex, flipX, flipY)) {\n    diffPosition.left = diffPosition.left * -1;\n  }\n\n  if (isReverseTopPositionForFlip(startPointIndex, flipX, flipY)) {\n    diffPosition.top = diffPosition.top * -1;\n  }\n\n  return diffPosition;\n}\n/**\r\n * Calculate a point line outside the canvas.\r\n * @param {string} type - 'x' or 'y'\r\n * @param {Array} shapePointNavigation - shape edge positions\r\n *   @param {Object} shapePointNavigation.lefttop - left top position\r\n *   @param {Object} shapePointNavigation.righttop - right top position\r\n *   @param {Object} shapePointNavigation.leftbottom - lefttop position\r\n *   @param {Object} shapePointNavigation.rightbottom - rightbottom position\r\n * @param {Array} shapeNeighborPointNavigation - Array to find adjacent edges.\r\n * @returns {Object}\r\n */\n\n\nfunction calculateLinePointsOutsideCanvas(type, shapePointNavigation, shapeNeighborPointNavigation) {\n  let minimumPoint = 0;\n  let minimumPointIndex = 0;\n  forEach(shapePointNavigation, (point, index) => {\n    if (point[type] < minimumPoint) {\n      minimumPoint = point[type];\n      minimumPointIndex = index;\n    }\n  });\n  const [endPointIndex1, endPointIndex2] = shapeNeighborPointNavigation[minimumPointIndex];\n  return {\n    startPointIndex: minimumPointIndex,\n    endPointIndex1,\n    endPointIndex2\n  };\n}\n/**\r\n * Calculate a point line outside the canvas.\r\n * @param {string} type - 'x' or 'y'\r\n * @param {Array} shapePointNavigation - shape edge positions\r\n *   @param {object} shapePointNavigation.lefttop - left top position\r\n *   @param {object} shapePointNavigation.righttop - right top position\r\n *   @param {object} shapePointNavigation.leftbottom - lefttop position\r\n *   @param {object} shapePointNavigation.rightbottom - rightbottom position\r\n * @param {Object} linePointsOfOneVertexIndex - Line point of one vertex\r\n *   @param {Object} linePointsOfOneVertexIndex.startPoint - start point index\r\n *   @param {Object} linePointsOfOneVertexIndex.endPointIndex1 - end point index\r\n *   @param {Object} linePointsOfOneVertexIndex.endPointIndex2 - end point index\r\n * @returns {Object}\r\n */\n\n\nfunction calculateLineAngleOfOutsideCanvas(type, shapePointNavigation, linePointsOfOneVertexIndex) {\n  const {\n    startPointIndex,\n    endPointIndex1,\n    endPointIndex2\n  } = linePointsOfOneVertexIndex;\n  const horizontalVerticalAngle = type === 'x' ? 180 : 270;\n  return map([endPointIndex1, endPointIndex2], pointIndex => {\n    const startPoint = shapePointNavigation[startPointIndex];\n    const endPoint = shapePointNavigation[pointIndex];\n    const diffY = startPoint.y - endPoint.y;\n    const diffX = startPoint.x - endPoint.x;\n    return Math.atan2(diffY, diffX) * 180 / Math.PI - horizontalVerticalAngle;\n  });\n}\n/* eslint-disable complexity */\n\n/**\r\n * Calculate a point line outside the canvas for horizontal.\r\n * @param {number} startPointIndex - start point index\r\n * @param {boolean} flipX - flip x statux\r\n * @param {boolean} flipY - flip y statux\r\n * @returns {boolean} flipY - flip y statux\r\n */\n\n\nfunction isReverseLeftPositionForFlip(startPointIndex, flipX, flipY) {\n  return (!flipX && flipY || !flipX && !flipY) && startPointIndex === 0 || (flipX && flipY || flipX && !flipY) && startPointIndex === 1 || (!flipX && !flipY || !flipX && flipY) && startPointIndex === 2 || (flipX && !flipY || flipX && flipY) && startPointIndex === 3;\n}\n/* eslint-enable complexity */\n\n/* eslint-disable complexity */\n\n/**\r\n * Calculate a point line outside the canvas for vertical.\r\n * @param {number} startPointIndex - start point index\r\n * @param {boolean} flipX - flip x statux\r\n * @param {boolean} flipY - flip y statux\r\n * @returns {boolean} flipY - flip y statux\r\n */\n\n\nfunction isReverseTopPositionForFlip(startPointIndex, flipX, flipY) {\n  return (flipX && !flipY || !flipX && !flipY) && startPointIndex === 0 || (!flipX && !flipY || flipX && !flipY) && startPointIndex === 1 || (flipX && flipY || !flipX && flipY) && startPointIndex === 2 || (!flipX && flipY || flipX && flipY) && startPointIndex === 3;\n}\n/* eslint-enable complexity */\n\n/**\r\n * Shape edge points\r\n * @param {fabric.Object} shapeObj - Selected shape object on canvas\r\n * @returns {Array} shapeEdgePoint - shape edge positions\r\n */\n\n\nfunction getShapeEdgePoint(shapeObj) {\n  return [shapeObj.getPointByOrigin('left', 'top'), shapeObj.getPointByOrigin('right', 'top'), shapeObj.getPointByOrigin('left', 'bottom'), shapeObj.getPointByOrigin('right', 'bottom')];\n}\n/**\r\n * Rotated shape dimension\r\n * @param {fabric.Object} shapeObj - Shape object\r\n * @returns {Object} Rotated shape dimension\r\n */\n\n\nfunction getRotatedDimension(shapeObj) {\n  const [{\n    x: ax,\n    y: ay\n  }, {\n    x: bx,\n    y: by\n  }, {\n    x: cx,\n    y: cy\n  }, {\n    x: dx,\n    y: dy\n  }] = getShapeEdgePoint(shapeObj);\n  const left = Math.min(ax, bx, cx, dx);\n  const top = Math.min(ay, by, cy, dy);\n  const right = Math.max(ax, bx, cx, dx);\n  const bottom = Math.max(ay, by, cy, dy);\n  return {\n    left,\n    top,\n    right,\n    bottom,\n    width: right - left,\n    height: bottom - top\n  };\n}\n/**\r\n * Make fill image\r\n * @param {HTMLImageElement} copiedCanvasElement - html image element\r\n * @param {number} currentCanvasImageAngle - current canvas angle\r\n * @param {Array} filterOption - filter option\r\n * @returns {fabric.Image}\r\n * @private\r\n */\n\n\nfunction makeFillImage(copiedCanvasElement, currentCanvasImageAngle, filterOption) {\n  const fillImage = new fabric.Image(copiedCanvasElement);\n  forEach(extend({}, ...filterOption), (value, key) => {\n    const fabricFiterClassName = capitalizeString(key);\n    const filter = new fabric.Image.filters[fabricFiterClassName]({\n      [FILTER_OPTION_MAP[key]]: value\n    });\n    fillImage.filters.push(filter);\n  });\n  fillImage.applyFilters();\n  setCustomProperty(fillImage, {\n    originalAngle: currentCanvasImageAngle,\n    fillImageMaxSize: Math.max(fillImage.width, fillImage.height)\n  });\n  resizeHelper.adjustOriginToCenter(fillImage);\n  return fillImage;\n}\n\nvar _c;\n\n$RefreshReg$(_c, \"FILTER_NAME_VALUE_MAP\");","map":{"version":3,"sources":["C:/Users/kkwan_000/Desktop/git/2017110269/minsung/src/js/helper/shapeFilterFillHelper.js"],"names":["forEach","map","extend","capitalizeString","flipObject","setCustomProperty","getCustomProperty","resizeHelper","FILTER_OPTION_MAP","pixelate","blur","POSITION_DIMENSION_MAP","x","y","FILTER_NAME_VALUE_MAP","cachedCanvasImageElement","getFillImageFromShape","shapeObj","patternSourceCanvas","fillImage","getObjects","rePositionFilterTypeFillImage","angle","flipX","flipY","rotatedShapeCornerDimension","getRotatedDimension","right","bottom","width","height","diffLeft","diffTop","cropX","left","cropY","top","fillImageMaxSize","Math","max","calculateFillImageDimensionOutsideCanvas","set","makeFilterOptionFromFabricImage","imageObject","filters","filter","key","Object","keys","overflowAreaPositionFixer","type","outDistance","imageLeft","imageTop","calculateDistanceOverflowPart","originalWidth","originalHeight","calculateDimensionLeftTopEdge","calculateDimensionRightBottomEdge","insideCanvasRealImageWidth","insideCanvasRealImageHeight","canvasWidth","canvasHeight","abs","diff","cropDistance2","dimension","cropDistance","compareSize","standardSize","makeFillPatternForFilter","canvasImage","filterOption","copiedCanvasElement","getCachedCanvasImageElement","makeFillImage","add","fabricProperty","fill","fabric","Pattern","source","getElement","repeat","resetFillPatternCanvas","innerImage","setDimensions","renderAll","reMakePatternImageSource","remove","newFillImage","reset","toCanvasElement","shapePointNavigation","getShapeEdgePoint","shapeNeighborPointNavigation","linePointsOutsideCanvas","calculateLinePointsOutsideCanvas","reatAngles","calculateLineAngleOfOutsideCanvas","startPointIndex","diffPosition","getReversePositionForFlip","rotationChangePoint1","cos","PI","rotationChangePoint2","isForward","isReverseLeftPositionForFlip","isReverseTopPositionForFlip","minimumPoint","minimumPointIndex","point","index","endPointIndex1","endPointIndex2","linePointsOfOneVertexIndex","horizontalVerticalAngle","pointIndex","startPoint","endPoint","diffY","diffX","atan2","getPointByOrigin","ax","ay","bx","by","cx","cy","dx","dy","min","currentCanvasImageAngle","Image","value","fabricFiterClassName","push","applyFilters","originalAngle","adjustOriginToCenter"],"mappings":"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","sourcesContent":["/**\r\n * @author NHN. FE Development Team <dl_javascript@nhn.com>\r\n * @fileoverview Shape resize helper\r\n */\r\nimport { forEach, map, extend } from 'tui-code-snippet';\r\nimport { capitalizeString, flipObject, setCustomProperty, getCustomProperty } from '../util';\r\nimport resizeHelper from '../helper/shapeResizeHelper';\r\n\r\nconst FILTER_OPTION_MAP = {\r\n  pixelate: 'blocksize',\r\n  blur: 'blur',\r\n};\r\nconst POSITION_DIMENSION_MAP = {\r\n  x: 'width',\r\n  y: 'height',\r\n};\r\n\r\nconst FILTER_NAME_VALUE_MAP = flipObject(FILTER_OPTION_MAP);\r\n\r\n/**\r\n * Cached canvas image element for fill image\r\n * @type {boolean}\r\n * @private\r\n */\r\nlet cachedCanvasImageElement = null;\r\n\r\n/**\r\n * Get background image of fill\r\n * @param {fabric.Object} shapeObj - Shape object\r\n * @returns {fabric.Image}\r\n * @private\r\n */\r\nexport function getFillImageFromShape(shapeObj) {\r\n  const { patternSourceCanvas } = getCustomProperty(shapeObj, 'patternSourceCanvas');\r\n  const [fillImage] = patternSourceCanvas.getObjects();\r\n\r\n  return fillImage;\r\n}\r\n\r\n/**\r\n * Reset the image position in the filter type fill area.\r\n * @param {fabric.Object} shapeObj - Shape object\r\n * @private\r\n */\r\nexport function rePositionFilterTypeFillImage(shapeObj) {\r\n  const { angle, flipX, flipY } = shapeObj;\r\n  const fillImage = getFillImageFromShape(shapeObj);\r\n  const rotatedShapeCornerDimension = getRotatedDimension(shapeObj);\r\n  const { right, bottom } = rotatedShapeCornerDimension;\r\n  let { width, height } = rotatedShapeCornerDimension;\r\n  const diffLeft = (width - shapeObj.width) / 2;\r\n  const diffTop = (height - shapeObj.height) / 2;\r\n  const cropX = shapeObj.left - shapeObj.width / 2 - diffLeft;\r\n  const cropY = shapeObj.top - shapeObj.height / 2 - diffTop;\r\n  let left = width / 2 - diffLeft;\r\n  let top = height / 2 - diffTop;\r\n  const fillImageMaxSize = Math.max(width, height) + Math.max(diffLeft, diffTop);\r\n\r\n  [left, top, width, height] = calculateFillImageDimensionOutsideCanvas({\r\n    shapeObj,\r\n    left,\r\n    top,\r\n    width,\r\n    height,\r\n    cropX,\r\n    cropY,\r\n    flipX,\r\n    flipY,\r\n    right,\r\n    bottom,\r\n  });\r\n\r\n  fillImage.set({\r\n    angle: flipX === flipY ? -angle : angle,\r\n    left,\r\n    top,\r\n    width,\r\n    height,\r\n    cropX,\r\n    cropY,\r\n    flipX,\r\n    flipY,\r\n  });\r\n\r\n  setCustomProperty(fillImage, { fillImageMaxSize });\r\n}\r\n\r\n/**\r\n * Make filter option from fabric image\r\n * @param {fabric.Image} imageObject - fabric image object\r\n * @returns {object}\r\n */\r\nexport function makeFilterOptionFromFabricImage(imageObject) {\r\n  return map(imageObject.filters, (filter) => {\r\n    const [key] = Object.keys(filter);\r\n\r\n    return {\r\n      [FILTER_NAME_VALUE_MAP[key]]: filter[key],\r\n    };\r\n  });\r\n}\r\n\r\n/**\r\n * Calculate fill image position and size for out of Canvas\r\n * @param {Object} options - options for position dimension calculate\r\n *   @param {fabric.Object} shapeObj - shape object\r\n *   @param {number} left - original left position\r\n *   @param {number} top - original top position\r\n *   @param {number} width - image width\r\n *   @param {number} height - image height\r\n *   @param {number} cropX - image cropX\r\n *   @param {number} cropY - image cropY\r\n *   @param {boolean} flipX - shape flipX\r\n *   @param {boolean} flipY - shape flipY\r\n * @returns {Object}\r\n */\r\nfunction calculateFillImageDimensionOutsideCanvas({\r\n  shapeObj,\r\n  left,\r\n  top,\r\n  width,\r\n  height,\r\n  cropX,\r\n  cropY,\r\n  flipX,\r\n  flipY,\r\n  right,\r\n  bottom,\r\n}) {\r\n  const overflowAreaPositionFixer = (type, outDistance, imageLeft, imageTop) =>\r\n    calculateDistanceOverflowPart({\r\n      type,\r\n      outDistance,\r\n      shapeObj,\r\n      flipX,\r\n      flipY,\r\n      left: imageLeft,\r\n      top: imageTop,\r\n    });\r\n  const [originalWidth, originalHeight] = [width, height];\r\n\r\n  [left, top, width, height] = calculateDimensionLeftTopEdge(overflowAreaPositionFixer, {\r\n    left,\r\n    top,\r\n    width,\r\n    height,\r\n    cropX,\r\n    cropY,\r\n  });\r\n\r\n  [left, top, width, height] = calculateDimensionRightBottomEdge(overflowAreaPositionFixer, {\r\n    left,\r\n    top,\r\n    insideCanvasRealImageWidth: width,\r\n    insideCanvasRealImageHeight: height,\r\n    right,\r\n    bottom,\r\n    cropX,\r\n    cropY,\r\n    originalWidth,\r\n    originalHeight,\r\n  });\r\n\r\n  return [left, top, width, height];\r\n}\r\n\r\n/**\r\n * Calculate fill image position and size for for right bottom edge\r\n * @param {Function} overflowAreaPositionFixer - position fixer\r\n * @param {Object} options - options for position dimension calculate\r\n *   @param {fabric.Object} shapeObj - shape object\r\n *   @param {number} left - original left position\r\n *   @param {number} top - original top position\r\n *   @param {number} width - image width\r\n *   @param {number} height - image height\r\n *   @param {number} right - image right\r\n *   @param {number} bottom - image bottom\r\n *   @param {number} cropX - image cropX\r\n *   @param {number} cropY - image cropY\r\n *   @param {boolean} originalWidth - image original width\r\n *   @param {boolean} originalHeight - image original height\r\n * @returns {Object}\r\n */\r\nfunction calculateDimensionRightBottomEdge(\r\n  overflowAreaPositionFixer,\r\n  {\r\n    left,\r\n    top,\r\n    insideCanvasRealImageWidth,\r\n    insideCanvasRealImageHeight,\r\n    right,\r\n    bottom,\r\n    cropX,\r\n    cropY,\r\n    originalWidth,\r\n    originalHeight,\r\n  }\r\n) {\r\n  let [width, height] = [insideCanvasRealImageWidth, insideCanvasRealImageHeight];\r\n  const { width: canvasWidth, height: canvasHeight } = cachedCanvasImageElement;\r\n\r\n  if (right > canvasWidth && cropX > 0) {\r\n    width = originalWidth - Math.abs(right - canvasWidth);\r\n  }\r\n  if (bottom > canvasHeight && cropY > 0) {\r\n    height = originalHeight - Math.abs(bottom - canvasHeight);\r\n  }\r\n\r\n  const diff = {\r\n    x: (insideCanvasRealImageWidth - width) / 2,\r\n    y: (insideCanvasRealImageHeight - height) / 2,\r\n  };\r\n\r\n  forEach(['x', 'y'], (type) => {\r\n    const cropDistance2 = diff[type];\r\n    if (cropDistance2 > 0) {\r\n      [left, top] = overflowAreaPositionFixer(type, cropDistance2, left, top);\r\n    }\r\n  });\r\n\r\n  return [left, top, width, height];\r\n}\r\n\r\n/**\r\n * Calculate fill image position and size for for left top\r\n * @param {Function} overflowAreaPositionFixer - position fixer\r\n * @param {Object} options - options for position dimension calculate\r\n *   @param {fabric.Object} shapeObj - shape object\r\n *   @param {number} left - original left position\r\n *   @param {number} top - original top position\r\n *   @param {number} width - image width\r\n *   @param {number} height - image height\r\n *   @param {number} cropX - image cropX\r\n *   @param {number} cropY - image cropY\r\n * @returns {Object}\r\n */\r\nfunction calculateDimensionLeftTopEdge(\r\n  overflowAreaPositionFixer,\r\n  { left, top, width, height, cropX, cropY }\r\n) {\r\n  const dimension = {\r\n    width,\r\n    height,\r\n  };\r\n\r\n  forEach(['x', 'y'], (type) => {\r\n    const cropDistance = type === 'x' ? cropX : cropY;\r\n    const compareSize = dimension[POSITION_DIMENSION_MAP[type]];\r\n    const standardSize = cachedCanvasImageElement[POSITION_DIMENSION_MAP[type]];\r\n\r\n    if (compareSize > standardSize) {\r\n      const outDistance = (compareSize - standardSize) / 2;\r\n\r\n      dimension[POSITION_DIMENSION_MAP[type]] = standardSize;\r\n      [left, top] = overflowAreaPositionFixer(type, outDistance, left, top);\r\n    }\r\n    if (cropDistance < 0) {\r\n      [left, top] = overflowAreaPositionFixer(type, cropDistance, left, top);\r\n    }\r\n  });\r\n\r\n  return [left, top, dimension.width, dimension.height];\r\n}\r\n\r\n/**\r\n * Make fill property of dynamic pattern type\r\n * @param {fabric.Image} canvasImage - canvas background image\r\n * @param {Array} filterOption - filter option\r\n * @param {fabric.StaticCanvas} patternSourceCanvas - fabric static canvas\r\n * @returns {Object}\r\n */\r\nexport function makeFillPatternForFilter(canvasImage, filterOption, patternSourceCanvas) {\r\n  const copiedCanvasElement = getCachedCanvasImageElement(canvasImage);\r\n  const fillImage = makeFillImage(copiedCanvasElement, canvasImage.angle, filterOption);\r\n  patternSourceCanvas.add(fillImage);\r\n\r\n  const fabricProperty = {\r\n    fill: new fabric.Pattern({\r\n      source: patternSourceCanvas.getElement(),\r\n      repeat: 'no-repeat',\r\n    }),\r\n  };\r\n\r\n  setCustomProperty(fabricProperty, { patternSourceCanvas });\r\n\r\n  return fabricProperty;\r\n}\r\n\r\n/**\r\n * Reset fill pattern canvas\r\n * @param {fabric.StaticCanvas} patternSourceCanvas - fabric static canvas\r\n */\r\nexport function resetFillPatternCanvas(patternSourceCanvas) {\r\n  const [innerImage] = patternSourceCanvas.getObjects();\r\n  let { fillImageMaxSize } = getCustomProperty(innerImage, 'fillImageMaxSize');\r\n  fillImageMaxSize = Math.max(1, fillImageMaxSize);\r\n\r\n  patternSourceCanvas.setDimensions({\r\n    width: fillImageMaxSize,\r\n    height: fillImageMaxSize,\r\n  });\r\n  patternSourceCanvas.renderAll();\r\n}\r\n\r\n/**\r\n * Remake filter pattern image source\r\n * @param {fabric.Object} shapeObj - Shape object\r\n * @param {fabric.Image} canvasImage - canvas background image\r\n */\r\nexport function reMakePatternImageSource(shapeObj, canvasImage) {\r\n  const { patternSourceCanvas } = getCustomProperty(shapeObj, 'patternSourceCanvas');\r\n  const [fillImage] = patternSourceCanvas.getObjects();\r\n  const filterOption = makeFilterOptionFromFabricImage(fillImage);\r\n\r\n  patternSourceCanvas.remove(fillImage);\r\n\r\n  const copiedCanvasElement = getCachedCanvasImageElement(canvasImage, true);\r\n  const newFillImage = makeFillImage(copiedCanvasElement, canvasImage.angle, filterOption);\r\n\r\n  patternSourceCanvas.add(newFillImage);\r\n}\r\n\r\n/**\r\n * Calculate a point line outside the canvas.\r\n * @param {fabric.Image} canvasImage - canvas background image\r\n * @param {boolean} reset - default is false\r\n * @returns {HTMLImageElement}\r\n */\r\nexport function getCachedCanvasImageElement(canvasImage, reset = false) {\r\n  if (!cachedCanvasImageElement || reset) {\r\n    cachedCanvasImageElement = canvasImage.toCanvasElement();\r\n  }\r\n\r\n  return cachedCanvasImageElement;\r\n}\r\n\r\n/**\r\n * Calculate fill image position for out of Canvas\r\n * @param {string} type - 'x' or 'y'\r\n * @param {fabric.Object} shapeObj - shape object\r\n * @param {number} outDistance - distance away\r\n * @param {number} left - original left position\r\n * @param {number} top - original top position\r\n * @returns {Array}\r\n */\r\nfunction calculateDistanceOverflowPart({ type, shapeObj, outDistance, left, top, flipX, flipY }) {\r\n  const shapePointNavigation = getShapeEdgePoint(shapeObj);\r\n  const shapeNeighborPointNavigation = [\r\n    [1, 2],\r\n    [0, 3],\r\n    [0, 3],\r\n    [1, 2],\r\n  ];\r\n  const linePointsOutsideCanvas = calculateLinePointsOutsideCanvas(\r\n    type,\r\n    shapePointNavigation,\r\n    shapeNeighborPointNavigation\r\n  );\r\n  const reatAngles = calculateLineAngleOfOutsideCanvas(\r\n    type,\r\n    shapePointNavigation,\r\n    linePointsOutsideCanvas\r\n  );\r\n  const { startPointIndex } = linePointsOutsideCanvas;\r\n  const diffPosition = getReversePositionForFlip({\r\n    outDistance,\r\n    startPointIndex,\r\n    flipX,\r\n    flipY,\r\n    reatAngles,\r\n  });\r\n\r\n  return [left + diffPosition.left, top + diffPosition.top];\r\n}\r\n\r\n/**\r\n * Calculate fill image position for out of Canvas\r\n * @param {number} outDistance - distance away\r\n * @param {boolean} flipX - flip x statux\r\n * @param {boolean} flipY - flip y statux\r\n * @param {Array} reatAngles - Line angle of the rectangle vertex.\r\n * @returns {Object} diffPosition\r\n */\r\nfunction getReversePositionForFlip({ outDistance, startPointIndex, flipX, flipY, reatAngles }) {\r\n  const rotationChangePoint1 = outDistance * Math.cos((reatAngles[0] * Math.PI) / 180);\r\n  const rotationChangePoint2 = outDistance * Math.cos((reatAngles[1] * Math.PI) / 180);\r\n  const isForward = startPointIndex === 2 || startPointIndex === 3;\r\n  const diffPosition = {\r\n    top: isForward ? rotationChangePoint1 : rotationChangePoint2,\r\n    left: isForward ? rotationChangePoint2 : rotationChangePoint1,\r\n  };\r\n\r\n  if (isReverseLeftPositionForFlip(startPointIndex, flipX, flipY)) {\r\n    diffPosition.left = diffPosition.left * -1;\r\n  }\r\n  if (isReverseTopPositionForFlip(startPointIndex, flipX, flipY)) {\r\n    diffPosition.top = diffPosition.top * -1;\r\n  }\r\n\r\n  return diffPosition;\r\n}\r\n\r\n/**\r\n * Calculate a point line outside the canvas.\r\n * @param {string} type - 'x' or 'y'\r\n * @param {Array} shapePointNavigation - shape edge positions\r\n *   @param {Object} shapePointNavigation.lefttop - left top position\r\n *   @param {Object} shapePointNavigation.righttop - right top position\r\n *   @param {Object} shapePointNavigation.leftbottom - lefttop position\r\n *   @param {Object} shapePointNavigation.rightbottom - rightbottom position\r\n * @param {Array} shapeNeighborPointNavigation - Array to find adjacent edges.\r\n * @returns {Object}\r\n */\r\nfunction calculateLinePointsOutsideCanvas(\r\n  type,\r\n  shapePointNavigation,\r\n  shapeNeighborPointNavigation\r\n) {\r\n  let minimumPoint = 0;\r\n  let minimumPointIndex = 0;\r\n  forEach(shapePointNavigation, (point, index) => {\r\n    if (point[type] < minimumPoint) {\r\n      minimumPoint = point[type];\r\n      minimumPointIndex = index;\r\n    }\r\n  });\r\n\r\n  const [endPointIndex1, endPointIndex2] = shapeNeighborPointNavigation[minimumPointIndex];\r\n\r\n  return {\r\n    startPointIndex: minimumPointIndex,\r\n    endPointIndex1,\r\n    endPointIndex2,\r\n  };\r\n}\r\n\r\n/**\r\n * Calculate a point line outside the canvas.\r\n * @param {string} type - 'x' or 'y'\r\n * @param {Array} shapePointNavigation - shape edge positions\r\n *   @param {object} shapePointNavigation.lefttop - left top position\r\n *   @param {object} shapePointNavigation.righttop - right top position\r\n *   @param {object} shapePointNavigation.leftbottom - lefttop position\r\n *   @param {object} shapePointNavigation.rightbottom - rightbottom position\r\n * @param {Object} linePointsOfOneVertexIndex - Line point of one vertex\r\n *   @param {Object} linePointsOfOneVertexIndex.startPoint - start point index\r\n *   @param {Object} linePointsOfOneVertexIndex.endPointIndex1 - end point index\r\n *   @param {Object} linePointsOfOneVertexIndex.endPointIndex2 - end point index\r\n * @returns {Object}\r\n */\r\nfunction calculateLineAngleOfOutsideCanvas(type, shapePointNavigation, linePointsOfOneVertexIndex) {\r\n  const { startPointIndex, endPointIndex1, endPointIndex2 } = linePointsOfOneVertexIndex;\r\n  const horizontalVerticalAngle = type === 'x' ? 180 : 270;\r\n\r\n  return map([endPointIndex1, endPointIndex2], (pointIndex) => {\r\n    const startPoint = shapePointNavigation[startPointIndex];\r\n    const endPoint = shapePointNavigation[pointIndex];\r\n    const diffY = startPoint.y - endPoint.y;\r\n    const diffX = startPoint.x - endPoint.x;\r\n\r\n    return (Math.atan2(diffY, diffX) * 180) / Math.PI - horizontalVerticalAngle;\r\n  });\r\n}\r\n\r\n/* eslint-disable complexity */\r\n/**\r\n * Calculate a point line outside the canvas for horizontal.\r\n * @param {number} startPointIndex - start point index\r\n * @param {boolean} flipX - flip x statux\r\n * @param {boolean} flipY - flip y statux\r\n * @returns {boolean} flipY - flip y statux\r\n */\r\nfunction isReverseLeftPositionForFlip(startPointIndex, flipX, flipY) {\r\n  return (\r\n    (((!flipX && flipY) || (!flipX && !flipY)) && startPointIndex === 0) ||\r\n    (((flipX && flipY) || (flipX && !flipY)) && startPointIndex === 1) ||\r\n    (((!flipX && !flipY) || (!flipX && flipY)) && startPointIndex === 2) ||\r\n    (((flipX && !flipY) || (flipX && flipY)) && startPointIndex === 3)\r\n  );\r\n}\r\n/* eslint-enable complexity */\r\n\r\n/* eslint-disable complexity */\r\n/**\r\n * Calculate a point line outside the canvas for vertical.\r\n * @param {number} startPointIndex - start point index\r\n * @param {boolean} flipX - flip x statux\r\n * @param {boolean} flipY - flip y statux\r\n * @returns {boolean} flipY - flip y statux\r\n */\r\nfunction isReverseTopPositionForFlip(startPointIndex, flipX, flipY) {\r\n  return (\r\n    (((flipX && !flipY) || (!flipX && !flipY)) && startPointIndex === 0) ||\r\n    (((!flipX && !flipY) || (flipX && !flipY)) && startPointIndex === 1) ||\r\n    (((flipX && flipY) || (!flipX && flipY)) && startPointIndex === 2) ||\r\n    (((!flipX && flipY) || (flipX && flipY)) && startPointIndex === 3)\r\n  );\r\n}\r\n/* eslint-enable complexity */\r\n\r\n/**\r\n * Shape edge points\r\n * @param {fabric.Object} shapeObj - Selected shape object on canvas\r\n * @returns {Array} shapeEdgePoint - shape edge positions\r\n */\r\nfunction getShapeEdgePoint(shapeObj) {\r\n  return [\r\n    shapeObj.getPointByOrigin('left', 'top'),\r\n    shapeObj.getPointByOrigin('right', 'top'),\r\n    shapeObj.getPointByOrigin('left', 'bottom'),\r\n    shapeObj.getPointByOrigin('right', 'bottom'),\r\n  ];\r\n}\r\n\r\n/**\r\n * Rotated shape dimension\r\n * @param {fabric.Object} shapeObj - Shape object\r\n * @returns {Object} Rotated shape dimension\r\n */\r\nfunction getRotatedDimension(shapeObj) {\r\n  const [\r\n    { x: ax, y: ay },\r\n    { x: bx, y: by },\r\n    { x: cx, y: cy },\r\n    { x: dx, y: dy },\r\n  ] = getShapeEdgePoint(shapeObj);\r\n\r\n  const left = Math.min(ax, bx, cx, dx);\r\n  const top = Math.min(ay, by, cy, dy);\r\n  const right = Math.max(ax, bx, cx, dx);\r\n  const bottom = Math.max(ay, by, cy, dy);\r\n\r\n  return {\r\n    left,\r\n    top,\r\n    right,\r\n    bottom,\r\n    width: right - left,\r\n    height: bottom - top,\r\n  };\r\n}\r\n\r\n/**\r\n * Make fill image\r\n * @param {HTMLImageElement} copiedCanvasElement - html image element\r\n * @param {number} currentCanvasImageAngle - current canvas angle\r\n * @param {Array} filterOption - filter option\r\n * @returns {fabric.Image}\r\n * @private\r\n */\r\nfunction makeFillImage(copiedCanvasElement, currentCanvasImageAngle, filterOption) {\r\n  const fillImage = new fabric.Image(copiedCanvasElement);\r\n\r\n  forEach(extend({}, ...filterOption), (value, key) => {\r\n    const fabricFiterClassName = capitalizeString(key);\r\n    const filter = new fabric.Image.filters[fabricFiterClassName]({\r\n      [FILTER_OPTION_MAP[key]]: value,\r\n    });\r\n    fillImage.filters.push(filter);\r\n  });\r\n  fillImage.applyFilters();\r\n\r\n  setCustomProperty(fillImage, {\r\n    originalAngle: currentCanvasImageAngle,\r\n    fillImageMaxSize: Math.max(fillImage.width, fillImage.height),\r\n  });\r\n  resizeHelper.adjustOriginToCenter(fillImage);\r\n\r\n  return fillImage;\r\n}\r\n"]},"metadata":{},"sourceType":"module"}