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
@ rÁd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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�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]tÑEÝ?Ú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�    `$