mirror of
https://github.com/photonstorm/phaser
synced 2025-01-13 05:38:48 +00:00
96 lines
2.5 KiB
JavaScript
96 lines
2.5 KiB
JavaScript
/**
|
|
* @author Richard Davey <rich@photonstorm.com>
|
|
* @copyright 2021 Photon Storm Ltd.
|
|
* @license {@link https://opensource.org/licenses/MIT|MIT License}
|
|
*/
|
|
|
|
/**
|
|
* Parses a KTX format Compressed Texture file and generates texture data suitable for WebGL from it.
|
|
*
|
|
* @function Phaser.Textures.Parsers.KTXParser
|
|
* @memberof Phaser.Textures.Parsers
|
|
* @since 3.60.0
|
|
*
|
|
* @param {ArrayBuffer} data - The data object created by the Compressed Texture File Loader.
|
|
*
|
|
* @return {Phaser.Types.Textures.CompressedTextureData} The Compressed Texture data.
|
|
*/
|
|
var KTXParser = function (data)
|
|
{
|
|
var idCheck = [ 0xab, 0x4b, 0x54, 0x58, 0x20, 0x31, 0x31, 0xbb, 0x0d, 0x0a, 0x1a, 0x0a ];
|
|
|
|
var i;
|
|
var id = new Uint8Array(data, 0, 12);
|
|
|
|
for (i = 0; i < id.length; i++)
|
|
{
|
|
if (id[i] !== idCheck[i])
|
|
{
|
|
console.warn('KTXParser - Invalid file format');
|
|
|
|
return;
|
|
}
|
|
}
|
|
|
|
var size = Uint32Array.BYTES_PER_ELEMENT;
|
|
|
|
var head = new DataView(data, 12, 13 * size);
|
|
|
|
var littleEndian = (head.getUint32(0, true) === 0x04030201);
|
|
|
|
var glType = head.getUint32(1 * size, littleEndian);
|
|
|
|
if (glType !== 0)
|
|
{
|
|
console.warn('KTXParser - Only compressed formats supported');
|
|
|
|
return;
|
|
}
|
|
|
|
var internalFormat = head.getUint32(4 * size, littleEndian);
|
|
var width = head.getUint32(6 * size, littleEndian);
|
|
var height = head.getUint32(7 * size, littleEndian);
|
|
|
|
var mipmapLevels = Math.max(1, head.getUint32(11 * size, littleEndian));
|
|
|
|
var bytesOfKeyValueData = head.getUint32(12 * size, littleEndian);
|
|
|
|
var mipmaps = new Array(mipmapLevels);
|
|
|
|
var offset = 12 + 13 * 4 + bytesOfKeyValueData;
|
|
var levelWidth = width;
|
|
var levelHeight = height;
|
|
|
|
for (i = 0; i < mipmapLevels; i++)
|
|
{
|
|
var levelSize = new Int32Array(data, offset, 1)[0];
|
|
|
|
// levelSize field
|
|
offset += 4;
|
|
|
|
mipmaps[i] = {
|
|
data: new Uint8Array(data, offset, levelSize),
|
|
width: levelWidth,
|
|
height: levelHeight
|
|
};
|
|
|
|
// add padding for odd sized image
|
|
// offset += 3 - ((levelSize + 3) % 4);
|
|
|
|
levelWidth = Math.max(1, levelWidth >> 1);
|
|
levelHeight = Math.max(1, levelHeight >> 1);
|
|
|
|
offset += levelSize;
|
|
}
|
|
|
|
return {
|
|
mipmaps: mipmaps,
|
|
width: width,
|
|
height: height,
|
|
internalFormat: internalFormat,
|
|
compressed: true,
|
|
generateMipmap: false
|
|
};
|
|
};
|
|
|
|
module.exports = KTXParser;
|