fabric
Version:
Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.
1 lines • 6.67 kB
Source Map (JSON)
{"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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"}