UNPKG

pixi.js

Version:

<p align="center"> <a href="https://pixijs.com" target="_blank" rel="noopener noreferrer"> <img height="150" src="https://files.pixijs.download/branding/pixijs-logo-transparent-dark.svg?v=1" alt="PixiJS logo"> </a> </p> <br/> <p align="center">

89 lines (85 loc) 3.52 kB
'use strict'; var Color = require('../../../../color/Color.js'); var Matrix = require('../../../../maths/matrix/Matrix.js'); var Texture = require('../../../../rendering/renderers/shared/texture/Texture.js'); var warn = require('../../../../utils/logging/warn.js'); var FillGradient = require('../../../graphics/shared/fill/FillGradient.js'); var FillPattern = require('../../../graphics/shared/fill/FillPattern.js'); "use strict"; const PRECISION = 1e5; function getCanvasFillStyle(fillStyle, context, textMetrics, padding = 0) { if (fillStyle.texture === Texture.Texture.WHITE && !fillStyle.fill) { return Color.Color.shared.setValue(fillStyle.color).setAlpha(fillStyle.alpha ?? 1).toHexa(); } else if (!fillStyle.fill) { const pattern = context.createPattern(fillStyle.texture.source.resource, "repeat"); const tempMatrix = fillStyle.matrix.copyTo(Matrix.Matrix.shared); tempMatrix.scale(fillStyle.texture.frame.width, fillStyle.texture.frame.height); pattern.setTransform(tempMatrix); return pattern; } else if (fillStyle.fill instanceof FillPattern.FillPattern) { const fillPattern = fillStyle.fill; const pattern = context.createPattern(fillPattern.texture.source.resource, "repeat"); const tempMatrix = fillPattern.transform.copyTo(Matrix.Matrix.shared); tempMatrix.scale( fillPattern.texture.frame.width, fillPattern.texture.frame.height ); pattern.setTransform(tempMatrix); return pattern; } else if (fillStyle.fill instanceof FillGradient.FillGradient) { const fillGradient = fillStyle.fill; const isLinear = fillGradient.type === "linear"; const isLocal = fillGradient.textureSpace === "local"; let width = 1; let height = 1; if (isLocal && textMetrics) { width = textMetrics.width + padding; height = textMetrics.height + padding; } let gradient; let isNearlyVertical = false; if (isLinear) { const { start, end } = fillGradient; gradient = context.createLinearGradient( start.x * width, start.y * height, end.x * width, end.y * height ); isNearlyVertical = Math.abs(end.x - start.x) < Math.abs((end.y - start.y) * 0.1); } else { const { center, innerRadius, outerCenter, outerRadius } = fillGradient; gradient = context.createRadialGradient( center.x * width, center.y * height, innerRadius * width, outerCenter.x * width, outerCenter.y * height, outerRadius * width ); } if (isNearlyVertical && isLocal && textMetrics) { const ratio = textMetrics.lineHeight / height; for (let i = 0; i < textMetrics.lines.length; i++) { const start = (i * textMetrics.lineHeight + padding / 2) / height; fillGradient.colorStops.forEach((stop) => { const globalStop = start + stop.offset * ratio; gradient.addColorStop( // fix to 5 decimal places to avoid floating point precision issues Math.floor(globalStop * PRECISION) / PRECISION, Color.Color.shared.setValue(stop.color).toHex() ); }); } } else { fillGradient.colorStops.forEach((stop) => { gradient.addColorStop(stop.offset, Color.Color.shared.setValue(stop.color).toHex()); }); } return gradient; } warn.warn("FillStyle not recognised", fillStyle); return "red"; } exports.getCanvasFillStyle = getCanvasFillStyle; //# sourceMappingURL=getCanvasFillStyle.js.map