U
    &^8                     @   s  d dl mZmZmZ d dlmZmZmZ	m
Z
mZ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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ejee eeje eejd eejd d S )"   )Image	ImageFileImagePalette)i8i16lei32leo8o16leo32le)PzP;1)r   zP;4)r   r   )RGBBGR;15)r   BGR)r   BGRX)r                   c                 C   s   | d d dkS )N      BM prefixr   r   6/tmp/pip-install-a1j0c_p1/Pillow/PIL/BmpImagePlugin.py_accept-   s    r   c                 C   s   t | d d dkS )Nr   )   (   @   l   |   )i32r   r   r   r   _dib_accept1   s    r"   c                   @   sX   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 ZdS )BmpImageFilez2 Image plugin for the Windows Bitmap format (BMP) Windows BitmapZBMP    r   r      r      )RAWZRLE8ZRLE4	BITFIELDSZJPEGZPNGc              	   C   s  | j j| j j }}|r|| i }t|d|d< d|d< t| j |d d }|d dkrt|dd |d< t|dd |d	< t|dd
 |d< t|d
d |d< | j|d< d|d< n|d dkrt|d dk|d< |d rdnd|d< t|dd |d< |d s&t|dd ndt|dd  |d	< t|dd |d< t|dd |d< t|dd |d< t|dd |d< t|dd t|dd f|d< t|dd |d< d|d< t	d d! |d D | j
d"< |d | jkrt|d#krJtd$d%d&d'gD ].\}}t|d(|d  d)|d   ||< qn$d|d'< d*D ]}t|d||< qV|d$ |d% |d& f|d+< |d$ |d% |d& |d' f|d,< ntd-|d  |d |d	 f| _|ddr|d n
d|d > |d< |d |d	  d.krtd/| j t|d d0\| _}	| jd1krHtd2|d  |d | jkr6d3d4d5d6d7gd8gd9d:gd;}
d<d=d>d?d?d@dAdBdC}|d |
kr,|d dkr|d, |
|d  kr||d |d, f }	dD|	krd>n| j| _nB|d dEkr"|d+ |
|d  kr"||d |d+ f }	ntdFntdFnD|d | jkrj|d dkrz|dGkrzdH\}	| _ntdI|d  | jdJkr~d|d   k rdKksn tdL|d  n|d }|||d  }dM}|d dkrdNntt|d }t|D ]8\}}||| || d  }|t|d krdO}q|r\|d dkrNdPndQ| _| j}	n"dJ| _t|dkrtd<nd@|| _|d | j
d< dRdd|d |d	 f|p| j  |	|d |d  dS d? dT@ |d ffg| _d1S )Uz" Read relevant info about the BMP r   header_size	directionr   r%   r   widthheight   Zplanesr   bitscompressionr&   Zpalette_padding)r   r   r   r          Zy_flipr   l        
   r      	data_sizer      Zpixels_per_meterr   colorsc                 s   s   | ]}t |d  d V  qdS )o_C@      ?Nint).0xr   r   r   	<genexpr>r   s    z'BmpImageFile._bitmap.<locals>.<genexpr>dpi4   r_maskg_maskb_maskZa_mask$   r   )rB   rC   rD   Zrgb_maskZ	rgba_maskz Unsupported BMP header type (%d)l        zUnsupported BMP Size: (%dx%d))NNNz Unsupported BMP pixel depth (%d)      r3   r%   rG   rH   r3         ~ r3   rH   rG   rJ   r%   r%   r%   r%   rJ   rG   rH   r%   rG   rH   r3   i   i     i |  i  rP   )r   r   r   r   ZXBGRRGBABGRAr   zBGR;16r   ))r   rF   )r   rM   )r   rK   )r   rI   )r   rL   )r   rN   )r   rO   )r   rQ   A)r   r   z Unsupported BMP bitfields layout   )rS   rR   z Unsupported BMP compression (%d)r   i   z!Unsupported BMP Palette size (%d)Tr%   r3   F1LrawrP   )fpreadseekr!   r   
_safe_readi16r(   r   tupleinfor)   len	enumerateOSError_sizegetsizeBIT2MODEmodelistranger   r   rY   palettetellZtile)selfheaderoffsetr\   r]   	file_infoZheader_dataidxmaskZraw_modeZ	SUPPORTEDZ
MASK_MODESpaddingrl   Z	greyscaleindicesindvalZrgbr   r   r   _bitmapD   s   

*









 zBmpImageFile._bitmapc                 C   sD   | j d}|dd dkr$tdt|dd }| j|d dS )	z/ Open file, check magic number and read header    r%   r   r   zNot a BMP filer4   )rp   N)r[   r\   SyntaxErrorr!   rx   )rn   Z	head_datarp   r   r   r   _open  s
    zBmpImageFile._openN)r%   r%   )__name__
__module____qualname____doc__format_descriptionformatZCOMPRESSIONSitemskvvarsrx   r{   r   r   r   r   r#   8   s   
 Br#   c                   @   s   e Zd ZdZdZdd ZdS )DibImageFileZDIBr$   c                 C   s   |    d S )N)rx   )rn   r   r   r   r{     s    zDibImageFile._openN)r|   r}   r~   r   r   r{   r   r   r   r   r     s   r   )rW   r   r   )rX   r      )r   r   r   )r   r   r%   )rS   r   r%   )rW   rX   r   r   rR   c                 C   s   t | ||d d S )NF)_save)imr[   filenamer   r   r   	_dib_save,  s    r   Tc              
   C   s  zt | j \}}}W n" tk
r6   td| j 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rdD ]}|
t|d  qnnP| jdkrtdD ]}|
t|d  qn | jdkr|
| jdd t| |dd| j d||
dffg d S )Nzcannot write mode %s as BMPr@   )`   r   c                 S   s   t | d d S )Nr9   r:   r;   )r>   r   r   r   <lambda>;      z_save.<locals>.<lambda>r%   r2   r   r&   rZ   r   r   ry   r   l    z)File size is too large for the BMP formatr       rW   rV   rX   r   r   r   r   rY   )r%   r%   r+   )SAVEri   KeyErrorrd   Zencoderinforf   r`   maprg   
ValueErrorwriteo32o16r   rk   r   Z
getpaletter   r   )r   r[   r   Zbitmap_headerrawmoder0   r8   ra   r@   ppmZstridero   imagerp   	file_sizeir   r   r   r   0  sr    

	
r   z.bmpz	image/bmpz.dibN)T) r   r   r   _binaryr   r   r_   r   r!   r   r	   r   r
   r   rh   r   r"   r#   r   r   r   r   Zregister_openr   Zregister_saveZregister_extensionZregister_mimer   r   r   r   <module>   s:     ^	
@