U
    ڲgH                     @  s  d dl mZ d dlZd dlmZ ddlmZmZmZ ddl	m
Z ddl	mZ ddl	mZ dd	l	mZ dd
l	m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jZG dd dejZG dd deZdd d!d"d#d$Zd%d&d'd(d)d*d+Zd4d%d&d'dd(d-d.d/Zeejee eeje e ejd0 e!ejd1 e"d2e eejee eeje e ejd3 e!ejd1 dS )5    )annotationsN)IO   )Image	ImageFileImagePalette)i16le)i32leo8)o16le)o32le)PzP;1)r   zP;4)r   r   )RGBBGR;15)r   BGR)r   BGRX)r                   bytesbool)prefixreturnc                 C  s   | d d dkS )N      BM r   r   r   6/tmp/pip-unpacked-wheel-xela2va7/PIL/BmpImagePlugin.py_accept4   s    r!   c                 C  s   t | dkS )N)   (   4   8   @   l   |   )i32r   r   r   r    _dib_accept8   s    r*   c                   @  s^   e Zd ZdZdZdZdddddd	d
Ze D ]\ZZ	e	e
 e< q.dddZddddZdS )BmpImageFilez0Image plugin for the Windows Bitmap format (BMP)Windows BitmapZBMPr   r   r      r      )RAWRLE8RLE4	BITFIELDSZJPEGZPNGc                 C  s(  | j j| j j }}|r|| t|ddd}t| j |d d }|d dkrt|d|d< t|d|d	< t|d|d
< t|d|d< | j|d< d|d< n|d dkr\|d dk|d< |d rdnd|d< t|d|d< |d st|dndt|d |d	< t|d|d
< t|d|d< t|d|d< t|d|d< t|dt|df|d< t|d|d< d|d< td d! |d D | j	d"< |d | j
krtd#d$d%g}t|d&krt|d'kr|d( nd|d(< t|D ] \}}	t|d)|d  ||	< qn$d|d(< |D ]}	t|d||	< q|d# |d$ |d% f|d*< |d# |d$ |d% |d( f|d+< nd,|d  d-}
t|
|d |d	 f| _|ddr|d n
d|d > |d< |d.|d  kr|d dkr|d|d  7 }t|d d/\| _}| jd0krd1|d  d-}
t|
d2}|d | j
krd3d4d5d6d7d8d9d:gd;gd<d=gd>}d?d@dAdBdCdDdEdDdFdGdHdI}|d |kr|d dJkr|d+ ||d  kr||d |d+ f }dK|krdCn| j| _nF|d dLkr |d* ||d  kr ||d |d* f }ndM}
t|
ndM}
t|
nh|d | jkrP|d dJkr|dNkrdO\}| _n4|d | j| jfkrldP}ndQ|d  d-}
t|
| jdRkrd|d   k rdSksn dT|d  d-}
t|
n|d }|||d  }dU}|d dkrdVntt|d }t|D ]8\}}||| || d  }|t|d krdW}q|rn|d dkr`dXndY| _| j}n"dR| _t|dkrd?ndF|| _|d | j	d< |g}|dPkr||d | jk n"||d |d  dZ d? d[@  ||d  |dd|d |d	 f|p| j  t|fg| _d0S )\z Read relevant info about the BMPr   )header_size	directionr4   r"   r   widthr   heightZplanes   bitscompressionr-   Zpalette_padding)r#   r$   r%   r&   r'   r(         Zy_flipr   r5   l        r   
   r   	data_size   r   Zpixels_per_meter   colorsc                 s  s   | ]}|d  V  qdS )o_C@Nr   .0xr   r   r    	<genexpr>}   s     z'BmpImageFile._bitmap.<locals>.<genexpr>dpiZr_maskZg_maskZb_mask0   r$   Za_mask$   Zrgb_maskZ	rgba_maskzUnsupported BMP header type ()   )NNNzUnsupported BMP pixel depth (raw      r<   r         ~ rN   rO   r   rQ   rO   r<   r   rQ   rN   rO   r<   r<   rO   rN   rQ   rN   rO   r<   rQ   rQ   rO   r<   rN   r   r   r   r   rN   rO   r<   i   i     i |  i  rZ   )r   r   r   r   ZXBGRZBGXRZABGRRGBABGRAZBGARr   zBGR;16r   ))r   rM   )r   rP   )r   rR   )r   rS   )r   rT   )r   rU   )r   rV   )r   rW   )r   rX   )r   rY   )r   r[   r   A)r   r   z Unsupported BMP bitfields layout   )r]   r\   bmp_rlezUnsupported BMP compression (r   i   zUnsupported BMP Palette size (Tr   r<   F1LrZ   )fpreadseekr)   r   
_safe_readi16r/   tupleinfor2   lenappend	enumerateOSError_sizegetBIT2MODE_modemoder0   r1   listranger   r   rL   palettetellZtile)selfheaderoffsetrf   rg   	file_infoZheader_datamasksidxmaskmsgZraw_modeZdecoder_nameZ	SUPPORTEDZ
MASK_MODESpaddingrw   Z	grayscaleindicesindvalZrgbargsr   r   r    _bitmapK   s&   
	




 






 
"zBmpImageFile._bitmapNoner   c                 C  s:   | j d}t|s d}t|t|d}| j|d dS )z-Open file, check magic number and read headerrK   zNot a BMP filer=   )r{   N)re   rf   r!   SyntaxErrorr)   r   )ry   Z	head_datar   r{   r   r   r    _open  s    
zBmpImageFile._openN)r   r   )__name__
__module____qualname____doc__format_descriptionformatZCOMPRESSIONSitemskvvarsr   r   r   r   r   r    r+   ?   s   
 Ur+   c                   @  s    e Zd ZdZdddddZdS )BmpRleDecoderTr   ztuple[int, int])bufferr   c                 C  s  | j d k	st| jd }t }d}| jj| jj }t||k rT| j d}| j d}|r`|sdqT|d }|r|| | jjkrt	d| jj| }|rt
|d d? }	t
|d d@ }
t|D ]"}|d dkr||	7 }q||
7 }qn||| 7 }||7 }q2|d dkr0t|| jj dkr*|d7 }qd}q2|d dkrDqTq2|d dkr| j d}t|dk rpqT| j d\}}|d||| jj   7 }t|| jj }q2|r|d d }| j |}|D ]&}|t
|d? 7 }|t
|d@ 7 }qn|d }| j |}||7 }t||k r$qT||d 7 }| j  d dkr2| j dtj q2| jdkrddnd}| t||d| jd	 f d
S )Nr   r   r      r       rc   r   r3   )r3   r   )fdAssertionErrorr   	bytearraystateZxsizeZysizerl   rf   maxr   rv   rx   rg   osSEEK_CURrt   Z
set_as_rawr   )ry   r   Zrle4datarE   Zdest_lengthZpixelsbyteZ
num_pixelsZfirst_pixelZsecond_pixelindex
bytes_readrightZupZ
byte_countZ	byte_readrawmoder   r   r    decode0  sj    


zBmpRleDecoder.decodeN)r   r   r   Z	_pulls_fdr   r   r   r   r    r   -  s   r   c                   @  s"   e Zd ZdZdZddddZdS )DibImageFileZDIBr,   r   r   c                 C  s   |    d S )N)r   )ry   r   r   r    r   }  s    zDibImageFile._openN)r   r   r   r   r   r   r   r   r   r    r   y  s   r   )rb   r   r   )rc   r      )r   r   r   )r   r   r   )r]   r   r   )rb   rc   r   r   r\   zImage.Imagez	IO[bytes]zstr | bytesr   )imre   filenamer   c                 C  s   t | ||d d S )NF)_save)r   re   r   r   r   r    	_dib_save  s    r   T)r   re   r   bitmap_headerr   c              
   C  s&  zt | j \}}}W n: tk
rN } zd| j d}t||W 5 d }~X Y nX | j}	|	dd}
tdd |
D }| jd | d d	 d
 d@ }d}|| jd  }| jdkrddd dD }nP| jdkrddd t	dD }n,| jdkr| j
dd}t|d }nd }|rjd| |d  }|| }|dkrHd}t||dt| td t|  |t|t| jd  t| jd  td t| td t| t|d  t|d  t| t|  |d|d   |r|| t| |dd| j d||d ffg d S )!Nzcannot write mode z as BMPrG   )`   r   c                 s  s   | ]}t |d  d V  qdS )rB   g      ?N)intrC   r   r   r    rF     s     z_save.<locals>.<genexpr>r   r;   r   r-   rd   r#   r   rb       c                 s  s   | ]}t |d  V  qdS r   Nr
   rD   ir   r   r    rF     s     ra   rc   c                 s  s   | ]}t |d  V  qdS r   r
   r   r   r   r    rF     s     r   r   r   r   r   rK   l    z)File size is too large for the BMP formatr   r   rL   )r   r   r3   )SAVErt   KeyErrorro   Zencoderinforq   rj   sizejoinrv   r   Z
getpaletterl   
ValueErrorwriteo32o16r   r   )r   re   r   r   r   r9   rA   er   rk   rG   ppmZstriderz   imagerw   r{   	file_sizer   r   r    r     sz    




	

r   z.bmpz	image/bmpr`   z.dib)T)#
__future__r   r   typingr    r   r   r   _binaryr   ri   r	   r)   r   r   r   r   r   rr   r!   r*   r+   Z	PyDecoderr   r   r   r   r   Zregister_openr   Zregister_saveZregister_extensionZregister_mimeZregister_decoderr   r   r   r    <module>   sN    oL	 H