K isddlmZddlZddlZddlZddlZddlZddlZddlm Z m Z m Z m Z ddl mZmZddlmZmZdZerddlmZej,eZd Z d ZdZ d d d dddZ d)dZd*dZGdde ZGddejZ GddejBZ"Gdde ejFZ$GddZ%d+d,dZ& d- d.dZ'd/d Z(Gd!d"Z)Gd#d$Z*Gd%d&e*Z+Gd'd(e*Z,y)0) annotationsN)IOAny NamedTuplecast)ExifTagsImage) DeferredErroris_pathF)StrOrBytesPathiizimage buffer overrun errorzdecoding errorz unknown errorzbad configurationzout of memory error)ic tjj|}|s |rdndd|}|d|rdnddz }t |S#t$rtj |}YEwxYw)Nencoderdecoderz error z when writingreadingz image file)r coregetcodecstatusAttributeErrorERRORSgetOSError)errorrmsgs S/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/PIL/ImageFile.py _get_oserrorr Vsv jj''. %95WUGDVIi8 DDC 3<  jj sAA'&A'_Tilec |dS)N)ts r _tilesortr&as Q4Kc>eZdZUded<ded<dZded<dZd ed <y) r!str codec_name tuple[int, int, int, int] | NoneextentsrintoffsetNztuple[Any, ...] | str | Noneargs)__name__ __module__ __qualname____annotations__r.r/r$r'rr!r!fs!O --FCO)-D &-r'ceZdZdZ d dfd ZddZdZdfd ZddZddZ dfd Z dfd Z dd Z dd Z dd Zdd ZddZxZS) ImageFilez*Base class for image file format handlers.ct|d|_d|_g|_ d|_d|_t|_t|r3t|d|_ tj||_d|_n.t!t"t$||_ ||nd|_d|_ |j'|j6r$|j8ddks|j8ddkr d}t5|y#t(t*t,t.t0j2f$r}t5||d}~wwxYw#t:$r(|jr|jj=wxYw) Nrrr$rbTFznot identified by this driver)super__init__ _min_framecustom_mimetypetilereadonly decoderconfigMAXBLOCKdecodermaxblockr openfposfspathfilename _exclusive_fprrbytes_open IndexError TypeErrorKeyErrorEOFErrorstructr SyntaxErrormodesize BaseExceptionclose)selfrCrFvr __class__s rr:zImageFile.__init__usC +/!# * .0' 2;2tnDGIIbMDM!%D 2e9b)DG(0(>$++"3"3"56 6r'c<t||jgzSrX)r9 __getstate__rF)rTrVs rrzImageFile.__getstate__sw#%77r'cbg|_t|dkDr |d|_t||y)N)r=lenrFr9 __setstate__)rTstaterVs rrzImageFile.__setstate__s- u:>!!HDM U#r'c^|jr|jjd|_y)zCheck file integrityN)rGrCrSrYs rverifyzImageFile.verify s!    GGMMOr'c |js|j d}t|tjj |}|js|Sd|_|j xrt|jdk(}d}t|dr|j}d}n|jj}t|dr|j}d}n|jj}|ry|jd\}}} } t| tr| ddf} |dk(rJt| t r9t| d k\r*| d|j"k(r| dtj$vr| dkr d }t'| ddl} t+|j 5} | j)| j-d| j. |_ddd| |j0d| dzz|j j1kDr d }t|tj2j5|j |j0|| | |_d}|j8rd|j8_|jAd } |j s|jjCtDtG|dd}tIjJ|jdDcgc]\}}tM|dc}}|_tO|jD]I\}\}}} } || tjP|j"|| |jR} |jU|j6||jVr0|jY|j|j[dd} n|} |j\}|dzt|jkr&|j|dzj^}|| kDr|| z } ||}|s!tfrn?dt|d}t|||z}|j[|\}} |dkrn||d}|jiLg|_||_5|jm|jnr&|jpr|jjsd|_ |j stfs| dkr tu| dtjj |S#1swY2xYw#t<tt>f$r d|_YwxYwcc}}w#t`tbjdf$r}tfrYd}~d}t||d}~wwxYw#|jiwxYw)z"Load image data based on tile listNzcannot load this imagerr load_readF load_seekrawzTile offset cannot be negative)accesszbuffer is not large enoughrkey tile_prefixr'c|d|d|dfS)Nrrrr$)r=s rz ImageFile.load..`sT!Wd1gtAw,Gr'rzimage file is truncatedzimage file is truncated (z bytes not processed)r);r=_imrr r}maprFrhasattrrrCrwrrur^r)rkrP _MAPMODESr_mmaprBfileno ACCESS_READrQr map_bufferrpalettedirtyr ImportError load_preparesortr&r] itertoolsgroupbylist enumerate _getdecoderr?setimagepulls_fdsetfddecoderAr.rJrNrLOAD_TRUNCATED_IMAGEScleanupr>load_endrG!_close_exclusive_fp_after_loadingrSr )rTrpixeluse_mmapr>rwru decoder_namer,r.r/rrCerr_codeprefix_tilesirb read_bytes next_offsetsens rr}zImageFile.loadsyyTXX-*C#,    &yyL%)==8S^q%8 4 %>>DH77<>DH77<>##6q#9"")-)=)=J 1us499~5.2iiA.>.E.E #.#71$($4$%#8$)),,/F83H)J%(+2#,$6 !AA*1..*;KAx 1u % !!"A=#BOO%[- &^       $"H"H GGMMOxx 5(Q,x7 7{{%%yVV'=$#DH$4%/ #=>#8$)*CC*1#,A$= >2OO%so2S: 2S-=B#S:TB(U0T"8AU-S72S::TT"U;UUUUUU/c|j9tjj|j|j |_|jdk(r tjj|yy)NP)rr rnewrPrQrr}rYs rrzImageFile.load_preparesM 88 jjnnTYY :DG 99  KK  T " r'cyrXr$rYs rrzImageFile.load_end r'c||jks4t|dr |j)|t|d|jzk\r d}t ||j |k7S)N _n_framesn_framesz attempt to seek outside sequence)r;rrr]rMrt)rTframers r _seek_checkzImageFile._seek_checks] DOO #T;/DNN4JWT:6HH5C3- yy{e##r'rX)rCzStrOrBytesPath | IO[bytes]rFzstr | bytes | NonereturnNonerr)rzlist[ImageFile])r str | None)r list[Any])rrrrrzImage.core.PixelAccess | None)rr-rbool)r0r1r2__doc__r:rIr`rSrrrrrr}rrr __classcell__)rVs@rr5r5rsj4NR0,08J0 0d (1f8$ M&^#  $r'r5c:eZdZddZej ddZy) StubHandlercyrXr$rTrs rrBzStubHandler.openrZr'cyrXr$rs rr}zStubHandler.loadrr'N)r StubImageFilerr)rrr Image.Image)r0r1r2rBabcabstractmethodr}r$r'rrrs!    r'rcdeZdZdZej ddZddZej ddZy) rz Base class for stub image loaders. A stub loader is an image loader that can identify files of a certain format, but relies on external code to load the file. cyrXr$rYs rrIzStubImageFile._openrr'c|j}|d|jd}t||j|}|J|j|_|j |_|jS)Nzcannot find loader for this z file)_loadrrr}rV__dict__)rTloaderrimages rr}zStubImageFile.loadsj >0 UCC#,  D!    zz|r'cy)z (Hook) Find actual image loader.Nr$rYs rrzStubImageFile._loads r'Nrr)rzStubHandler | None) r0r1r2rrrrIr}rr$r'rrrs@       r'r) metaclasscpeZdZUdZdZdZded<dZded<dZded<d Z d Z dd Z dd Z dd Z dd ZddZy)Parserzj Incremental image parser. This class implements the standard feed/close consumer interface. NzImage.Image | Nonerz bytes | Nonerz,Image.core.ImagingDecoder | PyDecoder | Nonerrc*|jJdy)z (Consumer) Reset the parser. Note that you can only call this method immediately after you've created a parser; parser instances cannot be reused. Nzcannot reuse parsers)rrYs rresetz Parser.resets yy 8"88 r'cT|jry|j||_n|j|z|_|jr|jdkDrmt t |j|j}|j|d|_|j|z |_|jdkDs |jsy|jj |j\}}|dkr(d|_d|_|dkrd|_t|dy|j|d|_y|jry tj|j5}tj|}dddtdxs t|d}|st |jdk7rd|_||_y|j|jd\}}} } g|_tj |j"|| |j$|_|jj'|j(|| |_|jt |jkr%|j|jd|_d|_||_y#1swY%xYw#t*$rYywxYw)z (Consumer) Feed data to the parser. :param data: A string buffer. :exception OSError: If the parser failed to parse the image file. NrrFrrr)finishedrrr.minrrrr rxryr rBrr=rrrPr?rrr) rTrskiprrrCrflagdoas rfeedz Parser.feeds( ==  99 DI D(DI <<{{Q3tyy>4;;7 IIde, "kkD0 ;;?$))<<&&tyy1DAq1u  ! q5!%DJ&q%88 !" DI ZZ  ZZ *(bBB( r;/K72{3K3rww<1,"&DK  OO%!#JAq!Q BG#(#4#4RWWaBDTDT#UDLLL))"%%3#$DK{{c$))n4$(IIdkkm$< &'  /((  s*6JJ+JJJ J'&J'c|SrXr$rYs r __enter__zParser.__enter__Ms r'c$|jyrX)rSrTr/s r__exit__zParser.__exit__Ps  r'c,|jr8|jddx|_|_|js d}t ||j s d}t ||jrjt j|j5} tj||_|j j ddd|j S|j S#|j jwxYw#1swY|j SxYw)a (Consumer) Close the stream. :returns: An image object. :exception OSError: If the parser failed to parse the image file either because it cannot be identified or cannot be decoded. r'Nzimage was incompletezcannot parse this image) rrrrrrrxryr rBr})rTrrCs rrSz Parser.closeSs << IIcN'+ +DI ==,cl"zz+C#,  99DII& &"&!&BDJJJOO%  & zztzzJJOO%  & zzs$ C? C %C? C<<C??Dr)rrHrr)rr)r/objectrr)rr)r0r1r2r incrementalrr3rrr.rrrrrrSr$r'rrrsS K $E $D,<@G 9@ FH9J Xr'rc |jt|dsd|_|jtt t ||jddz} |j}|jt|||||t|dr|jyy#ttjf$r}t||||d|Yd}~Ld}~wwxYw)zHelper to save image based on tile list :param im: Image object. :param fp: File object. :param tile: Tile list. :param bufsize: Optional buffer size encoderconfigr$rrNflush)r}rr rr&maxr@rQrr  _encode_tilerrxUnsupportedOperation)rrCr=bufsizefhexcs r_saverusGGI 2 'II)I (GRWWQZ!^4G7 YY[  RT7B/r7   B33 47RT7D#667s/B))CCCc<|D]\}}}} |dkDr|j|tj|j|| |j} | j |j || jr%| j|| jd} nE|r- | j|dd\} } |j| | rn,|J| j||} | dkrt| d| | jy#| jwxYw)NrrTr)rur _getencoderrPr rr pushes_fdrencode_to_pyfdencodewriteencode_to_filer r) rrCr=rrr encoder_namer,r.r/rerrcoders rr r s04+ gvt A: GGFO##BGG\4AQAQR    RUUG ,   b!!00215(/w(?(C "! >)>%44RAG{"7D9sB OO 10 OO s B%D  Dc|dkry|tkr.|j|}t||kr d}t||Sg}|}|dkDrG|jt |t}|sn%|j ||t|z}|dkDrGt d|D|kr d}t|dj|S)a Reads large blocks in a safe way. Unlike fp.read(n), this function doesn't trust the user. If the requested size is larger than SAFEBLOCK, the file is read block by block. :param fp: File handle. Must implement a read method. :param size: Number of bytes to read. :returns: A string containing size bytes of data. Raises an OSError if the file is truncated and the read cannot be completed rr'zTruncated File Readc32K|]}t|ywrX)r).0blocks r z_safe_read..s *%3u: *s) SAFEBLOCKrwrrrrlsumjoin)rCrQrrblocksremaining_sizers r _safe_readr&s qy ywwt} t9t 'C#,  FN 1 NI67  e#e*$ 1   *6 **T1#cl 88F r'ceZdZddZddZy) PyCodecStatec<d|_d|_d|_d|_y)Nr)xsizeysizexoffyoffrYs rr:zPyCodecState.__init__s    r'c|j|j|j|jz|j|jzfSrX)r,r-r*r+rYs rr,zPyCodecState.extentss3yy$))TYY%;TYY=SSSr'Nr)rztuple[int, int, int, int])r0r1r2r:r,r$r'rr(r(s  Tr'r(cNeZdZUded<d dZd dZd dZd dZ d ddZy)PyCodeczIO[bytes] | Nonefdcnd|_t|_d|_||_|j |yrX)rr(rr1rPinit)rTrPr/s rr:zPyCodec.__init__s+15!^   $r'c||_y)z Override to perform codec specific initialization :param args: Tuple of arg items from the tile entry :returns: None N)r/rs rr3z PyCodec.inits  r'cy)zT Override to perform codec specific cleanup :returns: None Nr$rYs rrzPyCodec.cleanups r'c||_y)z Called from ImageFile to set the Python file-like object :param fd: A Python file-like object :returns: None N)r1)rTr1s rrz PyCodec.setfds r'Nc||_|r|\}}}}nd\}}}}|dk(r=|dk(r8|jj\|j_|j_nJ||j_||j_||z |j_||z |j_|jjdks|jjdkr d}t||jj|jj z|jjdkDsG|jj|jj z|jjdkDr d}t|y)z Called from ImageFile to set the core output image for the codec :param im: A core image object :param extents: a 4 tuple of (x0, y0, x1, y1) defining the rectangle for this tile :returns: None )rrrrrzSize cannot be negativerz Tile cannot extend outside imageN)rrQrr*r+r,r-r_)rTrr,x0y0x1y1rs rrzPyCodec.setimages, & RR+ RR 7rQw15 .DJJ djj. DJJO DJJO!BwDJJ !BwDJJ  ::  q DJJ$4$4$9+CS/ ! JJ  tzz .a @zz$**//1DGGLLOC4CS/ !Dr')rPr)r/rrr)r/tuple[Any, ...]rrr)r1 IO[bytes]rrrX)rzImage.core.ImagingCorer,r+rr) r0r1r2r3r:r3rrrr$r'rr0r0sB 59'" "'"2'"  '"r'r0cHeZdZdZdZeddZddZ d d dZy) PyDecoderz Python implementation of a format decoder. Override this class and add the decoding logic in the :meth:`decode` method. See :ref:`Writing Your Own File Codec in Python` Fc|jSrX) _pulls_fdrYs rrzPyDecoder.pulls_fd:s ~~r'cd}t|)a= Override to perform the decoding process. :param buffer: A bytes object with the data to be decoded. :returns: A tuple of ``(bytes consumed, errcode)``. If finished with decoding return -1 for the bytes consumed. Err codes are from :data:`.ImageFile.ERRORS`. zunavailable in base decoderNotImplementedError)rTbufferrs rrzPyDecoder.decode>,!#&&r'Nc^|s |j}tj|jd||}|jJ|j |j|j j |j|}|ddk\r d}t||ddk7r d}t|y)aS Convenience method to set the internal image from a stream of raw data :param data: Bytes to be set :param rawmode: The rawmode to be used for the decoder. If not specified, it will default to the mode of the image :param extra: Extra arguments for the decoder. :returns: None rNrznot enough image datarzcannot decode image data) rPr rrrrr,rr_)rTrrawmodeextrarrrs r set_as_rawzPyDecoder.set_as_rawJsiiG   dii ?ww""" 477DJJ..01 HHTN Q419)CS/ ! Q419,CS/ ! r'rr)rEz$bytes | Image.SupportsArrayInterfacertuple[int, int])Nr$)rrHrHrrIr<rr) r0r1r2rrApropertyrrrJr$r'rr?r?0sQI  'QS""$.">M" "r'r?c>eZdZdZdZeddZd dZd dZd dZ y) PyEncoderz Python implementation of a format encoder. Override this class and add the decoding logic in the :meth:`encode` method. See :ref:`Writing Your Own File Codec in Python` Fc|jSrX) _pushes_fdrYs rrzPyEncoder.pushes_fdps r'cd}t|)a  Override to perform the encoding process. :param bufsize: Buffer size. :returns: A tuple of ``(bytes encoded, errcode, bytes)``. If finished with encoding return 1 for the error code. Err codes are from :data:`.ImageFile.ERRORS`. zunavailable in base encoderrC)rTrrs rrzPyEncoder.encodetrFr'c|jsy|jd\}}}|r)|jJ|jj|||fS)z If ``pushes_fd`` is ``True``, then this method will be used, and ``encode()`` will only be called once. :returns: A tuple of ``(bytes consumed, errcode)``. Err codes are from :data:`.ImageFile.ERRORS`. )rrr)rrr1r)rTbytes_consumedrrs rrzPyEncoder.encode_to_pyfdsP~~(, A% 77& && GGMM$ w&&r'cd}|dk(r9|j|\}}}|dkDrtj|||d|dk(r9|S)z :param fh: File handle. :param bufsize: Buffer size. :returns: If finished successfully, return 0. Otherwise, return an error code. Err codes are from :data:`.ImageFile.ERRORS`. rN)rrDr)rTrrrstatusbufs rrzPyEncoder.encode_to_filesPl#';;w#7 FGSzS\*lr'NrK)rr-rztuple[int, int, bytes])rrL)rr-rr-rr-) r0r1r2rrQrMrrrrr$r'rrOrOfs/J  '' r'rO)rr-rrrr)r%r!rr-)r) rrrCr=r= list[_Tile]rr-rrrX)rrrCr=r=rXrr-rz int | NonerzBaseException | Nonerr)rCr=rQr-rrH)- __future__rrrxrloggingrDrNtypingrrrrr8r r _utilr r TYPE_CHECKING_typingr getLoggerr0rcr@r!rrr r&r!r5ABCrABCMetarrrr r&r(r0r?rOr$r'rrbs_:#  ,,) '   8 $    N %   .J.P$ P$f  #''  I