a
    Ag.M                     @  s  d dl mZ d dlZd dlmZm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dddZddd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&d'd(d)d*d+Zd4d%d&d'dd(d-d.d/Zeejee e eje e!ejd0 e"ejd1 e#d2e eejee e eje e!ejd3 e"ejd1 dS )5    )annotationsN)IOAny   )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                   bytesbool)prefixreturnc                 C  s   | d d dkS )N      BM r   r   r   Q/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/site-packages/PIL/BmpImagePlugin.py_accept4   s    r"   c                 C  s   t | dv S )N)   (   4   8   @   l   |   )i32r    r   r   r!   _dib_accept8   s    r+   c                   @  sh   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ddddZddddZdS )BmpImageFilez0Image plugin for the Windows Bitmap format (BMP)Windows BitmapZBMPr   r   r      r      )RAWRLE8RLE4	BITFIELDSZJPEGZPNGintNone)headeroffsetr   c                 C  sN  | j j| j j }}|r|| t|ddd}t|d tsBJ t| j |d d }|d dkrt|d|d< t|d|d	< t|d|d
< t|d|d< | j	d |d< d|d< n<|d dv r|d dk|d< |d rdnd|d< t|d|d< |d s
t|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 t
sJ t
d!d" |d D | jd#< |d | j	d$ krg d%}t|d&kr*t|d'kr|d( nd|d(< t|D ] \}}	t|d)|d  ||	< qn$d|d(< |D ]}	t|d||	< q6t|d* tsbJ t|d+ tsvJ t|d, tsJ t|d( tsJ |d* |d+ |d, f|d-< |d* |d+ |d, |d( f|d.< nd/|d  d0}
t|
t|d tsJ t|d	 tsJ |d |d	 f| _t|d ts@J |d drV|d  n
d|d > |d < t|d  tszJ |d1|d  kr|d dkr|d|d   7 }t|d d2\| _}| jsd3|d  d0}
t|
d4}|d | j	d$ krg d5d6gd7d8gd9}d:d;d<d=d>d?d@d?dAdBdCdD}|d |v r|d dEkr|d. ||d  v rt|d. t
spJ ||d |d. f }dF|v rd>n| j| _nZ|d dGv r|d- ||d  v rt|d- t
sJ ||d |d- f }ndH}
t|
ndH}
t|
nt|d | j	d kr>|d dEkrz|dIkrzdJ\}| _n<|d | j	dK | j	dL fv rbdM}ndN|d  d0}
t|
| jdOkrd|d    k rdPksn dQ|d   d0}
t|
nt|d tsJ |d }|||d   }dR}|d  dkr dSntt|d  }t|D ]8\}}||| || d  }|t|d krdT}q|rx|d  dkrjdUndV| _| j}n"dO| _t|dkrd:ndA|| _|d | jd< |g}|dMkr||d | j	dL k n6t|d tsJ ||d |d  dW d? dX@  ||d  t|dd|d |d	 f|p<| j  t
|g| _dYS )Zz Read relevant info about the BMPr   )header_size	directionr9   r#   r   widthr   heightZplanes   bitsr0   compressionr.   Zpalette_padding)r$   r%   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>       z'BmpImageFile._bitmap.<locals>.<genexpr>dpir3   )r_maskg_maskb_mask0   r%   Za_mask$   rN   rO   rP   Zrgb_maskZ	rgba_maskzUnsupported BMP header type ()   ) rU   zUnsupported BMP pixel depth (raw)      rA   r         ~ rX   rY   r   r[   rY   rA   r   r[   rX   rY   rA   rA   rY   rX   r[   rX   rY   rA   r[   r[   rY   rA   rX   r   r   r   r   rX   rY   rA   i   i     i |  i  rd   )r   r   r   r   ZXBGRZBGXRZABGRRGBABGRAZBGARr   zBGR;16r   ))r   rW   )r   rZ   )r   r\   )r   r]   )r   r^   )r   r_   )r   r`   )r   ra   )r   rb   )r   rc   )r   re   r   A)r   r   z Unsupported BMP bitfields layout   )rg   rf   r1   r2   bmp_rlezUnsupported BMP compression (r   i   zUnsupported BMP Palette size (Tr   rA   F1Lrd   N)fpreadseekr*   
isinstancer4   r   
_safe_readi16COMPRESSIONStupleinfolenappend	enumerateOSError_sizegetBIT2MODE_modemodelistranger   r   rV   palette_TiletellZtile)selfr6   r7   rp   rq   	file_infoZheader_datamasksidxmaskmsgZraw_modeZdecoder_nameZ	SUPPORTEDZ
MASK_MODESpaddingr   Z	grayscaleindicesindvalZrgbargsr   r   r!   _bitmapK   s<   
	



 







"zBmpImageFile._bitmapr   c                 C  s:   | j d}t|s d}t|t|d}| j|d dS )z-Open file, check magic number and read headerrT   zNot a BMP filerB   )r7   N)ro   rp   r"   SyntaxErrorr*   r   )r   Z	head_datar   r7   r   r   r!   _open3  s    
zBmpImageFile._openN)r   r   )__name__
__module____qualname____doc__format_descriptionformatru   itemskvvarsr   r   r   r   r   r!   r,   ?   s    ir,   c                   @  s    e Zd ZdZdddddZdS )BmpRleDecoderTz$bytes | Image.SupportsArrayInterfaceztuple[int, int])bufferr   c                 C  s  | j d usJ | jd }t }d}| jj| jj }t||k rT| j d}| j d}|r`|sdqT|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 }q2|d dkr0t|| jj dkr*|d7 }qd}q2|d dkrDqTq2|d dkr| j d}t|dk rpqT| j d\}}|d||| jj   7 }t|| jj }q2|r|d d }| j |}|D ]&}|t	|d? 7 }|t	|d@ 7 }qn|d }| j |}||7 }t||k r$qT||d 7 }| j  d dkr2| j dtj q2| jdkrddnd}| t||d| jd	 f d
S )Nr   r   r      r       rm   r   r8   )r8   r   )fdr   	bytearraystateZxsizeZysizerx   rp   maxr   r   r   rq   osSEEK_CURr   Z
set_as_rawr   )r   r   Zrle4datarJ   Zdest_lengthZpixelsbyteZ
num_pixelsZfirst_pixelZsecond_pixelindex
bytes_readrightZupZ
byte_countZ	byte_readrawmoder   r   r!   decodeD  sj    


zBmpRleDecoder.decodeN)r   r   r   Z	_pulls_fdr   r   r   r   r!   r   A  s   r   c                   @  s"   e Zd ZdZdZddddZdS )DibImageFileZDIBr-   r5   r   c                 C  s   |    d S )N)r   )r   r   r   r!   r     s    zDibImageFile._openN)r   r   r   r   r   r   r   r   r   r!   r     s   r   )rl   r   r   )rm   r      )r   r   r   )r   r   r   )rg   r   r   )rl   rm   r   r   rf   zImage.Imagez	IO[bytes]zstr | bytesr5   )imro   filenamer   c                 C  s   t | ||d d S )NF)_save)r   ro   r   r   r   r!   	_dib_save  s    r   T)r   ro   r   bitmap_headerr   c                 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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 }|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| |tdd| j d||d fg d S )!Nzcannot write mode z as BMPrM   )`   r   c                 s  s   | ]}t |d  d V  qdS )rG   g      ?N)r4   rH   r   r   r!   rK     rL   z_save.<locals>.<genexpr>r   r@   r   r.   rn   r$   r   rl   rL   c                 s  s   | ]}t |d  V  qdS r   Nr   rI   ir   r   r!   rK     rL   rk   rm   c                 s  s   | ]}t |d  V  qdS r   r   r   r   r   r!   rK     rL   r   r   r   r   r   rT   l    z)File size is too large for the BMP formatr   r   rV   )r   r   r8   )SAVEr   KeyErrorr{   Zencoderinfor}   rv   sizejoinr   r   Z
getpaletterx   
ValueErrorwriteo32o16r   r   r   )r   ro   r   r   r   r>   rF   er   rw   rM   ppmZstrider6   imager   r7   	file_sizer   r   r!   r     s~     




	

 r   z.bmpz	image/bmprj   z.dib)T)$
__future__r   r   typingr   r   rU   r   r   r   _binaryr	   rt   r
   r*   r   r   r   r   r   r~   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>   sP     L	 J