a
    ¥Q•h®<  ã                   @   sX  d Z ddlZddl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„ Zd*dd„Zdd„ Zdd„ ZG dd„ deƒZd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d$d%„ Ze ejee¡ e ejd&¡ e d'e¡ e d(e¡ e  eje¡ e !d)e¡ 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.
é    N)ÚIntEnum)ÚBytesIOé   )ÚImageÚ	ImageFilec                   @   s   e Zd ZdZdS )ÚFormatr   N)Ú__name__Ú
__module__Ú__qualname__ÚJPEG© r   r   úK/var/www/sistema_ama/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   ,   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   2   s   r   c                 C   s*   | d? d@ d> | d? d@ d> | d@ d> fS )Né   é   r   é   é?   r   r   )Úir   r   r   Ú
unpack_5658   s    r   Fc              	   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)ÚdataÚalphaÚblocksÚretÚblockÚidxÚcolor0Úcolor1ÚbitsÚr0Úg0Úb0Úr1Úg1Úb1Újr   ÚcontrolÚaÚrÚgÚbr   r   r   Údecode_dxt1<   sD    



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)   r+   r,   r-   r.   r1   r/   r0   Úcoder2   r3   r4   r5   r6   r7   r8   Úhighr   Úalphacode_indexr:   Ú
color_coder;   r<   r=   r   r   r   Údecode_dxt3s   sH    




rI   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)
    r?   z<BBz<6Br   r   r   r    r   é   r   r   r@   rA   rB   r   rC   é   r!   r"   )r)   r+   r,   r-   r.   Úa0Úa1r1   Z
alphacode1Z
alphacode2r/   r0   rE   r2   r3   r4   r5   r6   r7   r8   r   rG   Z	alphacoder:   rH   r;   r<   r=   r   r   r   Údecode_dxt5¨   s^    ,










rN   c                   @   s   e Zd ZdS )ÚBLPFormatErrorN)r   r	   r
   r   r   r   r   rO   î   s   rO   c                 C   s   | d d… dv S )Nr    ©ó   BLP1ó   BLP2r   )Úprefixr   r   r   Ú_acceptò   s    rT   c                   @   s    e Zd ZdZdZdZdd„ ZdS )ÚBlpImageFilez 
    Blizzard Mipmap Format
    ÚBLPzBlizzard Mipmap Formatc                 C   s¼   | j  d¡| _| j  dtj¡ t d| j  d¡¡\| _| j  dtj¡ t d| j  d¡¡| _	| jdv rr| j 
¡ }nd	t| jƒ› }t|ƒ‚| jr”d
nd| _|d| j d| jddffg| _d S )Nr    r   ú<br   r   ú<IIr   rP   zBad BLP magic ÚRGBAÚRGB©r   r   r   )ÚfpÚreadÚmagicÚseekÚosÚSEEK_CURr&   ÚunpackÚ_blp_alpha_depthÚ_sizeÚdecodeÚreprrO   Ú_modeÚsizeÚmodeÚtile)ÚselfÚdecoderÚmsgr   r   r   Ú_openþ   s    
zBlpImageFile._openN)r   r	   r
   Ú__doc__ÚformatÚformat_descriptionrn   r   r   r   r   rU   ö   s   rU   c                   @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )Ú_BLPBaseDecoderTc              
   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_blp_headerÚ_loadr&   ÚerrorÚOSError)rk   ÚbufferÚerm   r   r   r   re     s     z_BLPBaseDecoder.decodec                 C   sä   | j  d¡ t d|  d¡¡\| _t d|  d¡¡\| _t d|  d¡¡\| _t d|  d¡¡\| _| j  dt	j
¡ t d|  d¡¡| _t| tƒr¸t d|  d¡¡\| _| j  dt	j
¡ t d|  d¡¡| _t d|  d¡¡| _d S )	Nr    ú<irW   r   rX   r   ú<16Ié@   )Úfdr_   r&   rb   Ú
_safe_readÚ_blp_compressionÚ_blp_encodingrc   Ú_blp_alpha_encodingr`   ra   rh   Ú
isinstanceÚBLP1DecoderÚ_blp_offsetsÚ_blp_lengths)rk   r   r   r   rt     s    
z _BLPBaseDecoder._read_blp_headerc                 C   s   t  | j|¡S )N)r   r~   r}   )rk   Úlengthr   r   r   r~   0  s    z_BLPBaseDecoder._safe_readc              	   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&   rb   r~   rv   Úappend)rk   r,   r   r=   r<   r;   r:   r   r   r   Ú_read_palette3  s    z_BLPBaseDecoder._read_palettec           
      C   s†   t ƒ }t|  | jd ¡ƒ}zt d| d¡¡\}W n tjyJ   Y q‚Y n0 || \}}}}|||f}	| jrv|	|f7 }	| 	|	¡ q|S )Nr   ú<Br   )
r$   r   r~   r…   r&   rb   r]   rv   rc   r(   )
rk   Úpaletter)   Ú_dataÚoffsetr=   r<   r;   r:   Údr   r   r   Ú
_read_bgra=  s    


z_BLPBaseDecoder._read_bgraN)	r   r	   r
   Ú	_pulls_fdre   rt   r~   rŠ   r   r   r   r   r   rr     s   	
rr   c                   @   s   e Zd Zdd„ Zdd„ ZdS )rƒ   c                 C   s‚   | j tjkr|  ¡  nh| j dkrf| jdv rL|  ¡ }|  |¡}|  t|ƒ¡ q~dt	| jƒ› }t
|ƒ‚ndt	| jƒ› }t
|ƒ‚d S )Nr   )r    r   zUnsupported BLP encoding zUnsupported BLP compression )r   r   r   Ú_decode_jpeg_streamr€   rŠ   r   Ú
set_as_rawÚbytesrf   rO   )rk   rŒ   r)   rm   r   r   r   ru   N  s    




zBLP1Decoder._loadc                 C   sä   ddl m} t d|  d¡¡\}|  |¡}|  | 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   )ÚJpegImageFilerA   r    r   ÚCMYKrZ   )ÚJpegImagePluginr•   r&   rb   r~   r„   r}   Útellr…   r   r   Ú_decompression_bomb_checkrh   ri   rj   ÚconvertÚsplitÚmerger“   Útobytes)rk   r•   Zjpeg_header_sizeZjpeg_headerr)   ÚimageÚdecoder_nameÚextentsrŽ   Úargsr;   r<   r=   r   r   r   r’   ^  s    

zBLP1Decoder._decode_jpeg_streamN)r   r	   r
   ru   r’   r   r   r   r   rƒ   M  s   rƒ   c                   @   s   e Zd Zdd„ ZdS )ÚBLP2Decoderc                 C   sÚ  |   ¡ }| j | jd ¡ | jdkr°| jtjkr@|  |¡}qÈ| jtj	kr–t
ƒ }| jtjkrº| jd d d d }t| jd d d ƒD ]*}t|  |¡t| jƒdD ]}||7 }q¨qŒnÚ| jtjkr| jd d d d }t| jd d d ƒD ]"}t|  |¡ƒD ]}||7 }qqônz| jtjkr|| jd d d d }t| jd d d ƒD ]$}t|  |¡ƒD ]}||7 }qfqTndt| jƒ› }t|ƒ‚nd	t| jƒ› }t|ƒ‚nd
t| jƒ› }t|ƒ‚|  t|ƒ¡ d S )Nr   r   r   r    r   )r*   r?   zUnsupported alpha encoding zUnknown BLP encoding zUnknown BLP compression )rŠ   r}   r_   r„   r   r€   r   r   r   r   r$   r   r   r   rh   r%   r>   r~   Úboolrc   r   rI   r   rN   rf   rO   r“   r”   )rk   rŒ   r)   ZlinesizeÚybr   rm   r   r   r   ru   r  s>    ÿ


zBLP2Decoder._loadN)r   r	   r
   ru   r   r   r   r   r¢   q  s   r¢   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )Ú
BLPEncoderTc              	   C   sx   d}| j  dd¡}tt|ƒd ƒD ]:}||d |d d … \}}}}|t d||||¡7 }q"t|ƒdk rt|d7 }q^|S )Nó    rY   r    r   rˆ   i   s       )ÚimÚ
getpaletter%   r#   r&   Úpack)rk   r)   rŒ   r   r;   r<   r=   r:   r   r   r   Ú_write_palette£  s     
zBLPEncoder._write_palettec           	   
   C   sž   |   ¡ }dt|ƒ }tjd|gd¢R Ž }| jj\}}|tjd|| gd¢R Ž 7 }||7 }t|ƒD ].}t|ƒD ] }|t d| j ||f¡¡7 }qlq`t|ƒ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§   rh   r%   Úgetpixel)	rk   ÚbufsizeZpalette_datarŽ   r)   ÚwÚhÚyÚxr   r   r   Úencode­  s     zBLPEncoder.encodeN)r   r	   r
   Ú
_pushes_fdrª   r²   r   r   r   r   r¥      s   
r¥   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rxdnd¡¡ | t d	d¡¡ | t d	d¡¡ | tjdg| j
¢R Ž ¡ |dkrê| t dd¡¡ | t dd¡¡ t | |dd| j
 d| j fg¡ d S )NÚPzUnsupported BLP image modeZblp_versionÚBLP1rQ   rR   rz   r   rW   rY   r   rX   r   rV   r[   )ri   Ú
ValueErrorÚencoderinfoÚgetÚwriter&   r©   r   r   rŒ   rh   r   Ú_save)r§   r\   Úfilenamerm   r^   r   r   r   rº   ¿  s    

"rº   z.blprµ   ZBLP2rV   )F)"ro   r`   r&   Úenumr   Úior   Ú r   r   r   r   r   r   r>   rI   rN   ÚNotImplementedErrorrO   rT   rU   Ú	PyDecoderrr   rƒ   r¢   Ú	PyEncoderr¥   rº   Úregister_openrp   Úregister_extensionÚregister_decoderÚregister_saveÚregister_encoderr   r   r   r   Ú<module>   s4   
75F<$/