U
    ^+d$                     @   s  d Z ddlZddlmZ ddlmZmZ ddlm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#e Z$e"Z%e"eB Z&e#Z'e#eB Z(eZ)e!Z*eeB eB eB Z+eZ,eZ-eZ.eZ/eZ0eZ1eZ2eeB Z3eZ4eeB Z5eeB Z6eeB Z7eeB Z8eeB Z9eeB Z:dZ;dZ<dZ=dZ>dZ?dZ@dZAd ZBd!ZCd"ZDd#ZEd$ZFd%ZGd&ZHG d'd( d(ejZId)d* ZJd+d, ZKeLeIjMeIeK eNeIjMeJ eOeIjMd- dS ).a  
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/
    N)BytesIO   )Image	ImageFile)o32leiDDS          i   i   i   i   i  @ i   i   i   i    i @  i   i        @   iDXT1iDXT3iDXT5         R   S   T   _   `   a   b   c   c                   @   s$   e Zd ZdZdZdd Zdd ZdS )DdsImageFileZDDSzDirectDraw Surfacec                 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| _td	|d
\}}	}
td|d td|d\}}|d}td|d\}td|d}|t@ rh|t@ r@d| _nd| _dd| j d| jddffg| _n|t@ rdd t|D }d}|t@ r||d 7 }nd| _||d |d  |d  7 }dd| j d|d d d  ddffg| _n|d }d}|d!krd"| _d}n|d#kr(d$| _d%}n|d&kr@d'| _d(}n|d)kr^d*| _d}d| _n|d+kr|d,| _d-}d| _nh|d.krd/| _d-}d| _nJ|d0kr|d17 }td| jd\}| jd |ttfkrd,| _d-}d| _n|tkr
d/| _d-}d| _n|tkr&d2| _d3}d| _n|tkrBd4| _d3}d| _n|ttfkr\d5| _d6}np|tkr|d5| _d7| jd8< d6}nP|tttfkrdd| j dd9fg| _|tkrd7| jd8< d S d:| }t|nd;t| }t|d<d| j ||| jffg| _d S )=Nr   znot a DDS filez<I|   zUnsupported header size x   zIncomplete header: z bytesz<3I   RGBAz<11I,   z<2Ir	   z<4I   LALrawr   r   r   r   c                 S   s"   i | ]\}}|d dddg| qS )RGBA ).0imaskr&   r&   6/tmp/pip-unpacked-wheel-wujwo0tk/PIL/DdsImagePlugin.py
<dictcomp>   s      z&DdsImageFile._open.<locals>.<dictcomp>       ~ RGB         s   DXT1ZDXT1s   DXT3ZDXT3r   s   DXT5ZDXT5   s   ATI1ZBC4s   ATI2ZBC5   s   BC5SZBC5Ss   DX10   ZBC6H   ZBC6HSZBC7   g]tE?gamma)r   r   r   zUnimplemented DXGI format zUnimplemented pixel format Zbcn) _acceptfpreadSyntaxErrorstructunpackreprOSErrorlenr   _sizemodeDDPF_LUMINANCEDDPF_ALPHAPIXELSsizeZtileDDPF_RGB	enumerateZpixel_formatDXGI_FORMAT_BC5_TYPELESSDXGI_FORMAT_BC5_UNORMDXGI_FORMAT_BC5_SNORMDXGI_FORMAT_BC6H_UF16DXGI_FORMAT_BC6H_SF16DXGI_FORMAT_BC7_TYPELESSDXGI_FORMAT_BC7_UNORMDXGI_FORMAT_BC7_UNORM_SRGBinfoDXGI_FORMAT_R8G8B8A8_TYPELESSDXGI_FORMAT_R8G8B8A8_UNORMDXGI_FORMAT_R8G8B8A8_UNORM_SRGBNotImplementedError)selfmsgheader_sizeheader_bytesheaderflagsheightwidthZpitchdepthZmipmapsZpfsizeZpfflagsZfourccbitcountmasksrawmodeZ
data_startnZdxgi_formatr&   r&   r*   _opens   s    



"

*


















zDdsImageFile._openc                 C   s   d S Nr&   )rV   posr&   r&   r*   	load_seek   s    zDdsImageFile.load_seekN)__name__
__module____qualname__formatformat_descriptionrc   rf   r&   r&   r&   r*   r   o   s   ur   c              
   C   s  | j dkr d| j  d}t|| j }dddg}| j dkr@t}nt}|d d d }| j d	krn|tO }|d
 t|d }t|dk r|d qz|tt	td tt
tB tB tB tB  t| j t| j t| j| d d  td td tdd  td t| td t| ddd |D  tt td td td td  | j dkr|  \}}	}
}td|||	|
f} t| |dd| j d|ddffg d S )N)r.   r   r   r   zcannot write mode z as DDSr/   r0   r1   )r   r   r2   )r   r   r-   r	   r   r   r   r7      r
       c                 s   s   | ]}t |V  qd S rd   )o32)r'   r)   r&   r&   r*   	<genexpr>  s     z_save.<locals>.<genexpr>r   r    r!   r   )rC   r@   rD   rG   rE   appendrA   writern   	DDS_MAGIC	DDSD_CAPSDDSD_HEIGHT
DDSD_WIDTH
DDSD_PITCHDDSD_PIXELFORMATr\   r]   joinDDSCAPS_TEXTUREsplitr   merger   _saverF   )Zimr:   filenamerW   ra   r`   Zpixel_flagsr_   rgbar&   r&   r*   r|      sx    




	

r|   c                 C   s   | d d dkS )Nr   s   DDS r&   )prefixr&   r&   r*   r9     s    r9   z.dds)P__doc__r=   ior   r,   r   r   _binaryr   rn   rr   rs   rt   ru   rv   rw   ZDDSD_MIPMAPCOUNTZDDSD_LINEARSIZEZ
DDSD_DEPTHZDDSCAPS_COMPLEXry   ZDDSCAPS_MIPMAPZDDSCAPS2_CUBEMAPZDDSCAPS2_CUBEMAP_POSITIVEXZDDSCAPS2_CUBEMAP_NEGATIVEXZDDSCAPS2_CUBEMAP_POSITIVEYZDDSCAPS2_CUBEMAP_NEGATIVEYZDDSCAPS2_CUBEMAP_POSITIVEZZDDSCAPS2_CUBEMAP_NEGATIVEZZDDSCAPS2_VOLUMErE   Z
DDPF_ALPHAZDDPF_FOURCCZDDPF_PALETTEINDEXED8rG   rD   Z
DDS_FOURCCZDDS_RGBZDDS_RGBAZDDS_LUMINANCEZDDS_LUMINANCEAZ	DDS_ALPHAZDDS_PAL8ZDDS_HEADER_FLAGS_TEXTUREZDDS_HEADER_FLAGS_MIPMAPZDDS_HEADER_FLAGS_VOLUMEZDDS_HEADER_FLAGS_PITCHZDDS_HEADER_FLAGS_LINEARSIZEZ
DDS_HEIGHTZ	DDS_WIDTHZDDS_SURFACE_FLAGS_TEXTUREZDDS_SURFACE_FLAGS_MIPMAPZDDS_SURFACE_FLAGS_CUBEMAPZDDS_CUBEMAP_POSITIVEXZDDS_CUBEMAP_NEGATIVEXZDDS_CUBEMAP_POSITIVEYZDDS_CUBEMAP_NEGATIVEYZDDS_CUBEMAP_POSITIVEZZDDS_CUBEMAP_NEGATIVEZZDXT1_FOURCCZDXT3_FOURCCZDXT5_FOURCCrR   rS   rT   rI   rJ   rK   rL   rM   rN   rO   rP   r   r|   r9   Zregister_openrj   Zregister_saveZregister_extensionr&   r&   r&   r*   <module>   s   }1