a :jg@B@sZdZddlmZddlZddlZddlZddlmZmZddl m Z ddl m Z m Z mZddlmZdd lmZdd lmZd ZGd d d eZGdddeZGdddeZGdddeZGdddeZGdddeZejeZeD]*Zej dusJe!edej ej"qeD],Z#e#j dus2Je!ede#j e#j"qeD],Z$e$j dusdJe!ede$j e$j"qPeD],Z%e%j dusJe!ede%j e%j"qej&Z'ej(Z)ej(ej*BZ+ej,Z-ej,ej*BZ.ej/Z0ej1Z2ej3ej4Bej5Bej6BZ7ej8Z9ej:Z;ejZ?ej4Z@ej5ZAejBZCejDejEBZFejDZGejHejIBZJejHejKBZLejHejMBZNejHejOBZPejHejQBZRejHejSBZTejUZVejWZXejYZZej[Z\ej]Z^ej_Z`ejaZbejcZdejeZfejgZhejiZjejkZlejmZnejoZpGddde j ZqGddde jrZsd d!d"d#d$d%d&Ztd'd(d)d*d+Zue veqjweqeue xd,ese yeqjwete zeqjwd-dS).a A Pillow loader for .dds files (S3TC-compressed aka DXTC) Jerome Leclanche Documentation: https://web.archive.org/web/20170802060935/http://oss.sgi.com/projects/ogl-sample/registry/EXT/texture_compression_s3tc.txt The contents of this file are hereby released in the public domain (CC0) Full text of the CC0 license: https://creativecommons.org/publicdomain/zero/1.0/ ) annotationsN)IntEnumIntFlag)IO)Image ImageFile ImagePalette)i32le)o8)o32leiDDS c@s,eZdZdZdZdZdZdZdZdZ dZ d S) DDSDriiN) __name__ __module__ __qualname__CAPSHEIGHTWIDTHPITCH PIXELFORMAT MIPMAPCOUNT LINEARSIZEDEPTHrrd=Z?d>Z@d?ZAd@ZBdAZCdBZDdCZEdDZFdEZGdFZHdGZIdHZJdIZKdJZLdKZMdLZNdMZOdNZPdOZQdPZRdQZSdRZTdSZUdTZVdUZWdVZXdWZYdXZZdYZ[dZZ\d[Z]d\Z^d]Z_d^Z`d_Zad`ZbdaZcdbZddcZeddZfdeZgdfZhdgZidhZjdiZkdjZldkZmdlZndmZodnZpdoZqdpZrdqZsdrZtdsZudtZvduZwdvZxdwZydxZzdyZ{dzS){ DXGI_FORMATrrrrr r.!"#$%&'()*+,-./0123456789:;<=>?r/ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrsN)|rrrUNKNOWNZR32G32B32A32_TYPELESSZR32G32B32A32_FLOATZR32G32B32A32_UINTZR32G32B32A32_SINTZR32G32B32_TYPELESSZR32G32B32_FLOATZR32G32B32_UINTZR32G32B32_SINTZR16G16B16A16_TYPELESSZR16G16B16A16_FLOATZR16G16B16A16_UNORMZR16G16B16A16_UINTZR16G16B16A16_SNORMZR16G16B16A16_SINTZR32G32_TYPELESSZ R32G32_FLOATZ R32G32_UINTZ R32G32_SINTZR32G8X24_TYPELESSZD32_FLOAT_S8X24_UINTZR32_FLOAT_X8X24_TYPELESSZX32_TYPELESS_G8X24_UINTZR10G10B10A2_TYPELESSZR10G10B10A2_UNORMZR10G10B10A2_UINTZR11G11B10_FLOATR8G8B8A8_TYPELESSR8G8B8A8_UNORMR8G8B8A8_UNORM_SRGBZ R8G8B8A8_UINTZR8G8B8A8_SNORMZ R8G8B8A8_SINTZR16G16_TYPELESSZ R16G16_FLOATZ R16G16_UNORMZ R16G16_UINTZ R16G16_SNORMZ R16G16_SINTZ R32_TYPELESSZ D32_FLOATZ R32_FLOATZR32_UINTZR32_SINTZR24G8_TYPELESSZD24_UNORM_S8_UINTZR24_UNORM_X8_TYPELESSZX24_TYPELESS_G8_UINTZ R8G8_TYPELESSZ R8G8_UNORMZ R8G8_UINTZ R8G8_SNORMZ R8G8_SINTZ R16_TYPELESSZ R16_FLOATZ D16_UNORMZ R16_UNORMZR16_UINTZ R16_SNORMZR16_SINTZ R8_TYPELESSZR8_UNORMZR8_UINTZR8_SNORMZR8_SINTZA8_UNORMZR1_UNORMZR9G9B9E5_SHAREDEXPZR8G8_B8G8_UNORMZG8R8_G8B8_UNORM BC1_TYPELESS BC1_UNORMZBC1_UNORM_SRGBZ BC2_TYPELESSZ BC2_UNORMZBC2_UNORM_SRGBZ BC3_TYPELESSZ BC3_UNORMZBC3_UNORM_SRGB BC4_TYPELESS BC4_UNORMZ BC4_SNORM BC5_TYPELESS BC5_UNORM BC5_SNORMZ B5G6R5_UNORMZB5G5R5A1_UNORMZB8G8R8A8_UNORMZB8G8R8X8_UNORMZR10G10B10_XR_BIAS_A2_UNORMZB8G8R8A8_TYPELESSZB8G8R8A8_UNORM_SRGBZB8G8R8X8_TYPELESSZB8G8R8X8_UNORM_SRGBZ BC6H_TYPELESS BC6H_UF16 BC6H_SF16 BC7_TYPELESS BC7_UNORMBC7_UNORM_SRGBZAYUVZY410ZY416ZNV12ZP010ZP016Z OPAQUE_420YUY2ZY210ZY216ZNV11ZAI44ZIA44P8A8P8ZB4G4R4A4_UNORMZP208ZV208ZV408ZSAMPLER_FEEDBACK_MIN_MIP_OPAQUEZ'SAMPLER_FEEDBACK_MIP_REGION_USED_OPAQUErrrrr6Gsr6c@speZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!Z#d"Z$d#Z%d$Z&d%Z'd&Z(d'Z)d(Z*d)Z+d*Z,d+Z-d,Z.d-Z/d.Z0d/Z1d0Z2d1Z3d2Z4d3Z5d4Z6d5Z7d6Z8d7Z9e:d8Z;e:d9Ze:d<Z?e:d=Z@e:d>ZAe:d?ZBe:d@ZCe:dAZDe:dBZEe:dCZFe:dDZGe:dEZHe:dFZIe:dGZJe:dHZKdIS)JD3DFMTrrFrGrHrIrJrKrLrMrNrOrPrQr.rRrSrTrUrYrZrcrdrermrnrorpr/rsrvrwryr{r}rrrrrrrrrrrrrrrrtuvwsUYVYsRGBGsYUY2sGRGBsDXT1sDXT2sDXT3sDXT4sDXT5sDX10sBC4SsBC4UsBC5SsBC5UsATI1sATI2sMET1N)LrrrrZR8G8B8ZA8R8G8B8ZX8R8G8B8ZR5G6B5ZX1R5G5B5ZA1R5G5B5ZA4R4G4B4ZR3G3B2ZA8ZA8R3G3B2ZX4R4G4B4Z A2B10G10R10ZA8B8G8R8ZX8B8G8R8ZG16R16Z A2R10G10B10Z A16B16G16R16rrZL8ZA8L8ZA4L4ZV8U8ZL6V5U5ZX8L8V8U8ZQ8W8V8U8ZV16U16Z A2W10V10U10Z D16_LOCKABLEZD32ZD15S1ZD24S8ZD24X8ZD24X4S4ZD16Z D32F_LOCKABLEZD24FS8Z D32_LOCKABLEZ S8_LOCKABLEZL16Z VERTEXDATAZINDEX16ZINDEX32Z Q16W16V16U16ZR16FZG16R16FZ A16B16G16R16FZR32FZG32R32FZ A32B32G32R32FZCxV8U8A1ZA2B10G10R10_XR_BIASZ BINARYBUFFERi32ZUYVYZ R8G8_B8G8rZ G8R8_G8B8DXT1ZDXT2DXT3ZDXT4DXT5DX10ZBC4SBC4UBC5SBC5UATI1ATI2Z MULTI2_ARGB8rrrrrsrZDDSD_ZDDSCAPS_Z DDSCAPS2_ZDDPF_c@s2eZdZdZdZddddZdddd d Zd S) DdsImageFileZDDSzDirectDraw SurfaceNone)returncCst|jdsd}t|td|jd\}|dkrPdt|}t||j|d}t|dkrdt|d}t|t |}td |d \}}}||f|_ d |j }td |d \} } } td |d td|d\} } }}d}d}| t j@rn| t j@r*d|_d}n d|_d}td|d||d}td|d||fg|_dS| t j@r|dkrd|_n6|dkr| t j@rd|_nd|d| }t|n| t j@rd|_td|jd|_d|j_n| t j@rx|d}|tjkr.d|_d|_d}q|tjkrNd|_d |_d!}q|tjkrnd|_d"|_d}q|tj tj!fvrd|_d#|_d}q|tj"krd|_d$|_d%}q|tj#tj$fvrd|_d&|_d%}q|tj%kr`|d'7}td|jd\}|jd|t&j't&j(fvr6d|_d(|_d}qv|t&j)t&j*fvr\d|_d#|_d}qv|t&j+t&j,fvrd|_d&|_d%}n|t&j-krd|_d$|_d%}n|t&j.krd|_d)|_d*}n|t&j/krd|_d+|_d*}n|t&j0t&j1t&j2fvrd|_d,|_d-}|t&j2kr^d.|j3d/<nF|t&j4t&j5t&j6fvrLd|_|t&j6kr^d.|j3d/<nd0|}t7|nd1t|}t7|nd2| }t7||rtd3||||jfg|_ntd4|d|p|jg|_dS)5Nrznot a DDS filezrrz<11Ir]<4IrBrRGBAr4r7<Idds_rgbrLLAzUnsupported bitcount z for Pr%rrrrrZBC4rr8ZBC5rFZBC1ZBC6Hr9ZBC6HSZBC7r:g]tE?gammazUnimplemented DXGI format zUnimplemented pixel format zUnknown pixel format flags Zbcnraw)8_acceptfpread SyntaxErrorstructunpackreprOSErrorlenioBytesIO_sizesizer-r4r0_moder_TileZtiler5r3r rpalettemoder2rrZ pixel_formatrrrrrrrrr6rrrrrrrrrrrrinforrrNotImplementedError)selfmsg header_size header_bytesheaderflagsheightwidthZextentspitchdepthZmipmapsZpfsizeZpfflagsZfourccbitcountnrawmodeZ mask_countmasksoffsetZ dxgi_formatrrr_openOs                             zDdsImageFile._openint)posrcCsdS)Nr)rrrrr load_seekszDdsImageFile.load_seekN)rrrformatformat_descriptionrrrrrrrKs rc@s eZdZdZdddddZdS) DdsRgbDecoderTz$bytes | Image.SupportsArrayInterfaceztuple[int, int])bufferrcCs|jdusJ|j\}}g}g}|D]J}d}|dkrV||d?|d>|krV|d7}q4|||||?q$t}|d} |jj|jjt|} t|| krt |j | d} t |D]4\} }| |@} |t t| || ?|| d7}qq| |dS)Nrrrlittle)r)fdargsappend bytearraystateZxsizeZysizerr from_bytesr enumerater Z set_as_raw)rrrrZ mask_offsetsZ mask_totalsmaskrdataZ bytecountZ dest_lengthvalueiZ masked_valuerrrdecodes.      zDdsRgbDecoder.decodeN)rrrZ _pulls_fdrrrrrrsrz Image.Imagez IO[bytes]z str | bytesr)imrfilenamerc Cs|jdvr d|jd}t||jddk}|jddkr`tj}|j}|rVgd}qgd }nFtj}|jddd}gd }|r|\}} } } td | || | f}|r|tjO}| |rd ndt j t j Bt j Bt jBt jB} t|d } |j| dd }|tttdd| |j|j|ddtjdgdRtdd|d| tjdg|Rtdtjddddt||tdd|jd|ddfgdS)N)r4rrrzcannot write mode z as DDSr Arr)rrr)~rr)iirrrrr:z<7IrZ11I) rrrrrrrrrrrrr.z<5Irrr)rrr-r5r4splitrmerger0r r rrrrrrZgetbandsrwriteo32 DDS_MAGICrpackrr r"r_saverr)rrrralphaZ pixel_flagsrZ rgba_maskrgbarrrrrrr s^       r bytesbool)prefixrcCs|dddkS)NrsDDS r)r(rrrr8srrz.dds){__doc__ __future__rrrsysenumrrtypingrrrr _binaryr rr r rrr r r$r-r6rmodulesrmoduleitemnamesetattrrZitem1Zitem2Zitem3r2Z DDS_FOURCCr4ZDDS_RGBr0ZDDS_RGBAr5Z DDS_LUMINANCEZDDS_LUMINANCEAr1Z DDS_ALPHAr3ZDDS_PAL8rrrrZDDS_HEADER_FLAGS_TEXTURErZDDS_HEADER_FLAGS_MIPMAPrZDDS_HEADER_FLAGS_VOLUMErZDDS_HEADER_FLAGS_PITCHrZDDS_HEADER_FLAGS_LINEARSIZEZ DDS_HEIGHTZ DDS_WIDTHr"ZDDS_SURFACE_FLAGS_TEXTUREr!r#ZDDS_SURFACE_FLAGS_MIPMAPZDDS_SURFACE_FLAGS_CUBEMAPr&r'ZDDS_CUBEMAP_POSITIVEXr(ZDDS_CUBEMAP_NEGATIVEXr)ZDDS_CUBEMAP_POSITIVEYr*ZDDS_CUBEMAP_NEGATIVEYr+ZDDS_CUBEMAP_POSITIVEZr,ZDDS_CUBEMAP_NEGATIVEZrZ DXT1_FOURCCrZ DXT3_FOURCCrZ DXT5_FOURCCrZDXGI_FORMAT_R8G8B8A8_TYPELESSrZDXGI_FORMAT_R8G8B8A8_UNORMrZDXGI_FORMAT_R8G8B8A8_UNORM_SRGBrZDXGI_FORMAT_BC5_TYPELESSrZDXGI_FORMAT_BC5_UNORMrZDXGI_FORMAT_BC5_SNORMrZDXGI_FORMAT_BC6H_UF16rZDXGI_FORMAT_BC6H_SF16rZDXGI_FORMAT_BC7_TYPELESSrZDXGI_FORMAT_BC7_UNORMrZDXGI_FORMAT_BC7_UNORM_SRGBrZ PyDecoderrr rZ register_openrZregister_decoderZ register_saveZregister_extensionrrrrs        |M          #4