o
    Ñ­jî?  ã                   @  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ƒ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   úO/var/www/html/CropPilot/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   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   ©Ú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   áÿ"rI   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   r/   )r&   r6   r7   r8   r9   Úblockr<   r:   r;   Úcoder=   r>   r?   r@   rA   rB   rC   Úhighr   Úalphacode_indexrE   Ú
color_coderF   rG   rH   r   r   r   Údecode_dxt3y   sL   
æþrU   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)
    rJ   z<BBz<6Br   r   r,   r-   r#   é   r   r   rK   rL   rM   r   rN   é   r.   r/   )r&   r6   r7   r8   r9   rP   Úa0Úa1r<   Ú
alphacode1Ú
alphacode2r:   r;   rQ   r=   r>   r?   r@   rA   rB   rC   r   rS   Ú	alphacoderE   rT   rF   rG   rH   r   r   r   Údecode_dxt5®   sb   ,


Ùÿ*r]   c                   @  s   e Zd ZdS )ÚBLPFormatErrorN)r
   r   r   r   r   r   r   r^   ô   s    r^   Úprefixc                 C  s   | d d… dv S )Nr-   ©ó   BLP1ó   BLP2r   )r_   r   r   r   Ú_acceptø   s   rc   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  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 )Nr-   r#   ú<br   r   ú<IIr,   r`   zBad BLP magic ÚRGBAÚRGB©r   r   r   )ÚfpÚreadÚmagicÚseekÚosÚSEEK_CURr3   ÚunpackÚ_blp_alpha_depthÚ_sizeÚdecodeÚreprr^   Ú_modeÚsizeÚmodeÚtile)ÚselfÚdecoderÚmsgr   r   r   Ú_open  s   
"zBlpImageFile._openN©r   rf   )r
   r   r   Ú__doc__ÚformatÚformat_descriptionr~   r   r   r   r   rd   ü   s
    rd   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Úbufferr'   r   ú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_blp_headerÚ_loadr3   ÚerrorÚOSError)r{   r„   Úer}   r   r   r   ru     s   
ý
€þz_BLPBaseDecoder.decoderf   c                 C  s   d S ©Nr   ©r{   r   r   r   rˆ   #  s   z_BLPBaseDecoder._loadc                 C  sò   | j d usJ ‚| j  d¡ t d|  d¡¡\| _t d|  d¡¡\| _t d|  d¡¡\| _t d|  d¡¡\| _| j  dt	j
¡ t d|  d¡¡| _t| tƒrct d|  d¡¡\| _| j  dt	j
¡ t d|  d¡¡| _t d|  d¡¡| _d S )	Nr-   ú<irg   r   rh   r,   ú<16Ié@   )Úfdro   r3   rr   Ú
_safe_readÚ_blp_compressionÚ_blp_encodingrs   Ú_blp_alpha_encodingrp   rq   rx   Ú
isinstanceÚBLP1DecoderÚ_blp_offsetsÚ_blp_lengthsr�   r   r   r   r‡   '  s   
z _BLPBaseDecoder._read_blp_headerÚlengthr   c                 C  s   t  | j|¡S rŒ   )r   r’   r‘   )r{   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-   )r2   r3   rr   r’   r‰   Úappend)r{   r7   r   rH   rG   rF   rE   r   r   r   Ú_read_palette>  s   ýz_BLPBaseDecoder._read_paletteÚpaletter1   c           
      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   )
r1   r   r’   r™   r3   rr   rm   r‰   rs   r5   )
r{   r    r&   Ú_dataÚoffsetrH   rG   rF   rE   Údr   r   r   Ú
_read_bgraH  s   ù


÷z_BLPBaseDecoder._read_bgraN)r„   r'   r   r…   r   )rš   r   r   r'   )r   r›   )r    r›   r   r1   )r
   r   r   Ú	_pulls_fdru   Ú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 )	r—   r   rf   c                 C  s|   | j tjkr|  ¡  d S | j dkr2| 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“   r	   r   Ú_decode_jpeg_streamr”   rŸ   r¥   Ú
set_as_rawrv   r^   )r{   r    r&   r}   r   r   r   rˆ   Y  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r[|jd \}}}}	||||	d dffg|_| d¡ ¡ \}
}}t
 d|||
f¡}|  | ¡ ¡ d S )Nr   )ÚJpegImageFilerL   r-   r   ÚCMYKrj   )ÚJpegImagePluginr«   r3   rr   r’   r‘   r˜   Útellr™   r   r   Ú_decompression_bomb_checkrx   ry   rz   ÚconvertÚsplitÚmergerª   Útobytes)r{   r«   Újpeg_header_sizeÚjpeg_headerr&   ÚimageÚdecoder_nameÚextentsr£   ÚargsrF   rG   rH   Úreversed_imager   r   r   r©   i  s   

zBLP1Decoder._decode_jpeg_streamNr   )r
   r   r   rˆ   r©   r   r   r   r   r—   X  s    
r—   c                   @  s   e Zd Zddd„ZdS )ÚBLP2Decoderr   rf   c                 C  sÐ  |   ¡ }| jd usJ ‚| j | jd ¡ | jdkrÕ| jtjkr%|  |¡}n¼| jtj	krÉt
ƒ }| jtjkra| jd d d d }t| jd d d ƒD ]}t|  |¡t| jƒd�D ]}||7 }qXqJn€| jtjkr�| jd d d d }t| jd d d ƒD ]}t|  |¡ƒD ]}||7 }q†q}nR| 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|ƒ‚|  |¡ d S )Nr   r   r   r-   r,   )r(   rJ   zUnsupported alpha encoding zUnknown BLP encoding zUnknown BLP compression )rŸ   r‘   ro   r˜   r“   r”   r   r   r¥   r   r1   r•   r   r   rx   r2   rI   r’   r)   rs   r   rU   r   r]   rv   r^   rª   )r{   r    r&   ÚlinesizeÚybr¤   r}   r   r   r   rˆ   }  sL   

ÿ
ýÿ
ÿÿ
ÿÿ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ó    ri   r-   r   r�   i   s       )ÚimÚ
getpaletter2   r0   r3   Úpack)r{   r&   r    r   rF   rG   rH   rE   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Ã   r0   r3   rÂ   rÀ   rx   r2   Úgetpixel)	r{   rÄ   Úpalette_datar£   r&   ÚwÚhÚyÚxr   r   r   Úencodeº  s   ÿzBLPEncoder.encodeN)r   r'   )rÄ   r   r   rÅ   )r
   r   r   Ú
_pushes_fdrÃ   rÍ   r   r   r   r   r¾   ¬  s    
r¾   rÀ   úImage.Imagerl   ú	IO[bytes]Úfilenameústr | bytesrf   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ÚBLP1ra   rb   rŽ   r   rg   ri   r   rh   r#   re   rk   )ry   Ú
ValueErrorÚencoderinfoÚgetÚwriter3   rÂ   r   r   r    rx   r   Ú_save)rÀ   rl   rÑ   r}   rn   r   r   r   rÚ   Í  s   

"$rÚ   z.blprÕ   ÚBLP2re   )r   r   r   r    )F)r&   r'   r(   r)   r   r*   )r&   r'   r   r*   )r_   r'   r   r)   )rÀ   rÏ   rl   rÐ   rÑ   rÒ   r   rf   )'r€   Ú
__future__r   r§   rp   r3   Úenumr   Úior   Útypingr   Ú r   r   r	   r   r   r%   rI   rU   r]   ÚNotImplementedErrorr^   rc   rd   Ú	PyDecoderrƒ   r—   r»   Ú	PyEncoderr¾   rÚ   Úregister_openr�   Úregister_extensionÚregister_decoderÚregister_saveÚregister_encoderr   r   r   r   Ú<module>   s>    
ÿ
9
5F
A$0
!