a
    hI                     @  sZ  d Z ddlmZ ddlZddlZddlZddlmZmZ ddl	m
Z
 ddlmZmZmZ ddlmZ dd	lmZ dd
lmZ dZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZeje ZeD ]*Zej dusJ e!edej  ej" qeD ],Z#e#j dus2J e!ede#j  e#j" qeD ],Z$e$j dusdJ e!ede$j  e$j" qPeD ],Z%e%j dusJ e!ede%j  e%j" qej&Z'ej(Z)ej(ej*B Z+ej,Z-ej,ej*B Z.ej/Z0ej1Z2ej3ej4B ej5B ej6B Z7ej8Z9ej:Z;ej<Z=ej>Z?ej4Z@ej5ZAejBZCejDejEB ZFejDZGejHejIB ZJejHejKB ZLejHejMB ZNejHejOB ZPejHejQB ZRejHejSB ZTejUZVejWZXejYZZej[Z\ej]Z^ej_Z`ejaZbejcZdejeZfejgZhejiZjejkZlejmZnejoZpG dd dejZqG dd dejrZsd d!d"d#d$d%d&Ztd'd(d)d*d+Zueveqjweqeu exd,es eyeqjwet ezeqjwd- dS ).a  
A Pillow plugin for .dds files (S3TC-compressed aka DXTC)
Jerome Leclanche <jerome@leclan.ch>

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)IntEnumIntFlag)IO   )Image	ImageFileImagePalette)i32le)o8)o32leiDDS c                   @  s,   e Zd ZdZdZdZdZdZdZdZ	dZ
d	S )
DDSDr                  i   i   N)__name__
__module____qualname__CAPSHEIGHTWIDTHPITCHPIXELFORMATMIPMAPCOUNT
LINEARSIZEDEPTH r   r   @/var/www/auris/lib/python3.9/site-packages/PIL/DdsImagePlugin.pyr      s   r   c                   @  s   e Zd ZdZdZdZdS )DDSCAPSr   r   i  @ N)r   r   r   COMPLEXTEXTUREMIPMAPr   r   r   r   r    +   s   r    c                   @  s,   e Zd ZdZdZdZdZdZdZdZ	dZ
d	S )
DDSCAPS2i      i   r   i    i @  i   i    N)r   r   r   CUBEMAPCUBEMAP_POSITIVEXCUBEMAP_NEGATIVEXCUBEMAP_POSITIVEYCUBEMAP_NEGATIVEYCUBEMAP_POSITIVEZCUBEMAP_NEGATIVEZZVOLUMEr   r   r   r   r$   1   s   r$   c                   @  s$   e Zd ZdZdZdZdZdZdZdS )DDPFr   r   r       @   r   N)	r   r   r   ALPHAPIXELSALPHAFOURCCPALETTEINDEXED8RGB	LUMINANCEr   r   r   r   r-   =   s   r-   c                   @  s  e 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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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)Z+d*Z,d+Z-d,Z.d-Z/d.Z0d/Z1d0Z2d1Z3d2Z4d3Z5d4Z6d5Z7d6Z8d7Z9d8Z:d9Z;d:Z<d;Z=d<Z>d=Z?d>Z@d?ZAd@ZBdAZCdBZDdCZEdDZFdEZGdFZHdGZIdHZJdIZKdJZLdKZMdLZNdMZOdNZPdOZQdPZRdQZSdRZTdSZUdTZVdUZWdVZXdWZYdXZZdYZ[dZZ\d[Z]d\Z^d]Z_d^Z`d_Zad`ZbdaZcdbZddcZeddZfdeZgdfZhdgZidhZjdiZkdjZldkZmdlZndmZodnZpdoZqdpZrdqZsdrZtdsZudtZvduZwdvZxdwZydxZzdyZ{dzS ){DXGI_FORMATr   r   r      r            r   	   
                                                                  r.   !   "   #   $   %   &   '   (   )   *   +   ,   -   .   /   0   1   2   3   4   5   6   7   8   9   :   ;   <   =   >   ?   r/   A   B   C   D   E   F   G   H   I   J   K   L   M   N   O   P   Q   R   S   T   U   V   W   X   Y   Z   [   \   ]   ^   _   `   a   b   c   d   e   f   g   h   i   j   k   l   m   n   o   p   q   r   s                  N)|r   r   r   UNKNOWNZR32G32B32A32_TYPELESSZR32G32B32A32_FLOATZR32G32B32A32_UINTZR32G32B32A32_SINTZR32G32B32_TYPELESSZR32G32B32_FLOATZR32G32B32_UINTZR32G32B32_SINTZR16G16B16A16_TYPELESSZR16G16B16A16_FLOATZR16G16B16A16_UNORMZR16G16B16A16_UINTZR16G16B16A16_SNORMZR16G16B16A16_SINTZR32G32_TYPELESSZR32G32_FLOATZR32G32_UINTZR32G32_SINTZR32G8X24_TYPELESSZD32_FLOAT_S8X24_UINTZR32_FLOAT_X8X24_TYPELESSZX32_TYPELESS_G8X24_UINTZR10G10B10A2_TYPELESSZR10G10B10A2_UNORMZR10G10B10A2_UINTZR11G11B10_FLOATR8G8B8A8_TYPELESSR8G8B8A8_UNORMR8G8B8A8_UNORM_SRGBZR8G8B8A8_UINTZR8G8B8A8_SNORMZR8G8B8A8_SINTZR16G16_TYPELESSZR16G16_FLOATZR16G16_UNORMZR16G16_UINTZR16G16_SNORMZR16G16_SINTZR32_TYPELESSZ	D32_FLOATZ	R32_FLOATZR32_UINTZR32_SINTZR24G8_TYPELESSZD24_UNORM_S8_UINTZR24_UNORM_X8_TYPELESSZX24_TYPELESS_G8_UINTZR8G8_TYPELESSZ
R8G8_UNORMZ	R8G8_UINTZ
R8G8_SNORMZ	R8G8_SINTZR16_TYPELESSZ	R16_FLOATZ	D16_UNORMZ	R16_UNORMZR16_UINTZ	R16_SNORMZR16_SINTZR8_TYPELESSZR8_UNORMZR8_UINTZR8_SNORMZR8_SINTZA8_UNORMZR1_UNORMZR9G9B9E5_SHAREDEXPZR8G8_B8G8_UNORMZG8R8_G8B8_UNORMBC1_TYPELESS	BC1_UNORMZBC1_UNORM_SRGBBC2_TYPELESS	BC2_UNORMZBC2_UNORM_SRGBBC3_TYPELESS	BC3_UNORMZBC3_UNORM_SRGBBC4_TYPELESS	BC4_UNORMZ	BC4_SNORMBC5_TYPELESS	BC5_UNORM	BC5_SNORMZB5G6R5_UNORMZB5G5R5A1_UNORMZB8G8R8A8_UNORMZB8G8R8X8_UNORMZR10G10B10_XR_BIAS_A2_UNORMZB8G8R8A8_TYPELESSZB8G8R8A8_UNORM_SRGBZB8G8R8X8_TYPELESSZB8G8R8X8_UNORM_SRGBZBC6H_TYPELESS	BC6H_UF16	BC6H_SF16BC7_TYPELESS	BC7_UNORMBC7_UNORM_SRGBZAYUVZY410ZY416ZNV12ZP010ZP016Z
OPAQUE_420YUY2ZY210ZY216ZNV11ZAI44ZIA44P8A8P8ZB4G4R4A4_UNORMZP208ZV208ZV408ZSAMPLER_FEEDBACK_MIN_MIP_OPAQUEZ'SAMPLER_FEEDBACK_MIP_REGION_USED_OPAQUEr   r   r   r   r6   G   s   r6   c                   @  sp  e 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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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)Z+d*Z,d+Z-d,Z.d-Z/d.Z0d/Z1d0Z2d1Z3d2Z4d3Z5d4Z6d5Z7d6Z8d7Z9e:d8Z;e:d9Z<e:d:Z=e:d;Z>e:d<Z?e:d=Z@e:d>ZAe:d?ZBe:d@ZCe:dAZDe:dBZEe:dCZFe:dDZGe:dEZHe:dFZIe:dGZJe:dHZKdIS )JD3DFMTr   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   r.   rR   rS   rT   rU   rY   rZ   rc   rd   re   rm   rn   ro   rp   r/   rs   rv   rw   ry   r{   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   t   u   v   w      s   UYVYs   RGBGs   YUY2s   GRGBs   DXT1s   DXT2s   DXT3s   DXT4s   DXT5s   DX10s   BC4Ss   BC4Us   BC5Ss   BC5Us   ATI1s   ATI2s   MET1N)Lr   r   r   r   ZR8G8B8ZA8R8G8B8ZX8R8G8B8ZR5G6B5ZX1R5G5B5ZA1R5G5B5ZA4R4G4B4ZR3G3B2ZA8ZA8R3G3B2ZX4R4G4B4ZA2B10G10R10ZA8B8G8R8ZX8B8G8R8ZG16R16ZA2R10G10B10ZA16B16G16R16r   r   ZL8ZA8L8ZA4L4ZV8U8ZL6V5U5ZX8L8V8U8ZQ8W8V8U8ZV16U16ZA2W10V10U10ZD16_LOCKABLEZD32ZD15S1ZD24S8ZD24X8ZD24X4S4ZD16ZD32F_LOCKABLEZD24FS8ZD32_LOCKABLEZS8_LOCKABLEZL16Z
VERTEXDATAZINDEX16ZINDEX32ZQ16W16V16U16ZR16FZG16R16FZA16B16G16R16FZR32FZG32R32FZA32B32G32R32FZCxV8U8A1ZA2B10G10R10_XR_BIASZBINARYBUFFERi32ZUYVYZ	R8G8_B8G8r   Z	G8R8_G8B8DXT1ZDXT2DXT3ZDXT4DXT5DX10ZBC4SBC4UBC5SBC5UATI1ATI2ZMULTI2_ARGB8r   r   r   r   r      s   r   ZDDSD_ZDDSCAPS_Z	DDSCAPS2_ZDDPF_c                   @  s2   e Zd ZdZdZddddZdddd	d
ZdS )DdsImageFileZDDSzDirectDraw SurfaceNone)returnc                 C  s  t | jdsd}t|td| jd\}|dkrPdt| }t|| j|d }t|dkrdt| d}t|t	
|}td	|d
\}}}||f| _d| j }td	|d
\}	}
}td|d td|d\}}}}d}d }|tj@ rn|tj@ r*d| _d}n
d| _d}td| d||d }td|d||fg| _d S |tj@ r|dkrd| _n6|dkr|tj@ rd| _nd| d| }t|n|tj@ rd| _td| jd| _d| j_n|tj@ r|d }|tjkr.d| _d| _d}q|tjkrNd| _d | _d!}q|tjkrnd| _d"| _d}q|tj tj!fv rd| _d#| _d}q|tj"krd| _d$| _d%}q|tj#tj$fv rd| _d&| _d%}q|tj%kr|d'7 }td| jd\}| jd |t&j't&j(fv r6d| _d(| _d}q|t&j)t&j*fv r\d| _d)| _d!}q|t&j+t&j,fv rd| _d*| _d}q|t&j-t&j.fv rd| _d#| _d}q|t&j/t&j0fv rd| _d&| _d%}n|t&j1krd| _d$| _d%}n|t&j2krd| _d+| _d,}n|t&j3kr&d| _d-| _d,}n|t&j4t&j5t&j6fv rdd| _d.| _d/}|t&j6krd0| j7d1< nF|t&j8t&j9t&j:fv rd| _|t&j:krd0| j7d1< nd2| }t;|nd3t| }t;|nd4| }t;||rtd5|||| jfg| _ntd6|d|p| jg| _d S )7Nr   znot a DDS filez<I|   zUnsupported header size x   zIncomplete header: z bytesz<3Ir>   r   r   z<11Ir]   <4IrB   r   RGBAr4   r7   <Idds_rgbr   LLAzUnsupported bitcount z for Pr%   r   r   r   r   r   ZBC4r   r8   BC5rF   ZBC1BC2BC3ZBC6Hr9   ZBC6HSZBC7r:   g]tE?gammazUnimplemented DXGI format zUnimplemented pixel format zUnknown pixel format flags bcnraw)<_acceptfpreadSyntaxErrorstructunpackreprOSErrorlenioBytesIO_sizesizer-   r4   r0   _moder   _TileZtiler5   r3   r	   r   Zpalettemoder2   r   r   pixel_formatr   r   r   r   r   r   r   r   r6   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   infor   r   r   NotImplementedError)selfmsgheader_sizeheader_bytesheaderflagsheightwidthZextentspitchdepthZmipmapsZpfsizeZpfflagsfourccbitcountnrawmodeZ
mask_countmasksoffsetdxgi_formatr   r   r   _openO  s
   







zDdsImageFile._openint)posr   c                 C  s   d S )Nr   )r   r  r   r   r   	load_seek  s    zDdsImageFile.load_seekN)r   r   r   formatformat_descriptionr	  r  r   r   r   r   r   K  s
    r   c                   @  s    e Zd ZdZdddddZdS )DdsRgbDecoderTz$bytes | Image.SupportsArrayInterfaceztuple[int, int])bufferr   c                 C  s  | j d usJ | j\}}g }g }|D ]J}d}|dkrV||d ? |d > |krV|d7 }q4|| |||?  q$t }|d }	| jj| jj t| }
t||
k rt	| j 
|	d}t|D ]4\}}||@ }|tt||| ? ||  d 7 }qq| | dS )Nr   r   r   little   )r   )fdargsappend	bytearraystateZxsizeZysizer   r
  
from_bytesr   	enumerater   Z
set_as_raw)r   r  r  r  Zmask_offsetsZmask_totalsmaskr  dataZ	bytecountZdest_lengthvalueiZmasked_valuer   r   r   decode  s.    




zDdsRgbDecoder.decodeN)r   r   r   Z	_pulls_fdr  r   r   r   r   r    s   r  zImage.Imagez	IO[bytes]zstr | bytesr   )imr   filenamer   c                 C  s  | j dvr d| j  d}t|tjtjB tjB tjB }t|  d }| j	
d}|r0d}|tjO }| jd d }g d	}	tj}
|d
krtj}d}n|dkrtj}d}n|dkrtj}d}nntj}|dkrd}tj}nT|dkrd}tj}n@|dkrd}tj}| j dkr.d}t|nd| }t|nd}|tjO }| j| d d }| j d dk}| j d dkrtj}
| j }|rg d}	ng d}	nHtj}
| j d d d }g d}	|r|  \}}}}td ||||f} |r|
tjO }
|	|rd!nd tj }|!t"t#t$%d"d#|| j&| j|dd t$j%d$gd%R   t$%d&d'|
|| t$j%d&g|	R   t$%d(t'j(dddd  |tjkr|!t$%d(|dddd) t)*| |t)+|d*| j, d|g d S )+N)r4   r   r   r   zcannot write mode z as DDSr   r   r   r7   r   )r   r   r   r   r   )r   r   )r   r   )r7   r   r   r   )r8   r4   z#only RGB mode can be written as BC5zcannot write pixel format r   r:   r  Ar   r   )r  r  r  )      ~ r#  r#  )i   i   r  r   r#  z<7Ir   Z11I)r   r   r   r   r   r   r   r   r   r   r   r   r.   z<5Ir   r   )-r   r   r   r   r   r   r   r   ZgetbandsZencoderinfogetr   r   r-   r2   r   r   r   r   r   r6   r   r   r   r   r5   r4   splitr   merger0   r  r   writeo32	DDS_MAGICr   packr   r    r"   r   _saver   r   )r   r   r!  r   r   r  r   Z
codec_namer   Z	rgba_maskZpixel_flagsr  r  r  alphargbar   r   r   r+    s    









r+  bytesbool)prefixr   c                 C  s
   |  dS )Ns   DDS )
startswith)r3  r   r   r   r   i  s    r   r   z.dds){__doc__
__future__r   r   r   sysenumr   r   typingr    r   r   r	   _binaryr
   r   r   r   r(  r)  r   r    r$   r-   r6   r   modulesr   moduleitemnamesetattrr  Zitem1Zitem2Zitem3r2   Z
DDS_FOURCCr4   ZDDS_RGBr0   ZDDS_RGBAr5   ZDDS_LUMINANCEZDDS_LUMINANCEAr1   Z	DDS_ALPHAr3   ZDDS_PAL8r   r   r   r   ZDDS_HEADER_FLAGS_TEXTUREr   ZDDS_HEADER_FLAGS_MIPMAPr   ZDDS_HEADER_FLAGS_VOLUMEr   ZDDS_HEADER_FLAGS_PITCHr   ZDDS_HEADER_FLAGS_LINEARSIZEZ
DDS_HEIGHTZ	DDS_WIDTHr"   ZDDS_SURFACE_FLAGS_TEXTUREr!   r#   ZDDS_SURFACE_FLAGS_MIPMAPZDDS_SURFACE_FLAGS_CUBEMAPr&   r'   ZDDS_CUBEMAP_POSITIVEXr(   ZDDS_CUBEMAP_NEGATIVEXr)   ZDDS_CUBEMAP_POSITIVEYr*   ZDDS_CUBEMAP_NEGATIVEYr+   ZDDS_CUBEMAP_POSITIVEZr,   ZDDS_CUBEMAP_NEGATIVEZr   ZDXT1_FOURCCr   ZDXT3_FOURCCr   ZDXT5_FOURCCr   ZDXGI_FORMAT_R8G8B8A8_TYPELESSr   ZDXGI_FORMAT_R8G8B8A8_UNORMr   ZDXGI_FORMAT_R8G8B8A8_UNORM_SRGBr   ZDXGI_FORMAT_BC5_TYPELESSr   ZDXGI_FORMAT_BC5_UNORMr   ZDXGI_FORMAT_BC5_SNORMr   ZDXGI_FORMAT_BC6H_UF16r   ZDXGI_FORMAT_BC6H_SF16r   ZDXGI_FORMAT_BC7_TYPELESSr   ZDXGI_FORMAT_BC7_UNORMr   ZDXGI_FORMAT_BC7_UNORM_SRGBr   Z	PyDecoderr  r+  r   Zregister_openr  Zregister_decoderZregister_saveZregister_extensionr   r   r   r   <module>   s   
|M
 #]