U
     Ӕe#E                     @  s`  d dl mZ 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 )+    )annotationsN   )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   1lib/python3.8/site-packages/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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r8|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rPt|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d,|d  d-}	t|	|d |d	 f| _|ddrx|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rX|dJkrXdK\}
| _n4|d | j| jfkr@dL}ndM|d  d-}	t|	| jdNkrdd|d   k rdOksn dP|d  d-}	t|	n|d }|||d  }dQ}|d dkrdRntt|d }t|D ]8\}}||| || d  }|t|d krdS}q|rB|d dkr4dTndU| _| j}
n"dN| _t|dkrZd=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   ZheightZplanes   bitsZ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 )o_C@Nr   .0xr   r   r   	<genexpr>v   s     z'BmpImageFile._bitmap.<locals>.<genexpr>dpi4   r_maskg_maskb_maskZa_mask$   )rA   rB   rC   Zrgb_maskZ	rgba_maskzUnsupported BMP header type ()   )NNNzUnsupported BMP pixel depth (raw      r4   r         ~ rI   rJ   r   rL   rI   rJ   r4   r4   rJ   rI   rL   rI   rJ   r4   rL   r   r   r   r   rI   rJ   r4   i   i     i |  i  rS   )r   r   r   r   ZXBGRZABGRRGBABGRAr   zBGR;16r   )	)r   rH   )r   rK   )r   rM   )r   rN   )r   rO   )r   rP   )r   rQ   )r   rR   )r   rT   r   A)r   r   z Unsupported BMP bitfields layout   )rV   rU   bmp_rlezUnsupported BMP compression (r   i   zUnsupported BMP Palette size (Tr   r4   F1LrS   )fpreadseekr#   r   Z
_safe_readi16r)   tupleinfor,   len	enumerateOSErrorZ_sizegetBIT2MODE_modemoder*   r+   listranger
   r   rG   paletteappendtellZtile)selfheaderoffsetr_   r`   	file_infoZheader_dataidxmaskmsgZraw_modeZdecoder_nameZ	SUPPORTEDZ
MASK_MODESZpaddingrm   Z	grayscaleindicesZindvalZ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 headerrF   zNot a BMP filer5   )rr   N)r^   r_   r   SyntaxErrorr#   rz   )rp   Z	head_datarv   rr   r   r   r   _open  s    
zBmpImageFile._openN)r   r   )__name__
__module____qualname____doc__format_descriptionformatZCOMPRESSIONSitemskvvarsrz   r|   r   r   r   r   r%   >   s   
 Hr%   c                   @  s   e Zd ZdZdd ZdS )BmpRleDecoderTc                 C  st  | j d }t }d}t|| jj| jj k r@| jd}| jd}|rN|sRq@|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 }q|d dkrt|| jj dkr|d7 }qd}q|d dkr0q@q|d dkr| jd}t|dk r\q@| jd\}}|d||| jj   7 }t|| jj }q|r|d d }| j|}|D ]&}|t	|d? 7 }|t	|d@ 7 }qn|d }| j|}||7 }t||k rq@||d 7 }| j d dkr| jdtj q| jdkrPdnd}| t||d| j d	 f d
S )Nr   r   r      r       r\   r   r-   )r-   r   )ry   	bytearrayrd   stateZxsizeZysizefdr_   maxr
   rl   ro   r`   osSEEK_CURrj   Z
set_as_rawbytes)rp   bufferZrle4datar=   ZpixelsZbyteZ
num_pixelsZfirst_pixelZsecond_pixelindexZ
bytes_readrightZupZ
byte_countZ	byte_readrawmoder   r   r   decode"  sf    



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 ZdS )DibImageFileZDIBr&   c                 C  s   |    d S )N)rz   )rp   r   r   r   r|   m  s    zDibImageFile._openN)r}   r~   r   r   r   r|   r   r   r   r   r   i  s   r   )r[   r   r   )r\   r      )r   r   r   )r   r   r   )rV   r   r   )r[   r\   r   r   rU   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
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 BMPr?   )`   r   c                 s  s   | ]}t |d  d V  qdS )r:   g      ?N)intr;   r   r   r   r>     s     z_save.<locals>.<genexpr>r   r3   r   r'   r]   r   r   r[       c                 s  s   | ]}t |d  V  qdS r   Nr	   r<   ir   r   r   r>     s     rZ   r\   c                 s  s   | ]}t |d  V  qdS r   r	   r   r   r   r   r>     s     r   r   r   r   r   rF   l    z)File size is too large for the BMP formatr   r   rG   )r   r   r-   )SAVErj   KeyErrorrf   Zencoderinforg   rb   sizejoinrl   r   Z
getpaletterd   
ValueErrorwriteo32o16r   r   )r   r^   r   Zbitmap_headerr   r2   r9   erv   rc   r?   ZppmZstriderq   Zimagerm   rr   	file_sizer   r   r   r     sz    




	

r   z.bmpz	image/bmprY   z.dib)T)!Z
__future__r   r    r   r   r   Z_binaryr   ra   r   r#   r
   r   r   r   r   rh   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>   sJ    bJ	
F