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   X/home/www/facesmatcher.com/frenv_anti/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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bool1tuple[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rd|	 | d }d|
 | d }d| | d }q|	| d }|
| d }|| d }n'|dkr||krd| |	 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   "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rd	|
 | d }d	| | d }d	| | d }n|dkrd	| |
 d }d	| | d }d	| | d }|| ||||g qSqKq|S )r*      z<8B<HHr+   <I   r,   Fr   T      r   r   r   r.   )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rd| | |d |  d }n|dkrd
}n|dkrd}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-   r.   )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  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rtd| j dd }| j dt	j
 |||f}d}n||||f}d}| j }|rd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   2  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   6  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_bgraH  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   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   r`   c                 C  s  | j \| _| _}| _|  }| jd usJ | j| jd  | jdkr| jtj	kr0| 
||}q| jtjkrt }| jtjkrf| jjd d d }t| jjd d D ]}t| ||D ]}||7 }q]qSq| jtjkr| jjd d d }t| jjd d D ]}t| |D ]}||7 }qqq| jtjkr| jjd d d }t| jjd d D ]}t| |D ]}||7 }qqqd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     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    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
!