o
    õ·iªB  ã                   @  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 ddlm	Z	 ddl
mZ ddlmZmZ G d	d
„ d
eƒZG dd„ deƒZG dd„ deƒZd=dd„Z	d>d?dd„Zd@dd„Zd@dd „ZG d!d"„ d"eƒZdAd$d%„ZG d&d'„ d'ejƒZG d(d)„ d)ejejƒZG d*d+„ d+eƒZG d,d-„ d-eƒZG d.d/„ d/ejƒZ dBd7d8„Z!e "ej#ee¡ e $ej#d9¡ e %d:e¡ e %d;e¡ e &ej#e!¡ e 'd<e ¡ dS )CaÑ  
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.
é    )ÚannotationsN)ÚIntEnum)ÚBytesIO)ÚIOé   )ÚImageÚ	ImageFilec                   @  s   e Zd ZdZdS )ÚFormatr   N)Ú__name__Ú
__module__Ú__qualname__ÚJPEG© r   r   úXC:\Users\psant\Downloads\PAF backend\school\venv\Lib\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ÚDXTZUNCOMPRESSED_RAW_BGRAr   r   r   r   r   0   ó    r   c                   @  r   )ÚAlphaEncodingr   r   é   N)r
   r   r   ÚDXT1ÚDXT3ÚDXT5r   r   r   r   r   6   r   r   ÚiÚintÚreturnútuple[int, int, int]c                 C  s*   | d? d@ d> | d? d@ d> | d@ d> fS )Né   é   r   é   é?   r   r   )r   r   r   r   Ú
unpack_565<   s   *r$   FÚdataÚbytesÚalphaÚboolú1tuple[bytearray, bytearray, bytearray, bytearray]c              	   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   N©ÚlenÚ	bytearrayÚrangeÚstructÚunpack_fromr$   Úextend)r%   r'   ÚblocksÚretÚblock_indexÚidxÚcolor0Úcolor1ÚbitsÚr0Úg0Úb0Úr1Úg1Úb1Újr   ÚcontrolÚaÚrÚgÚbr   r   r   Údecode_dxt1@   sH   áÿ"rH   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 )r*   é   z<8Bú<HHr+   ú<Ié   r,   Fr   Té   é   r   r   r   Nr.   )r%   r5   r6   r7   r8   Úblockr;   r9   r:   Úcoder<   r=   r>   r?   r@   rA   rB   Úhighr   Úalphacode_indexrD   Ú
color_coderE   rF   rG   r   r   r   Údecode_dxt3y   sL   
æþrT   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)
    rI   z<BBz<6Br   r   r+   r,   r"   é   r   r   rJ   rK   rL   r   rM   é   r-   Nr.   )r%   r5   r6   r7   r8   rO   Za0Za1r;   Z
alphacode1Z
alphacode2r9   r:   rP   r<   r=   r>   r?   r@   rA   rB   r   rR   Z	alphacoderD   rS   rE   rF   rG   r   r   r   Údecode_dxt5®   sb   ,


Ùÿ*rW   c                   @  s   e Zd ZdS )ÚBLPFormatErrorN)r
   r   r   r   r   r   r   rX   ô   s    rX   Úprefixc                 C  s
   |   d¡S )N)ó   BLP1ó   BLP2)Ú
startswith)rY   r   r   r   Ú_acceptø   s   
r]   c                   @  s"   e Zd ZdZdZdZd	dd„ZdS )
ÚBlpImageFilez 
    Blizzard Mipmap Format
    ÚBLPzBlizzard Mipmap Formatr   ÚNonec           	      C  sx  | j d usJ ‚| j  d¡| _t| jƒsdt| jƒ› �}t|ƒ‚t d| j  d¡¡d }| jdkr?t d| j  d¡¡d dk}n.t d| j  d¡¡d }t d| j  d¡¡d dk}t d| j  d¡¡d }| j  dt	j
¡ t d	| j  d
¡¡| _| jdkr™t d| j  d¡¡d }| j  dt	j
¡ |||f}d}n||||f}d}| j ¡ }|rªdnd| _t |d| j ||¡g| _d S )Nr,   zBad BLP magic ú<ir   rZ   rK   ú<br   ú<IIr+   é   é   ÚRGBAÚRGB©r   r   )ÚfpÚreadÚmagicr]   ÚreprrX   r2   ÚunpackÚseekÚosÚSEEK_CURÚ_sizeÚdecodeÚ_moder   Ú_TileÚsizeÚtile)	ÚselfÚmsgÚcompressionr'   ÚencodingZalpha_encodingÚargsÚoffsetÚdecoderr   r   r   Ú_open  s.   




zBlpImageFile._openN©r   r`   )r
   r   r   Ú__doc__ÚformatÚformat_descriptionr~   r   r   r   r   r^   ü   s
    r^   c                   @  sR   e Zd ZdZddd„Zejdd	d
„ƒZddd„Zddd„Z	ddd„Z
d dd„ZdS )!Ú_BLPBaseDecoderTÚbufferú$bytes | Image.SupportsArrayInterfacer   útuple[int, int]c              
   C  s@   z|   ¡  |  ¡  W dS  tjy } zd}t|ƒ|‚d }~ww )NzTruncated BLP file)éÿÿÿÿr   )Ú_read_headerÚ_loadr2   ÚerrorÚOSError)rw   r„   Úerx   r   r   r   rr   *  s   
ý
€þz_BLPBaseDecoder.decoder`   c                 C  s   d S ©Nr   ©rw   r   r   r   r‰   3  s   z_BLPBaseDecoder._loadc                 C  s,   t  d|  d¡¡| _t  d|  d¡¡| _d S )Nú<16Ié@   )r2   rm   Ú
_safe_readÚ_offsetsÚ_lengthsrŽ   r   r   r   rˆ   7  s   z_BLPBaseDecoder._read_headerÚlengthr   r&   c                 C  s   | j d usJ ‚t | j |¡S r�   )Úfdr   r‘   )rw   r”   r   r   r   r‘   ;  s   z_BLPBaseDecoder._safe_readúlist[tuple[int, int, int, int]]c              	   C  s`   g }t dƒD ]'}zt d|  d¡¡\}}}}W n tjy#   Y  |S w | ||||f¡ q|S )Né   ú<4Br,   )r1   r2   rm   r‘   rŠ   Úappend)rw   r6   r   rG   rF   rE   rD   r   r   r   Ú_read_palette?  s   ýz_BLPBaseDecoder._read_paletteÚpaletter'   r(   r0   c                 C  s€   t ƒ }t|  | jd ¡ƒ}	 zt d| d¡¡\}W n tjy%   Y |S w || \}}}}	|||f}
|r:|
|	f7 }
| |
¡ q)Nr   Tú<Br   )	r0   r   r‘   r“   r2   rm   rj   rŠ   r4   )rw   r›   r'   r%   Ú_datar|   rG   rF   rE   rD   Údr   r   r   Ú
_read_bgraI  s   ù


÷z_BLPBaseDecoder._read_bgraN)r„   r…   r   r†   r   )r”   r   r   r&   )r   r–   )r›   r–   r'   r(   r   r0   )r
   r   r   Z	_pulls_fdrr   ÚabcÚabstractmethodr‰   rˆ   r‘   rš   rŸ   r   r   r   r   rƒ   '  s    
	



rƒ   c                   @  s    e Zd Zddd„Zddd„ZdS )	ÚBLP1Decoderr   r`   c                 C  sŽ   | j \| _| _}| jtjkr|  ¡  d S | jdkr;| jdv r/|  ¡ }|  ||¡}|  |¡ d S dt	| jƒ› �}t
|ƒ‚dt	| jƒ› �}t
|ƒ‚)Nr   )r,   r"   zUnsupported BLP encoding zUnsupported BLP compression )r{   Ú_compressionÚ	_encodingr	   r   Ú_decode_jpeg_streamrš   rŸ   Ú
set_as_rawrl   rX   )rw   r'   r›   r%   rx   r   r   r   r‰   \  s   

zBLP1Decoder._loadc                 C  sÞ   ddl m} t d|  d¡¡\}|  |¡}| jd usJ ‚|  | jd | j ¡  ¡ |  | jd ¡}|| }|t	|ƒƒ}t
 |j¡ |jdkrb|jd j}t|tƒsSJ ‚|jd j|d dfd�g|_|  | d¡ ¡ d	¡ d S )
Nr   )ÚJpegImageFilerK   r,   r   ZCMYK)r{   rg   ZBGR)ZJpegImagePluginr§   r2   rm   r‘   r•   r’   Útellr“   r   r   Z_decompression_bomb_checkru   Úmoderv   r{   Ú
isinstanceÚtupleÚ_replacer¦   ÚconvertÚtobytes)rw   r§   Zjpeg_header_sizeZjpeg_headerr%   Úimager{   r   r   r   r¥   n  s   

zBLP1Decoder._decode_jpeg_streamNr   )r
   r   r   r‰   r¥   r   r   r   r   r¢   [  s    
r¢   c                   @  s   e Zd Zddd„ZdS )ÚBLP2Decoderr   r`   c                 C  sÌ  | j \| _| _}| _|  ¡ }| jd usJ ‚| j | jd ¡ | jdkrÓ| jtj	kr0|  
||¡}n¯| jtjkrÇtƒ }| jtjkre| jjd d d }t| jjd d ƒD ]‹}t|  |¡|ƒD ]}||7 }q]qS| jtjkr�| jjd d d }t| jjd d ƒD ]_}t|  |¡ƒD ]}||7 }qˆq| jtjkr»| jjd d d }t| jjd d ƒD ]4}t|  |¡ƒD ]}||7 }q³qªdt| jƒ› �}t|ƒ‚dt| jƒ› �}t|ƒ‚d	t| jƒ› �}t|ƒ‚|  |¡ d S )
Nr   r   r   r,   r+   rI   zUnsupported alpha encoding zUnknown BLP encoding zUnknown BLP compression )r{   r£   r¤   Z_alpha_encodingrš   r•   rn   r’   r   r   rŸ   r   r0   r   r   ÚstateZxsizer1   ZysizerH   r‘   r   rT   r   rW   rl   rX   r¦   )rw   r'   r›   r%   ZlinesizeZybrž   rx   r   r   r   r‰   �  sD   

ÿ
ÿ
ÿzBLP2Decoder._loadNr   )r
   r   r   r‰   r   r   r   r   r°   €  s    r°   c                   @  s$   e Zd ZdZddd„Zdd	d
„ZdS )Ú
BLPEncoderTr   r&   c              	   C  s�   d}| j d us	J ‚| j  dd¡}tt|ƒd ƒD ]}||d |d d … \}}}}|t d||||¡7 }qt|ƒdk rF|d7 }t|ƒdk s<|S )Nó    rf   r,   r   r˜   i   s       )ÚimZ
getpaletter1   r/   r2   Úpack)rw   r%   r›   r   rE   rF   rG   rD   r   r   r   Ú_write_palette³  s    ÿzBLPEncoder._write_paletteÚbufsizer   útuple[int, int, bytes]c           	   
   C  s¬   |   ¡ }dt|ƒ }tjd|gd¢R Ž }| jd usJ ‚| jj\}}|tjd|| gd¢R Ž 7 }||7 }t|ƒD ]}t|ƒD ]}|t d| j ||f¡¡7 }q=q7t|ƒd|fS )Né”   r�   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rœ   r   )r¶   r/   r2   rµ   r´   ru   r1   Zgetpixel)	rw   r·   Zpalette_datar|   r%   ÚwÚhÚyÚxr   r   r   Úencode¾  s   ÿzBLPEncoder.encodeN)r   r&   )r·   r   r   r¸   )r
   r   r   Z
_pushes_fdr¶   r¾   r   r   r   r   r²   °  s    
r²   r´   úImage.Imageri   ú	IO[bytes]Úfilenameústr | bytesr`   c              
   C  s@  | j dkrd}t|ƒ‚| j d¡dkrdnd}| |¡ | jd us#J ‚| t dd¡¡ | jj d	kr4dnd
}|dkrD| t d|¡¡ n%| t dtj	¡¡ | t d|¡¡ | t dd
¡¡ | t dd
¡¡ | tjdg| j
¢R Ž ¡ |dkrŒ| t dd¡¡ | t dd
¡¡ t | |t dd| j
 d
| j ¡g¡ d S )NÚPzUnsupported BLP image modeZblp_versionÚBLP1rZ   r[   ra   r   rf   r   z<Lrb   rc   r"   r_   rh   )r©   Ú
ValueErrorZencoderinfoÚgetÚwriter›   r2   rµ   r   r   ru   r   Ú_savert   )r´   ri   rÁ   rx   rk   Zalpha_depthr   r   r   rÈ   Ñ  s&   

(rÈ   z.blprÄ   ZBLP2r_   )r   r   r   r   )F)r%   r&   r'   r(   r   r)   )r%   r&   r   r)   )rY   r&   r   r(   )r´   r¿   ri   rÀ   rÁ   rÂ   r   r`   )(r€   Ú
__future__r   r    ro   r2   Úenumr   Úior   Útypingr   Ú r   r   r	   r   r   r$   rH   rT   rW   ÚNotImplementedErrorrX   r]   r^   ÚABCZ	PyDecoderrƒ   r¢   r°   Z	PyEncoderr²   rÈ   Zregister_openr�   Zregister_extensionZregister_decoderZregister_saveZregister_encoderr   r   r   r   Ú<module>   s>    
ÿ
9
5F
+4%0
!