{"version":3,"file":"TextureAtlas.mjs","sources":["../../src/core/TextureAtlas.ts"],"sourcesContent":["import { Texture, SCALE_MODES, MIPMAP_MODES, ALPHA_MODES, Rectangle } from '@pixi/core';\nimport { TextureRegion, TextureWrap, TextureFilter, filterFromString } from './TextureRegion';\nimport type { Map, Disposable } from './Utils';\nimport type { BaseTexture } from '@pixi/core';\n\nclass RegionFields {\n    x = 0;\n    y = 0;\n    width = 0;\n    height = 0;\n    offsetX = 0;\n    offsetY = 0;\n    originalWidth = 0;\n    originalHeight = 0;\n    rotate = 0;\n    index = 0;\n}\n/**\n * @public\n */\nexport class TextureAtlas implements Disposable {\n    pages = new Array<TextureAtlasPage>();\n    regions = new Array<TextureAtlasRegion>();\n\n    constructor(atlasText?: string, textureLoader?: (path: string, loaderFunction: (tex: BaseTexture) => any) => any, callback?: (obj: TextureAtlas) => any) {\n        if (atlasText) {\n            this.addSpineAtlas(atlasText, textureLoader, callback);\n        }\n    }\n\n    addTexture(name: string, texture: Texture) {\n        const pages = this.pages;\n        let page: TextureAtlasPage = null;\n\n        for (let i = 0; i < pages.length; i++) {\n            if (pages[i].baseTexture === texture.baseTexture) {\n                page = pages[i];\n                break;\n            }\n        }\n        if (page === null) {\n            page = new TextureAtlasPage();\n            page.name = 'texturePage';\n            const baseTexture = texture.baseTexture;\n\n            page.width = baseTexture.realWidth;\n            page.height = baseTexture.realHeight;\n            page.baseTexture = baseTexture;\n            // those fields are not relevant in Pixi\n            page.minFilter = page.magFilter = TextureFilter.Nearest;\n            page.uWrap = TextureWrap.ClampToEdge;\n            page.vWrap = TextureWrap.ClampToEdge;\n            pages.push(page);\n        }\n        const region = new TextureAtlasRegion();\n\n        region.name = name;\n        region.page = page;\n        region.texture = texture;\n        region.index = -1;\n        this.regions.push(region);\n\n        return region;\n    }\n\n    addTextureHash(textures: Map<Texture>, stripExtension: boolean) {\n        for (const key in textures) {\n            if (textures.hasOwnProperty(key)) {\n                this.addTexture(stripExtension && key.indexOf('.') !== -1 ? key.substr(0, key.lastIndexOf('.')) : key, textures[key]);\n            }\n        }\n    }\n\n    public addSpineAtlas(atlasText: string, textureLoader: (path: string, loaderFunction: (tex: BaseTexture) => any) => any, callback: (obj: TextureAtlas) => any) {\n        return this.load(atlasText, textureLoader, callback);\n    }\n\n    private load(atlasText: string, textureLoader: (path: string, loaderFunction: (tex: BaseTexture) => any) => any, callback: (obj: TextureAtlas) => any) {\n        if (textureLoader == null) {\n            throw new Error('textureLoader cannot be null.');\n        }\n\n        const reader = new TextureAtlasReader(atlasText);\n        const entry = new Array<string>(4);\n        let page: TextureAtlasPage = null;\n        const pageFields: Map<Function> = {};\n        let region: RegionFields = null;\n\n        pageFields.size = () => {\n            page.width = parseInt(entry[1]);\n            page.height = parseInt(entry[2]);\n        };\n        pageFields.format = () => {\n            // page.format = Format[tuple[0]]; we don't need format in WebGL\n        };\n        pageFields.filter = () => {\n            page.minFilter = filterFromString(entry[1]);\n            page.magFilter = filterFromString(entry[2]);\n        };\n        pageFields.repeat = () => {\n            if (entry[1].indexOf('x') != -1) page.uWrap = TextureWrap.Repeat;\n            if (entry[1].indexOf('y') != -1) page.vWrap = TextureWrap.Repeat;\n        };\n        pageFields.pma = () => {\n            page.pma = entry[1] == 'true';\n        };\n\n        const regionFields: Map<Function> = {};\n\n        regionFields.xy = () => {\n            // Deprecated, use bounds.\n            region.x = parseInt(entry[1]);\n            region.y = parseInt(entry[2]);\n        };\n        regionFields.size = () => {\n            // Deprecated, use bounds.\n            region.width = parseInt(entry[1]);\n            region.height = parseInt(entry[2]);\n        };\n        regionFields.bounds = () => {\n            region.x = parseInt(entry[1]);\n            region.y = parseInt(entry[2]);\n            region.width = parseInt(entry[3]);\n            region.height = parseInt(entry[4]);\n        };\n        regionFields.offset = () => {\n            // Deprecated, use offsets.\n            region.offsetX = parseInt(entry[1]);\n            region.offsetY = parseInt(entry[2]);\n        };\n        regionFields.orig = () => {\n            // Deprecated, use offsets.\n            region.originalWidth = parseInt(entry[1]);\n            region.originalHeight = parseInt(entry[2]);\n        };\n        regionFields.offsets = () => {\n            region.offsetX = parseInt(entry[1]);\n            region.offsetY = parseInt(entry[2]);\n            region.originalWidth = parseInt(entry[3]);\n            region.originalHeight = parseInt(entry[4]);\n        };\n        regionFields.rotate = () => {\n            const rotateValue = entry[1];\n            let rotate = 0;\n\n            if (rotateValue.toLocaleLowerCase() == 'true') {\n                rotate = 6;\n            } else if (rotateValue.toLocaleLowerCase() == 'false') {\n                rotate = 0;\n            } else {\n                rotate = ((720 - parseFloat(rotateValue)) % 360) / 45;\n            }\n            region.rotate = rotate;\n        };\n        regionFields.index = () => {\n            region.index = parseInt(entry[1]);\n        };\n\n        let line = reader.readLine();\n        // Ignore empty lines before first entry.\n\n        while (line != null && line.trim().length == 0) {\n            line = reader.readLine();\n        }\n        // Header entries.\n        while (true) {\n            if (line == null || line.trim().length == 0) break;\n            if (reader.readEntry(entry, line) == 0) break; // Silently ignore all header fields.\n            line = reader.readLine();\n        }\n\n        const iterateParser = () => {\n            while (true) {\n                if (line == null) {\n                    return callback && callback(this);\n                }\n                if (line.trim().length == 0) {\n                    page = null;\n                    line = reader.readLine();\n                } else if (page === null) {\n                    page = new TextureAtlasPage();\n                    page.name = line.trim();\n\n                    while (true) {\n                        if (reader.readEntry(entry, (line = reader.readLine())) == 0) break;\n                        const field: Function = pageFields[entry[0]];\n\n                        if (field) field();\n                    }\n                    this.pages.push(page);\n\n                    textureLoader(page.name, (texture: BaseTexture) => {\n                        if (texture === null) {\n                            this.pages.splice(this.pages.indexOf(page), 1);\n\n                            return callback && callback(null);\n                        }\n                        page.baseTexture = texture;\n                        // TODO: set scaleMode and mipmapMode from spine\n                        if (page.pma) {\n                            texture.alphaMode = ALPHA_MODES.PMA;\n                        }\n                        if (!texture.valid) {\n                            texture.setSize(page.width, page.height);\n                        }\n                        page.setFilters();\n\n                        if (!page.width || !page.height) {\n                            page.width = texture.realWidth;\n                            page.height = texture.realHeight;\n                            if (!page.width || !page.height) {\n                                console.log(\n                                    `ERROR spine atlas page ${page.name}: meshes wont work if you dont specify size in atlas (http://www.html5gamedevs.com/topic/18888-pixi-spines-and-meshes/?p=107121)`\n                                );\n                            }\n                        }\n                        iterateParser();\n                    });\n                    break;\n                } else {\n                    region = new RegionFields();\n                    const atlasRegion = new TextureAtlasRegion();\n\n                    atlasRegion.name = line;\n                    atlasRegion.page = page;\n                    let names: string[] = null;\n                    let values: number[][] = null;\n\n                    while (true) {\n                        const count = reader.readEntry(entry, (line = reader.readLine()));\n\n                        if (count == 0) break;\n                        const field: Function = regionFields[entry[0]];\n\n                        if (field) {\n                            field();\n                        } else {\n                            if (names == null) {\n                                names = [];\n                                values = [];\n                            }\n                            names.push(entry[0]);\n                            const entryValues: number[] = [];\n\n                            for (let i = 0; i < count; i++) {\n                                entryValues.push(parseInt(entry[i + 1]));\n                            }\n                            values.push(entryValues);\n                        }\n                    }\n                    if (region.originalWidth == 0 && region.originalHeight == 0) {\n                        region.originalWidth = region.width;\n                        region.originalHeight = region.height;\n                    }\n\n                    const resolution = page.baseTexture.resolution;\n\n                    region.x /= resolution;\n                    region.y /= resolution;\n                    region.width /= resolution;\n                    region.height /= resolution;\n                    region.originalWidth /= resolution;\n                    region.originalHeight /= resolution;\n                    region.offsetX /= resolution;\n                    region.offsetY /= resolution;\n\n                    const swapWH = region.rotate % 4 !== 0;\n                    const frame = new Rectangle(region.x, region.y, swapWH ? region.height : region.width, swapWH ? region.width : region.height);\n\n                    const orig = new Rectangle(0, 0, region.originalWidth, region.originalHeight);\n                    const trim = new Rectangle(region.offsetX, region.originalHeight - region.height - region.offsetY, region.width, region.height);\n\n                    atlasRegion.texture = new Texture(atlasRegion.page.baseTexture, frame, orig, trim, region.rotate);\n                    atlasRegion.index = region.index;\n                    atlasRegion.texture.updateUvs();\n\n                    this.regions.push(atlasRegion);\n                }\n            }\n        };\n\n        iterateParser();\n    }\n\n    findRegion(name: string): TextureAtlasRegion {\n        for (let i = 0; i < this.regions.length; i++) {\n            if (this.regions[i].name == name) {\n                return this.regions[i];\n            }\n        }\n\n        return null;\n    }\n\n    dispose() {\n        for (let i = 0; i < this.pages.length; i++) {\n            this.pages[i].baseTexture.dispose();\n        }\n    }\n}\n\n/**\n * @public\n */\nclass TextureAtlasReader {\n    lines: Array<string>;\n    index = 0;\n\n    constructor(text: string) {\n        this.lines = text.split(/\\r\\n|\\r|\\n/);\n    }\n\n    readLine(): string {\n        if (this.index >= this.lines.length) {\n            return null;\n        }\n\n        return this.lines[this.index++];\n    }\n\n    readEntry(entry: string[], line: string): number {\n        if (line == null) return 0;\n        line = line.trim();\n        if (line.length == 0) return 0;\n\n        const colon = line.indexOf(':');\n\n        if (colon == -1) return 0;\n        entry[0] = line.substr(0, colon).trim();\n        for (let i = 1, lastMatch = colon + 1; ; i++) {\n            const comma = line.indexOf(',', lastMatch);\n\n            if (comma == -1) {\n                entry[i] = line.substr(lastMatch).trim();\n\n                return i;\n            }\n            entry[i] = line.substr(lastMatch, comma - lastMatch).trim();\n            lastMatch = comma + 1;\n            if (i == 4) return 4;\n        }\n    }\n}\n\n/**\n * @public\n */\nexport class TextureAtlasPage {\n    name: string;\n    minFilter: TextureFilter = TextureFilter.Nearest;\n    magFilter: TextureFilter = TextureFilter.Nearest;\n    uWrap: TextureWrap = TextureWrap.ClampToEdge;\n    vWrap: TextureWrap = TextureWrap.ClampToEdge;\n    baseTexture: BaseTexture;\n    width: number;\n    height: number;\n    pma: boolean;\n\n    public setFilters() {\n        const tex = this.baseTexture;\n        const filter = this.minFilter;\n\n        if (filter == TextureFilter.Linear) {\n            tex.scaleMode = SCALE_MODES.LINEAR;\n        } else if (this.minFilter == TextureFilter.Nearest) {\n            tex.scaleMode = SCALE_MODES.NEAREST;\n        } else {\n            tex.mipmap = MIPMAP_MODES.POW2;\n            if (filter == TextureFilter.MipMapNearestNearest) {\n                tex.scaleMode = SCALE_MODES.NEAREST;\n            } else {\n                tex.scaleMode = SCALE_MODES.LINEAR;\n            }\n        }\n    }\n}\n\n/**\n * @public\n */\nexport class TextureAtlasRegion extends TextureRegion {\n    page: TextureAtlasPage;\n    name: string;\n    index: number;\n}\n"],"names":[],"mappings":"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"}