{"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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"}