
    \bj[                       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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 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	ImageFont	ImageTextF)Callable)
ModuleType)AnyAnyStr
ImageDraw2)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	ImageDrawNImageFont.BaseImageFont | 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        A/home/drrone/.local/lib/python3.11/site-packages/PIL/ImageDraw.py__init__zImageDraw.__init__@   s    	<7D27??v~~"'U"2"2% oo%3;;:DLLDL%JOODGU33		:y))!,,DHHy))"--DH'''DMMDM			    ImageFont.BaseImageFontc                N    | j         st          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	   load_default)r1   s    r4   getfontzImageDraw.getfonth   s&    ( y 	1!.00DIyr6   	font_sizefloat | Nonec                V    |t          j        |          S |                                 S N)r	   r9   r:   )r1   r;   s     r4   _getfontzImageDraw._getfont   s'     ))444<<>>!r6   r.   _Ink | Noner0   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 r>   )r0   r.   
isinstancestrr   getcolorr   r)   tupler*   r,   r-   )r1   r.   r0   
result_inkresult_fills        r4   _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;&&r6   r   xyr   startfloatendwidthintc                    |                      |          \  }}|&|dk    r"| j                            |||||           dS dS dS )zDraw an arc.Nr   )rI   r,   draw_arc)r1   rJ   rK   rM   r0   rN   r.   s          r4   arczImageDraw.arc   sU     LL&&	T?uzzIr5#sE::::: ?zzr6   Sequence[int]bitmapc                    |                                  |                     |          \  }}||}|#| j                            ||j        |           dS dS )zDraw a bitmap.N)loadrI   r,   draw_bitmapr   )r1   rJ   rT   r0   r.   s        r4   rT   zImageDraw.bitmap   s^     	LL&&	T;C?I!!"fi55555 ?r6   outlinec                    |                      ||          \  }}|| j                            ||||d           |-||k    r)|dk    r%| j                            ||||d|           dS dS dS dS )zDraw a chord.Nr   r   )rI   r,   
draw_chord	r1   rJ   rK   rM   r0   rX   rN   r.   fill_inks	            r4   chordzImageDraw.chord   s     Wd33XI  UC1===?sh5A::I  UCa????? ?::r6   c                    |                      ||          \  }}|| j                            ||d           |+||k    r'|dk    r#| j                            ||d|           dS dS dS dS )zDraw an ellipse.Nr   r   )rI   r,   draw_ellipser1   rJ   r0   rX   rN   r.   r\   s          r4   ellipsezImageDraw.ellipse   s     Wd33XI""2x333?sh5A::I""2sAu55555 ?::r6   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)ra   )r1   rJ   rc   r0   rX   rN   
ellipse_xys          r4   circlezImageDraw.circle   sP     efnbefnbefnbefnU
Zw66666r6   jointc                (   |                      |          d         }|idk    rd| j                            |           |dk    rC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 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   rL   rF   ).0irJ   s     r4   
<listcomp>z"ImageDraw.line.<locals>.<listcomp>   sK        Xe_eBq1q5yM.B.BCC  r6   rl   r   c           
         g | ]M\  }}t          j        t          j        |d          |d          z
  |d         |d         z
                      dz  NS )r   r   h  )mathdegreesatan2)rm   rK   rM   s      r4   ro   z"ImageDraw.line.<locals>.<listcomp>   sg        'E3 TZAq0A58cRSfCT%U%UVV  r6   coordrb   anglerL   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   rl   r   c              3  ~   K   | ]8\  }}||d k    rt          j        |          nt          j        |          z   V  9dS )r   N)rr   floorceil)rm   pp_ds      r4   	<genexpr>z9ImageDraw.line.<locals>.coord_at_angle.<locals>.<genexpr>
  s[       % % &3 C!GGC3P% % % % % %r6   )rF   rr   cosradianssin)ru   rv   xydistancerN   s        r4   coord_at_anglez&ImageDraw.line.<locals>.coord_at_angle  s      %1#(19q=$ % % "#HtxU8K8K/L/L$L M!"HtxU8K8K/L/L$L M+% % %     r6      ry         )rN   )ru   rb   rv   rL   r   rw   )rI   r,   
draw_linesrC   listrF   r   r   rL   rangelenpiesliceline)r1   rJ   r0   rN   rg   r.   pointsrn   pointanglesr   flippedcoordsrK   rM   
gap_coordss    ` `            r4   r   zImageDraw.line   sC    ll4  #?uzz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 ?zzII7= 7=r6   shapeImage.core._Outlinec                    |                                  |                     ||          \  }}|| j                            ||d           |$||k    r | j                            ||d           dS dS dS )z(Experimental) Draw a shape.Nr   r   )closerI   r,   draw_outline)r1   r   r0   rX   r.   r\   s         r4   r   zImageDraw.shape/  s     	Wd33XI""5(A666?shI""5#q11111 ?r6   c                    |                      ||          \  }}|| j                            ||||d           |-||k    r)|dk    r%| j                            ||||d|           dS dS dS dS )zDraw a pieslice.Nr   r   )rI   r,   draw_pieslicer[   s	            r4   r   zImageDraw.pieslice=  s     Wd33XI##BsHa@@@?sh5A::I##BsCEBBBBB ?::r6   c                t    |                      |          \  }}|| j                            ||           dS dS )z#Draw one or more individual pixels.N)rI   r,   draw_points)r1   rJ   r0   r.   s       r4   r   zImageDraw.pointM  sA    LL&&	T?I!!"c***** ?r6   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%   rl   )rI   r,   draw_polygonr   r   newsizeDraw)
r1   rJ   r0   rX   rN   r.   r\   maskmask_inkr,   s
             r4   polygonzImageDraw.polygonS  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 ?:: %$r6   r   bounding_circle!Sequence[Sequence[float] | float]n_sidesrotationc                X    t          |||          }|                     ||||           dS )zDraw a regular polygon.N)!_compute_regular_polygon_verticesr   )r1   r   r   r   r0   rX   rN   rJ   s           r4   regular_polygonzImageDraw.regular_polygonk  s3     /RRRw.....r6   c                    |                      ||          \  }}|| j                            ||d           |+||k    r'|dk    r#| j                            ||d|           dS dS dS dS )zDraw a rectangle.Nr   r   )rI   r,   draw_rectangler`   s          r4   	rectanglezImageDraw.rectanglex  s     Wd33XI$$R1555?sh5A::I$$Ra77777 ?::r6   )cornersr   $tuple[bool, bool, bool, bool] | Nonec               N	    t          |d         t          t          f          r5t          t          t          t
                            |          \  \  \  n%t          t          t
                   |          \  k     rd}t          |          k     rd}t          |          dt          z
  z
  |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)TTTTrl   )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   rq   r   ry     c              3  2   K   | ]\  }}|         |V  d S r>    )rm   rn   partr   s      r4   r   zDImageDraw.rounded_rectangle.<locals>.draw_corners.<locals>.<genexpr>  sG        4 qz     r6   r   )rF   	enumerater,   r   rQ   )r   partsr   r   dr\   full_xfull_yr.   r1   rN   x0x1y0y1s      r4   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)<>>>	? ?r6   Tr   F)r   r   r   r   )rC   r   rF   r   r   rL   r(   minroundallra   anyr   rO   rI   r,   r   )r1   rJ   rc   r0   rX   rN   r   r3   rr   leftrighttopbottomr   r\   r   r   r.   r   r   r   r   s   `    ``       @@@@@@@@@r4   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Rb&1*--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!rAvz))	(("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 8r6   rj   r   Ftuple[float, float]textAnyStr | ImageText.Text[AnyStr]anchorspacingalignrD   	directionfeatureslist[str] | Nonelanguagestroke_widthstroke_fillembedded_colorr   argsr   kwargsc                `   	
 t          |t          j                  r|nw|(                                         d                    }t          j        || j        |	
          r                                 |r                    ||           d fd} ||          }|dS d}j        rj	         |j	                  n|}
                    |||          D ]Add	
 f	d}|# ||j                   ||k    r ||           6 ||           BdS )z
Draw text.Nr;   r0   r@   r   rO   c                H                         |           \  }}||J |S |S r>   )rI   )r0   r.   r\   r1   s      r4   getinkzImageDraw.text.<locals>.getink2  s3     LL..MC{+++Jr6   r   r.   r   rL   r   c                  	 j         }|dk    rrd}t          j                  }t          j                  }t	          j        j                  d         t	          j        j                  d         f}t          j        t          j	                  rD j        j
        j        ||j        | |g	
R ddi\  }}||d         z  }||d         z  }nZ	  j        j        j        ||j        | g
R d|i}n/# t          $ r" j                            j                  }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                            ||f||            d S )	Nr   r   stroke_filledTr   rK   r   rn   )r/   rO   r   r   rr   modfrC   r   r	   FreeTypeFontgetmask2r   r   getmask	TypeErrorgetbandstructpackfillbandr   paster   r,   rW   )r.   r   r   r   r   rK   r   offsetcolor	ink_alphar   r   r   r   
image_textr   r   r   r1   s             r4   	draw_textz!ImageDraw.text.<locals>.draw_textG  s`   }1$$$!DKKKK46**1-ty/@/@/CDjoy/EFF !B#;:?#;	!  $$ $ $ $ '+$ !$ $LD& NANAAB6z6 I %$$( K  "      #(  %    % B B B)66tyAAB6>> #'Q4E &C 5 5a 8INN1i000w*!Aq!dil*:A	!<L#Mt     +*
 I))1a&$<<<<<s   )D )D32D3)r0   r@   r   rO   )r   )r.   rO   r   rL   r   r   )rC   r
   Textr?   getr   embed_colorstroker   r   _split)r1   rJ   r   r0   r   r   r   r   r   r   r   r   r   r   r   r   r   r.   
stroke_inkr   r   r   s   `       ```  ```    @@r4   r   zImageDraw.text  s   & dIN++ 	=JJ|}}VZZ%<%<=="dDIw	8X J  )&&((( =!!,<<<	 	 	 	 	 	 fTll;F
" 	 )5 z-...  %%b&%88 B	 B	D5= 5= 5= 5= 5= 5= 5= 5= 5= 5= 5= 5= 5= 5= 5=n %	*j&=>>> *$$IcNNN 	#EB	 B	r6   r;   r   c               H    |                      |||||||||	|
||||          S Nr   )r   )r1   rJ   r   r0   r   r   r   r   r   r   r   r   r   r   r;   s                  r4   multiline_textzImageDraw.multiline_text  sI    $ yy  
 
 	
r6   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)	r1   r   r   r   r   r   r   r;   r   s	            r4   
textlengthzImageDraw.textlength  sr     <==++D^I
 
 

  	%""$$$$$&&&r6   !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)r1   rJ   r   r   r   r   r   r   r   r   r   r   r;   r   s                 r4   textbboxzImageDraw.textbbox  s    " <==++D^$	7Ix
 

  	%""$$$ 	,l+++""2vu555r6   c               D    |                      |||||||||	|
||          S r   )r  )r1   rJ   r   r   r   r   r   r   r   r   r   r   r;   s                r4   multiline_textbboxzImageDraw.multiline_textbbox  sC      }}  
 
 	
r6   r>   )r   r   r   r   r   r   )r   r7   )r;   r<   r   r7   )r.   r@   r0   r@   r   rA   )Nr   )rJ   r   rK   rL   rM   rL   r0   r@   rN   rO   r   r   )rJ   rS   rT   r   r0   r@   r   r   )NNr   )rJ   r   rK   rL   rM   rL   r0   r@   rX   r@   rN   rO   r   r   )
rJ   r   r0   r@   rX   r@   rN   rO   r   r   )rJ   rb   rc   rL   r0   r@   rX   r@   rN   rO   r   r   )Nr   N)
rJ   r   r0   r@   rN   rO   rg   r   r   r   )NN)r   r   r0   r@   rX   r@   r   r   )rJ   r   r0   r@   r   r   )r   NNr   )r   r   r   rO   r   rL   r0   r@   rX   r@   rN   rO   r   r   )rJ   r   rc   rL   r0   r@   rX   r@   rN   rO   r   r   r   r   )NNNrj   r   NNNr   NF) rJ   r   r   r   r0   r@   r   r   r   r   r   rL   r   rD   r   r   r   r   r   r   r   rL   r   r@   r   r   r   r   r   r   r   r   )rJ   r   r   r   r0   r@   r   r   r   r   r   rL   r   rD   r   r   r   r   r   r   r   rL   r   r@   r   r   r;   r<   r   r   )NNNNF)r   r   r   r   r   r   r   r   r   r   r   r   r;   r<   r   rL   )	NNrj   r   NNNr   F)rJ   r   r   r   r   r   r   r   r   rL   r   rD   r   r   r   r   r   r   r   rL   r   r   r;   r<   r   r   )__name__
__module____qualname__r   __annotations__r5   r:   r?   rI   rR   rT   r]   ra   rf   r   r   r   r   r   r   r   r   r   r   r   r  r  r   r6   r4   r   r   =   s        +/D////& & & & &P   2" " " " 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` !/3! $%)##'$u u u u uv !/3! $%)##'$!
  #'!!
 !
 !
 !
 !
 !
L 04 $%)#$' #'' ' ' ' ' '< 04! $%)#$6 #'6 6 6 6 6 6@ 04! $%)#$
 #'
 
 
 
 
 
 
 
r6   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)getattrAttributeErrorr   )r   r   s     r4   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) r   r   )r   r   r,   s      r4   r	  r	    s;    
 "$.?:?2dDr6   imagerJ   tuple[int, int]valuefloat | tuple[int, ...]borderfloat | tuple[int, ...] | NonethreshrL   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   )rV   _color_diffr(   
IndexErrorsetadd)r  rJ   r  r  r  pixelr   r   
backgroundedge	full_edgenew_edgestr}   r0   s                   r4   	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   rO   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 r>   rC   rO   rL   rm   rn   s     r4   r   z4_compute_regular_polygon_vertices.<locals>.<genexpr>  s0      HH1:a#u..HHHHHHr6   z0bounding_circle should only contain numeric datarl   r   c              3  N   K   | ] }t          |t          t          f          V  !d S r>   r'  r(  s     r4   r   z4_compute_regular_polygon_vertices.<locals>.<genexpr>  sA       
 
,-Jq3,''
 
 
 
 
 
r6   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]rs   rL   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   rq   r   rl   )r   rr   r   r   r   )r   rs   centroids     r4   _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+ 	 
 	
r6   rv   c                $    dg} ||           S Nr   r   )rv   start_pointr-  polygon_radiuss     r4   _compute_polygon_vertexzB_compute_regular_polygon_vertices.<locals>._compute_polygon_vertex  s    %q){E222r6   r   rO   r   c                    g }d| z  }dd|z  z
  |z   }t          |           D ]'}|                    |           ||z  }|dk    r|dz  }(|S )Nrq   r   g      ?)r   append)r   r   r   rs   current_angle_s         r4   _get_anglesz6_compute_regular_polygon_vertices.<locals>._get_angles  so    -sW},8w 	% 	%AMM-(((W$Ms""$r6   c                &    g | ]} |          S r   r   )rm   rv   r2  s     r4   ro   z5_compute_regular_polygon_vertices.<locals>.<listcomp>  s%    ???u##E**???r6   )r   r*  rs   rL   r   r   )rv   rL   r   r   )r   rO   r   rL   r   r*  )
rC   rO   r   r(   r   rF   r   r   r   rL   )
r   r   r   r3   r7  r   r-  r2  r,  r1  s
         @@@@r4   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 @???????r6   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 r>   )abs)rm   rn   firstseconds     r4   r   z_color_diff.<locals>.<genexpr>  s8      EEQs58fQi'((EEEEEEr6   )rC   rF   sumr   r   )r9  r:  r>  r?  s     @@r4   r  r    sn     !//>FFfYE!&%00?VVviFEEEEE%F2D2DEEEEEEr6   r>   )r   r   r   r   r   r   )r   r  r   r  r/  )r  r   rJ   r  r  r  r  r  r  rL   r   r   )r   r   r   rO   r   rL   r   r$  )r9  r  r:  r  r   rL   )!
__future__r   rr   r   collections.abcr   typingr   r  r   r   r	   r
   TYPE_CHECKINGr   typesr   r   r   r   _typingr   r   r+   rX   r   r  r   r   r	  r#  r   r  r   r6   r4   <module>rG     s  @ # " " " " " "   $ $ $ $ $ $       5 5 5 5 5 5 5 5 5 5 5 5 &((((((      """"""""%%%%%%%% .3Z-? ? ? ? ?B
 B
 B
 B
 B
 B
 B
 B
J# # # # #"     .2> > > > >B@ @ @ @D	F 	F 	F 	F 	F 	Fr6   