o
    üÞh•@  ã                   @  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   úR/var/www/html/premium_crap/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¡S )N)ó   BLP1ó   BLP2)Ú
startswith)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  sj  | j  d¡| _t| jƒsdt| jƒ› �}t|ƒ‚t d| j  d¡¡d }| jdkr8t 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   r`   rL   ú<br   ú<IIr,   é   é   ÚRGBAÚRGB©r   r   )ÚfpÚreadÚmagicrc   Úreprr^   r3   ÚunpackÚseekÚosÚSEEK_CURÚ_sizeÚdecodeÚ_moder   Ú_TileÚsizeÚtile)	ÚselfÚmsgÚcompressionr(   ÚencodingÚalpha_encodingÚargsÚoffsetÚdecoderr   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Ú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Ú_loadr3   ÚerrorÚOSError)r}   r‹   Úer~   r   r   r   rx   )  s   
ý
€þz_BLPBaseDecoder.decoderf   c                 C  s   d S ©Nr   ©r}   r   r   r   r�   2  s   z_BLPBaseDecoder._loadc                 C  s,   t  d|  d¡¡| _t  d|  d¡¡| _d S )Nú<16Ié@   )r3   rs   Ú
_safe_readÚ_offsetsÚ_lengthsr•   r   r   r   r�   6  s   z_BLPBaseDecoder._read_headerÚlengthr   r'   c                 C  s   | j d usJ ‚t | j |¡S r”   )Úfdr   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   rs   r˜   r‘   Úappend)r}   r7   r   rH   rG   rF   rE   r   r   r   Ú_read_palette>  s   ýz_BLPBaseDecoder._read_paletteÚpaletter(   r)   r1   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   )	r1   r   r˜   rš   r3   rs   rp   r‘   r5   )r}   r¢   r(   r&   Ú_datarƒ   rH   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(   r)   r   r1   )r
   r   r   Ú	_pulls_fdrx   Ú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   rf   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_rawrr   r^   )r}   r(   r¢   r&   r~   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   )ÚJpegImageFilerL   r-   r   ÚCMYK)r‚   rm   ÚBGR)ÚJpegImagePluginr¯   r3   rs   r˜   rœ   r™   Útellrš   r   r   Ú_decompression_bomb_checkr{   Úmoder|   r‚   Ú
isinstanceÚtupleÚ_replacer®   ÚconvertÚtobytes)r}   r¯   Újpeg_header_sizeÚjpeg_headerr&   Úimager‚   r   r   r   r­   m  s   

zBLP1Decoder._decode_jpeg_streamNr†   )r
   r   r   r�   r­   r   r   r   r   rª   Z  s    
rª   c                   @  s   e Zd Zddd„ZdS )ÚBLP2Decoderr   rf   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rf| jjd d d }t| jjd d ƒD ]}t|  |¡|ƒD ]}||7 }q]qSn|| jtjkr’| jjd d d }t| jjd d ƒD ]}t|  |¡ƒD ]}||7 }q‰q€nP| jtjkr¾| jjd d d }t| jj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,   rJ   zUnsupported alpha encoding zUnknown BLP encoding zUnknown BLP compression )r‚   r«   r¬   Ú_alpha_encodingr¡   rœ   rt   r™   r   r   r¦   r   r1   r   r   ÚstateÚxsizer2   ÚysizerI   r˜   r   rU   r   r]   rr   r^   r®   )r}   r(   r¢   r&   ÚlinesizeÚybr¥   r~   r   r   r   r�   €  sJ   

ÿÿ
ÿÿ
ÿÿ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ó    rl   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Ç   r{   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.Imagero   ú	IO[bytes]Úfilenameústr | bytesrf   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 modeÚblp_versionÚBLP1r`   ra   rg   r   rl   r   z<Lrh   ri   r#   re   rn   )rµ   Ú
ValueErrorÚencoderinfoÚgetÚwriter¢   r3   rÉ   r   r   r{   r   Ú_saverz   )rÇ   ro   rØ   r~   rq   Úalpha_depthr   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Ö   ro   r×   rØ   rÙ   r   rf   )(r‡   Ú
__future__r   r¨   ru   r3   Úenumr   Úior   Útypingr   Ú r   r   r	   r   r   r%   rI   rU   r]   ÚNotImplementedErrorr^   rc   rd   ÚABCÚ	PyDecoderrŠ   rª   r¾   Ú	PyEncoderrÅ   rá   Úregister_openrˆ   Úregister_extensionÚregister_decoderÚregister_saveÚregister_encoderr   r   r   r   Ú<module>   s>    
ÿ
9
5F
*4%0
!