B
    zb?                 @   sT  d dl 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 Z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! Zd)d#d$Zeejee eeje eejd% eejd& ed'e eejee eeje eejd( eejd& dS )*    N   )Image	ImageFileImagePalette)i16le)i32le)o8)o16le)o32le)PzP;1)r   zP;4)r   r   )RGBzBGR;15)r   BGR)r   BGRX)r                   c             C   s   | d d dkS )N   s   BM )prefixr   r   1lib/python3.7/site-packages/PIL/BmpImagePlugin.py_accept3   s    r   c             C   s   t | dkS )N)   (   @   l   |   )i32)r   r   r   r   _dib_accept7   s    r   c               @   s\   e Zd ZdZdZdZdddddd	d
Zxe D ]\ZZ	e	e
 e< q0W dddZdd ZdS )BmpImageFilez0Image plugin for the Windows Bitmap format (BMP)zWindows BitmapZBMPr   r   r      r      )RAWRLE8Z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rTt|d#krx^td$d%d&d'gD ] \}}t|d(|d  ||< qW n(d|d'< xd)D ]}t|d||< qW |d$ |d% |d& f|d*< |d$ |d% |d& |d' f|d+< ntd,|d  d-|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rtd1|d  d-d2}
|d | j
krd3d4d5d6d7gd8gd9d:gd;}d<d=d>d?d?d@dAdBdC}|d |kr|d dDkr|d+ ||d  kr||d |d+ f }	dE|	krd>n| j| _nB|d dFkr|d* ||d  kr||d |d* f }	ntdGntdGn^|d | jkr|d dDkrB|dHkrBdI\}	| _n*|d | jkr.dJ}
ntdK|d  d-| jdLkrNd|d   k rjdMksn tdN|d  d-n|d }|||d  }dO}|d dkrdPntt|d }xDt|D ]8\}}||| || d  }|t|d krdQ}qW |r,|d dkrdRndS| _| j}	n"dL| _t|dkrDd<nd@|| _|d | j	d< |
dd|d |d	 f|p~| j  |	|d |d  dT d? dU@ |d ffg| _d0S )Vz Read relevant info about the BMPr   )header_size	directionr'   r   r   widthr   ZheightZplanes   bitsZcompressionr!   Zpalette_padding)r   r   r   r         Zy_flipr   r(   l        r   
   r   Z	data_size   r   Zpixels_per_meter   colorsc             s   s   | ]}|d  V  qdS )go_C@Nr   ).0xr   r   r   	<genexpr>v   s    z'BmpImageFile._bitmap.<locals>.<genexpr>dpi4   r_maskg_maskb_maskZa_mask$   )r7   r8   r9   Zrgb_maskZ	rgba_maskzUnsupported BMP header type ()   )NNNzUnsupported BMP pixel depth (raw)i   i   r-   r   )i   i   r-   l      ~ )r-   i   i   l      ~ )r   r   r   r   )l      ~ i   i   r   )i   i   r-   )i   i     )i |  i  r>   )r   r   r   r   ZXBGRRGBABGRAr   zBGR;16zBGR;15))r   )i   i   r-   r   )r   )l      ~ i   i   r   )r   )r-   i   i   l      ~ )r   )i   i   r-   l      ~ )r   )r   r   r   r   )r   )i   i   r-   )r   )i   i  r>   )r   )i |  i  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Lr>   )fpreadseekr   r   Z
_safe_readi16r#   tupleinfor%   len	enumerateOSErrorZ_sizegetBIT2MODEmoder$   listranger   r   r=   palettetellZtile)selfheaderoffsetrH   rI   	file_infoZheader_dataidxmaskZraw_modeZdecoder_nameZ	SUPPORTEDZ
MASK_MODESZpaddingrU   Z	greyscaleindicesZindvalZrgbr   r   r   _bitmapJ   s    


 


zBmpImageFile._bitmapc             C   s6   | j d}t|stdt|d}| j|d dS )z-Open file, check magic number and read headerr<   zNot a BMP filer.   )rY   N)rG   rH   r   SyntaxErrorr   r_   )rW   Z	head_datarY   r   r   r   _open  s
    
zBmpImageFile._openN)r   r   )__name__
__module____qualname____doc__format_descriptionformatZCOMPRESSIONSitemskvvarsr_   ra   r   r   r   r   r    >   s   
 ?r    c               @   s   e Zd ZdZdd ZdS )BmpRleDecoderTc             C   s  t  }d}xt|| jj| jj k r| jd}| jd}|rH|sJP |d }|r|| | jjkrxtd| jj| }||| 7 }||7 }q|d dkrx t|| jj dkr|d7 }qW d}q|d dkrP q|d dkr4| jd}t|dk rP | jd\}}	|d||	| jj   7 }t|| jj }q| j|d }||7 }t||d k r`P ||d 7 }| j d dkr| j	dt
j qW | jdkrdnd}
| t||
d| jd f dS )	Nr   r       r   rE   r   r&   )r&   r   )	bytearrayrM   stateZxsizeZysizefdrH   maxrV   rI   osSEEK_CURrR   Z
set_as_rawbytesargs)rW   bufferdatar3   ZpixelsZbyteZ
num_pixelsZ
bytes_readrightZuprawmoder   r   r   decode  sH    
zBmpRleDecoder.decodeN)rb   rc   rd   Z	_pulls_fdrz   r   r   r   r   rl     s   rl   c               @   s   e Zd ZdZdZdd ZdS )DibImageFileZDIBzWindows Bitmapc             C   s   |    d S )N)r_   )rW   r   r   r   ra   Q  s    zDibImageFile._openN)rb   rc   rd   rg   rf   ra   r   r   r   r   r{   L  s   r{   )rD   r   r   )rE   r      )r   r   r|   )r   r   r   )r@   r   r   )rD   rE   r   r   r?   c             C   s   t | ||d d S )NF)_save)imrG   filenamer   r   r   	_dib_savec  s    r   Tc          
   C   s  yt | j \}}}W n6 tk
rJ } ztd| j d|W d d }~X Y nX | j}|dd}	ttdd |	}
| jd | d d	 d
 d@ }d}|| jd  }|rd| |d  }|| }|dkrt	d|
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   | jdkrxvdD ]}|
t|d  qW nT| jdkrxFtdD ]}|
t|d  qW n | jdkr|
| jdd t| |dd| j d||dffg d S )Nzcannot write mode z as BMPr5   )`   r   c             S   s   t | d d S )Ngo_C@g      ?)int)r3   r   r   r   <lambda>r      z_save.<locals>.<lambda>r   r,   r   r!   rF   r   r   r<   r   l    z)File size is too large for the BMP formats   BMrm   rD   )r   r-   rE   r|   r   r   r   r=   )r   r   r&   )SAVErR   KeyErrorrO   ZencoderinforP   rK   mapsize
ValueErrorwriteo32o16r   rT   r~   Z
getpaletter   r}   )r~   rG   r   Zbitmap_headerry   r+   r1   erL   r5   ZppmZstriderX   ZimagerY   Z	file_sizeir   r   r   r}   g  s:    &n
r}   z.bmpz	image/bmprC   z.dib)T)rr    r   r   r   Z_binaryr   rJ   r   r   r   r	   r   r
   r   rQ   r   r   r    Z	PyDecoderrl   r{   r   r   r}   Zregister_openrg   Zregister_saveZregister_extensionZregister_mimeZregister_decoderr   r   r   r   <module>   sD    X7
@