
    ZMh                    0   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mZ ddlmZmZ ddlmZ dd	lmZ ej        j        Zd
ed<   dZerddlmZmZ eeeedf         ef         Z 	  G d d          Z!d1d2dZ"	 d3d4dZ#	 	 d5d6d&Z$d7d-Z%d8d0Z&dS )9    )annotationsN)Sequence)
ModuleType)AnyAnyStrCallableUnioncast   )Image
ImageColor)	deprecate)Coordsz!Callable[[], Image.core._Outline]OutlineF)
ImageDraw2	ImageFont.c                     e Zd ZU dZded<   dYdZd
Zd[dZd\dZ	 dYd]dZ	 	 d^d_dZ		 dYd`d Z
	 	 	 dadbd"Z	 	 	 dadcd#Z	 	 	 daddd&Z	 	 	 dedfd)Z	 	 dgdhd,Z	 	 	 dadbd-ZdYdid.Z	 	 	 dadcd/Z	 	 	 	 djdkd4Z	 	 	 dadcd5Z	 	 	 	 djdd6dld9Zdmd=Z	 	 	 	 	 	 	 	 	 	 	 dndodPZdpdRZ	 	 	 	 	 	 	 	 	 	 	 dnddSdqdTZ	 	 	 	 	 drddSdsdUZ	 	 	 	 	 	 	 	 	 dtddSdudWZ	 	 	 	 	 	 	 	 	 dtddSdudXZdS )v	ImageDrawNNImageFont.ImageFont | ImageFont.FreeTypeFont | ImageFont.TransposedFont | NonefontimImage.Imagemode
str | NonereturnNonec                P   |                                  |j        r|                                 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)loadreadonly_copyr   
ValueErrorpalette_imager   r   coredrawdraw_inkinkfontmodefill)selfr   r   blendmsgs        M/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/PIL/ImageDraw.py__init__zImageDraw.__init__B   s    				; 	HHJJJ<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)r2   r   s     r5   getfontzImageDraw.getfontl   s:    ( y 	1######.	.00DIyr7   	font_sizefloat | Nonec                Z    |ddl m}  |j        |          S |                                 S )Nr   r:   )r;   r   r<   r=   )r2   r>   r   s      r5   _getfontzImageDraw._getfont   s=      ######)9))444<<>>!r7   r/   _Ink | Noner1   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)r1   r/   
isinstancestrr   getcolorr   r*   tupler+   r-   r.   )r2   r/   r1   
result_inkresult_fills        r5   _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;&&r7   r   xyr   startfloatendwidthintc                z    |                      |          \  }}| | j                            |||||           dS dS )zDraw an arc.N)rL   r-   draw_arc)r2   rM   rN   rP   r1   rQ   r/   s          r5   arczImageDraw.arc   sI     LL&&	T?Ir5#sE::::: ?r7   Sequence[int]bitmapc                    |                                  |                     |          \  }}||}|#| j                            ||j        |           dS dS )zDraw a bitmap.N)r&   rL   r-   draw_bitmapr   )r2   rM   rW   r1   r/   s        r5   rW   zImageDraw.bitmap   s^     	LL&&	T;C?I!!"fi55555 ?r7   outlinec                    |                      ||          \  }}|| j                            ||||d           |-||k    r)|dk    r%| j                            ||||d|           dS dS dS dS )zDraw a chord.Nr   r   )rL   r-   
draw_chord	r2   rM   rN   rP   r1   rZ   rQ   r/   fill_inks	            r5   chordzImageDraw.chord   s     Wd33XI  UC1===?sh5A::I  UCa????? ?::r7   c                    |                      ||          \  }}|| j                            ||d           |+||k    r'|dk    r#| j                            ||d|           dS dS dS dS )zDraw an ellipse.Nr   r   )rL   r-   draw_ellipser2   rM   r1   rZ   rQ   r/   r^   s          r5   ellipsezImageDraw.ellipse   s     Wd33XI""2x333?sh5A::I""2sAu55555 ?::r7   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)rc   )r2   rM   re   r1   rZ   rQ   
ellipse_xys          r5   circlezImageDraw.circle   sP     efnbefnbefnbefnU
Zw66666r7   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   rO   rI   ).0irM   s     r5   
<listcomp>z"ImageDraw.line.<locals>.<listcomp>   sK        Xe_eBq1q5yM.B.BCC  r7   rn   r   c           
         g | ]M\  }}t          j        t          j        |d          |d          z
  |d         |d         z
                      dz  NS )r   r   h  )mathdegreesatan2)ro   rN   rP   s      r5   rq   z"ImageDraw.line.<locals>.<listcomp>  sg        'E3 TZAq0A58cRSfCT%U%UVV  r7   coordrd   anglerO   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   rn   r   c              3  ~   K   | ]8\  }}||d k    rt          j        |          nt          j        |          z   V  9dS )r   N)rt   floorceil)ro   pp_ds      r5   	<genexpr>z9ImageDraw.line.<locals>.coord_at_angle.<locals>.<genexpr>  s[       % % &3 C!GGC3P% % % % % %r7   )rI   rt   cosradianssin)rw   rx   xydistancerQ   s        r5   coord_at_anglez&ImageDraw.line.<locals>.coord_at_angle  s      %1#(19q=$ % % "#HtxU8K8K/L/L$L M!"HtxU8K8K/L/L$L M+% % %     r7      r{         )rQ   )rw   rd   rx   rO   r   ry   )rL   r-   
draw_linesrF   listrI   r
   r   rO   rangelenpiesliceline)r2   rM   r1   rQ   ri   r/   pointsrp   pointanglesr   flippedcoordsrN   rP   
gap_coordss    ` `            r5   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=r7   shapeImage.core._Outlinec                    |                                  |                     ||          \  }}|| j                            ||d           |$||k    r | j                            ||d           dS dS dS )z(Experimental) Draw a shape.Nr   r   )closerL   r-   draw_outline)r2   r   r1   rZ   r/   r^   s         r5   r   zImageDraw.shape9  s     	Wd33XI""5(A666?shI""5#q11111 ?r7   c                    |                      ||          \  }}|| j                            ||||d           |-||k    r)|dk    r%| j                            ||||d|           dS dS dS dS )zDraw a pieslice.Nr   r   )rL   r-   draw_pieslicer]   s	            r5   r   zImageDraw.piesliceG  s     Wd33XI##BsHa@@@?sh5A::I##BsCEBBBBB ?::r7   c                t    |                      |          \  }}|| j                            ||           dS dS )z#Draw one or more individual pixels.N)rL   r-   draw_points)r2   rM   r1   r/   s       r5   r   zImageDraw.pointW  sA    LL&&	T?I!!"c***** ?r7   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           |                                }t          |          }
|dz  dz
  }|
j                            ||d|           |	                    ||	           t	          j        | j
        | j        j                  }t          |          }
|
j                            ||d|           | j        	                    |j        d|j        z   |j                   dS dS dS dS dS )zDraw a polygon.Nr   r   r$   rn   )maskr   r   )rL   r-   draw_polygonr   r   newsizecopyDrawpaster   )r2   rM   r1   rZ   rQ   r/   r^   r   mask_inkfill_imr-   ink_imr   s                r5   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-))++G}}	&&r8Q777F||	A	&&r8Q>>>

6
000Yty$',77Bxx	&&r35999beVbg%5tw?????/ ?:: %$r7   bounding_circle!Sequence[Sequence[float] | float]n_sidesrotationc                X    t          |||          }|                     ||||           dS )zDraw a regular polygon.N)!_compute_regular_polygon_verticesr   )r2   r   r   r   r1   rZ   rQ   rM   s           r5   regular_polygonzImageDraw.regular_polygon  s3     /RRRw.....r7   c                    |                      ||          \  }}|| j                            ||d           |+||k    r'|dk    r#| j                            ||d|           dS dS dS dS )zDraw a rectangle.Nr   r   )rL   r-   draw_rectanglerb   s          r5   	rectanglezImageDraw.rectangle  s     Wd33XI$$R1555?sh5A::I$$Ra77777 ?::r7   )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)TTTTrn   )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   rs   r   r{     c              3  2   K   | ]\  }}|         |V  d S rE    )ro   rp   partr   s      r5   r   zDImageDraw.rounded_rectangle.<locals>.draw_corners.<locals>.<genexpr>  sG        4 qz     r7   r   )rI   	enumerater-   r   rT   )r   partsr   r   dr^   full_xfull_yr/   r2   rQ   x0x1y0y1s      r5   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)<>>>	? ?r7   Tr   F)r   r   r   r   )rF   r   rI   r
   r   rO   r)   roundallrc   anyr   rR   rL   r-   r   )r2   rM   re   r1   rZ   rQ   r   r4   rr   leftrighttopbottomr   r^   r   r   r/   r   r   r   r   s   `    ``       @@@@@@@@@r5   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 8r7   textr   r   c                <    t          |t                    rdnd}||v S )N
   
)rF   rG   )r2   r   split_characters      r5   _multiline_checkzImageDraw._multiline_check(  s%    ",T3"7"7B$$U$&&r7   rl   r   Ftuple[float, float]anchorspacingalignrG   	directionfeatureslist[str] | Nonelanguagestroke_widthstroke_fillembedded_colorargsr   kwargsc                   	
 r j         dvrd}t          |          (                                         d                                                   r!                     |||	
||          S d fd	}dd	
 fd} ||          }|Cd}|r| ||          n|}|! |||           ||k    r ||           dS dS  ||           dS dS )z
Draw text.r   r   3Embedded color supported only in RGB and RGBA modesNr>   r1   rB   r   rR   c                H                         |           \  }}||J |S |S rE   )rL   )r1   r/   r^   r2   s      r5   getinkzImageDraw.text.<locals>.getink]  s3     LL..MC{+++Jr7   r   r/   r   rO   r   c                   j         }|dk    rrd}g }t          d          D ]*}|                    t          |                              +t	          j        d                   d         t	          j        d                   d         f}	  j        |gR |d| |d\  }}|d         |d         z   |d         |d         z   g}nQ# t          $ rD 	  j        ||| gR d|i}n%# t          $ r                               }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   rn   r   T)r   r   r   r   stroke_filledr   r/   rN   rN   r   rp   )r0   r   appendrR   rt   modfgetmask2AttributeErrorgetmask	TypeErrorgetbandstructpackfillbandr   r   r   r-   rY   )r/   r   r   rw   rp   rN   r   offsetcolor	ink_alphar   r   r   r   r   r   r   r   r   r   r2   r   rM   s               r5   	draw_textz!ImageDraw.text.<locals>.draw_textd  s   =Dq  ^ E1XX ) )SAZZ((((Yr!u%%a($)BqE*:*:1*=>E .,t}      (%%!-"&!       f qF1I-uQx&)/CD! . . ..'4<!  $    $ ! DD ! . . .<<--DDD.." v~~ #DLLOOt"KS11!4	q),,,17&GMM1a$)A,&6DIaL8HI4     '&
 	%%eT377777s7   A C 
DC76D7DDDDD)r1   rB   r   rR   )r   )r/   rR   r   rO   r   r   )r   r)   rA   getr   multiline_text)r2   rM   r   r1   r   r   r   r   r   r   r   r   r   r   r   r   r4   r   r   r/   
stroke_inks   ``` ``  ```  ```     r5   r   zImageDraw.text-  s   0  	"di>>GCS//!<==K!8!899D  && 	&&   	 	 	 	 	 	5	8 5	8 5	8 5	8 5	8 5	8 5	8 5	8 5	8 5	8 5	8 5	8 5	8 5	8 5	8 5	8 5	8n fTll?J U4?4KVVK000QT
%	*l333 *$$IcNNNNN %$ 	# ?r7   }tuple[ImageFont.ImageFont | ImageFont.FreeTypeFont | ImageFont.TransposedFont, str, list[tuple[tuple[float, float], AnyStr]]]c           	     t   	 dk    rd}t          |          |d}n?t          |          dk    rd}t          |          |d         dv rd}t          |                               |          g }d	}|                    t	          |t
                    rd
nd          }                     dd|
          d         |
z   |z   }|D ]B}                     |	          }|                    |           t          ||          }C|d         }|d         dk    r|t          |          dz
  |z  dz  z  }n$|d         dk    r|t          |          dz
  |z  z  }g }t          |          D ];\  }}|d	         }|||         z
  }|d	         dk    r	||dz  z  }n|d	         dk    r||z  }|dv rn,|dk    r	||dz  z  }n|dk    r||z  }nd}t          |          |dk    r|d	k    r|                    t	          |t
                    rdnd          }	 fd|D             }|t          |          z
  }t          |          D ]?\  }}|                    ||f|f           |||         |t          |          dz
  z  z   z  }@n|                    ||f|f           ||z  }=||fS )Nttbz/ttb direction is unsupported for multiline textlarn   z#anchor must be a 2 character stringr   tbz'anchor not supported for multiline textr   r   r   r   A)r   r   r   r   r   r   mg       @r   r   )r   justifycenterr   z4align must be "left", "center", "right" or "justify"r       c           
     F    g | ]}                     |           S )r  )
textlength)ro   wordr   r   r   r   r   r2   s     r5   rq   z5ImageDraw._prepare_multiline_text.<locals>.<listcomp>  sP     
 
 
  OO"+!)!)'5 $  
 
 
r7   )r)   r   rA   splitrF   rG   textbboxr  r   maxr   sum)r2   rM   r   r   r   r   r   r   r   r   r   r   r>   r4   widths	max_widthlinesline_spacingr   
line_widthr   r   idxr   width_differencewordsword_widthsrp   r  s   `  `   ``` `                 r5   _prepare_multiline_textz!ImageDraw._prepare_multiline_text  s   0 CCS//!>FF[[A7CS//!AY$;CS//!<==++D	

:dC#8#8C44eDDMM&#t,MGGJ 	  
	3 
	3D#!!- )  J MM*%%%Iz22IIe!9CJJNl2S88CCAY#CJJNl22C"5)) )	  )	 ICa5D(6#;6 ayC(3..c!!(( +++(""(3..'!!((L oo%	!!&6!&;&;

*T3*?*?#I33TJJ
 
 
 
 
 
 
 
 
 !&
 
 
 $-s;/?/?#? (// Q QGAtLL4+t!4555KN-=Ua-PPPDDQ tSk40111<CCVU""r7   )r>   c                   |                      ||||||||	|
|||          \  }}}|D ]%\  }}|                     |||||||	|
|||           &d S )N)r   r   r   r   r   r   )r  r   )r2   rM   r   r1   r   r   r   r   r   r   r   r   r   r   r>   r  r   s                    r5   r   zImageDraw.multiline_text  s    . #::
 
fe  	 	HBII#!!)'-     	 	r7   c                   |                      |          rd}t          |          |r| j        dvrd}t          |          ||                     |          }|rdn| j        }	|                    ||	|||          S )z@Get the length of a given string, in pixels with 1/64 precision.z&can't measure length of multiline textr   r   Nr   )r   r)   r   rA   r0   	getlength)
r2   r   r   r   r   r   r   r>   r4   r   s
             r5   r  zImageDraw.textlengthR  s    "   && 	":CS//! 	"di>>GCS//!<==++D':vvT]~~dD)XxHHHr7   !tuple[float, float, float, float]c                  |r| j         dvrd}t          |          ||                     |          }|                     |          r|                     |||||||||	|
|          S |rdn| j        }|                    |||||	|
|          }|d         |d         z   |d         |d         z   |d         |d         z   |d         |d         z   fS )	z2Get the bounding box of a given string, in pixels.r   r   Nr   r   r   rn   r   )r   r)   rA   r   multiline_textbboxr0   getbbox)r2   rM   r   r   r   r   r   r   r   r   r   r   r>   r4   r   bboxs                   r5   r  zImageDraw.textbboxo  s   ,  	"di>>GCS//!<==++D  && 	**   (:vvT]||$	8X|V
 
 AwAQ"Q%a2a5$q'BqE/QQr7   c                  |                      |||||||||	|
||          \  }}}d }|D ]\  }}|                     |||||||	|
|	  	        }||}(t          |d         |d                   t          |d         |d                   t          |d         |d                   t          |d         |d                   f}||d         |d         |d         |d         fS |S )N)r   r   r   r   r   r   r   rn   r   )r  r  minr  )r2   rM   r   r   r   r   r   r   r   r   r   r   r>   r  r#  r   	bbox_lines                    r5   r!  zImageDraw.multiline_textbbox  s)   * #::
 
fe :> 	 	HB#!!)- & 
 
I |  Q1..Q1..Q1..Q1..	 <a5"Q%A1--r7   rE   )r   r   r   r   r   r   )r   r8   )r>   r?   r   r8   )r/   rB   r1   rB   r   rC   )Nr   )rM   r   rN   rO   rP   rO   r1   rB   rQ   rR   r   r   )rM   rV   rW   r   r1   rB   r   r   )NNr   )rM   r   rN   rO   rP   rO   r1   rB   rZ   rB   rQ   rR   r   r   )
rM   r   r1   rB   rZ   rB   rQ   rR   r   r   )rM   rd   re   rO   r1   rB   rZ   rB   rQ   rR   r   r   )Nr   N)
rM   r   r1   rB   rQ   rR   ri   r   r   r   NN)r   r   r1   rB   rZ   rB   r   r   )rM   r   r1   rB   r   r   )r   NNr   )r   r   r   rR   r   rO   r1   rB   rZ   rB   rQ   rR   r   r   )rM   r   re   rO   r1   rB   rZ   rB   rQ   rR   r   r   r   r   )r   r   r   r   )NNNrl   r   NNNr   NF) rM   r   r   r   r1   rB   r   r   r   r   r   rO   r   rG   r   r   r   r   r   r   r   rO   r   rB   r   r   r   r   r   r   r   r   )rM   r   r   r   r   r   r   r   r   rO   r   rG   r   r   r   r   r   r   r   rO   r   r   r>   r?   r   r   )rM   r   r   r   r1   rB   r   r   r   r   r   rO   r   rG   r   r   r   r   r   r   r   rO   r   rB   r   r   r>   r?   r   r   )NNNNF)r   r   r   r   r   r   r   r   r   r   r   r   r>   r?   r   rO   )	NNrl   r   NNNr   F)rM   r   r   r   r   r   r   r   r   rO   r   rG   r   r   r   r   r   r   r   rO   r   r   r>   r?   r   r  )__name__
__module____qualname__r   __annotations__r6   r=   rA   rL   rU   rW   r_   rc   rh   r   r   r   r   r   r   r   r   r   r   r  r   r  r  r!  r   r7   r5   r   r   =   s         	 	    ( ( ( ( (T   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 + + + + + !#"@ "@ "@ "@ "@P  #/ / / / /  !#8 8 8 8 8"  #J8 9=J8 J8 J8 J8 J8 J8X' ' ' ' ! ! $%)##'$'} } } } }~o# o# o# o#j ! ! $%)##'$'3* #'+3 3 3 3 3 3z  $%)#$I #'I I I I I IL ! $%)#$#0R& #''0R 0R 0R 0R 0R 0Rv ! $%)#$#>& #''> > > > > > > >r7   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     r5   r   r     sR    #%wr9%%d+++ # # #T"""""#s    88Image.Image | Nonehintsr   )tuple[ImageDraw2.Draw | None, ModuleType]c                b    |t          dd           ddlm} |  |j        |           nd}||fS )z
    :param im: The image to draw in.
    :param hints: An optional list of hints. Deprecated.
    :returns: A (drawing context, drawing resource factory) tuple.
    Nz'hints' parameter   r   )r   )r   r;   r   r   )r   r0  r   r-   s       r5   r-  r-    sR     %r***"$.?:?2dDr7   imagerM   tuple[int, int]valuefloat | tuple[int, ...]borderfloat | tuple[int, ...] | NonethreshrO   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   )r&   _color_diffr)   
IndexErrorsetadd)r4  rM   r6  r8  r:  pixelr   r   
backgroundedge	full_edgenew_edgestr   r1   s                   r5   	floodfillrG    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   rR   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 rE   rF   rR   rO   ro   rp   s     r5   r   z4_compute_regular_polygon_vertices.<locals>.<genexpr>|  s0      HH1:a#u..HHHHHHr7   z0bounding_circle should only contain numeric datarn   r   c              3  N   K   | ] }t          |t          t          f          V  !d S rE   rK  rL  s     r5   r   z4_compute_regular_polygon_vertices.<locals>.<genexpr>  sA       
 
,-Jq3,''
 
 
 
 
 
r7   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]ru   rO   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   rs   r   rn   )r   rt   r   r   r   )r   ru   centroids     r5   _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+ 	 
 	
r7   rx   c                $    dg} ||           S Nr   r   )rx   start_pointrQ  polygon_radiuss     r5   _compute_polygon_vertexzB_compute_regular_polygon_vertices.<locals>._compute_polygon_vertex  s    %q){E222r7   r   rR   r   c                    g }d| z  }dd|z  z
  |z   }t          |           D ]'}|                    |           ||z  }|dk    r|dz  }(|S )Nrs   r   g      ?)r   r   )r   r   r   ru   current_angle_s         r5   _get_anglesz6_compute_regular_polygon_vertices.<locals>._get_angles  so    -sW},8w 	% 	%AMM-(((W$Ms""$r7   c                &    g | ]} |          S r   r   )ro   rx   rV  s     r5   rq   z5_compute_regular_polygon_vertices.<locals>.<listcomp>  s%    ???u##E**???r7   )r   rN  ru   rO   r   r   )rx   rO   r   r   )r   rR   r   rO   r   rN  )
rF   rR   r   r)   r   rI   r   r   r
   rO   )
r   r   r   r4   rZ  r   rQ  rV  rP  rU  s
         @@@@r5   r   r   D  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 @???????r7   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 rE   )abs)ro   rp   firstseconds     r5   r   z_color_diff.<locals>.<genexpr>  s8      EEQs58fQi'((EEEEEEr7   )rF   rI   r  r   r   )r\  r]  ra  rb  s     @@r5   r<  r<    sn     !//>FFfYE!&%00?VVviFEEEEE%F2D2DEEEEEEr7   rE   )r   r   r   r   r   r   r'  )r   r/  r0  r   r   r1  rS  )r4  r   rM   r5  r6  r7  r8  r9  r:  rO   r   r   )r   r   r   rR   r   rO   r   rH  )r\  r7  r]  r7  r   rO   )'
__future__r   rt   r   collections.abcr   typesr   typingr   r   r   r	   r
   r;   r   r   
_deprecater   _typingr   r,   rZ   r   r+  TYPE_CHECKINGr   r   rO   rI   rR   rG   _Inkr   r   r-  rG  r   r<  r   r7   r5   <module>rk     s  @ # " " " " " "   $ $ $ $ $ $       5 5 5 5 5 5 5 5 5 5 5 5 5 5         ! ! ! ! ! !       .3Z-? ? ? ? ? (''''''''UE#s(OS()b b b b b b b bJ# # # # #$ >B    ( .2> > > > >B@ @ @ @D	F 	F 	F 	F 	F 	Fr7   