a :jg.M@sddlmZddlZddlmZmZddlmZmZm Z ddl m Z ddl m Zddl mZdd l mZdd l mZd d d ddddZdddddZdddddZGdddejZGdddejZGdddeZdd d!d"d#d$Zd%d&d'd(d)d*d+Zd4d%d&d'dd(d-d.d/Zeejeee ejee!ejd0e"ejd1e#d2eeejeee ejee!ejd3e"ejd1dS)5) annotationsN)IOAny)Image ImageFile ImagePalette)i16le)i32leo8)o16le)o32le)PzP;1)rzP;4)rr)RGBBGR;15)rBGR)rBGRX)r bytesbool)prefixreturncCs|dddkS)NBMrrr|d <t|d tszJ|d1|dkr|d dkr|d|d 7}t|d d2\|_} |jsd3|d d0} t| d4} |d|j d$krgd5d6gd7d8gd9} d:d;dd?d@d?dAdBdCdD }|d | vr|d dEkr|d.| |d vrt|d.t spJ||d |d.f} dF| vrd>n|j|_nZ|d dGvr|d-| |d vrt|d-t sJ||d |d-f} n dH} t| n dH} t| nt|d|j d kr>|d dEkrz|dIkrzdJ\} |_n<|d|j dK|j dLfvrbdM} ndN|dd0} t| |jdOkrd|d krdPksndQ|d d0} t| nt|dtsJ|d}|||d }dR}|d dkrdSntt|d }t|D]8\}}|||||d}|t|dkrdT}q|rx|d dkrjdUndV|_|j} n"dO|_t|dkrd:ndA||_|d|j d<| g}| dMkr| |d|j dLkn6t|dtsJ| |d|d dWd?dX@| |dt| dd|d|d f|p<|jt |g|_dYS)Zz Read relevant info about the BMPr) header_size directionr9r#rwidthrheightZplanesbitsr0 compressionr.Zpalette_padding)r$r%r&r'r(r)Zy_fliprr:lr r data_sizerZpixels_per_metercolorscss|]}|dVqdS)o_C@Nr.0xrrr! z'BmpImageFile._bitmap..dpir3)r_maskg_maskb_mask0r%Za_mask$rNrOrPZrgb_maskZ rgba_maskzUnsupported BMP header type ())rUzUnsupported BMP pixel depth (raw)rAr~rXrYrr[rYrArr[rXrYrArArYrXr[rXrYrAr[r[rYrArXrrrrrXrYrAiii|ird)rrrrZXBGRZBGXRZABGRRGBABGRAZBGARrzBGR;16r) )rrW)rrZ)rr\)rr])rr^)rr_)rr`)rra)rrb)rrc)rrerA)rrz Unsupported BMP bitfields layout)rgrfr1r2bmp_rlezUnsupported BMP compression (rizUnsupported BMP Palette size (TrrAF1LrdN)fpreadseekr* isinstancer4r _safe_readi16 COMPRESSIONStupleinfolenappend enumerateOSError_sizegetBIT2MODE_modemodelistranger rrVpalette_TiletellZtile)selfr6r7rprq file_infoZ header_dataZmasksidxmaskmsgZraw_modeZ decoder_nameZ SUPPORTEDZ MASK_MODESpaddingrZ grayscaleindicesindvalrgbargsrrr!_bitmapKs<                     "zBmpImageFile._bitmaprcCs:|jd}t|s d}t|t|d}|j|ddS)z-Open file, check magic number and read headerrTzNot a BMP filerB)r7N)rorpr" SyntaxErrorr*r)rZ head_datarr7rrr!_open3s   zBmpImageFile._openN)rr) __name__ __module__ __qualname____doc__format_descriptionformatruitemskvvarsrrrrrr!r,?s ir,c@s eZdZdZdddddZdS) BmpRleDecoderTz$bytes | Image.SupportsArrayInterfaceztuple[int, int])bufferrcCs|jdusJ|jd}t}d}|jj|jj}t||krT|jd}|jd}|r`|sdqT|d}|r|||jjkrtd|jj|}|rt |dd?} t |dd@} t |D]"} | ddkr|| 7}q|| 7}qn |||7}||7}q2|ddkr0t||jjdkr*|d7}qd}q2|ddkrDqTq2|ddkr|jd} t| dkrpqT|jd\} }|d| ||jj7}t||jj}q2|r|dd}|j|} | D]&}|t |d?7}|t |d@7}qn|d}|j|} || 7}t| |kr$qT||d7}|j ddkr2|j dt jq2|jdkrddnd}|t||d|jd fd S) Nrrrrrmrr8)r8r)fdr bytearraystateZxsizeZysizerxrpmaxr rrrqosSEEK_CURrZ set_as_rawr)rrZrle4datarJZ dest_lengthZpixelsbyteZ num_pixelsZ first_pixelZ second_pixelindexZ bytes_readrightupZ byte_countZ byte_readrawmoderrr!decodeDsj               zBmpRleDecoder.decodeN)rrrZ _pulls_fdrrrrr!rAsrc@s"eZdZdZdZddddZdS) DibImageFileZDIBr-r5rcCs |dS)N)r)rrrr!rszDibImageFile._openN)rrrrrrrrrr!rsr)rlrr)rmr)rrr)rrr)rgrr)rlrmrrrfz Image.Imagez IO[bytes]z str | bytesr5)imrofilenamercCst|||ddS)NF)_save)rrorrrr! _dib_savesrT)rror bitmap_headerrc Cs,zt|j\}}}Wn<tyP}z$d|jd}t||WYd}~n d}~00|j} | dd} tdd| D} |jd|dd d d @} d } | |jd }|jdkrddddD}nP|jdkrdddt dD}n,|jdkr|j dd}t |d}nd}|rld| |d}||}|dkrJd}t ||dt|tdt||t| t|jdt|jd td t|tdt|t| dt| d t|t||d| d |r||t||tdd|jd|| d fgdS)!Nzcannot write mode z as BMPrM)`rcss|]}t|ddVqdS)rGg?N)r4rHrrr!rKrLz_save..rr@rr.rnr$rrlrLcss|]}t|dVqdSrNr rIirrr!rKrLrkrmcss|]}t|dVqdSrr rrrr!rKrLrrrrrrTlz)File size is too large for the BMP formatrrrV)rrr8)SAVErKeyErrorr{Z encoderinfor}rvsizejoinrrZ getpaletterx ValueErrorwriteo32o16rrr)rrorrrr>rFerrwrMppmZstrider6imagerr7 file_sizerrr!rs~              rz.bmpz image/bmprjz.dib)T)$ __future__rrtypingrrrUrrr_binaryr rtr r*r r rrrr~r"r+r,Z PyDecoderrrrrrZ register_openrZ register_saveZregister_extensionZ register_mimeZregister_decoderrrrr!sP       L J