U
    Žb|?                     @   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   )RGBBGR;15)r   BGR)r   BGRX)r                   c                 C   s   | d d dkS )N      BM prefixr   r   6/tmp/pip-unpacked-wheel-_wxctax1/PIL/BmpImagePlugin.py_accept3   s    r   c                 C   s   t | dkS )N)   (   @   l   |   )i32r   r   r   r   _dib_accept7   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 )BmpImageFilez0Image plugin for the Windows Bitmap format (BMP)Windows BitmapZBMPr   r   r      r      )RAW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< t|d|d	< t|d|d
< t|d|d< | j|d< d|d< n|d dkrB|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rVt|d"krtd#d$d%d&gD ] \}}t|d'|d  ||< qn$d|d&< d(D ]}t|d||< q|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d/krtd0|d  d,d1}
|d | j
krd2d3d4d5d6gd7gd8d9gd:}d;d<d=d>d>d?d@dAdB}|d |kr|d dCk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n^|d | jkr|d dCkrD|dGkrDdH\}	| _n*|d | jkr0dI}
ntdJ|d  d,| jdKkrLd|d   k rldLksn tdM|d  d,n|d }|||d  }dN}|d dkrdOntt|d }t|D ]8\}}||| || d  }|t|d krdP}q|r*|d dkrdQndR| _| j}	n"dK| _t|dkrBd;nd?|| _|d | j	d< |
dd|d |d	 f|p|| j  |	|d |d  dS d? dT@ |d ffg| _d/S )Uz Read relevant info about the BMPr   header_size	directionr   r   widthr   heightZplanes   bitscompressionr%   Zpalette_padding)r   r   r   r          Zy_flipr   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>x   s     z'BmpImageFile._bitmap.<locals>.<genexpr>dpi4   r_maskg_maskb_maskZa_mask$   )r?   r@   rA   Zrgb_maskZ	rgba_maskzUnsupported BMP header type ()   )NNNzUnsupported BMP pixel depth (raw      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   r   A)r   r   z Unsupported BMP bitfields layout   )rS   rR   bmp_rlezUnsupported BMP compression (r   i   zUnsupported BMP Palette size (Tr   r3   F1LrP   )fpreadseekr!   r   
_safe_readi16r'   tupleinfor)   len	enumerateOSError_sizegetBIT2MODEmoder(   listranger   r   rE   palettetellZtile)selfheaderoffsetr\   r]   	file_infoZheader_dataidxmaskZraw_modeZdecoder_nameZ	SUPPORTEDZ
MASK_MODESpaddingrk   Z	greyscaleindices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 headerrD   zNot a BMP filer4   )ro   N)r[   r\   r   SyntaxErrorr!   rw   )rm   Z	head_dataro   r   r   r   _open
  s
    
zBmpImageFile._openN)r   r   )__name__
__module____qualname____doc__format_descriptionformatZCOMPRESSIONSitemskvvarsrw   ry   r   r   r   r   r#   >   s   
 Ar#   c                   @   s   e Zd ZdZdd ZdS )BmpRleDecoderTc           
      C   s  t  }d}t|| jj| jj k r| jd}| jd}|rD|sHq|d }|r|| | jjkrvtd| jj| }||| 7 }||7 }q
|d dkrt|| jj dkr|d7 }qd}q
|d dkrΐqq
|d dkr2| jd}t|dk rq| jd\}}	|d||	| jj   7 }t|| jj }q
| j|d }||7 }t||d k r`q||d 7 }| j d dkr
| j	dt
j q
| t|dd| jd f dS )Nr   r       r   r   r+   )r+   r   )	bytearrayrb   stateZxsizeZysizefdr\   maxrl   r]   osSEEK_CURZ
set_as_rawbytesargs)
rm   bufferdatar;   ZpixelsbyteZ
num_pixels
bytes_readrightZupr   r   r   decode  sF    

zBmpRleDecoder.decodeN)rz   r{   r|   Z	_pulls_fdr   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdZdd ZdS )DibImageFileZDIBr$   c                 C   s   |    d S )N)rw   )rm   r   r   r   ry   R  s    zDibImageFile._openN)rz   r{   r|   r   r~   ry   r   r   r   r   r   M  s   r   )rX   r   r   )rY   r      )r   r   r   )r   r   r   )rS   r   r   )rX   rY   r   r   rR   c                 C   s   t | ||d d S )NF)_save)imr[   filenamer   r   r   	_dib_saved  s    r   Tc              
   C   s  zt | j \}}}W n6 tk
rJ } ztd| j d|W 5 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rdD ]}|
t|d  qnP| 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 z as BMPr=   )`   r   c                 S   s   t | d d S )Nr9   g      ?)int)r;   r   r   r   <lambda>s      z_save.<locals>.<lambda>r   r2   r   r%   rZ   r   r   rD   r   l    z)File size is too large for the BMP formatr   r   rX   rW   rY   r   r   r   r   rE   )r   r   r+   )SAVErh   KeyErrorrd   Zencoderinforf   r`   mapsize
ValueErrorwriteo32o16r   rj   r   Z
getpaletter   r   )r   r[   r   Zbitmap_headerrawmoder0   r8   era   r=   ppmZstridern   imagero   	file_sizeir   r   r   r   h  sr    &

	
r   z.bmpz	image/bmprV   z.dib)T)r    r   r   r   _binaryr   r_   r   r!   r   r	   r   r
   r   rg   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>   sH    Z6	
@