fabric
Version:
Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.
1 lines • 4.31 kB
Source Map (JSON)
{"version":3,"file":"controlRendering.min.mjs","names":[],"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"],"mappings":"iDAqCA,SAAgB,EAEd,EACA,EACA,EACA,EACA,EAAA,CAEA,EAAI,MAAA,CACJ,GAAA,CAAM,OAAE,EAAA,MAAQ,EAAA,MAAO,EAAA,OAAO,GAAW,KAAK,kBAC5C,EACA,EACA,EACA,EACA,EAAA,CAEE,EAAO,EAEP,EAAQ,EACV,EAAI,MAAM,EAAK,EAAQ,EAAA,CACd,EAAQ,IACjB,EAAO,EACP,EAAI,MAAM,EAAQ,EAAO,EAAA,EAE3B,EAAI,WAAA,CACJ,EAAI,IAAI,EAAG,EAAG,EAAO,EAAG,EAAG,EAAA,CAAW,EAAA,CACtC,EAAI,IAAA,CACA,GACF,EAAI,QAAA,CAEN,EAAI,SAAA,CAcN,SAAgB,EAEd,EACA,EACA,EACA,EACA,EAAA,CAEA,EAAI,MAAA,CACJ,GAAA,CAAM,OAAE,EAAA,MAAQ,EAAA,MAAO,EAAA,OAAO,GAAW,KAAK,kBAC1C,EACA,EACA,EACA,EACA,EAAA,CAEF,EAAW,EAAQ,EACnB,EAAW,EAAQ,EAIrB,EAAI,GAAG,EAAA,OAAA,CAAe,EAAA,CAAW,EAAU,EAAO,EAAA,CAC9C,GACF,EAAI,WAAA,CAAY,EAAA,CAAW,EAAU,EAAO,EAAA,CAE9C,EAAI,SAAA,CAAA,OAAA,KAAA,oBAAA,KAAA"}