B ¥.¦^Ñpã@sbddlZddlZddlZddlZddlmZmZmZmZm Z ddl m Z m Z mZmZdd„ZGdd„dejƒZd d d d œZd4d d„Zdd„Zdd„Zdd„Zdd„Zd5dd„Zdd„Zdd„Zdd„Zd Zdd „Zd!d"„Zd#d$„Z d%d&„Z!d'd(„Z"d)d*„Z#d+d,„Z$d6d-d.„Z%d7d0d1„Z&e 'ej(ee¡e )ej(e¡e *ej(e¡e +ej(d2¡e ,ej(d3¡dS)8éNé)ÚImageÚ ImageChopsÚ ImageFileÚ ImagePaletteÚ ImageSequence)Úi8Úi16leÚo8Úo16lecCs|dd…dkS)Né)sGIF87asGIF89a©)Úprefixr r ú6/tmp/pip-install-mwhup7aw/Pillow/PIL/GifImagePlugin.pyÚ_accept'src@sleZdZdZdZdZdZdd„Zdd„Ze d d „ƒZ e d d „ƒZ d d„Z dd„Z dd„Zdd„Zdd„ZdS)Ú GifImageFileZGIFzCompuserve GIFFNcCs,|j d¡}|r(t|ƒr(|j t|ƒ¡SdS)Nr)ÚfpÚreadr)ÚselfÚsr r rÚdata8s  zGifImageFile.datacCsH|j d¡}|dd…dkr$tdƒ‚|dd…|jd<t|dd…ƒt|dd…ƒf|_g|_t|dƒ}|d@d }|d @rt|d ƒ|jd <|j d |>¡}xvtdt |ƒd ƒD]b}|d t||ƒkrút||d ƒkrút||dƒks´nt   d|¡}||_ |_ Pq´W|j|_|j ¡|_d|_d|_| d¡dS)Né r )sGIF87asGIF89aznot a GIF fileÚversionéé éré€é Ú backgroundéréÚRGB)rrÚ SyntaxErrorÚinfoÚi16Ú_sizeÚtilerÚrangeÚlenrÚrawÚglobal_paletteÚpaletteÚ_GifImageFile__fpÚtellÚ_GifImageFile__rewindÚ _n_framesÚ _is_animatedÚ_seek)rrÚflagsÚbitsÚpÚir r rÚ_open>s* "   D   zGifImageFile._opencCsb|jdkr\| ¡}yx| | ¡d¡qWWn"tk rP| ¡d|_YnX| |¡|jS)Nr)r/r-ÚseekÚEOFError)rÚcurrentr r rÚn_frames\s  zGifImageFile.n_framescCsj|jdkrd|jdk r"|jdk|_nB| ¡}y| d¡d|_Wntk rXd|_YnX| |¡|jS)NrTF)r0r/r-r7r8)rr9r r rÚ is_animatedhs      zGifImageFile.is_animatedc CsŽ| |¡sdS||jkr0|dkr&d|_| d¡|j}xRt|jd|dƒD]:}y| |¡WqLtk r„| |¡tdƒ‚YqLXqLWdS)Nrrzno more images in GIF file)Z _seek_checkÚ_GifImageFile__frameÚimr1r'r8r7)rÚframeZ last_frameÚfr r rr7ys    zGifImageFile.seekc Cs„|dkrDd|_d|_ddddg|_d|_|j |j¡d|_d|_n|j sR|  ¡||jdkrlt d|ƒ‚||_g|_ |j|_ |jr¨|j  |j¡x | ¡r q–Wd|_|jrÀ|j  |j|j¡ddlm}||jƒ|_i}x¬|j  d¡}|rø|dkrüPqà|dkrR|j  d¡}| ¡}t|ƒdkr„t|dƒ}|d@rNt|d ƒ|d <t|dd …ƒd |d <d |@}|d?}|r>||_nºt|ƒdkrÐx8|rÊd|kr¶|d|7<n||d<| ¡}q”Wqànnt|ƒdkr>||j  ¡f|d<|dd…dkr>| ¡}t|ƒd kr>t|dƒdkr>t|dd …ƒ|d<x| ¡rNq@Wqà|dkrà|j  d¡}t|dd…ƒt|dd…ƒ}} |t|dd…ƒ| t|dd…ƒ} } | |jdksÒ| |jdkrôt| |jdƒt| |jdƒf|_|| | | f|_t|dƒ}|d@dk} |d@rJ|d@d} t d|j  d | >¡¡|_t|j  d¡ƒ} |j  ¡|_d|| | | f|j| | ffg|_ PqàqàWyz|jdkr¢d|_nH|jdkrÖt |j¡tj  d |j|j!d!¡|_n|j rê|j  ¡|_|jr| "|j|j¡|_Wnt#t$fk r YnX|j s.t%‚xrAr#rÚblockr2Z dispose_bitsZx0Zy0Úx1Úy1Ú interlacer3Úkr r rr1‰s¾              "* "            zGifImageFile._seekcCs|jS)N)r<)rr r rr-%szGifImageFile.tellcCs\tj |¡|jrL|jdkrL| |j|j¡}|j ||j| d¡¡|j|_|j  ¡|_dS)NrZRGBA) rÚload_endrUrVr^r=rTrYÚconvertrA)rÚupdatedr r rrg(s  zGifImageFile.load_endcCsBz4y|j|jkr|j ¡Wntk r0YnXWdd|_XdS)N)r,rÚcloser_)rr r rÚ _close__fp5s   zGifImageFile._close__fp)Ú__name__Ú __module__Ú __qualname__ÚformatÚformat_descriptionZ!_close_exclusive_fp_after_loadingr*rr6Úpropertyr:r;r7r1r-rgrkr r r rr0s  rrSrR)Ú1rSrRFcCsp|jtkr| ¡|St |j¡dkrf|r\d}|jrJt|j ¡dƒd}|jdtj |dS| d¡S| d¡S)a Takes an image (or frame), returns an image in a mode that is appropriate for saving in a Gif. It may return the original image, or it may return an image converted to palette or 'L' mode. UNDONE: What is the point of mucking with the initial call palette, for an image that shouldn't have a palette, or it would be a mode 'P' and get returned in the RAWMODE clause. :param im: Image object :param initial_call: Default false, set to true for a single frame. :returns: Image object r!érrrR)r+ÚcolorsrS) raÚRAWMODErWrZ getmodebaser+r(ÚgetdatarhZADAPTIVE)r=Z initial_callZ palette_sizer r rÚ_normalize_modeFs  rwc Csâd}|rjt|tttfƒr(t|dd…ƒ}t|tjƒrjttj t|j dd…|j dd…|j dd…ƒ¡ƒ}|j dkrŽ|s¸|j   d¡dd…}n*|s¨tdd„t dƒDƒƒ}tjd|d |_ t||ƒ}|dk rÖ| ||¡S||j _ |S) at Normalizes the palette for image. - Sets the palette to the incoming palette, if provided. - Ensures that there's a palette for L mode images - Optimizes the palette if necessary/desired. :param im: Image object :param palette: bytes object containing the source palette, or .... :param info: encoderinfo :returns: Image object NirsirRr!css|]}|dVqdS)rNr )Ú.0r5r r rú …sz%_normalize_palette..)r+)Ú isinstanceÚbytesÚ bytearrayÚlistrÚ itertoolsÚchainÚ from_iterableÚzipr+rar=Z getpaletter'Ú _get_optimizeZ remap_palette)r=r+r#Zsource_paletteÚused_palette_colorsr r rÚ_normalize_paletteds,       r„c CsÀt|dƒ}x$|j ¡D]\}}|j ||¡qWt|||jƒ}xt||jƒD]}| |¡qLWd}t|ƒrr|dB}t ||d|ƒdt|ƒf|_ t   ||dd|j dt|jfg¡| d¡dS)NTrrP)rrrrQó)rwr#ÚitemsÚ encoderinfoÚ setdefaultr„Ú_get_global_headerÚwriteÚ get_interlaceÚ_write_local_headerZ encoderconfigrÚ_saverZrura)r=rr+Zim_outrfÚvrr2r r rÚ_write_single_frames $rc CsÊ|j d|j d¡¡}|j d|j d¡¡}g}d}d}xºt |g|j dg¡¡D]œ}x”t |¡D]„} t|  ¡ƒ} |dkr¨x$| j  ¡D]\} } |j  | | ¡qŽWt | ||jƒ} |j ¡} t |t tfƒrÚ||| d<t |t tfƒrô||| d<|d7}|rØ|d} |  d¡dkrj|dkrdt||j d|j d¡¡ƒ}t d | j|¡}| |dd j¡|}n| d }t| ƒt|ƒkr’t | |¡}nt |  d ¡| d ¡¡}| ¡}|sÜ|rh| d d| d7<qhnd}| | || d œ¡qhWqTWt|ƒdkrx†|D]~}|d } |dsJx"t| |d ƒD]}| |¡q0Wd}n*d|d d<|  |d¡} |ddd…}t|| ||d ƒq WdSd|jkrÆt |jdt tfƒrÆt |jdƒ|jd<dS)NrFÚdisposalrZ append_imagesrr@r rrRr=r!r‡)r=Úbboxr‡r‘)rrTÚinclude_color_table)!r‡Úgetr#r~rrÚIteratorrwrAr†rˆr„rzr}ÚtupleÚ_get_backgroundrÚnewrZZ putpaletter+Ú_get_palette_bytesrZsubtract_modulorhZgetbboxÚappendr(r‰rŠZcropÚ_write_frame_dataÚsum)r=rr+rFrZ im_framesZ frame_countZ background_imZ imSequenceÚim_framerfrŽr‡ÚpreviousrZbase_imÚdeltar‘Z frame_datarÚoffsetr r rÚ_write_multiple_frames¥sn"        r cCst|||dddS)NT)Úsave_all)r)r=rÚfilenamer r rÚ _save_allòsr£cCs€d|jksd|jkr,|j d|j d¡¡}nd}|j dd¡|jd<|rTt|||ƒs`t|||ƒ| d¡t|dƒr|| ¡dS)Nr+ÚoptimizeTrBÚflush)r‡r#r“r rrŠÚhasattrr¥)r=rr¢r¡r+r r rrös   rcCs$|j dd¡}t|jƒdkr d}|S)Nrerér)r‡r“ÚminrZ)r=rer r rr‹sr‹cCs®d}y|jd}Wntk r&YnJXt|ƒ}d}t||jƒ}|dk rpy| |¡}Wntk rnd}YnXd|jkrŽt|jddƒ}nd}t|j dd¡ƒ}|s¶|dks¶|r|r¾dnd} | |d >O} |sÖd}| d td ƒtd ƒt| ƒt |ƒt|ƒtdƒ¡d |jkr°dt |jd ƒkr°| d tdƒ¡|jd } t | t ƒr`|   ¡} x@tdt | ƒdƒD],} | | | d…} | tt | ƒƒ| ¡qrW| tdƒ¡d|jkr|jd} | d tdƒtdƒdtdƒtdƒt | ƒtdƒ¡|j d¡}|rt|ƒd}|dkr8|tdƒd|7}|S)zä Returns the palette, null padded to the next power of 2 (*3) bytes suitable for direct inclusion in the GIF header :param palette_bytes: Unpadded palette bytes, in RGBRGB form :returns: Null padded palette r rr)r®r(r )r°r±Zactual_target_size_diffr r rr¯És r¯cCs|jjS)zš Gets the palette for inclusion in the gif header :param im: Image object :returns: Bytes, len<=768 suitable for inclusion in gif header )r+)r=r r rr˜Ûsr˜cCs&d}|r"|}t|tƒr"|j |¡}|S)Nr)rzr•r+Zgetcolor)r=ZinfoBackgroundrr r rr–ås   r–cCsØd}xndD]R}|r ||kr |dkr.||dks |dkrVdt||ƒkrRdksVq q d}Pq W|j d ¡dkrtd}t|| d ¡ƒ}t|ƒ}t|ƒ}d |t|jdƒt|jdƒt|d ƒt|ƒtdƒt |ƒgS) z2Return a list of strings representing a GIF headers87a)rErFrLrIrFrrIrrJs89arrsGIFr) r(r#r“r–r˜r®r«rZr r¯)r=r#rZ extensionKeyrr°r±r r rr‰ñs"  &" r‰c CsRzF||_t|||dƒt ||dd|jdt|jfg¡| d¡Wd|`XdS)NrrQ)rrr…)r‡rŒrrrZrurarŠ)rrœrŸÚparamsr r rršs ršcCsdt||ƒ}|dkri}d|kr6d|jkr6|jd|d<t|||ƒ}|j|_|j|_t||ƒ}||fS)a Legacy Method to get Gif data from image. Warning:: May modify image data. :param im: Image object :param palette: bytes object containing the source palette, or .... :param info: encoderinfo :returns: tuple of(list of header items, optimized palette) Nr)r‚r#r„r+r=r‰)r=r+r#rƒZim_modÚheaderr r rÚ getheader,s   rÏ©rrcKs0Gdd„dƒ}| ¡|ƒ}t||||ƒ|jS)a„ Legacy Method Return a list of strings representing this image. The first string is a local image header, the rest contains encoded image data. :param im: Image object :param offset: Tuple of (x, y) pixels. Defaults to (0,0) :param \**params: E.g. duration or other encoder info parameters :returns: List of Bytes containing gif encoded frame data c@seZdZgZdd„ZdS)zgetdata..CollectorcSs|j |¡dS)N)rr™)rrr r rrŠ\sz getdata..Collector.writeN)rlrmrnrrŠr r r rÚ CollectorYsrÑ)rWršr)r=rŸrÍrÑrr r rrvJs rvz.gifz image/gif)F)F)NN)rÐ)-r~rÊr¿r¸ÚrrrrrÚ_binaryrr r$r r r«rrrurwr„rr r£rr‹rŒrÄrÅr‚r®r¯r˜r–r‰ršrÏrvZ register_openroZ register_saveZregister_save_allZregister_extensionZ register_mimer r r rÚsD   ,M  T2%   '  !