UNPKG

fabric

Version:

Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.

1 lines 5.39 kB
{"version":3,"file":"controlRendering.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","commonRenderProps","size","scale","beginPath","arc","twoMathPi","restore","renderSquareControl","xSizeBy2","ySizeBy2","strokeRect"],"mappings":";;AA0BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASA,mBAAmBA,CAEjCC,GAA6B,EAC7BC,IAAY,EACZC,GAAW,EACXC,aAA4C,EAC5CC,YAAqC,EACrC;EACAJ,GAAG,CAACK,IAAI,EAAE;EACV,MAAM;IAAEC,MAAM;IAAEC,KAAK;IAAEC,KAAK;AAAEC,IAAAA;AAAO,GAAC,GAAG,IAAI,CAACC,iBAAiB,CAC7DV,GAAG,EACHC,IAAI,EACJC,GAAG,EACHE,YAAY,EACZD,aACF,CAAC;EACD,IAAIQ,IAAI,GAAGJ,KAAK;AAChB;EACA,IAAIA,KAAK,GAAGC,KAAK,EAAE;IACjBR,GAAG,CAACY,KAAK,CAAC,GAAG,EAAEJ,KAAK,GAAGD,KAAK,CAAC;AAC/B,EAAA,CAAC,MAAM,IAAIC,KAAK,GAAGD,KAAK,EAAE;AACxBI,IAAAA,IAAI,GAAGH,KAAK;IACZR,GAAG,CAACY,KAAK,CAACL,KAAK,GAAGC,KAAK,EAAE,GAAG,CAAC;AAC/B,EAAA;EACAR,GAAG,CAACa,SAAS,EAAE;AACfb,EAAAA,GAAG,CAACc,GAAG,CAAC,CAAC,EAAE,CAAC,EAAEH,IAAI,GAAG,CAAC,EAAE,CAAC,EAAEI,SAAS,EAAE,KAAK,CAAC;AAC5Cf,EAAAA,GAAG,CAACS,MAAM,CAAC,EAAE;AACb,EAAA,IAAIH,MAAM,EAAE;IACVN,GAAG,CAACM,MAAM,EAAE;AACd,EAAA;EACAN,GAAG,CAACgB,OAAO,EAAE;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,mBAAmBA,CAEjCjB,GAA6B,EAC7BC,IAAY,EACZC,GAAW,EACXC,aAA4C,EAC5CC,YAAqC,EACrC;EACAJ,GAAG,CAACK,IAAI,EAAE;EACV,MAAM;MAAEC,MAAM;MAAEC,KAAK;MAAEC,KAAK;AAAEC,MAAAA;AAAO,KAAC,GAAG,IAAI,CAACC,iBAAiB,CAC3DV,GAAG,EACHC,IAAI,EACJC,GAAG,EACHE,YAAY,EACZD,aACF,CAAC;IACDe,QAAQ,GAAGX,KAAK,GAAG,CAAC;IACpBY,QAAQ,GAAGX,KAAK,GAAG,CAAC;AACtB;AACA;AACA;AACAR,EAAAA,GAAG,CAAC,CAAA,EAAGS,MAAM,CAAA,IAAA,CAAM,CAAC,CAAC,CAACS,QAAQ,EAAE,CAACC,QAAQ,EAAEZ,KAAK,EAAEC,KAAK,CAAC;AACxD,EAAA,IAAIF,MAAM,EAAE;AACVN,IAAAA,GAAG,CAACoB,UAAU,CAAC,CAACF,QAAQ,EAAE,CAACC,QAAQ,EAAEZ,KAAK,EAAEC,KAAK,CAAC;AACpD,EAAA;EACAR,GAAG,CAACgB,OAAO,EAAE;AACf;;;;"}