o
    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   E/var/www/html/venv/lib/python3.10/site-packages/PIL/BmpImagePlugin.py_accept3   s   r   c                 C  s   t | dv S )N)   (   @   l   |   )i32r   r   r   r   _dib_accept7      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	BITFIELDSJPEGPNGc              
   C  s  | j j| j j}}|r|| t|ddd}t| j |d d }|d dkrOt|d|d< t|d|d	< t|d|d
< t|d|d< | j|d< d|d< n|d dv r|d dk|d< |d rddnd|d< t|d|d< |d sxt|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rt|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r6|d nd|d > |d< |d/|d  krV|d dkrV|d|d  7 }t|d d0\| _}
| jd1u rsd2|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| _n]|d dDv r|d+ ||d  v r||d |d+ f }
n@dE}	t|	dE}	t|	|d | jkr|d dBkr|dFkrdG\}
| _n|d | j| jfv rdH}ndI|d  d.}	t|	| jdJkrd|d   k r4dKksAn dL|d  d.}	t|	|d }|||d  }dM}|d dkrXdNntt|d }t|D ]\}}||| || d  }|t|d krdO}qd|r|d dkrdPndQ| _| j}
ndJ| _t|dkrd9n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	directionr2   r   r   widthr   heightplanes   bitscompressionr)   palette_padding)r   r    r!   r"         y_flipr   r3   l        r   
   r   	data_size   r   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_maska_mask$   rN   )rK   rL   rM   rK   rL   rM   rgb_mask	rgba_maskzUnsupported BMP header type ()   )NNNzUnsupported BMP pixel depth (raw)      r<   r         ~ rV   rW   r   rY   rV   rW   r<   r<   rW   rV   rY   rV   rW   r<   rY   r   r   r   r   rV   rW   r<   i   i     i |  i  r`   )r   r   r   r   XBGRABGRRGBABGRAr   zBGR;16r   )	)r   rU   )r   rX   )r   rZ   )r   r[   )r   r\   )r   r]   )r   r^   )r   r_   )r   ra   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   r<   F1Lr`   )fpreadseekr#   r   
_safe_readi16r+   tupleinfor.   len	enumerateOSError_sizegetBIT2MODE_modemoder,   r-   listranger
   r   rT   paletteappendtelltile)selfheaderoffsetrn   ro   	file_infoheader_dataidxmaskmsgraw_modedecoder_name	SUPPORTED
MASK_MODESpaddingr~   	grayscale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 headerrS   zNot a BMP filer>   )r   N)rm   rn   r   SyntaxErrorr#   r   )r   	head_datar   r   r   r   r   _open  s   
zBmpImageFile._openNr   r   )__name__
__module____qualname____doc__format_descriptionformat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  s  | j d }t }d}t|| jj| jj k r*| jd}| jd}|r'|s)n|d }|rt|| | jjkr@td| jj| }|rit	|d d? }t	|d d@ }	t
|D ]}
|
d dkrc||7 }qV||	7 }qVn||| 7 }||7 }n|d dkrt|| jj dkr|d7 }t|| jj dksd}n|d dkrn|d dkr| jd}t|dk rn{| jd\}}|d||| jj   7 }t|| jj }nR|r|d d }| j|}|D ]}|t	|d? 7 }|t	|d@ 7 }qn|d }| j|}||7 }t||k rn$||d 7 }| j d dkr| jdtj t|| jj| jj k s| jdkr2dnd}| t||d| j d	 f d
S )Nr   r   r      r       rk   r   r1   )r1   r   )r   	bytearrayrt   statexsizeysizefdrn   maxr
   r}   r   ro   osSEEK_CURr{   
set_as_rawbytes)r   bufferrle4datarG   pixelsbyte
num_pixelsfirst_pixelsecond_pixelindex
bytes_readrightup
byte_count	byte_readrawmoder   r   r   decode"  sn   



;zBmpRleDecoder.decodeN)r   r   r   	_pulls_fdr   r   r   r   r   r     s    r   c                   @  s   e Zd ZdZdZdd ZdS )DibImageFileDIBr'   c                 C  s   |    d S )N)r   )r   r   r   r   r   m  r%   zDibImageFile._openN)r   r   r   r   r   r   r   r   r   r   r   i  s    r   )rj   r   r   )rk   r      )r   r   r   )r   r   r   )re   r   r   )rj   rk   r   r   rd   c                 C  s   t | ||d d S )NF)_save)imrm   filenamer   r   r   	_dib_save  s   r   Tc              
   C  s  z
t | j \}}}W n ty" } zd| j d}t||d }~ww | j}	|	dd}
tdd |
D }| jd | d d	 d
 d@ }d}|| jd  }| jdkr]ddd dD }n'| jdkroddd t	dD }n| jdkr| j
dd}t|d }nd }|rd| |d  }|| }|dkrd}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 BMPrI   )`   r   c                 s  s     | ]}t |d  d V  qdS )rD   g      ?N)intrE   r   r   r   rH     s    z_save.<locals>.<genexpr>r   r;   r   r)   rl   r   r   rj       c                 s      | ]	}t |d  V  qdS r   Nr	   rF   ir   r   r   rH         ri   rk   c                 s  r   r   r	   r   r   r   r   rH     r   r   r   r   r   r   rS   l    z)File size is too large for the BMP formatr   r   rT   r   r1   )SAVEr{   KeyErrorrv   encoderinforx   rr   sizejoinr}   r   
getpalettert   
ValueErrorwriteo32o16r   r   )r   rm   r   bitmap_headerr   r8   rC   er   rs   rI   ppmstrider   imager~   r   	file_sizer   r   r   r     s~   





	

(r   z.bmpz	image/bmprh   z.dib)T)!
__future__r   r    r   r   r   _binaryr   rq   r   r#   r
   r   r   r   r   ry   r   r$   r&   	PyDecoderr   r   r   r   r   register_openr   register_saveregister_extensionregister_mimeregister_decoderr   r   r   r   <module>   sL    bJ	
F