a
    ç´«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œdd„Zd:ddddœdd„Zdddœdd„Zdddœdd„ZG d d!„ d!eƒZddd"œd#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 d/d0d1d2d3œd4d5„Z!e "ej#ee¡ e $ej#d6¡ e %d7e¡ e %d8e¡ e &ej#e!¡ e 'd9e ¡ 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.
é    )ÚannotationsN)ÚIntEnum)ÚBytesIO)ÚIOé   )ÚImageÚ	ImageFilec                   @  s   e Zd ZdZdS )ÚFormatr   N)Ú__name__Ú
__module__Ú__qualname__ÚJPEG© r   r   úQ/var/www/html/laksyashrimp/venv/lib/python3.9/site-packages/PIL/BlpImagePlugin.pyr	   ,   s   r	   c                   @  s   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   s   r   c                   @  s   e Zd ZdZdZdZdS )ÚAlphaEncodingr   r   é   N)r
   r   r   ÚDXT1ÚDXT3ÚDXT5r   r   r   r   r   6   s   r   Úintztuple[int, int, int])ÚiÚreturnc                 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ÚbytesÚboolz1tuple[bytearray, bytearray, bytearray, bytearray])ÚdataÚalphar   c              	   C  sÄ  t | ƒd }tƒ tƒ tƒ tƒ f}t|ƒD �]”}|d }t d| |¡\}}}t|ƒ\}	}
}t|ƒ\}}}tdƒD �]L}tdƒD �]<}|d@ }|d? }d}|dkr°|	|
|  }}}nØ|dkrÊ|||  }}}n¾|dk�r6||k�rd|	 | d }d|
 | d }d| | d }n$|	| d }|
| d }|| d }nR|dk�rˆ||k�r|d| |	 d }d| |
 d }d| | d }nd	\}}}}|�r¦||  ||||g¡ q|||  |||g¡ q|qnq(|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@   sD    



rD   )r$   r   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 �]2}d}tdƒD �]}d| | d	 }|| }|rÚd}|dL }nd
}|dM }|d9 }|	d	d| |  ? d@ }|dk�r"|
||  }}}n’|dk�r>|||  }}}nv|d	k�rzd	|
 | d }d	| | d }d	| | d }n:|dk�r´d	| |
 d }d	| | d }d	| | d }||  ||||g¡ qªq˜q(|S )r&   é   z<8Bú<HHr'   ú<Ié   r(   Fr   Té   é   r   r   r   r*   )r$   r1   r2   r3   r4   Úblockr7   r5   r6   Úcoder8   r9   r:   r;   r<   r=   r>   Úhighr   Úalphacode_indexr@   Ú
color_coderA   rB   rC   r   r   r   Údecode_dxt3y   sH    




rP   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@ }n0|dk�rF|
d? |	d> d@ B }n|	|d ? d@ }|d
k�rf|}nt|dk�rv|}nd||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|||  }}}n’|dk�r*|||  }}}nv|dk�rfd| | d }d| | d }d| | d }n:|dk�r d| | d }d| | d }d| | d }||  ||||g¡ qøqêq(|S )zG
    input: one "row" of data (i.e. will produce 4 * width pixels)
    rE   z<BBz<6Br   r   r'   r(   r   é   r   r   rF   rG   rH   r   rI   é   r)   r*   )r$   r1   r2   r3   r4   rK   Za0Za1r7   Z
alphacode1Z
alphacode2r5   r6   rL   r8   r9   r:   r;   r<   r=   r>   r   rN   Z	alphacoder@   rO   rA   rB   rC   r   r   r   Údecode_dxt5®   s^    ,










rS   c                   @  s   e Zd ZdS )ÚBLPFormatErrorN)r
   r   r   r   r   r   r   rT   ô   s   rT   )Úprefixr   c                 C  s
   |   d¡S )N)ó   BLP1ó   BLP2)Ú
startswith)rU   r   r   r   Ú_acceptø   s    rY   c                   @  s&   e Zd ZdZdZdZddœdd„ZdS )	ÚBlpImageFilez 
    Blizzard Mipmap Format
    ÚBLPzBlizzard Mipmap FormatÚNone©r   c           	      C  sn  | j  d¡| _t| jƒs0dt| jƒ› �}t|ƒ‚t d| j  d¡¡d }| jdkrpt 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 ¡ }|�rJdnd| _t |d| j ||¡g| _d S )Nr(   zBad BLP magic ú<ir   rV   rG   ú<br   ú<IIr'   é   é   ÚRGBAÚRGB©r   r   )ÚfpÚreadÚmagicrY   ÚreprrT   r.   Ú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   Ú__doc__ÚformatÚformat_descriptionr{   r   r   r   r   rZ   ü   s   rZ   c                   @  sr   e Zd ZdZdddœdd„Zejddœd	d
„ƒZddœdd„Zdddœdd„Z	ddœdd„Z
ddddœdd„ZdS )Ú_BLPBaseDecoderTz$bytes | Image.SupportsArrayInterfaceztuple[int, int])Úbufferr   c              
   C  sN   z|   ¡  |  ¡  W n4 tjyH } zd}t|ƒ|‚W Y d }~n
d }~0 0 dS )NzTruncated BLP file)éÿÿÿÿr   )Ú_read_headerÚ_loadr.   ÚerrorÚOSError)rt   r€   Úeru   r   r   r   ro   )  s     z_BLPBaseDecoder.decoder\   r]   c                 C  s   d S ©Nr   ©rt   r   r   r   rƒ   2  s    z_BLPBaseDecoder._loadc                 C  s,   t  d|  d¡¡| _t  d|  d¡¡| _d S )Nú<16Ié@   )r.   rj   Ú
_safe_readÚ_offsetsÚ_lengthsrˆ   r   r   r   r‚   6  s    z_BLPBaseDecoder._read_headerr   r"   )Úlengthr   c                 C  s   | j d usJ ‚t | j |¡S r‡   )Úfdr   r‹   )rt   rŽ   r   r   r   r‹   :  s    z_BLPBaseDecoder._safe_readzlist[tuple[int, int, int, int]]c              	   C  sb   g }t dƒD ]P}zt d|  d¡¡\}}}}W n tjyH   Y  q^Y n0 | ||||f¡ q|S )Né   ú<4Br(   )r-   r.   rj   r‹   r„   Úappend)rt   r2   r   rC   rB   rA   r@   r   r   r   Ú_read_palette>  s    z_BLPBaseDecoder._read_paletter#   r,   )Úpaletter%   r   c                 C  s„   t ƒ }t|  | jd ¡ƒ}zt d| d¡¡\}W n tjyJ   Y q€Y n0 || \}}}}	|||f}
|rt|
|	f7 }
| |
¡ q|S )Nr   ú<Br   )	r,   r   r‹   r�   r.   rj   rg   r„   r0   )rt   r”   r%   r$   Ú_datary   rC   rB   rA   r@   Údr   r   r   Ú
_read_bgraH  s    


z_BLPBaseDecoder._read_bgraN)r
   r   r   Z	_pulls_fdro   ÚabcÚabstractmethodrƒ   r‚   r‹   r“   r˜   r   r   r   r   r   &  s   	
r   c                   @  s(   e Zd Zddœdd„Zddœdd„ZdS )ÚBLP1Decoderr\   r]   c                 C  s�   | j \| _| _}| jtjkr&|  ¡  nf| jdkrt| jdv rZ|  ¡ }|  ||¡}|  |¡ qŒdt	| jƒ› �}t
|ƒ‚ndt	| jƒ› �}t
|ƒ‚d S )Nr   )r(   r   zUnsupported BLP encoding zUnsupported BLP compression )rx   Ú_compressionÚ	_encodingr	   r   Ú_decode_jpeg_streamr“   r˜   Ú
set_as_rawri   rT   )rt   r%   r”   r$   ru   r   r   r   rƒ   [  s    



zBLP1Decoder._loadc                 C  sÞ   ddl m} t d|  d¡¡\}|  |¡}| jd us8J ‚|  | jd | j ¡  ¡ |  | jd ¡}|| }|t	|ƒƒ}t
 |j¡ |jdkrÄ|jd j}t|tƒs¦J ‚|jd j|d dfd�g|_|  | d¡ ¡ d	¡ d S )
Nr   )ÚJpegImageFilerG   r(   r   ZCMYK)rx   rd   ZBGR)ZJpegImagePluginr    r.   rj   r‹   r�   rŒ   Útellr�   r   r   Z_decompression_bomb_checkrr   Úmoders   rx   Ú
isinstanceÚtupleÚ_replacerŸ   ÚconvertÚtobytes)rt   r    Zjpeg_header_sizeZjpeg_headerr$   Úimagerx   r   r   r   rž   m  s    

zBLP1Decoder._decode_jpeg_streamN)r
   r   r   rƒ   rž   r   r   r   r   r›   Z  s   r›   c                   @  s   e Zd Zd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rd|  
||¡}�qÚ| jtjk�r¨tƒ }| jtjkrÒ| jjd d d }t| jjd d ƒD ]"}t|  |¡|ƒD ]}||7 }qÀq¬nÔ| jtjk�r0| jjd d d }t| jjd d ƒD ]$}t|  |¡ƒD ]}||7 }�q�qnv| jtjk�rŽ| jjd d d }t| jjd d ƒD ]$}t|  |¡ƒD ]}||7 }�qx�qfndt| jƒ› �}t|ƒ‚ndt| jƒ› �}t|ƒ‚nd	t| jƒ› �}t|ƒ‚|  |¡ d S )
Nr   r   r   r(   r'   rE   zUnsupported alpha encoding zUnknown BLP encoding zUnknown BLP compression )rx   rœ   r�   Z_alpha_encodingr“   r�   rk   rŒ   r   r   r˜   r   r,   r   r   ÚstateZxsizer-   ZysizerD   r‹   r   rP   r   rS   ri   rT   rŸ   )rt   r%   r”   r$   ZlinesizeZybr—   ru   r   r   r   rƒ   €  s>    

zBLP2Decoder._loadN)r
   r   r   rƒ   r   r   r   r   r©     s   r©   c                   @  s.   e Zd ZdZddœdd„Zdd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 }q0t|ƒdk r‚|d7 }ql|S )Nó    rc   r(   r   r‘   i   s       )ÚimZ
getpaletter-   r+   r.   Úpack)rt   r$   r”   r   rA   rB   rC   r@   r   r   r   Ú_write_palette²  s     
zBLPEncoder._write_paletter   ztuple[int, int, bytes])Úbufsizer   c           	   
   C  s¬   |   ¡ }dt|ƒ }tjd|gd¢R Ž }| jd us6J ‚| jj\}}|tjd|| gd¢R Ž 7 }||7 }t|ƒD ].}t|ƒD ] }|t d| j ||f¡¡7 }qzqnt|ƒd|fS )Né”   r‰   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r•   r   )r¯   r+   r.   r®   r­   rr   r-   Zgetpixel)	rt   r°   Zpalette_datary   r$   ÚwÚhÚyÚxr   r   r   Úencode½  s     zBLPEncoder.encodeN)r
   r   r   Z
_pushes_fdr¯   r¶   r   r   r   r   r«   ¯  s   r«   zImage.Imagez	IO[bytes]zstr | bytesr\   )r­   rf   Úfilenamer   c              
   C  sB  | j dkrd}t|ƒ‚| j d¡dkr*dnd}| |¡ | jd usFJ ‚| t dd¡¡ | jj d	krhdnd
}|dkrˆ| t d|¡¡ nJ| 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ÚBLP1rV   rW   r^   r   rc   r   z<Lr_   r`   r   r[   re   )r¢   Ú
ValueErrorZencoderinfoÚgetÚwriter”   r.   r®   r   r   rr   r   Ú_saverq   )r­   rf   r·   ru   rh   Zalpha_depthr   r   r   r½   Ð  s&    


r½   z.blpr¹   ZBLP2r[   )F)(r|   Ú
__future__r   r™   rl   r.   Úenumr   Úior   Útypingr   Ú r   r   r	   r   r   r!   rD   rP   rS   ÚNotImplementedErrorrT   rY   rZ   Ú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!