{"version":3,"file":"controlRendering.mjs","names":[],"sources":["../../extensions/cropping_controls/controlRendering.ts"],"sourcesContent":["import {\n  type ControlRenderingStyleOverride,\n  type InteractiveFabricObject,\n  type TCornerPoint,\n  Intersection,\n  Point,\n  util,\n  type Control,\n} from 'fabric';\n\nconst { degreesToRadians } = util;\n\nconst {\n  createRotateMatrix,\n  createTranslateMatrix,\n  multiplyTransformMatrixArray,\n} = util;\n\n/**\n * Custom shouldActivate for L-shaped corner controls.\n * Checks if pointer is within either arm of the L.\n */\nexport function shouldActivateCorner(\n  this: Control,\n  controlKey: string,\n  fabricObject: InteractiveFabricObject,\n  pointer: Point,\n  corner: TCornerPoint,\n) {\n  if (\n    fabricObject.canvas?.getActiveObject() !== fabricObject ||\n    !fabricObject.isControlVisible(controlKey)\n  ) {\n    return false;\n  }\n\n  const { tl, tr, br, bl } = corner;\n  const center = new Point(\n    (tl.x + tr.x + br.x + bl.x) / 4,\n    (tl.y + tr.y + br.y + bl.y) / 4,\n  );\n\n  const sizeX = this.sizeX || fabricObject.cornerSize;\n  const sizeY = this.sizeY || fabricObject.cornerSize;\n  const length = sizeX;\n  const thickness = sizeY;\n  const halfT = thickness / 2;\n\n  const objectAngle = fabricObject.angle || 0;\n  const totalAngle = objectAngle + (this.angle || 0);\n  const t = multiplyTransformMatrixArray([\n    createTranslateMatrix(center.x, center.y),\n    createRotateMatrix({ angle: totalAngle }),\n  ]);\n\n  const hArm = [\n    new Point(-halfT, -halfT).transform(t),\n    new Point(length + halfT, -halfT).transform(t),\n    new Point(length + halfT, halfT).transform(t),\n    new Point(-halfT, halfT).transform(t),\n  ];\n\n  const vArm = [\n    new Point(-halfT, -halfT).transform(t),\n    new Point(halfT, -halfT).transform(t),\n    new Point(halfT, length + halfT).transform(t),\n    new Point(-halfT, length + halfT).transform(t),\n  ];\n\n  return (\n    Intersection.isPointInPolygon(pointer, hArm) ||\n    Intersection.isPointInPolygon(pointer, vArm)\n  );\n}\n\n/**\n * Render a rounded segment control (line with round caps).\n * Useful for edge resize handles.\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 renderRoundedSegmentControl(\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 } = this.commonRenderProps(\n      ctx,\n      left,\n      top,\n      fabricObject,\n      styleOverride,\n    ),\n    length = Math.max(xSize, ySize),\n    thickness = Math.min(xSize, ySize),\n    halfLength = length / 2,\n    strokeWidth = fabricObject.borderScaleFactor * 2;\n\n  ctx.rotate(degreesToRadians(this.angle));\n  ctx.lineCap = 'round';\n  ctx.beginPath();\n  ctx.moveTo(-halfLength, 0);\n  ctx.lineTo(halfLength, 0);\n\n  if (stroke) {\n    ctx.lineWidth = thickness;\n    ctx.stroke();\n  }\n\n  ctx.strokeStyle = ctx.fillStyle;\n  ctx.lineWidth = stroke ? thickness - strokeWidth : thickness;\n  ctx.stroke();\n  ctx.restore();\n}\n\n/**\n * Render an L-shaped corner control using two rounded segments.\n * Matches the style of renderRoundedSegmentControl.\n */\nexport function renderCornerControl(\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 } = this.commonRenderProps(\n      ctx,\n      left,\n      top,\n      fabricObject,\n      styleOverride,\n    ),\n    length = xSize,\n    thickness = ySize,\n    strokeWidth = fabricObject.borderScaleFactor * 2;\n\n  ctx.rotate(degreesToRadians(this.angle));\n  ctx.lineCap = 'round';\n  ctx.lineJoin = 'round';\n\n  const drawL = () => {\n    ctx.beginPath();\n    ctx.moveTo(length, 0);\n    ctx.lineTo(0, 0);\n    ctx.lineTo(0, length);\n  };\n\n  if (stroke) {\n    ctx.lineWidth = thickness;\n    drawL();\n    ctx.stroke();\n  }\n\n  ctx.strokeStyle = ctx.fillStyle;\n  ctx.lineWidth = stroke ? thickness - strokeWidth : thickness;\n  drawL();\n  ctx.stroke();\n\n  ctx.restore();\n}\n"],"mappings":"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"}