K iddlmZddlZddlZddlZddlZddlmZddlm Z ddl m Z m Z m Z ddlmZmZmZmZmZmZmZddlmZdd lmZdd lmZdd lmZd Zerdd l mZm Z ddlm!Z!ddl"m#Z#GddeZ$e$jJZ&d/dZ'Gddej"Z(ddddZ)d0dZ*e+e,ze-e.zej(zZ/ d1dZ0 d2dZ1 d3dZ2Gdde Z3 d4dZ4d5dZ5 d6 d7d Z6d8d!Z7 d9d"Z8d5d#Z9d Z:d:d$Z;d;d%Z d>d(Z?d?d)Z@ d@d*ZA dA dBd+ZB dC dDd,ZCeje(je(e'eje(je6eje(je5eje(jd-eje(jd.y)E) annotationsN)IntEnum)cached_property)Any NamedTuplecast)Image ImageChops ImageFile ImageMathImageOps ImagePalette ImageSequence)i16le)o8)o16le) DeferredErrorF)IOLiteral)_imaging)BufferceZdZdZdZdZdZy)LoadingStrategyz.. versionadded:: 9.1.0rr N)__name__ __module__ __qualname____doc__RGB_AFTER_FIRST RGB_AFTER_DIFFERENT_PALETTE_ONLY RGB_ALWAYSX/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/PIL/GifImagePlugin.pyrr:s!O'($Jr$rc$|jdS)N)sGIF87asGIF89a) startswith)prefixs r%_acceptr)Is   3 44r$ceZdZdZdZdZdZddZddZddZ e ddZ e dd Z dd Zddd Zdfd Zdd ZddZxZS) GifImageFileGIFzCompuserve GIFFNc|jjd}|r#|dr|jj|dSy)Nr r)fpread)selfss r%datazGifImageFile.dataYs6 GGLLO 177<<!% %r$ctdt|dD]*}|dz||cxk(r||dzcxk(r ||dzk(r'yyy)Nrr rTF)rangelen)r0pis r%_is_palette_neededzGifImageFile._is_palette_needed_sXq#a&!$ AFad:aAh:!AE(:; r$cF|jjd}t|s d}t||dd|jd<t |dt |df|_|d}|dzdz}|d zre|d |jd <|jjd |z}|j|r$tjd |}|x|_ |_ |j|_ |jj|_d|_|j!dy)N znot a GIF fileversion r backgroundr4RGBr)r.r/r) SyntaxErrorinfoi16_sizer9rrawglobal_palettepalette_fptell_GifImageFile__rewind _n_frames_seek)r0r1msgflagsbitsr7s r%_openzGifImageFile._openes GGLL qz"Cc" " !u )AYAq ) " Q 3;&'eDIIl # Q$Y'A&&q) $$UA.566#dl77  %) 1 r$c|j6|j} |j|jdzd$|jS#t$r|jdz|_YnwxYw|j |E)Nr FrOrMrPEOFErrorseek)r0currents r%n_frameszGifImageFile.n_framessw >> !iikG 1JJtyy{Q6 ~~ 1!%q 1 IIg s%A!A32A3c|j|jdk7S|j}|ry |jddd}|j ||S#t$rd}Y wxYw)Nr TFrV)r0rY is_animateds r%r\zGifImageFile.is_animatedsn >> %>>Q& &))+  JJq% K '  K sA A%$A%cT|j|sy||jkrd|_|jd|j}t |jdz|dzD]} |j|y#t $r$}|j |d}t ||d}~wwxYw)Nrr no more images in GIF file) _seek_check_GifImageFile__frame_imrPr5rWrX)r0frame last_frameferQs r%rXzGifImageFile.seeks&  4<< DH JJqM\\ t||a'3 +A + 1  + + *%2sm* +s&A:: B'B""B'ctjtrjj|dk(r]d_d_d_jjjd_ djvr,jd=njr|rj|j dzk7rd|}t|j_jrNjjjjr jrd_jj!d}|r|dk(r d}t#|d}i}d}d}d} |sjj!d}|r|dk(rn|dk(rPjj!d}j} |dd k(r7| 5| d} | dzr| d }t%| dd z|d <d | z} | dz } | r| _ n|ddk(r9d} | r| | z } j} | rd|vr|dxxd| zz cc<n| |d<d}|ddk(rx|dk(rs| q| jj'f|d<| j)drAj} | r/t+| d k\r!| ddk(rt%| djd<jr jrny|dk(rsjj!d}t%|dt%|d}}|t%|dz|t%|dz}}|j,dkDs|j,dkDrX|rVt/|j,dt/|j,df_t3j4j0||||f} |d} | dzdk7}| dzrP| dzdz}jj!d |z}j7|rt9j:d|}nd}jj!dd}jj'_nd}| d }t#||_|syg_ j r0j<j?j j@||n jB_"|_#|dk(r{jDr+tHtJjLk(r |d!nd_'nd"_'nd#_'|r |_(njBrdd$l)m)}|jB_(nd_(njTd"k(rtHtJjVk7s|rd%jvrwj<jYjd%dj<j[d!t2j\j^_d!_'jd%=n@d_'j<j[dt2j\j^_d,fd& }d_| _ j@rjdk\r jdk(rljj@\}}}}||z ||z f}t3j4|d"}jjad%|}|jTd'vrBd!}||d(z}n4jjad)d}jTd'vr d}||}t2jbje|||_njf,jij<j@_nw|uj@\}}}}||z ||z f}t3j4|d"}|}jTd'vr d!}||d(z}t2jbje|||_|od}|<|dk(r'tHtJjLk7r |jd%<njTd'vr|}tmjnd*fj||fg_ |jadr|djd<d+D]5}||vr||j|<|jvs)j|=7y#tj$rYwxYw)-Nrcommentr zcannot seek to frame ;r^!r4r?durationrr$ extension NETSCAPE2.0loop, r<r>@rAr@rDFzimage not found in GIF frameRGBAPL)copy transparencyc jru|dzdztjjkDrd}ttt t t ft jj|dz|dzdzS|||fS)Nr4r)_frame_paletter6rKrtupleint)colorr0s r%_rgbz GifImageFile._seek.._rgb_s""19q=3t':':'B'B#CCE#sC-($--55eai%!)a-PQ ue,,r$rDrx)rrCgif)rlrq)rrreturnztuple[int, int, int])8 isinstancerLrex_GifImageFile__offsetdisposer`rXrNdisposal_methodrFtileload ValueErrorr.r2r/rWrGrMr'r6sizemaxrHr _decompression_bomb_checkr9rrIimpastedispose_extentrJr~_frame_transparencyLOADING_STRATEGYrr"_moderKr{moder!putpalettealphaconvertDitherFLOYDSTEINBERGgetcorefillra_cropAttributeErrorr _Tile)r0rb update_imagerQr1rKrFframe_transparency interlaceframe_dispose_extentblockrR dispose_bitsrhx0y0x1y1rSr7r{r dispose_size dispose_moderr|ks` r%rPzGifImageFile._seeks$ dhh .((++  A:DM8997+0L$(KE#(::??<u#UDLxx+'+zz$''4;N;N'O +7)-)<)<BB(*Rb'9 77 E'* 2997+1L$();$+>+F+F+HI}}!5$))tww||:S**//$'',, BK""& &&uMt/B/B/J/J/LM   dggv '< =!DG " r$cD|jdk(r|jdk(rttjk(r|j .|j j|j dd|_nd|_|j j|jtjj|_y|jsy|j|jjk7r|j +tjj!d|j}nftjj!d|j}|j#dd|j j%|jd}|j'|jd|jjz||_ |jJ|j x|jdk(r'|j j)d|j }n]|j j|j d|j jd}n|j jd}|j*J|j-||j*}|j|_|j j|_|jdvr(|j j'||j*|y|j j'||j*y) NrryrxrDrrzLA)rrx)r`rrrr"rrrrrr rrrrrrr getpaletterconvert_transparentrr)r0rframe_ims r%load_endzGifImageFile.load_ends: <<1 yyC$48R8R$R++7GG++D,D,DaH!'DJ!&DJ''//$))U\\5P5PQ }}  99 ** *''3#jjoofdii@ #jjooc499= &&ueTWW5G5G5IJ)11%8   dmmVdmm6H6H-H I'DM==, ,,  # # /yyC7766tT=U=UV''(@(@!D77??62wwu-H""...::h(;(;<--WW\\ ==N * GGMM(D$7$7 B GGMM(D$7$7 8r$c|jSN)r`)r0s r%rMzGifImageFile.tells ||r$)rz bytes | None)r7bytesrbool)rNone)rr)rr)rbrrr)T)rbrrrrr)rrrformatformat_description!_close_exclusive_fp_after_loadingrJr2r9rTpropertyrZrr\rXrPrrrM __classcell__)rs@r%r+r+Rsl F)(-%N  4  "+ C!J6(9Tr$r+rzry)1rzryc|jtvr|j|Stj|jdk(r|j dtj j}|jJ|jjdk(rL|jjD]3}|ddk(s |jj||jd<|S|S|j dS) 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 rDryrKrxr4rr|rz) rRAWMODErr getmodebaserPaletteADAPTIVErKcolorsrF)rrgbas r%_normalize_moders ww'    !U* ZZU]]%;%;Z <zz%%% ::??f $ )) 7a<.0jj.?.?.EBGGN+   ::c?r$cHd}|rXt|tttfrt|dd}t|tjrt|j }|j dk(r#|sZ|jd}|Jt|}n9|stdtdD}t jd||_|J|rg}|j Jtdt|dD]O}t|||dz}|j jj|}||vrd}|j|Qt|D],\}}| tt|D] } | |vs| ||<,.g} |D]}|J| j||j| }n@t!||} | 2|j| |}d |vr | j#|d |d <|S|S|j J||j _|S#t$$r|d =Y|SwxYw) 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 Niryc3&K|] }|dz yw)r4Nr#).0r8s r% z%_normalize_palette..<s&B!qAv&BsrDrrr4r|)rr bytearraylistrrKrrr5r6rrrappend enumerate remap_palette _get_optimizeindexr) rrKrFsource_palette im_paletteused_palette_colorsr8 source_colorrjdest_mapoptimized_palette_colorss r%_normalize_paletters`N gy$7 8&wt}5N g|88 9&w7N ww#~t,J) ))&z2N&&BuSz&BBN!..unM  %% %02zz%%%q#n-q1 .A AE!:;LJJ%%)),7E++  & &u -  . ""56 HAu}s#678A 3312+A.  !( #E$ $$ OOE " #  h '#0T#: # /!!":NKB%-+C+I+I^,,D( I2I :: !! !'BJJ I "-^,I-sH H! H!c \t|}|jjD]2\}}t|ts|j j ||4t|||j }t||j D]}|j|d}t|r|dz}t||d|dt|f|_ tj||tjdd|j zdt"|j$g|jdy)Nrrwrr>r)rrFitemsrstr encoderinfo setdefaultr_get_global_headerwrite get_interlace_write_local_header encoderconfigr _saverrrr)rr.rKim_outrvr1rRs r%_write_single_framerfs R F !!#,1 a  NN % %a +,  @F  7   ER B.}R01F OOY__UFRWW,z(_write_multiple_frames..sd_T)_$/DK(3U ,7DKS 49,MtTWy)*)-S %& '* %*%( ."r$)r r r r rzc&|d|ddzdS)Nrrrprr#r s r%rz(_write_multiple_frames..s_T)_T$Z#=Ms-Sr$)r)maskFTinclude_color_table)+rrrF itertoolschainrIteratorrr{rrrrrrrr_get_backgroundr newrrrKrr_new_color_indexrsplitr lambda_evalputdatarrrinvertrrr6rrrcrop_write_frame_data)rr.rKrlr im_frames previous_im frame_count background_im imSequencerrrr diff_framerrrrC first_paletterr r r r rdelta_l frame_datar1offsets r%_write_multiple_framesr)s ~~!!*-H~~!!*bggkk*.EFH I&*KKMoordBNN,>,>PR,ST]P %..z:\ PH&x}}7Ha$MM//18DAqN* !!S)11!Q7 8 ..--/K.&&~x}}^7TU)(G[IH(T5M2*2;*? J'!jHMM&A*2-- *C J'(T5M2*2;*? J' 1 KJ[&{H= t"z2!" 11*=ZAXX=R=,,00<ANN..& N(CE((0)85)IJ,1IIc8==*,UM,5aLOO,C,CM#0#<<#<)44]MDVDVW' x@C% 5 __Z0X]]c5I%[8'//;;;! ( 0 0 A A( K(7 &4%-]]_ $yyejj+n:UV ::/).JAq!Q#,#8#8 !"#$"#"#"#$D" %zzS0*/))C*D '  @(/#,#8#8 S#($D#((HOOD4I(J"K   VJ$:(D+N Oy\ P]P~ 9~  ')21)A)A*)MBNN: &H =='*2H2HI   F@D &&'<=&8=="88#==9__Ra(F"h 0F0FGH } *! !s2U<< V V c"t|||dy)NT)save_all)r)rr.filenames r% _save_allr-s "b(T*r$cxd|jvsd|jvr6|jjd|jjd}nd}|jjdd|r t |||s t ||||j dt|dr|jyy)NrKrTriflush) rrFrrr)rrhasattrr/)rr.r,r+rKs r%rrsBNN"i277&:..$$Y I0FG !!*d3 1"b'BBG,HHTNr7  r$cr|jjdd}t|jdkrd}|S)Nrr r)rrminr)rrs r%rr.s5"";2I 277|b r$c |jd}d|jvrt|jddz }nd}t|jjdd}||dk7s|rk|dnd}||dzz}|j dt d zt d zt |zt |zt |xsdzt dz|jjd }|r"t|} t| } | r |d z}|| z}|j d t |dzt |dzt |jdzt |jdzt |z|r r|j t |j t dy#t$rd}YwxYw)Nr|rlr?rrr rrjrkrvrrArtr>) rKeyErrorrrrro16_get_palette_bytes_get_color_table_sizer_get_header_palette) r.rr(rRr|rlr packed_flagrrcolor_table_sizes r%rr8s~~n5 R^^#r~~j1B672>>%%j!45H8q=H'3a x1}$   g e o (m   "#  $ e   ..,,-BC*2. 0? CKE,,EHH fQi.  fQi.  bggaj/  bggaj/   U)  / $]34HHRUOU  sF;; G  G c@|j} t|d5}|jdk7r)tjd|g|tj ndd|g}dg}tj |tjtj }tj ||j|tj }|jJ|jj|j} | rtj| ||j} | rtj| |ddd tj|y#1swY xYw#t$rYywxYw# tj|w#t$rYwwxYwxYw)NwbrDppmtogif)stdoutstderrppmquant256)stdinr?r@)_dumpopenr subprocess check_callDEVNULLPopenPIPEr?closewaitCalledProcessErrorosunlinkOSError) rr.r,tempfilerd quant_cmd togif_cmd quant_proc togif_procretcodes r% _save_netpbmrWjsyxxzH$ (D ! LQww%%%*1Z=O=O (9 'L '--jooj>P>P (--$++%--  "((444!!'')$//+$77KK$//+$77KK= L@  IIh C L LD     IIh    sY E6DE<E6E'E$ E6' E32E36F8F F FFFFcd|jdvr!|r|jdr txs|jdk(}|s|j|jzdkrg}t |j D]\}}|s |j||st|t|k\r|S|jJt|jjtj|jjz}d|dz jz}t||dzkr|dkDr|Sy)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 )ryrzrrziNr r)rr_FORCE_OPTIMIZEwidthheightr histogramrrr6rKr getmodebands bit_length)rrFoptimiserr8countnum_palette_colorscurrent_palette_sizes r%rrs  ww*$((:*>#4bggn rxx"))+i7"$ %blln5 25'..q1 2323s;N7OO**::) ))!$RZZ%7%7!8EBBr$cvt|}d|zt|dzz }|dkDr|tddz|zz }|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 rr4r)r8r6r)rr;actual_target_size_diffs r%r9r9sR-]; !$44M8Ja8OO"A%<<< r$c|jsyt|jj|jjdk(r/djfdt t dzDS)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$rxc3:K|]}|dz|dzdzyw)rvr4Nr#)rr8rKs r%rz%_get_palette_bytes..s$X!71q51q5195Xsr4)rKrrjoinr5r6)rrKs @r%r7r7s[ ::BJJ&&'G zz& ((XuS\UVEV?WXX Nr$cd}|r?t|tr-|jJ |jj||}|S|}|S#t$r}t |dvrYd}~|Sd}~wwxYw)Nr)z$cannot allocate more than 256 colorsz/cannot add non-opaque RGBA color to RGB palette)rrrKgetcolorrr)rinfo_backgroundrCres r%rrsJ ou -::) )) ZZ00"E  )J  q6"  sA A(A##A(cd}|jjddk(s9|r9d|vs3|jd"|jds|jdrd}t||jd}t|}t |}d |zt |j d zt |j d zt|d zt|td zt|g}|jd_|jd tdztdzdztdztd zt |dztd z|jdrd tdz}|d}t|tr|j}td t|dD]$} || | dz} |tt| | zz }&|td z }|j||S)z2Return a list of strings representing a GIF headers87ar=s89ar|rsrlrhrCsGIFrr rArjrprBrrr4rn)rFrrr7r8r6rrr9rrrencoder5r6) rrFr=rCrr;header comment_blockrhr8subblocks r%rrs G ww{{9' d "xx+xx #xx " TXXl%;.CollectorcN|jj|t|Sr)r2rr6)r0r2s r%rz getdata..Collector.writes II  T "t9 r$N)r2rrr)rrrr2rr#r$r% Collectorr|s  r$r~)iorzrrr2)rr(rurzr~r.s r%rrs<&GGGI Bb"ff- 77Nr$z.gifz image/gif)r(rrr)rrrr)rrrK_Palette | NonerFrrr)rrr. IO[bytes]rKrrr)rrrrrz4tuple[Image.Image, tuple[int, int, int, int] | None])rrr.rrKrrr)rrr.rr, str | bytesrr)F) rrr.rr,rr+rrr)rrrr) r.rrrr(tuple[int, int]rRrrr)rrrFrrzlist[int] | None)rrrr)rrrr)rrrr)rrrnz=int | tuple[int, int, int] | tuple[int, int, int, int] | Nonerr)rrrFrr list[bytes]) r.rrrr(rrurrr)NN)rrrKrrFzdict[str, Any] | Nonerz$tuple[list[bytes], list[int] | None])r)rrr(rrurrr)J __future__rrrdrNrFenumr functoolsrtypingrrrr r r r rrr_binaryrrGrrr6_utilr TYPE_CHECKINGrrr_typingrrr rr)r+rrrrrr_Paletterrrrr)r-rrrrWrYrr8r9r7rrrrxr register_openr register_saveregister_save_allregister_extension register_mimer#r$r%rs4# %(("!  "g#22 5f9&&fZ #C (4 9 tCy (<+D+D DDD-D5CDDN 8 2  2$/ 29 2 Z "-< D+ MR".9EI &//"/,;/DG/ /d-d-`C$  R 6;|!!! !  !  !8UY''-'06"","AD""PL''w?L''/ ++Y7,,f5L''5r$