
    .i                       U d dl m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 dZer$d dlmZ d d	lmZ d d
lmZmZ ddlmZmZ ddlmZmZ e	j        j        Zded<   	  G d d          Zd/d0dZd/d1dZ	 	 d2d3d$Zd4d+Zd5d.Z dS )6    )annotationsN)Sequence)cast   )Image
ImageColor	ImageTextF)Callable)
ModuleType)AnyAnyStr)
ImageDraw2	ImageFont)Coords_Inkz!Callable[[], Image.core._Outline]Outlinec                     e Zd ZU dZded<   dWdXd
ZdYdZdZdZ	 dWd[dZ	 	 d\d]dZ		 dWd^d Z
	 	 	 d_d`d"Z	 	 	 d_dad#Z	 	 	 d_dbd&Z	 	 	 dcddd)Z	 	 dedfd,Z	 	 	 d_d`d-ZdWdgd.Z	 	 	 d_dad/Z	 	 	 	 dhdid4Z	 	 	 d_dad5Z	 	 	 	 dhdd6djd9Z	 	 	 	 	 	 	 	 	 	 	 dkdldOZ	 	 	 	 	 	 	 	 	 	 	 dkddPdmdRZ	 	 	 	 	 dnddPdodSZ	 	 	 	 	 	 	 	 	 dpddPdqdUZ	 	 	 	 	 	 	 	 	 dpddPdqdVZdS )r	ImageDrawNNImageFont.ImageFont | ImageFont.FreeTypeFont | ImageFont.TransposedFont | NonefontimImage.Imagemode
str | NonereturnNonec                   |                                  d}||j        }||j        k    r%|dk    r|j        dk    rd}nd}t          |          |dk    r|j        | _        nd| _        || _        |j        | _        t          j                            | j        |          | _        || _        |dv r | j        	                    d          | _
        n| j        	                    d	          | _
        |d
v rd| _        nd| _        d| _        dS )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.
        r   NRGBARGBr   zmode mismatchP)IF)1r    r!   r"   r$   LF)_ensure_mutabler   
ValueErrorpalette_imager   r   coredrawdraw_inkinkfontmodefill)selfr   r   blendmsgs        I/var/www/html/analyses/venv/lib/python3.11/site-packages/PIL/ImageDraw.py__init__zImageDraw.__init__B   s    	<7D27??v~~"'U"2"2% oo%3;;:DLLDL%JOODGU33		:y))!,,DHHy))"--DH'''DMMDM			    GImageFont.ImageFont | ImageFont.FreeTypeFont | ImageFont.TransposedFontc                R    | j         sddlm}  |j                    | _         | j         S )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   )r    r   load_default)r0   r   s     r3   getfontzImageDraw.getfontj   s:    ( y 	1######.	.00DIyr5   	font_sizefloat | Nonec                Z    |ddl m}  |j        |          S |                                 S )Nr   r8   )r9   r   r:   r;   )r0   r<   r   s      r3   _getfontzImageDraw._getfont   s=      ######)9))444<<>>!r5   r-   _Ink | Noner/   tuple[int | None, int | None]c                h   d }d }||| j         r	| j        }n| j        }n|t          |t                    rt	          j        || j                  }| j        r5t          |t                    r | j                            || j	                  }| j
                            |          }|t          |t                    rt	          j        || j                  }| j        r5t          |t                    r | j                            || j	                  }| j
                            |          }||fS N)r/   r-   
isinstancestrr   getcolorr   r(   tupler)   r+   r,   )r0   r-   r/   
result_inkresult_fills        r3   _getinkzImageDraw._getink   s,    
;4<y &"h!X

c3'' >$-c49==C< BJsE$:$: B,//T[AAC!Y//44
dC(( @%.tTY??D< DJtU$;$; D<00t{CCD"i0066;&&r5   r   xyr   startfloatendwidthintc                z    |                      |          \  }}| | j                            |||||           dS dS )zDraw an arc.N)rJ   r+   draw_arc)r0   rK   rL   rN   r/   rO   r-   s          r3   arczImageDraw.arc   sI     LL&&	T?Ir5#sE::::: ?r5   Sequence[int]bitmapc                    |                                  |                     |          \  }}||}|#| j                            ||j        |           dS dS )zDraw a bitmap.N)loadrJ   r+   draw_bitmapr   )r0   rK   rU   r/   r-   s        r3   rU   zImageDraw.bitmap   s^     	LL&&	T;C?I!!"fi55555 ?r5   outlinec                    |                      ||          \  }}|| j                            ||||d           |-||k    r)|dk    r%| j                            ||||d|           dS dS dS dS )zDraw a chord.Nr   r   )rJ   r+   
draw_chord	r0   rK   rL   rN   r/   rY   rO   r-   fill_inks	            r3   chordzImageDraw.chord   s     Wd33XI  UC1===?sh5A::I  UCa????? ?::r5   c                    |                      ||          \  }}|| j                            ||d           |+||k    r'|dk    r#| j                            ||d|           dS dS dS dS )zDraw an ellipse.Nr   r   )rJ   r+   draw_ellipser0   rK   r/   rY   rO   r-   r]   s          r3   ellipsezImageDraw.ellipse   s     Wd33XI""2x333?sh5A::I""2sAu55555 ?::r5   Sequence[float]radiusc                    |d         |z
  |d         |z
  |d         |z   |d         |z   f}|                      ||||           dS )z4Draw a circle given center coordinates and a radius.r   r   N)rb   )r0   rK   rd   r/   rY   rO   
ellipse_xys          r3   circlezImageDraw.circle   sP     efnbefnbefnbefnU
Zw66666r5   r   jointc                   |                      |          d         }|b| j                            |           |dk    rAdk    r<t          d         t          t
          f          r,t          t          t          t                                      }n*fdt          dt                    d          D             }t          dt          |          dz
            D ]}||         }d ||dz
           |f|||dz            ffD             }	|	d         |	d         k    rBdfd}
|	d         |	d         k    o|	d         dz
  |	d         k    p&|	d         |	d         k     o|	d         dz   |	d         k    }|d         dz  z
  dz   |d         dz  z
  dz   f|d         dz  z   dz
  |d         dz  z   dz
  fg}|r|	d         dz   |	d         dz   }}n|	d         dz
  |	d         dz
  }}|                     ||dz
  |dz
  |           dk    rq|r, |
||	d         dz             | |
||	d         dz             g}n+ |
||	d         dz
            | |
||	d         dz
            g}|                     ||d           dS dS dS dS )z6Draw a line, or a connected sequence of line segments.r   Ncurve   c                    g | ]:}t          t          t                   t          ||d z                                ;S )   )r   r   rM   rG   ).0irK   s     r3   
<listcomp>z"ImageDraw.line.<locals>.<listcomp>   sK        Xe_eBq1q5yM.B.BCC  r5   rm   r   c           
         g | ]M\  }}t          j        t          j        |d          |d          z
  |d         |d         z
                      dz  NS )r   r   h  )mathdegreesatan2)rn   rL   rN   s      r3   rp   z"ImageDraw.line.<locals>.<listcomp>   sg        'E3 TZAq0A58cRSfCT%U%UVV  r5   coordrc   anglerM   r   tuple[float, ...]c                   | \  }}|dz  }dz  dz
  }t          d ||t          j        t          j        |                    z  f||t          j        t          j        |                    z  ffD                       S )NZ   rm   r   c              3  ~   K   | ]8\  }}||d k    rt          j        |          nt          j        |          z   V  9dS )r   N)rs   floorceil)rn   pp_ds      r3   	<genexpr>z9ImageDraw.line.<locals>.coord_at_angle.<locals>.<genexpr>  s[       % % &3 C!GGC3P% % % % % %r5   )rG   rs   cosradianssin)rv   rw   xydistancerO   s        r3   coord_at_anglez&ImageDraw.line.<locals>.coord_at_angle  s      %1#(19q=$ % % "#HtxU8K8K/L/L$L M!"HtxU8K8K/L/L$L M+% % %     r5      rz         )rO   )rv   rc   rw   rM   r   rx   )rJ   r+   
draw_linesrD   listrG   r   r   rM   rangelenpiesliceline)r0   rK   r/   rO   rh   r-   pointsro   pointanglesr   flippedcoordsrL   rN   
gap_coordss    ` `            r3   r   zImageDraw.line   s7    ll4  #?I  S%000EAIIbedE]33 !(8E?";R@@FF   !&q#b''1!5!5  F q#f++/22 7= 7=A"1IE  $AE]E2"F1q5M2+  F ayF1I--       q	F1I-M&)c/F1I2MQ )fQi/OF1IOfQi4O  qEAI-158eai3G!3KLqEAI-158eai3G!3KLF  F&,Qi"nfQi"ns&,Qi"nfQi"nsMM&%"*cBhEEEqyy"  .ufQi"n E E % .ufQi"n E E*JJ !/ufQi"n E E % .ufQi"n E E*J
 		*d!	<<<E ?II7= 7=r5   shapeImage.core._Outlinec                    |                                  |                     ||          \  }}|| j                            ||d           |$||k    r | j                            ||d           dS dS dS )z(Experimental) Draw a shape.Nr   r   )closerJ   r+   draw_outline)r0   r   r/   rY   r-   r]   s         r3   r   zImageDraw.shape7  s     	Wd33XI""5(A666?shI""5#q11111 ?r5   c                    |                      ||          \  }}|| j                            ||||d           |-||k    r)|dk    r%| j                            ||||d|           dS dS dS dS )zDraw a pieslice.Nr   r   )rJ   r+   draw_pieslicer\   s	            r3   r   zImageDraw.piesliceE  s     Wd33XI##BsHa@@@?sh5A::I##BsCEBBBBB ?::r5   c                t    |                      |          \  }}|| j                            ||           dS dS )z#Draw one or more individual pixels.N)rJ   r+   draw_points)r0   rK   r/   r-   s       r3   r   zImageDraw.pointU  sA    LL&&	T?I!!"c***** ?r5   c                   |                      ||          \  }}|| j                            ||d           |||k    r|dk    r|dk    r| j                            ||d|           dS | j        t	          j        d| j        j                  }|                      d          d         }t          |          }	|	j                            ||d           | j                            ||d|dz  dz
  |j                   dS dS dS dS dS )zDraw a polygon.Nr   r   r$   rm   )rJ   r+   draw_polygonr   r   newsizeDraw)
r0   rK   r/   rY   rO   r-   r]   maskmask_inkr+   s
             r3   polygonzImageDraw.polygon[  s    Wd33XI""2x333?sh5A::zz	&&r3599999$ ydgl33<<??1-Dzz	&&r8Q777	&&r3519q=$'JJJJJ ?:: %$r5   bounding_circle!Sequence[Sequence[float] | float]n_sidesrotationc                X    t          |||          }|                     ||||           dS )zDraw a regular polygon.N)!_compute_regular_polygon_verticesr   )r0   r   r   r   r/   rY   rO   rK   s           r3   regular_polygonzImageDraw.regular_polygons  s3     /RRRw.....r5   c                    |                      ||          \  }}|| j                            ||d           |+||k    r'|dk    r#| j                            ||d|           dS dS dS dS )zDraw a rectangle.Nr   r   )rJ   r+   draw_rectanglera   s          r3   	rectanglezImageDraw.rectangle  s     Wd33XI$$R1555?sh5A::I$$Ra77777 ?::r5   )cornersr   $tuple[bool, bool, bool, bool] | Nonec               $	    t          |d         t          t          f          r5t          t          t          t
                            |          \  \  \  n%t          t          t
                   |          \  k     rd}t          |          k     rd}t          |          d|dz  t                    t                    t                    t                    d\  t                    rBz
  dz
  k    rz
  z
  dz
  k    rz
  rr 	                    |||          S dk    st                    s                     |||          S t          dz            }                     ||          \  d fd}	2 |	d           r- j                            |z   dz   |z
  dz
  fd           n>|z
  dz
  |z   dz   k    r, j                            |z   dz   |z
  dz
  fd           ss|z   g}
d         r|
dxx         |dz   z  cc<   d         r|
dxx         |dz   z  cc<    j                            |
d           |z
  g}d         r|dxx         |dz   z  cc<   d         r|dxx         |dz   z  cc<    j                            |d           k    rdk    r |	d           sz   dz
  g}d         r|dxx         |dz   z  cc<   d         r|dxx         |dz   z  cc<    j                            |d           z
  dz   g}d         r|dxx         |dz   z  cc<   d         r|dxx         |dz   z  cc<    j                            |d           sĉz   dz
  g}
d         r|
dxx         |dz   z  cc<   d         r|
dxx         |dz   z  cc<    j                            |
d           z
  dz   g}d         r|dxx         |dz   z  cc<   d         r|dxx         |dz   z  cc<    j                            |d           dS dS dS dS dS )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)TTTTrm   )FFr   r   boolr   r   c                   rz   z   fddfz
  z   fddff}nrz   z   fddfz
  z   fddff}n`t          fdt          z   z   fddfz
  z   fddfz
  z
  fddfz
  z   fddff          D                       }|D ]-}| r 	j        j        |dfz      	j        j        |
fz     .d S )Nr   rr   r   rz     c              3  2   K   | ]\  }}|         |V  d S rC    )rn   ro   partr   s      r3   r   zDImageDraw.rounded_rectangle.<locals>.draw_corners.<locals>.<genexpr>  sG        4 qz     r5   r   )rG   	enumerater+   r   rR   )r   partsr   r   dr]   full_xfull_yr-   r0   rO   x0x1y0y1s      r3   draw_cornersz1ImageDraw.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?	$ $      ? ? ?+DI+dh].BDDD&DI&e)<>>>	? ?r5   Tr   F)r   r   r   r   )rD   r   rG   r   r   rM   r'   roundallrb   anyr   rP   rJ   r+   r   )r0   rK   rd   r/   rY   rO   r   r2   rr   leftrighttopbottomr   r]   r   r   r-   r   r   r   r   s   `    ``       @@@@@@@@@r3   rounded_rectanglezImageDraw.rounded_rectangle  s    bedE]++ 	7!%hx&?!D!DHRhr22!(5/266NBB77:CS//!77:CS//!?.GQJ2YY2YY2YY2YY%w<< 	>"r'A+%F G"r'A+%F G >& >||Bgu===66W6 >>"dGU;;;QKKWd33X 	?  	?  	?  	?  	?  	?  	?  	?  	?  	?  	?  	?  	?  	?  	?  	?  	?D L X	(("b1fqj"b1fqj)I8UVWWWWa!b1fqj((	(("q&1*b"q&1*b)I8UVWWW =& =BQ+1: %GGGq1u$GGG1: %GGGq1u$GGG	((x;;;aR,1: &!HHHA%HHH1: &!HHHA%HHH	((!<<<?sh5A::L 92r2:>21: $FFFa!eOFFF1: $FFFa!eOFFF	((c1555b5j1nb"51: '1IIIQ&III1: '1IIIQ&III	((a888 8BU
Q31: %GGGq1u$GGG1: %GGGq1u$GGG	((sA666eaR41: &!HHHA%HHH1: &!HHHA%HHH	((Q77777= ?::"8 8r5   rk   r   Ftuple[float, float]textAnyStr | ImageText.TextanchorspacingalignrE   	directionfeatureslist[str] | Nonelanguagestroke_widthstroke_fillembedded_colorr   argsr   kwargsc                p   	
 t          |t          j                  r|nw|(                                         d                    }t          j        || j        |	
          r                                 |r                    ||           d fd} ||          }|dS d}j        rj	         |j	                  n|}
                    |          D ]G\  dd	
 fd}|# ||j                   ||k    r ||           < ||           HdS )z
Draw text.Nr<   r/   r@   r   rP   c                H                         |           \  }}||J |S |S rC   )rJ   )r/   r-   r]   r0   s      r3   getinkzImageDraw.text.<locals>.getink?  s3     LL..MC{+++Jr5   r   r-   r   rM   r   c                   j         }|dk    rrd}g }t          d          D ]*}|                    t          |                              +t	          j        d                   d         t	          j        d                   d         f}	  j        j        |gR |d| |d\  }}|d         |d         z   |d         |d         z   g}n[# t          $ rN 	  j        j	        ||| gR d|i}n*# t          $ r j        	                              }Y nw xY wY nw xY w|dk    r||                    d          }}t          j        d	|           d         }	|                    d|	           |\  }
}j        >j                            ||
||
|j        d         z   ||j        d         z   f|           d S d S j                            |||            d S )
Nr   r   rm   r   T)r   r   r   r   stroke_filledr   r-   rL   rL   r   ro   )r.   r   appendrP   rs   modfr   getmask2AttributeErrorgetmask	TypeErrorgetbandstructpackfillbandr   paster   r+   rX   )r-   r   r   rv   ro   rL   r   offsetcolor	ink_alphar   r   r   r   r   r   r   
image_textr   r   r   r0   rK   s               r3   	draw_textz!ImageDraw.text.<locals>.draw_textT  s   }1$$$!Dq - -ALLRU,,,,2a5))!,di1.>.>q.AB =#;:?#;$ $ $ #,!)!)%1&*%#$ $ !$ $LD& #1Xq	158fQi3GHEE% = = ==6z6  %$$("  "      #(  %    % = = =)66t<<==" 6>> #'Q4E &C 5 5a 8INN1i000 DAqw*!Aq!dil*:A	!<L#Mt     +*
 I))%s;;;;;s7   AC 
D.!D D.$D(%D.'D((D.-D.)r/   r@   r   rP   )r   )r-   rP   r   rM   r   r   )rD   r	   Textr?   getr   embed_colorstroker   r   _split)r0   rK   r   r/   r   r   r   r   r   r   r   r   r   r   r   r   r   r-   
stroke_inkr   r   r   s   ``   `  ```  ```    @@r3   r   zImageDraw.text  s   0 dIN++ 	=JJ|}}VZZ%<%<=="dDIw	8X J  )&&((( =!!,<<<	 	 	 	 	 	 fTll;F
" 	 )5 z-...  !+ 1 1"fe D D C	 C	B6< 6< 6< 6< 6< 6< 6< 6< 6< 6< 6< 6< 6< 6< 6< 6< 6<p %	*j&=>>> *$$IcNNN 	#GC	 C	r5   r<   r   c               H    |                      |||||||||	|
||||          S Nr   )r   )r0   rK   r   r/   r   r   r   r   r   r   r   r   r   r   r<   s                  r3   multiline_textzImageDraw.multiline_text  sI    . yy  
 
 	
r5   c                   ||                      |          }t          j        ||| j        |||          }|r|                                 |                                S )z@Get the length of a given string, in pixels with 1/64 precision.N)r   r   r   )r?   r	   r   r   r   
get_length)	r0   r   r   r   r   r   r   r<   r   s	            r3   
textlengthzImageDraw.textlength  sr    " <==++D^I
 
 

  	%""$$$$$&&&r5   !tuple[float, float, float, float]c          	         ||                      |          }t          j        ||| j        ||||	          }|r|                                 |
r|                    |
           |                    |||          S )z2Get the bounding box of a given string, in pixels.)r?   r	   r   r   r   r   get_bbox)r0   rK   r   r   r   r   r   r   r   r   r   r   r<   r   s                 r3   textbboxzImageDraw.textbbox  s    , <==++D^$	7Ix
 

  	%""$$$ 	,l+++""2vu555r5   c               D    |                      |||||||||	|
||          S r   )r  )r0   rK   r   r   r   r   r   r   r   r   r   r   r<   s                r3   multiline_textbboxzImageDraw.multiline_textbbox  sC    * }}  
 
 	
r5   rC   )r   r   r   r   r   r   )r   r6   )r<   r=   r   r6   )r-   r@   r/   r@   r   rA   )Nr   )rK   r   rL   rM   rN   rM   r/   r@   rO   rP   r   r   )rK   rT   rU   r   r/   r@   r   r   )NNr   )rK   r   rL   rM   rN   rM   r/   r@   rY   r@   rO   rP   r   r   )
rK   r   r/   r@   rY   r@   rO   rP   r   r   )rK   rc   rd   rM   r/   r@   rY   r@   rO   rP   r   r   )Nr   N)
rK   r   r/   r@   rO   rP   rh   r   r   r   )NN)r   r   r/   r@   rY   r@   r   r   )rK   r   r/   r@   r   r   )r   NNr   )r   r   r   rP   r   rM   r/   r@   rY   r@   rO   rP   r   r   )rK   r   rd   rM   r/   r@   rY   r@   rO   rP   r   r   r   r   )NNNrk   r   NNNr   NF) rK   r   r   r   r/   r@   r   r   r   r   r   rM   r   rE   r   r   r   r   r   r   r   rM   r   r@   r   r   r   r   r   r   r   r   )rK   r   r   r   r/   r@   r   r   r   r   r   rM   r   rE   r   r   r   r   r   r   r   rM   r   r@   r   r   r<   r=   r   r   )NNNNF)r   r   r   r   r   r   r   r   r   r   r   r   r<   r=   r   rM   )	NNrk   r   NNNr   F)rK   r   r   r   r   r   r   r   r   rM   r   rE   r   r   r   r   r   r   r   rM   r   r   r<   r=   r   r   )__name__
__module____qualname__r   __annotations__r4   r;   r?   rJ   rS   rU   r^   rb   rg   r   r   r   r   r   r   r   r   r   r   r   r  r  r   r5   r3   r   r   =   s         	 	    & & & & &P   6" " " " 59' ' ' ' '< !; ; ; ; ; KO	6 	6 	6 	6 	6  !#@ @ @ @ @& !#6 6 6 6 6$ !#
7 
7 
7 
7 
7 ! K= K= K= K= K=` !#	2 2 2 2 2& !#C C C C C + + + + + !#K K K K K8  #/ / / / /  !#8 8 8 8 8"  #J8 9=J8 J8 J8 J8 J8 J8` ! ! $%)##'$'{ { { { {B ! ! $%)##'$'&
* #'+&
 &
 &
 &
 &
 &
`  $%)#$' #'' ' ' ' ' 'P ! $%)#$#6& #''6 6 6 6 6 6T ! $%)#$#"
& #''"
 "
 "
 "
 "
 "
 "
 "
r5   r   r   r   r   r   r   c                v    	  t          | d          |          S # t          $ r t          | |          cY S w xY w)a  
    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)getattrr   r   )r   r   s     r3   r   r   $  sR    #%wr9%%d+++ # # #T"""""#s    88Image.Image | None)tuple[ImageDraw2.Draw | None, ModuleType]c                >    ddl m} |  |j        |           nd}||fS )zm
    :param im: The image to draw in.
    :returns: A (drawing context, drawing resource factory) tuple.
    r   )r   N)r9   r   r   )r   r   r+   s      r3   r
  r
  5  s;    
 "$.?:?2dDr5   imagerK   tuple[int, int]valuefloat | tuple[int, ...]borderfloat | tuple[int, ...] | NonethreshrM   r   c                z   |                                  }|J |\  }}	 |||f         }t          ||          |k    rdS ||||f<   n# t          t          f$ r Y dS w xY w||fh}	t	                      }
|	rt	                      }|	D ]\  }}|dz   |f|dz
  |f||dz   f||dz
  ffD ]\  }}||f|
v s|dk     s|dk     r	 |||f         }|
                    ||f           |t          ||          |k    }n|||fv}|r||||f<   |                    ||f           x# t          t          f$ r Y w xY w|	}
|}	|	dS dS )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   )rW   _color_diffr'   
IndexErrorsetadd)r  rK   r  r  r  pixelr   r   
backgroundedge	full_edgenew_edgestr~   r/   s                   r3   	floodfillr"  @  s   6 JJLLEDAq1a4[
uj))V33Fad
#   F8D I
 55 	- 	-DAqa%a!eQZ!QUaQZH - -1q6Y&&!a%%1q55-adA MM1a&)))~*1j99VC 7 -&+ad aV,,, #J/   D-" 	+      s(   A A AA<
DD/.D/r   r   r   rP   r   list[tuple[float, float]]c                  	 t          |t                    sd}t          |          |dk     rd}t          |          t          | t          t
          f          sd}t          |          t          |           dk    r\t          d | D                       sd}t          |          t          t          t                   t	          |                     ^ 	nt          |           dk    rt          | d         t          t
          f          rt          d	 | d         D                       r"t          | d
         t          t          f          sd}t          |          t          | d                   dk    rd}t          |          t          t          t                   t	          | d                             t          t          | d
                   	nd}t          |          	dk    rd}t          |          t          |t          t          f          sd}t          |          dfdd	fddd} |||          }fd|D             S ) 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   K   | ] }t          |t          t          f          V  !d S rC   rD   rP   rM   rn   ro   s     r3   r   z4_compute_regular_polygon_vertices.<locals>.<genexpr>  s0      HH1:a#u..HHHHHHr5   z0bounding_circle should only contain numeric datarm   r   c              3  N   K   | ] }t          |t          t          f          V  !d S rC   r&  r'  s     r3   r   z4_compute_regular_polygon_vertices.<locals>.<genexpr>  sA       
 
,-Jq3,''
 
 
 
 
 
r5   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 floatr   list[float]rt   rM   r   r   c                   t          | d         t          j        t          j        d|z
                      z  | d         t          j        t          j        d|z
                      z  z
  d         z   d          t          | d         t          j        t          j        d|z
                      z  | d         t          j        t          j        d|z
                      z  z   d         z   d          fS )Nr   rr   r   rm   )r   rs   r   r   r   )r   rt   centroids     r3   _apply_rotationz:_compute_regular_polygon_vertices.<locals>._apply_rotation  s    a48DLw$?$?@@@(TXdl3=&A&ABBBC1+ 	  a48DLw$?$?@@@(TXdl3=&A&ABBBC1+ 	 
 	
r5   rw   c                $    dg} ||           S Nr   r   )rw   start_pointr,  polygon_radiuss     r3   _compute_polygon_vertexzB_compute_regular_polygon_vertices.<locals>._compute_polygon_vertex  s    %q){E222r5   r   rP   r   c                    g }d| z  }dd|z  z
  |z   }t          |           D ]'}|                    |           ||z  }|dk    r|dz  }(|S )Nrr   r   g      ?)r   r   )r   r   r   rt   current_angle_s         r3   _get_anglesz6_compute_regular_polygon_vertices.<locals>._get_angles  so    -sW},8w 	% 	%AMM-(((W$Ms""$r5   c                &    g | ]} |          S r   r   )rn   rw   r1  s     r3   rp   z5_compute_regular_polygon_vertices.<locals>.<listcomp>   s%    ???u##E**???r5   )r   r)  rt   rM   r   r   )rw   rM   r   r   )r   rP   r   rM   r   r)  )
rD   rP   r   r'   r   rG   r   r   r   rM   )
r   r   r   r2   r5  r   r,  r1  r+  r0  s
         @@@@r3   r   r     s   V gs## (nn{{,oo oe}55 4nn
?q  HHHHHHH 	"DCS//!$(ed?6K6K$L$L!>>	_			"	"z/!2DtUm'T'T	" 
 
1@1C
 
 
 
 
 	"OA.e==	" ECS//!q!""a''VCS//!UT/!*<%=%=>>e_Q%788< 	 oo4oo he-- 2oo
 
 
 
 
 
 3 3 3 3 3 3 3
 
 
 
 [(++F @???????r5   color1color2c                    t          | t                    r| n| ft          |t                    r|n|ft          fdt          t	                              D                       S )zJ
    Uses 1-norm distance to calculate difference between two values.
    c              3  T   K   | ]"}t          |         |         z
            V  #d S rC   )abs)rn   ro   firstseconds     r3   r   z_color_diff.<locals>.<genexpr>  s8      EEQs58fQi'((EEEEEEr5   )rD   rG   sumr   r   )r7  r8  r<  r=  s     @@r3   r  r    sn     !//>FFfYE!&%00?VVviFEEEEE%F2D2DEEEEEEr5   rC   )r   r   r   r   r   r   )r   r  r   r  r.  )r  r   rK   r  r  r  r  r  r  rM   r   r   )r   r   r   rP   r   rM   r   r#  )r7  r  r8  r  r   rM   )!
__future__r   rs   r   collections.abcr   typingr   r9   r   r   r	   TYPE_CHECKINGr
   typesr   r   r   r   r   _typingr   r   r*   rY   r   r  r   r   r
  r"  r   r  r   r5   r3   <module>rE     s  @ # " " " " " "   $ $ $ $ $ $       * * * * * * * * * * &((((((      """"""""''''''''%%%%%%%% .3Z-? ? ? ? ?d
 d
 d
 d
 d
 d
 d
 d
N# # # # #"     .2> > > > >B@ @ @ @D	F 	F 	F 	F 	F 	Fr5   