1 line
34 KiB
Plaintext
1 line
34 KiB
Plaintext
{"version":3,"file":"TextStyle.mjs","sources":["../../../src/scene/text/TextStyle.ts"],"sourcesContent":["import EventEmitter from 'eventemitter3';\nimport { Color, type ColorSource } from '../../color/Color';\nimport { deprecation, v8_0_0 } from '../../utils/logging/deprecation';\nimport { FillGradient } from '../graphics/shared/fill/FillGradient';\nimport { FillPattern } from '../graphics/shared/fill/FillPattern';\nimport { GraphicsContext } from '../graphics/shared/GraphicsContext';\nimport {\n toFillStyle,\n toStrokeStyle\n} from '../graphics/shared/utils/convertFillInputToFillStyle';\nimport { generateTextStyleKey } from './utils/generateTextStyleKey';\n\nimport type { TextureDestroyOptions, TypeOrBool } from '../container/destroyTypes';\nimport type {\n ConvertedFillStyle,\n ConvertedStrokeStyle,\n FillInput,\n FillStyle,\n StrokeInput,\n StrokeStyle\n} from '../graphics/shared/FillTypes';\n\nexport type TextStyleAlign = 'left' | 'center' | 'right' | 'justify';\nexport type TextStyleFill = string | string[] | number | number[] | CanvasGradient | CanvasPattern;\nexport type TextStyleFontStyle = 'normal' | 'italic' | 'oblique';\nexport type TextStyleFontVariant = 'normal' | 'small-caps';\n// eslint-disable-next-line max-len\nexport type TextStyleFontWeight = 'normal' | 'bold' | 'bolder' | 'lighter' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900';\nexport type TextStyleLineJoin = 'miter' | 'round' | 'bevel';\nexport type TextStyleTextBaseline = 'alphabetic' | 'top' | 'hanging' | 'middle' | 'ideographic' | 'bottom';\nexport type TextStyleWhiteSpace = 'normal' | 'pre' | 'pre-line';\n\n/**\n * A collection of text related classes.\n * @namespace text\n */\n\n/**\n * A drop shadow effect.\n * @memberof text\n */\nexport type TextDropShadow = {\n /** Set alpha for the drop shadow */\n alpha: number;\n /** Set a angle of the drop shadow */\n angle: number;\n /** Set a shadow blur radius */\n blur: number;\n /** A fill style to be used on the e.g., 'red', '#00FF00' */\n color: ColorSource;\n /** Set a distance of the drop shadow */\n distance: number;\n};\n\n/**\n * Constructor options used for `TextStyle` instances.\n * ```js\n * const textStyle = new TextStyle({\n * fontSize: 12,\n * fill: 'black',\n * });\n * ```\n * @see {@link text.TextStyle}\n * @memberof text\n */\nexport interface TextStyleOptions\n{\n /**\n * Alignment for multiline text, does not affect single line text\n * @type {'left'|'center'|'right'|'justify'}\n */\n align?: TextStyleAlign;\n /** Indicates if lines can be wrapped within words, it needs `wordWrap` to be set to `true` */\n breakWords?: boolean;\n /** Set a drop shadow for the text */\n dropShadow?: boolean | Partial<TextDropShadow>;\n /**\n * A canvas fillstyle that will be used on the text e.g., 'red', '#00FF00'.\n * Can be an array to create a gradient, e.g., `['#000000','#FFFFFF']`\n * {@link https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/fillStyle|MDN}\n * @type {string|string[]|number|number[]|CanvasGradient|CanvasPattern}\n */\n fill?: FillInput;\n /** The font family, can be a single font name, or a list of names where the first is the preferred font. */\n fontFamily?: string | string[];\n /** The font size (as a number it converts to px, but as a string, equivalents are '26px','20pt','160%' or '1.6em') */\n fontSize?: number | string;\n /**\n * The font style.\n * @type {'normal'|'italic'|'oblique'}\n */\n fontStyle?: TextStyleFontStyle;\n /**\n * The font variant.\n * @type {'normal'|'small-caps'}\n */\n fontVariant?: TextStyleFontVariant;\n /**\n * The font weight.\n * @type {'normal'|'bold'|'bolder'|'lighter'|'100'|'200'|'300'|'400'|'500'|'600'|'700'|'800'|'900'}\n */\n fontWeight?: TextStyleFontWeight;\n /** The height of the line, a number that represents the vertical space that a letter uses. */\n leading?: number;\n /** The amount of spacing between letters, default is 0 */\n letterSpacing?: number;\n /** The line height, a number that represents the vertical space that a letter uses */\n lineHeight?: number;\n /**\n * Occasionally some fonts are cropped. Adding some padding will prevent this from\n * happening by adding padding to all sides of the text.\n */\n padding?: number;\n /** A canvas fillstyle that will be used on the text stroke, e.g., 'blue', '#FCFF00' */\n stroke?: StrokeInput;\n /**\n * The baseline of the text that is rendered.\n * @type {'alphabetic'|'top'|'hanging'|'middle'|'ideographic'|'bottom'}\n */\n textBaseline?: TextStyleTextBaseline;\n trim?: boolean,\n /**\n * Determines whether newlines & spaces are collapsed or preserved \"normal\"\n * (collapse, collapse), \"pre\" (preserve, preserve) | \"pre-line\" (preserve,\n * collapse). It needs wordWrap to be set to true.\n * @type {'normal'|'pre'|'pre-line'}\n */\n whiteSpace?: TextStyleWhiteSpace;\n /** Indicates if word wrap should be used */\n wordWrap?: boolean;\n /** The width at which text will wrap, it needs wordWrap to be set to true */\n wordWrapWidth?: number;\n}\n\n/**\n * A TextStyle Object contains information to decorate a Text objects.\n *\n * An instance can be shared between multiple Text objects; then changing the style will update all text objects using it.\n * @memberof text\n * @example\n * import { TextStyle } from 'pixi.js';\n * const style = new TextStyle({\n * fontFamily: ['Helvetica', 'Arial', 'sans-serif'],\n * fontSize: 36,\n * });\n */\nexport class TextStyle extends EventEmitter<{\n update: TextDropShadow\n}>\n{\n /** The default drop shadow settings */\n public static defaultDropShadow: TextDropShadow = {\n /** Set alpha for the drop shadow */\n alpha: 1,\n /** Set a angle of the drop shadow */\n angle: Math.PI / 6,\n /** Set a shadow blur radius */\n blur: 0,\n /** A fill style to be used on the e.g., 'red', '#00FF00' */\n color: 'black',\n /** Set a distance of the drop shadow */\n distance: 5,\n };\n\n /** The default text style settings */\n public static defaultTextStyle: TextStyleOptions = {\n /**\n * See {@link TextStyle.align}\n * @type {'left'|'center'|'right'|'justify'}\n */\n align: 'left',\n /** See {@link TextStyle.breakWords} */\n breakWords: false,\n /** See {@link TextStyle.dropShadow} */\n dropShadow: null,\n /**\n * See {@link TextStyle.fill}\n * @type {string|string[]|number|number[]|CanvasGradient|CanvasPattern}\n */\n fill: 'black',\n /**\n * See {@link TextStyle.fontFamily}\n * @type {string|string[]}\n */\n fontFamily: 'Arial',\n /**\n * See {@link TextStyle.fontSize}\n * @type {number|string}\n */\n fontSize: 26,\n /**\n * See {@link TextStyle.fontStyle}\n * @type {'normal'|'italic'|'oblique'}\n */\n fontStyle: 'normal',\n /**\n * See {@link TextStyle.fontVariant}\n * @type {'normal'|'small-caps'}\n */\n fontVariant: 'normal',\n /**\n * See {@link TextStyle.fontWeight}\n * @type {'normal'|'bold'|'bolder'|'lighter'|'100'|'200'|'300'|'400'|'500'|'600'|'700'|'800'|'900'}\n */\n fontWeight: 'normal',\n /** See {@link TextStyle.leading} */\n leading: 0,\n /** See {@link TextStyle.letterSpacing} */\n letterSpacing: 0,\n /** See {@link TextStyle.lineHeight} */\n lineHeight: 0,\n /** See {@link TextStyle.padding} */\n padding: 0,\n /**\n * See {@link TextStyle.stroke}\n * @type {string|number}\n */\n stroke: null,\n /**\n * See {@link TextStyle.textBaseline}\n * @type {'alphabetic'|'top'|'hanging'|'middle'|'ideographic'|'bottom'}\n */\n textBaseline: 'alphabetic',\n /** See {@link TextStyle.trim} */\n trim: false,\n /**\n * See {@link TextStyle.whiteSpace}\n * @type {'normal'|'pre'|'pre-line'}\n */\n whiteSpace: 'pre',\n /** See {@link TextStyle.wordWrap} */\n wordWrap: false,\n /** See {@link TextStyle.wordWrapWidth} */\n wordWrapWidth: 100,\n };\n\n // colors!!\n public _fill: ConvertedFillStyle;\n private _originalFill: FillInput;\n\n public _stroke: ConvertedStrokeStyle;\n private _originalStroke: StrokeInput;\n\n private _dropShadow: TextDropShadow;\n\n private _fontFamily: string | string[];\n private _fontSize: number;\n private _fontStyle: TextStyleFontStyle;\n private _fontVariant: TextStyleFontVariant;\n private _fontWeight: TextStyleFontWeight;\n\n private _breakWords: boolean;\n private _align: TextStyleAlign;\n private _leading: number;\n private _letterSpacing: number;\n private _lineHeight: number;\n\n private _textBaseline: TextStyleTextBaseline;\n private _whiteSpace: TextStyleWhiteSpace;\n private _wordWrap: boolean;\n private _wordWrapWidth: number;\n\n private _padding: number;\n\n protected _styleKey: string;\n private _trim: boolean;\n\n constructor(style: Partial<TextStyleOptions> = {})\n {\n super();\n\n convertV7Tov8Style(style);\n\n const fullStyle = { ...TextStyle.defaultTextStyle, ...style };\n\n for (const key in fullStyle)\n {\n const thisKey = key as keyof typeof this;\n\n this[thisKey] = fullStyle[key as keyof TextStyleOptions] as any;\n }\n\n this.update();\n }\n\n /**\n * Alignment for multiline text, does not affect single line text.\n * @member {'left'|'center'|'right'|'justify'}\n */\n get align(): TextStyleAlign { return this._align; }\n set align(value: TextStyleAlign) { this._align = value; this.update(); }\n /** Indicates if lines can be wrapped within words, it needs wordWrap to be set to true. */\n get breakWords(): boolean { return this._breakWords; }\n set breakWords(value: boolean) { this._breakWords = value; this.update(); }\n /** Set a drop shadow for the text. */\n get dropShadow(): TextDropShadow { return this._dropShadow; }\n set dropShadow(value: boolean | TextDropShadow)\n {\n if (value !== null && typeof value === 'object')\n {\n this._dropShadow = this._createProxy({ ...TextStyle.defaultDropShadow, ...value });\n }\n else\n {\n this._dropShadow = value ? this._createProxy({ ...TextStyle.defaultDropShadow }) : null;\n }\n\n this.update();\n }\n /** The font family, can be a single font name, or a list of names where the first is the preferred font. */\n get fontFamily(): string | string[] { return this._fontFamily; }\n set fontFamily(value: string | string[]) { this._fontFamily = value; this.update(); }\n /** The font size (as a number it converts to px, but as a string, equivalents are '26px','20pt','160%' or '1.6em') */\n get fontSize(): number { return this._fontSize; }\n set fontSize(value: string | number)\n {\n if (typeof value === 'string')\n {\n // eg '34px' to number\n this._fontSize = parseInt(value as string, 10);\n }\n else\n {\n this._fontSize = value as number;\n }\n this.update();\n }\n /**\n * The font style.\n * @member {'normal'|'italic'|'oblique'}\n */\n get fontStyle(): TextStyleFontStyle { return this._fontStyle; }\n set fontStyle(value: TextStyleFontStyle) { this._fontStyle = value; this.update(); }\n /**\n * The font variant.\n * @member {'normal'|'small-caps'}\n */\n get fontVariant(): TextStyleFontVariant { return this._fontVariant; }\n set fontVariant(value: TextStyleFontVariant) { this._fontVariant = value; this.update(); }\n /**\n * The font weight.\n * @member {'normal'|'bold'|'bolder'|'lighter'|'100'|'200'|'300'|'400'|'500'|'600'|'700'|'800'|'900'}\n */\n get fontWeight(): TextStyleFontWeight { return this._fontWeight; }\n set fontWeight(value: TextStyleFontWeight) { this._fontWeight = value; this.update(); }\n /** The space between lines. */\n get leading(): number { return this._leading; }\n set leading(value: number) { this._leading = value; this.update(); }\n /** The amount of spacing between letters, default is 0. */\n get letterSpacing(): number { return this._letterSpacing; }\n set letterSpacing(value: number) { this._letterSpacing = value; this.update(); }\n /** The line height, a number that represents the vertical space that a letter uses. */\n get lineHeight(): number { return this._lineHeight; }\n set lineHeight(value: number) { this._lineHeight = value; this.update(); }\n /**\n * Occasionally some fonts are cropped. Adding some padding will prevent this from happening\n * by adding padding to all sides of the text.\n */\n get padding(): number { return this._padding; }\n set padding(value: number) { this._padding = value; this.update(); }\n\n /** Trim transparent borders. This is an expensive operation so only use this if you have to! */\n get trim(): boolean { return this._trim; }\n set trim(value: boolean) { this._trim = value; this.update(); }\n /**\n * The baseline of the text that is rendered.\n * @member {'alphabetic'|'top'|'hanging'|'middle'|'ideographic'|'bottom'}\n */\n get textBaseline(): TextStyleTextBaseline { return this._textBaseline; }\n set textBaseline(value: TextStyleTextBaseline) { this._textBaseline = value; this.update(); }\n /**\n * How newlines and spaces should be handled.\n * Default is 'pre' (preserve, preserve).\n *\n * value | New lines | Spaces\n * --- | --- | ---\n * 'normal' | Collapse | Collapse\n * 'pre' | Preserve | Preserve\n * 'pre-line' | Preserve | Collapse\n * @member {'normal'|'pre'|'pre-line'}\n */\n get whiteSpace(): TextStyleWhiteSpace { return this._whiteSpace; }\n set whiteSpace(value: TextStyleWhiteSpace) { this._whiteSpace = value; this.update(); }\n /** Indicates if word wrap should be used. */\n get wordWrap(): boolean { return this._wordWrap; }\n set wordWrap(value: boolean) { this._wordWrap = value; this.update(); }\n /** The width at which text will wrap, it needs wordWrap to be set to true. */\n get wordWrapWidth(): number { return this._wordWrapWidth; }\n set wordWrapWidth(value: number) { this._wordWrapWidth = value; this.update(); }\n\n /** A fillstyle that will be used on the text e.g., 'red', '#00FF00'. */\n get fill(): FillInput\n {\n return this._originalFill;\n }\n\n set fill(value: FillInput)\n {\n if (value === this._originalFill) return;\n\n this._originalFill = value;\n\n if (this._isFillStyle(value))\n {\n this._originalFill = this._createProxy({ ...GraphicsContext.defaultFillStyle, ...value }, () =>\n {\n this._fill = toFillStyle(\n { ...this._originalFill as FillStyle },\n GraphicsContext.defaultFillStyle\n );\n });\n }\n\n this._fill = toFillStyle(\n value === 0x0 ? 'black' : value,\n GraphicsContext.defaultFillStyle\n );\n this.update();\n }\n\n /** A fillstyle that will be used on the text stroke, e.g., 'blue', '#FCFF00'. */\n get stroke(): StrokeInput\n {\n return this._originalStroke;\n }\n\n set stroke(value: StrokeInput)\n {\n if (value === this._originalStroke) return;\n\n this._originalStroke = value;\n\n if (this._isFillStyle(value))\n {\n this._originalStroke = this._createProxy({ ...GraphicsContext.defaultStrokeStyle, ...value }, () =>\n {\n this._stroke = toStrokeStyle(\n { ...this._originalStroke as StrokeStyle },\n GraphicsContext.defaultStrokeStyle\n );\n });\n }\n\n this._stroke = toStrokeStyle(value, GraphicsContext.defaultStrokeStyle);\n this.update();\n }\n\n protected _generateKey(): string\n {\n this._styleKey = generateTextStyleKey(this);\n\n return this._styleKey;\n }\n\n public update()\n {\n this._styleKey = null;\n this.emit('update', this);\n }\n\n /** Resets all properties to the default values */\n public reset()\n {\n const defaultStyle = TextStyle.defaultTextStyle;\n\n for (const key in defaultStyle)\n {\n this[key as keyof typeof this] = defaultStyle[key as keyof TextStyleOptions] as any;\n }\n }\n\n get styleKey()\n {\n return this._styleKey || this._generateKey();\n }\n\n /**\n * Creates a new TextStyle object with the same values as this one.\n * @returns New cloned TextStyle object\n */\n public clone(): TextStyle\n {\n return new TextStyle({\n align: this.align,\n breakWords: this.breakWords,\n dropShadow: this._dropShadow ? { ...this._dropShadow } : null,\n fill: this._fill,\n fontFamily: this.fontFamily,\n fontSize: this.fontSize,\n fontStyle: this.fontStyle,\n fontVariant: this.fontVariant,\n fontWeight: this.fontWeight,\n leading: this.leading,\n letterSpacing: this.letterSpacing,\n lineHeight: this.lineHeight,\n padding: this.padding,\n stroke: this._stroke,\n textBaseline: this.textBaseline,\n whiteSpace: this.whiteSpace,\n wordWrap: this.wordWrap,\n wordWrapWidth: this.wordWrapWidth,\n });\n }\n\n /**\n * Destroys this text style.\n * @param options - Options parameter. A boolean will act as if all options\n * have been set to that value\n * @param {boolean} [options.texture=false] - Should it destroy the texture of the this style\n * @param {boolean} [options.textureSource=false] - Should it destroy the textureSource of the this style\n */\n public destroy(options: TypeOrBool<TextureDestroyOptions> = false)\n {\n this.removeAllListeners();\n\n const destroyTexture = typeof options === 'boolean' ? options : options?.texture;\n\n if (destroyTexture)\n {\n const destroyTextureSource = typeof options === 'boolean' ? options : options?.textureSource;\n\n if (this._fill?.texture)\n {\n this._fill.texture.destroy(destroyTextureSource);\n }\n\n if ((this._originalFill as FillStyle)?.texture)\n {\n (this._originalFill as FillStyle).texture.destroy(destroyTextureSource);\n }\n\n if (this._stroke?.texture)\n {\n this._stroke.texture.destroy(destroyTextureSource);\n }\n\n if ((this._originalStroke as FillStyle)?.texture)\n {\n (this._originalStroke as FillStyle).texture.destroy(destroyTextureSource);\n }\n }\n\n this._fill = null;\n this._stroke = null;\n this.dropShadow = null;\n this._originalStroke = null;\n this._originalFill = null;\n }\n\n private _createProxy<T extends object>(value: T, cb?: (property: string, newValue: any) => void): T\n {\n return new Proxy<T>(value, {\n set: (target, property, newValue) =>\n {\n target[property as keyof T] = newValue;\n cb?.(property as string, newValue);\n this.update();\n\n return true;\n }\n });\n }\n\n private _isFillStyle(value: FillInput): value is FillStyle\n {\n return ((value ?? null) !== null\n && !(Color.isColorLike(value) || value instanceof FillGradient || value instanceof FillPattern));\n }\n}\n\nfunction convertV7Tov8Style(style: TextStyleOptions)\n{\n const oldStyle = style as TextStyleOptions & {\n dropShadowAlpha?: number;\n dropShadowAngle?: number;\n dropShadowBlur?: number;\n dropShadowColor?: number;\n dropShadowDistance?: number;\n fillGradientStops?: number[];\n strokeThickness?: number;\n };\n\n if (typeof oldStyle.dropShadow === 'boolean' && oldStyle.dropShadow)\n {\n const defaults = TextStyle.defaultDropShadow;\n\n style.dropShadow = {\n alpha: oldStyle.dropShadowAlpha ?? defaults.alpha,\n angle: oldStyle.dropShadowAngle ?? defaults.angle,\n blur: oldStyle.dropShadowBlur ?? defaults.blur,\n color: oldStyle.dropShadowColor ?? defaults.color,\n distance: oldStyle.dropShadowDistance ?? defaults.distance,\n };\n }\n\n if (oldStyle.strokeThickness !== undefined)\n {\n // #if _DEBUG\n deprecation(v8_0_0, 'strokeThickness is now a part of stroke');\n // #endif\n\n const color = oldStyle.stroke;\n let obj: FillStyle = {};\n\n // handles stroke: 0x0, stroke: { r: 0, g: 0, b: 0, a: 0 } stroke: new Color(0x0)\n if (Color.isColorLike(color as ColorSource))\n {\n obj.color = color as ColorSource;\n }\n // handles stroke: new FillGradient()\n else if (color instanceof FillGradient || color instanceof FillPattern)\n {\n obj.fill = color as FillGradient | FillPattern;\n }\n // handles stroke: { color: 0x0 } or stroke: { fill: new FillGradient() }\n else if (Object.hasOwnProperty.call(color, 'color') || Object.hasOwnProperty.call(color, 'fill'))\n {\n obj = color as FillStyle;\n }\n else\n {\n throw new Error('Invalid stroke value.');\n }\n\n style.stroke = {\n ...obj,\n width: oldStyle.strokeThickness\n };\n }\n\n if (Array.isArray(oldStyle.fillGradientStops))\n {\n // #if _DEBUG\n deprecation(v8_0_0, 'gradient fill is now a fill pattern: `new FillGradient(...)`');\n // #endif\n\n let fontSize: number;\n\n // eslint-disable-next-line no-eq-null, eqeqeq\n if (style.fontSize == null)\n {\n style.fontSize = TextStyle.defaultTextStyle.fontSize;\n }\n else if (typeof style.fontSize === 'string')\n {\n // eg '34px' to number\n fontSize = parseInt(style.fontSize as string, 10);\n }\n else\n {\n fontSize = style.fontSize as number;\n }\n\n const gradientFill = new FillGradient(0, 0, 0, fontSize * 1.7);\n\n const fills: number[] = oldStyle.fillGradientStops\n .map((color: ColorSource) => Color.shared.setValue(color).toNumber());\n\n fills.forEach((number, index) =>\n {\n const ratio = index / (fills.length - 1);\n\n gradientFill.addColorStop(ratio, number);\n });\n\n style.fill = {\n fill: gradientFill\n };\n }\n}\n\n"],"names":[],"mappings":"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"} |