
    zvg                       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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 ddl m!Z!  G d de          Z"e"j#        Z$dNdZ% G d dej                  Z&ddddZ'dOdZ(ee)e*e+e,         ej        f         Z-dPd Z.dQd$Z/dRd(Z0 G d) d*e          Z1dSd+Z2dTd.Z3	 dUdVd1Z4dWd3Z5dXd7Z6dTd8Z7d/Z8dYd:Z9dZd<Z:d[d=Z;d\d>Z<d]dAZ=d^dCZ>d_dEZ?	 d`dadHZ@	 dbdcdKZA ejB        e&jC        e&e%            ejD        e&jC        e4            ejE        e&jC        e3            ejF        e&jC        dL            ejG        e&jC        dM           dS )d    )annotationsN)IntEnum)cached_property)IOTYPE_CHECKINGAnyLiteral
NamedTupleUnion   )Image
ImageChops	ImageFile	ImageMathImageOpsImagePaletteImageSequence)i16le)o8)o16le)_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     O/var/www/pixelcanvas.ch/venv/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                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 filer+   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._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rS   rQ   rT   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%   ra   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_imrT   r:   r\   r]   )r4   rb   
last_frameferU   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                    |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    rl j        r)t@          tB          j"        k    r|d#nd  _#        nd$ _#        nd% _#        |r| _$        n j        rdd&l%m%}  | j                   _$        nd  _$        nƉ j&        d$k    rt@          tB          j'        k    s|rd' 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|^d}|1|dk    r t@          tB          j"        k    r
| j        d'<   n j&        d-vr|}te          j3        d0||||f j         |||f          g _        |,                    d          r|d          j        d<   d1D ](}||v r||          j        |<   | j        v r j        |= )d S )3Nr   commentr   zcannot seek to frame    ;rd   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colorrY   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;   rO   tuple)r   r4   s    r%   _rgbz GifImageFile._seek.<locals>._rgbY  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)rr   rw   )r   rY   r(   r   )4_GifImageFile__offsetdisposerf   rP   r]   rR   disposal_methodrJ   tileload
ValueErrorr2   r6   r3   r\   rK   rQ   r;   sizemaxrL   r   _decompression_bomb_checkr=   r   rM   impastedispose_extentrN   r   _frame_transparencyLOADING_STRATEGYr   r"   _moderO   r   moder!   putpalettealphaconvertDitherFLOYDSTEINBERGgetcorefillrg   _cropAttributeErrorr   _Tile)r4   rb   rk   rU   r5   rO   rJ   frame_transparency	interlaceframe_dispose_extentblockrV   dispose_bitsrn   x0y0x1y1rW   r7   r   r   dispose_sizedispose_moder   r   ks   `                          r%   rT   zGifImageFile._seek   sH	   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 
 $&$ $%%%%%%#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   8E"^ 
^('^(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   rH   r   r   )r   _prev_imrf   r   r   r   r   r   r   r   
putpalettegetdatarg   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~   rH   r   )rf   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)rf   )r4   s    r%   rQ   zGifImageFile.tell  s
    |r$   )r(   r0   )r7   r'   r(   r)   )r(   r>   )r(   rY   )r(   r)   )rb   rY   r(   r>   )T)rb   rY   rk   r)   r(   r>   )r   r   r   formatformat_description!_close_exclusive_fp_after_loadingrN   r6   r=   rX   propertyr_   r   ra   r]   rT   r   r   rQ   __classcell__)r   s   @r%   r.   r.   N   s+       F)(-%N         4 	 	 	 X	    _"+ + + + ~! ~! ~! ~! ~!@     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
    rH   r   rO   Nr~   r9   r   r   r   )r   RAWMODEr   r   getmodebaser   PaletteADAPTIVErO   colorsrJ   )r   rgbas     r%   _normalize_moder     s     
w'
				!!U**ZZU]%;Z<<z%%%:?f$$
)  7a<<.0j.?.EBGN+E   	::c??r$   rO   _Palette | NonerJ   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>0  s&      &B&B!qAv&B&B&B&B&B&Br$   rH   r   r   r9   r   )
isinstancer'   	bytearraylistr   rO   r   r   r:   r;   r   r   r   append	enumerateremap_palette_get_optimizeindexr   )r   rO   rJ   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   rB   r       )r   rJ   itemsr   strencoderinfo
setdefaultr   _get_global_headerwriteget_interlace_write_local_headerencoderconfigr   _saver   r   r   r   )r   r2   rO   im_outr   vr5   rV   s           r%   _write_single_framer   Z  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$   )rO   r'   )r   r   s     r%   
<listcomp>z_getbbox.<locals>.<listcomp>y  s>       =?RZ8bj !!!S  r$   r   r   r~   F)
alpha_only)r   r   subtract_modulogetbbox)r   r   palette_bytesdeltas       r%   _getbboxr  v  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d	                    }t#          |
|          }t%          j        d
|
j        |          }|d         j        j        }|J |                    ||j                   t!          ||
          d         }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}n5|s
d|j         d<   |
)                    |j&                  }
|j&        d d         }tU          ||
||j                    dS )Nrr   disposalr   append_imagesr   r   rm   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arv   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   rv   r   r#   r  s    r%   r  z(_write_multiple_frames.<locals>.<lambda>  s    _T)_T$Z#=Ms-S-S r$   )r   )maskFr   Tinclude_color_table)+r   r   rJ   	itertoolschainr   Iteratorr   r   r   r   r   r   r   r   r   r  _get_backgroundr   newr   r   rO   r   r   _new_color_indexr   splitr   lambda_evalputdatar   r   r   invertr   r  r;   r  r   r   crop_write_frame_data)r   r2   rO   rr   r  	im_framesprevious_imframe_countbackground_im
imSequencer   r   r   r   
diff_framer  r  r   rG   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 XP XP
%.z:: W	P W	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 >[ >&{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(1!(?,888%00@RSSS#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OoW	Pr 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   2M
MMfilenamestr | bytesc                ,    t          | ||d           d S )NT)save_all)r   )r   r2   r-  s      r%   	_save_allr1    s    	"b(T******r$   Fr0  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 )NrO   r
  Tro   flush)	r   rJ   r   r   r,  r   r   hasattrr3  )r   r2   r-  r0  rO   s        r%   r   r   	  s     BN""i27&:&:.$$YI0F0FGG
!!*d333 -1"b'BB -BG,,,HHTNNNr7 





 r$   rY   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]rV   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   rr   rC   r   r  r   r   rp   rq   r|   r  rE   rz   rB   )r   KeyErrorrY   r   r   r   o16_get_palette_bytes_get_color_table_sizer   _get_header_palette)r2   r   r+  rV   r   rr   r  packed_flagr  r   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)stdinrD  rE  )_dumpopenr   
subprocess
check_callDEVNULLPopenPIPErD  closewaitCalledProcessErrorosunlinkOSError)
r   r2   r-  tempfileri   	quant_cmd	togif_cmd
quant_proc
togif_procretcodes
             r%   _save_netpbmr\  X  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;   rO   r   getmodebands
bit_length)r   rJ   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   r@  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<   rO   s     r%   r   z%_get_palette_bytes.<locals>.<genexpr>  s9      XX!71q51q519#45XXXXXXr$   r9   )rO   r'   r   joinr:   r;   )r   rO   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   rO   getcolorr   r   )r   rr  rG   rj   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   87arA   s   89ar   ry   Nrr   rn   rG   s   GIFr   r   rE   rp   rv   rF   rx   r9   rt   )rJ   r   r  r<  r=  r;  r   r   r>  r   r   r   encoder:   r;   )r   rJ   rA   rG   r   r@  headercomment_blockrn   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!  B  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)

    NrG   )r   rJ   r   rO   r   r   )r   rO   rJ   r   im_modry  s         r%   	getheaderr  ]  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(   rY   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(   rY   )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   rO   r   rJ   r   r(   r   )r   r   r2   r   rO   r   r(   r>   )r   r   r   r   r(   r   )r   r   r2   r   rO   r   r(   r)   )r   r   r2   r   r-  r.  r(   r>   )F)
r   r   r2   r   r-  r.  r0  r)   r(   r>   )r   r   r(   rY   )
r2   r   r   r   r+  r8  rV   rY   r(   r>   )r   r   rJ   r   r(   r]  )r   r'   r(   rY   )r   r'   r(   r'   )r   r   r(   r'   )r   r   rr  rs  r(   rY   )r   r   rJ   r   r(   rv  )
r2   r   r   r   r+  r8  r|  r   r(   r>   )NN)r   r   rO   r   rJ   r~  r(   r  )r   )r   r   r+  r8  r|  r   r(   rv  )H
__future__r   r  rj  rS  rK  enumr   	functoolsr   typingr   r   r   r	   r
   r    r   r   r   r   r   r   r   _binaryr   rK   r   r   r;  r   _typingr   r   r    r   r,   r.   r   r   r'   r   r   rY   _Paletter   r   r  r  r,  r1  r   r   r   r\  r_  r   r=  r>  r<  r  r   r!  r  r   register_openr   register_saveregister_save_allregister_extensionregister_mimer#   r$   r%   <module>r     se  4 # " " " " "      				           % % % % % % E E E E E E E E E E E E E E E E                  " ! ! ! ! !       ! ! ! ! ! !      g    #2 0 0 0 0^ ^ ^ ^ ^9& ^ ^ ^J #C
(
(   4 	49l.GGHD D D DN   8
2 
2 
2 
2         Z      y y y yx+ + + +
 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$   