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
JavaScript
;
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');
;
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