a
    !f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   )RGBBGR;15)r   BGR)r   BGRX)r                   c                 C   s   | d d dkS )N      BM prefixr   r   S/var/www/html/python-backend/venv/lib/python3.9/site-packages/PIL/BmpImagePlugin.py_accept3   s    r   c                 C   s   t | dv 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 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v r4|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rLt|d#krtg d$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rt|d n
d|d > |d< |d/|d  kr|d dkr|d|d  7 }t|d d0\| _}
| jd1u rd2|d  d.}	t|	d3}|d | j
krg d4d5gd6d7gd8}d9d:d;d<d=d=d>d?d@dA	}|d |v r|d dBkr|d, ||d  v r||d |d, f }
dC|
v rd<n| j| _nF|d dDv r|d+ ||d  v r||d |d+ f }
ndE}	t|	ndE}	t|	nh|d | jkr|d dBkrL|dFkrLdG\}
| _n4|d | j| jfv r4dH}ndI|d  d.}	t|	| jdJkrXd|d   k rtdKksn dL|d  d.}	t|	n|d }|||d  }dM}|d dkrdNntt|d }t|D ]8\}}||| || d  }|t|d krdO}q|r6|d dkr(dPndQ| _| j}
n"dJ| _t|dkrNd9nd>|| _|d | j	d< |
g}|dHkr||d | jk n"||d |d  dR d? dS@  ||d  |dd|d |d	 f|p| j  t|fg| _d1S )Tz 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 )o_C@Nr   ).0xr   r   r   	<genexpr>v       z'BmpImageFile._bitmap.<locals>.<genexpr>dpi4   )r_maskg_maskb_maska_mask$   rF   )rC   rD   rE   rC   rD   rE   Zrgb_maskZ	rgba_maskzUnsupported BMP header type ()   )NNNzUnsupported BMP pixel depth (raw)      r6   r         ~ rL   rM   r   rO   rL   rM   r6   r6   rM   rL   rO   rL   rM   r6   rO   r   r   r   r   rL   rM   r6   i   i     i |  i  rV   )r   r   r   r   ZXBGRZABGRRGBABGRAr   zBGR;16r   )	)r   rK   )r   rN   )r   rP   )r   rQ   )r   rR   )r   rS   )r   rT   )r   rU   )r   rW   r   A)r   r   z Unsupported BMP bitfields layout   )rY   rX   bmp_rlezUnsupported BMP compression (r   i   zUnsupported BMP Palette size (Tr   r6   F1LrV   )fpreadseekr"   r   
_safe_readi16r)   tupleinfor,   len	enumerateOSError_sizegetBIT2MODEmoder*   r+   listranger	   r   rJ   paletteappendtellZtile)selfheaderoffsetrb   rc   	file_infoZheader_dataidxmaskmsgZraw_modeZdecoder_nameZ	SUPPORTEDZ
MASK_MODESpaddingrq   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 headerrI   zNot a BMP filer7   )rv   N)ra   rb   r   SyntaxErrorr"   r   )rt   Z	head_datarz   rv   r   r   r   _open  s    
zBmpImageFile._openN)r   r   )__name__
__module____qualname____doc__format_descriptionformatZCOMPRESSIONSitemskvvarsr   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   )r   	bytearrayrh   stateZxsizeZysizefdrb   maxr	   rp   rs   rc   osSEEK_CURrn   Z
set_as_rawbytes)rt   bufferZrle4datar>   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)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)r   )rt   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   )rY   r   r   )r^   r_   r   r   rX   c                 C   s   t | ||d d S )NF)_save)imra   filenamer   r   r   	_dib_save  s    r   Tc              
   C   s(  zt | j \}}}W n< tyP } z$d| j d}t||W Y d }~n
d }~0 0 | 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 }|rld| |d  }|| }|dkrJd}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 BMPrA   )`   r   c                 S   s   t | d d S )Nr<   g      ?)int)r>   r   r   r   <lambda>  r@   z_save.<locals>.<lambda>r   r5   r   r'   r`   r   r   r^   r@   c                 s   s   | ]}t |d  V  qdS r   Nr   r=   ir   r   r   r?     r@   z_save.<locals>.<genexpr>r]   r_   c                 s   s   | ]}t |d  V  qdS r   r   r   r   r   r   r?     r@   r   r   r   r   r   rI   l    z)File size is too large for the BMP formatr   r   rJ   )r   r   r-   )SAVErn   KeyErrorrj   Zencoderinforl   rf   mapsizejoinrp   r   Z
getpaletterh   
ValueErrorwriteo32o16r   r   )r   ra   r   Zbitmap_headerr   r3   r;   erz   rg   rA   ppmZstrideru   imagerq   rv   	file_sizer   r   r   r     sz     




	

r   z.bmpz	image/bmpr\   z.dib)T)r    r   r   r   _binaryr   re   r   r"   r	   r
   r   r   r   rm   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    bJ	
F