o
    Z#a3                     @   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$ZFG d%d& d&ejZGd'd( ZHd)d* ZIeJeGjKeGeI eLeGjKeH eMeGjKd+ 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 )DdsImageFileDDSzDirectDraw Surfacec                 C   s  t d| jd\}}|dkrtdt| | j|d }t|dkr1tdt| dt|}t d	|d
\}}}||f| _d| _	t d	|d
\}}	}
t d|d t d|d\}}|d}t d|d\}t d|d}|t
@ rdd t|D }d}|dkr||d 7 }nd| _	||d |d  |d  7 }dd| j d|d d d ddffg| _d S |d }d}|d krd!| _d}n|d"krd#| _d$}n|d%krd&| _d'}n|d(krd)| _d*}d| _	n|d+krm|d,7 }t d| jd\}| jd |ttfv rd-| _d*}d| _	nZ|tkr*d)| _d*}d| _	nL|ttfv r7d.| _d/}n?|tkrGd.| _d0| jd1< d/}n/|tttfv rfdd| j dd2fg| _|tkrdd0| jd1< d S td3| td4t| d5d| j ||| jffg| _d S )6Nz<IIr	   |   zUnsupported header size r   x   zIncomplete header: z bytesz<3I   RGBAz<11I,   z<2Iz<Iz<4I   c                 S   s   i | ]\}}|g d | qS ))RGBA ).0imaskr!   r!   4/usr/lib/python3/dist-packages/PIL/DdsImagePlugin.py
<dictcomp>   s    z&DdsImageFile._open.<locals>.<dictcomp> r
         ~ RGB         rawr   r   r   r   s   DXT1DXT1s   DXT3DXT3r   s   DXT5DXT5   s   BC5SBC5S   s   DX10   BC5BC7   g]tE?gamma)r   r   r   zUnimplemented DXGI format zUnimplemented pixel format bcn)structunpackfpreadOSErrorreprlenr   _sizemodeDDPF_RGB	enumeratesizetilepixel_formatDXGI_FORMAT_BC5_TYPELESSDXGI_FORMAT_BC5_UNORMDXGI_FORMAT_BC5_SNORM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magicheader_sizeheader_bytesheaderflagsheightwidthpitchdepthmipmapspfsizepfflagsfourccbitcountmasksrawmode
data_startndxgi_formatr!   r!   r%   _openq   s   

*






zDdsImageFile._openc                 C   s   d S )Nr!   )rU   posr!   r!   r%   	load_seek   s   zDdsImageFile.load_seekN)__name__
__module____qualname__formatformat_descriptionri   rk   r!   r!   r!   r%   r   m   s
    Xr   c                 C   s  | j dvrtd| j  d|tttd tttB tB tB t	B  t| j
 t| j t| j| j dkr7dnd d d	  td
 td
 td
d  td t| j dkrYtnt td
 t| j dkrhdnd td td td t| j dkrdnd
 tt td
 td
 td
 td
  | j dkr|  \}}}}td||||f} t| |dd| j d
| j d d d d
dffg d S )N)r)   r   zcannot write mode z as DDSr   r   r
      r9   r	   r      r*   r+   r,   r(   r-   r.   r/   r   )rD   r@   writeo32	DDS_MAGIC	DDSD_CAPSDDSD_HEIGHT
DDSD_WIDTH
DDSD_PITCHDDSD_PIXELFORMATr[   r\   DDS_RGBArE   DDSCAPS_TEXTUREsplitr   merger   _saverG   )imr>   filenamergbar!   r!   r%   r      sj   
"	


4r   c                 C   s   | d d dkS )Nr   s   DDS r!   )prefixr!   r!   r%   _accept   s   r   z.dds)N__doc__r<   ior   r'   r   r   _binaryr   rt   ru   rv   rw   rx   ry   rz   DDSD_MIPMAPCOUNTDDSD_LINEARSIZE
DDSD_DEPTHDDSCAPS_COMPLEXr|   DDSCAPS_MIPMAPDDSCAPS2_CUBEMAPDDSCAPS2_CUBEMAP_POSITIVEXDDSCAPS2_CUBEMAP_NEGATIVEXDDSCAPS2_CUBEMAP_POSITIVEYDDSCAPS2_CUBEMAP_NEGATIVEYDDSCAPS2_CUBEMAP_POSITIVEZDDSCAPS2_CUBEMAP_NEGATIVEZDDSCAPS2_VOLUMEDDPF_ALPHAPIXELS
DDPF_ALPHADDPF_FOURCCDDPF_PALETTEINDEXED8rE   DDPF_LUMINANCE
DDS_FOURCCDDS_RGBr{   DDS_LUMINANCEDDS_LUMINANCEA	DDS_ALPHADDS_PAL8DDS_HEADER_FLAGS_TEXTUREDDS_HEADER_FLAGS_MIPMAPDDS_HEADER_FLAGS_VOLUMEDDS_HEADER_FLAGS_PITCHDDS_HEADER_FLAGS_LINEARSIZE
DDS_HEIGHT	DDS_WIDTHDDS_SURFACE_FLAGS_TEXTUREDDS_SURFACE_FLAGS_MIPMAPDDS_SURFACE_FLAGS_CUBEMAPDDS_CUBEMAP_POSITIVEXDDS_CUBEMAP_NEGATIVEXDDS_CUBEMAP_POSITIVEYDDS_CUBEMAP_NEGATIVEYDDS_CUBEMAP_POSITIVEZDDS_CUBEMAP_NEGATIVEZDXT1_FOURCCDXT3_FOURCCDXT5_FOURCCrQ   rR   rS   rJ   rK   rL   rM   rN   rO   r   r   r   register_openro   register_saveregister_extensionr!   r!   r!   r%   <module>   s    `$