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">
1 lines • 6.79 kB
Source Map (JSON)
{"version":3,"file":"bitmapTextSplit.mjs","sources":["../../../../src/scene/text-bitmap/utils/bitmapTextSplit.ts"],"sourcesContent":["import { Container } from '../../container/Container';\nimport { CanvasTextMetrics } from '../../text/canvas/CanvasTextMetrics';\nimport { type TextStyle } from '../../text/TextStyle';\nimport { type SplitOptions } from '../../text-split/SplitText';\nimport { type TextSplitOutput } from '../../text-split/types';\nimport { BitmapFontManager } from '../BitmapFontManager';\nimport { BitmapText } from '../BitmapText';\nimport { getBitmapTextLayout } from './getBitmapTextLayout';\n\n/**\n * Splits a Text object into segments based on the text's layout and style,\n * and adds these segments as individual Text objects to a specified container.\n *\n * This function handles word wrapping, alignment, and letter spacing,\n * ensuring that each segment is rendered correctly according to the original text's style.\n * @param options - Configuration options for the text split operation.\n * @returns An array of Text objects representing the split segments.\n * @internal\n */\nexport function bitmapTextSplit(\n options: Pick<SplitOptions, 'text' | 'style'> & { chars: BitmapText[] },\n): TextSplitOutput<BitmapText>\n{\n const { text, style, chars: existingChars } = options;\n const textStyle = style as TextStyle;\n const font = BitmapFontManager.getFont(text, textStyle);\n\n const segments = CanvasTextMetrics.graphemeSegmenter(text);\n const layout = getBitmapTextLayout(segments, textStyle, font, true);\n const scale = layout.scale;\n const chars: BitmapText[] = [];\n const words: Container[] = [];\n const lines: Container[] = [];\n const lineHeight = style.lineHeight ? style.lineHeight : font.lineHeight * scale;\n\n let yOffset = 0;\n\n for (const line of layout.lines)\n {\n // if the line is empty, skip it\n if (line.chars.length === 0) continue;\n\n const lineContainer = new Container({ label: 'line' });\n\n lineContainer.y = yOffset;\n lines.push(lineContainer);\n\n let currentWordContainer = new Container({ label: 'word' });\n let currentWordStartIndex = 0;\n\n for (let i = 0; i < line.chars.length; i++)\n {\n const char = line.chars[i];\n\n if (!char) continue;\n\n const charData = font.chars[char];\n\n if (!charData) continue;\n\n const isSpace = char === ' ';\n const isLastChar = i === line.chars.length - 1;\n\n let charInstance: BitmapText;\n\n if (existingChars.length > 0)\n {\n charInstance = existingChars.shift();\n charInstance.text = char;\n charInstance.style = textStyle;\n charInstance.label = `char-${char}`;\n charInstance.x = (line.charPositions[i]! * scale) - (line.charPositions[currentWordStartIndex]! * scale);\n }\n else\n {\n // Create a new BitmapText instance if no existing one is available\n charInstance = new BitmapText({\n text: char,\n style: textStyle,\n label: `char-${char}`,\n x: (line.charPositions[i]! * scale) - (line.charPositions[currentWordStartIndex]! * scale),\n });\n }\n\n if (!isSpace)\n {\n chars.push(charInstance);\n // Add to word container\n currentWordContainer.addChild(charInstance);\n }\n\n // Handle word breaks\n if (isSpace || isLastChar)\n {\n if (currentWordContainer.children.length > 0)\n {\n currentWordContainer.x = line.charPositions[currentWordStartIndex]! * scale;\n words.push(currentWordContainer);\n lineContainer.addChild(currentWordContainer);\n\n // Start new word container\n currentWordContainer = new Container({ label: 'word' });\n currentWordStartIndex = i + 1;\n }\n }\n }\n\n yOffset += lineHeight;\n }\n\n return { chars, lines, words };\n}\n"],"names":[],"mappings":"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"}