{"version":3,"file":"controlRendering.mjs","sources":["../../../src/controls/controlRendering.ts"],"sourcesContent":["import { twoMathPi } from '../constants';\nimport type { InteractiveFabricObject } from '../shapes/Object/InteractiveObject';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport type { Control } from './Control';\n\nexport type ControlRenderingStyleOverride = Partial<\n  Pick<\n    InteractiveFabricObject,\n    | 'cornerStyle'\n    | 'cornerSize'\n    | 'cornerColor'\n    | 'cornerStrokeColor'\n    | 'cornerDashArray'\n    | 'transparentCorners'\n  >\n>;\n\nexport type ControlRenderer<\n  O extends InteractiveFabricObject = InteractiveFabricObject\n> = (\n  ctx: CanvasRenderingContext2D,\n  left: number,\n  top: number,\n  styleOverride: ControlRenderingStyleOverride,\n  fabricObject: O\n) => void;\n\n/**\n * Render a round control, as per fabric features.\n * This function is written to respect object properties like transparentCorners, cornerSize\n * cornerColor, cornerStrokeColor\n * plus the addition of offsetY and offsetX.\n * @param {CanvasRenderingContext2D} ctx context to render on\n * @param {Number} left x coordinate where the control center should be\n * @param {Number} top y coordinate where the control center should be\n * @param {Object} styleOverride override for FabricObject controls style\n * @param {FabricObject} fabricObject the fabric object for which we are rendering controls\n */\nexport function renderCircleControl(\n  this: Control,\n  ctx: CanvasRenderingContext2D,\n  left: number,\n  top: number,\n  styleOverride: ControlRenderingStyleOverride,\n  fabricObject: InteractiveFabricObject\n) {\n  styleOverride = styleOverride || {};\n  const xSize =\n      this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize,\n    ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize,\n    transparentCorners =\n      typeof styleOverride.transparentCorners !== 'undefined'\n        ? styleOverride.transparentCorners\n        : fabricObject.transparentCorners,\n    methodName = transparentCorners ? 'stroke' : 'fill',\n    stroke =\n      !transparentCorners &&\n      (styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor);\n  let myLeft = left,\n    myTop = top,\n    size;\n  ctx.save();\n  ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor || '';\n  ctx.strokeStyle =\n    styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor || '';\n  // TODO: use proper ellipse code.\n  if (xSize > ySize) {\n    size = xSize;\n    ctx.scale(1.0, ySize / xSize);\n    myTop = (top * xSize) / ySize;\n  } else if (ySize > xSize) {\n    size = ySize;\n    ctx.scale(xSize / ySize, 1.0);\n    myLeft = (left * ySize) / xSize;\n  } else {\n    size = xSize;\n  }\n  // this is still wrong\n  ctx.lineWidth = 1;\n  ctx.beginPath();\n  ctx.arc(myLeft, myTop, size / 2, 0, twoMathPi, false);\n  ctx[methodName]();\n  if (stroke) {\n    ctx.stroke();\n  }\n  ctx.restore();\n}\n\n/**\n * Render a square control, as per fabric features.\n * This function is written to respect object properties like transparentCorners, cornerSize\n * cornerColor, cornerStrokeColor\n * plus the addition of offsetY and offsetX.\n * @param {CanvasRenderingContext2D} ctx context to render on\n * @param {Number} left x coordinate where the control center should be\n * @param {Number} top y coordinate where the control center should be\n * @param {Object} styleOverride override for FabricObject controls style\n * @param {FabricObject} fabricObject the fabric object for which we are rendering controls\n */\nexport function renderSquareControl(\n  this: Control,\n  ctx: CanvasRenderingContext2D,\n  left: number,\n  top: number,\n  styleOverride: ControlRenderingStyleOverride,\n  fabricObject: InteractiveFabricObject\n) {\n  styleOverride = styleOverride || {};\n  const xSize =\n      this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize,\n    ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize,\n    transparentCorners =\n      typeof styleOverride.transparentCorners !== 'undefined'\n        ? styleOverride.transparentCorners\n        : fabricObject.transparentCorners,\n    methodName = transparentCorners ? 'stroke' : 'fill',\n    stroke =\n      !transparentCorners &&\n      (styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor),\n    xSizeBy2 = xSize / 2,\n    ySizeBy2 = ySize / 2;\n  ctx.save();\n  ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor || '';\n  ctx.strokeStyle =\n    styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor || '';\n  // this is still wrong\n  ctx.lineWidth = 1;\n  ctx.translate(left, top);\n  //  angle is relative to canvas plane\n  const angle = fabricObject.getTotalAngle();\n  ctx.rotate(degreesToRadians(angle));\n  // this does not work, and fixed with ( && ) does not make sense.\n  // to have real transparent corners we need the controls on upperCanvas\n  // transparentCorners || ctx.clearRect(-xSizeBy2, -ySizeBy2, xSize, ySize);\n  ctx[`${methodName}Rect`](-xSizeBy2, -ySizeBy2, xSize, ySize);\n  if (stroke) {\n    ctx.strokeRect(-xSizeBy2, -ySizeBy2, xSize, ySize);\n  }\n  ctx.restore();\n}\n"],"names":["renderCircleControl","ctx","left","top","styleOverride","fabricObject","xSize","sizeX","cornerSize","ySize","sizeY","transparentCorners","methodName","stroke","cornerStrokeColor","myLeft","myTop","size","save","fillStyle","cornerColor","strokeStyle","scale","lineWidth","beginPath","arc","twoMathPi","restore","renderSquareControl","xSizeBy2","ySizeBy2","translate","angle","getTotalAngle","rotate","degreesToRadians","concat","strokeRect"],"mappings":"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"}