
    ]Hj[                    h   % S SK Jr  S SKrS SKrS SKJr  S SKJr  SSKJ	r	J
r
JrJr  Sr\(       a"  S SKJr  S S	KJr  S S
KJrJr  SSKJr  SSKJrJr  \	R.                  R0                  rS\S'     " S S5      rSSS jjrSSS jjr  S           SS jjr        SS jr      SS jr g)    )annotationsN)Sequence)cast   )Image
ImageColor	ImageFont	ImageTextF)Callable)
ModuleType)AnyAnyStr
ImageDraw2)Coords_Inkz!Callable[[], Image.core._Outline]Outlinec                     \ rS rSr% SrS\S'   SSS jjr  S S jrS!S jr S     S"S jjr	  S#           S$S	 jjr
 S       S%S
 jjr   S&             S'S jjr   S&         S(S jjr   S&           S)S jjr   S*         S+S jjr  S,       S-S jjr   S&             S'S jjrSS.S jjr   S&         S(S jjr    S/             S0S jjr   S&         S(S jjr    S/SS.             S1S jjjr           S2                               S3S jjr           S2SS.                             S4S jjjr     S5SS.               S6S jjjr         S7SS.                         S8S jjjr         S7SS.                         S8S jjjrSrg)9	ImageDraw=   NImageFont.BaseImageFont | Nonefontc                L   UR                  5         SnUc  UR                  nX!R                  :w  a&  US:X  a  UR                  S:X  a  SnOSn[        U5      eUS:X  a  UR                  U l        OSU l        Xl        UR
                  U l        [        R                  R                  U R
                  U5      U l        X l        US;   a!  U R                  R                  S5      U l
        O U R                  R                  S	5      U l
        US
;   a  SU l        OSU l        SU l        g)aX  
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.
r   NRGBARGBr   zmode mismatchP)IF)1r   r   r   r    LF)_ensure_mutablemode
ValueErrorpalette_imageimr   coredrawdraw_inkinkfontmodefill)selfr'   r#   blendmsgs        O/Users/admin/workspace/tools/venv/lib/python3.13/site-packages/PIL/ImageDraw.py__init__ImageDraw.__init__@   s     	<77D77?v~"''U"2% o%3;::DLDL%%JJOODGGU3		:yy))!,DHyy))"-DH''DMDM	    c                p    U R                   (       d  [        R                  " 5       U l         U R                   $ )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.)r   r	   load_default)r.   s    r1   getfontImageDraw.getfonth   s%    ( yy!..0DIyyr4   c                T    Ub  [         R                  " U5      $ U R                  5       $ N)r	   r6   r7   )r.   	font_sizes     r1   _getfontImageDraw._getfont   s%     )))44<<>!r4   c                   S nS nUc3  Uc0  U R                   (       a  U R                  nX44$ U R                  n X44$ Ub  [        U[        5      (       a   [        R
                  " XR                  5      nU R                  (       a:  [        U[        5      (       a%  U R                  R                  XR                  5      nU R                  R                  U5      nUb  [        U[        5      (       a   [        R
                  " X R                  5      nU R                  (       a:  [        U[        5      (       a%  U R                  R                  X R                  5      nU R                  R                  U5      nX44$ r:   )r-   r+   
isinstancestrr   getcolorr#   r%   tupler&   r)   r*   )r.   r+   r-   
result_inkresult_fills        r1   _getinkImageDraw._getink   s    
;4<yy"hh  && "XX
 && c3''$--c99=C<<JsE$:$:,,//[[AC!YY//4
dC((%..tYY?D<<JtU$;$;<<00{{CD"ii006&&r4   c                z    U R                  U5      u  pdUb%  US:w  a  U R                  R                  XX6U5        ggg)zDraw an arc.Nr   )rE   r)   draw_arc)r.   xystartendr-   widthr+   s          r1   arcImageDraw.arc   s<     LL&	?uzIIr#E:  *?r4   c                    UR                  5         U R                  U5      u  pCUc  UnUb'  U R                  R                  XR                  U5        gg)zDraw a bitmap.N)loadrE   r)   draw_bitmapr'   )r.   rI   bitmapr-   r+   s        r1   rR   ImageDraw.bitmap   sI     	LL&	;C?II!!"ii5 r4   c                    U R                  XT5      u  pxUb  U R                  R                  XX8S5        Ub,  Xx:w  a&  US:w  a  U R                  R                  XX7SU5        gggg)zDraw a chord.Nr   r   )rE   r)   
draw_chord	r.   rI   rJ   rK   r-   outlinerL   r+   fill_inks	            r1   chordImageDraw.chord   s`     W3II  C1=?s5A:II  Ca? 4>?r4   c                    U R                  X25      u  pVUb  U R                  R                  XS5        Ub+  XV:w  a%  US:w  a  U R                  R                  XSU5        gggg)zDraw an ellipse.Nr   r   )rE   r)   draw_ellipser.   rI   r-   rW   rL   r+   rX   s          r1   ellipseImageDraw.ellipse   s\     W3II""23?s5A:II""2Au5 4>?r4   c                d    US   U-
  US   U-
  US   U-   US   U-   4nU R                  XcXE5        g)z4Draw a circle given center coordinates and a radius.r   r   N)r^   )r.   rI   radiusr-   rW   rL   
ellipse_xys          r1   circleImageDraw.circle   s@     efnbefnbefnbefnU
Zw6r4   c                >  ^ U R                  U5      S   nUGby  TS:w  Gaq  U R                  R                  XT5        US:X  GaM  TS:  GaE  [        US   [        [
        45      (       a  [        [        [        [              U5      nOI[        S[        U5      S5       Vs/ s H(  n[        [        [           [        XUS-    5      5      PM*     nn[        S[        U5      S-
  5       GH  nXg   nXgS-
     U4XUS-      44 V	V
s/ s HE  u  p[        R                  " [        R                  " U
S   U	S   -
  U	S   U
S   -
  5      5      S-  PMG     nn	n
US   US   :X  a  Mz        SU4S jjnUS   US   :  =(       a    US   S	-
  US   :  =(       d     US   US   :  =(       a    US   S	-   US   :  nUS   TS-  -
  S-   US   TS-  -
  S-   4US   TS-  -   S-
  US   TS-  -   S-
  4/nU(       a  US   S
-   US   S
-   pOUS   S
-
  US   S
-
  pU R                  XS
-
  U
S
-
  U5        TS:  d  GMO  U(       a  U" XS   S
-   5      UU" XS   S
-   5      /nOU" XS   S
-
  5      UU" XS   S
-
  5      /nU R                  XSS9  GM     gggggs  snf s  sn
n	f )z6Draw a line, or a connected sequence of line segments.r   Ncurve      r   h  c                   > U u  p#US-  nTS-  S-
  n[        S X$[        R                  " [        R                  " U5      5      -  4X4[        R                  " [        R                  " U5      5      -  44 5       5      $ )NZ   rh   r   c              3     #    U  H;  u  pXS :  a  [         R                  " U5      O[         R                  " U5      -   v   M=     g7f)r   N)mathfloorceil).0pp_ds      r1   	<genexpr>9ImageDraw.line.<locals>.coord_at_angle.<locals>.<genexpr>
  s8      %+ !GC3P+s   AA)rB   rm   cosradianssin)coordanglexydistancerL   s        r1   coord_at_angle&ImageDraw.line.<locals>.coord_at_angle  sz      %#(19q=$ % "#txxU8K/L$L M!"txxU8K/L$L M+%   r4      rk         )rL   )rx   Sequence[float]ry   floatreturnztuple[float, ...])rE   r)   
draw_linesr?   listrB   r   r   r   rangelenrm   degreesatan2piesliceline)r.   rI   r-   rL   jointr+   pointsipointrJ   rK   anglesr}   flippedcoords
gap_coordss      `            r1   r   ImageDraw.line   s    ll4 #?uzII  %0EAIbedE]33!(8E?";R@F "'q#b'1!5!5A Xe_eB1q5M.BC!5   q#f+/2A"IE
 $E]E2"1q5M2++JE TZZAq0A58cRSfCT%UV+   ayF1I- .7<* q	F1I-M&)c/F1I2MQ )fQi/OF1IOfQi4O  qEAI-158eai3G!3KLqEAI-158eai3G!3KLF &,Qi"nfQi"ns&,Qi"nfQi"nsMM&"*cBhEqy" .uQi"n E % .uQi"n E*J !/uQi"n E % .uQi"n E*J
 		*!	<o 3 %.  *?s    /JAJc                    UR                  5         U R                  X25      u  pEUb  U R                  R                  XS5        Ub#  XE:w  a  U R                  R                  XS5        ggg)z(Experimental) Draw a shape.Nr   r   )closerE   r)   draw_outline)r.   shaper-   rW   r+   rX   s         r1   r   ImageDraw.shape/  s[     	W3II""5A6?sII""5q1  /?r4   c                    U R                  XT5      u  pxUb  U R                  R                  XX8S5        Ub,  Xx:w  a&  US:w  a  U R                  R                  XX7SU5        gggg)zDraw a pieslice.Nr   r   )rE   r)   draw_pieslicerV   s	            r1   r   ImageDraw.pieslice=  s`     W3II##Bsa@?s5A:II##BsEB 4>?r4   c                h    U R                  U5      u  p2Ub  U R                  R                  X5        gg)z#Draw one or more individual pixels.N)rE   r)   draw_points)r.   rI   r-   r+   s       r1   r   ImageDraw.pointM  s.    LL&	?II!!"* r4   c                   U R                  X25      u  pVUb  U R                  R                  XS5        Ub  XV:w  a  US:w  a  US:X  a  U R                  R                  XSU5        gU R                  b  [        R
                  " SU R                  R                  5      nU R                  S5      S   n[        U5      n	U	R                  R                  XS5        U R                  R                  XSUS-  S-
  UR                  5        ggggg)zDraw a polygon.Nr   r   r    rh   )rE   r)   draw_polygonr'   r   newsizeDraw)
r.   rI   r-   rW   rL   r+   rX   maskmask_inkr)   s
             r1   polygonImageDraw.polygonS  s     W3II""23?s5A:z		&&r59$ yydggll3<<?1-Dz		&&rQ7		&&r519q=$''J % 4>?r4   c                @    [        XU5      nU R                  XtXV5        g)zDraw a regular polygon.N)!_compute_regular_polygon_verticesr   )r.   bounding_circlen_sidesrotationr-   rW   rL   rI   s           r1   regular_polygonImageDraw.regular_polygonk  s     /RRw.r4   c                    U R                  X25      u  pVUb  U R                  R                  XS5        Ub+  XV:w  a%  US:w  a  U R                  R                  XSU5        gggg)zDraw a rectangle.Nr   r   )rE   r)   draw_rectangler]   s          r1   	rectangleImageDraw.rectanglex  s\     W3II$$R15?s5A:II$$Ra7 4>?r4   )cornersc               	  ^ ^^^^^^^^^^^ [        US   [        [        45      (       a(  [        [        [        [
              U5      u  u  mmu  mmO[        [        [
           U5      u  mmmmTT:  a  Sn[        U5      eTT:  a  Sn[        U5      eTc  Sm[        TT-
  TT-
  US-  5      m[        T5      m[        T5      m[        T5      m[        T5      mSu  mm[        T5      (       aO  TTT-
  S-
  :  mT(       a  TT-
  mTTT-
  S-
  :  mT(       a  TT-
  mT(       a  T(       a  T R                  XUT5      $ TS:X  d  [        T5      (       d  T R                  XUT5      $ [        TS-  5      nT R                  XC5      u  mmSUUUUUUU UUUUU4S	 jjn	TGb>  U	" S
5        T(       a.  T R                  R!                  TTU-   S-   TTU-
  S-
  4TS5        O?TU-
  S-
  TU-   S-   :  a-  T R                  R!                  TU-   S-   TTU-
  S-
  T4TS5        T(       d  T(       d  TTTU-   T/n
TS   (       a  U
S==   US-   -  ss'   TS   (       a  U
S==   US-   -  ss'   T R                  R!                  U
TS5        TU-
  TTT/nTS   (       a  US==   US-   -  ss'   TS   (       a  US==   US-   -  ss'   T R                  R!                  UTS5        TGb  TT:w  Ga  TS:w  Ga  U	" S5        T(       d  TTTTT-   S-
  /nTS   (       a  US==   US-   -  ss'   TS   (       a  US==   US-   -  ss'   T R                  R!                  UTS5        TTT-
  S-   TT/nTS   (       a  US==   US-   -  ss'   TS   (       a  US==   US-   -  ss'   T R                  R!                  UTS5        T(       d  TTTT-   S-
  T/n
TS   (       a  U
S==   US-   -  ss'   TS   (       a  U
S==   US-   -  ss'   T R                  R!                  U
TS5        TT-
  S-   TTT/nTS   (       a  US==   US-   -  ss'   TS   (       a  US==   US-   -  ss'   T R                  R!                  UTS5        ggggg)zDraw a rounded rectangle.r   z&x1 must be greater than or equal to x0z&y1 must be greater than or equal to y0N)TTTTrh   )FFr   c                  > T(       a  TTTT-   TT-   4SS4TTT-
  TT-   T4SS44nO|T(       a  TTTT-   TT-   4SS4TT-
  TTTT-   4SS44nOV[        U4S j[        TTTT-   TT-   4SS4TT-
  TTTT-   4SS4TT-
  TT-
  TT4SS4TTT-
  TT-   T4SS445       5       5      nU HH  nU (       a   T	R                  R                  " UTS4-   6   M*  T	R                  R                  " UTT
4-   6   MJ     g )Nr   ri   r   rk     c              3  D   >#    U  H  u  pTU   (       d  M  Uv   M     g 7fr:    )rp   r   partr   s      r1   rs   DImageDraw.rounded_rectangle.<locals>.draw_corners.<locals>.<genexpr>  s)      $ qz D$s    	 r   )rB   	enumerater)   r   rH   )r   partsr   r   drX   full_xfull_yr+   r.   rL   x0x1y0y1s      r1   draw_corners1ImageDraw.rounded_rectangle.<locals>.draw_corners  s]    "b1fb1f-sC8"q&"q&"-q#6  "b1fb1f-r371fb"b1f-sB7  #, "b1fb1f5sC@ 1fb"b1f5sC@ 1fb1fb"5q"= "q&"q&"5r3?	$  II++dh].BDII&&e)<>	 r4   Tr   F)r   boolr   None)r?   r   rB   r   r   r   r$   minroundallr^   anyr   intrE   r)   r   )r.   rI   ra   r-   rW   rL   r   r0   rr   leftrighttopbottomr   rX   r   r   r+   r   r   r   r   s   `    ``       @@@@@@@@@r1   rounded_rectangleImageDraw.rounded_rectangle  si    bedE]++!%hx&?!DHRhr2!(5/26NBB7:CS/!7:CS/!?.GRb&1*-2Y2Y2Y2Y%w<<"r'A+%FG"r'A+%FG&||Bgu==6W >>"GU;;QKW3X 	?  	?  	?D 		(("b1fqj"b1fqj)I8UVWa!rAvz)		(("q&1*b"q&1*b)I8UVW&BQ+1:Gq1u$G1:Gq1u$G		((x;aR,1:!HA%H1:!HA%H		((!<?sh5A:2r2:>21:Fa!eOF1:Fa!eOF		((c15b5j1nb"51:1IQ&I1:1IQ&I		((a8BU
Q31:Gq1u$G1:Gq1u$G		((sA6eaR41:!HA%H1:!HA%H		((Q7 # 4>?r4   c                  ^ ^^	^
^^^^^ [        U[        R                  5      (       a  UmOwUc   T R                  TR	                  S5      5      n[        R                  " X$T R
                  UTT	T
5      mT(       a  TR                  5         U(       a  TR                  X5        SU 4S jjnU" U5      nUc  gSnTR                  (       a!  TR                  b  U" TR                  5      OUnTR                  XU5       HE  mSSUUUU	UUU
UU 4	S jjjnUb%  U" UTR                  5        UU:w  a
  U" U5        M;  M=  U" U5        MG     g)z
Draw text.Nr;   c                B   > TR                  U 5      u  pUc  Uc   eU$ U$ r:   )rE   )r-   r+   rX   r.   s      r1   getinkImageDraw.text.<locals>.getink2  s.     LL.MC{+++Jr4   c                L  >	 TR                   nUS:X  a	  T(       a  Sn[        TR                  5      n[        TR                  5      n[        R
                  " TR                  5      S   [        R
                  " TR                  5      S   4n[        TR                  [        R                  5      (       aO  TR                  R                  " TR                  UTTTUTR                  U U/	T
Q7SS0TD6u  pgX7S   -  nXGS   -  nO> TR                  R                  " TR                  UTTTUTR                  U /T
Q7SU0TD6nUS:X  a  XfR                  S5      ph[         R"                  " SU 5      S   n	UR%                  SU	5        TR&                  b?  TR&                  R)                  XXCUR*                  S   -   XFR*                  S   -   4U5        g g TR,                  R/                  X44X`5        g ! [         a(    TR                  R                  TR                  5      n Nf = f)	Nr   r   stroke_filledTr   rJ   r   r   )r,   r   rz   r{   rm   modfr?   r   r	   FreeTypeFontgetmask2textanchorgetmask	TypeErrorgetbandstructpackfillbandr'   paster   r)   rQ   )r+   stroke_widthr#   rz   r{   rJ   r   offsetcolor	ink_alphaargs	directionembedded_colorfeatures
image_textkwargslanguager   r.   s             r1   	draw_text!ImageDraw.text.<locals>.draw_textG  s   }}1$!DKK466*1-tyy/@/CDjooy/E/EFF#-??#;#;		!  $$ $ '+$ !$LD NANAB)66 II %$$( KK  "  #(  %  6> #'Q4 &C 5a 8INN1i0ww*!qdiil*:A		!<L#Mt +
 II))1&$< % B)66tyyABs   =G1 1/H#"H#)r-   _Ink | Noner   r   )r   )r+   r   r   r   r   r   )r?   r
   Textr<   getr#   embed_colorstroker   stroke_fill_split)r.   rI   r   r-   r   r   spacingalignr   r   r   r   r   r   r   r   r   r+   
stroke_inkr   r   r   s   `       ```  ```    @@r1   r   ImageDraw.text  s&   & dINN++J|}}VZZ%<="DIIw	8XJ &&(!!,<	 Tl;
"" ))5 z--.  %%b%8D5= 5= 5=n %*j&=&=> *$cN % #E 9r4   r;   c               :    U R                  UUUUUUUUU	U
UUUUS9$ Nr   )r   )r.   rI   r   r-   r   r   r   r   r   r   r   r   r   r   r;   s                  r1   multiline_textImageDraw.multiline_text  sD    $ yy  
 	
r4   c          	         Uc  U R                  U5      n[        R                  " UUU R                  UUUS9nU(       a  UR	                  5         UR                  5       $ )z@Get the length of a given string, in pixels with 1/64 precision.)r   r   r   )r<   r
   r   r#   r   
get_length)	r.   r   r   r   r   r   r   r;   r   s	            r1   
textlengthImageDraw.textlength  s[     <==+D^^II

 ""$$$&&r4   c          	         Uc  U R                  U5      n[        R                  " X#U R                  XWX5      nU(       a  UR	                  5         U
(       a  UR                  U
5        UR                  XU5      $ )z2Get the bounding box of a given string, in pixels.)r<   r
   r   r#   r   r   get_bbox)r.   rI   r   r   r   r   r   r   r   r   r   r   r;   r   s                 r1   textbboxImageDraw.textbbox  sg    " <==+D^^		7x

 ""$l+""2u55r4   c               6    U R                  UUUUUUUUU	U
UUS9$ r  )r  )r.   rI   r   r   r   r   r   r   r   r   r   r   r;   s                r1   multiline_textbboxImageDraw.multiline_textbbox  s>      }}  
 	
r4   )	r&   r)   r-   r   r,   r'   r+   r#   r%   r:   )r'   Image.Imager#   
str | Noner   r   )r   ImageFont.BaseImageFont)r;   float | Noner   r  )r+   r   r-   r   r   ztuple[int | None, int | None])Nr   )rI   r   rJ   r   rK   r   r-   r   rL   r   r   r   )rI   zSequence[int]rR   r  r-   r   r   r   )NNr   )rI   r   rJ   r   rK   r   r-   r   rW   r   rL   r   r   r   )
rI   r   r-   r   rW   r   rL   r   r   r   )rI   r   ra   r   r-   r   rW   r   rL   r   r   r   )Nr   N)
rI   r   r-   r   rL   r   r   r  r   r   )NN)r   zImage.core._Outliner-   r   rW   r   r   r   )rI   r   r-   r   r   r   )r   NNr   )r   !Sequence[Sequence[float] | float]r   r   r   r   r-   r   rW   r   rL   r   r   r   )rI   r   ra   r   r-   r   rW   r   rL   r   r   z$tuple[bool, bool, bool, bool] | Noner   r   )NNNrg   r   NNNr   NF) rI   tuple[float, float]r   zAnyStr | ImageText.Text[AnyStr]r-   r   r   r   r   r  r   r   r   r@   r   r  r   list[str] | Noner   r  r   r   r   r   r   r   r   r   r   r   r   r   )rI   r  r   r   r-   r   r   r   r   r  r   r   r   r@   r   r  r   r  r   r  r   r   r   r   r   r   r;   r  r   r   )NNNNF)r   r   r   r   r   r  r   r  r   r  r   r   r;   r  r   r   )	NNrg   r   NNNr   F)rI   r  r   r   r   r   r   r  r   r   r   r@   r   r  r   r  r   r  r   r   r   r   r;   r  r   z!tuple[float, float, float, float])__name__
__module____qualname____firstlineno__r   __annotations__r2   r7   r<   rE   rM   rR   rY   r^   rc   r   r   r   r   r   r   r   r   r   r  r  r  r  __static_attributes__r   r4   r1   r   r   =   s.   +/D
(/&P	 2" 59''&1'	&'< !;; ; 	;
 ; ; 
; KO	6	6)4	6<G	6		6  !#@@ @ 	@
 @ @ @ 
@& !#66 6 	6
 6 
6$ !#
7
7 
7 	
7
 
7 
7 

7 ! K=K= K= 	K=
 K= 
K=` !#	2"2 2 	2
 
2& !#CC C 	C
 C C C 
C + !#KK K 	K
 K 
K8  #/:/ / 	/
 / / / 
/  !#88 8 	8
 8 
8"  #J8 9=J8J8 J8 	J8
 J8 J8 6J8 
J8` !/3! $%)##'$uu .u 	u
 -u u u u u #u u u !u u u  !u" 
#uv !/3! $%)##'$!
  #'!!
!
 !
 	!

 -!
 !
 !
 !
 !
 #!
 !
 !
 !!
 !
   !!
" 
#!
L 04 $%)#$' #''' -' 	'
 #' ' '  ' 
'< 04! $%)#$6 #'66 6 -	6
 6 6 6 6 #6 6 6 6  6 
+6@ 04! $%)#$
 #'

 
 -	

 
 
 
 
 #
 
 
 
  
 
+
 
r4   r   c                ^     [        U S5      " U5      $ ! [         a    [        X5      s $ f = f)ak  
A simple 2D drawing interface for PIL images.

: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.
getdraw)getattrAttributeErrorr   )r'   r#   s     r1   r   r     s3    #r9%d++ #""#s    ,,c                B    SSK Jn  U b  UR                  " U 5      OSnX!4$ )za
:param im: The image to draw in.
:returns: A (drawing context, drawing resource factory) tuple.
r   r   N) r   r   )r'   r   r)   s      r1   r  r    s$    
 "$.:??2dDr4   c                F   U R                  5       nUc   eUu  pg XVU4   n[        X(5      U::  a  gX%Xg4'   Xg41n	[	        5       n
U	(       a  [	        5       nU	 H  u  pgUS-   U4US-
  U4XgS-   4XgS-
  44 Hk  u  pX4U
;   d  US:  d  US:  a  M   X\U4   nU
R                  X45        Uc  [        X5      U:*  nOXU4;  nU(       a  X%X4'   UR                  X45        Mk  Mm     M     U	n
Un	U	(       a  M  gg! [        [        4 a     gf = f! [        [        4 a     M  f = f)a  
.. warning:: This method is experimental.

Fills a bounded region with a given color.

:param image: Target image.
:param xy: Seed position (a 2-item coordinate tuple). See
    :ref:`coordinate-system`.
:param value: Fill color.
:param border: Optional border value.  If given, the region consists of
    pixels with a color different from the border color.  If not given,
    the region consists of pixels having the same color as the seed
    pixel.
:param thresh: Optional threshold value which specifies a maximum
    tolerable difference of a pixel value from the 'background' in
    order for it to be replaced. Useful for filling regions of
    non-homogeneous, but similar, colors.
Nr   r   )rP   _color_diffr$   
IndexErrorsetadd)imagerI   valueborderthreshpixelrz   r{   
backgroundedge	full_edgenew_edgestrq   r-   s                   r1   	floodfillr3    sc   6 JJLEDAa4[
u)V3ad F8D I
5DAa%a!eQZ!UaQZH6Y&!a%1q5-dA MM1&)~*19VC 7&+ad aV,  I $ 	+ $ 
#  #J/ s(   C6 C6 D6D	D	D D c                  ^^	^
 [        U[        5      (       d  Sn[        U5      eUS:  a  Sn[        U5      e[        U [        [
        45      (       d  Sn[        U5      e[        U 5      S:X  aH  [        S U  5       5      (       d  Sn[        U5      e[        [        [           [	        U 5      5      Gt m	m
O[        U 5      S:X  a  [        U S   [        [
        45      (       a  [        S	 U S    5       5      (       a  [        U S
   [        [        45      (       d  Sn[        U5      e[        U S   5      S:w  a  Sn[        U5      e[        [        [           [	        U S   5      5      m	[        [        U S
   5      m
OSn[        U5      eT
S::  a  Sn[        U5      e[        U[        [        45      (       d  Sn[        U5      eSU	4S jjmSUU
4S jjnSS jnU" X5      nU Vs/ s H
  ot" U5      PM     sn$ s  snf )u  
Generate a list of vertices for a 2D regular polygon.

:param bounding_circle: The bounding circle is a sequence defined
    by a point and radius. The polygon is inscribed in this circle.
    (e.g. ``bounding_circle=(x, y, r)`` or ``((x, y), r)``)
:param n_sides: Number of sides
    (e.g. ``n_sides=3`` for a triangle, ``6`` for a hexagon)
:param rotation: Apply an arbitrary rotation to the polygon
    (e.g. ``rotation=90``, applies a 90 degree rotation)
:return: List of regular polygon vertices
    (e.g. ``[(25, 50), (50, 50), (50, 25), (25, 25)]``)

How are the vertices computed?
1. Compute the following variables
    - theta: Angle between the apothem & the nearest polygon vertex
    - side_length: Length of each polygon edge
    - centroid: Center of bounding circle (1st, 2nd elements of bounding_circle)
    - polygon_radius: Polygon radius (last element of bounding_circle)
    - angles: Location of each polygon vertex in polar grid
        (e.g. A square with 0 degree rotation => [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
zn_sides should be an intr   zn_sides should be an int > 2z$bounding_circle should be a sequencec              3  N   #    U  H  n[        U[        [        45      v   M     g 7fr:   r?   r   r   rp   r   s     r1   rs   4_compute_regular_polygon_vertices.<locals>.<genexpr>  s     H1:a#u..   #%z0bounding_circle should only contain numeric datarh   r   c              3  N   #    U  H  n[        U[        [        45      v   M     g 7fr:   r6  r7  s     r1   rs   r8    s"      
1CAJq3,''1Cr9  r   zBbounding_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                  > [        U S   [        R                  " [        R                  " SU-
  5      5      -  U S   [        R                  " [        R                  " SU-
  5      5      -  -
  TS   -   S5      [        U S   [        R                  " [        R                  " SU-
  5      5      -  U S   [        R                  " [        R                  " SU-
  5      5      -  -   TS   -   S5      4$ )Nr   ri   r   rh   )r   rm   ru   rv   rw   )r   r   centroids     r1   _apply_rotation:_compute_regular_polygon_vertices.<locals>._apply_rotation  s    a488DLLw$?@@(TXXdll3=&ABBC1+ 	 a488DLLw$?@@(TXXdll3=&ABBC1+ 	
 	
r4   c                   > TS/nT" X5      $ Nr   r   )ry   start_pointr=  polygon_radiuss     r1   _compute_polygon_vertexB_compute_regular_polygon_vertices.<locals>._compute_polygon_vertex  s    %q){22r4   c                    / nSU -  nSSU-  -
  U-   n[        U 5       H%  nUR                  U5        XC-  nUS:  d  M   US-  nM'     U$ )Nri   r   g      ?)r   append)r   r   r   r   current_angle_s         r1   _get_angles6_compute_regular_polygon_vertices.<locals>._get_angles  s^    -sW},8wAMM-($Ms"$	  
 r4   )r   list[float]r   r   r   r  )ry   r   r   r  )r   r   r   r   r   rK  )
r?   r   r   r$   r   rB   r   r   r   r   )r   r   r   r0   rC  rI  r   ry   r=  r<  rB  s           @@@r1   r   r   _  s   V gs##(n{,o oe}554n
?q HHHHDCS/!$(ed?6K$L!>	_		"z/!2DtUm'T'T 
1@1C
 
 
OA.e==DCS/!q!"a'VCS/!UT/!*<%=>e_Q%78< 	 o4o he--2o
 3 3
 +F 9??u#E*???s   *G>c                   ^^ [        U [        5      (       a  U OU 4m[        U[        5      (       a  UOU4m[        UU4S j[        [	        T5      5       5       5      $ )zB
Uses 1-norm distance to calculate difference between two values.
c              3  L   >#    U  H  n[        TU   TU   -
  5      v   M     g 7fr:   )abs)rp   r   firstseconds     r1   rs   _color_diff.<locals>.<genexpr>  s(     E2DQs58fQi'((2Ds   !$)r?   rB   sumr   r   )color1color2rO  rP  s     @@r1   r$  r$    sI     !//FfYE!&%00VviFE%F2DEEEr4   r:   )r'   r  r#   r  r   r   )r'   zImage.Image | Noner   z)tuple[ImageDraw2.Draw | None, ModuleType]r@  )r(  r  rI   ztuple[int, int]r)  float | tuple[int, ...]r*  zfloat | tuple[int, ...] | Noner+  r   r   r   )r   r  r   r   r   r   r   zlist[tuple[float, float]])rS  rU  rT  rU  r   r   )!
__future__r   rm   r   collections.abcr   typingr   r"  r   r   r	   r
   TYPE_CHECKINGr   typesr   r   r   r   _typingr   r   r(   rW   r   r  r   r   r  r3  r   r$  r   r4   r1   <module>r\     s   @ #   $  5 5( "% .3ZZ-?-?	* ?B
 B
J#" .2>>> #> +	>
 > 
>B@6@AD@PU@@D	F#	F-D	F
	Fr4   