fabric
Version:
Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.
1 lines • 21.9 kB
Source Map (JSON)
{"version":3,"file":"Gradient.mjs","sources":["../../../src/gradient/Gradient.ts"],"sourcesContent":["import { Color } from '../color/Color';\nimport { iMatrix } from '../constants';\nimport { parseTransformAttribute } from '../parser/parseTransformAttribute';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport type { TMat2D } from '../typedefs';\nimport { uid } from '../util/internals/uid';\nimport { pick } from '../util/misc/pick';\nimport { matrixToSVG } from '../util/misc/svgParsing';\nimport { linearDefaultCoords, radialDefaultCoords } from './constants';\nimport { parseColorStops } from './parser/parseColorStops';\nimport { parseCoords } from './parser/parseCoords';\nimport { parseType, parseGradientUnits } from './parser/misc';\nimport type {\n ColorStop,\n GradientCoords,\n GradientOptions,\n GradientType,\n GradientUnits,\n SVGOptions,\n} from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { isPath } from '../util/typeAssertions';\n\n/**\n * Gradient class\n * @class Gradient\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#gradients}\n */\nexport class Gradient<\n S,\n T extends GradientType = S extends GradientType ? S : 'linear'\n> {\n /**\n * Horizontal offset for aligning gradients coming from SVG when outside pathgroups\n * @type Number\n * @default 0\n */\n declare offsetX: number;\n\n /**\n * Vertical offset for aligning gradients coming from SVG when outside pathgroups\n * @type Number\n * @default 0\n */\n declare offsetY: number;\n\n /**\n * A transform matrix to apply to the gradient before painting.\n * Imported from svg gradients, is not applied with the current transform in the center.\n * Before this transform is applied, the origin point is at the top left corner of the object\n * plus the addition of offsetY and offsetX.\n * @type Number[]\n * @default null\n */\n declare gradientTransform?: TMat2D;\n\n /**\n * coordinates units for coords.\n * If `pixels`, the number of coords are in the same unit of width / height.\n * If set as `percentage` the coords are still a number, but 1 means 100% of width\n * for the X and 100% of the height for the y. It can be bigger than 1 and negative.\n * allowed values pixels or percentage.\n * @type GradientUnits\n * @default 'pixels'\n */\n declare gradientUnits: GradientUnits;\n\n /**\n * Gradient type linear or radial\n * @type GradientType\n * @default 'linear'\n */\n declare type: T;\n\n /**\n * Defines how the gradient is located in space and spread\n * @type GradientCoords\n */\n declare coords: GradientCoords<T>;\n\n /**\n * Defines how many colors a gradient has and how they are located on the axis\n * defined by coords\n * @type GradientCoords\n */\n declare colorStops: ColorStop[];\n\n /**\n * If true, this object will not be exported during the serialization of a canvas\n * @type boolean\n */\n declare excludeFromExport?: boolean;\n\n /**\n * ID used for SVG export functionalities\n * @type number | string\n */\n declare readonly id: string | number;\n\n static type = 'Gradient';\n\n constructor({\n type = 'linear' as T,\n gradientUnits = 'pixels',\n coords = {},\n colorStops = [],\n offsetX = 0,\n offsetY = 0,\n gradientTransform,\n id,\n }: GradientOptions<T>) {\n this.id = id ? `${id}_${uid()}` : uid();\n this.type = type;\n this.gradientUnits = gradientUnits;\n this.gradientTransform = gradientTransform;\n this.offsetX = offsetX;\n this.offsetY = offsetY;\n this.coords = {\n ...(this.type === 'radial' ? radialDefaultCoords : linearDefaultCoords),\n ...coords,\n } as GradientCoords<T>;\n this.colorStops = colorStops.slice();\n }\n\n // isType<S extends GradientType>(type: S): this is Gradient<S> {\n // return (this.type as GradientType) === type;\n // }\n\n /**\n * Adds another colorStop\n * @param {Record<string, string>} colorStop Object with offset and color\n * @return {Gradient} thisArg\n */\n addColorStop(colorStops: Record<string, string>) {\n for (const position in colorStops) {\n const color = new Color(colorStops[position]);\n this.colorStops.push({\n offset: parseFloat(position),\n color: color.toRgb(),\n opacity: color.getAlpha(),\n });\n }\n return this;\n }\n\n /**\n * Returns object representation of a gradient\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {object}\n */\n toObject(propertiesToInclude?: (keyof this | string)[]) {\n return {\n ...pick(this, propertiesToInclude as (keyof this)[]),\n type: this.type,\n coords: this.coords,\n colorStops: this.colorStops,\n offsetX: this.offsetX,\n offsetY: this.offsetY,\n gradientUnits: this.gradientUnits,\n gradientTransform: this.gradientTransform\n ? [...this.gradientTransform]\n : undefined,\n };\n }\n\n /* _TO_SVG_START_ */\n /**\n * Returns SVG representation of an gradient\n * @param {FabricObject} object Object to create a gradient for\n * @return {String} SVG representation of an gradient (linear/radial)\n */\n toSVG(\n object: FabricObject,\n { additionalTransform: preTransform }: { additionalTransform?: string } = {}\n ) {\n const markup = [],\n transform = (\n this.gradientTransform\n ? this.gradientTransform.concat()\n : iMatrix.concat()\n ) as TMat2D,\n gradientUnits =\n this.gradientUnits === 'pixels'\n ? 'userSpaceOnUse'\n : 'objectBoundingBox';\n // colorStops must be sorted ascending, and guarded against deep mutations\n const colorStops = this.colorStops\n .map((colorStop) => ({ ...colorStop }))\n .sort((a, b) => {\n return a.offset - b.offset;\n });\n\n let offsetX = -this.offsetX,\n offsetY = -this.offsetY;\n if (gradientUnits === 'objectBoundingBox') {\n offsetX /= object.width;\n offsetY /= object.height;\n } else {\n offsetX += object.width / 2;\n offsetY += object.height / 2;\n }\n // todo what about polygon/polyline?\n if (isPath(object) && this.gradientUnits !== 'percentage') {\n offsetX -= object.pathOffset.x;\n offsetY -= object.pathOffset.y;\n }\n transform[4] -= offsetX;\n transform[5] -= offsetY;\n\n const commonAttributes = [\n `id=\"SVGID_${this.id}\"`,\n `gradientUnits=\"${gradientUnits}\"`,\n `gradientTransform=\"${\n preTransform ? preTransform + ' ' : ''\n }${matrixToSVG(transform)}\"`,\n '',\n ].join(' ');\n\n if (this.type === 'linear') {\n const { x1, y1, x2, y2 } = this.coords;\n markup.push(\n '<linearGradient ',\n commonAttributes,\n ' x1=\"',\n x1,\n '\" y1=\"',\n y1,\n '\" x2=\"',\n x2,\n '\" y2=\"',\n y2,\n '\">\\n'\n );\n } else if (this.type === 'radial') {\n const { x1, y1, x2, y2, r1, r2 } = this\n .coords as GradientCoords<'radial'>;\n const needsSwap = r1 > r2;\n // svg radial gradient has just 1 radius. the biggest.\n markup.push(\n '<radialGradient ',\n commonAttributes,\n ' cx=\"',\n needsSwap ? x1 : x2,\n '\" cy=\"',\n needsSwap ? y1 : y2,\n '\" r=\"',\n needsSwap ? r1 : r2,\n '\" fx=\"',\n needsSwap ? x2 : x1,\n '\" fy=\"',\n needsSwap ? y2 : y1,\n '\">\\n'\n );\n if (needsSwap) {\n // svg goes from internal to external radius. if radius are inverted, swap color stops.\n colorStops.reverse(); // mutates array\n colorStops.forEach((colorStop) => {\n colorStop.offset = 1 - colorStop.offset;\n });\n }\n const minRadius = Math.min(r1, r2);\n if (minRadius > 0) {\n // i have to shift all colorStops and add new one in 0.\n const maxRadius = Math.max(r1, r2),\n percentageShift = minRadius / maxRadius;\n colorStops.forEach((colorStop) => {\n colorStop.offset += percentageShift * (1 - colorStop.offset);\n });\n }\n }\n\n colorStops.forEach(({ color, offset, opacity }) => {\n markup.push(\n '<stop ',\n 'offset=\"',\n offset * 100 + '%',\n '\" style=\"stop-color:',\n color,\n typeof opacity !== 'undefined' ? ';stop-opacity: ' + opacity : ';',\n '\"/>\\n'\n );\n });\n\n markup.push(\n this.type === 'linear' ? '</linearGradient>' : '</radialGradient>',\n '\\n'\n );\n\n return markup.join('');\n }\n /* _TO_SVG_END_ */\n\n /**\n * Returns an instance of CanvasGradient\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @return {CanvasGradient}\n */\n toLive(ctx: CanvasRenderingContext2D): CanvasGradient {\n const coords = this.coords as GradientCoords<'radial'>;\n const gradient =\n this.type === 'linear'\n ? ctx.createLinearGradient(coords.x1, coords.y1, coords.x2, coords.y2)\n : ctx.createRadialGradient(\n coords.x1,\n coords.y1,\n coords.r1,\n coords.x2,\n coords.y2,\n coords.r2\n );\n\n this.colorStops.forEach(({ color, opacity, offset }) => {\n gradient.addColorStop(\n offset,\n typeof opacity !== 'undefined'\n ? new Color(color).setAlpha(opacity).toRgba()\n : color\n );\n });\n\n return gradient;\n }\n\n static async fromObject(\n options: GradientOptions<'linear'>\n ): Promise<Gradient<'radial'>>;\n static async fromObject(\n options: GradientOptions<'radial'>\n ): Promise<Gradient<'radial'>>;\n static async fromObject(\n options: GradientOptions<'linear'> | GradientOptions<'radial'>\n ) {\n return new this(options);\n }\n\n /* _FROM_SVG_START_ */\n /**\n * Returns {@link Gradient} instance from an SVG element\n * @static\n * @memberOf Gradient\n * @param {SVGGradientElement} el SVG gradient element\n * @param {FabricObject} instance\n * @param {String} opacity A fill-opacity or stroke-opacity attribute to multiply to each stop's opacity.\n * @param {SVGOptions} svgOptions an object containing the size of the SVG in order to parse correctly gradients\n * that uses gradientUnits as 'userSpaceOnUse' and percentages.\n * @return {Gradient} Gradient instance\n * @see http://www.w3.org/TR/SVG/pservers.html#LinearGradientElement\n * @see http://www.w3.org/TR/SVG/pservers.html#RadialGradientElement\n *\n * @example\n *\n * <linearGradient id=\"linearGrad1\">\n * <stop offset=\"0%\" stop-color=\"white\"/>\n * <stop offset=\"100%\" stop-color=\"black\"/>\n * </linearGradient>\n *\n * OR\n *\n * <linearGradient id=\"linearGrad2\">\n * <stop offset=\"0\" style=\"stop-color:rgb(255,255,255)\"/>\n * <stop offset=\"1\" style=\"stop-color:rgb(0,0,0)\"/>\n * </linearGradient>\n *\n * OR\n *\n * <radialGradient id=\"radialGrad1\">\n * <stop offset=\"0%\" stop-color=\"white\" stop-opacity=\"1\" />\n * <stop offset=\"50%\" stop-color=\"black\" stop-opacity=\"0.5\" />\n * <stop offset=\"100%\" stop-color=\"white\" stop-opacity=\"1\" />\n * </radialGradient>\n *\n * OR\n *\n * <radialGradient id=\"radialGrad2\">\n * <stop offset=\"0\" stop-color=\"rgb(255,255,255)\" />\n * <stop offset=\"0.5\" stop-color=\"rgb(0,0,0)\" />\n * <stop offset=\"1\" stop-color=\"rgb(255,255,255)\" />\n * </radialGradient>\n *\n */\n static fromElement(\n el: SVGGradientElement,\n instance: FabricObject,\n svgOptions: SVGOptions\n ): Gradient<GradientType> {\n const gradientUnits = parseGradientUnits(el);\n const center = instance._findCenterFromElement();\n return new this({\n id: el.getAttribute('id') || undefined,\n type: parseType(el),\n coords: parseCoords(el, {\n width: svgOptions.viewBoxWidth || svgOptions.width,\n height: svgOptions.viewBoxHeight || svgOptions.height,\n }),\n colorStops: parseColorStops(el, svgOptions.opacity),\n gradientUnits,\n gradientTransform: parseTransformAttribute(\n el.getAttribute('gradientTransform') || ''\n ),\n ...(gradientUnits === 'pixels'\n ? {\n offsetX: instance.width / 2 - center.x,\n offsetY: instance.height / 2 - center.y,\n }\n : {\n offsetX: 0,\n offsetY: 0,\n }),\n });\n }\n /* _FROM_SVG_END_ */\n}\n\nclassRegistry.setClass(Gradient, 'gradient');\nclassRegistry.setClass(Gradient, 'linear');\nclassRegistry.setClass(Gradient, 'radial');\n"],"names":["Gradient","constructor","_ref","type","gradientUnits","coords","colorStops","offsetX","offsetY","gradientTransform","id","concat","uid","_objectSpread","radialDefaultCoords","linearDefaultCoords","slice","addColorStop","position","color","Color","push","offset","parseFloat","toRgb","opacity","getAlpha","toObject","propertiesToInclude","pick","undefined","toSVG","object","additionalTransform","preTransform","arguments","length","markup","transform","iMatrix","map","colorStop","sort","a","b","width","height","isPath","pathOffset","x","y","commonAttributes","matrixToSVG","join","x1","y1","x2","y2","r1","r2","needsSwap","reverse","forEach","minRadius","Math","min","maxRadius","max","percentageShift","_ref2","toLive","ctx","gradient","createLinearGradient","createRadialGradient","_ref3","setAlpha","toRgba","fromObject","options","fromElement","el","instance","svgOptions","parseGradientUnits","center","_findCenterFromElement","getAttribute","parseType","parseCoords","viewBoxWidth","viewBoxHeight","parseColorStops","parseTransformAttribute","_defineProperty","classRegistry","setClass"],"mappings":"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"}