UNPKG

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 16.3 kB
{"version":3,"file":"parseDDS.mjs","sources":["../../../src/compressed-textures/dds/parseDDS.ts"],"sourcesContent":["import { DDS, DXGI_TO_TEXTURE_FORMAT, FOURCC_TO_TEXTURE_FORMAT, TEXTURE_FORMAT_BLOCK_SIZE } from './const';\n\nimport type { TEXTURE_FORMATS } from '../../rendering/renderers/shared/texture/const';\nimport type { TextureSourceOptions } from '../../rendering/renderers/shared/texture/sources/TextureSource';\n\n/**\n * @param arrayBuffer\n * @param supportedFormats\n * @internal\n */\nexport function parseDDS(arrayBuffer: ArrayBuffer, supportedFormats: TEXTURE_FORMATS[]): TextureSourceOptions<Uint8Array[]>\n{\n const {\n format,\n fourCC,\n width,\n height,\n dataOffset,\n mipmapCount,\n } = parseDDSHeader(arrayBuffer);\n\n if (!supportedFormats.includes(format))\n {\n throw new Error(`Unsupported texture format: ${fourCC} ${format}, supported: ${supportedFormats}`);\n }\n\n if (mipmapCount <= 1)\n { // No need bothering with the imageSize calculation!\n return {\n format,\n width,\n height,\n resource: [new Uint8Array(arrayBuffer, dataOffset)],\n alphaMode: 'no-premultiply-alpha',\n } as TextureSourceOptions;\n }\n\n const levelBuffers = getMipmapLevelBuffers(format, width, height, dataOffset, mipmapCount, arrayBuffer);\n\n const textureOptions: TextureSourceOptions = {\n format,\n width,\n height,\n resource: levelBuffers,\n alphaMode: 'no-premultiply-alpha'\n };\n\n return textureOptions;\n}\n\nfunction getMipmapLevelBuffers(format: TEXTURE_FORMATS, width: number, height: number,\n dataOffset: any, mipmapCount: number, arrayBuffer: ArrayBuffer)\n{\n const levelBuffers = [];\n const blockBytes = TEXTURE_FORMAT_BLOCK_SIZE[format];\n\n let mipWidth = width;\n let mipHeight = height;\n let offset = dataOffset;\n\n for (let level = 0; level < mipmapCount; ++level)\n {\n // Each dimension must be aligned to a multiple of 4\n const alignedWidth = Math.ceil(Math.max(4, mipWidth) / 4) * 4;\n const alignedHeight = Math.ceil(Math.max(4, mipHeight) / 4) * 4;\n const byteLength = blockBytes\n ? alignedWidth / 4 * alignedHeight / 4 * blockBytes\n : mipWidth * mipHeight * 4;\n\n const levelBuffer = new Uint8Array(arrayBuffer, offset, byteLength);\n\n levelBuffers.push(levelBuffer);\n\n offset += byteLength;\n\n mipWidth = Math.max(mipWidth >> 1, 1);\n mipHeight = Math.max(mipHeight >> 1, 1);\n }\n\n return levelBuffers;\n}\n\nfunction parseDDSHeader(buffer: ArrayBuffer)\n{\n const header = new Uint32Array(buffer, 0, DDS.HEADER_SIZE / Uint32Array.BYTES_PER_ELEMENT);\n\n if (header[DDS.HEADER_FIELDS.MAGIC] !== DDS.MAGIC_VALUE)\n {\n throw new Error('Invalid magic number in DDS header');\n }\n\n // DDS header fields\n const height = header[DDS.HEADER_FIELDS.HEIGHT];\n const width = header[DDS.HEADER_FIELDS.WIDTH];\n const mipmapCount = Math.max(1, header[DDS.HEADER_FIELDS.MIPMAP_COUNT]);\n const flags = header[DDS.HEADER_FIELDS.PF_FLAGS];\n const fourCC = header[DDS.HEADER_FIELDS.FOURCC];\n const format = getTextureFormat(header, flags, fourCC, buffer);\n\n const dataOffset = DDS.MAGIC_SIZE + DDS.HEADER_SIZE\n + ((fourCC === DDS.D3DFMT.DX10) ? DDS.HEADER_DX10_SIZE : 0);\n\n return {\n format,\n fourCC,\n width,\n height,\n dataOffset,\n mipmapCount\n };\n}\n\nfunction getTextureFormat(header: Uint32Array, flags: number, fourCC: number, buffer: ArrayBuffer)\n{\n if (flags & DDS.PIXEL_FORMAT_FLAGS.FOURCC)\n {\n if (fourCC === DDS.D3DFMT.DX10)\n {\n const dx10Header = new Uint32Array(\n buffer,\n DDS.MAGIC_SIZE + DDS.HEADER_SIZE, // there is a 20-byte DDS_HEADER_DX10 after DDS_HEADER\n DDS.HEADER_DX10_SIZE / Uint32Array.BYTES_PER_ELEMENT);\n\n const miscFlag = dx10Header[DDS.HEADER_DX10_FIELDS.MISC_FLAG];\n\n if (miscFlag === DDS.RESOURCE_MISC_TEXTURECUBE)\n {\n throw new Error('DDSParser does not support cubemap textures');\n }\n\n const resourceDimension = dx10Header[DDS.HEADER_DX10_FIELDS.RESOURCE_DIMENSION];\n\n if (resourceDimension === DDS.D3D10_RESOURCE_DIMENSION.DDS_DIMENSION_TEXTURE3D)\n {\n throw new Error('DDSParser does not supported 3D texture data');\n }\n\n const dxgiFormat = dx10Header[DDS.HEADER_DX10_FIELDS.DXGI_FORMAT];\n\n if (dxgiFormat in DXGI_TO_TEXTURE_FORMAT)\n {\n return DXGI_TO_TEXTURE_FORMAT[dxgiFormat];\n }\n\n throw new Error(`DDSParser cannot parse texture data with DXGI format ${dxgiFormat}`);\n }\n\n if (fourCC in FOURCC_TO_TEXTURE_FORMAT)\n {\n return FOURCC_TO_TEXTURE_FORMAT[fourCC];\n }\n\n throw new Error(`DDSParser cannot parse texture data with fourCC format ${fourCC}`);\n }\n\n if (flags & DDS.PIXEL_FORMAT_FLAGS.RGB || flags & DDS.PIXEL_FORMAT_FLAGS.RGBA)\n {\n return getUncompressedTextureFormat(header);\n }\n\n if (flags & DDS.PIXEL_FORMAT_FLAGS.YUV)\n {\n throw new Error('DDSParser does not supported YUV uncompressed texture data.');\n }\n if (flags & DDS.PIXEL_FORMAT_FLAGS.LUMINANCE || flags & DDS.PIXEL_FORMAT_FLAGS.LUMINANCEA)\n {\n throw new Error('DDSParser does not support single-channel (lumninance) texture data!');\n }\n if (flags & DDS.PIXEL_FORMAT_FLAGS.ALPHA || flags & DDS.PIXEL_FORMAT_FLAGS.ALPHAPIXELS)\n {\n throw new Error('DDSParser does not support single-channel (alpha) texture data!');\n }\n\n throw new Error('DDSParser failed to load a texture file due to an unknown reason!');\n}\n\nfunction getUncompressedTextureFormat(header: Uint32Array)\n{\n const bitCount = header[DDS.HEADER_FIELDS.RGB_BITCOUNT];\n const rBitMask = header[DDS.HEADER_FIELDS.R_BIT_MASK];\n const gBitMask = header[DDS.HEADER_FIELDS.G_BIT_MASK];\n const bBitMask = header[DDS.HEADER_FIELDS.B_BIT_MASK];\n const aBitMask = header[DDS.HEADER_FIELDS.A_BIT_MASK];\n\n // https://learn.microsoft.com/en-us/windows/win32/direct3ddds/dx-graphics-dds-pguide\n // https://github.com/microsoft/DirectXTex/blob/main/DDSTextureLoader/DDSTextureLoader11.cpp#L892\n switch (bitCount)\n {\n case 32:\n if (rBitMask === 0x000000ff && gBitMask === 0x0000ff00 && bBitMask === 0x00ff0000 && aBitMask === 0xff000000)\n {\n return DXGI_TO_TEXTURE_FORMAT[DDS.DXGI_FORMAT.DXGI_FORMAT_R8G8B8A8_UNORM];\n }\n if (rBitMask === 0x00ff0000 && gBitMask === 0x0000ff00 && bBitMask === 0x000000ff && aBitMask === 0xff000000)\n {\n return DXGI_TO_TEXTURE_FORMAT[DDS.DXGI_FORMAT.DXGI_FORMAT_B8G8R8A8_UNORM];\n }\n if (rBitMask === 0x3ff00000 && gBitMask === 0x000ffc00 && bBitMask === 0x000003ff && aBitMask === 0xc0000000)\n {\n return DXGI_TO_TEXTURE_FORMAT[DDS.DXGI_FORMAT.DXGI_FORMAT_R10G10B10A2_UNORM];\n }\n if (rBitMask === 0x0000ffff && gBitMask === 0xffff0000 && bBitMask === 0 && aBitMask === 0)\n {\n return DXGI_TO_TEXTURE_FORMAT[DDS.DXGI_FORMAT.DXGI_FORMAT_R16G16_UNORM];\n }\n if (rBitMask === 0xffffffff && gBitMask === 0 && bBitMask === 0 && aBitMask === 0)\n {\n return DXGI_TO_TEXTURE_FORMAT[DDS.DXGI_FORMAT.DXGI_FORMAT_R32_FLOAT];\n }\n break;\n case 24:\n if (rBitMask === 0xff0000 && gBitMask === 0xff00 && bBitMask === 0xff && aBitMask === 0x8000)\n {\n // rgb8unorm not supported?\n // return DXGI_TO_TEXTURE_FORMAT[DDS.DXGI_FORMAT.DXGI_FORMAT_B5G5R5A1_UNORM];\n }\n break;\n case 16:\n if (rBitMask === 0x7c00 && gBitMask === 0x03e0 && bBitMask === 0x001f && aBitMask === 0x8000)\n {\n return DXGI_TO_TEXTURE_FORMAT[DDS.DXGI_FORMAT.DXGI_FORMAT_B5G5R5A1_UNORM];\n }\n if (rBitMask === 0xf800 && gBitMask === 0x07e0 && bBitMask === 0x001f && aBitMask === 0)\n {\n return DXGI_TO_TEXTURE_FORMAT[DDS.DXGI_FORMAT.DXGI_FORMAT_B5G6R5_UNORM];\n }\n if (rBitMask === 0x0f00 && gBitMask === 0x00f0 && bBitMask === 0x000f && aBitMask === 0xf000)\n {\n return DXGI_TO_TEXTURE_FORMAT[DDS.DXGI_FORMAT.DXGI_FORMAT_B4G4R4A4_UNORM];\n }\n if (rBitMask === 0x00ff && gBitMask === 0 && bBitMask === 0 && aBitMask === 0xff00)\n {\n return DXGI_TO_TEXTURE_FORMAT[DDS.DXGI_FORMAT.DXGI_FORMAT_R8G8_UNORM];\n }\n if (rBitMask === 0xffff && gBitMask === 0 && bBitMask === 0 && aBitMask === 0)\n {\n return DXGI_TO_TEXTURE_FORMAT[DDS.DXGI_FORMAT.DXGI_FORMAT_R16_UNORM];\n }\n break;\n\n case 8:\n if (rBitMask === 0xff && gBitMask === 0 && bBitMask === 0 && aBitMask === 0)\n {\n return DXGI_TO_TEXTURE_FORMAT[DDS.DXGI_FORMAT.DXGI_FORMAT_R8_UNORM];\n }\n break;\n }\n\n throw new Error(`DDSParser does not support uncompressed texture with configuration:\n bitCount = ${bitCount}, rBitMask = ${rBitMask}, gBitMask = ${gBitMask}, aBitMask = ${aBitMask}`);\n}\n"],"names":[],"mappings":"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"}