
    ZMh                       d dl mZ d dlZd dlZd dlZd dlZd dlmZ d dlm	Z	 d dl
mZmZmZmZmZ ddlmZmZmZmZ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Z e rddlm!Z! ddl"m#Z#  G d de          Z$e$j%        Z&dOdZ' G d dej                  Z(ddddZ)dPdZ*ee+e,e-e.         ej        f         Z/dQd"Z0dRd&Z1dSd*Z2 G d+ d,e          Z3dTd-Z4dUd0Z5	 dVdWd2Z6dXd4Z7dYd8Z8dUd9Z9dZ:dZd;Z;d[d=Z<d\d>Z=d]d?Z>d^dBZ?d_dDZ@d`dFZA	 dadbdIZB	 dcdddLZC ejD        e(jE        e(e'            ejF        e(jE        e6            ejG        e(jE        e5            ejH        e(jE        dM            ejI        e(jE        dN           dS )e    )annotationsN)IntEnum)cached_property)IOAnyLiteral
NamedTupleUnion   )Image
ImageChops	ImageFile	ImageMathImageOpsImagePaletteImageSequence)i16le)o8)o16le)DeferredErrorF)_imaging)Bufferc                      e Zd ZdZdZdZdZdS )LoadingStrategyz.. versionadded:: 9.1.0r   r      N)__name__
__module____qualname____doc__RGB_AFTER_FIRST RGB_AFTER_DIFFERENT_PALETTE_ONLY
RGB_ALWAYS     R/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/PIL/GifImagePlugin.pyr   r   8   s$        !!O'($JJJr$   r   prefixbytesreturnboolc                ,    |                      d          S )N)s   GIF87as   GIF89a)
startswith)r&   s    r%   _acceptr,   G   s    3444r$   c                       e Zd ZdZdZdZdZddZddZddZ	e
dd            Zedd            ZddZdd dZd fdZddZddZ xZS )!GifImageFileGIFzCompuserve GIFFNr(   bytes | Nonec                    | j                             d          }|r(|d         r | j                             |d                   S d S )Nr   r   )fpread)selfss     r%   datazGifImageFile.dataW   sC    GLLOO 	&1 	&7<<!%%%tr$   pr'   r)   c                    t          dt          |          d          D ]6}|dz  ||         cxk    r||dz            cxk    r||dz            k    sn  dS 7dS )Nr      r   r   TF)rangelen)r4   r7   is      r%   _is_palette_neededzGifImageFile._is_palette_needed]   sy    q#a&&!$$ 	 	AFad::::aAh::::!AE(::::tt ;ur$   Nonec                h   | j                             d          }t          |          sd}t          |          |d d         | j        d<   t          |d          t          |d          f| _        |d         }|dz  dz   }|d	z  re|d
         | j        d<   | j                             d|z            }|                     |          r#t          j	        d|          }|x| _
        | _        | j         | _        | j                                         | _        d | _        |                     d           d S )N   znot a GIF file   version   
      r         
backgroundr9   RGBr   )r2   r3   r,   SyntaxErrorinfoi16_sizer=   r   rawglobal_palettepalette_fptell_GifImageFile__rewind	_n_frames_seek)r4   r5   msgflagsbitsr7   s         r%   _openzGifImageFile._openc   s   GLLqzz 	#"Cc""" !u	)AYYAq		)
"	Q3; 	7&'eDIl#Q$Y''A&&q)) 7 $UA..566#dl7%)

1r$   intc                $   | j         |                                 }	 	 |                     |                                 dz   d           ,# t          $ r |                                 dz   | _         Y nw xY w|                     |           | j         S )NTr   FrT   rR   rU   EOFErrorseek)r4   currents     r%   n_frameszGifImageFile.n_frames}   s    >!iikkG17JJtyy{{Q6667 1 1 1!%q1IIg~s   -A
 
&A32A3c                    | j         | j         dk    S |                                 }|rdS 	 |                     dd           d}n# t          $ r d}Y nw xY w|                     |           |S )Nr   TFr\   )r4   r_   is_animateds      r%   rb   zGifImageFile.is_animated   s    >%>Q&&))++ 	4	 JJq%   KK 	  	  	 KKK	  			's   A AAframec                j   |                      |          sd S || j        k     rd | _        |                     d           | j        }t	          | j        dz   |dz             D ]Q}	 |                     |           # t
          $ r,}|                     |           d}t          |          |d }~ww xY wd S )Nr   r   no more images in GIF file)_seek_check_GifImageFile__frame_imrU   r:   r]   r^   )r4   rc   
last_frameferV   s         r%   r^   zGifImageFile.seek   s    && 	F4<DHJJqMMM\
t|a'33 	+ 	+A+

1 + + +		*%%%2smm*+	+ 	+s   $A::
B0'B++B0Tupdate_imagec                    t           j        t                    r j        j        |dk    rMd _        d  _        d _         j                             j                   d _	        d j
        v r j
        d= n j        r|r                                  | j        dz   k    rd| }t          |           j         _         j        rO j                             j                                                    r	                                  d _         j                            d          }|r|dk    rd}t#          |          d }i }d }d }d }		 |s j                            d          }|r|dk    rn|d	k    r j                            d          }                                 }
|d         d
k    rA|
?|
d         }|dz  r|
d         }t%          |
d          dz  |d<   d|z  }|dz	  }|r| _	        n|d         dk    r?d}|
r||
z  }                                 }
|
d|v r|dxx         d|z   z  cc<   n||d<   d }|d         dk    r|dk    r|
|
 j                                        f|d<   |
                    d          rM                                 }
|
r7t+          |
          dk    r$|
d         dk    rt%          |
d           j
        d<                                    r	                                  n|dk    r j                            d          }t%          |d          t%          |d          }}|t%          |d          z   |t%          |d          z   }}| j        d         k    s| j        d         k    rV|rTt/          | j        d                   t/          | j        d                   f _        t3          j         j                   ||||f}	|d         }|dz  dk    }|dz  rR|dz  dz   } j                            d|z            }                     |          rt9          j        d|          }nd } j                            d          d         } j                                         _        nd }B|d!}t#          |          | _        |sd S g  _         j        r% j                             j         j                    ||n j!         _"        | _#        |dk    rl j"        r)tH          tJ          j&        k    r|d"nd _'        nd# _'        nd$ _'        |r| _(        n j!        rdd%l)m)}  | j!                   _(        nd  _(        nƉ j*        d#k    rtH          tJ          j+        k    s|rd& j
        v re j        ,                     j
        d&         d            j        -                    d"t2          j.        j/                   _        d" _'         j
        d&= n6d _'         j        -                    dt2          j.        j/                   _        d1 fd+}d  _        |	 _          j         r j	        dk    rt	  j	        dk    r j         \  }}}}||z
  ||z
  f}t3          j        |           d#} j
        0                    d&|          }| j*        d,v rd"} ||          d-z   }n1 j
        0                    d.d          } j*        d,v rd} ||          }t2          j1        2                    |||           _        n j3        & 4                     j         j                    _        no|m j         \  }}}}||z
  ||z
  f}t3          j        |           d#}|} j*        d,v rd"} ||          d-z   }t2          j1        2                    |||           _        n# tj          $ r Y nw xY w|^d}|1|dk    r tH          tJ          j&        k    r
| j
        d&<   n j*        d,vr|}tm          j7        d/||||f j        |||f          g _        |0                    d          r|d          j
        d<   d0D ](}||v r||          j
        |<   | j
        v r j
        |= )d S )2Nr   commentr   zcannot seek to frame    ;re   T   !   r9   rD   duration   r      r$      
   	extension   NETSCAPE2.0loop   ,	      rA   rC   @   rF   rE   rI   Fzimage not found in GIF frameRGBAPL)copytransparencycolorrZ   r(   tuple[int, int, int]c                    j         rO| dz  dz   t          j         j                  k    rd} t          j         j        | dz  | dz  dz                      S | | | fS )Nr9   r   )_frame_paletter;   rP   tuple)r   r4   s    r%   _rgbz GifImageFile._seek.<locals>._rgb]  sl    " -19q=3t':'B#C#CCCET08UQYQR]9RSTTTue,,r$   rI   r   )r   rH   gif)rs   rx   )r   rZ   r(   r   )8
isinstancerQ   r   ex_GifImageFile__offsetdisposerg   r^   rS   disposal_methodrK   tileload
ValueErrorr2   r6   r3   r]   rL   rR   r+   r;   sizemaxrM   r   _decompression_bomb_checkr=   r   rN   impastedispose_extentrO   r   _frame_transparencyLOADING_STRATEGYr   r"   _moderP   r   moder!   putpalettealphaconvertDitherFLOYDSTEINBERGgetcorefillrh   _cropAttributeErrorr   _Tile)r4   rc   rl   rV   r5   rP   rK   frame_transparency	interlaceframe_dispose_extentblockrW   dispose_bitsro   x0y0x1y1rX   r7   r   r   dispose_sizedispose_moder   r   ks   `                          r%   rU   zGifImageFile._seek   si	   dh.. 	(+A::DM8<DLDLHMM$-(((#$D DI%%Ii( y \ 		DL1$$$1%11CS//!(= 	GLL'''))++  ))++ DMGLLOO 	 AII.C3--EI!!	#Y	 $GLLOO UT		d GLLOO		Q43;;5#4 "!HEqy 6-21X*'*5!}}r'9D$ $.#5L#/1#4L# <
 0<,qTS[[ "G   ,5( $		   , !D((Y57?:*1YAqTS[[UaZZE4E ).tw||~~(=D%''77 > $		  >SZZ1__qQ03E1DIf-iikk  iikk  d GLLOO QC1IIBc!Qiic!QiiB1%%dil):):):!$R1!6!6B	!8M8M!MDJ3DJ???')2r2~$!"RZA-	3; (!AI?DQ$Y//A..q11 ("."25!"<"<"' w||Aq) $AsY	v 0C3-- 	F	< 	=GMM$,(;<<<)0)<gg$BU#5 A::" !#'AAA+=+IuDJJ!$DJJ 
 $&$ $%%%%%%#tD$788#yC$(XXX Y &22//	.0I1MMM"&'//&%,:U"V"V%+
 In55%*
"&'//%9T"U"U	- 	- 	- 	- 	- 	- 2 +	4#71#<#<*'1,, &*%8NBB$&GR"W#5L3LAAA $'L IMM.:LMME(977+1L$(DKK$$6E $	lA > >977+0L$(DKKE#(:??<u#U#UDLL x+'+zz$'4;N'O'O+7)-)<BB(*Rb'97EEE'* 2977+1L$(D);$<$<t$CE',z(,( ( "     L!-A::'?+EEE4F	.1Yo55#5LR$M9l3	 DI 88I 	3#'	?DIi * 	! 	!ADyy#Aw	!diIaL		! 	!s   %E"_ 
__c                h   | j         rdnd}d | _        | j        dk    r8| j        0t          j                            || j        | j                  | _        n| j	        dv rw| j        | _        | j         r]t          j                            d| j        | j        pd          | _         | j        j
        dg| j                                         R   nd | _        | j        s| j        | j        | j        j        k    rt          j                            | j        j	        | j                  }| j         r% |j
        dg| j                                         R   |                    | j        d| j        j        z              || _        || _        d | _         t                                                       d S )Nr   r   r   r   rI   r   r   )r   _prev_imrg   r   r   r   r   r   r   r   
putpalettegetdatarh   r   r   superload_prepare)r4   	temp_modeexpanded_im	__class__s      r%   r   zGifImageFile.load_prepare  s   .7CCC	<1'3*//ty$*B  Y/)) GDM"  *//#ty$:R:WVWXX""5I4+>+F+F+H+HIIIII} 	"!5$)tw|:S:S*//$',	BBK" N&&uMt/B/J/J/L/LMMMMdgv'<===!DG
"r$   c                   | j         dk    r| j        dk    rt          t          j        k    rj| j        (| j                            | j        d           d| _        nd| _        | j        	                    | j        t          j        j                  | _        d S | j        sd S | j        | j        j        k    r| j        &t          j                            d| j                  }nht          j                            d| j                  }|                    dd| j                                                   |	                    d          }|                    | j        d| j        j        z              || _        | j        J | j        ;| j                            | j        d           | j        	                    d          }n| j        	                    d          }| j        J |                     || j                  }| j        | _        | j        j        | _        |j        dk    r#| j                            || j        |           d S | j                            || j                   d S )Nr   r   r   rI   r   )rg   r   r   r   r"   r   r   r   r   r   r   r   r   r   r   r   r   r   
getpaletter   r   r   )r4   r   frame_ims      r%   load_endzGifImageFile.load_end  s   <1yC$48R$R$R+7G++D,DaHHH!'DJJ!&DJ'//$)U\5PQQF} 	F9***'3#joofdi@@#jooc49==&&ueTW5G5G5I5IJJJ)11%88dmVdm6H-HIII'DM=,,,#/G##D$<a@@@wv..HHwu--H"...::h(;<<-W\
=F""GMM(D$7BBBBBGMM(D$788888r$   c                    | j         S N)rg   )r4   s    r%   rR   zGifImageFile.tell  s
    |r$   )r(   r0   )r7   r'   r(   r)   )r(   r>   )r(   rZ   )r(   r)   )rc   rZ   r(   r>   )T)rc   rZ   rl   r)   r(   r>   )r   r   r   formatformat_description!_close_exclusive_fp_after_loadingrO   r6   r=   rY   propertyr`   r   rb   r^   rU   r   r   rR   __classcell__)r   s   @r%   r.   r.   P   s+       F)(-%N         4 	 	 	 X	    _"+ + + + @! @! @! @! @!D     6%9 %9 %9 %9N       r$   r.   r   r   )1r   r   r   Image.Imagec                   | j         t          v r|                                  | S t          j        | j                   dk    rx|                     dt          j        j                  } | j        J | j        j         dk    r7| j        j	        D ]*}|d         dk    r| j        j	        |         | j
        d<    n+| 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.

    :param im: Image object
    :returns: Image object
    rI   r   rP   Nr   r9   r   r   r   )r   RAWMODEr   r   getmodebaser   PaletteADAPTIVErP   colorsrK   )r   rgbas     r%   _normalize_moder     s     
w'
				!!U**ZZU]%;Z<<z%%%:?f$$
)  7a<<.0j.?.EBGN+E   	::c??r$   rP   _Palette | NonerK   dict[str, Any]c                   d}|rgt          |t          t          t          f          rt          |dd                   }t          |t          j                  rt          |j                  }| j        dk    r+|s(|                     d          }|J t          |          }nC|s&t          d t          d          D                       }t	          j        d|          | _        |J |rg }| j        J t          dt          |          d          D ]V}t          |||dz                      }| j        j                            |          }||v rd}|                    |           Wt          |          D ]1\  }}|*t          t          |                    D ]}	|	|vr|	||<    n2g }
|D ]}|J |
                    |           |                     |
          } nat!          | |          }|O|                     ||          } d	|v r3	 |                    |d	                   |d	<   n# t$          $ r |d	= Y nw xY w| S | j        J || 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
    Ni   r   c              3      K   | ]	}|d z  V  
dS )r9   Nr#   ).0r<   s     r%   	<genexpr>z%_normalize_palette.<locals>.<genexpr>4  s&      &B&B!qAv&B&B&B&B&B&Br$   rI   r   r   r9   r   )r   r'   	bytearraylistr   rP   r   r   r:   r;   r   r   r   append	enumerateremap_palette_get_optimizeindexr   )r   rP   rK   source_palette
im_paletteused_palette_colorsr<   source_colorr   jdest_mapoptimized_palette_colorss               r%   _normalize_paletter     s    N 8gy$788 	6&wtt}55Ng|899 	8&w77N	w#~~ 	3t,,J)))&z22N 	C&&B&BuSzz&B&B&BBBN!.unMMM
%%% 02z%%%q#n--q11 	. 	.A AE	!:;;LJ%)),77E+++&&u----!"566 	 	HAu}s#67788  A 33312+A. 4 !( 	# 	#E$$$OOE""""h''#0T#:#: #/!!":NKKB%%-+C+I+I^,, ,D(( " - - -^,,,-I:!!!'BJIs   H. .H>=H>r2   	IO[bytes]r>   c                v   t          |           }|j                                        D ]5\  }}t          |t                    r| j                            ||           6t          ||| j                  }t          || j                  D ]}|	                    |           d}t          |           r|dz  }t          || d|           dt          |           f|_        t          j        ||t          j        dd| j        z   dt"          |j                           g           |	                    d           d S )Nr   r~   r   rC   r       )r   rK   itemsr   strencoderinfo
setdefaultr   _get_global_headerwriteget_interlace_write_local_headerencoderconfigr   _saver   r   r   r   )r   r2   rP   im_outr   vr5   rW   s           r%   _write_single_framer   ^  s6   
 R  F!!## , ,1a 	,N%%a+++@@F77  
 ER 
B...}R001FOY_UFRW,<aAUVVW   HHUOOOOOr$   base_imim_frame4tuple[Image.Image, tuple[int, int, int, int] | None]c                    d | |fD             }|d         |d         k    r*|                     d          }|                      d          } t          j        ||           }||                    d          fS )Nc                R    g | ]$}|j         rt          |j         j                   nd %S )r$   )rP   r'   )r   r   s     r%   
<listcomp>z_getbbox.<locals>.<listcomp>}  s>       =?RZ8bj !!!S  r$   r   r   r   F)
alpha_only)r   r   subtract_modulogetbbox)r   r   palette_bytesdeltas       r%   _getbboxr  z  s     DKXCV  M Q=+++##F++//&))&x99E%--5-1111r$   c                  .    e Zd ZU ded<   ded<   ded<   dS )_Framer   r   z tuple[int, int, int, int] | Nonebboxr   r   N)r   r   r   __annotations__r#   r$   r%   r  r    s3         OOO****r$   r  c           	         | j                             d          }| j                             d| j                            d                    }g }d }d}d }t          j        | g| j                             dg                     D ]}	t          j        |	          D ]}
t          |
                                          }
|dk    rV|
j        	                                D ]<\  }}|dk    rt          |t                    r| j                             ||           =| j                                         }d|
j        v r!|                    d|
j        d                    t          |
||          }
t          |t          t          f          r||         |d<   n|d|
j        v r|
j        d         |d<   t          |t          t          f          r||         |d<   |dz  }d }|r|rt!          ||
          \  }}|s8|                    d          r!|d         j         dxx         |d         z  cc<   |d         j                             d          dk    r| j                             d| j                            d                    }|v|\t#          |
|          }t%          j        d	|
j        |          }|d         j        j        }|J |                    ||j                   t!          ||
          d         }ntd
|
j        z   }nh|                    d          rO|
j        dk    rCd|vr8|
j        J 	 |
j                            |
          |d<   n# t4          $ r Y nw xY wd|v r|
                                }t%          j        d	|j        |d                   }|j        dk    r4|                                \  }}}}t9          j        d ||||          }ne|j        d	k    rCt%          j        d|j                  }|                    |                                           |}t9          j        d |          }|                     |tC          j"        |                     nd }|
}|#                    tI          |p|
||                     tK          |          dk    r&d| j         v r|d         j         d         | j         d<   dS |D ]}|j        }
|j&        s0tO          |
|j                   D ]}|(                    |           d
}nH|s
d|j         d<   |j&        d
|
j        z   k    r|
)                    |j&                  }
|j&        d d         }tU          ||
||j                    dS )Nrs   disposalr   append_imagesr   r   rn   r   r   r   optimizer   r   c                     | d          | d          | d          | d         | d         | d                   | d                   | d                   dz  d          S )	Nr   r   rgbarw   r   r#   argss    r%   <lambda>z(_write_multiple_frames.<locals>.<lambda>  sv    _T)_$/DK(3U,7DKS	49,M,MtTWy)* )* )-S		%& %& '*%* %(	." 	." r$   )r  r  r  r  r   c                8     | d         | d         dz  d          S )Nr   r   rw   r   r#   r  s    r%   r  z(_write_multiple_frames.<locals>.<lambda>  s    _T)_T$Z#=Ms-S-S r$   )r   )maskFTinclude_color_table)+r   r   rK   	itertoolschainr   Iteratorr   r   r   r   r   r   r   r   r   r  _get_backgroundr   newr   r   rP   r   r   _new_color_indexr   splitr   lambda_evalputdatar   r   r   invertr   r  r;   r  r   r   crop_write_frame_data)r   r2   rP   rs   r
  	im_framesprevious_imframe_countbackground_im
imSequencer   r   r   r   
diff_framer  r  r   rH   first_paletter   r  r  r  r  r  delta_l
frame_datar5   offsets                                 r%   _write_multiple_framesr.    s    ~!!*--H~!!*bgkk*.E.EFFH I&*KKMordBN,>,>PR,S,STT ]P ]P
%.z:: \	P \	PH&x}}77Ha$M//11 8 8DAqN** !!S)) 811!Q777.--//K..&&~x}^7TUUU)(G[IIH(T5M22 D*2;*?J''!jHM&A&A*2-
*CJ'(T5M22 @*2;*?J'1KJ C[ C&{H==t "z22 Y!"1*===ZAXX===R=,00<<AA N..&N(C(C E ((0)85)I)IJ,1Ic8=*,U,UM,5aLO,CM#0#<#<#<)44]MDVWWW'x@@C%5 __Z00 )KX]c5I5I%[88'/;;;! ( 0 A A( K K (77  * ! ! ! D!%44%-]]__
$yej+n:UVV ://).JAq!Q#,#8	!" 	!" #$"#"#"#$ $ $DD"  %zS00*/)C*D*D ' @ @ @(/#,#8 S S#($ $ $D #((HOD4I4I(JJJ"KVJ$:(D+NNOOOOy\	P| 9~~'')21)A*)MBN:&u H H
= 	)'*2HII  FF  E@D
&'<=&8="888#==99_RaR(F"h
0FGGGG4s   ?M
M*)M*filenamestr | bytesc                ,    t          | ||d           d S )NT)save_all)r   )r   r2   r/  s      r%   	_save_allr3    s    	"b(T******r$   r2  c                   d| j         v s	d| j        v r4| j                             d| j                            d                    }nd }| j                             dd           |rt	          | ||          st          | ||           |                    d           t          |d          r|                                 d S d S )NrP   r  Trp   flush)	r   rK   r   r   r.  r   r   hasattrr5  )r   r2   r/  r2  rP   s        r%   r   r     s     BN""i27&:&:.$$YI0F0FGG
!!*d333 -1"b'BB -BG,,,HHTNNNr7 





 r$   rZ   c                p    | j                             dd          }t          | j                  dk     rd}|S )Nr   r      r   )r   r   minr   )r   r   s     r%   r   r   &  s9    "";22I 27||b	r$   r-  tuple[int, int]rW   c                2   	 |j         d         }n# t          $ r d }Y nw xY wd|j         v rt          |j         d         dz            }nd}t          |j                             dd                    }||dk    s|r|dnd}||dz  z  }|                     dt          d	          z   t          d
          z   t          |          z   t          |          z   t          |pd          z   t          d          z              |j                             d          }|r*t          |          }	t          |	          }
|
r
|dz  }||
z  }|                     dt          |d                   z   t          |d                   z   t          |j	        d                   z   t          |j	        d                   z   t          |          z              |r$|
r"|                     t          |	                     |                     t          d                     d S )Nr   rs   rD   r   r
  r   r   rq   rr   r}   r  rF   r{   rC   )r   KeyErrorrZ   r   r   r   o16_get_palette_bytes_get_color_table_sizer   _get_header_palette)r2   r   r-  rW   r   rs   r
  packed_flagr  r  color_table_sizes              r%   r   r   0  sH   ~n5    R^##r~j1B6772>%%j!4455H8q==H='3aax1}$
ggee oo (mm	
 "##$ ee	
 	
 	
 .,,-BCC -*2..0?? 	-CKE,,EHH
fQi..	
fQi..	 bgaj//	 bgaj//		
 U))	    5/ 5
$]33444HHRUUOOOOOs    c                "   |                                  }	 t          |d          5 }| j        dk    r$t          j        d|g|t          j                   ndd|g}dg}t          j        |t          j        t          j                  }t          j        ||j        |t          j                  }|j        J |j        	                                 |
                                }	|	rt          j        |	|          |
                                }	|	rt          j        |	|          d d d            n# 1 swxY w Y   	 t          j        |           d S # t          $ r Y d S w xY w# 	 t          j        |           w # t          $ r Y w w xY wxY w)NwbrI   ppmtogif)stdoutstderrppmquant256)stdinrF  rG  )_dumpopenr   
subprocess
check_callDEVNULLPopenPIPErF  closewaitCalledProcessErrorosunlinkOSError)
r   r2   r/  tempfilerj   	quant_cmd	togif_cmd
quant_proc
togif_procretcodes
             r%   _save_netpbmr^  b  s    xxzzH$(D!! 	LQw%%*1Z=O     (9	'L	'-joj>P  
 (-$+%-	  
 "(444!'')))$//++ L$7KKK$//++ L$7KKK=	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L@	Ih 	 	 	DD		Ih 	 	 	D	se   E' DD4(E' 4D88E' ;D8<E'  E 
E$#E$'F)E>=F>
FF
FFlist[int] | Nonec                T   | j         dv r|r|                    d          rt          p
| j         dk    }|s| j        | j        z  dk     rg }t          |                                           D ]\  }}|r|                    |           |s t          |          t          |          k    r|S | j
        J t          | j
        j
                  t          j        | j
        j                   z  }d|dz
                                  z  }t          |          |dz  k    r|dk    r|S dS )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
    )r   r   r  r   i   Nr   r   )r   r   _FORCE_OPTIMIZEwidthheightr   	histogramr   r   r;   rP   r   getmodebands
bit_length)r   rK   optimiser   r<   countnum_palette_colorscurrent_palette_sizes           r%   r   r     sQ    
w*$((:*>*> #4bgn 	+rx")+i77"$%bllnn55 2 25 2'..q111 +3233s;N7O7OOO**:)))!$RZ%7!8!8E<N
= = " $%);a)?(K(K(M(M#M  '((,@A,EEE(1,,**4r$   r  c                    | sdS t          |           dk     rdS t          j        t          j        t          |           dz  d                    dz
  S )Nr   r|   r   r9   r   )r;   mathceillog)r  s    r%   r?  r?    sV     Cq	]		a		qy#m"4"4"91==>>BBr$   c                    t          |           }d|z  t          |           dz  z
  }|dk    r| t          d          dz  |z  z  } | 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   r9   r   )r?  r;   r   )r  rB  actual_target_size_diffs      r%   r@  r@    s]     -];;  !$44M8J8Ja8OO""A%<<<r$   c                    | j         sdS t          | j         j                   | j         j        dk    r>d                    fdt	          t                    dz            D                       S )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   c              3  >   K   | ]}|d z  |d z  dz            V  dS )r}   r9   Nr#   )r   r<   rP   s     r%   r   z%_get_palette_bytes.<locals>.<genexpr>  s9      XX!71q51q519#45XXXXXXr$   r9   )rP   r'   r   joinr:   r;   )r   rP   s    @r%   r>  r>    st     : sBJ&''G	z&  ((XXXXuS\\UVEV?W?WXXXXXNr$   info_background=int | tuple[int, int, int] | tuple[int, int, int, int] | Nonec                    d}|rft          |t                    rO| j        J 	 | j                            ||           }n+# t          $ r}t          |          dvr Y d }~n
d }~ww xY w|}|S )Nr   )z$cannot allocate more than 256 colorsz/cannot add non-opaque RGBA color to RGB palette)r   r   rP   getcolorr   r   )r   rt  rH   rk   s       r%   r  r    s     J )ou-- 	) :)))
Z00"EE

   q66 "        )Js   A   
A&
A!!A&list[bytes]c                   d}| j                             d          dk    sE|rEd|v s?|                    d          *|                    d          s|                    d          rd}t          | |                    d	                    }t          |           }t	          |          }d
|z   t          | j        d                   z   t          | j        d                   z   t          |dz             t          |          t          d          z   t          |          g}|                    d          ~|	                    dt          d          z   t          d          z   dz   t          d          z   t          d          z   t          |d                   z   t          d          z              |                    d          rdt          d          z   }|d         }t          |t                    r|                                }t          dt          |          d          D ]1}	||	|	dz            }
|t          t          |
                    |
z   z  }2|t          d          z  }|	                    |           |S )z2Return a list of strings representing a GIF headers   87arB   s   89ar   rz   Nrs   ro   rH   s   GIFr   r   rF   rq   rw   rG   ry   r9   ru   )rK   r   r  r>  r?  r=  r   r   r@  r   r   r   encoder:   r;   )r   rK   rB   rH   r  rB  headercomment_blockro   r<   subblocks              r%   r   r     s    G	w{{9'' ( d""xx+xx
## ,xx	"" ,
  TXXl%;%;<<J&r**M,];; 	
	
bgaj//	 bgaj//	 	c!""
:AM**F xx#ggff  ee	
 ee $v,  ee		
 		
 		
 xx	 %r#wwy/gs## 	'nn&&Gq#g,,,, 	: 	:Aq1s7{+HRH..99MMAm$$$Mr$   paramsc                    	 ||_         t          | ||d           t          j        || t          j        dd|j        z   dt          |j                           g           |                     d           |` d S # |` w xY w)Nr   r   r   r   )	r   r   r   r   r   r   r   r   r   )r2   r   r-  r~  s       r%   r#  r#  L  s    !% 	B&!444_UFX]$:Awx}?UVVW	
 	
 	
 	   H     s   A2A8 8A<dict[str, Any] | None$tuple[list[bytes], list[int] | None]c                    |i }t          | |          }d|vrd| j        v r| j        d         |d<   t          | ||          }|j        | _        |j        | _        t          | |          }||fS )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)

    NrH   )r   rK   r   rP   r   r   )r   rP   rK   r   im_modr{  s         r%   	getheaderr  g  s     |'D114LBG$;$;W\2\GT22FBJIBED))F&&&r$   r   r   c                    ddl m}  G d d|          }|                                   |            }t          || ||           |j        S )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.

    To specify duration, add the time in milliseconds,
    e.g. ``getdata(im_frame, duration=1000)``

    :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

    r   )BytesIOc                      e Zd Zg ZddZdS )getdata.<locals>.Collectorr6   r   r(   rZ   c                T    | j                             |           t          |          S r   )r6   r   r;   )r4   r6   s     r%   r   z getdata.<locals>.Collector.write  s$    IT"""t99r$   N)r6   r   r(   rZ   )r   r   r   r6   r   r#   r$   r%   	Collectorr    s-        	 	 	 	 	 	r$   r  )ior  r   r#  r6   )r   r-  r~  r  r  r2   s         r%   r   r     su    &     G    GGIII	Bb"ff---7Nr$   z.gifz	image/gif)r&   r'   r(   r)   )r   r   r(   r   )r   r   rP   r   rK   r   r(   r   )r   r   r2   r   rP   r   r(   r>   )r   r   r   r   r(   r   )r   r   r2   r   rP   r   r(   r)   )r   r   r2   r   r/  r0  r(   r>   )F)
r   r   r2   r   r/  r0  r2  r)   r(   r>   )r   r   r(   rZ   )
r2   r   r   r   r-  r:  rW   rZ   r(   r>   )r   r   rK   r   r(   r_  )r  r'   r(   rZ   )r  r'   r(   r'   )r   r   r(   r'   )r   r   rt  ru  r(   rZ   )r   r   rK   r   r(   rx  )
r2   r   r   r   r-  r:  r~  r   r(   r>   )NN)r   r   rP   r   rK   r  r(   r  )r   )r   r   r-  r:  r~  r   r(   rx  )J
__future__r   r  rl  rU  rM  enumr   	functoolsr   typingr   r   r   r	   r
    r   r   r   r   r   r   r   _binaryr   rL   r   r   r=  _utilr   TYPE_CHECKINGr   _typingr   r   r    r   r,   r.   r   r   r'   r   r   rZ   _Paletter   r   r  r  r.  r3  r   r   r   r^  ra  r   r?  r@  r>  r  r   r#  r  r   register_openr   register_saveregister_save_allregister_extensionregister_mimer#   r$   r%   <module>r     sv  4 # " " " " "      				           % % % % % % 6 6 6 6 6 6 6 6 6 6 6 6 6 6                  " ! ! ! ! !       ! ! ! ! ! !                  g    #2 5 5 5 5` ` ` ` `9& ` ` `N #C
(
(   4 	49l.GGHD D D DN   8
2 
2 
2 
2         Z         D+ + + +
 MR    &   / / / /d- - - -d - - - -`C C C C   $       6; ; ; ;|! ! ! !8 UY' ' ' ' '> 06" " " " "P  L'w ? ? ?  L' / / /  +Y 7 7 7  ,f 5 5 5  L' 5 5 5 5 5r$   