B
    eAdE                 @   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   D/var/www/html/venv/lib/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 Bitmap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rXt|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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rd1|d  d-}	t|	d2}|d | j
krd3d4d5d6d7d8gd9gd:d;gd<}d=d>d?d@dAdAdBdCdDdE	}|d |kr|d dFkr|d+ ||d  kr||d |d+ f }
dG|
krd@n| j| _nF|d dHkr|d* ||d  kr||d |d* f }
ndI}	t|	ndI}	t|	nh|d | jkr,|d dFkr`|dJkr`dK\}
| _n4|d | j| jfkrHdL}ndM|d  d-}	t|	| jdNkrpd|d   k rdOksn dP|d  d-}	t|	n|d }|||d  }dQ}|d dkrdRntt|d }xDt|D ]8\}}||| || d  }|t|d krdS}qW |rN|d dkr@dTndU| _| j}
n"dN| _t|dkrfd=ndB|| _|d | j	d< |
g}|dLkr||d | jk n"||d |d  dV d? dW@  ||d  |dd|d |d	 f|p| j  t|fg| _d0S )Xz Read relevant info about the BMPr   )header_size	directionr)   r   r   widthr   heightZplanes   bitscompressionr"   Zpalette_padding)r   r   r   r         Zy_flipr   r*   l        r   
   r   	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$   )r<   r=   r>   Zrgb_maskZ	rgba_maskzUnsupported BMP header type ()   )NNNzUnsupported BMP pixel depth (raw)i   i   r1   r   )l      ~ i   i   r   )l      ~ i   i   r1   )r1   i   i   l      ~ )i   i   r1   l      ~ )r   r   r   r   )i   i   r1   )i   i     )i |  i  rC   )r   r   r   r   ZXBGRZABGRRGBABGRAr   zBGR;16zBGR;15)	)r   )i   i   r1   r   )r   )l      ~ i   i   r   )r   )l      ~ i   i   r1   )r   )r1   i   i   l      ~ )r   )i   i   r1   l      ~ )r   )r   r   r   r   )r   )i   i   r1   )r   )i   i  rC   )r   )i |  i  rC   r   A)r   r   z Unsupported BMP bitfields layout   )rE   rD   bmp_rlezUnsupported BMP compression (r   i   zUnsupported BMP Palette size (T)r   r1   F1LrC   )fpreadseekr   r   
_safe_readi16r$   tupleinfor'   len	enumerateOSError_sizegetBIT2MODEmoder%   r&   listranger   r   rB   paletteappendtellZtile)selfheaderoffsetrM   rN   	file_infoZheader_dataidxmaskmsgZraw_modeZdecoder_nameZ	SUPPORTEDZ
MASK_MODESpaddingr\   Z	greyscaleindicesindvalrgbargsr   r   r   _bitmapJ   s    


 




"zBmpImageFile._bitmapc             C   s:   | j d}t|s d}t|t|d}| j|d dS )z-Open file, check magic number and read headerrA   zNot a BMP filer2   )ra   N)rL   rM   r   SyntaxErrorr   rl   )r_   Z	head_datare   ra   r   r   r   _open  s    
zBmpImageFile._openN)r   r   )__name__
__module____qualname____doc__format_descriptionformatZCOMPRESSIONSitemskvvarsrl   rn   r   r   r   r   r    >   s   
 Hr    c               @   s   e Zd ZdZdd ZdS )BmpRleDecoderTc             C   s  | j d }t }d}x4t|| jj| jj k rJ| jd}| jd}|rR|sTP |d }|r|| | jjkrtd| jj| }|rt	|d d? }t	|d d@ }	x<t
|D ]"}
|
d dkr||7 }q||	7 }qW n||| 7 }||7 }q|d dkr(x$t|| jj dkr |d7 } qW d}q|d dkr:P q|d dkr| jd}t|dk rdP | jd\}}|d||| jj   7 }t|| jj }q|r|d d }| j|}xL|D ]&}|t	|d? 7 }|t	|d@ 7 }qW n|d }| j|}||7 }t||k rP ||d 7 }| j d dkr| jdtj qW | jdkr\dnd}| t||d| j d	 f d
S )Nr   r   r      r       rJ   r   r(   )r(   r   )rk   	bytearrayrS   stateZxsizeZysizefdrM   maxr   r[   r^   rN   osSEEK_CURrY   Z
set_as_rawbytes)r_   bufferZrle4datar8   ZpixelsbyteZ
num_pixelsZfirst_pixelZsecond_pixelindexZ
bytes_readrightupZ
byte_countZ	byte_readrawmoder   r   r   decode"  sf    



zBmpRleDecoder.decodeN)ro   rp   rq   Z	_pulls_fdr   r   r   r   r   ry     s   ry   c               @   s   e Zd ZdZdZdd ZdS )DibImageFileZDIBzWindows Bitmapc             C   s   |    d S )N)rl   )r_   r   r   r   rn   m  s    zDibImageFile._openN)ro   rp   rq   rt   rs   rn   r   r   r   r   r   i  s   r   )rI   r   r   )rJ   r      )r   r   r   )r   r   r   )rE   r   r   )rI   rJ   r   r   rD   c             C   s   t | ||d d S )NF)_save)imrL   filenamer   r   r   	_dib_save  s    r   Tc          
   C   s&  yt | j \}}}W n: tk
rN } zd| j d}t||W d d }~X Y nX | j}	|	dd}
tt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 BMPr:   )`   r   c             S   s   t | d d S )Ngo_C@g      ?)int)r8   r   r   r   <lambda>      z_save.<locals>.<lambda>r   r0   r   r"   rK   r   r   rI   r   c             s   s   | ]}t |d  V  qdS )r   N)r   )r7   ir   r   r   r9     s    z_save.<locals>.<genexpr>)r   r1   rJ   c             s   s   | ]}t |d  V  qdS )r   N)r   )r7   r   r   r   r   r9     s    r   r   r   r   r   rA   l    z)File size is too large for the BMP formats   BMr{   rB   )r   r   r(   )SAVErY   KeyErrorrU   ZencoderinforW   rQ   mapsizejoinr[   r   Z
getpaletterS   
ValueErrorwriteo32o16r   r   )r   rL   r   Zbitmap_headerr   r.   r6   ere   rR   r:   ppmZstrider`   imager\   ra   	file_sizer   r   r   r     sB    


n
r   z.bmpz	image/bmprH   z.dib)T)r    r   r   r   _binaryr   rP   r   r   r   r	   r   r
   r   rX   r   r   r    Z	PyDecoderry   r   r   r   r   Zregister_openrt   Zregister_saveZregister_extensionZregister_mimeZregister_decoderr   r   r   r   <module>   sD    bJ
F