1 line
16 KiB
Plaintext
1 line
16 KiB
Plaintext
{"version":3,"file":"parseDDS.mjs","sources":["../../src/parsers/parseDDS.ts"],"sourcesContent":["import { INTERNAL_FORMAT_TO_BYTES_PER_PIXEL, INTERNAL_FORMATS } from '../const';\nimport { CompressedTextureResource } from '../resources';\n\nconst DDS_MAGIC_SIZE = 4;\nconst DDS_HEADER_SIZE = 124;\nconst DDS_HEADER_PF_SIZE = 32;\nconst DDS_HEADER_DX10_SIZE = 20;\n\n// DDS file format magic word\nconst DDS_MAGIC = 0x20534444;\n\n/**\n * DWORD offsets of the DDS file header fields (relative to file start).\n * @ignore\n */\nconst DDS_FIELDS = {\n SIZE: 1,\n FLAGS: 2,\n HEIGHT: 3,\n WIDTH: 4,\n MIPMAP_COUNT: 7,\n PIXEL_FORMAT: 19,\n};\n\n/**\n * DWORD offsets of the DDS PIXEL_FORMAT fields.\n * @ignore\n */\nconst DDS_PF_FIELDS = {\n SIZE: 0,\n FLAGS: 1,\n FOURCC: 2,\n RGB_BITCOUNT: 3,\n R_BIT_MASK: 4,\n G_BIT_MASK: 5,\n B_BIT_MASK: 6,\n A_BIT_MASK: 7\n};\n\n/**\n * DWORD offsets of the DDS_HEADER_DX10 fields.\n * @ignore\n */\nconst DDS_DX10_FIELDS = {\n DXGI_FORMAT: 0,\n RESOURCE_DIMENSION: 1,\n MISC_FLAG: 2,\n ARRAY_SIZE: 3,\n MISC_FLAGS2: 4\n};\n\n/**\n * @see https://docs.microsoft.com/en-us/windows/win32/api/dxgiformat/ne-dxgiformat-dxgi_format\n * This is way over-blown for us! Lend us a hand, and remove the ones that aren't used (but set the remaining\n * ones to their correct value)\n * @ignore\n */\nenum DXGI_FORMAT\n {\n DXGI_FORMAT_UNKNOWN,\n DXGI_FORMAT_R32G32B32A32_TYPELESS,\n DXGI_FORMAT_R32G32B32A32_FLOAT,\n DXGI_FORMAT_R32G32B32A32_UINT,\n DXGI_FORMAT_R32G32B32A32_SINT,\n DXGI_FORMAT_R32G32B32_TYPELESS,\n DXGI_FORMAT_R32G32B32_FLOAT,\n DXGI_FORMAT_R32G32B32_UINT,\n DXGI_FORMAT_R32G32B32_SINT,\n DXGI_FORMAT_R16G16B16A16_TYPELESS,\n DXGI_FORMAT_R16G16B16A16_FLOAT,\n DXGI_FORMAT_R16G16B16A16_UNORM,\n DXGI_FORMAT_R16G16B16A16_UINT,\n DXGI_FORMAT_R16G16B16A16_SNORM,\n DXGI_FORMAT_R16G16B16A16_SINT,\n DXGI_FORMAT_R32G32_TYPELESS,\n DXGI_FORMAT_R32G32_FLOAT,\n DXGI_FORMAT_R32G32_UINT,\n DXGI_FORMAT_R32G32_SINT,\n DXGI_FORMAT_R32G8X24_TYPELESS,\n DXGI_FORMAT_D32_FLOAT_S8X24_UINT,\n DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS,\n DXGI_FORMAT_X32_TYPELESS_G8X24_UINT,\n DXGI_FORMAT_R10G10B10A2_TYPELESS,\n DXGI_FORMAT_R10G10B10A2_UNORM,\n DXGI_FORMAT_R10G10B10A2_UINT,\n DXGI_FORMAT_R11G11B10_FLOAT,\n DXGI_FORMAT_R8G8B8A8_TYPELESS,\n DXGI_FORMAT_R8G8B8A8_UNORM,\n DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,\n DXGI_FORMAT_R8G8B8A8_UINT,\n DXGI_FORMAT_R8G8B8A8_SNORM,\n DXGI_FORMAT_R8G8B8A8_SINT,\n DXGI_FORMAT_R16G16_TYPELESS,\n DXGI_FORMAT_R16G16_FLOAT,\n DXGI_FORMAT_R16G16_UNORM,\n DXGI_FORMAT_R16G16_UINT,\n DXGI_FORMAT_R16G16_SNORM,\n DXGI_FORMAT_R16G16_SINT,\n DXGI_FORMAT_R32_TYPELESS,\n DXGI_FORMAT_D32_FLOAT,\n DXGI_FORMAT_R32_FLOAT,\n DXGI_FORMAT_R32_UINT,\n DXGI_FORMAT_R32_SINT,\n DXGI_FORMAT_R24G8_TYPELESS,\n DXGI_FORMAT_D24_UNORM_S8_UINT,\n DXGI_FORMAT_R24_UNORM_X8_TYPELESS,\n DXGI_FORMAT_X24_TYPELESS_G8_UINT,\n DXGI_FORMAT_R8G8_TYPELESS,\n DXGI_FORMAT_R8G8_UNORM,\n DXGI_FORMAT_R8G8_UINT,\n DXGI_FORMAT_R8G8_SNORM,\n DXGI_FORMAT_R8G8_SINT,\n DXGI_FORMAT_R16_TYPELESS,\n DXGI_FORMAT_R16_FLOAT,\n DXGI_FORMAT_D16_UNORM,\n DXGI_FORMAT_R16_UNORM,\n DXGI_FORMAT_R16_UINT,\n DXGI_FORMAT_R16_SNORM,\n DXGI_FORMAT_R16_SINT,\n DXGI_FORMAT_R8_TYPELESS,\n DXGI_FORMAT_R8_UNORM,\n DXGI_FORMAT_R8_UINT,\n DXGI_FORMAT_R8_SNORM,\n DXGI_FORMAT_R8_SINT,\n DXGI_FORMAT_A8_UNORM,\n DXGI_FORMAT_R1_UNORM,\n DXGI_FORMAT_R9G9B9E5_SHAREDEXP,\n DXGI_FORMAT_R8G8_B8G8_UNORM,\n DXGI_FORMAT_G8R8_G8B8_UNORM,\n DXGI_FORMAT_BC1_TYPELESS,\n DXGI_FORMAT_BC1_UNORM,\n DXGI_FORMAT_BC1_UNORM_SRGB,\n DXGI_FORMAT_BC2_TYPELESS,\n DXGI_FORMAT_BC2_UNORM,\n DXGI_FORMAT_BC2_UNORM_SRGB,\n DXGI_FORMAT_BC3_TYPELESS,\n DXGI_FORMAT_BC3_UNORM,\n DXGI_FORMAT_BC3_UNORM_SRGB,\n DXGI_FORMAT_BC4_TYPELESS,\n DXGI_FORMAT_BC4_UNORM,\n DXGI_FORMAT_BC4_SNORM,\n DXGI_FORMAT_BC5_TYPELESS,\n DXGI_FORMAT_BC5_UNORM,\n DXGI_FORMAT_BC5_SNORM,\n DXGI_FORMAT_B5G6R5_UNORM,\n DXGI_FORMAT_B5G5R5A1_UNORM,\n DXGI_FORMAT_B8G8R8A8_UNORM,\n DXGI_FORMAT_B8G8R8X8_UNORM,\n DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM,\n DXGI_FORMAT_B8G8R8A8_TYPELESS,\n DXGI_FORMAT_B8G8R8A8_UNORM_SRGB,\n DXGI_FORMAT_B8G8R8X8_TYPELESS,\n DXGI_FORMAT_B8G8R8X8_UNORM_SRGB,\n DXGI_FORMAT_BC6H_TYPELESS,\n DXGI_FORMAT_BC6H_UF16,\n DXGI_FORMAT_BC6H_SF16,\n DXGI_FORMAT_BC7_TYPELESS,\n DXGI_FORMAT_BC7_UNORM,\n DXGI_FORMAT_BC7_UNORM_SRGB,\n DXGI_FORMAT_AYUV,\n DXGI_FORMAT_Y410,\n DXGI_FORMAT_Y416,\n DXGI_FORMAT_NV12,\n DXGI_FORMAT_P010,\n DXGI_FORMAT_P016,\n DXGI_FORMAT_420_OPAQUE,\n DXGI_FORMAT_YUY2,\n DXGI_FORMAT_Y210,\n DXGI_FORMAT_Y216,\n DXGI_FORMAT_NV11,\n DXGI_FORMAT_AI44,\n DXGI_FORMAT_IA44,\n DXGI_FORMAT_P8,\n DXGI_FORMAT_A8P8,\n DXGI_FORMAT_B4G4R4A4_UNORM,\n DXGI_FORMAT_P208,\n DXGI_FORMAT_V208,\n DXGI_FORMAT_V408,\n DXGI_FORMAT_SAMPLER_FEEDBACK_MIN_MIP_OPAQUE,\n DXGI_FORMAT_SAMPLER_FEEDBACK_MIP_REGION_USED_OPAQUE,\n DXGI_FORMAT_FORCE_UINT\n}\n\n/**\n * Possible values of the field {@link DDS_DX10_FIELDS.RESOURCE_DIMENSION}\n * @ignore\n */\nenum D3D10_RESOURCE_DIMENSION\n {\n DDS_DIMENSION_TEXTURE1D = 2,\n DDS_DIMENSION_TEXTURE2D = 3,\n DDS_DIMENSION_TEXTURE3D = 6\n}\n\nconst PF_FLAGS = 1;\n\n// PIXEL_FORMAT flags\nconst DDPF_ALPHA = 0x2;\nconst DDPF_FOURCC = 0x4;\nconst DDPF_RGB = 0x40;\nconst DDPF_YUV = 0x200;\nconst DDPF_LUMINANCE = 0x20000;\n\n// Four character codes for DXTn formats\nconst FOURCC_DXT1 = 0x31545844;\nconst FOURCC_DXT3 = 0x33545844;\nconst FOURCC_DXT5 = 0x35545844;\nconst FOURCC_DX10 = 0x30315844;\n\n// Cubemap texture flag (for DDS_DX10_FIELDS.MISC_FLAG)\nconst DDS_RESOURCE_MISC_TEXTURECUBE = 0x4;\n\n/**\n * Maps `FOURCC_*` formats to internal formats (see {@link PIXI.INTERNAL_FORMATS}).\n * @ignore\n */\nconst FOURCC_TO_FORMAT: { [id: number]: number } = {\n [FOURCC_DXT1]: INTERNAL_FORMATS.COMPRESSED_RGBA_S3TC_DXT1_EXT,\n [FOURCC_DXT3]: INTERNAL_FORMATS.COMPRESSED_RGBA_S3TC_DXT3_EXT,\n [FOURCC_DXT5]: INTERNAL_FORMATS.COMPRESSED_RGBA_S3TC_DXT5_EXT\n};\n\n/**\n * Maps {@link DXGI_FORMAT} to types/internal-formats (see {@link PIXI.TYPES}, {@link PIXI.INTERNAL_FORMATS})\n * @ignore\n */\nconst DXGI_TO_FORMAT: { [id: number]: number } = {\n // WEBGL_compressed_texture_s3tc\n [DXGI_FORMAT.DXGI_FORMAT_BC1_TYPELESS]: INTERNAL_FORMATS.COMPRESSED_RGBA_S3TC_DXT1_EXT,\n [DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM]: INTERNAL_FORMATS.COMPRESSED_RGBA_S3TC_DXT1_EXT,\n [DXGI_FORMAT.DXGI_FORMAT_BC2_TYPELESS]: INTERNAL_FORMATS.COMPRESSED_RGBA_S3TC_DXT3_EXT,\n [DXGI_FORMAT.DXGI_FORMAT_BC2_UNORM]: INTERNAL_FORMATS.COMPRESSED_RGBA_S3TC_DXT3_EXT,\n [DXGI_FORMAT.DXGI_FORMAT_BC3_TYPELESS]: INTERNAL_FORMATS.COMPRESSED_RGBA_S3TC_DXT5_EXT,\n [DXGI_FORMAT.DXGI_FORMAT_BC3_UNORM]: INTERNAL_FORMATS.COMPRESSED_RGBA_S3TC_DXT5_EXT,\n\n // WEBGL_compressed_texture_s3tc_srgb\n [DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM_SRGB]: INTERNAL_FORMATS.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT,\n [DXGI_FORMAT.DXGI_FORMAT_BC2_UNORM_SRGB]: INTERNAL_FORMATS.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT,\n [DXGI_FORMAT.DXGI_FORMAT_BC3_UNORM_SRGB]: INTERNAL_FORMATS.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT,\n\n // EXT_texture_compression_bptc\n // BC6H\n [DXGI_FORMAT.DXGI_FORMAT_BC6H_SF16]: INTERNAL_FORMATS.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT,\n [DXGI_FORMAT.DXGI_FORMAT_BC6H_UF16]: INTERNAL_FORMATS.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT,\n // BC7\n [DXGI_FORMAT.DXGI_FORMAT_BC7_UNORM]: INTERNAL_FORMATS.COMPRESSED_RGBA_BPTC_UNORM_EXT,\n [DXGI_FORMAT.DXGI_FORMAT_BC7_UNORM_SRGB]: INTERNAL_FORMATS.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT,\n};\n\n/**\n * Parses the DDS file header, generates base-textures, and puts them into the texture cache.\n * @see https://docs.microsoft.com/en-us/windows/win32/direct3ddds/dx-graphics-dds-pguide\n * @param arrayBuffer\n * @memberof PIXI\n */\nexport function parseDDS(arrayBuffer: ArrayBuffer): CompressedTextureResource[]\n{\n const data = new Uint32Array(arrayBuffer);\n const magicWord = data[0];\n\n if (magicWord !== DDS_MAGIC)\n {\n throw new Error('Invalid DDS file magic word');\n }\n\n const header = new Uint32Array(arrayBuffer, 0, DDS_HEADER_SIZE / Uint32Array.BYTES_PER_ELEMENT);\n\n // DDS header fields\n const height = header[DDS_FIELDS.HEIGHT];\n const width = header[DDS_FIELDS.WIDTH];\n const mipmapCount = header[DDS_FIELDS.MIPMAP_COUNT];\n\n // PIXEL_FORMAT fields\n const pixelFormat = new Uint32Array(\n arrayBuffer,\n DDS_FIELDS.PIXEL_FORMAT * Uint32Array.BYTES_PER_ELEMENT,\n DDS_HEADER_PF_SIZE / Uint32Array.BYTES_PER_ELEMENT);\n const formatFlags = pixelFormat[PF_FLAGS];\n\n // File contains compressed texture(s)\n if (formatFlags & DDPF_FOURCC)\n {\n const fourCC = pixelFormat[DDS_PF_FIELDS.FOURCC];\n\n // File contains one DXTn compressed texture\n if (fourCC !== FOURCC_DX10)\n {\n const internalFormat = FOURCC_TO_FORMAT[fourCC];\n\n const dataOffset = DDS_MAGIC_SIZE + DDS_HEADER_SIZE;\n const texData = new Uint8Array(arrayBuffer, dataOffset);\n\n const resource = new CompressedTextureResource(texData, {\n format: internalFormat,\n width,\n height,\n levels: mipmapCount // CompressedTextureResource will separate the levelBuffers for us!\n });\n\n return [resource];\n }\n\n // FOURCC_DX10 indicates there is a 20-byte DDS_HEADER_DX10 after DDS_HEADER\n const dx10Offset = DDS_MAGIC_SIZE + DDS_HEADER_SIZE;\n const dx10Header = new Uint32Array(\n data.buffer,\n dx10Offset,\n DDS_HEADER_DX10_SIZE / Uint32Array.BYTES_PER_ELEMENT);\n const dxgiFormat = dx10Header[DDS_DX10_FIELDS.DXGI_FORMAT];\n const resourceDimension = dx10Header[DDS_DX10_FIELDS.RESOURCE_DIMENSION];\n const miscFlag = dx10Header[DDS_DX10_FIELDS.MISC_FLAG];\n const arraySize = dx10Header[DDS_DX10_FIELDS.ARRAY_SIZE];\n\n // Map dxgiFormat to PIXI.INTERNAL_FORMATS\n const internalFormat = DXGI_TO_FORMAT[dxgiFormat];\n\n if (internalFormat === undefined)\n {\n throw new Error(`DDSParser cannot parse texture data with DXGI format ${dxgiFormat}`);\n }\n if (miscFlag === DDS_RESOURCE_MISC_TEXTURECUBE)\n {\n // FIXME: Anybody excited about cubemap compressed textures?\n throw new Error('DDSParser does not support cubemap textures');\n }\n if (resourceDimension === D3D10_RESOURCE_DIMENSION.DDS_DIMENSION_TEXTURE3D)\n {\n // FIXME: Anybody excited about 3D compressed textures?\n throw new Error('DDSParser does not supported 3D texture data');\n }\n\n // Uint8Array buffers of image data, including all mipmap levels in each image\n const imageBuffers = new Array<Uint8Array>();\n const dataOffset = DDS_MAGIC_SIZE\n + DDS_HEADER_SIZE\n + DDS_HEADER_DX10_SIZE;\n\n if (arraySize === 1)\n {\n // No need bothering with the imageSize calculation!\n imageBuffers.push(new Uint8Array(arrayBuffer, dataOffset));\n }\n else\n {\n // Calculate imageSize for each texture, and then locate each image's texture data\n\n const pixelSize = INTERNAL_FORMAT_TO_BYTES_PER_PIXEL[internalFormat];\n let imageSize = 0;\n let levelWidth = width;\n let levelHeight = height;\n\n for (let i = 0; i < mipmapCount; i++)\n {\n const alignedLevelWidth = Math.max(1, (levelWidth + 3) & ~3);\n const alignedLevelHeight = Math.max(1, (levelHeight + 3) & ~3);\n\n const levelSize = alignedLevelWidth * alignedLevelHeight * pixelSize;\n\n imageSize += levelSize;\n\n levelWidth = levelWidth >>> 1;\n levelHeight = levelHeight >>> 1;\n }\n\n let imageOffset = dataOffset;\n\n // NOTE: Cubemaps have 6-images per texture (but they aren't supported so ^_^)\n for (let i = 0; i < arraySize; i++)\n {\n imageBuffers.push(new Uint8Array(arrayBuffer, imageOffset, imageSize));\n imageOffset += imageSize;\n }\n }\n\n // Uint8Array -> CompressedTextureResource, and we're done!\n return imageBuffers.map((buffer) => new CompressedTextureResource(buffer, {\n format: internalFormat,\n width,\n height,\n levels: mipmapCount\n }));\n }\n if (formatFlags & DDPF_RGB)\n {\n // FIXME: We might want to allow uncompressed *.dds files?\n throw new Error('DDSParser does not support uncompressed texture data.');\n }\n if (formatFlags & DDPF_YUV)\n {\n // FIXME: Does anybody need this feature?\n throw new Error('DDSParser does not supported YUV uncompressed texture data.');\n }\n if (formatFlags & DDPF_LUMINANCE)\n {\n // FIXME: Microsoft says older DDS filers use this feature! Probably not worth the effort!\n throw new Error('DDSParser does not support single-channel (lumninance) texture data!');\n }\n if (formatFlags & DDPF_ALPHA)\n {\n // FIXME: I'm tired! See above =)\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\n"],"names":["internalFormat","dataOffset"],"mappings":"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"} |