o
    svXj{>  ã                   @   sn  d Z ddlZddlZddlmZ ddlmZ ddlmZm	Z	 ddl
mZ G dd	„ d	eƒZG d
d„ deƒZG dd„ deƒZdd„ Zdd„ Zd-dd„Zdd„ Zdd„ ZG dd„ deƒZdd„ ZG dd„ de	j	ƒZG dd „ d e	jƒZG d!d"„ d"eƒZG d#d$„ d$eƒZG d%d&„ d&e	jƒZd-d'd(„Ze ej ee¡ e !ej d)¡ e "d*e¡ e "d+e¡ e #ej e¡ e $d,e¡ dS ).aÑ  
Blizzard Mipmap Format (.blp)
Jerome Leclanche <jerome@leclan.ch>

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/

BLP1 files, used mostly in Warcraft III, are not fully supported.
All types of BLP2 files used in World of Warcraft are supported.

The BLP file structure consists of a header, up to 16 mipmaps of the
texture

Texture sizes must be powers of two, though the two dimensions do
not have to be equal; 512x256 is valid, but 512x200 is not.
The first mipmap (mipmap #0) is the full size image; each subsequent
mipmap halves both dimensions. The final mipmap should be 1x1.

BLP files come in many different flavours:
* JPEG-compressed (type == 0) - only supported for BLP1.
* RAW images (type == 1, encoding == 1). Each mipmap is stored as an
  array of 8-bit values, one per pixel, left to right, top to bottom.
  Each value is an index to the palette.
* DXT-compressed (type == 1, encoding == 2):
- DXT1 compression is used if alpha_encoding == 0.
  - An additional alpha bit is used if alpha_depth == 1.
  - DXT3 compression is used if alpha_encoding == 1.
  - DXT5 compression is used if alpha_encoding == 7.
é    N)ÚIntEnum)ÚBytesIOé   )ÚImageÚ	ImageFile)Ú	deprecatec                   @   s   e Zd ZdZdS )ÚFormatr   N)Ú__name__Ú
__module__Ú__qualname__ÚJPEG© r   r   úO/var/www/html/myproject/venv/lib/python3.10/site-packages/PIL/BlpImagePlugin.pyr   )   s    r   c                   @   ó   e Zd ZdZdZdZdS )ÚEncodingr   é   é   N)r	   r
   r   ÚUNCOMPRESSEDÚDXTÚUNCOMPRESSED_RAW_BGRAr   r   r   r   r   -   ó    r   c                   @   r   )ÚAlphaEncodingr   r   é   N)r	   r
   r   ÚDXT1ÚDXT3ÚDXT5r   r   r   r   r   3   r   r   c                 C   sˆ   t dtdtdi ¡ D ],\}}|  |¡r6| t|ƒd … } | |jv r6t|› | › �d|j› d| › �ƒ ||    S q
dt› d| › d�}t	|ƒ‚)	NÚBLP_FORMAT_ÚBLP_ENCODING_ÚBLP_ALPHA_ENCODING_é
   Ú.zmodule 'z' has no attribute 'ú')
r   r   r   ÚitemsÚ
startswithÚlenÚ__members__r   r	   ÚAttributeError)ÚnameÚenumÚprefixÚmsgr   r   r   Ú__getattr__9   s   ý
ü

 €r+   c                 C   s*   | d? d@ d> | d? d@ d> | d@ d> fS )Né   é   r   é   é?   r   r   )Úir   r   r   Ú
unpack_565H   s   *r1   Fc              	   C   s´  t | ƒd }tƒ tƒ tƒ tƒ f}t|ƒD ]Ã}|d }t d| |¡\}}}t|ƒ\}	}
}t|ƒ\}}}tdƒD ] }tdƒD ]™}|d@ }|d? }d}|dkrU|	|
|}}}nh|dkrb|||}}}n[|dkr–||krƒd|	 | d }d|
 | d }d| | d }n:|	| d }|
| d }|| d }n'|dkr½||kr·d| |	 d }d| |
 d }d| | d }nd	\}}}}|rË||  ||||g¡ q<||  |||g¡ q<q6q|S )
úE
    input: one "row" of data (i.e. will produce 4*width pixels)
    é   z<HHIé   r   r   éÿ   r   r   )r   r   r   r   ©r$   Ú	bytearrayÚrangeÚstructÚunpack_fromr1   Úextend)ÚdataÚalphaÚblocksÚretÚblockÚidxÚcolor0Úcolor1ÚbitsÚr0Úg0Úb0Úr1Úg1Úb1Újr0   ÚcontrolÚaÚrÚgÚbr   r   r   Údecode_dxt1L   sH   áÿ"rQ   c              	   C   sÆ  t | ƒd }tƒ tƒ tƒ tƒ f}t|ƒD ]Ì}|d }| ||d … }t d|¡}t d|d¡\}}t d|d¡\}t|ƒ\}	}
}t|ƒ\}}}tdƒD ]”}d}tdƒD ]‹}d| | d	 }|| }|rjd}|dL }nd
}|dM }|d9 }|d	d| |  ? d@ }|dkr�|	|
|}}}nF|dkrš|||}}}n9|d	kr·d	|	 | d }d	|
 | d }d	| | d }n|dkrÓd	| |	 d }d	| |
 d }d	| | d }||  ||||g¡ qSqKq|S )r2   é   z<8Bú<HHr3   ú<Ié   r4   Fr   Té   é   r   r   r   r6   )r<   r>   r?   r@   rA   rD   rB   rC   ÚcoderE   rF   rG   rH   rI   rJ   rK   Úhighr0   Úalphacode_indexrM   Ú
color_coderN   rO   rP   r   r   r   Údecode_dxt3ƒ   sL   
æþr\   c              	   C   s¬  t | ƒd }tƒ tƒ tƒ tƒ f}t|ƒD �]>}|d }| ||d … }t d|¡\}}t d|d¡}|d |d d> B |d d> B |d d	> B }|d
 |d d> B }	t d|d¡\}
}t d|d¡\}t|
ƒ\}}}t|ƒ\}}}tdƒD ]Ý}tdƒD ]Ö}dd| |  }|dkr�|	|? d@ }n|dkrŸ|	d? |d> d@ B }n||d ? d@ }|d
kr®|}n6|dkrµ|}n/||krÈd| | |d |  d }n|dkrÏd
}n|dkrÖd}nd| | |d |  d }|dd| |  ? d@ }|d
krý|||}}}nI|dk�r|||}}}n;|dk�r)d| | d }d| | d }d| | d }n|dk�rFd| | d }d| | d }d| | d }||  ||||g¡ q{quq|S )zG
    input: one "row" of data (i.e. will produce 4 * width pixels)
    rR   z<BBz<6Br   r   r3   r4   r.   é   r   r   rS   rT   rU   r   rV   é   r5   r6   )r<   r>   r?   r@   rA   Úa0Úa1rD   Ú
alphacode1Ú
alphacode2rB   rC   rX   rE   rF   rG   rH   rI   rJ   rK   r0   rZ   Ú	alphacoderM   r[   rN   rO   rP   r   r   r   Údecode_dxt5¸   sb   ,


Ùÿ*rd   c                   @   s   e Zd ZdS )ÚBLPFormatErrorN)r	   r
   r   r   r   r   r   re   þ   s    re   c                 C   s   | d d… dv S )Nr4   ©ó   BLP1ó   BLP2r   )r)   r   r   r   Ú_accept  s   ri   c                   @   s    e Zd ZdZdZdZdd„ ZdS )ÚBlpImageFilez 
    Blizzard Mipmap Format
    ÚBLPzBlizzard Mipmap Formatc                 C   s¼   | j  d¡| _| j  dtj¡ t d| j  d¡¡\| _| j  dtj¡ t d| j  d¡¡| _	| jdv r9| j 
¡ }nd	t| jƒ› �}t|ƒ‚| jrJd
nd| _|d| j d| jddffg| _d S )Nr4   r.   ú<br   r   ú<IIr3   rf   zBad BLP magic ÚRGBAÚRGB©r   r   r   )ÚfpÚreadÚmagicÚseekÚosÚSEEK_CURr9   ÚunpackÚ_blp_alpha_depthÚ_sizeÚdecodeÚreprre   ÚmodeÚsizeÚtile)ÚselfÚdecoderr*   r   r   r   Ú_open  s   
"zBlpImageFile._openN)r	   r
   r   Ú__doc__ÚformatÚformat_descriptionr�   r   r   r   r   rj     s
    rj   c                   @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )Ú_BLPBaseDecoderTc              
   C   s@   z|   ¡  |  ¡  W dS  tjy } zd}t|ƒ|‚d }~ww )NzTruncated BLP file)éÿÿÿÿr   )Ú_read_blp_headerÚ_loadr9   ÚerrorÚOSError)r   ÚbufferÚer*   r   r   r   rz   $  s   
ý
€þz_BLPBaseDecoder.decodec                 C   sä   | j  d¡ t d|  d¡¡\| _t d|  d¡¡\| _t d|  d¡¡\| _t d|  d¡¡\| _| j  dt	j
¡ t d|  d¡¡| _t| tƒr\t d|  d¡¡\| _| j  dt	j
¡ t d|  d¡¡| _t d|  d¡¡| _d S )	Nr4   ú<irl   r   rm   r3   ú<16Ié@   )Úfdrt   r9   rw   Ú
_safe_readÚ_blp_compressionÚ_blp_encodingrx   Ú_blp_alpha_encodingru   rv   r}   Ú
isinstanceÚBLP1DecoderÚ_blp_offsetsÚ_blp_lengths)r   r   r   r   r‡   -  s   
z _BLPBaseDecoder._read_blp_headerc                 C   s   t  | j|¡S )N)r   r‘   r�   )r   Úlengthr   r   r   r‘   @  s   z_BLPBaseDecoder._safe_readc              	   C   s`   g }t dƒD ]'}zt d|  d¡¡\}}}}W n tjy#   Y  |S w | ||||f¡ q|S )Né   ú<4Br4   )r8   r9   rw   r‘   r‰   Úappend)r   r?   r0   rP   rO   rN   rM   r   r   r   Ú_read_paletteC  s   ýz_BLPBaseDecoder._read_palettec           
      C   s‚   t ƒ }t|  | jd ¡ƒ}	 zt d| d¡¡\}W n tjy%   Y |S w || \}}}}|||f}	| jr;|	|f7 }	| 	|	¡ q)Nr   Tú<Br   )
r7   r   r‘   r˜   r9   rw   rr   r‰   rx   r;   )
r   Úpaletter<   Ú_dataÚoffsetrP   rO   rN   rM   Údr   r   r   Ú
_read_bgraM  s   ù


÷z_BLPBaseDecoder._read_bgraN)	r	   r
   r   Ú	_pulls_fdrz   r‡   r‘   r�   r£   r   r   r   r   r…   !  s    	
r…   c                   @   s   e Zd Zdd„ Zdd„ ZdS )r–   c                 C   s€   | j tjkr|  ¡  d S | j dkr4| jdv r(|  ¡ }|  |¡}|  t|ƒ¡ d S dt	| jƒ› �}t
|ƒ‚dt	| jƒ› �}t
|ƒ‚)Nr   )r4   r.   zUnsupported BLP encoding zUnsupported BLP compression )r’   r   r   Ú_decode_jpeg_streamr“   r�   r£   Ú
set_as_rawÚbytesr{   re   )r   rŸ   r<   r*   r   r   r   rˆ   ^  s   


zBLP1Decoder._loadc                 C   sä   ddl m} t d|  d¡¡\}|  |¡}|  | jd | j ¡  ¡ |  | jd ¡}|| }t	|ƒ}||ƒ}t
 |j¡ |jdkrV|jd \}}}}	||||	d dffg|_| d¡ ¡ \}
}}t
 d|||
f¡}|  | ¡ ¡ d S )Nr   )ÚJpegImageFilerT   r4   r   ÚCMYKro   )ÚJpegImagePluginr¨   r9   rw   r‘   r—   r�   Útellr˜   r   r   Ú_decompression_bomb_checkr}   r|   r~   ÚconvertÚsplitÚmerger¦   Útobytes)r   r¨   Újpeg_header_sizeÚjpeg_headerr<   ÚimageÚdecoder_nameÚextentsr¡   ÚargsrN   rO   rP   r   r   r   r¥   n  s   

zBLP1Decoder._decode_jpeg_streamN)r	   r
   r   rˆ   r¥   r   r   r   r   r–   ]  s    r–   c                   @   s   e Zd Zdd„ ZdS )ÚBLP2Decoderc                 C   sÆ  |   ¡ }| j | jd ¡ | jdkrÎ| jtjkr|  |¡}n¼| jtj	krÂt
ƒ }| jtjkrZ| jd d d d }t| jd d d ƒD ]}t|  |¡t| jƒd�D ]}||7 }qQqCn€| jtjkrˆ| jd d d d }t| jd d d ƒD ]}t|  |¡ƒD ]}||7 }qqvnR| jtjkr¶| jd d d d }t| jd d d ƒD ]}t|  |¡ƒD ]}||7 }q­q¤n$dt| jƒ› �}t|ƒ‚d	t| jƒ› �}t|ƒ‚d
t| jƒ› �}t|ƒ‚|  t|ƒ¡ d S )Nr   r   r   r4   r3   )r=   rR   zUnsupported alpha encoding zUnknown BLP encoding zUnknown BLP compression )r�   r�   rt   r—   r’   r“   r   r   r£   r   r7   r”   r   r   r}   r8   rQ   r‘   Úboolrx   r   r\   r   rd   r{   re   r¦   r§   )r   rŸ   r<   ÚlinesizeÚybr¢   r*   r   r   r   rˆ   ‚  sJ   

ÿ
ýÿ
ÿÿ
ÿÿzBLP2Decoder._loadN)r	   r
   r   rˆ   r   r   r   r   r·   �  s    r·   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )Ú
BLPEncoderTc              	   C   sZ   d}| j  dd¡}tdƒD ]}||d |d d … \}}}}|t d||||¡7 }q|S )Nó    rn   rš   r4   r   r›   )ÚimÚ
getpaletter8   r9   Úpack)r   r<   rŸ   r0   rN   rO   rP   rM   r   r   r   Ú_write_palette³  s    zBLPEncoder._write_palettec           	   
   C   sž   |   ¡ }dt|ƒ }tjd|gd¢R Ž }| jj\}}|tjd|| gd¢R Ž 7 }||7 }t|ƒD ]}t|ƒD ]}|t d| j ||f¡¡7 }q6q0t|ƒd|fS )Né”   rŽ   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rž   r   )rÀ   r$   r9   r¿   r½   r}   r8   Úgetpixel)	r   ÚbufsizeÚpalette_datar¡   r<   ÚwÚhÚyÚxr   r   r   Úencode»  s   ÿzBLPEncoder.encodeN)r	   r
   r   Ú
_pushes_fdrÀ   rÉ   r   r   r   r   r»   °  s    r»   c                 C   s  | j dkrd}t|ƒ‚| j d¡dkrdnd}| |¡ | t dd¡¡ | t d	tj¡¡ | t d	| j	j d
kr<dnd¡¡ | t d	d¡¡ | t d	d¡¡ | tjdg| j
¢R Ž ¡ |dkru| t dd¡¡ | t dd¡¡ t | |dd| j
 d| j fg¡ d S )NÚPzUnsupported BLP image modeÚblp_versionÚBLP1rg   rh   r�   r   rl   rn   r   rm   r.   rk   rp   )r|   Ú
ValueErrorÚencoderinfoÚgetÚwriter9   r¿   r   r   rŸ   r}   r   Ú_save)r½   rq   ÚfilenameÚsave_allr*   rs   r   r   r   rÒ   Í  s   

"$rÒ   z.blprÍ   ÚBLP2rk   )F)%r‚   ru   r9   r(   r   Úior   Ú r   r   Ú
_deprecater   r   r   r   r+   r1   rQ   r\   rd   ÚNotImplementedErrorre   ri   rj   Ú	PyDecoderr…   r–   r·   Ú	PyEncoderr»   rÒ   Úregister_openrƒ   Úregister_extensionÚregister_decoderÚregister_saveÚregister_encoderr   r   r   r   Ú<module>   s:    
75F<$/
