K iNUddlmZddlZddlZddlmZddlmZddlm Z m Z m Z dZ e r$ddlm Z dd lmZdd lmZmZdd lmZmZdd lmZmZe j.j0Zd ed< GddZdddZdddZ d ddZ ddZ ddZ y)) annotationsN)Sequence)cast)Image ImageColor ImageTextF)Callable) ModuleType)AnyAnyStr) ImageDraw2 ImageFont)Coords_Inkz!Callable[[], Image.core._Outline]OutlineceZdZUdZded<dddZ ddZ ddZ d d dZ d! d"dZ d d#d Z d$ d%d Z d$ d&d Z d$ d'd Z d( d)d Z d* d+dZ d$ d%dZdd,dZ d$ d&dZ d- d.dZ d$ d&dZ d-dd d/dZ d0 d1dZ d0dd d2dZ d3dd d4dZ d5dd d6dZ d5dd d6dZy)7 ImageDrawNNImageFont.ImageFont | ImageFont.FreeTypeFont | ImageFont.TransposedFont | NonefontcN|jd}| |j}||jk7r$|dk(r|jdk(rd}n d}t||dk(r|j|_nd|_||_|j |_t jj|j ||_||_|dvr!|jjd|_ n |jjd |_ |d vrd |_ d |_ yd |_ d |_ y)a Create a drawing instance. :param im: The image to draw in. :param mode: Optional mode to use for color values. For RGB images, this argument can be RGB or RGBA (to blend the drawing into the image). For all other modes, this argument must be the same as the image mode. If omitted, the mode defaults to the mode of the image. rNRGBARGBrz mode mismatchP)IF)1rrrrLF) _ensure_mutablemode ValueErrorpalette_imageimrcoredrawdraw_inkinkfontmodefill)selfr%r!blendmsgs S/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/PIL/ImageDraw.py__init__zImageDraw.__init__Bs  <77D 277?v~"''U"2% o% 3;::DLDL %%JJOODGGU3  : yy))!,DHyy))"-DH ' 'DM  DM cj|jsddlm}|j|_|jS)a= Get the current default font. To set the default font for this ImageDraw instance:: from PIL import ImageDraw, ImageFont draw.font = ImageFont.truetype("Tests/fonts/FreeMono.ttf") To set the default font for all future ImageDraw instances:: from PIL import ImageDraw, ImageFont ImageDraw.ImageDraw.font = ImageFont.truetype("Tests/fonts/FreeMono.ttf") If the current default font is ``None``, it is initialized with ``ImageFont.load_default()``. :returns: An image font.rr)rr load_default)r,rs r/getfontzImageDraw.getfontjs*(yy #. ..0DIyyr1cV|ddlm}|j|S|jS)Nrr3)r4rr5r6)r, font_sizers r/_getfontzImageDraw._getfonts,  #)9)))4 4<<> !r1cd}d}|.|,|jr|j}||fS|j}||fS|t|tr t j ||j }|jr6t|tr&|jj ||j}|jj|}|t|tr t j ||j }|jr6t|tr&|jj ||j}|jj|}||fSN) r+r) isinstancestrrgetcolorr!r#tupler$r'r()r,r)r+ result_ink result_fills r/_getinkzImageDraw._getinks   ;4<yy"hh ;&&"XX ;&&c3'$--c499=C<?r1c|j||\}}||jj||d|+||k7r%|dk7r|jj||d|yyyy)zDraw an ellipse.Nrr)rBr' draw_ellipser,rEr+rQrHr)rRs r/ellipsezImageDraw.ellipsesf Wd3 X   II " "2x 3 ?sh5A: II " "2sAu 54>?r1ch|d|z |d|z |d|z|d|zf}|j||||y)z4Draw a circle given center coordinates and a radius.rrN)rW)r,rEradiusr+rQrH ellipse_xys r/circlezImageDraw.circlesDefnbefnbefnbefnU  Zw6r1c |j|d}|R|jj|||dk(r.dkDr't|dtt frt ttt|}nGtdt|dDcgc](}t ttt |||dz*}}tdt|dz D]}||}||dz |f|||dzffD cgc]C\} } tjtj| d| dz | d| dz dzE} } } | d| dk(rw dfd } | d| dkDxr| dd z | dkDxs| d| dkxr| dd z| dkD} |ddz z dz|ddz z dzf|ddz zdz |ddz zdz fg}| r| dd z| dd z} } n| dd z | dd z } } |j|| d z | d z |d kDs7| r | || dd z|| || dd zg}n| || dd z || || dd z g}|j||d yyyycc}wcc} } w)z6Draw a line, or a connected sequence of line segments.rNcurverhc |\}}|dz}dz dz }td||tjtj|zf||tjtj|zffDS)NZr_rc3K|]9\}}||dkDrtj|ntj|z;yw)rN)mathfloorceil).0pp_ds r/ z9ImageDraw.line..coord_at_angle..s9% &3C!GC3P%s?A)r?rdcosradianssin)coordanglexydistancerHs r/coord_at_anglez&ImageDraw.line..coord_at_angle s %1 #(19q=$%"#Htxx U8K/L$L M!"Htxx U8K/L$L M+% r1rb)rH)rnSequence[float]rofloatreturnztuple[float, ...])rBr' draw_linesr<listr?rrrxrangelenrddegreesatan2piesliceline)r,rEr+rHjointr)pointsipointrFrGanglesrsflippedcoords gap_coordss ` r/rzImageDraw.lines&ll4 # ? II S% 0EAIbedE]3!(8E?";R@F"'q#b'1!5Xe_eBq1q5M.BCFq#f+/27=A"1IE $AE]E2"F1q5M2+'E3 TZZAq0A58cRSfCT%UVFayF1I-  . 7< * q F1I-M&)c/F1I2MQ )fQi/OF1IOfQi4OqEAI-158eai3G!3KLqEAI-158eai3G!3KLF&,Qi"nfQi"ns&,Qi"nfQi"nsMM&%"*cBhEqy" .ufQi"n E % .ufQi"n E*J!/ufQi"n E % .ufQi"n E*J  *d! ?r1cj|j|\}}||jj||yy)z#Draw one or more individual pixels.N)rBr' draw_points)r,rEr+r)s r/rzImageDraw.pointUs2LL& T ? II ! !"c * r1c|j||\}}||jj||d|||k7r|dk7r|dk(r|jj||d|y|jt j d|jj }|jdd}t|} | jj||d|jj||d|dzdz |jyyyyy)zDraw a polygon.Nrrrr_)rBr' draw_polygonr%rnewsizeDraw) r,rEr+rQrHr)rRmaskmask_inkr's r/polygonzImageDraw.polygon[s Wd3 X   II " "2x 3 ?sh5A:z &&r359$yydggll3<<?1-Dz &&r8Q7 &&r3519q=$''J%4>?r1cFt|||}|j||||y)zDraw a regular polygon.N)!_compute_regular_polygon_verticesr)r,bounding_circlen_sidesrotationr+rQrHrEs r/regular_polygonzImageDraw.regular_polygonss$/ R Rw.r1c|j||\}}||jj||d|+||k7r%|dk7r|jj||d|yyyy)zDraw a rectangle.Nrr)rBr'draw_rectanglerVs r/ rectanglezImageDraw.rectanglesf Wd3 X   II $ $R1 5 ?sh5A: II $ $Ra 74>?r1)cornersc t|dttfr(tttt |\\\nttt |\kr d}t |kr d}t |d|dzttttd\tr<z dz k\rz z dz k\rz rrj|||Sdk(s tsj|||Stdz}j||\d f d } | d r.jj|zdz|z dz fdn>|z dz |zdzkDr-jj|zdz|z dz fdss|zg} dr| dxx|dzz cc<d r| d xx|dzzcc<jj| d|z g} dr| dxx|dzz cc<dr| d xx|dzzcc<jj| dhk7radk7rZ| d szdz g} dr| dxx|dzz cc<dr| dxx|dzzcc<jj| dz dzg} d r| dxx|dzz cc<dr| dxx|dzzcc<jj| dszdz g} dr| dxx|dzz cc<d r| d xx|dzzcc<jj| dz dzg} dr| dxx|dzz cc<dr| d xx|dzzcc<jj| dyyyyy)zDraw a rounded rectangle.rz&x1 must be greater than or equal to x0z&y1 must be greater than or equal to y0N)TTTTr_)FFrc  r z zfddf z zfddff}nvr z zfddf z zfddff}nUtfdt z zfddf z zfddf z z fddf z zfddffD}|D]A}|r jj|dfz$ jj| fzCy)Nrtr`rrbc32K|]\}}|r|ywr;)rgrpartrs r/rjzDImageDraw.rounded_rectangle..draw_corners..s& 4qz sr)r? enumerater'rrD)rpartsrrdrRfull_xfull_yr)r,rHx0x1y0y1s r/ draw_cornersz1ImageDraw.rounded_rectangle..draw_cornerssf"b1fb1f-sC8"q&"q&"-q#6"b1fb1f-r371fb"b1f-sB7  #, "b1fb1f5sC@ 1fb"b1f5sC@ 1fb1fb"5q"= "q&"q&"5r3? $   ?+DII++dh].BD&DII&&e )<>  ?r1TrvF)rboolryNone)r<r{r?rrrxr"roundallrWanyrintrBr'r)r,rErYr+rQrHrr.rrleftrighttopbottomrrRrrr)rrrrs` `` @@@@@@@@@r/rounded_rectanglezImageDraw.rounded_rectanglesW bedE] +!%hx&?!D HRhr2!(5/26NBB 7:CS/ ! 7:CS/ ! ?.G QJ 2Y 2Y 2Y 2Y% w<"r'A+%FG"r'A+%FG&||Bgu== 6W>>"dGU; ; QK Wd3 X ? ? ?D     (("b1fqj"b1fqj)I8UVWa!b1fqj( (("q&1*b"q&1*b)I8UVW&BQ+1:Gq1u$G1:Gq1u$G ((x;aR,1:!HA%H1:!HA%H ((!< ?sh5A:  2r2:>21:Fa!eOF1:Fa!eOF ((c15b5j1nb"51:1IQ&I1:1IQ&I ((a8BU Q31:Gq1u$G1:Gq1u$G ((sA6eaR41:!HA%H1:!HA%H ((Q7#4>?r1c^ t|tjr|nm| jj d}tj||j |  rj | rj| | dfd }||}|yd}jr j|jn|}j|D]C\dd  f d }|"||j||k7s3||<||Ey)z Draw text.Nr8c@j|\}}||J|S|Sr;)rB)r+r)rRr,s r/getinkzImageDraw.text..getink?s0 LL.MC{+++Jr1c  j}|dk(rrd}g}tdD]}|jt|!t j ddt j ddf} j j|g |d ||d\}}|d|dz|d|dzg}|dk(r||jd}}tjd |d} |jd| |\} } jBjj!|| | | |j"dz| |j"dzf|yyj$j'|||y#t$rY j j|| |g d|i}n*#t$rj j}YnwxYwYwxYw) Nrrr_rT) directionfeatureslanguage stroke_width stroke_filledanchorr)rFrFrvr)r*r|appendrrdmodfrgetmask2AttributeErrorgetmask TypeErrorgetbandstructpackfillbandr%pasterr'rL)r)rr!rnrrFroffsetcolor ink_alpharprqrargsrembedded_colorr image_textkwargsrrr,rEs r/ draw_textz!ImageDraw.text..draw_textTs#}}1$!Dq-ALLRU,-2a5)!,dii1.>q.AB =#;:??#;#; $ $#,!)!)%1&*%# $! $LD&#1Xq 158fQi3GHE$6>#' Q4E & C 5a 8INN1i0 DAqww* !Aq!diil*:A ! *$cN#GC r1r8c@|j||||||||| | | | | |SNr)r)r,rErr+rrrrrrrrrrr8s r/multiline_textzImageDraw.multiline_textsD.yy               r1c||j|}tj|||j|||}|r|j |j S)z@Get the length of a given string, in pixels with 1/64 precision.)rrr)r9r rr!r get_length) r,rrrrrrr8rs r/ textlengthzImageDraw.textlengths[" <==+D^^   II     " " $$$&&r1c  ||j| }tj|||j|||| } | r| j | r| j | | j |||S)z2Get the bounding box of a given string, in pixels.)r9r rr!rrget_bbox)r,rErrrrrrrrrrr8rs r/textbboxzImageDraw.textbboxso, <==+D^^ $ 7Ix    " " $    l +""2vu55r1c <|j||||||||| | | |  Sr)r) r,rErrrrrrrrrrr8s r/multiline_textbboxzImageDraw.multiline_textbboxs>*}}             r1r;)r% Image.Imager! str | Noneryr)ryGImageFont.ImageFont | ImageFont.FreeTypeFont | ImageFont.TransposedFont)r8 float | Noneryr)r)rr+rryztuple[int | None, int | None])Nr) rErrFrxrGrxr+rrHrryr)rEz Sequence[int]rMrr+rryr)NNr)rErrFrxrGrxr+rrQrrHrryr) rErr+rrQrrHrryr) rErwrYrxr+rrQrrHrryr)NrN) rErr+rrHrrrryr)NN)rzImage.core._Outliner+rrQrryr)rErr+rryr)rNNr)r!Sequence[Sequence[float] | float]rrrrxr+rrQrrHrryr)rErrYrxr+rrQrrHrrz$tuple[bool, bool, bool, bool] | Noneryr) NNNr^rNNNrNF) rEtuple[float, float]rzAnyStr | ImageText.Textr+rrrrrrrxrr=rrrlist[str] | Nonerrrrxrrrrrr rr ryr)rErrr r+rrrrrrrxrr=rrrrrrrrxrrrrr8rryr)NNNNF)rr rrrrrrrrrrr8rryrx) NNr^rNNNrF)rErrr rrrrrrxrr=rrrrrrrrxrrr8rryz!tuple[float, float, float, float])__name__ __module__ __qualname__r__annotations__r0r6r9rBrIrMrSrWr[rrrrrrrrrrrrrrr1r/rr=sE  V &P P6"%" P"59''&1' &'<! ;  ; ; ;  ;  ;  ;KO 6 6)4 6 [225.0, 315.0, 45.0, 135.0]) 2. For each angle in angles, get the polygon vertex at that angle The vertex is computed using the equation below. X= xcos(φ) + ysin(φ) Y= −xsin(φ) + ycos(φ) Note: φ = angle in degrees x = 0 y = polygon_radius The formula above assumes rotation around the origin. In our case, we are rotating around the centroid. To account for this, we use the formula below X = xcos(φ) + ysin(φ) + centroid_x Y = −xsin(φ) + ycos(φ) + centroid_y zn_sides should be an intrvzn_sides should be an int > 2z$bounding_circle should be a sequencec3HK|]}t|ttfywr;r<rrxrgrs r/rjz4_compute_regular_polygon_vertices..sH1:a#u.H "z0bounding_circle should only contain numeric datar_rc3HK|]}t|ttfywr;rrs r/rjz4_compute_regular_polygon_vertices..s  ,-Jq3, ' rrzBbounding_circle centre should contain 2D coordinates (e.g. (x, y))z[bounding_circle should contain 2D coordinates and a radius (e.g. (x, y, r) or ((x, y), r) )z$bounding_circle radius should be > 0z"rotation should be an int or floatc t|dtjtjd|z z|dtjtjd|z zz dzdt|dtjtjd|z z|dtjtjd|z zzdzdfS)Nrr`rr_)rrdrkrlrm)rr~centroids r/_apply_rotationz:_compute_regular_polygon_vertices.._apply_rotations a488DLLw$?@@(TXXdll3=&ABBC1+   a488DLLw$?@@(TXXdll3=&ABBC1+    r1cdg}||SNrr)ro start_pointrpolygon_radiuss r/_compute_polygon_vertexzB_compute_regular_polygon_vertices.._compute_polygon_vertexs%q) {E22r1cg}d|z }dd|zz |z}t|D]#}|j|||z }|dkDs|dz}%|S)Nr`rg?)r|r)rrrr~ current_angle_s r/ _get_anglesz6_compute_regular_polygon_vertices.._get_anglesse-sW},8 w %A MM- ( W $Ms"$  %  r1)r list[float]r~rxryr)rorxryr)rrrrxryr&) r<rrr"r{r?r}rrrx) rrrr.r!r%rrorrr s @@@r/rrsV gs #(n{,o oe} 54n ?q HHHDCS/ !$(ed?6K$L!> _  "z/!2DtUm'T 1@1C  OA.e =DCS/ ! q! "a 'VCS/ !U T/!*<%=>e_Q%78 < o4o he -2o 3 ( +F9? ?u #E * ?? ?s>Gct|tr|n|ft|tr|n|ftfdtt DS)zJ Uses 1-norm distance to calculate difference between two values. c3FK|]}t||z ywr;)abs)rgrfirstseconds r/rjz_color_diff.. s#EQs58fQi'(Es!)r<r?sumr|r})color1color2r*r+s @@r/rrsC !/FfYE!&%0VviF E%F 2DE EEr1r;)r%rr!rryr)r%zImage.Image | Noneryz)tuple[ImageDraw2.Draw | None, ModuleType]r) rrrEztuple[int, int]r float | tuple[int, ...]r zfloat | tuple[int, ...] | Noner rxryr)rrrrrrxryzlist[tuple[float, float]])r-r/r.r/ryrx)! __future__rrdrcollections.abcrtypingrr4rrr TYPE_CHECKINGr typesr r r rr_typingrrr&rQrrrrrrrrrr1r/r6s@# $** ( "'%.3ZZ-?-? *?d  d  N#".2 > >> #> + >  >  >B@6@AD@PU@@D F # F-D F  Fr1