{"version":3,"file":"controlRendering.min.mjs","sources":["../../../src/controls/controlRendering.ts"],"sourcesContent":["import { twoMathPi } from '../constants';\nimport type { InteractiveFabricObject } from '../shapes/Object/InteractiveObject';\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  ctx.save();\n  const { stroke, xSize, ySize, opName } = this.commonRenderProps(\n    ctx,\n    left,\n    top,\n    fabricObject,\n    styleOverride,\n  );\n  let size = xSize;\n  // TODO: use proper ellipse code.\n  if (xSize > ySize) {\n    ctx.scale(1.0, ySize / xSize);\n  } else if (ySize > xSize) {\n    size = ySize;\n    ctx.scale(xSize / ySize, 1.0);\n  }\n  ctx.beginPath();\n  ctx.arc(0, 0, size / 2, 0, twoMathPi, false);\n  ctx[opName]();\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  ctx.save();\n  const { stroke, xSize, ySize, opName } = this.commonRenderProps(\n      ctx,\n      left,\n      top,\n      fabricObject,\n      styleOverride,\n    ),\n    xSizeBy2 = xSize / 2,\n    ySizeBy2 = ySize / 2;\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[`${opName}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","save","stroke","xSize","ySize","opName","this","commonRenderProps","size","scale","beginPath","arc","twoMathPi","restore","renderSquareControl","xSizeBy2","ySizeBy2","strokeRect"],"mappings":"iDAqCO,SAASA,EAEdC,EACAC,EACAC,EACAC,EACAC,GAEAJ,EAAIK,OACJ,MAAMC,OAAEA,EAAMC,MAAEA,EAAKC,MAAEA,EAAKC,OAAEA,GAAWC,KAAKC,kBAC5CX,EACAC,EACAC,EACAE,EACAD,GAEF,IAAIS,EAAOL,EAEPA,EAAQC,EACVR,EAAIa,MAAM,EAAKL,EAAQD,GACdC,EAAQD,IACjBK,EAAOJ,EACPR,EAAIa,MAAMN,EAAQC,EAAO,IAE3BR,EAAIc,YACJd,EAAIe,IAAI,EAAG,EAAGH,EAAO,EAAG,EAAGI,GAAW,GACtChB,EAAIS,KACAH,GACFN,EAAIM,SAENN,EAAIiB,SACN,CAaO,SAASC,EAEdlB,EACAC,EACAC,EACAC,EACAC,GAEAJ,EAAIK,OACJ,MAAMC,OAAEA,EAAMC,MAAEA,EAAKC,MAAEA,EAAKC,OAAEA,GAAWC,KAAKC,kBAC1CX,EACAC,EACAC,EACAE,EACAD,GAEFgB,EAAWZ,EAAQ,EACnBa,EAAWZ,EAAQ,EAIrBR,EAAI,GAAGS,UAAeU,GAAWC,EAAUb,EAAOC,GAC9CF,GACFN,EAAIqB,YAAYF,GAAWC,EAAUb,EAAOC,GAE9CR,EAAIiB,SACN"}