
     fA                       d dl mZ d dl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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  erddlm!Z!  G d de          Z"e"j#        Z$dMdZ% G d dej                  Z&ddddZ'dNdZ(ee)e*ee+         ej        f         Z,dOdZ-dPd#Z.dQd'Z/ G d( d)e          Z0dRd*Z1dSd-Z2	 dTdUd0Z3dVd2Z4dWd6Z5dSd7Z6d.Z7dXd9Z8dYd;Z9dZd<Z:d[d=Z;d\d@Z<d]dBZ=d^dDZ>	 d_d`dGZ?	 dadbdJZ@ ejA        e&jB        e&e%            ejC        e&jB        e3            ejD        e&jB        e2            ejE        e&jB        dK            ejF        e&jB        dL           dS )c    )annotationsN)IntEnum)cached_property)IOTYPE_CHECKINGAnyListLiteral
NamedTupleUnion   )Image
ImageChops	ImageFile	ImageMathImageOpsImagePaletteImageSequence)i16le)o8)o16le)_imagingc                      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     U/var/www/api.educacionweb.es/myenv/lib/python3.11/site-packages/PIL/GifImagePlugin.pyr   r   6   s$        !!O'($JJJr$   r   prefixbytesreturnboolc                    | d d         dv S )N   )s   GIF87as   GIF89ar#   )r&   s    r%   _acceptr,   E   s    "1":///r$   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.dataU   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                v   | j                             d          }t          |          sd}t          |          |d d         | j        d<   t          |d          t          |d          f| _        g | _        |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 filer+   version   
      r         
backgroundr9   RGBr   )r2   r3   r,   SyntaxErrorinfoi16_sizetiler=   r   rawglobal_palettepalette_fptell_GifImageFile__rewind	_n_frames_seek)r4   r5   msgflagsbitsr7   s         r%   _openzGifImageFile._opena   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<DGJJqMMM\
t|a'33 	+ 	+A+

1 + + +		*%%%2smm*+	+ 	+s   $A::
B0'B++B0Tupdate_imagec                    |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{|
y|
 j                                        f|d<   |
d d         dk    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 _        t+          j         j                   ||||f}	|d         }|dz  dk    }|dz  rR|dz  dz   } j                            d|z            }                     |          rt1          j        d |          }nd!} j                            d          d         } j                                         _         nd };|d"}t          |          | _        |sd S g  _         j        r% j                             j         j                   ||n j         _        | _        |dk    r^ j        r)t@          tB          j"        k    r|d#nd  _#        nd$ _#        nd% _#        |s j        rdd&l$m$}  | j                  }| _%        n͉ j&        d$k    rt@          tB          j'        k    s|rd  _(        d' j        v re j        )                     j        d'         d            j        *                    d#t*          j+        j,                   _        d# _#         j        d'= n6d  _#         j        *                    d t*          j+        j,                   _        d2 fd,}d  _        |	 _         j        r j        dk    rt	  j        dk    r j        \  }}}}||z
  ||z
  f}t+          j        |           d$} j        -                    d'|          }| j&        d-v rd#} ||          d.z   }n1 j        -                    d/d          } j&        d-v rd } ||          }t*          j.        /                    |||           _        n j        & 0                     j         j                   _        no|m j        \  }}}}||z
  ||z
  f}t+          j        |           d$}|} j&        d-v rd#} ||          d.z   }t*          j.        /                    |||           _        n# tb          $ r Y nw xY w|Md}|1|dk    r t@          tB          j"        k    r
| j        d'<   n j&        d-vr|}d0||||f j         |||ffg _        |-                    d          r|d          j        d<   d1D ](}||v r||          j        |<   | j        v r j        |= )d S )3Nr   commentr   zcannot seek to frame    ;re   T   !   r9   rC   duration   r      r$      
   	extensionrF      NETSCAPE2.0loop   ,	      r+   rB   @   rE   rD   rH   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>._rgbX  sl    " -19q=3t':'B#C#CCCET08UQYQR]9RSTTTue,,r$   rH   r   )r   rG   gif)rs   rx   )r   rZ   r(   r   )2_GifImageFile__offsetdisposerg   rQ   r^   rS   disposal_methodrJ   rM   load
ValueErrorr2   r6   r3   r]   rK   rR   r;   sizemaxrL   r   _decompression_bomb_checkr=   r   rN   rh   pastedispose_extentrO   r   _frame_transparencyLOADING_STRATEGYr   r"   _moder   rP   moder!   pyaccessputpalettealphaconvertDitherFLOYDSTEINBERGgetcorefill_cropAttributeError)r4   rc   rl   rV   r5   rP   rJ   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   s9	   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%SbSz^33 $		  >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 
 4t2 4%%%%%%$t233"DLLyC$(XXX Y %)DM%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 w*'+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   1E"^ 
^! ^!c                   | 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 | _        || _        d | _         t                                                       d S )Nr   r   r   r   rH   )r   _prev_imrg   r   r   r   r   r   rh   r   
putpalettegetdatar   superload_prepare)r4   	temp_mode	__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
"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        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   rH   )rg   r   r   r   r"   r   rh   r   r   r   r   r   r   r   r   r   r   )r4   frame_ims     r%   load_endzGifImageFile.load_end  sb   <1yC$48R$R$R+7G++D,DaHHH!'DJJ!&DJ'//$)U\5PQQF} 	F#/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.   N   s*       F)(-%N         6 	 	 	 X	    _"+ + + + |! |! |! |! |!|     (9 9 9 98       r$   r.   r   r   )1r   r   rh   Image.Imagec                   | j         t          v r|                                  | S t          j        | j                   dk    ro|                     dt          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
    rH   r   rP   r   r9   r   r   r   )r   RAWMODEr   r   getmodebaser   PaletteADAPTIVErP   colorsrJ   )rh   rgbas     r%   _normalize_moder     s     
w'
				!!U**ZZU]%;Z<<:?f$$
)  7a<<.0j.?.EBGN+E   	::c??r$   rP   _Palette | NonerJ   dict[str, Any]c                D   d}|rgt          |t          t          t          f          rt          |dd                   }t          |t          j                  rt          |j                  }| j        dk    r%|s"| j                            d          dd         }nC|s&t          d t          d          D                       }t	          j        d|          | _        |rg }|J t          dt          |          d          D ]V}t          |||dz                      }| j        j                            |          }||v rd}|                    |           Wt          |          D ]1\  }}|*t          t          |                    D ]}||vr|||<    n2|                     |          } nat#          | |          }|O|                     ||          } d	|v r3	 |                    |d	                   |d	<   n# t&          $ r |d	= Y nw xY w| 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
    Ni   r   rH   c              3      K   | ]	}|d z  V  
dS )r9   Nr#   ).0r<   s     r%   	<genexpr>z%_normalize_palette.<locals>.<genexpr>  s&      &B&B!qAv&B&B&B&B&B&Br$   r   r   r9   r   )
isinstancer'   	bytearraylistr   rP   r   rh   
getpaletter:   r;   r   r   r   append	enumerateremap_palette_get_optimizeindexr   )	rh   rP   rJ   source_paletteused_palette_colorsr<   source_colorr   js	            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#~~ 	;U--e44TcT:N 	C&&B&BuSzz&B&B&BBBN!.unMMM
   )))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 122+B55*!!"5~FFB%%-+>+D+D^,, ,D(( " - - -^,,,-I'BJIs    G? ?HHr2   	IO[bytes]r>   c           	     *   t          |           }|j                                        D ] \  }}| j                            ||           !t          ||| j                  }t          || j                  D ]}|                    |           d}t          |           r|dz  }t          || d|           dt          |           f|_
        t          j        ||dd| j        z   dt          |j                 fg           |                    d           d S )Nr   r~   r   r   rB   r       )r   rJ   itemsencoderinfo
setdefaultr   _get_global_headerwriteget_interlace_write_local_headerencoderconfigr   _saver   r   r   )rh   r2   rP   im_outr   vr5   rW   s           r%   _write_single_framer   ?  s   
 R  F!!## ( (1
!!!Q''''@@F77  
 ER 
B...}R001FOFB%"')91gfk>R!S TUUUHHUOOOOOr$   base_imim_frame4tuple[Image.Image, tuple[int, int, int, int] | None]c                    t          |          t          |           k    r*|                    d          }|                     d          } t          j        ||           }||                    d          fS )Nr   F)
alpha_only)_get_palette_bytesr   r   subtract_modulogetbbox)r   r   deltas      r%   _getbboxr   X  so     (##'9''B'BBB##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   rh   z tuple[int, int, int, int] | Nonebboxr   r   N)r   r   r   __annotations__r#   r$   r%   r   r   b  s3         OOO****r$   r   c           	     l
   | j                             d          }| j                             d| j                            d                    }g }d }d}d }t          j        | g| j                             dg                     D ]}	t          j        |	          D ]}
t          |
                                          }
|dk    rA|
j        	                                D ]'\  }}|dk    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 }|ro|rlt          ||
          \  }}|s8|                    d          r!|d         j         dxx         |d         z  cc<   |d         j                             d          dk    r|| j                             d| j                            dd	                    }t!          |
|          }t#          j        d
|
j        |          }|                    |d         j        j                   t          ||
          d         }n_|                    d          rF|
j        dk    r:d|vr/	 |
j                            |
          |d<   n# t2          $ r Y nw xY wd|v r|
                                }t#          j        d
|j        |d                   }|j        dk    r4|                                \  }}}}t7          j        d ||||          }ne|j        d
k    rCt#          j        d|j                  }|                    |                                           |}t7          j        d |          }|                    |tA          j!        |                     nd }|
}|"                    tG          |p|
||                     ΐtI          |          dk    r&d| j         v r|d         j         d         | j         d<   dS |D ]}|j        }
|j%        s0tM          |
|j                   D ]}|'                    |           d}n5|s
d|j         d<   |
(                    |j%                  }
|j%        d d         }tS          ||
||j                    dS )Nrs   disposalr   append_imagesr   r   rn   r   )r   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   rh   rw   r   r#   r  s    r%   r
  z(_write_multiple_frames.<locals>.<lambda>  s    _T)_T$Z#=Ms-S-S r$   rh   )maskFr   Tinclude_color_table)*r   r   rJ   	itertoolschainr   Iteratorr   r   r   r   r   r   r   r   r   _get_backgroundr   newr   r   rh   rP   r   _new_color_indexr   splitr   lambda_evalputdatar   r   r   invertr   r   r;   r   r   r   crop_write_frame_data)rh   r2   rP   rs   r   	im_framesprevious_imframe_countbackground_im
imSequencer   r   r   r   
diff_framer   r   r   rG   r   r  r  r  r  r  delta_l
frame_datar5   offsets                                r%   _write_multiple_framesr$  h  s    ~!!*--H~!!*bgkk*.E.EFFH I&*KKMordBN,>,>PR,S,STT TP TP
%.z:: S	P S	PH&x}}77Ha$M//11 4 4DAqN** N--a3333.--//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 ;[ ;&{H==t "z22 Y!"1*===ZAXX===R=,00<<AA$, " 2 2*BGKK	,R,R! ! &5Xu%E%E
(-	#x}j(Q(Q%0011HIII#M8<<Q?DD __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OgS	Pj 9~~'')21)A*)MBN:&u H H
= 	)'*2HII  FF  E@D
&'<=}}Z_55H_RaR(F"h
0FGGGG4s   L&&
L32L3filenamestr | bytesc                ,    t          | ||d           d S )NT)save_all)r   )rh   r2   r%  s      r%   	_save_allr)    s    	"b(T******r$   Fr(  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   rJ   r   r   r$  r   r   hasattrr+  )rh   r2   r%  r(  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   )rh   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   rC   r   r   r   r   rq   rr   r}   r  rE   r{   rB   )r   KeyErrorrZ   r   r   r   o16r   _get_color_table_sizer   _get_header_palette)r2   rh   r#  rW   r   rs   r   packed_flagr  palette_bytescolor_table_sizes              r%   r   r     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wbrH   ppmtogif)stdoutstderrppmquant256)stdinr<  r=  )_dumpopenr   
subprocess
check_callDEVNULLPopenPIPEr<  closewaitCalledProcessErrorosunlinkOSError)
rh   r2   r%  tempfilerj   	quant_cmd	togif_cmd
quant_proc
togif_procretcodes
             r%   _save_netpbmrT  3  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                @   | j         dv r|r|                    d          rt          p
| j         dk    }|s| j        | j        z  dk     rg }t          |                                           D ]\  }}|r|                    |           |s t          |          t          |          k    r|S 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   r   r   N)r   r   _FORCE_OPTIMIZEwidthheightr   	histogramr   r   r;   rP   r   getmodebands
bit_length)rh   rJ   optimiser   r<   countnum_palette_colorscurrent_palette_sizes           r%   r   r   h  sC    
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$   r7  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)r7  s    r%   r4  r4    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   )r4  r;   r   )r7  r8  actual_target_size_diffs      r%   r5  r5    s]     -];;  !$44M8J8Ja8OO""A%<<<r$   c                ,    | j         r| j         j         n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   r  s    r%   r   r     s     "$42:4r$   info_background=int | tuple[int, int, int] | tuple[int, int, int, int] | Nonec                    d}|r]t          |t                    rF	 | 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   str)rh   rh  rG   rk   s       r%   r  r    s     J )ou-- 	)
Z00"EE

   q66 "        )Js   7 
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   87arA   s   89ar   rz   Nrs   ro   rG   s   GIFr   r   rE   rq   rw   rF   ry   r9   ru   )rJ   r   r  r   r4  r3  r   r   r5  r   r   rl  encoder:   r;   )rh   rJ   rA   rG   r7  r8  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        || dd|j        z   dt
          |j                 fg           |                     d           |` d S # |` w xY w)Nr   r   r   r   )r   r   r   r   r   r   r   r   )r2   r   r#  rs  s       r%   r  r    s    !% 	B&!444bE6HM#91ghm>TUV	
 	
 	
 	   H     s   A!A' '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)

    NrG   )r   rJ   r   rP   rh   r   )rh   rP   rJ   r   im_modrp  s         r%   	getheaderry  .  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                  H    e Zd Zg Zej        dk    rddlmZ ddZdS dd
ZdS )getdata.<locals>.Collector)r9      r   )Bufferr6   r  r(   rZ   c                T    | j                             |           t          |          S r   r6   r   r;   r4   r6   s     r%   r   z getdata.<locals>.Collector.writeg  $    	  &&&4yy r$   r   c                T    | j                             |           t          |          S r   r  r  s     r%   r   z getdata.<locals>.Collector.writem  r  r$   N)r6   r  r(   rZ   )r6   r   r(   rZ   )	r   r   r   r6   sysversion_infocollections.abcr  r   r#   r$   r%   	Collectorr}  a  sk        w&&......! ! ! ! ! !! ! ! ! ! !r$   r  )ior{  r   r  r6   )rh   r#  rs  r{  r  r2   s         r%   r   r   L  su    & ! ! ! ! !G ! ! !  GGIII	Bb"ff---7Nr$   z.gifz	image/gif)r&   r'   r(   r)   )rh   r   r(   r   )rh   r   rP   r   rJ   r   r(   r   )rh   r   r2   r   rP   r   r(   r>   )r   r   r   r   r(   r   )rh   r   r2   r   rP   r   r(   r)   )rh   r   r2   r   r%  r&  r(   r>   )F)
rh   r   r2   r   r%  r&  r(  r)   r(   r>   )rh   r   r(   rZ   )
r2   r   rh   r   r#  r0  rW   rZ   r(   r>   )rh   r   rJ   r   r(   rU  )r7  r'   r(   rZ   )r7  r'   r(   r'   )rh   r   r(   r'   )rh   r   rh  ri  r(   rZ   )rh   r   rJ   r   r(   rm  )
r2   r   r   r   r#  r0  rs  r   r(   r>   )NN)rh   r   rP   r   rJ   ru  r(   rv  )r   )rh   r   r#  r0  rs  r   r(   rm  )G
__future__r   r  rb  rK  rC  r  enumr   	functoolsr   typingr   r   r   r	   r
   r   r    r   r   r   r   r   r   r   _binaryr   rK   r   r   r3  r   r   r    r   r,   r.   r   r   r'   r   rZ   _Paletter   r   r   r   r$  r)  r   r   r   rT  rW  r   r4  r5  r   r  r   r  ry  r   register_openr   register_saveregister_save_allregister_extensionregister_mimer#   r$   r%   <module>r     s^  4 # " " " " "      				     



       % % % % % % K K K K K K K K K K K K K K K K K K                  " ! ! ! ! !       ! ! ! ! ! !     g    #2 0 0 0 0K K K K K9& K K Kd #C
(
(   2 	49l.GGH= = = =@   22 2 2 2         Z      u u u up+ + + +
 MR    &   / / / /d- - - -d , , , ,^C C C C   $5 5 5 5   4; ; ; ;|! ! ! !4 UY' ' ' ' '> 06+ + + + +b  L'w ? ? ?  L' / / /  +Y 7 7 7  ,f 5 5 5  L' 5 5 5 5 5r$   