
    '	4j                     h   d Z ddlZddlZddlmZ ddlmZmZmZm	Z	 ddl
mZmZmZmZmZmZmZmZ ddlmZ ddlmZmZmZmZ dd	lmZmZmZ erdd
lmZ de de de de fdZ!de"e df   de"e df   de de"e df   fdZ#de$e   de"e%e$e   f   fdZ&	 dKdddee"e e	ee%f   f      de'de'de"e%e$e"e ef      ee$e"e ef         f   fdZ(dee"e e	ee%f   f      dee"e e	ee%f   f      fdZ)de dede fdZ*de$e"e ef      de de"e df   fd Z+de$e"e ef      de$e"e e f      fd!Z, G d" d#e      Z- G d$ d%e      Z. G d& d'e      Z/ G d( d)e      Z0 G d* d+e      Z1 G d, d-e      Z2 G d. d/e2      Z3 G d0 d1e2      Z4 G d2 d3e      Z5 G d4 d5e      Z6	 	 dLd6e d7e d8e d9e dee"e e	ee%f   f      d:ed;d<d=ee7   d>e de5fd?Z8ejr                  dfd@e dAe dBe dCe dee"e e	ee%f   f      d:e	ee%f   d;ed<   de3fdDZ:dddEejr                  dfd6e d7e dFe dee"e e	ee%f   f      dGee    dHee    dIe d:e	ee%f   d;ed<   de4fdJZ;y)Mzx
Handles the creation of patterns and gradients

Usage documentation at: <https://py-pdf.github.io/fpdf2/Patterns.html>
    N)ABC)TYPE_CHECKINGOptionalSequenceUnion   )Color
ColorClass
ColorInput
DeviceCMYK
DeviceGray	DeviceRGB	Transformconvert_to_device_color)GradientSpreadMethod)NamePDFArrayPDFContentStream	PDFObject)FloatToleranceNumberClassformat_number)BoundingBoxabtreturnc                     | || z
  |z  z   S N r   r   r   s      9/DATA/.local/lib/python3.12/site-packages/fpdf/pattern.pylerpr#      s    A{?    .c                      t               t              k7  rt        d      t         fdt        t                     D              S )Nz!Mismatched color component countsc              3   D   K   | ]  }t        |   |           y wr   r#   ).0ir   r   r   s     r"   	<genexpr>zlerp_tuple.<locals>.<genexpr>'   s#     <madAaD!$ms    )len
ValueErrortupleranger!   s   ```r"   
lerp_tupler/   "   s:     1vQ<==<eCFm<<<r$   colorsc                 n   | D ch c]  }t        |      j                   }}d|v rt        |      dkD  rt        d      |ddhk(  rN| D cg c]?  }t	        |t
              r+t        |j                  |j                  |j                        n|A }}d|fS |dhk(  rd| fS |dhk(  rd| fS d| fS c c}w c c}w )Nr   r   'Can't mix CMYK with other color spaces.r   r   )type__name__r+   r,   
isinstancer   r   g)r0   ckindspromoteds       r"   pick_colorspace_and_promoter:   *   s    '-.v!T!WvE.uUaBCC{++ SY!
RXQ
1j(AIacc133$qHRX 	 !
 H$$V##F"" /
!
s   B-AB2F
return_rawstopscoerce_to_devicer<   c                T   | st        d      g }| D ]>  \  }}t        |      }|rt        |d      st        |      n|}|j	                  ||f       @ |j                  d        g |D ]>  \  }}r$t        j                  d   d   |      r||fd<   ,j	                  ||f       @ dt        dt        d	t        d
t        fddt        d
dffd}	 |	d        |	d       g }
D ]*  \  }}|dk  rd}n
|dkD  rd}n|}|
j	                  ||f       , |
j                  d        g }|
D ]>  \  }}|r$t        j                  |d   d   |      r||f|d<   ,|j	                  ||f       @ t        |      dk(  r|d   \  }}d|fd|fg}nt        j                  |d   d         s|j                  dd|d   d   f       nd|d   d   f|d<   t        j                  |d   d   d      s|j	                  d|d   d   f       nd|d   d   f|d<   t        |D cg c]  \  }}|	 c}}      \  }t        ||      D cg c]  \  \  }}}||f }}}}|s|dfS dt        d
t        ffd}D cg c]  \  }}| ||      f }}}||fS c c}}w c c}}}w c c}}w )a~  
    Clamp/sort/merge, ensure endpoints at 0 and 1, coerce to single Device* colorspace.

    When ``return_raw`` is true, also returns a list of the original stop positions
    (prior to clamping to [0,1]) converted to the same device colorspace. The raw
    offsets are sorted and merged (last stop wins for near-duplicates) but no
    implicit 0/1 endpoints are synthesized.
    At least one stop is requiredr0   c                     | d   S Nr   r    r   s    r"   <lambda>z!normalize_stops.<locals>.<lambda>V   s    1Q4r$   keyr   c0c1r   r   c                    | j                   }|j                   }t        |||      }t        | dd       }t        |dd       }d }||'t        |dn
t	        |      |dn
t	        |      |      }t        | t              rt        |d   |      S t        | t              rt        |d   |d   |d   |      S t        | t              rt        |d   |d   |d   |d   |      S | S )Nr         ?r   r         )	r0   r/   getattrr#   floatr5   r   r   r   )	rH   rI   r   comps0comps1blendeda0a1alphas	            r"   _lerp_colorz$normalize_stops.<locals>._lerp_color_   s    VVQ/Rd#Rd#>R^zuRy#rTUE b*%gaj%00b)$WQZWQZGGb*%gaj'!*gaj'!*eTT	r$   targetNc           
         sy t        j                  | d   d         st        j                  | d   d         ry D ]  \  }}t        j                  ||       s y  t	        dt                    D ]  }|dz
     \  }}|   \  }}t        j                  | |      s-t        j                  | |      sDt        ||z
  t         j                        }| |z
  |z  }	j                  ||  
|||	      f        y  y )Nr   rG   r   )r   	less_thangreater_thanequalr.   r+   greater_equal
less_equalmax	TOLERANCEinsert)rW   u_idxu0rH   u1rI   spanr   rV   
merged_raws             r"   _ensure_stopz%normalize_stops.<locals>._ensure_stops   s   ##JqM!$
((B1BCDAq##Av.  C
O,Ca(FB_FB++FB7N<U<U= 27N$<$<=b[D(!!#BA0F'GH -r$           rK   c                     | d   S rB   r    rC   s    r"   rD   z!normalize_stops.<locals>.<lambda>   s    qtr$   r   colorc                 P   dk(  rMt        | t              r| S t        | t              r| j                         S t        | t              rt        d      dk(  rMt        | t              r| S t        | t              r+t        | j                  | j                  | j                        S | S )Nr   z&Can't mix CMYK with non-CMYK gradientsr   )r5   r   r   to_grayr   r,   r6   )rk   
space_names    r"   promote_rawz$normalize_stops.<locals>.promote_raw   s    %%,%+}}&%, !IJJ$%+%, %''577;;r$   )r,   rO   hasattrr   appendsortr   r[   r	   r+   is_zeror`   r:   zip)r=   r>   r<   raw_entriesoffcolraw_ur7   rk   rh   clamped_entriesra   merged_clampedrb   palettep
normalizedro   raw_promotedrV   rg   rn   s                      @@@r"   normalize_stopsr   ;   s,    899-/KSc
 !h)? $C( 	

 	E1:&  (,.J#u...z"~a/@%H#U^JrNuen-	 $ 5 U u (U t * 13O"u3;AS[AA5z* # ^,02N#5n22>"3Ea3H!L"#UN2!!1e*-	 $ >a!!$5,e5%%nQ&7&:;!!!c>!+<Q+?%@A!$nQ&7&: ;N1##N2$6q$93?!!3r(:1(=">?"%~b'9!'<!=N25^6T^TQq^6TUJ*-ng*FG*FYVaQ1a&*FJG:t++5 U  ?IIj
EQE*+jLIz<//- 7UG( Js   !J
J;J$pairsc           	         g }| D ]  \  }}|rt        j                  |d   d   |      r|d   \  }}||k(  r||f|d<   9t        t         j                  dz  d      }||z
  }t        j                  |d      r||f|d<   |j                  ||f       ||z   }|dkD  r!d}t        dt        |||z
              |f|d<   n||f|d<   |j                  ||f       |j                  ||f        |S )NrG   r   
   ư>ri   rK   )r   r[   r^   r_   r\   rq   min)	r   outra   rw   prev_uprev_colstepnudged_prevnudgeds	            r"   merge_near_duplicatesr      s    24C3>''B
A6"2wFH3c(B~//"4d;D 4-K++K=&1B

As8$TC< F"3FFTM(BCXNCG%x0CG

FC=)JJ3x - . Jr$   ra   methodc                     |t         j                  k(  r| dk  rdS | dkD  rdS | S |t         j                  k(  r| t        j                  |       z
  S | dz  }|dk  r|S d|z
  S )u*   Map u∈R -> [0,1] via PAD/REPEAT/REFLECT.ri   rK          @)r   PADREPEATmathfloor)ra   r   vs      r"   
spread_mapr      sm    %)))#gs8!c'38q8%,,,4::a=  	CAS1%cAg%r$   stops01c                 <   t        dt        |             D ]s  }| |   \  }}t        j                  ||      s"| |dz
     \  }}t	        ||z
  t        j
                        }||z
  |z  }t        |j                  |j                  |      c S  | d   d   j                  S )zTPiecewise-linear sampling in [0,1]. Assumes normalized/sorted stops incl. endpoints.r   rG   )r.   r+   r   r]   r^   r_   r/   r0   )	r   ra   r)   re   rI   rd   rH   rf   r   s	            r"   sample_stopsr      s    1c'l#B$$Q+QU^FBrBw 8 89DR4AbiiA66 $ 2;q>   r$   c                 x    g }| D ]2  \  }}t        |dd      }|j                  ||dn
t        |      f       4 |S )u5   Return [(u, a)] with a∈[0,1]; missing alpha => 1.0.r   NrK   )rN   rq   rO   )r   r   ra   r7   r   s        r"   extract_alpha_stopsr      sG     &(C1AsD!

AaisU1X67  Jr$   c                        e Zd ZdZded   f fdZedefd       Zedefd       Z	de
dd fd	Zde
fd
ZdeddfdZdefdZ xZS )Patternz
    Represents a PDF Pattern object.

    Currently, this class supports only "shading patterns" (pattern_type 2),
    using either a linear or radial gradient. Tiling patterns (pattern_type 1)
    are not yet implemented.
    shading)GradientShadingMeshShadingc                     t         |           t        d      | _        d| _        || _        t        j                         | _        d| _	        y )Nr   rL   T)
super__init__r   r3   pattern_type_shadingr   identity_matrix_apply_page_ctm)selfr   	__class__s     r"   r   zPattern.__init__  sB    O	 ))+  $r$   r   c                 P    | j                   j                         j                   dS )N 0 R)r   get_shading_objectidr   s    r"   r   zPattern.shading  s#    --224778==r$   c                    dt        | j                  j                         dt        | j                  j                         dt        | j                  j                         dt        | j                  j
                         dt        | j                  j                         dt        | j                  j                         dS )N[ ])r   r   r   r   r7   defr   s    r"   matrixzPattern.matrix  s     dllnn-.adllnn0M/NaT\\^^,-Q}T\\^^/L.MQT\\^^,-Q}T\\^^/L.MQP	
r$   r   c                     || _         | S r   r   )r   r   s     r"   
set_matrixzPattern.set_matrix$  s    r$   c                     | j                   S r   r   r   s    r"   
get_matrixzPattern.get_matrix(      ||r$   applyNc                     || _         y r   r   )r   r   s     r"   set_apply_page_ctmzPattern.set_apply_page_ctm+  s
    $r$   c                     | j                   S r   r   r   s    r"   get_apply_page_ctmzPattern.get_apply_page_ctm.  s    ###r$   )r4   
__module____qualname____doc__r   r   propertystrr   r   r   r   r   boolr   r   __classcell__r   s   @r"   r   r     s    	$&J K 	$ > > > 
 
 
 y I % % %$D $r$   r   c                   P     e Zd ZdZdedef fdZededeedf   fd       Z	 xZ
S )	Type2FunctionzTransition between 2 colorscolor_1color_2c                 X   t         |           d| _        d| _        | j	                  |      }| j	                  |      }t        |      t        |      k7  rt        d      ddj                  d |D               d| _        ddj                  d |D               d| _	        d	| _
        y )
NrL   [0 1]z6Type2Function endpoints must have same component countr   r   c              3   2   K   | ]  }t        |        y wr   r   r(   r7   s     r"   r*   z)Type2Function.__init__.<locals>.<genexpr>>       <A}Q/   r   c              3   2   K   | ]  }t        |        y wr   r   r   s     r"   r*   z)Type2Function.__init__.<locals>.<genexpr>?  r   r   r   )r   r   function_typedomain_get_color_componentsr+   r,   joinrH   rI   n)r   r   r   rI   c2r   s        r"   r   zType2Function.__init__5  s    ''0''0r7c"gUVVchh<<<=Q?chh<<<=Q?r$   rk   r   .c                 T    t        |t              r|j                  fS |j                  S r   )r5   r   r6   r0   )clsrk   s     r"   r   z#Type2Function._get_color_componentsB  s"    eZ(GG:||r$   )r4   r   r   r   r	   r   classmethodr-   rO   r   r   r   s   @r"   r   r   2  sD    %   % E%*4E  r$   r   c                   ,     e Zd ZdZdedef fdZ xZS )Type2FunctionGrayu@   1‑channel exponential interpolation for alpha/luminance ramps.g0g1c                     t         |           d| _        d| _        dt	        |       d| _        dt	        |       d| _        d| _        y )NrL   r   r   r   r   )r   r   r   r   r   rH   rI   r   )r   r   r   r   s      r"   r   zType2FunctionGray.__init__L  sP    mB'(*mB'(*r$   )r4   r   r   r   rO   r   r   r   s   @r"   r   r   I  s    J5 e  r$   r   c                   Z     e Zd ZdZdeeeed f      dee   f fdZ	e
defd       Z xZS )Type3FunctionzWhen multiple colors are used, a type 3 function is necessary to stitch type 2 functions together
    and define the bounds between each color transition	functionsboundsc                     t         |           d| _        d| _        || _        ddj                  d |D               d| _        ddj                  d |D               d| _        y )NrM   r   r   r   c              3   2   K   | ]  }t        |        y wr   r   )r(   bounds     r"   r*   z)Type3Function.__init__.<locals>.<genexpr>c  s     "LVE=#7Vr   r   c              3       K   | ]  }d   yw)z0 1Nr    )r(   rb   s     r"   r*   z)Type3Function.__init__.<locals>.<genexpr>d  s     "<)Q5)s   )r   r   r   r   
_functionsr   r   encode)r   r   r   r   s      r"   r   zType3Function.__init__Y  sf    
 	##(("LV"LLMQO#(("<)"<<=Q?r$   r   c                 N    ddj                  d | j                  D               dS )Nr   r   c              3   :   K   | ]  }|j                    d   yw)r   N)r   )r(   r   s     r"   r*   z*Type3Function.functions.<locals>.<genexpr>h  s     C?aqttfDM?s   r   )r   r   r   s    r"   r   zType3Function.functionsf  s%    388C4??CCDAFFr$   )r4   r   r   r   r   r   r   r   rO   r   r   r   r   r   r   s   @r"   r   r   U  sV    ;@E-1BO"STU@ @ G3 G Gr$   r   c                        e Zd Zdedee   dedee   ez  dee	e
z  ez     dedef fdZed	efd
       Zd	ee	e
z  ez     fdZddZ xZS )r   shading_type
backgroundcolor_spacecoordsr   extend_beforeextend_afterc                    t         |           || _        |r&ddj                  d |j                  D               dnd | _        t        |      | _        || _        || _	        d|rdnd d|rdnd d| _
        d| _        y )Nr   r   c              3   2   K   | ]  }t        |        y wr   r   r   s     r"   r*   z#Shading.__init__.<locals>.<genexpr>y       E3Daq)3Dr   r   truefalseT)r   r   r   r   r0   r   r   r   r   r   extend
anti_alias)	r   r   r   r   r   r   r   r   r   s	           r"   r   zShading.__init__l  s     	(  E:3D3DEEFaH 	
  ,#M&w?q<]d@eefgr$   r   c                 :    | j                   d   j                   dS )zHReference to the *top-level* function object for the shading dictionary.rG   r   )r   r   r   s    r"   functionzShading.function  s!     //"%(()..r$   c                     | j                   S )zIAll function objects used by this shading (Type2 segments + final Type3).)r   r   s    r"   get_functionszShading.get_functions  s     r$   c                     | S )z1Return self, as this is already a shading object.r    r   s    r"   r   zShading.get_shading_object  s    r$   r   r   )r4   r   r   intr   r	   r   r   rO   r   r   r   r   r   r   r   r  r   r   r   s   @r"   r   r   k  s     UO 	
 #% M,==MN  . /# / /	-"33mC	Dr$   r   c                      e Zd Zdee   dee   dededeee      f
dZe	dee   de
eee   ee   f   fd       Zdeeez  ez     fd	Zdeeez  ez     fd
ZddZdefdZdefdZdeeez  ez     fdZ	 dded   ded   fdZy)r   r0   r   r   r   r   c                     | j                  |      \  | _        | _        | _        d | _        |rt        |t        gt        t              rt        |      nt        | }| j                  dk(  r<t        |t              r|j                         }nt        |t              rqt        d      | j                  dk(  rWt        |t              r,t        |j                  |j                  |j                        }nt        |t              rt        d      || _        || _        || _        |r|nJt%        t'        | j                        dz
        D cg c]   }|dz   t'        | j                        dz
  z  " c}| _        t'        | j(                        t'        | j                        dz
  k7  rt        d      | j+                         | _        t/        |       | _        d | _        d | _        d | _        d| _        d | _        y c c}w )Nr   z0Can't mix CMYK background with non-CMYK gradientr   rL   r   z>Bounds array length must be two less than the number of colorsr   )_convert_colorsr   r0   _alphasr   r5   r   r
   r   r   r   rm   r   r,   r   r6   r   r   r.   r+   r   _generate_functionsr   r   pattern_shading_object_alpha_shading_objectr   r   	raw_stops)r   r0   r   r   r   r   bgr)   s           r"   r   zGradient.__init__  s    7;6J6J66R3$+t| j3*J*Jk*JK (
3,j9  </b),BJ/$%WXX!![0b*-"244rtt4BJ/$%WXX DO*(  <A#dkkBRUVBV<WX<Wq1q5S-12<WX 	
 t{{s4;;/!33P  113t}268<"15>B Ys   %G;r   c                    t        |      dk  rt        d      g }t               }g }|D ]  }t        |t        gt
        t              rt        |      nt        | }|j                  |       |j                  t        |      j                         t        |dd      }|j                  |t        |      nd        d|v rt        |      dkD  rt        d      |dhk(  rd||fS |d	d
hk(  r|g }|D ]p  }	t        |	t              r;|j                  t        |	j                   |	j                   |	j                                Nt        |	t              sJ |j                  |	       r d
||fS |d	hk(  rd	||fS |d
hk(  rX|D 	cg c]  }	t        |	t              s|	 }
}	t#        d |
D              r!d	|
D 	cg c]  }	|	j%                          c}	|fS d
||fS d
||fS c c}	w c c}	w )zXNormalize colors to a single device colorspace and capture per-stop alpha (default 1.0).rL   (A gradient must have at least two colorsr   NrK   r   r   r2   r   r   c              3   <   K   | ]  }|j                           y wr   )is_achromaticr   s     r"   r*   z+Gradient._convert_colors.<locals>.<genexpr>  s     :k1??$ks   )r+   r,   setr5   r   r
   r   r   rq   addr3   r4   rN   rO   r   r   r6   allrm   )r   r0   r{   spacesalphasrk   dcr   r9   r7   rgb_palettes              r"   r  zGradient._convert_colors  s   
 v;?GHH  "5 E ec%EJ%E%EF (.,e4 
 NN2JJtBx(()C&AMMam%(=  6!c&kAoFGG l^#&00 lK00$&Ha,OOIacc133$<=%a333OOA&  &00 l^#&00 k]" #,"ajI&>7  , :k::#;%G;aaiik;%GOO// GV++, &Hs    GG3Gc           	         t        | j                        dk  rt        d      t        | j                        dk(  r't        | j                  d   | j                  d         gS t        | j                        }g }t	        |dz
        D ]:  }|j                  t        | j                  |   | j                  |dz                   < |j                  t        |d d  | j                               |S )NrL   r  r   r   )r+   r0   r,   r   r.   rq   r   r   )r   number_of_colorsr   r)   s       r"   r
  zGradient._generate_functions  s     t{{aGHHt{{q !$++a.$++a.ABBt{{+MO	'!+,A]4;;q>4;;q1u;MNO -y|T[[ABr$   c                     | j                   S r   )r   r   s    r"   r  zGradient.get_functions  s    ~~r$   r   c           
         | j                   s| j                  dnQt        | j                  D cg c]%  }t        |t        t
        f      rt        |      n|' c}      j                         }t        | j                  | j                  | j                  || j                  | j                  | j                        | _         | j                   S c c}w )N r   r   r   r   r   r   r   )r  r   r   r5   r  rO   r   	serializer   r   r   r   r   r   r   )r   valuer   s      r"   r   zGradient.get_shading_object  s    ## ;;&  &*[[ &1E  *%#u> *%0!&' &1	 )+  $+!..?? ,,.."00!..$D  ###'s   *Cc                     | j                   S r   )r  r   s    r"   get_patternzGradient.get_pattern*  r   r$   c                 :    t        d | j                  D              S )z&True if any stop carries alpha != 1.0.c              3   J   K   | ]  }t        j                  |d          yw)rK   N)r   r[   )r(   r   s     r"   r*   z%Gradient.has_alpha.<locals>.<genexpr>/  s!     J\~++As33\s   !#)anyr	  r   s    r"   	has_alphazGradient.has_alpha-  s    JT\\JJJr$   c           	         t        | j                        dk  rt        d      t        | j                        dk(  r't        | j                  d   | j                  d         gS g }t	        t        | j                        dz
        D ]:  }|j                  t        | j                  |   | j                  |dz                   < |j                  t        |dd | j                               |S )z>Stitched Type2 gray functions mirroring the color ramp bounds.rL   z&Alpha ramp requires at least two stopsr   r   N)r+   r	  r,   r   r.   rq   r   r   )r   r   r)   s      r"   _generate_alpha_functionsz"Gradient._generate_alpha_functions1  s     t||q EFFt||!%dll1ot||AGHH=?	s4<<(1,-A.t||AQQRU@STU .y|T[[ABr$   Nrb   r   c           	         | j                         sy| j                  s| j                  \t        | j                  t        t
        f      r<t        | j                        dkD  r$t        | j                        j                         }nd}t        | j                  dd|| j                         | j                  | j                        | _        | j                  S )zGGrayscale Shading object representing the alpha ramp (for a soft mask).Nr   r  r   r   )r(  r  r   r5   listr-   r+   r   r!  r   r   r*  r   r   )r   rb   r   s      r"   get_alpha_shading_objectz!Gradient.get_alpha_shading_object?  s     ~~))'t{{T5M:$q(!$++.88:)0!..(88:"00!..*D& )))r$   r  r   )r4   r   r   r   r   r   r   rO   r   r   r-   r   r,  r	   r  r   r   r   r
  r  r   r   r$  r(  r*  r-  r    r$   r"   r   r     s(   -C$-C Z(-C 	-C
 -C %)-C^ 8,j)8,	sDKe,	-8, 8,t	m//-?	@tM4E$E$UV $6W K4 K	-"33mC	D ,0*-(*	)	*r$   r   c                   f     e Zd Z	 	 	 	 ddededededee   dee   deded	eee      f fd
Z	 xZ
S )LinearGradientfrom_xfrom_yto_xto_yr0   r   r   r   r   c
                 P    t         
|   |||||	       ||||f| _        d| _        y)a  
        A shading pattern that creates a linear (axial) gradient in a PDF.

        The gradient is defined by two points: (from_x, from_y) and (to_x, to_y),
        along which the specified colors are interpolated. Optionally, you can set
        a background color, extend the gradient beyond its start or end, and
        specify custom color stop positions via `bounds`.

        Args:
            from_x (int or float): The x-coordinate of the starting point of the gradient,
                in user space units.
            from_y (int or float): The y-coordinate of the starting point of the gradient,
                in user space units.
            to_x (int or float): The x-coordinate of the ending point of the gradient,
                in user space units.
            to_y (int or float): The y-coordinate of the ending point of the gradient,
                in user space units.
            colors (list[str or tuple[int, int, int]]): A list of colors along which the gradient
                will be interpolated. Colors may be given as hex strings (e.g., "#FF0000") or
                (R, G, B) tuples.
            background (str or tuple[int, int, int], optional): A background color to use
                if the gradient does not fully cover the region it is applied to.
                Defaults to None (no background).
            extend_before (bool, optional): Whether to extend the first color beyond the
                starting point (from_x, from_y). Defaults to False.
            extend_after (bool, optional): Whether to extend the last color beyond the
                ending point (to_x, to_y). Defaults to False.
            bounds (list[float], optional): An optional list of floats in the range (0, 1)
                that represent gradient stops for color transitions. The number of bounds
                should be two less than the number of colors (for multi-color gradients).
                Defaults to None, which evenly distributes color stops.
        rL   Nr   r   r   r   )r   r0  r1  r2  r3  r0   r   r   r   r   r   s             r"   r   zLinearGradient.__init__[  s?    X 	]L&Q 	
 	 r$   NFFNr4   r   r   rO   r   r   r   r   r,  r   r   r   s   @r"   r/  r/  Z  s     ,0#"(,55 5 	5
 5 $5 Z(5 5 5 e%5 5r$   r/  c                   n     e Zd Z	 	 	 	 ddededededededee   dee   d	ed
edeee      f fdZ	 xZ
S )RadialGradientstart_circle_xstart_circle_ystart_circle_radiusend_circle_xend_circle_yend_circle_radiusr0   r   r   r   r   c                 T    t         |   |||	|
|       ||||||f| _        d| _        y)a  
        A shading pattern that creates a radial (or circular/elliptical) gradient in a PDF.

        The gradient is defined by two circles (start and end). Colors are blended from the
        start circle to the end circle, forming a radial gradient. You can optionally set a
        background color, extend the gradient beyond its circles, and provide custom color
        stop positions via `bounds`.

        Args:
            start_circle_x (int or float): The x-coordinate of the inner circle's center,
                in user space units.
            start_circle_y (int or float): The y-coordinate of the inner circle's center,
                in user space units.
            start_circle_radius (int or float): The radius of the inner circle, in user space units.
            end_circle_x (int or float): The x-coordinate of the outer circle's center,
                in user space units.
            end_circle_y (int or float): The y-coordinate of the outer circle's center,
                in user space units.
            end_circle_radius (int or float): The radius of the outer circle, in user space units.
            colors (list[str or tuple[int, int, int]]): A list of colors along which the gradient
                will be interpolated. Colors may be given as hex strings (e.g., "#FF0000") or
                (R, G, B) tuples.
            background (str or tuple[int, int, int], optional): A background color to display
                if the gradient does not fully cover the region it's applied to. Defaults to None
                (no background).
            extend_before (bool, optional): Whether to extend the gradient beyond the start circle.
                Defaults to False.
            extend_after (bool, optional): Whether to extend the gradient beyond the end circle.
                Defaults to False.
            bounds (list[float], optional): An optional list of floats in the range (0, 1) that
                represent gradient stops for color transitions. The number of bounds should be one
                less than the number of colors (for multi-color gradients). Defaults to None,
                which evenly distributes color stops.
        rM   Nr5  )r   r:  r;  r<  r=  r>  r?  r0   r   r   r   r   r   s               r"   r   zRadialGradient.__init__  sE    ` 	]L&Q 
 	 r$   r6  r7  r   s   @r"   r9  r9    s     ,0#"(,;; ; #	;
 ; ; !; $; Z(; ; ; e%; ;r$   r9  c                        e Zd ZdZddddeddded	eeeeef   eeef   eeef   f      d
eeeedf   eedf   eedf   f      de	d   de
f fdZddZdefdZedeeez  ez     fd       Z xZS )r   zV
    PDF Shading type 4 (free-form Gouraud triangle mesh) with per-vertex colors.
    NT)r   r   r   bboxr   
comp_count	trianglesr0   .r   r	   r   c                "   t        d      | _        d| _        t        |      | _        |r&ddj	                  d |j
                  D               dnd | _        || _        || _        || _	        || _
        || _        d| _        d| _        d| _        |j                  |j                   |j"                  |j$                  gd	d
g|z  }t'        |D 	cg c]  }	t)        |	       c}	      | _        t,        
| ]  | j1                         d       y c c}	w )Nr      r   r   c              3   2   K   | ]  }t        |        y wr   r   r   s     r"   r*   z'MeshShading.__init__.<locals>.<genexpr>  r   r   r         ri   rK   T)contentscompress)r   r3   r   r   r   r0   r   _bbox
_triangles_triangle_colorsr   _comp_countbits_per_coordinatebits_per_componentbits_per_flagx0x1y0y1r   r   decoder   r   _encode_stream_raw)r   r   rB  rC  rD  r0   r   r   decode_valuesr"  r   s             r"   r   zMeshShading.__init__  s    O	,  E:3D3DEEFaH 	
 
# &$% $& "$ GGGGGGGG	

 Cj:%
 -P-e 4-PQ$"9"9";dK  Qs   Dr   c                     | S r   r    r   s    r"   r   zMeshShading.get_shading_object  s    r$   c                    | j                   j                  | j                   j                  }}| j                   j                  | j                   j                  }}d| j
                  z  dz
  t        ||z
  t        j                        z  }t        ||z
  t        j                        z  }d| j                  z  dz
  dt        dt        dt        dt        ffd}dt        dt        ffd}| j                  d	kD  rd
nd}	d|	| j                  z  z   }
t               }t        | j                  | j                         D ]  \  \  }}}\  }}}||f||f||ffD ]o  \  \  }}}t#        | j                        D cg c]  }|t%        |      k  r |||         nd }}|t'        j(                  |
d ||||       ||||      g| z  }q  t+        |      S c c}w )Nr   ra   uminscaler   c                 X    t        t        | |z
  |z              }|dk  rdS |kD  rS |S rB   )r  round)ra   r\  r]  uimaxcs       r"   q16z+MeshShading._encode_stream_raw.<locals>.q16  s7    UAH-./BQ1=BID=2=r$   r   c                 d    t        t        t        |       z              }|dk  rdS |kD  rS |S rB   )r  r_  rO   )r   ivmax_comps     r"   q_componentz3MeshShading._encode_stream_raw.<locals>.q_component  s7    U58h./0BQ1EXHE2Er$   rI  HBz>BHHr   )rL  rS  rT  rU  rV  rP  r^   r   r_   rQ  rO   r  rO  	bytearrayrt   rM  rN  r.   r+   structpackbytes)r   xminxmaxyminymaxsxsyrb  rf  comp_fmt
vertex_fmtr   v0v1v2rH   rI   r   xycompsr)   component_bytesre  ra  s                          @@r"   rX  zMeshShading._encode_stream_raw  s   ZZ]]DJJMMdZZ]]DJJMMdT---2Ct^%=%=>>Ct^%=%=>>000A5	>5 	> 	>e 	> 	>	F5 	FS 	F 11A533x$*:*::;
k*-doot?T?T*U&LRR,2r2#%r(RHr2h!?A #4#3#34#4 ./U^Ka)B4   # v{{4$4$	
 %  "@ +V Sz#s   7"Gc                     g S )zNType-4 mesh shadings don't use Function objects; return empty list for output.r    )r   s    r"   r  zMeshShading.get_functions)  s	    
 	r$   )r   r   )r4   r   r   r   r   r  r,  r-   rO   r   r   r   r   rl  rX  r   r   r   r   r   r  r   r   s   @r"   r   r     s    )-*L *L 	*L
 *L %u%uUE\':E%,<OOP
*L U5,eE3J.?uczARRST*L W%*L *LZ E  D 	-"33mC	D r$   r   c                        e Zd ZdZdZej                  ddfdedededed	ee	ee
eef   f      d
e
def   dee   def fdZdefdZddZddded   fdZ xZS )SweepGradientz
    Conic/sweep gradient that materializes as a type-4 (mesh) Shading.
    Build is bbox-dependent, so we create the shading lazily at emit time.
    )cxcystart_angle	end_angler=   spread_methodsegmentsinner_radius_factor_cached_keyr   _alpha_shadingNMb`?r  r  r  r  r=   r  r   r  r  c	                 d   t         	|           t        |      t        |      c| _        | _        t        |      t        |      c| _        | _        || _        t        t        d      rt        j                  |      n
t        |      | _        || _        || _        d | _        d | _        d | _        y )Ncoerce)r   r   rO   r  r  r  r  r=   rp   r   r  r  r  r  r  r   r  )
r   r  r  r  r  r=   r  r  r  r   s
            r"   r   zSweepGradient.__init__E  s     	 9eBi+0+=uY?O($.
 +X6 !''6%m4 	
 !#6   	 0459r$   r   c                     | j                   D ]O  \  }}t        |d      st        |      n|}t        |dd       }|/t	        j
                  t        |      d      rO y y)Nr0   r   rK   TF)r=   rp   r   rN   r   r[   rO   )r   rb   r7   r  r   s        r"   r(  zSweepGradient.has_alpham  sX    JJDAq3:1h3G(+QBC&A}^%9%9%(C%H	 
 r$   rB  r   r   c                 R   |j                   |j                  |j                  |j                  | j                  | j
                  | j                  | j                  | j                  | j                  | j                  j                  f}| j                  | j                  |k(  r| j                  S || _        t        | j                  | j
                  | j                  | j                  | j                  | j                  || j                  | j                  	      | _        | j                  S )Nr  rB  r  r  )rS  rU  rT  rV  r  r  r  r  r  r  r  r"  r   r  shape_sweep_gradient_as_meshr=   )r   rB  rF   s      r"   r   z SweepGradient.get_shading_objectv  s    GGGGGGGGGGGGNNMM$$$$
 ==$)9)9S)@== 4GGGGNNJJ,,]] $ 8 8

 }}r$   c                    | j                         sy t        | j                        \  }}}t        |      }|D cg c]  \  }}|t	        |      f }}}d|j
                  |j                  |j                  |j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  j                   f}t#        | dd       |k(  r| j$                  S t'        | j                  | j                  | j                  | j                  || j                  || j                  | j                  	      | _        || _        | j$                  S c c}}w )NrU   _alpha_cached_keyr  )r(  r   r=   r   r   rS  rU  rT  rV  r  r  r  r  r  r  r  r"  rN   r  r  r  )	r   rB  rb   r   alpha01ra   r   
gray_stopsrF   s	            r"   r-  z&SweepGradient.get_alpha_shading_object  sC   ~~ (

37A%g.-47
-46AqQ
1W 	 7

 GGGGGGGGGGGGNNMM$$$$
 4,d3s:&&&:GGGGNN,,]] $ 8 8

 "%"""E7
s   E))rB  r   r   r   )r4   r   r   r   	__slots__r   r   rO   r   r-   r   r	   r   r   r  r   r   r(  r   r-  r   r   s   @r"   r~  r~  1  s    
I* =Q<T<T"&%*&:&: &: 	&:
 &: eU5#:%6678&: 3S89&: 3-&: #&:P4 <)#] )#x?V )#r$   r~  r  r  r  r  r  rB  r   r  r  c	           
        CDEFGHIJKL t        |      \  }	}
}	|
d   d   }t        |t              rd}d}nt        |t              rd}d}nd}d}dt        j
                  z  L|z
  }t        j                  |      rL}|d	k  r4|c}|
D cg c]  \  }}d
|z
  |f }
}}|
j                  d        | }t        j                  |d	      r|nLHt        HL      E|t        dt        |
      dz        }nt        d|      }Et        |      z  }t        t        |t        j
                  dz        t        j
                  dz        }|j                  | |      }t        t        |j                  |j                         t        |      z  t        j"                        }t	        j$                  L      JJd	k  rJLz  Jt	        j$                  JHz   L      }|d	k  r|Lz  }t        j&                  HL      xr |Jk  }t        j(                  HL      ILJz
  Lz  Gt        j*                  Gd	      rEGd	g}t-        t	        j.                  EHz              }E|Hz  z
  }t        j*                  |d	      rd	}t1        |      D ](  }|Hz  }|
D ]  \  }}	|j3                  ||Hz  z           * |d	kD  rU|Hz  }|Hz  }|
D ]4  \  }}	t        j                  ||      r n|j3                  ||Hz  z          6 |j3                  E       n|j3                  E       t4        j6                  k(  rIst        EHz
  d	      }t        j                  Gd	      r't        j*                  GE      r|j3                  G       t        j                  |d	      rt        j&                  GE      rt        j                  GH      rzt        t        Hdz  t        j"                        GHz
  t        j"                  z
  EGz
  t        j"                  z
        }t        j                  |d	      r|j3                  G|z
         |j                          g }|D ]4  } |rt        j8                  | |d         r| |d<   $|j3                  |        6 |sd	Eg}n%t        |      dk(  r|j3                  |d   Ez          JHz   }!t        j                  |!L      FGz   }"dt        dt        fEFGHIJLf	d}#g }$|D ]  } t        j(                  | E      r,Is*t        j                  EH      rt4        j6                  k7  rE| z   }% |#|       }&t4        j6                  k(  r|&d	k  rd	n|&d
k\  rd
n|&}'nt;        |&      }'t=        |
|'      }(|$j3                  |%|&|(f        |$sg })nƉt4        j6                  k(  rIs|rGz   }"|$d   d   }*g })d}+|$D ]Y  \  }%}&}(|)j3                  |%|(f       |+rt        j8                  |%|"      s4|)j3                  |%t        j"                  z   |*f       d}+[ |+s>|)j3                  |"t        j"                  z   |*f       n|$D %	(cg c]
  \  }%}	}(|%|(f })}	}%}(g },|
d   d   j>                  }-|)r|,j3                  |)d          t1        t        |)      dz
        D ]  }.|)|.   \  }/C|)|.dz      \  }0D|0|/z
  }1t        j*                  |1d	      r|,r|0Df|,d<   n|,j3                  |0Df       O|rt        j                  |/|"      r|-C|-Dt        dt-        t	        j@                  |1|z                    }2t1        d|2dz         D ]A  }3|3|2z  K|/K|1z  z   }%tC        CDKfdt1        |      D              }(|,j3                  |%|(f       C  t        |,      dk  r3|)r|)d   d   n}%|)r|)d   d   n|
d   d   j>                  }4|%|4f|%Ez   |4fg},g }5g }6|,d   \  }7}8| |t	        jD                  |7      z  z   }9||t	        jF                  |7      z  z   }:| |t	        jD                  |7      z  z   };||t	        jF                  |7      z  z   }<|,dd D ]  \  }=}>| |t	        jD                  |=      z  z   }?||t	        jF                  |=      z  z   }@| |t	        jD                  |=      z  z   }A||t	        jF                  |=      z  z   }B|5j3                  |9|:f|;|<f|A|Bff       |6j3                  |8|8|>f       |5j3                  |9|:f|A|Bf|?|@ff       |6j3                  |8|>|>f       |=|>}8}7|?|@}:}9|A|B}<}; tI        ||||5|6dd      S c c}}w c c}(}	}%w )u   
    Approximate a sweep (conic) gradient as a Type 4 mesh (triangles).
    We build a full 0..2π fan so PAD/REPEAT/REFLECT outside [0,1] are respected.
    Angles are expected in radians.
    r   r   r   r   rM   r   rF  r   ri   rK   c                     | d   S rB   r    rC   s    r"   rD   z.shape_sweep_gradient_as_mesh.<locals>.<lambda>  s    adr$   rE   Ni   `   rH  g     v@g{Gz?rG   progressr   c                 V  	 t        j                  d      ry| z   }t        j                  |       r-
t        j                  k(  r	st        j
                        ryy
t        j                  k(  r	rt        j
                  d      r| z  S dS s[t        j                  |      }|dk  r|z  }z   }t        j                  |      ryt        j                  ||      r|z
  z  S yt        t         j                        }t        j                  | |      r| |z  S y| z  S )Nri   rK   )r   r]   r\   r   r   rZ   r   fmodrY   r^   r_   )r  theta	angle_mod	end_limitvisible
cover_spancrosses_360seam_progressrf   span_covers_full_circler  r  	start_modtaus        r"   raw_from_progressz7shape_sweep_gradient_as_mesh.<locals>.raw_from_progress>  s/   $$T3/h&''*=!5!9!99/"//
DA0444&'5'B'B4'MHtOSV  IIeS1	s?$I%,	!++IyA!,,Y	B%	1T99 -)A)ABG((7;'))$r$   rL   FTc              3   F   K   | ]  }|   |   |   z
  z  z     y wr   r    )r(   jcolor0color1r   s     r"   r*   z/shape_sweep_gradient_as_mesh.<locals>.<genexpr>  s1      EVF1IVAY!6! ;;EVs   !)r   rB  rC  rD  r0   r   r   )%r   r5   r   r   r   pir   rs   rr   rZ   r^   r+   rO   r   max_distance_to_pointwidthheightr_   r  rY   r\   r]   r  r   r.   rq   r   r   r[   r   r   r0   ceilr-   cossinr   )Mr  r  r  r  r=   r  rB  r  r  rb   
norm_stopsfirst_cr   rC  deltara   r7   base_segments	max_angler_outerr_innerend_modwrapsprogress_candidates
tile_count	remaindertilebase_progressportiontail_lengthseam_epsprogress_nodesr  	span_pluslimit_thetar  fan_line_rawr  rawmappedrk   fan_line	pad_colorinsertedsamplesstart_color_componentsrc   theta0theta1delta_thetasplitss
base_colorrD  
tri_colors
theta_prev
color_prevx_prev_innery_prev_innerx_prev_outery_prev_outer
theta_next
color_nextx_next_innery_next_innerx_next_outery_next_outerr  r  r  r  r  rf   r  r  r   r  sM     `  `                                                             @@@@@@@@@@r"   r  r    s	     'u-Az1mAG':&"
	GY	'!
"

-C#Ee$s{!*KY1;<v1sQwl
<N+"//s;5DT3JD#j/B"67B)U=11IC	477S=1477U?CI((R0GDJJ$u-@'AA  G
 		+s+I3S	ii	D(#.G}3$$T3/GGi4GE,::4E9_+M  4"(+uTZZ
T 123JZ$..I  C0	j!tDAq&&}q4x'?@  "
 3d""T)DAq**1g6&&}q4x'?@  	"":."":.,0009P*t+S1&&3
''zB&&}5''S9((
C++M4@D4K!9!9:$~'?'??]*^-E-EEH
 **8S9#**=8+CD"$N'n228^B=OP!)N2!!(+	 ( z*	^		!nQ/*<=D I --i=K-K&E &e & &P BDL"((:>+++J=!5!9!99h&)04443JS3#:C3F]3FZ0UC/0 #" :<-111'!M1 OA&	!-E3OOUEN+ 4 4UK H)A)A!A9 MN	 ".
 OO[>+C+CCYOP<HIL'8q%UENLI57G']1-44x{#X*+C%c]NFF%cAg.NFF 6/K((c:#)6"2GBKNNFF#3444V[I//C		+	*A BCDF1fqj)J[0 EJ:EV  u~. * ,, 7|q"*A'/Xa[^Z]15E5L5L
JZ,
 	  	  %QZJ
$((:"666L$((:"666L$((:"666L$((:"666L")!"+
JGdhhz&:::Gdhhz&:::Gdhhz&:::Gdhhz&:::|,|,|,	
 	:z:>?|,|,|,	
 	:z:>?!+ZJ
%1<l%1<l5 #.8  k =P Js   d:e rT  rV  x2y2c           
         |st        d      t        j                  |      }t        |d      \  }}}	|t        j                  k(  s|G|D 
cg c]  \  }}
|
	 }}}
|dd D cg c]  \  }}|	 }}}t        | |||||dd      }|	|_        |S |	duxr t        |	      dk\  }|r|	n|}|J |d	   d	   }|d   d	   }t        ||z
  t        j                        }t        j                  |d
      rd
}d}|}|j                  | |||      \  }}}t        j                  |d
      r%|d	   d   |d   d   }}t        | |||||gg dd      S ||z  }||z  }t        j                  ||z
  |z        dz
  }t        j                  ||z
  |z        dz   }g }t!        ||dz         D ]w  }||z  }|t        j"                  k(  s|dz  d	k(  r!|D ]  \  } }!|j%                  || z   |!f        Dt'        |      D ]&  \  } }!||z   |z   | |z
  z
  }"|j%                  |"|!f       ( y t        |d      }#||#z
  }$||#z   }%|D &'cg c]5  \  }&}'t        j(                  |&|$      rt        j                  |&|%      r|&|'f7 c}'}&xs |}(|(d	   d	   })|(d   d	   }*t        |*|)z
  t        j                        }+|(D &'cg c]  \  }&}'|&|)z
  |+z  |'f },}&}'|)}-|)|+z   }.| |-|| z
  z  z   }/||-||z
  z  z   }0| |.|| z
  z  z   }1||.||z
  z  z   }2t+        |,      }3|3D 'cg c]  \  }}'|'	 }4}}'|3dd D 5cg c]  \  }5}|5	 }6}5}t        |/|0|1|2|4|6dd      }|	|_        |S c c}
}w c c}}w c c}'}&w c c}'}&w c c}'}w c c}}5w )z
    Create a linear gradient for a shape with SVG-like stops (offset in [0,1]).
    REPEAT/REFLECT are implemented by expanding stops to cover the bbox projection.
    r@   Tr;   Nr   rG   )r0  r1  r2  r3  r0   r   r   r   rL   r   ri   rK   F)r,   r   r  r   r   r/  r  r+   r^   r   r_   r]   project_interval_on_axisr   r   r  r.   r   rq   reversedr\   r   )7rT  rV  r  r  r=   r  rB  rb   normalized_stopsr  rk   r0   offsetr   gradientuse_raw_period
tile_stops
base_startbase_end	base_spantmintmaxLrH   rI   	tmin_norm	tmax_norm
start_tileend_tileexpandedkshiftra   rw   mirroredmarginr   r   r  r7   clippeds0sNrf   renormlam0lam1nx1ny1nx2ny2mergedlinear_gradient_colorsolinear_gradient_boundss7                                                          r"   shape_linear_gradientr    sP    899(//>M%4Ut%L"A,000DL
 )99(8HAu%(89*:1R*@A*@YVQ&*@A!	
 ' d*Bs9~/BN,2BJ!!!Aq!J"~a HHz)>+C+CDI  C0
	%
11"b"bAMD$  C(!!$Q')9")=a)@B8	
 		
 qIqIY3y@AAEJyy)j0I=>BH68H:x!|,I0777AEa<$3C 01 % #:.3 :-	9Q^L30 / - C FFAFA FQ''1-.2K2KAq2Q 
A  
	  
AB	QBrBw001D189v1B$"F9 D9D
trBw
C
trBw
C
trBw
C
trBw
C #6*F,23FDAqaF3,21RL9LDAqaL9%%	H #HOO :AB : 49s$   M%M6:M*MMM$ri   rfxfyfrc	                    78 |st        d      t        j                  |      }t        |d      \  }	}
}dk  rt        d      dk  rd kD  r|t        j                  k(  s|I|
D 	cg c]  \  }	}|	 }}	}|
dd	 D 	cg c]  \  }}	|	 }}}	t         ||dd

      }||_        |S |duxr t        |      dk\  }|r|n|
}|J |d   d   8|d	   d   }t        |8z
  t        j                        7t        j                  7d      rd8d7|
}t        j                        rI|
D 	cg c]  \  }	}|	 }}	}|
dd	 D 	cg c]  \  }}	|	 }}}	t         ||dd

      }||_        |S dt        dt        f78fd}dt        dt        t        t        t        f   f fd}|}|[d}t        |      D ]C  }	 ||      } ||      \  }}}t        j                  |j!                  ||      |      r n|7z  }E ||7z  z   }d}||kD  rt#        j$                  ||z
  7z        }g }t        |dz         D ]w  }|7z  }|t        j&                  k(  s|dz  dk(  r!|D ]  \  } }!|j)                  || z   |!f        Dt+        |      D ]&  \  } }!|8z   7z   | 8z
  z
  }"|j)                  |"|!f       ( y |s|dd }|7z   dz   }#|D $cg c]  }$|$d   |#k  s|$ }}$|d   d   }%|d	   d   }&t        |&|%z
  t        j                        }'|D ()cg c]  \  }(})|(|%z
  |'z  |)f }*}(}) ||%      }+ ||&      }, ||+      \  }-}.}/ ||,      \  }0}1}2t-        |*      }3|3D 	)cg c]  \  }	})|)	 }4}	})|3dd	 D 5	cg c]  \  }5}	|5	 }6}5}	t        |-|.|/|0|1|2|4|6dd

      }||_        |S c c}}	w c c}	}w c c}}	w c c}	}w c c}$w c c})}(w c c})}	w c c}	}5w )a  
    Create a radial gradient for a shape with SVG-like stops (offset in [0,1]).
    - (cx, cy, r): outer circle
    - (fx, fy, fr): focal/inner circle (defaults to center with radius 0)
    REPEAT/REFLECT are implemented by expanding stops to cover the bbox projection.
    r@   Tr;   r   zOuter radius r must be >= 0ri   Nr   rG   )
r:  r;  r<  r=  r>  r?  r0   r   r   r   rL   rK   sigmar   c                     | z
  z  S r   r    )r  r  r  s    r"   sigma_to_lambdaz.shape_radial_gradient.<locals>.sigma_to_lambda  s    
"i//r$   lamc                 P    t        |       t        |       t        |       fS r   r'   )r  r  r  r
  r  r	  r  s    r"   	circle_atz(shape_radial_gradient.<locals>.circle_at  s1    RRQ
 	
r$      r   F)r,   r   r  r   r   r9  r  r+   r^   r   r_   r]   r[   rO   r-   r.   r  r   r  r   rq   r  r   )9r  r  r  r=   r  r	  r
  r  rB  rb   r  r  rk   r0   r  r   r  r  r  r  r  r  target_sigma	max_tilesr  cx_lamcy_lamr_lamtiles_neededr  r  r  ra   rw   r  
clip_limitpairr  r  rf   r  r7   r  r  r  rq  rr  srexeyerr  radial_gradient_colorsr  radial_gradient_boundsr  r  s9   ``` ```                                                @@r"   shape_radial_gradientr!  f  s   " 899(//>M%4Ut%L"A1u677	Av	z	z	Av,000DL
 )99(8HAu%(89*:1R*@A*@YVQ&*@A! "
 ' d*Bs9~/BN,2BJ!!!Aq!J"~a HHz)>+C+CDI  C0
	%
 Ar"(89(8HAu%(89*:1R*@A*@YVQ&*@A! "
 '0u 0 0
u 
ueU':!; 
 
 L	y!A!,/C$-cN!FFE((**66:E I%L " $i)&;;LLhyy,"9Y!FG*,H<!#$I0777AEa<$3C 01 % #:.3 :-	9Q^L30 / % a= 	)D0J!)CT!W
-BHC	!QB	"aBrBw001D19:v1B$"F:2D2D4JBB4JBB #6*F,23FDAqaF3,21RL9LDAqaL9%%H #HOy :A> :Ax D
 ; 49s6   <N9N?OO O.O&O5OO")T)Nr  )<r   r   rj  abcr   typingr   r   r   r   drawing_primitivesr	   r
   r   r   r   r   r   r   enumsr   syntaxr   r   r   r   utilr   r   r   drawingr   rO   r#   r-   r/   r,  r   r:   r   r   r   r   r   r   r   r   r   r   r   r   r/  r9  r   r~  r  r  r   r  r!  r    r$   r"   <module>r)     ss      ; ;	 	 	 ( ? ? < <$E e  % =UCZ="5#:.=38=
5#:=U c4;>N8O & "F0 	F0E%ucz!2234F0F0 	F0
 3U5%<()8Due|9L4M+NNOF0RE%ucz!2234eE5,,-.<&% &!5 &% &	!$uUE\23 	! 	!%s
BS 	!%u%&	%u
+$i +$\I .		 	GI G,%i %PD*s D*N6X 6r<X <~\" \~L#I L#n #!&``` ` 	`
 E%ucz!2234` (` ` sm` ` `R	 7K6N6N$(@@@ 	@ 		@
 E%ucz!2234@ -s23@ =
!@ @P 6J6N6N$(eee e E%ucz!2234	e
 	e 	e 	e -s23e =
!e er$   