3
	jQc9                 @   s   d Z ddlZddlmZ ddlmZmZ dZdZdZ	dZ
dZdZdZd	d
 Zd!ddZdd Zdd ZG dd de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ejejedd  ejejd ejde ej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)BytesIO   )Image	ImageFile         c             C   s*   | d? d@ d> | d? d@ d> | d@ d> fS )N      r      ?   r    )ir   r   4/usr/lib/python3/dist-packages/PIL/BlpImagePlugin.py
unpack_5651   s    r   Fc             C   s  t | d }t t t t f}xt|D ]}|d }tjd| ||d  \}}}t|\}	}
}t|\}}}x`tdD ]R}xJtdD ]<}|d@ }|d? }d}|dkr|	|
|  }}}n|dkr|||  }}}n|dkrL||kr&d|	 | d }d|
 | d }d| | d }n$|	| d }|
| d }|| d }nR|dkr||krd| |	 d }d| |
 d }d| | d }nd	\}}}}|r|| j||||g q|| j|||g qW qW q,W |S )
zE
    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unpackr   extend)dataalphablocksretblockidxcolor0color1bitsr0g0b0r1g1b1jr   Zcontrolargbr   r   r   decode_dxt19   sD    



 r.   c             C   s  t | d }t t t t f}xt|D ]}|d }| ||d  }tjd|dd }tjd|dd \}}tjd|dd \}t|\}	}
}t|\}}}xFtdD ]8}d	}x,tdD ]}d| | d
 }|| }|rd	}|dL }nd}|dM }|d9 }|d
d| |  ? d@ }|dkrB|	|
|  }}}n|dkr^|||  }}}nv|d
krd
|	 | d }d
|
 | d }d
| | d }n:|dkrd
| |	 d }d
| |
 d }d
| | d }|| j||||g qW qW q,W |S )zE
    input: one "row" of data (i.e. will produce 4*width pixels)
       z<8BNr   z<HH   z<Ir   Fr   T      r   r   r   )r   r   r   r   r   r   r   )r   r   r   r   r   r"   r    r!   coder#   r$   r%   r&   r'   r(   r)   Zhighr   alphacode_indexr*   
color_coder+   r,   r-   r   r   r   decode_dxt3p   sH    




"r6   c             C   s  t | d }t t t t f}xt|D ]}|d }| ||d  }tjd|dd \}}tjd|dd }|d |d d> B |d d> B |d	 d
> B }|d |d d> B }	tjd|dd \}
}tjd|dd \}t|
\}}}t|\}}}xtdD ]}xtdD ]}dd| |  }|dkrL|	|? d@ }n0|dkrl|	d? |d> d@ B }n||d ? d@ }|dkr|}nt|dkr|}nd||krd| | |d |  d }n<|dkrd}n,|dkrd}nd| | |d |  d	 }|dd| |  ? d@ }|dkr4|||  }}}n|dkrP|||  }}}nv|dkrd| | d }d| | d }d| | d }n:|dkrd| | d }d| | d }d| | d }|| j||||g qW qW q,W |S )zG
    input: one "row" of data (i.e. will produce 4 * width pixels)
    r/   z<BBNr   z<6Br   r   r   r      r   r   z<HHr0   z<Ir   r1      r   )r   r   r   r   r   r   r   )r   r   r   r   r   Za0Za1r"   Z
alphacode1Z
alphacode2r    r!   r3   r#   r$   r%   r&   r'   r(   r)   r   r4   Z	alphacoder*   r5   r+   r,   r-   r   r   r   decode_dxt5   s^    ,










&r9   c               @   s   e Zd ZdS )BLPFormatErrorN)__name__
__module____qualname__r   r   r   r   r:      s   r:   c               @   s(   e Zd ZdZdZdZdd Zdd ZdS )	BlpImageFilez 
    Blizzard Mipmap Format
    ZBLPzBlizzard Mipmap Formatc             C   s|   | j jd| _| j  | jdkr,d}d| _n.| jdkrLd}| jrDdnd| _ntd| j |d| j d	| jd	d
ffg| _d S )Nr   s   BLP1BLP1ZRGBs   BLP2BLP2ZRGBAzBad BLP magic %rr   r   )r   r   )	fpreadmagic_read_blp_headermode_blp_alpha_depthr:   sizetile)selfdecoderr   r   r   _open   s    

zBlpImageFile._openc             C   s   t jd| jjd\| _t jd| jjd\| _t jd| jjd\| _t jd| jjd\| _t jd| jjd\| _t jd| jjd| _	| j
dkrt jd| jjd\| _t jd| jjd\| _t jd| jjd
| _t jd| jjd| _d S )Nz<ir   z<br   z<IIr   s   BLP1z<16Ir/   @   rL   )r   r   rA   rB   _blp_compression_blp_encodingrF   _blp_alpha_encoding	_blp_mipsrG   rC   _blp_subtype_blp_offsets_blp_lengths)rI   r   r   r   rD   	  s    
zBlpImageFile._read_blp_headerN)r;   r<   r=   __doc__formatZformat_descriptionrK   rD   r   r   r   r   r>      s
   r>   c               @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )_BLPBaseDecoderTc             C   sR   y.| j jd | j jd| _| j  | j  W n tjk
rL   tdY nX dS )Nr   r   zTruncated Blp file)r   r   )	fdseekrB   rC   rD   _loadr   errorIOError)rI   bufferr   r   r   decode  s    z_BLPBaseDecoder.decodec             C   s   t j| j|S )N)r   
_safe_readrW   )rI   Zlengthr   r   r   r^   )  s    z_BLPBaseDecoder._safe_readc             C   sd   g }xZt dD ]N}ytjd| jd\}}}}W n tjk
rH   P Y nX |j||||f qW |S )N   z<4Br   )r   r   r   r^   rZ   append)rI   r   r   r-   r,   r+   r*   r   r   r   _read_palette,  s    z_BLPBaseDecoder._read_palettec             C   s   t jd| jd\| _t jd| jd\| _t jd| jd\| _t jd| jd\| _t jd| jd\| _t jd| jd| _| j	dkrt jd| jd\| _t jd| jd\| _
t jd| jd
| _t jd| jd| _d S )Nz<ir   z<br   z<IIr   s   BLP1z<16Ir/   rL   rL   )r   r   r^   rM   rN   rF   rO   rP   rG   rC   rQ   rR   rS   )rI   r   r   r   rD   6  s    
z _BLPBaseDecoder._read_blp_headerN)r;   r<   r=   Z	_pulls_fdr]   r^   ra   rD   r   r   r   r   rV     s
   

rV   c               @   s   e Zd Zdd Zdd ZdS )BLP1Decoderc       	      C   s   | j tkr| j  n| j dkr| jdkrt }| j }t| j| jd }xVyt	j
d|jd\}W n t	jk
r|   P Y nX || \}}}}|j|||g qLW | jt| qtd| j ntd| j d S )	Nr   r   r   r   z<BzUnsupported BLP encoding %rzUnsupported BLP compression %r)r   r   )rM   BLP_FORMAT_JPEG_decode_jpeg_streamrN   r   ra   r   r^   rS   r   r   rB   rZ   r   
set_as_rawbytesr:   )	rI   r   palette_dataoffsetr-   r,   r+   r*   r   r   r   rY   K  s&    



zBLP1Decoder._loadc             C   s   ddl m} tjd| jd\}| j|}| j| jd | jj   | j| jd }|| }t	|}||}t
j|j |j| _|j| _|j| _d S )Nr   )JpegImageFilez<Ir   )ZPIL.JpegImagePluginrj   r   r   r^   rR   rW   tellrS   r   r   Z_decompression_bomb_checkrG   rH   rA   rE   )rI   rj   Zjpeg_header_sizeZjpeg_headerr   Zimager   r   r   rd   f  s    
zBLP1Decoder._decode_jpeg_streamN)r;   r<   r=   rY   rd   r   r   r   r   rb   I  s   rb   c               @   s   e Zd Zdd ZdS )BLP2Decoderc             C   s2  | j  }t }| jj| jd  | jdkr| jtkrt| j	| j
d }xVytjd|jd\}W n tjk
r|   P Y nX || \}}}}|j|||f qLW q | jtkr| jtkr"| jd d d d }	xJt| jd d d D ]0}
x*t| j	|	t| jdD ]}||7 }q
W qW n| jtkr| jd d d d }	xt| jd d d D ](}
x t| j	|	D ]}||7 }qpW q\W nv| jtkr| jd d d d }	xRt| jd d d D ](}
x t| j	|	D ]}||7 }qW qW ntd	| j ntd
| j ntd| j | jt| d S )Nr   r   z<Br   r   r   )r   r/   zUnsupported alpha encoding %rzUnknown BLP encoding %rzUnknown BLP compression %r)ra   r   rW   rX   rR   rM   rN   BLP_ENCODING_UNCOMPRESSEDr   r^   rS   r   r   rB   rZ   r   BLP_ENCODING_DXTrO   BLP_ALPHA_ENCODING_DXT1rG   r   r.   boolrF   BLP_ALPHA_ENCODING_DXT3r6   BLP_ALPHA_ENCODING_DXT5r9   r:   re   rf   )rI   rg   r   rh   ri   r-   r,   r+   r*   ZlinesizeZybdr   r   r   rY   x  sL    
zBLP2Decoder._loadN)r;   r<   r=   rY   r   r   r   r   rl   v  s   rl   c             C   s   | d d dkS )Nr      BLP1   BLP2)rt   ru   r   )pr   r   r   <lambda>  s    rw   z.blpr?   r@   )F)rT   r   ior    r   r   rc   rm   rn   Z"BLP_ENCODING_UNCOMPRESSED_RAW_BGRAro   rq   rr   r   r.   r6   r9   NotImplementedErrorr:   r>   Z	PyDecoderrV   rb   rl   Zregister_openrU   Zregister_extensionZregister_decoderr   r   r   r   <module>   s0   
75H+--;