3 }\Sn@sFddlmZmZmZmZmZddlmZmZ m Z m Z ddl Z dZddZGdd d ejZd d d d Zd2ddZddZddZddZddZd3ddZddZddZddZd Zd d!Zd"d#Zd$d%Zd&d'Zd(d)Z d*d+Z!d4d,d-Z"d6d.d/Z#ej$ej%eeej&ej%eej'ej%eej(ej%d0ej)ej%d1dS)7)Image ImageFile ImagePalette ImageChops ImageSequence)i8i16leo8o16leNz0.9cCs|dddkS)NGIF87aGIF89a)r r)prefixrrj/private/var/folders/pf/wv4htv3x0qs2c2mp0dnn0kchsvlck3/T/pip-install-i584jbuk/Pillow/PIL/GifImagePlugin.py_accept(src@sleZdZdZdZdZdZddZddZe d d Z e d d Z d dZ ddZ ddZddZddZdS) GifImageFileZGIFzCompuserve GIFFNcCs,|jjd}|r(t|r(|jjt|SdS)Nr)fpreadr)selfsrrrdata8s  zGifImageFile.datacCsJ|jjd}|dddkr$td|dd|jd<t|ddt|ddf|_g|_t|d}|d @d }|d @rt|d |jd <|jjd|>}xxtdt |dD]d}|dt||kot||d kot||dknst j d|}||_ |_ PqW|j|_|jj|_d|_d|_|jddS)N r GIF87aGIF89aznot a GIF fileversion r backgroundr RGB)rr)rr SyntaxErrorinfoi16_sizetilerrangelenrrawglobal_palettepalette_GifImageFile__fptell_GifImageFile__rewind _n_frames _is_animated_seek)rrflagsbitspirrr_open>s* "   F   zGifImageFile._openc Csb|jdkr\|j}yx|j|jdqWWn"tk rP|jd|_YnX|j||jS)Nr)r3r1seekEOFError)rcurrentrrrn_frames\s  zGifImageFile.n_framesc Csj|jdkrd|jdk r"|jdk|_nB|j}y|jdd|_Wntk rXd|_YnX|j||jS)NrTF)r4r3r1r;r<)rr=rrr is_animatedhs      zGifImageFile.is_animatedc Cs|j|sdS||jkr0|dkr&d|_|jd|j}xRt|jd|dD]:}y|j|WqLtk r|j|tdYqLXqLWdS)Nr rzno more images in GIF file)Z _seek_check_GifImageFile__frameimr5r+r<r;)rframeZ last_framefrrrr;ys    zGifImageFile.seekc Cs:|dkrDd|_d|_ddddg|_d"|_|jj|jd|_d|_n|j sR|j ||jdkrlt d|||_g|_ |j|_ |jr|j j|jx |jrqWd|_|jr|j j|j|jddlm}||j|_i}xn|j jd}| p|dkrPq|dkrV|j jd}|j}t|dkrt|d}|d@rRt|d|d <t|ddd |d <d |@}|d ?}|rB||_nt|dkrx8|rd|kr|d|7<n||d<|j}qWqnnt|dkrB||j jf|d<|dddkrB|j}t|dkrBt|ddkrBt|dd|d<x|jrRqDWq|dkr|j jd}t|ddt|d d}} |t|dd| t|dd} } || | | f|_t|d}|d@dk} |d@r |d@d} tjd|j jd| >|_t|j jd} |j j|_d|| | | f|j| | ffg|_ PqqWyn|jd krdd|_n<|jd krtjjd|j|jd |_n|j r|j j|_|jr|j|j|j|_Wnt t!fk rYnX|j st"xr?r;r5r1rjrnrrrrr0s rrVrU)1rVrUFcCsp|jtkr|j|Stj|jdkrf|r\d}|jrJt|jjdd}|jdtj |dS|jdS|jdS)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%rr#rU)r/colorsrV) rdRAWMODEr[rZ getmodebaser/r,getdatarkZADAPTIVE)rAZ initial_callZ palette_sizerrr_normalize_modeIs  rzcCsd}|rjt|tttfr(t|dd}t|tjrjttjjt|j dd|j dd|j dd}|j dkr|s|j j ddd}n*|stddt dD}tjd|d |_ t||}|dk r|j||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 NirvirUr%css|]}|dVqdS)r#Nr).0r9rrr sz%_normalize_palette..)r/) isinstancebytes bytearraylistr itertoolschain from_iterablezipr/rdrAZ getpaletter+ _get_optimizeZ remap_palette)rAr/r'Zsource_paletteused_palette_colorsrrr_normalize_palettegs*       rcCst|d}x$|jjD]\}}|jj||qWt|||j}xt||jD]}|j|qLWd}t|rr|dB}t ||d|dt|f|_ t j ||dd|j dt|jfg|jddS) NTr rSrrT)r r )r r )rzr'items encoderinfo setdefaultr_get_global_headerwrite get_interlace_write_local_headerZ encoderconfigr_saver`rxrd)rArr/Zim_outrivrr6rrr_write_single_frames rcCs4|jjd|jjd}|jjd|jjd}g}d}x^tj|g|jjdgD]@}x8tj|D](}t|j}|dkrx$|jj D]\} } |jj | | qWt |||j}|jj} t |t tfr||| d<t |t tfr||| d<|d7}|rx|d} t|t| dkr.tj|| d} ntj|jd| djd} | j}|s||rd| dd| d7<qdnd}|j||| d qdWqPWt|dkr0x|D]~}|d}|d sx"t||dD]}|j|qWd}n*d |dd <|j|d }|d dd }t||||dqWd SdS)NrIdisposalr Z append_imagesrrAr%r)rAbboxrrTinclude_color_tabler$rW)r r )rgetr'rrrIteratorrzrDrrrr}rtuple_get_palette_bytesrZsubtract_modulorkZgetbboxappendr,rrZcrop_write_frame_data)rArr/rIrZ im_framesZ frame_countZ imSequenceim_framerirrpreviousdeltarZ frame_dataroffsetrrr_write_multiple_framessd           rcCst|||dddS)NT)save_all)r)rArfilenamerrr _save_allsrcCsd|jksd|jkr,|jjd|jjd}nd}|jjdd|jd<| sXt||| rdt||||jdt|dr|jdS)Nr/optimizeTrEflush)rr'rrrrhasattrr)rArrrr/rrrrs   rcCs$|jjdd}t|jdkr d}|S)Nrhrr )rrminr`)rArhrrrrsrcCsd}y|jd}Wntk r&YnJXt|}d}t||j}|dk rpy|j|}Wntk rnd}YnXd|jkrt|jdd}nd}t|jjdd}|s|dks|r|rdnd} | |d >O} |sd}|jd td td t| t |t|tdd |jkrdt |jd kr|jd tdxLt dt |jd dD]2} |jd | | d} |jtt | | qZW|jtdd|jkr|jd} |jd tdtddtdtdt | td|jjd} | r*t |}t |}|r*|dB}||B}|jdt |dt |dt |jdt |jdt|| r|r|jt||jtddS)NFrHTrIrr rrr$rFrGrRrLrKrMrOr!s NETSCAPE2.0r#rr rPr)rrcintrindexr\rrr o16r,r+r_get_color_table_sizer`_get_header_palette)rrArr6Ztransparent_color_existsrHrrIrZ packed_flagr9ZsubblockZnumber_of_loopsr palette_bytescolor_table_sizerrrrsh     *     .  6  rcCsddl}ddlm}m}m}m}|j}t|d} |jdkrjt|j d} |d|g| | dWdQRXn~dd|g} dg} t|j d&} || || d} || | j | | d }WdQRX| j j | j }|r||| |j }|r||| WdQRXy|j |Wntk rYnXdS) Nr )Popen check_callPIPECalledProcessErrorwbr%Zppmtogif)stdoutstderrZppmquantZ256)stdinrr)os subprocessrrrr_dumpopenrddevnullrrmwaitunlinkOSError)rArrrrrrrtempfilerCrZ quant_cmdZ togif_cmdZ quant_procZ togif_procretcoderrr _save_netpbmVs0      rcCs|jdkr|r|jddrtp&|jdk}|s<|j|jd krg}x&t|jD]\}}|rN|j|qNW|st|dkrt |t|kr|SdS) aL Palette optimization is a potentially expensive operation. This function determines if the palette should be optimized using some heuristics, then returns the list of palette entries in use. :param im: Image object :param info: encoderinfo :returns: list of indexes of palette entries in use, or None rUrVrr ir N)rUrVi) rdr_FORCE_OPTIMIZEwidthheight enumerateZ histogramrr,max)rAr'Zoptimiserr9countrrrrs  rcCs:ddl}t|j|jt|ddd}|dkr6d}|S)Nr r#r$r)mathrceillogr,)rrrrrrrs "rcCs<t|}d|>t|d}|dkr8|tdd|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$r#r )rr,r )rrZactual_target_size_diffrrrrs rcCs|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/)rArrrrsrcCsd}xrdD]V}|r ||kr |dkr.||dks |dkrZdt||koPdkn rZq d }Pq W|jjd d krxd }d}d |kr|d }t|tr|jj|}t|}t|}d |t |j dt |j dt |d t |t dt |gS)z2Return a list of strings representing a GIF headers87arHrIrOrLr rrMs89arr"sGIFr )rHrIrOrL) r,r'rr}rr/Zgetcolorrrrr`r r)rAr'rZ extensionKeyr"rrrrrrs.  "   rcCsRzF||_t|||dtj||dd|jdt|jfg|jdWd|`XdS)Nr rTr)r r )rrrrr`rxrdr)rrrparamsrrrrsrcCsdt||}|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")rr'rr/rAr)rAr/r'rZim_modheaderrrr getheaders   rcKs2Gdddt}|j|}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@seZdZgZddZdS)zgetdata..CollectorcSs|jj|dS)N)rr)rrrrrr?sz getdata..Collector.writeN)rorprqrrrrrr Collector<sr)objectr[rr)rArrrrrrrry.s ryz.gifz image/gif)F)F)NNr r )r)*rrrrr_binaryrrr(r r rr __version__rrrxrzrrrrrrrrrrrrrrrrryZ register_openrrZ register_saveZregister_save_allZregister_extensionZ register_mimerrrrsB (D  N.#  /