o
    shI                     @  s<  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sJ e!edej  ej" qweD ]Z#e#j dusJ e!ede#j  e#j" qeD ]Z$e$j dusJ e!ede$j  e$j" qe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Zsd1d(d)Ztd2d-d.Zueveqjweqeu exd/es eyeqjwet ezeqjwd0 dS )3a  
A Pillow loader 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                   @  ,   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   f/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/PIL/DdsImagePlugin.pyr          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                   @  r   )
DDSCAPS2i      i   r   i    i @  i   i    N)r   r   r   CUBEMAPCUBEMAP_POSITIVEXCUBEMAP_NEGATIVEXCUBEMAP_POSITIVEYCUBEMAP_NEGATIVEYCUBEMAP_POSITIVEZCUBEMAP_NEGATIVEZVOLUMEr   r   r   r    r&   1   r!   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    r0   =   s    r0   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   	   
                                                                  r1   !   "   #   $   %   &   '   (   )   *   +   ,   -   .   /   0   1   2   3   4   5   6   7   8   9   :   ;   <   =   >   ?   r2   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   UNKNOWNR32G32B32A32_TYPELESSR32G32B32A32_FLOATR32G32B32A32_UINTR32G32B32A32_SINTR32G32B32_TYPELESSR32G32B32_FLOATR32G32B32_UINTR32G32B32_SINTR16G16B16A16_TYPELESSR16G16B16A16_FLOATR16G16B16A16_UNORMR16G16B16A16_UINTR16G16B16A16_SNORMR16G16B16A16_SINTR32G32_TYPELESSR32G32_FLOATR32G32_UINTR32G32_SINTR32G8X24_TYPELESSD32_FLOAT_S8X24_UINTR32_FLOAT_X8X24_TYPELESSX32_TYPELESS_G8X24_UINTR10G10B10A2_TYPELESSR10G10B10A2_UNORMR10G10B10A2_UINTR11G11B10_FLOATR8G8B8A8_TYPELESSR8G8B8A8_UNORMR8G8B8A8_UNORM_SRGBR8G8B8A8_UINTR8G8B8A8_SNORMR8G8B8A8_SINTR16G16_TYPELESSR16G16_FLOATR16G16_UNORMR16G16_UINTR16G16_SNORMR16G16_SINTR32_TYPELESS	D32_FLOAT	R32_FLOATR32_UINTR32_SINTR24G8_TYPELESSD24_UNORM_S8_UINTR24_UNORM_X8_TYPELESSX24_TYPELESS_G8_UINTR8G8_TYPELESS
R8G8_UNORM	R8G8_UINT
R8G8_SNORM	R8G8_SINTR16_TYPELESS	R16_FLOAT	D16_UNORM	R16_UNORMR16_UINT	R16_SNORMR16_SINTR8_TYPELESSR8_UNORMR8_UINTR8_SNORMR8_SINTA8_UNORMR1_UNORMR9G9B9E5_SHAREDEXPR8G8_B8G8_UNORMG8R8_G8B8_UNORMBC1_TYPELESS	BC1_UNORMBC1_UNORM_SRGBBC2_TYPELESS	BC2_UNORMBC2_UNORM_SRGBBC3_TYPELESS	BC3_UNORMBC3_UNORM_SRGBBC4_TYPELESS	BC4_UNORM	BC4_SNORMBC5_TYPELESS	BC5_UNORM	BC5_SNORMB5G6R5_UNORMB5G5R5A1_UNORMB8G8R8A8_UNORMB8G8R8X8_UNORMR10G10B10_XR_BIAS_A2_UNORMB8G8R8A8_TYPELESSB8G8R8A8_UNORM_SRGBB8G8R8X8_TYPELESSB8G8R8X8_UNORM_SRGBBC6H_TYPELESS	BC6H_UF16	BC6H_SF16BC7_TYPELESS	BC7_UNORMBC7_UNORM_SRGBAYUVY410Y416NV12P010P016
OPAQUE_420YUY2Y210Y216NV11AI44IA44P8A8P8B4G4R4A4_UNORMP208V208V408SAMPLER_FEEDBACK_MIN_MIP_OPAQUE'SAMPLER_FEEDBACK_MIP_REGION_USED_OPAQUEr   r   r   r    r9   G   s    r9   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   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   r1   rU   rV   rW   rX   r\   r]   rf   rg   rh   rp   rq   rr   rs   r2   rv   ry   rz   r|   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   R8G8B8A8R8G8B8X8R8G8B8R5G6B5X1R5G5B5A1R5G5B5A4R4G4B4R3G3B2A8A8R3G3B2X4R4G4B4A2B10G10R10A8B8G8R8X8B8G8R8G16R16A2R10G10B10A16B16G16R16r  r  L8A8L8A4L4V8U8L6V5U5X8L8V8U8Q8W8V8U8V16U16A2W10V10U10D16_LOCKABLED32D15S1D24S8D24X8D24X4S4D16D32F_LOCKABLED24FS8D32_LOCKABLES8_LOCKABLEL16
VERTEXDATAINDEX16INDEX32Q16W16V16U16R16FG16R16FA16B16G16R16FR32FG32R32FA32B32G32R32FCxV8U8A1A2B10G10R10_XR_BIASBINARYBUFFERi32UYVY	R8G8_B8G8r  	G8R8_G8B8DXT1DXT2DXT3DXT4DXT5DX10BC4SBC4UBC5SBC5UATI1ATI2MULTI2_ARGB8r   r   r   r    r%     s    r%  DDSD_DDSCAPS_	DDSCAPS2_DDPF_c                   @  s(   e Zd ZdZdZdddZdd	d
ZdS )DdsImageFileDDSzDirectDraw SurfacereturnNonec                 C  s  t | jdsd}t|td| jd\}|dkr(dt| }t|| j|d }t|dkrBdt| d}t|t	
|}td	|d
\}}}||f| _d| j }td	|d
\}	}
}td|d td|d\}}}}d}d }|tj@ r|tj@ rd| _d}nd| _d}td| d||d }td|d||fg| _d S |tj@ r|dkrd| _n|dkr|tj@ rd| _nd| d| }t||tj@ rd| _td| jd| _d| j_ng|tj@ rT|d }|tjkrd| _d| _d}nM|tjkr d| _d | _d!}n=|tjkr0d| _d"| _d}n-|tj tj!fv rCd| _d#| _d}n|tj"krSd| _d$| _d%}n
|tj#tj$fv red| _d&| _d%}n|tj%krI|d'7 }td| jd\}| jd |t&j't&j(fv rd| _d(| _d}n|t&j)t&j*fv rd| _d)| _d!}n|t&j+t&j,fv rd| _d*| _d}n|t&j-t&j.fv rd| _d#| _d}n|t&j/t&j0fv rd| _d&| _d%}n|t&j1krd| _d$| _d%}nt|t&j2krd| _d+| _d,}ne|t&j3krd| _d-| _d,}nV|t&j4t&j5t&j6fv r&d| _d.| _d/}|t&j6kr%d0| j7d1< n7|t&j8t&j9t&j:fv r@d| _|t&j:kr?d0| j7d1< nd2| }t;|d3t| }t;|d4| }t;||rotd5|||| jfg| _d S td6|d|py| jg| _d S )7Nr   znot a DDS filez<I|   zUnsupported header size x   zIncomplete header: z bytesz<3IrA   r   r   z<11Ir`   <4IrE   r   RGBAr7   r:   <Idds_rgbr   LLAzUnsupported bitcount z for Pr'   rc  r   re  r   rg  BC4rk  r;   BC5rI   BC1BC2BC3BC6Hr<   BC6HS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sizer0   r7   r3   _moder   _Tiletiler8   r6   r	   r  palettemoder5   r%  rc  pixel_formatre  rg  rj  rm  rk  rl  rn  rh  r9   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widthextentspitchdepthmipmapspfsizepfflagsfourccbitcountnrawmode
mask_countmasksoffsetdxgi_formatr   r   r    _openO  s  













 zDdsImageFile._openposintc                 C  s   d S )Nr   )r  r  r   r   r    	load_seek  s   zDdsImageFile.load_seekN)rv  rw  )r  r  rv  rw  )r   r   r   formatformat_descriptionr  r  r   r   r   r    rt  K  s    
 rt  c                   @  s   e Zd ZdZd	ddZdS )
DdsRgbDecoderTbuffer$bytes | Image.SupportsArrayInterfacerv  tuple[int, int]c                 C  s$  | j d usJ | j\}}g }g }|D ]0}d}|dkr6||d ? |d > |kr6|d7 }||d ? |d > |ks&|| |||?  qt }|d }	| jj| jj t| }
t||
k rt	| j 
|	d}t|D ]\}}||@ }|tt||| ? ||  d 7 }qjt||
k s\| | dS )Nr   r   r   little   )r   )fdargsappend	bytearraystatexsizeysizer  r  
from_bytesr  	enumerater   
set_as_raw)r  r  r  r  mask_offsetsmask_totalsmaskr  data	bytecountdest_lengthvalueimasked_valuer   r   r    decode  s2   


zDdsRgbDecoder.decodeN)r  r  rv  r  )r   r   r   	_pulls_fdr  r   r   r   r    r    s    r  imImage.Imager  	IO[bytes]filenamestr | bytesrv  rw  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}|rd}|tjO }| jd d }g d	}	tj}
|d
krKtj}d}n|dkrUtj}d}n|dkr_tj}d}ntj}|dkrld}tj}n|dkrvd}tj}n|dkrd}tj}| j dkrd}t|nod| }t|d}|tjO }| j| d d }| j d dk}| j d dkrtj}
| j }|rg d}	n(g d}	n#t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rH|!t$%d(|dddd) t)*| |t)+|d*| j, d|g d S )+N)r7   r|  r  r  zcannot write mode z as DDSr   r  r  r:   r   )r   r   r   r   rc  )r   re  )r   rg  )r:   r  r  r  )r;   r7   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<7Irx  11I)r   r   r   r   r   r   r   r   r   r   r   r{  r1   z<5Ir   rz  )-r  r  r   r   r   r   r   r  getbandsencoderinfogetr   r  r0   r5   r%  rc  re  rg  rh  r9   r   r   r   r   r8   r7   splitr   merger3   r  r   writeo32	DDS_MAGICr  packr  r"   r$   r   _saver  r  )r  r  r  r  r  r  r  
codec_namer  	rgba_maskpixel_flagsr  r  r  alphargbar   r   r    r    s   







&r  prefixbytesboolc                 C  s
   |  dS )Ns   DDS )
startswith)r  r   r   r    r  i  s   
r  r  z.dds)r  r  r  r  r  r  rv  rw  )r  r  rv  r  ){__doc__
__future__r   r  r  sysenumr   r   typingr    r   r   r	   _binaryr
   r_  r   r   r  r  r   r"   r&   r0   r9   r%  modulesr   moduleitemnamesetattrr  item1item2item3r5   
DDS_FOURCCr7   DDS_RGBr3   DDS_RGBAr8   DDS_LUMINANCEDDS_LUMINANCEAr4   	DDS_ALPHAr6   DDS_PAL8r   r   r   r   DDS_HEADER_FLAGS_TEXTUREr   DDS_HEADER_FLAGS_MIPMAPr   DDS_HEADER_FLAGS_VOLUMEr   DDS_HEADER_FLAGS_PITCHr   DDS_HEADER_FLAGS_LINEARSIZE
DDS_HEIGHT	DDS_WIDTHr$   DDS_SURFACE_FLAGS_TEXTUREr#   r%   DDS_SURFACE_FLAGS_MIPMAPDDS_SURFACE_FLAGS_CUBEMAPr(   r)   DDS_CUBEMAP_POSITIVEXr*   DDS_CUBEMAP_NEGATIVEXr+   DDS_CUBEMAP_POSITIVEYr,   DDS_CUBEMAP_NEGATIVEYr-   DDS_CUBEMAP_POSITIVEZr.   DDS_CUBEMAP_NEGATIVEZrc  DXT1_FOURCCre  DXT3_FOURCCrg  DXT5_FOURCCr   DXGI_FORMAT_R8G8B8A8_TYPELESSr   DXGI_FORMAT_R8G8B8A8_UNORMr   DXGI_FORMAT_R8G8B8A8_UNORM_SRGBr   DXGI_FORMAT_BC5_TYPELESSr   DXGI_FORMAT_BC5_UNORMr   DXGI_FORMAT_BC5_SNORMr  DXGI_FORMAT_BC6H_UF16r  DXGI_FORMAT_BC6H_SF16r  DXGI_FORMAT_BC7_TYPELESSr  DXGI_FORMAT_BC7_UNORMr  DXGI_FORMAT_BC7_UNORM_SRGBrt  	PyDecoderr  r  r  register_openr  register_decoderregister_saveregister_extensionr   r   r   r    <module>   s    
|
M 
#
]