
    e#E                       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 Zd Z G d dej
                        Z G d dej*                        Z G d de      ZddddddZd Zd%d Z ej6                  ej8                  ee        ej:                  ej8                  e        ej<                  ej8                  d!        ej>                  ej8                  d"        ej@                  d#e        ej6                  ej8                  ee        ej:                  ej8                  e        ej<                  ej8                  d$        ej>                  ej8                  d"       y)&    )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                    | d d dk(  S )N      BM prefixs    4/usr/lib/python3/dist-packages/PIL/BmpImagePlugin.py_acceptr   3   s    "1:    c                    t        |       dv S )N)   (   @   l   |   )i32r   s    r   _dib_acceptr(   7   s    v;000r    c                  |    e Zd ZdZdZdZdddddd	d
Zej                         D ]  \  ZZ	e	 e
       e<    ddZd Zy)BmpImageFilez0Image plugin for the Windows Bitmap format (BMP)Windows BitmapBMPr   r   r      r      )RAWRLE8RLE4	BITFIELDSJPEGPNGc           
     
   | j                   j                  | j                   j                  }}|r ||       t         |d            dd}t	        j
                  | j                   |d   dz
        }|d   dk(  rRt        |d      |d<   t        |d      |d	<   t        |d      |d
<   t        |d      |d<   | j                  |d<   d|d<   n|d   dv rh|d   dk(  |d<   |d   rdnd|d<   t        |d      |d<   |d   st        |d      ndt        |d      z
  |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              | j                  d!<   |d   | j                  k(  rt        |      d"k\  r+t        g d#      D ]  \  }}t        |d$|dz  z         ||<    n d|d%<   d&D ]  }t         |d            ||<    |d'   |d(   |d)   f|d*<   |d'   |d(   |d)   |d%   f|d+<   nd,|d    d-}	t        |	      |d   |d	   f| _        |j                  dd      r|d   nd|d   z  |d<   |d.|d   z   k(  r|d   dk  r|d|d   z  z  }t         j                  |d   d/      \  | _        }
| j$                  d1|d    d-}	t        |	      d2}|d   | j                  k(  rg d3d4gd5d6gd7}d8d9d:d;d<d<d=d>d?d@	}|d   |v ri|d   dAk(  r2|d+   ||d      v r%||d   |d+   f   }
dB|
v rd;n| j$                  | _        n|d   dCv r|d*   ||d      v r||d   |d*   f   }
nxdD}	t        |	      dD}	t        |	      |d   | j                  k(  r|d   dAk(  rD|dEk(  r?dF\  }
| _        n4|d   | j&                  | j(                  fv rdG}ndH|d    d-}	t        |	      | j$                  dIk(  rd|d   cxk  rdJk  sn dK|d    d-}	t        |	      |d   } |||d   z        }dL}|d   dk(  rdMnt+        t-        |d               }t        |      D ]'  \  }}|||z  ||z  dz    }|t/        |      dz  k7  s&dN}) |r|d   dk(  rdOndP| _        | j$                  }
n)dI| _        t1        j2                  |dk(  rd8nd=|      | _        |d   | j                  d<   |
g}|dGk(  r"|j7                  |d   | j(                  k(         n#|j7                  |d   |d   z  dQz   dz	  dRz         |j7                  |d          |dd|d   |d	   f|xs | j                   j9                         t        |      fg| _        y0)Sz Read relevant info about the BMPr   )header_size	directionr7   r"   r   widthr   heightplanes   bitscompressionr-   palette_padding)r#   r$   r%   r&         y_flipr   r8   l        r   
   r   	data_size   r   pixels_per_meter   colorsc              3  &   K   | ]	  }|d z    yw)o_C@Nr   .0xs     r   	<genexpr>z'BmpImageFile._bitmap.<locals>.<genexpr>v   s     $XQQ[$Xs   dpi4   )r_maskg_maskb_maska_mask$   rT   )rQ   rR   rS   rQ   rR   rS   rgb_mask	rgba_maskzUnsupported BMP header type ()   )NNNzUnsupported BMP pixel depth (raw)      rA   r         ~ r\   r]   r   r_   r\   r]   rA   rA   r]   r\   r_   r\   r]   rA   r_   r   r   r   r   r\   r]   rA   i   i     i |  i  rf   )r   r   r   r   XBGRABGRRGBABGRAr   zBGR;16r   )	)r   r[   )r   r^   )r   r`   )r   ra   )r   rb   )r   rc   )r   rd   )r   re   )r   rg   r   A)r   r   z Unsupported BMP bitfields layout   )rk   rj   bmp_rlezUnsupported BMP compression (r   i   zUnsupported BMP Palette size (Tr   rA   F1Lrf   )fpreadseekr'   r   
_safe_readi16r/   tupleinfor2   len	enumerateOSError_sizegetBIT2MODE_modemoder0   r1   listranger   r   rZ   paletteappendtelltile)selfheaderoffsetrt   ru   	file_infoheader_dataidxmaskmsgraw_modedecoder_name	SUPPORTED
MASK_MODESpaddingr   	grayscaleindicesindvalrgbargss                         r   _bitmapzBmpImageFile._bitmapJ   s   WW\\477<<dL$'QLrB	  **477Im4Lq4PQ ]#r)!$[!!4Ig"%k1"5Ih"%k1"5Ih #K 3If'+xxIm$+,I'( }%);;"-a.D"8Ih*3H*=Q2Ik"!$[!!4Ig !* K#Sa00 h
 #&k1"5Ih #K 4If'*;';Im$%(b%9Ik"K$K$-I() #&k2"6Ih+,I'($$X)DV:W$XXDIIe'4>>9{#r)%.@& I	T +.k2a<*H	$I +.Ih' > 7*-d1g,	$7 h'h'h')	*% h'h'h'h'	*	+& 2)M2J1K1MC#, w'8)<<

 }}Xq) hy(( 	(
 R)M222y7HA7Ma)H---F  (||If,=|L
H991)F2C1DAFC#, ]#t~~5 ..*,ABI 6<;A<B<B<B,205-5-5
J  I-f%+!+.)If<M2NN)9V+<i>T*UVH+.(?		DJf%1!*-9V;L1MM)9V+<i
>S*TUH<C!#,&8cl"}%1 B&6R<'5$$*}%$))TYY)??$L1)M2J1K1MC#, 99	(+4u46y7J6K1Mcl"#$56w8)<<= 	 !*a/ eIh$789  !*' 2 *HC!#-#-!2CDCbgk)$)	* (1((;q(@cDJ#yyH!$DJ#/#3#3")Q,E7$DL
 $-]#;		- z9$KK	-0DII=>KK)G,y/@@2E!KPRSTIk*+ Ay)9X+>?($'',,.d	
	r    c                    | j                   j                  d      }t        |      sd}t        |      t	        |d      }| j                  |       y)z-Open file, check magic number and read headerrY   zNot a BMP filerC   )r   N)rs   rt   r   SyntaxErrorr'   r   )r   	head_datar   r   s       r   _openzBmpImageFile._open  sH     GGLL$	y!"Cc""Y#F#r    Nr   r   )__name__
__module____qualname____doc__format_descriptionformatCOMPRESSIONSitemskvvarsr   r   r   r    r   r*   r*   >   sZ    : *F aAVWXL""$ 1q	E
N$r    r*   c                      e Zd ZdZd Zy)BmpRleDecoderTc                   | j                   d   }t               }d}t        |      | j                  j                  | j                  j
                  z  k  r| j                  j                  d      }| j                  j                  d      }|r|sn|d   }|r||z   | j                  j                  kD  r#t        d| j                  j                  |z
        }|rFt        |d   dz	        }t        |d   dz        }	t        |      D ]  }
|
dz  dk(  r||z  }||	z  } n|||z  z  }||z  }n|d   dk(  rTt        |      | j                  j                  z  dk7  r+|dz  }t        |      | j                  j                  z  dk7  r+d}nu|d   dk(  rn|d   dk(  r| j                  j                  d      }t        |      dk  rns| j                  j                  d      \  }}|d||| j                  j                  z  z   z  z  }t        |      | j                  j                  z  }n|rM|d   dz  }| j                  j                  |      }|D ]$  }|t        |dz	        z  }|t        |dz        z  }& n%|d   }| j                  j                  |      }||z  }t        |      |k  rn||d   z  }| j                  j                         dz  dk7  r*| j                  j                  dt        j                         t        |      | j                  j                  | j                  j
                  z  k  r| j                  dk(  rdnd}| j!                  t#        |      |d| j                   d	   f       y
)Nr   r   r      r       rq   r   r6   )r6   r   )r   	bytearrayrz   statexsizeysizefdrt   maxr   r   r   ru   osSEEK_CURr   
set_as_rawbytes)r   bufferrle4datarM   pixelsbyte
num_pixelsfirst_pixelsecond_pixelindex
bytes_readrightup
byte_count	byte_readrawmodes                    r   decodezBmpRleDecoder.decode"  s"   yy|{$i$****TZZ-=-===WW\\!_F77<<?DJz>DJJ$4$44!$Q

(8(81(<!=J"$T!W\"2K#%d1gn#5L!&z!2 1 19> K/D L0D	1 D:--DZ7a<d)djj&6&66!; d)djj&6&66!;A!W\!W\!%aJ:* $QIE2GurDJJ4D4D/D'DEEDD	DJJ$4$44A %)!W\
%)WW\\*%=
)3 9I ByA~$66D By4'7$88D9 &*!W
%)WW\\*%=

*:3aLA ww||~)Q.Q4u $i$****TZZ-=-===v c)#sdgq$))B-%@Ar    N)r   r   r   	_pulls_fdr   r   r    r   r   r     s    IAr    r   c                      e Zd ZdZdZd Zy)DibImageFileDIBr+   c                $    | j                          y )N)r   )r   s    r   r   zDibImageFile._openm  s    r    N)r   r   r   r   r   r   r   r    r   r   r   i  s    F)r    r   )rp   r   r   )rq   r      )r   r   r   )r   r   r   )rk   r   r   )rp   rq   r   r   rj   c                     t        | ||d       y )NF)_save)imrs   filenames      r   	_dib_saver     s    	"b(E"r    c           
     >   	 t         | j                     \  }}}| j                  }	|	j                  dd      }
t        d |
D              }| j                  d   |z  dz   dz  d	z   d
z  }d}|| j                  d   z  }| j                  dk(  rdj                  d dD              }nm| j                  dk(  r"dj                  d t        d      D              }n<| j                  dk(  r+| j                  j                  dd      }t        |      dz  }nd }|rWd|z   |dz  z   }||z   }|dkD  rd}t        |      |j                  dt        |      z   t        d      z   t        |      z          |j                  t        |      t        | j                  d         z   t        | j                  d         z   t!        d      z   t!        |      z   t        d      z   t        |      z   t        |d         z   t        |d         z   t        |      z   t        |      z          |j                  d|dz
  z         |r|j                  |       t#        j$                  | |dd| j                  z   d||dffg       y # t        $ r!}d| j                   d}t        |      |d }~ww xY w) Nzcannot write mode z as BMPrO   )`   r   c              3  >   K   | ]  }t        |d z  dz           yw)rJ   g      ?N)intrK   s     r   rN   z_save.<locals>.<genexpr>  s     41AK#%&4s   r   r@   r   r-   rr   r#   r   rp   r    c              3  8   K   | ]  }t        |      d z    ywr   Nr
   rL   is     r   rN   z_save.<locals>.<genexpr>  s     72a5197   ro   rq   c              3  8   K   | ]  }t        |      d z    ywr   r
   r   s     r   rN   z_save.<locals>.<genexpr>  s     92a5199r   r   r   r   r   r   rY   l    z)File size is too large for the BMP formatr   r   rZ   r   r6   )SAVEr   KeyErrorr|   encoderinfor~   rx   sizejoinr   r   
getpaletterz   
ValueErrorwriteo32o16r   r   )r   rs   r   bitmap_headerr   r=   rH   er   ry   rO   ppmstrider   imager   r   	file_sizes                     r   r   r     s   " $RWWv
 >>D
((5(
#C 44
4CwwqzD 1$*Q.26FFRWWQZE	ww#~((7h77	C((9eCj99	C%%""5&1W" fvz)UN	y =CS/!
)n!f &k	
 HHF
bggaj/	
bggaj/	 a&	 d)		
 a&	 e*	 c!f+	 c!f+	 f+		 f+
	 HHUfrk"#
OOBeVbgg%5q7FB:OPQRw  ""277)73cl!"s   I2 2	J;JJz.bmpz	image/bmprn   z.dib)T)!
__future__r   r    r   r   r   _binaryr   rw   r	   r'   r   r   r   r   r   r   r   r(   r*   	PyDecoderr   r   r   r   r   register_openr   register_saveregister_extensionregister_mimeregister_decoderr   r    r   <module>r      sy  2 # 	 , , ! !  ! ! 1^$9&& ^$BDI'' DT<  
		#>SL   L''w ?   L'' /   ,,f 5   L'' 5   y- 0   L''{ C   L'' 3   ,,f 5   L'' 5r    