{"version":3,"file":"croppingHandlers.mjs","sources":["../../extensions/cropping_controls/croppingHandlers.ts"],"sourcesContent":["import type {\n  TModificationEvents,\n  Transform,\n  TransformActionHandler,\n  FabricImage,\n  ObjectEvents,\n} from 'fabric';\nimport { controlsUtils, Point, util } from 'fabric';\n\nconst { wrapWithFixedAnchor, wrapWithFireEvent } = controlsUtils;\n\n/**\n * Wrap controlsUtils.changeObjectWidth with image constrains\n */\nexport const changeImageWidth: TransformActionHandler = (\n  eventData,\n  transform,\n  x,\n  y,\n) => {\n  const { target } = transform;\n  const { width } = target;\n  const image = target as FabricImage;\n  const modified = controlsUtils.changeObjectWidth(eventData, transform, x, y);\n  const availableWidth = image._element.width - image.cropX;\n  if (modified) {\n    if (image.width > availableWidth) {\n      image.width = availableWidth;\n    }\n    if (image.width < 1) {\n      image.width = 1;\n    }\n  }\n  return width !== image.width;\n};\n\nexport const changeCropWidth = wrapWithFireEvent(\n  'CROPPING' as TModificationEvents,\n  wrapWithFixedAnchor(changeImageWidth),\n);\n\n/**\n * Wrap controlsUtils.changeObjectHeight with image constrains\n */\nexport const changeImageHeight: TransformActionHandler = (\n  eventData,\n  transform,\n  x,\n  y,\n) => {\n  const { target } = transform;\n  const { height } = target;\n  const image = target as FabricImage;\n  const modified = controlsUtils.changeObjectHeight(eventData, transform, x, y);\n  const availableHeight = image._element.height - image.cropY;\n  if (modified) {\n    if (image.height > availableHeight) {\n      image.height = availableHeight;\n    }\n    if (image.height < 1) {\n      image.height = 1;\n    }\n  }\n  return height !== image.height;\n};\n\nexport const changeCropHeight = wrapWithFireEvent(\n  'CROPPING' as TModificationEvents,\n  wrapWithFixedAnchor(changeImageHeight),\n);\n\nexport const changeImageCropX: TransformActionHandler = (\n  eventData,\n  transform,\n  x,\n  y,\n) => {\n  const { target } = transform;\n  const image = target as FabricImage;\n  const { width, cropX } = image;\n  const modified = controlsUtils.changeObjectWidth(eventData, transform, x, y);\n  let newCropX = cropX + width - image.width;\n  image.width = width;\n  if (modified) {\n    if (newCropX < 0) {\n      newCropX = 0;\n    }\n    image.cropX = newCropX;\n    // calculate new width on the base of how much crop we have now\n    image.width += cropX - newCropX;\n  }\n  return newCropX !== cropX;\n};\n\nexport const changeImageCropY: TransformActionHandler = (\n  eventData,\n  transform,\n  x,\n  y,\n) => {\n  const { target } = transform;\n  const image = target as FabricImage;\n  const { height, cropY } = image;\n  const modified = controlsUtils.changeObjectHeight(eventData, transform, x, y);\n  let newCropY = cropY + height - image.height;\n  image.height = height;\n  if (modified) {\n    if (newCropY < 0) {\n      newCropY = 0;\n    }\n    image.cropY = newCropY;\n    image.height += cropY - newCropY;\n  }\n  return newCropY !== cropY;\n};\n\nexport const changeCropX = wrapWithFireEvent(\n  'CROPPING' as TModificationEvents,\n  wrapWithFixedAnchor(changeImageCropX),\n);\n\nexport const changeCropY = wrapWithFireEvent(\n  'CROPPING' as TModificationEvents,\n  wrapWithFixedAnchor(changeImageCropY),\n);\n\n/**\n * A function to counter the move action and change cropX/cropY of an image\n * Keep the image steady, but moves it inside its own cropping rectangle\n */\nexport const cropPanMoveHandler = ({ transform }: ObjectEvents['moving']) => {\n  // this makes the image pan too fast.\n  const { target, original } = transform as Transform;\n  const fabricImage = target as FabricImage;\n  const p = new Point(\n    target.left - original.left,\n    target.top - original.top,\n  ).transform(\n    util.invertTransform(\n      util.createRotateMatrix({ angle: fabricImage.getTotalAngle() }),\n    ),\n  );\n  let cropX = original.cropX! - p.x / fabricImage.scaleX;\n  let cropY = original.cropY! - p.y / fabricImage.scaleY;\n  const { width, height, _element } = fabricImage;\n  if (cropX < 0) {\n    cropX = 0;\n  }\n  if (cropY < 0) {\n    cropY = 0;\n  }\n  if (cropX + width > _element.width) {\n    cropX = _element.width - width;\n  }\n  if (cropY + height > _element.height) {\n    cropY = _element.height - height;\n  }\n  fabricImage.cropX = cropX;\n  fabricImage.cropY = cropY;\n  fabricImage.left = original.left;\n  fabricImage.top = original.top;\n};\n"],"names":["wrapWithFixedAnchor","wrapWithFireEvent","controlsUtils","changeImageWidth","eventData","transform","x","y","target","width","image","modified","changeObjectWidth","availableWidth","_element","cropX","changeCropWidth","changeImageHeight","height","changeObjectHeight","availableHeight","cropY","changeCropHeight","changeImageCropX","newCropX","changeImageCropY","newCropY","changeCropX","changeCropY","cropPanMoveHandler","_ref","original","fabricImage","p","Point","left","top","util","invertTransform","createRotateMatrix","angle","getTotalAngle","scaleX","scaleY"],"mappings":"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"}