o
    tBh?                     @   sj  d 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	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 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&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   i/var/www/html/riverr-enterprise-integrations-main/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   -       r   c                   @   r   )AlphaEncodingr   r      N)r   r	   r
   DXT1DXT3DXT5r   r   r   r   r   3   r   r   c                 C   s   d}t dtdtdi D ]5\}}| |rA| t|d  } | |jv rAtj||  d | d |j	 d |  d t
d	d
 ||    S qtdt	 d|  d)Nz:deprecated and will be removed in Pillow 10 (2023-07-01). BLP_FORMAT_BLP_ENCODING_BLP_ALPHA_ENCODING_z is zUse .z	 instead.r   )
stacklevelzmodule 'z' has no attribute '')r   r   r   items
startswithlen__members__warningswarnr   DeprecationWarningAttributeError)name
deprecatedenumprefixr   r   r   __getattr__9   sD   


	r-   c                 C   s*   | d? d@ d> | d? d@ d> | d@ d> fS )N      r      ?   r   r   )ir   r   r   
unpack_565T   s   *r3   Fc              	   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 }n:|	| 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   r#   	bytearrayrangestructunpack_fromr3   extend)dataalphablocksretblockidxcolor0color1bitsr0g0b0r1g1b1jr2   controlargbr   r   r   decode_dxt1X   sH   "rS   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 )r4      z<8B<HHr5   <I   r6   Fr   T      r   r   r   r8   )r>   r@   rA   rB   rC   rF   rD   rE   coderG   rH   rI   rJ   rK   rL   rM   highr2   alphacode_indexrO   
color_coderP   rQ   rR   r   r   r   decode_dxt3   sL   
r^   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)
    rT   z<BBz<6Br   r   r5   r6   r0      r   r   rU   rV   rW   r   rX      r7   r8   )r>   r@   rA   rB   rC   a0a1rF   
alphacode1
alphacode2rD   rE   rZ   rG   rH   rI   rJ   rK   rL   rM   r2   r\   	alphacoderO   r]   rP   rQ   rR   r   r   r   decode_dxt5   sb   ,


*rf   c                   @   s   e Zd ZdS )BLPFormatErrorN)r   r	   r
   r   r   r   r   rg   
  s    rg   c                 C   s   | d d dv S )Nr6      BLP1   BLP2r   )r,   r   r   r   _accept  s   rk   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 r9| j
 }n
td	t| j | jrHd
nd| _|d| j d| jddffg| _d S )Nr6   r0   <br   r   <IIr5   rh   zBad BLP magic RGBARGBr   r   r   )fpreadmagicseekosSEEK_CURr;   unpack_blp_alpha_depth_sizedecoderg   reprmodesizetile)selfdecoderr   r   r   _open  s   
"zBlpImageFile._openN)r   r	   r
   __doc__formatformat_descriptionr   r   r   r   r   rl     s
    rl   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   s<   z|    |   W dS  tjy } ztd|d }~ww )NzTruncated BLP file)r   )_read_blp_header_loadr;   errorOSError)r   bufferer   r   r   r|   /  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 )	Nr6   <irn   r   ro   r5   <16I@   )fdrv   r;   ry   
_safe_read_blp_compression_blp_encodingrz   _blp_alpha_encodingrw   rx   r   
isinstanceBLP1Decoder_blp_offsets_blp_lengths)r   r   r   r   r   7  s   
z _BLPBaseDecoder._read_blp_headerc                 C   s   t | j|S )N)r   r   r   )r   lengthr   r   r   r   J  s   z_BLPBaseDecoder._safe_readc              	   C   s`   g }t dD ]'}ztd| d\}}}}W n tjy#   Y  |S w |||||f q|S )N   <4Br6   )r:   r;   ry   r   r   append)r   rA   r2   rR   rQ   rP   rO   r   r   r   _read_paletteM  s   z_BLPBaseDecoder._read_palettec           
      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   )
r9   r   r   r   r;   ry   rt   r   rz   r=   )
r   paletter>   _dataoffsetrR   rQ   rP   rO   dr   r   r   
_read_bgraW  s   


z_BLPBaseDecoder._read_bgraN)	r   r	   r
   	_pulls_fdr|   r   r   r   r   r   r   r   r   r   ,  s    
r   c                   @   s   e Zd Zdd Zdd ZdS )r   c                 C   sx   | j tjkr|   d S | j dkr2| jdv r(|  }| |}| t| d S t	dt
| j t	dt
| j )Nr   )r6   r0   zUnsupported BLP encoding zUnsupported BLP compression )r   r   r   _decode_jpeg_streamr   r   r   
set_as_rawbytesrg   r}   )r   r   r>   r   r   r   r   h  s   


zBLP1Decoder._loadc                 C   s   ddl m} td| d\}| |}| | jd | j   | | jd }|| }t	|}||}t
|j d|_dd| j dd	fg|_| |  d S )
Nr   )JpegImageFilerV   r6   r   rq   jpegrr   )BGRX )JpegImagePluginr   r;   ry   r   r   r   tellr   r   r   _decompression_bomb_checkr   r~   r   r   tobytes)r   r   jpeg_header_sizejpeg_headerr>   imager   r   r   r   z  s   
zBLP1Decoder._decode_jpeg_streamN)r   r	   r
   r   r   r   r   r   r   r   g  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| |}n| jtj	krt
 }| jtjkrZ| jd d d d }t| jd d d D ]}t| |t| jdD ]}||7 }qQqCnz| jtjkr| jd d d d }t| jd d d D ]}t| |D ]}||7 }qqvnL| jtjkr| jd d d d }t| jd d d D ]}t| |D ]}||7 }qqntdt| j td	t| j td
t| j | t| d S )Nr   r   r   r6   r5   )r?   rT   zUnsupported alpha encoding zUnknown BLP encoding zUnknown BLP compression )r   r   rv   r   r   r   r   r   r   r   r9   r   r   r   r   r:   rS   r   boolrz   r   r^   r   rf   rg   r}   r   r   )r   r   r>   linesizeybr   r   r   r   r     sL   




zBLP2Decoder._loadN)r   r	   r
   r   r   r   r   r   r     s    r   c                   @   s    e Zd ZdZdd Zdd ZdS )
BLPEncoderTc              	   C   sZ   d}| j dd}tdD ]}||d |d d  \}}}}|td||||7 }q|S )N    rp   r   r6   r   r   )im
getpaletter:   r;   pack)r   r>   r   r2   rP   rQ   rR   rO   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 }q6q0t|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   r   r:   getpixel)	r   bufsize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	td| 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rs|tdd |tdd t| |dd| j
 d| j fg d S )NPzUnsupported BLP image modeblp_versionBLP1ri   rj   r   r   rn   rp   r   ro   r0   rm   rr   )r~   
ValueErrorencoderinfogetwriter;   r   r   r   r   r   r   _save)r   rs   filenamesave_allru   r   r   r   r     s   

"$r   z.blpr   BLP2rm   )F)$r   rw   r;   r%   r+   r   ior   r   r   r   r   r   r   r-   r3   rS   r^   rf   NotImplementedErrorrg   rk   rl   	PyDecoderr   r   r   	PyEncoderr   r   register_openr   register_extensionregister_decoderregister_saveregister_encoderr   r   r   r   <module>   s:    
75F;#0
