
    i92i                        S r SSKrSSKrSSKJr  SSKJrJrJrJ	r	J
r
  SSKJrJrJrJrJr  SSKJr  SSKJrJrJrJr  SS	KJr  \
\\\4   r\(       a  SS
KJr  SrS\S\S\S\4S jrS\	\S4   S\	\S4   S\S\	\S4   4S jr S\\   S\	\!\\   4   4S jr" SNSS.S\\	\\
\\!4   4      S\#S\#S\
\	\!\\	\\4      4   \	\!\\	\\4      \\	\\4      4   4   4S jjjr$S\\	\\
\\!4   4      S\\	\\
\\!4   4      4S jr%S\S\S\4S jr&S \\	\\4      S\S\	\S4   4S! jr'S \\	\\4      S\\	\\4      4S" jr( " S# S$\5      r) " S% S&\5      r* " S' S(\5      r+ " S) S*\5      r, " S+ S,\5      r- " S- S.\5      r. " S/ S0\.5      r/ " S1 S2\.5      r0 " S3 S4\5      r1 " S5 S6\5      r2SS7S8.S9\S:\S;\S<\S\\	\\
\\!4   4      S=\S>S?S@\\3   SA\S\14SB jjr4\Rj                  S4SC\SD\SE\SF\S\\	\\
\\!4   4      S=\
\\!4   S>\S?   S\/4SG jjr6SSSH\Rj                  S4S9\S:\SI\S\\	\\
\\!4   4      SJ\\   SK\\   SL\S=\
\\!4   S>\S?   S\04SM jjr7g)Ozx
Handles the creation of patterns and gradients

Usage documentation at: <https://py-pdf.github.io/fpdf2/Patterns.html>
    N)ABC)TYPE_CHECKINGListOptionalTupleUnion   )
DeviceCMYK
DeviceGray	DeviceRGB	Transformconvert_to_device_color)GradientSpreadMethod)NamePDFArray	PDFObjectPDFContentStreamformat_number)BoundingBoxg&.>abtreturnc                     XU -
  U-  -   $ N r   r   r   s      F/home/james-whalen/.local/lib/python3.13/site-packages/fpdf/pattern.pylerpr        s    A{?    .c                    ^ ^^ [        T 5      [        T5      :w  a  [        S5      e[        U UU4S j[        [        T 5      5       5       5      $ )Nz!Mismatched color component countsc              3   J   >#    U  H  n[        TU   TU   T5      v   M     g 7fr   r    ).0ir   r   r   s     r   	<genexpr>lerp_tuple.<locals>.<genexpr>)   s%     <madAaD!$$ms    #)len
ValueErrortupleranger   s   ```r   
lerp_tupler-   $   s:     1vQ<==<eCFm<<<r!   colorsc                    U  Vs1 s H  n[        U5      R                  iM     nnSU;   a  [        U5      S:  a  [        S5      eUSS1:X  aV  U  Vs/ s HE  n[	        U[
        5      (       a+  [        UR                  UR                  UR                  5      OUPMG     nnSU4$ US1:X  a  SU 4$ US1:X  a  SU 4$ SU 4$ s  snf s  snf )Nr
   r	   'Can't mix CMYK with other color spaces.r   r   )type__name__r)   r*   
isinstancer   r   g)r.   ckindspromoteds       r   pick_colorspace_and_promoter8   ,   s    '-.v!T!WvE.uUaBCC{++ SY
RXQ
1j(A(AIacc133$qHRX 	 
 H$$V##F"" /

s   B>ACF
return_rawstopscoerce_to_devicer:   c                  ^^^ U (       d  [        S5      e/ nU  HG  u  pE[        U5      nU(       a  [        US5      (       d  [        U5      OUnUR	                  Xg45        MI     UR                  S S9  / mU HB  u  phT(       a$  [        TS   S   U-
  5      [        ::  a  Xh4TS'   M0  TR	                  Xh45        MD     S[        S[        S	[        S
[        4S jmS[        S
S4UU4S jjn	U	" S5        U	" S5        / n
T H+  u  phUS:  a  SnOUS:  a  SnOUnU
R	                  X45        M-     U
R                  S S9  / nU
 HB  u  pU(       a$  [        US   S   U-
  5      [        ::  a  X4US'   M0  UR	                  X45        MD     [        U5      S:X  a  US   u  pSU4SU4/nO[        US   S   S-
  5      [        :  a  UR                  SSUS   S   45        OSUS   S   4US'   [        US   S   S-
  5      [        :  a  UR	                  SUS   S   45        OSUS   S   4US'   [        U VVs/ s H  u  pUPM	     snn5      u  mn[        X5       VVVs/ s H  u  u  poU4PM     nnnnU(       d  TUS4$ S[        S
[        4U4S jjnT VVs/ s H  u  pUU" U5      4PM     nnnTUU4$ s  snnf s  snnnf s  snnf )af  
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 requiredr.   c                     U S   $ Nr   r   r   s    r   <lambda>!normalize_stops.<locals>.<lambda>[   s    1Q4r!   keyr   c0c1r   r   c                    U R                   nUR                   n[        X4U5      n[        U SS 5      n[        USS 5      nS nUc  Ub)  [        Uc  SO
[	        U5      Uc  SO
[	        U5      U5      n[        U [        5      (       a  [        US   U5      $ [        U [        5      (       a  [        US   US   US   U5      $ [        U [        5      (       a  [        US   US   US   US   U5      $ U $ )Nr         ?r   r	         )	r.   r-   getattrr    floatr3   r   r   r
   )	rG   rH   r   comps0comps1blendeda0a1alphas	            r   _lerp_color$normalize_stops.<locals>._lerp_colord   s    VQ/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           
        > T(       d  g U TS   S   [         -
  :  d  U TS   S   [         -   :  a  g T H  u  p[        X-
  5      [         ::  d  M    g    [        S[        T5      5       Hh  nTUS-
     u  pETU   u  pgU[         -
  U s=::  a  U[         -   ::  d  M1  O  M5  [	        Xd-
  [         5      nX-
  U-  n	TR                  X0T
" XWU	5      45          g    g )Nr   rF   r	   )	TOLERANCEabsr,   r)   maxinsert)rW   u_idxu0rG   u1rH   spanr   rU   
merged_raws             r   _ensure_stop%normalize_stops.<locals>._ensure_stopx   s    Z]1%	11
2q)I55DA1:)+  C
O,Ca(FB_FBI~92	>9927I.[D(!!#BA0F'GH -r!           rJ   c                     U S   $ r@   r   rA   s    r   rB   rC      s    qtr!   r	   colorc                   > TS:X  a\  [        U [        5      (       a  U $ [        U [        5      (       a  U R                  5       $ [        U [        5      (       a  [        S5      eTS:X  aW  [        U [        5      (       a  U $ [        U [        5      (       a+  [        U R                  U R                  U R                  5      $ U $ )Nr   z&Can't mix CMYK with non-CMYK gradientsr   )r3   r   r   to_grayr
   r*   r4   )rh   
space_names    r   promote_raw$normalize_stops.<locals>.promote_raw   s    %%,,%++}}&%,, !IJJ$%++%,, %''577;;r!   )r*   rN   hasattrr   appendsortrZ   rY   Colorr)   r\   r8   zip)r;   r<   r:   raw_entriesoffcolraw_ur5   rh   rd   clamped_entriesr]   merged_clampedr^   palettep
normalizedrl   raw_promotedrU   rc   rk   s                      @@@r   normalize_stopsr}   =   s   $ 899-/Kc
 !h)?)? $C( 	

 	E:&  (,.J##jnQ/%78IE#^JrNun-	 $ 5 U u (U t  ( 13O"3;AS[AAz* # ^,02N#c."4Q"7!";<	I"#N2!!1*-	 $ >a!!$,e5~a #c)*Y6!!!c>!+<Q+?%@A!$nQ&7&: ;N1~b!!$s*+i7!!3r(:1(=">?"%~b'9!'<!=N25^6T^TQq^6TUJ*-n*FG*FYVaQa&*FJG:t++5 U  ?IIj
QE*+jLIz<//- 7UG( Js   :J;
"KKpairsc           	         / nU  H  u  p#U(       a  [        US   S   U-
  5      [        ::  a  US   u  pEXS:X  a  X#4US'   M<  [        [        S-  S5      nXF-
  nU[        * :  a  Xu4US'   UR                  X#45        Mx  X&-   nUS:  a   Sn[        S[	        XHU-
  5      5      U4US'   OXE4US'   UR                  X45        M  UR                  X#45        M     U$ )NrF   r   
   ư>rJ   rf   )rZ   rY   r[   ro   min)	r~   outr]   ru   prev_uprev_colstepnudged_prevnudgeds	            r   merge_near_duplicatesr      s     24C3s2wqzA~&)3"2wF(By2~t,D -Kyj(&1B

A8$C< F"3FTM(BCXNCG%0CG

F=)JJx - . Jr!   r]   methodc                     U[         R                  :X  a  U S:  a  S$ U S:  a  S$ U $ U[         R                  :X  a  U [        R                  " U 5      -
  $ U S-  nUS::  a  U$ SU-
  $ )u*   Map u∈R -> [0,1] via PAD/REPEAT/REFLECT.rf   rJ          @)r   PADREPEATmathfloor)r]   r   vs      r   
spread_mapr      sm    %)))#gs8!c'38q8%,,,4::a=  	CAS1%cAg%r!   stops01c                    [        S[        U 5      5       HZ  nX   u  p4X[        -   ::  d  M  XS-
     u  pV[        X5-
  [        5      nX-
  U-  n[	        UR
                  UR
                  U5      s  $    U S   S   R
                  $ )zTPiecewise-linear sampling in [0,1]. Assumes normalized/sorted stops incl. endpoints.r	   rF   )r,   r)   rY   r[   r-   r.   )	r   r]   r&   ra   rH   r`   rG   rb   r   s	            r   sample_stopsr      s}    1c'l#YU^FBrw	*D4AbiiA66 $ 2;q>   r!   c                 z    / nU  H2  u  p#[        USS5      nUR                  X$c  SO
[        U5      45        M4     U$ )u5   Return [(u, a)] with a∈[0,1]; missing alpha => 1.0.r   NrJ   )rM   ro   rN   )r   r   r]   r5   r   s        r   extract_alpha_stopsr      sC     &(CAsD!

AisU1X67  Jr!   c                      ^  \ rS rSrSrSU 4S jjr\S\4S j5       r\S\4S j5       r	SS jr
S\4S jrS	\SS
4S jrS\4S jrSrU =r$ )Patterni  z
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.
c                    > [         TU ]  5         [        S5      U l        SU l        Xl        [        R                  " 5       U l        SU l	        g )Nr   rK   T)
super__init__r   r1   pattern_type_shadingr   identity_matrix_apply_page_ctm)selfshading	__class__s     r   r   Pattern.__init__  s@    O	 ))+  $r!   r   c                 P    U R                   R                  5       R                   S3$ )N 0 R)r   get_shading_objectidr   s    r   r   Pattern.shading  s#    --224778==r!   c                    S[        U R                  R                  5       S[        U R                  R                  5       S[        U R                  R                  5       S[        U R                  R
                  5       S[        U R                  R                  5       S[        U R                  R                  5       S3$ )N[ ])r   r   r   r   r5   defr   s    r   matrixPattern.matrix   s     dllnn-.adllnn0M/NaT\\^^,-Q}T\\^^/L.MQT\\^^,-Q}T\\^^/L.MQP	
r!   c                     Xl         U $ r   r   )r   r   s     r   
set_matrixPattern.set_matrix(  s    r!   c                     U R                   $ r   r   r   s    r   
get_matrixPattern.get_matrix,      ||r!   applyNc                     Xl         g r   r   )r   r   s     r   set_apply_page_ctmPattern.set_apply_page_ctm/  s    $r!   c                     U R                   $ r   r   r   s    r   get_apply_page_ctmPattern.get_apply_page_ctm2  s    ###r!   )r   r   r   r   r1   )r   Gradient)r   r   )r2   
__module____qualname____firstlineno____doc__r   propertystrr   r   r   r   r   boolr   r   __static_attributes____classcell__r   s   @r   r   r     sx    	$ > > > 
 
 
I % % %$D $ $r!   r   c                   <   ^  \ rS rSrSrU 4S jr\S 5       rSrU =r	$ )Type2Functioni6  zTransition between 2 colorsc                 Z  > [         TU ]  5         SU l        SU l        U R	                  U5      nU R	                  U5      n[        U5      [        U5      :w  a  [        S5      eSSR                  S U 5       5       S3U l        SSR                  S U 5       5       S3U l	        S	U l
        g )
NrK   [0 1]z6Type2Function endpoints must have same component countr   r   c              3   8   #    U  H  n[        U5      v   M     g 7fr   r   r%   r5   s     r   r'   )Type2Function.__init__.<locals>.<genexpr>B       <A}Q//   r   c              3   8   #    U  H  n[        U5      v   M     g 7fr   r   r   s     r   r'   r   C  r   r   r	   )r   r   function_typedomain_get_color_componentsr)   r*   joinrG   rH   n)r   color_1color_2rH   c2r   s        r   r   Type2Function.__init__9  s    ''0''0r7c"gUVVchh<<<=Q?chh<<<=Q?r!   c                 ^    [        U[        5      (       a  UR                  /$ UR                  $ r   )r3   r   r4   r.   )clsrh   s     r   r   #Type2Function._get_color_componentsF  s%    eZ((GG9||r!   rG   rH   r   r   r   )
r2   r   r   r   r   r   classmethodr   r   r   r   s   @r   r   r   6  s    %  r!   r   c                   8   ^  \ rS rSrSrS\S\4U 4S jjrSrU =r$ )Type2FunctionGrayiM  u@   1‑channel exponential interpolation for alpha/luminance ramps.g0g1c                    > [         TU ]  5         SU l        SU l        S[	        U5       S3U l        S[	        U5       S3U l        SU l        g )NrK   r   r   r   r	   )r   r   r   r   r   rG   rH   r   )r   r   r   r   s      r   r   Type2FunctionGray.__init__P  sP    mB'(*mB'(*r!   r   )	r2   r   r   r   r   rN   r   r   r   r   s   @r   r   r   M  s    J5 e  r!   r   c                   <   ^  \ rS rSrSrU 4S jr\S 5       rSrU =r	$ )Type3FunctioniY  zWhen multiple colors are used, a type 3 function is necessary to stitch type 2 functions together
and define the bounds between each color transitionc                    > [         TU ]  5         SU l        SU l        Xl        SSR                  S U 5       5       S3U l        SSR                  S U 5       5       S3U l        g )NrL   r   r   r   c              3   8   #    U  H  n[        U5      v   M     g 7fr   r   )r%   bounds     r   r'   )Type3Function.__init__.<locals>.<genexpr>c  s     "LVE=#7#7Vr   r   c              3   &   #    U  H  nS v   M	     g7f)z0 1Nr   )r%   r^   s     r   r'   r   d  s     "<)Q5)s   )r   r   r   r   
_functionsr   boundsencode)r   	functionsr   r   s      r   r   Type3Function.__init__]  sb    ##(("LV"LLMQO#(("<)"<<=Q?r!   c                 N    SSR                  S U R                   5       5       S3$ )Nr   r   c              3   >   #    U  H  oR                    S 3v   M     g7f)r   N)r   )r%   r   s     r   r'   *Type3Function.functions.<locals>.<genexpr>h  s     C?attfDM?s   r   )r   r   r   s    r   r   Type3Function.functionsf  s%    388C4??CCDAFFr!   )r   r   r   r   r   )
r2   r   r   r   r   r   r   r   r   r   r   s   @r   r   r   Y  s$    ;@ G Gr!   r   c                      ^  \ rS rSrS\S\\   S\S\\	   S\\
\\4      S\S\4U 4S	 jjr\S
\4S j5       rS rSS jrSrU =r$ )Shadingik  shading_type
backgroundcolor_spacecoordsr   extend_beforeextend_afterc                   > [         TU ]  5         Xl        U(       a&  SSR                  S UR                   5       5       S3OS U l        [        U5      U l        X@l        XPl	        SU(       a  SOS SU(       a  SOS S3U l
        SU l        g )Nr   r   c              3   8   #    U  H  n[        U5      v   M     g 7fr   r   r   s     r   r'   #Shading.__init__.<locals>.<genexpr>y       E3Daq))3Dr   r   truefalseT)r   r   r   r   r.   r  r   r  r  r   extend
anti_alias)	r   r   r  r  r  r   r  r  r   s	           r   r   Shading.__init__l  s     	(  E:3D3DEEFaH 	
  ,#M&w?q<]d@eefgr!   r   c                 :    U R                   S   R                   S3$ )zHReference to the *top-level* function object for the shading dictionary.rF   r   )r   r   r   s    r   functionShading.function  s!     //"%(()..r!   c                     U R                   $ )zIAll function objects used by this shading (Type2 segments + final Type3).)r   r   s    r   get_functionsShading.get_functions  s    r!   c                     U $ )z1Return self, as this is already a shading object.r   r   s    r   r   Shading.get_shading_object  s    r!   )r   r  r  r  r  r  r   )r   r   )r2   r   r   r   intr   rq   r   r   rN   r   r   r   r   r   r   r  r  r   r   r   r   s   @r   r   r   k  s     UO 	
 U m]:;<  . /# / / r!   r   c                       \ rS rSrS r\S\\\\\	   4   4S j5       r
S rS rS rS rS\4S	 jrS
 rSS\S   4S jjrSrg)r   i  c                 D   U R                  U5      u  U l        U l        U l        S U l        U(       Ga  [        U[        [        [        [        45      (       a  [        U5      O[        U6 nU R                  S:X  aG  [        U[        5      (       a  UR                  5       nO[        U[        5      (       a  [        S5      eOqU R                  S:X  aa  [        U[        5      (       a,  [        UR                  UR                  UR                  5      nO [        U[        5      (       a  [        S5      eX`l        X0l        X@l        U(       a  UOL[!        [#        U R                  5      S-
  5       Vs/ s H   owS-   [#        U R                  5      S-
  -  PM"     snU l        [#        U R$                  5      [#        U R                  5      S-
  :w  a  [        S5      eU R'                  5       U l        [+        U 5      U l        S U l        S U l        S U l        SU l        g s  snf )Nr   z0Can't mix CMYK background with non-CMYK gradientr   rK   r	   z>Bounds array length must be two less than the number of colorsr   )_convert_colorsr  r.   _alphasr  r3   r   r   r   r
   r   rj   r*   r4   r  r  r,   r)   r   _generate_functionsr   r   pattern_shading_object_alpha_shading_objectr  r   )r   r.   r  r  r  r   bgr&   s           r   r   Gradient.__init__  s   6:6J6J66R3$+t| j3
Iz*RSS (
3,j9  </b),,BJ//$%WXX 0!![0b*--"244rtt4BJ//$%WXX O*(  <A#dkkBRUVBV<WX<Wqq5S-12<WX 	
 t{{s4;;/!33P  113t}#%)" Ys   2'Hr   c                    [        U5      S:  a  [        S5      e/ n[        5       n/ nU H  n[        U[        [
        [        [        45      (       a  [        U5      O[        U6 nUR                  U5        UR                  [        U5      R                  5        [        USS5      nUR                  Ub  [        U5      OS5        M     SU;   a  [        U5      S:  a  [        S5      eUS1:X  a  SX$4$ US	S
1:X  aq  / nU He  n	[        U	[
        5      (       a<  UR                  [        U	R                  U	R                  U	R                  5      5        MT  UR                  U	5        Mg     S
X4$ US	1:X  a  S	X$4$ US
1:X  a>  [!        S U 5       5      (       a#  S	U V	s/ s H  oR#                  5       PM     sn	U4$ S
X$4$ S
X$4$ s  sn	f )zXNormalize colors to a single device colorspace and capture per-stop alpha (default 1.0).rK   (A gradient must have at least two colorsr   NrJ   r
   r	   r0   r   r   c              3   @   #    U  H  oR                  5       v   M     g 7fr   )is_achromaticr   s     r   r'   +Gradient._convert_colors.<locals>.<genexpr>  s     6g??$$gs   )r)   r*   setr3   r   r   r   r
   r   ro   addr1   r2   rM   rN   r4   allrj   )
r   r.   ry   spacesalphasrh   dcr   r7   r5   s
             r   r  Gradient._convert_colors  s    v;?GHH E ec:y*%MNN (.,e4 
 NN2JJtBx(()C&AMMam%(=  6!c&kAoFGG l^#00 lK00Ha,,OOIacc133$<=OOA&	 
 00 l^#00 k]"6g666#7%C7aiik7%CVKK// G++	 &Ds   Gc           	         [        U R                  5      S:  a  [        S5      e[        U R                  5      S:X  a'  [        U R                  S   U R                  S   5      /$ [        U R                  5      n/ n[	        US-
  5       H;  nUR                  [        U R                  U   U R                  US-      5      5        M=     UR                  [        US S  U R                  5      5        U$ )NrK   r#  r   r	   )r)   r.   r*   r   r,   ro   r   r   )r   number_of_colorsr   r&   s       r   r  Gradient._generate_functions  s    t{{aGHHt{{q !$++a.$++a.ABBt{{+	'!+,A]4;;q>4;;q1u;MNO -y|T[[ABr!   c                     U R                   $ r   )r   r   s    r   r  Gradient.get_functions  s    ~~r!   c           
         U R                   (       d  U R                   Vs/ s H+  n[        U[        [        45      (       a  [        U5      OUPM-     nn[        U5      S:  a  [        U5      n[        U R                  U R                  U R                  UU R                  U R                  U R                  S9U l         U R                   $ s  snf )Nr	   r   r  r  r  r   r  r  )r  r  r3   r  rN   r   r)   r   r   r   r  r  r   r  r  )r   valuer  s      r   r   Gradient.get_shading_object  s    ## "[[(E )353,(G(Ge$UR(   6{Q!&)#*!..?? ,,.."00!..$D  ###s   2C
c                     U R                   $ r   )r  r   s    r   get_patternGradient.get_pattern  r   r!   c                 :    [        S U R                   5       5      $ )z&True if any stop carries alpha != 1.0.c              3   L   #    U  H  n[        US -
  5      [        :  v   M     g7f)rJ   N)rZ   rY   )r%   r   s     r   r'   %Gradient.has_alpha.<locals>.<genexpr>  s     B\3q3w<)+\s   "$)anyr  r   s    r   	has_alphaGradient.has_alpha  s    BT\\BBBr!   c           	         [        U R                  5      S:  a  [        S5      e[        U R                  5      S:X  a'  [        U R                  S   U R                  S   5      /$ / n[	        [        U R                  5      S-
  5       H;  nUR                  [        U R                  U   U R                  US-      5      5        M=     UR                  [        USS U R                  5      5        U$ )z>Stitched Type2 gray functions mirroring the color ramp bounds.rK   z&Alpha ramp requires at least two stopsr   r	   N)r)   r  r*   r   r,   ro   r   r   )r   r   r&   s      r   _generate_alpha_functions"Gradient._generate_alpha_functions  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!   Nr   c           
         U R                  5       (       d  gU R                  (       d  U R                  bN  [        U R                  [        5      (       a/  [        U R                  5      S:  a  [        U R                  5      nOU R                  n[        U R                  SSUU R                  5       U R                  U R                  S9U l        U R                  $ )zGGrayscale Shading object representing the alpha ramp (for a soft mask).Nr	   r   r4  )r>  r  r  r3   listr)   r   r   r   rA  r  r  )r   r^   r  s      r   get_alpha_shading_object!Gradient.get_alpha_shading_object"  s    ~~))'t{{D11$q(!$++.)0!..(88:"00!..*D& )))r!   )r  r  r  r  r   r  r.   r  r  r  r   r  r   r   )r2   r   r   r   r   r   r   r   r   rN   r  r  r  r   r8  r   r>  rA  r   rE  r   r   r!   r   r   r     sq    %N 1,c4e.D(E 1, 1,f
$&C4 C
*(92E * *r!   r   c                   d   ^  \ rS rSr    SS\S\S\S\S\S\S\S	\\\      4U 4S
 jjjrSr	U =r
$ )LinearGradienti;  from_xfrom_yto_xto_yr.   r  r  r   c
                 H   > [         T
U ]  XVXxU	5        XX4/U l        SU l        g)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.
rK   Nr   r   r  r   )r   rI  rJ  rK  rL  r.   r  r  r  r   r   s             r   r   LinearGradient.__init__<  s+    X 	]&Qt2r!   r  r   NFFNr2   r   r   r   rN   r   r   r   r   r   r   r   s   @r   rH  rH  ;  sr     #"(,.. . 	.
 . . . . e%. .r!   rH  c                   l   ^  \ rS rSr    SS\S\S\S\S\S\S\S	\S
\S\\\      4U 4S jjjrSr	U =r
$ )RadialGradientim  start_circle_xstart_circle_ystart_circle_radiusend_circle_xend_circle_yend_circle_radiusr.   r  r  r   c                 P   > [         TU ]  XxXU5        UUUUUU/U l        SU l        g)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.
rL   NrN  )r   rU  rV  rW  rX  rY  rZ  r.   r  r  r  r   r   s               r   r   RadialGradient.__init__n  s<    ` 	]&Q
 r!   rP  rQ  rR  r   s   @r   rT  rT  m  s     #"(,99 9 #	9
 9 9 !9 9 9 9 e%9 9r!   rT  c                      ^  \ rS rSrSrSSS.S\SSS	\S
\\\\	\	4   \\	\	4   \\	\	4   4      S\\\\	S4   \\	S4   \\	S4   4      S\
S   S\4U 4S jjjrSS jrS\4S jr\S 5       rSrU =r$ )MeshShadingi  zN
PDF Shading type 4 (free-form Gouraud triangle mesh) with per-vertex colors.
NT)r  r  r  bboxr   
comp_count	trianglesr.   .r  rq   r  c                "  > [        S5      U l        SU l        [        U5      U l        U(       a&  SSR	                  S UR
                   5       5       S3OS U l        X l        X@l        XPl	        Xpl
        X0l        SU l        SU l        SU l        UR                  UR                   UR"                  UR$                  /S	S
/U-  Qn['        U V	s/ s H  n	[)        U	5      PM     sn	5      U l        [,        T
U ]]  U R1                  5       SS9  g s  sn	f )Nr      r   r   c              3   8   #    U  H  n[        U5      v   M     g 7fr   r   r   s     r   r'   'MeshShading.__init__.<locals>.<genexpr>  r	  r   r         rf   rJ   T)contentscompress)r   r1   r   r  r   r.   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  r_  r`  ra  r.   r  r  decode_valuesr5  r   s             r   r   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                     U $ r   r   r   s    r   r   MeshShading.get_shading_object  s    r!   c                 H  ^^ U R                   R                  U R                   R                  p!U R                   R                  U R                   R                  pCSU R
                  -  S-
  mT[        X!-
  [        5      -  nT[        XC-
  [        5      -  nSU R                  -  S-
  mU4S jnU4S jnU R                  S:  a  SOSn	SXR                  -  -   n
[        5       n[        U R                  U R                  5       H  u  u  pnu  nnnX4UU4UU44 Hs  u  u  nnn[        U R                  5       Vs/ s H  nU[        U5      :  a  U" UU   5      OSPM!     nnU[         R"                  " U
SU" UX5      U" UX65      /UQ76 -  nMu     M     [%        U5      $ s  snf )	Nr	   c                 Z   > [        [        X-
  U-  5      5      nUS:  a  S$ UT:  a  T$ U$ r@   )r  round)r]   uminscaleuimaxcs       r   q16+MeshShading._encode_stream_raw.<locals>.q16  s5    UAH-./BQ1=BID=2=r!   c                 h   > [        [        [        U 5      T-  5      5      nUS:  a  S$ UT:  a  T$ U$ r@   )r  r}  rN   )r   ivmax_comps     r   q_component3MeshShading._encode_stream_raw.<locals>.q_component  s7    U58h./0BQ1EXHE2Er!   rg  HBz>BHHr   )rj  rq  rr  rs  rt  rn  r[   rY   ro  rm  	bytearrayrr   rk  rl  r,   r)   structpackbytes)r   xminxmaxyminymaxsxsyr  r  comp_fmt
vertex_fmtr   v0v1v2rG   rH   r   xycompsr&   component_bytesr  r  s                          @@r   rv  MeshShading._encode_stream_raw  s   ZZ]]DJJMMdZZ]]DJJMMdT---2CY//CY//000A5	>	F 11A533x*:*::;
k*-doot?T?T*U&LRR,2r2#%(RHr2h!?A #4#3#34#4 ./U^Ka)B4   # v{{4$4$	
 %  "@ +V Sz#s   9&Fc                     / $ )zNType-4 mesh shadings don't use Function objects; return empty list for output.r   )r   s    r   r  MeshShading.get_functions  s	     	r!   )rj  rm  rl  rk  r  r  ro  rn  rp  r  ru  r   r1   )r   r^  )r2   r   r   r   r   r   r  r   r   rN   r   r   r   r   r  rv  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 *LZ E  D  r!   r^  c                      ^  \ rS rSrSrSr\R                  SS4S\S\S\S	\S
\	\
\\\\4   4      S\S\4   S\\   S\4U 4S jjjrS\4S jrSS jrS rSrU =r$ )SweepGradienti  z
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	                 j  > [         T	U ]  5         [        U5      [        U5      sU l        U l        [        U5      [        U5      sU l        U l        XPl        [        [        S5      (       a  [        R                  " U5      O
[        U5      U l        Xpl        Xl        S U l        S U l        S U l        g )Ncoerce)r   r   rN   r  r  r  r  r;   rn   r   r  r  r  r  r  r   r  )
r   r  r  r  r  r;   r  r  r  r   s
            r   r   SweepGradient.__init__  s     	 9eBi+0+=uY?O($.
 +X66 !''6%m4 	
 !#6 "r!   r   c                     U R                    HV  u  p[        US5      (       d  [        U5      OUn[        USS 5      nUc  M5  [	        [        U5      S-
  5      [        :  d  MV    g   g)Nr.   r   rJ   TF)r;   rn   r   rM   rZ   rN   rY   )r   r^   r5   r,  r   s        r   r>  SweepGradient.has_alpha5  sZ    JJDA3:1h3G3G(+QBC&A}U1X^!4y!@	 
 r!   c                 N   UR                   UR                  UR                  UR                  U R                  U R
                  U R                  U R                  U R                  U R                  U R                  R                  4nU R                  b  U R                  U:X  a  U R                  $ X l        [        U R                  U R
                  U R                  U R                  U R                  U R                  UU R                  U R                  S9	U l        U R                  $ )Nr  r_  r  r  )rq  rs  rr  rt  r  r  r  r  r  r  r  r5  r   r  shape_sweep_gradient_as_meshr;   )r   r_  rE   s      r   r    SweepGradient.get_shading_object>  s    GGGGGGGGGGGGNNMM$$$$
 ==$)9)9S)@== 4GGGGNNJJ,,]] $ 8 8

 }}r!   c                    U R                  5       (       d  g [        U R                  5      u  p#n[        U5      nU VVs/ s H  u  pVU[	        U5      4PM     nnnSUR
                  UR                  UR                  UR                  U R                  U R                  U R                  U R                  U R                  U R                  U R                  R                   4n[#        U SS 5      U:X  a  U R$                  $ ['        U R                  U R                  U R                  U R                  UU R                  UU R                  U R                  S9	U l        Xl        U R$                  $ s  snnf )NrT   _alpha_cached_keyr  )r>  r}   r;   r   r   rq  rs  rr  rt  r  r  r  r  r  r  r  r5  rM   r  r  r  )	r   r_  r^   r   alpha01r]   r   
gray_stopsrE   s	            r   rE  &SweepGradient.get_alpha_shading_object\  s9   ~~ (

3A%g.7>?wVaq*Q-(w
? GGGGGGGGGGGGNNMM$$$$
 4,d3s:&&&:GGGGNN,,]] $ 8 8

 "%"""A @s   E,)r  r  r  r   r  r  r  r  r  r  r  r;   )r_  r   r   r^  )r2   r   r   r   r   	__slots__r   r   rN   r   r   r   rq   r   r   r  r   r   r>  r   rE  r   r   r   s   @r   r  r    s    
I* =Q<T<T"&%*## # 	#
 # E%ucz!2234# 3S89# 3-# ## #44 <'# '#r!   r  r  )r  r  r  r  r  r  r  r_  r   r  r  c          
        ^^^C^D^E^F^G^H^I^J^K^L [        U5      u  pn	U
S   S   n[        U[        5      (       a  SnSnO[        U[        5      (       a  SnSnOSnSnS[        R
                  -  mLUT-
  n[        U5      [        ::  a  TLnUS	:  a4  UTsmnU
 VVs/ s H  u  nnS
U-
  U4PM     n
nnU
R                  S S9  U* nU[        :  a  UOTLmH[        THTL5      mEUc  [        S[        U
5      S-  5      nO[        SU5      nTE[        U5      -  n[        [        U[        R
                  S-  5      [        R
                  S-  5      nUR                  X5      n[        [        UR                  UR                  5      [        U5      -  [        5      n[        R                   " TTL5      mJTJS	:  a  TJTL-  mJ[        R                   " TJTH-   TL5      nUS	:  a  UTL-  nTHTL[        -
  :  =(       a    UTJ:  nTHTL[        -
  :  mITLTJ-
  TL-  mGTG[        ::  a  TEmGS	/n[#        [        R$                  " TETH-  5      5      nTEUTH-  -
  nU[        :  a  S	n['        U5       H*  nUTH-  nU
 H  u  pUR)                  UUTH-  -   5        M     M,     US	:  aM  UTH-  nUTH-  nU
 H+  u  pUU[        -   :  a    OUR)                  UUTH-  -   5        M-     UR)                  TE5        OUR)                  TE5        T[*        R,                  :X  a  TI(       d  [        TETH-
  S	5      n[        TGs=:  a  TE[        -   :  a  O  OUR)                  TG5        U[        :  an  TE[        -
  TGs=:  a  TH[        -   :  aS  O  OP[        [        THS-  [        5      TGTH-
  [        -
  TETG-
  [        -
  5      nU[        :  a  UR)                  TGU-
  5        UR                  5         / nU H;  n U(       a   [        U US   -
  5      [        ::  a  U US'   M*  UR)                  U 5        M=     U(       d  S	TE/nO&[        U5      S:X  a  UR)                  US   TE-   5        TJTH-   n!U!TL[        -   :  mFTTG-   n"S[        S[        4UEUFUGUHUIUUUJUL4	S jjn#/ n$U H  n U TE[        -
  :  a*  TI(       d#  TETH[        -   :  a  T[*        R,                  :w  a  M:  TU -   n%U#" U 5      n&T[*        R,                  :X  a  U&S	::  a  S	O	U&S
:  a  S
OU&n'O[/        U&T5      n'[1        U
U'5      n(U$R)                  U%U&U(45        M     U$(       d  / n)OT[*        R,                  :X  a  TI(       d  U(       a  TTG-   n"U$S   S   n*/ n)Sn+U$ HW  u  n%n&n(U)R)                  U%U(45        U+(       a  M#  [        U%U"-
  5      [        ::  d  M;  U)R)                  U%[        -   U*45        Sn+MY     U+(       d  U)R)                  U"[        -   U*45        OU$ V%V	V(s/ s H  u  n%n	n(U%U(4PM     n)n	n%n(/ n,U
S   S   R2                  n-U)(       Ga  U,R)                  U)S   5        ['        [        U)5      S-
  5       H  n.U)U.   u  n/mCU)U.S-      u  n0mDU0U/-
  n1U1[        ::  a$  U,(       a  U0TD4U,S'   OU,R)                  U0TD45        MI  U(       a  U/U"[        -   :  a  U-mCU-mD[        S[#        [        R4                  " U1U-  5      5      5      n2['        SU2S-   5       HC  n3U3U2-  mKU/TKU1-  -   n%[7        UCUDUK4S j['        U5       5       5      n(U,R)                  U%U(45        ME     M     [        U,5      S::  a=  U)(       a  U)S   S   OTn%U)(       a  U)S   S   OU
S   S   R2                  n4U%U44U%TE-   U44/n,/ n5/ n6U,S   u  n7n8U U[        R8                  " U75      -  -   n9UU[        R:                  " U75      -  -   n:U U[        R8                  " U75      -  -   n;UU[        R:                  " U75      -  -   n<U,SS  H  u  n=n>U U[        R8                  " U=5      -  -   n?UU[        R:                  " U=5      -  -   n@U U[        R8                  " U=5      -  -   nAUU[        R:                  " U=5      -  -   nBU5R)                  U9U:4U;U<4UAUB445        U6R)                  U8U8U>45        U5R)                  U9U:4UAUB4U?U@445        U6R)                  U8U>U>45        U=U>n8n7U?U@n:n9UAUBn<n;M     [=        UUUU5U6SSS9$ s  snnf s  sn(n	n%f )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   rL   r
   rc  r   rf   rJ   c                     U S   $ r@   r   rA   s    r   rB   .shape_sweep_gradient_as_mesh.<locals>.<lambda>  s    adr!   rD   Ni   `   rf  g     v@g{Gz?rF   progressr   c                   >	 T[         ::  a  gTU -   nU T[         -
  :  a*  T
[        R                  :X  a  T	(       d  TT[         -   :  a  ggT
[        R                  :X  a  T	(       a  T[         :  a  U T-  $ S$ T(       dJ  [        R                  " UT5      nUS:  a  UT-  nTT-   nUT[         -
  :  a  gX#[         -   ::  a  UT-
  T-  $ g[        T[         5      nX[         -   ::  a  X-  $ gU T-  $ )Nrf   rJ   )rY   r   r   r   fmodr[   )r  theta	angle_mod	end_limitvisible
cover_spancrosses_360seam_progressrb   span_covers_full_circler  r  	start_modtaus        r   raw_from_progress7shape_sweep_gradient_as_mesh.<locals>.raw_from_progress  s    9h&zI--!5!9!99/	!110444&*.*:x$CC IIeS1	s?$I%,	y944I 55%	1T99 -3GY..))$r!   rK   FTc              3   L   >#    U  H  nTU   TU   TU   -
  T-  -   v   M     g 7fr   r   )r%   jcolor0color1r   s     r   r'   /shape_sweep_gradient_as_mesh.<locals>.<genexpr>a  s0      EVF1IVAY!6! ;;EVs   !$)r  r_  r`  ra  r.   r  r  )r}   r3   r   r   r   pirZ   rY   rp   r[   r)   rN   r   max_distance_to_pointwidthheightr  r  r   r,   ro   r   r   r   r   r.   ceilr+   cossinr^  )Mr  r  r  r  r;   r  r_  r  r  r^   
norm_stopsfirst_cr  r`  deltar]   r5   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mappedrh   fan_line	pad_colorinsertedsamplesstart_color_componentsr_   theta0theta1delta_thetasplitss
base_colorra  
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  rb   r  r  r   r  sM     `  `                                                             @@@@@@@@@@r   r  r    s	   " 'u-A1mAG':&&"
	GY	'	'!
"

-C#E
5zYs{!*KY1;<v1sQwl
<N+I%53DT3JD#j/B"67B)U=11IC	477S=1477U?CI((0G#djj$++.7J1KKYWG		+s+I3S	ii	D(#.G}33?":w':E"cIo59_+M	!"(+uTZZ
T 123JZ$..I9	j!tDA&&}q4x'?@  "
 3d""T)DA7Y&&&&}q4x'?@  	"":."":.,0009P*t+S1}=zI'==&&}5)#Y&I	9IID4K+$y0]*Y6H
 )##**=8+CD"$N'c(^B-?"?@IM!)N2!!(+	 ( z*	^		!nQ/*<=D IcIo-K-K$E $e $ $L BDL"
Y..+TI--!5!9!99h&)04443JS3#:C3F]3FZ0UC/0 #" :<-111'!M1 OA&	!-E3OOUEN+8EK$7 8I E!2I >?	 ".
 OO[94i@A<HIL'8q%UENLI57G']1-44x{#X*+C%c]NFF%cAg.NFF 6/Ki'#)6"2GBKNNFF#34+	"99//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l5 #.8  [ =@ Js   ccrr  rt  x2y2c                    U(       d  [        S5      e[        R                  " U5      n[        USS9u  pxn	U[        R                  :X  d  UcG  U VV
s/ s H  u  pzU
PM	     nnn
USS  VVs/ s H  u  pUPM	     nnn[        U UUUUUSSS9nXl        U$ U[        R                  :g  =(       a    U	SL=(       a    [        U	5      S:  nU(       a  U	OUnUS	   S	   nUS   S	   n[        UU-
  [        5      nU[        ::  a  S
nSnUnUR                  XX#5      u  nnnU[        ::  a"  US	   S   US   S   nn[        U UUUUU// SSS9$ UU-  nUU-  n[        R                  " UU-
  U-  5      S-
  n[        R                  " UU-
  U-  5      S-   n/ n[        UUS-   5       H  nUU-  nU[        R                  :X  d	  US-  S	:X  a$  U H  u  n n!UR!                  UU -   U!45        M     MI  [#        U5       H'  u  n n!UU-   U-   U U-
  -
  n"UR!                  U"U!45        M)     M     [        US5      n#UU#-
  n$UU#-   n%U V&V's/ s H+  u  n&n'U$[        -
  U&s=::  a  U%[        -   ::  d  M#  O  M'  U&U'4PM-     sn'n&=(       d    Un(U(S	   S	   n)U(S   S	   n*[        U*U)-
  [        5      n+U( V&V's/ s H  u  n&n'U&U)-
  U+-  U'4PM     n,n&n'U)n-U)U+-   n.U U-X -
  -  -   n/UU-X1-
  -  -   n0U U.X -
  -  -   n1UU.X1-
  -  -   n2[%        U,5      n3U3 VV's/ s H  u  nn'U'PM
     nnn'U3SS  V4Vs/ s H  u  n4nU4PM
     nn4n[        U/U0U1U2UUSSS9nXl        U$ s  sn
nf s  snnf s  sn'n&f s  sn'n&f s  sn'nf s  snn4f )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>   Tr9   Nr	   rF   )rI  rJ  rK  rL  r.   r   r  r  rK   r   rf   rJ   F)r*   r   r  r}   r   rH  	raw_stopsr)   r[   rY   project_interval_on_axisr   r   r  r,   r   ro   reversedr   )5rr  rt  r
  r  r;   r  r_  r^   normalized_stopsr  rh   r.   offsetr   gradientuse_raw_period
tile_stops
base_startbase_end	base_spantmintmaxLrG   rH   	tmin_norm	tmax_norm
start_tileend_tileexpandedkshiftr]   ru   mirroredmarginr   r   r  r5   clippeds0sNrb   renormlam0lam1nx1ny1nx2ny2mergedos5                                                        r   shape_linear_gradientr0    s    899(//>M%4Ut%L"A,000DL
 )99(8HA%(89*:1R*@A*@YV&*@A!	
 '
 	-111 	 T!	 	Na  -2BJAq!J"~a HHz)95II
	%
11""AMD$I~!!$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%%6AqY!)Lq9})L)LAX 	 
 
AB	QBrBw	"D189v1B$"F9 D9D
trw
C
trw
C
trw
C
trw
C #6*F"#FDAqaFF#"1RL)LDAqaLF)	H #OU :AL : $)s0   M+M>"M$M(M%M>MM rf   rfxfyfrc	                   ^ ^^^^^^5^6 U(       d  [        S5      e[        R                  " U5      n[        USS9u  pnTS:  a  [        S5      eTS:  a  SmTc  T mTc  TmTT:  a  TmU[        R                  :X  d  UcJ  U
 V	Vs/ s H  u  pUPM	     nn	nU
SS	  VV	s/ s H  u  pUPM	     nnn	[        TTTT TTUUSSS
9
nUUl        U$ U[        R                  :g  =(       a    USL=(       a    [        U5      S:  nU(       a  UOU
nUS   S   m6US	   S   n[        UT6-
  [        5      m5T5[        ::  a  Sm6Sm5U
n[        TT-
  5      [        ::  aJ  U
 V	Vs/ s H  u  pUPM	     nn	nU
SS	  VV	s/ s H  u  pUPM	     nnn	[        TTTT TTUUSSS
9
nUUl        U$ S[        S[        4U5U64S jjnS[        S[        [        [        [        4   4U UUUUU4S jjnUnUbP  Sn[        U5       H7  n	U" U5      nU" U5      u  nnnUR                  UU5      US-   ::  a    OUT5-  nM9     UUT5-  -   nSnUU:  a  [        R                   " UU-
  T5-  5      n/ n[        US-   5       H  nUT5-  nU[        R"                  :X  d	  US-  S:X  a$  U H  u  n n!UR%                  UU -   U!45        M     MI  ['        U5       H'  u  n n!UT6-   T5-   U T6-
  -
  n"UR%                  U"U!45        M)     M     U(       d  USS nUT5-   S-   n#U V$s/ s H  n$U$S   U#::  d  M  U$PM     nn$US   S   n%US	   S   n&[        U&U%-
  [        5      n'U V(V)s/ s H  u  n(n)U(U%-
  U'-  U)4PM     n*n(n)U" U%5      n+U" U&5      n,U" U+5      u  n-n.n/U" U,5      u  n0n1n2[)        U*5      n3U3 V	V)s/ s H  u  n	n)U)PM
     nn	n)U3SS	  V4V	s/ s H  u  n4n	U4PM
     nn4n	[        U-U.U/U0U1U2UUSSS
9
nUUl        U$ s  snn	f s  sn	nf s  snn	f s  sn	nf s  sn$f s  sn)n(f s  sn)n	f s  sn	n4f )z
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>   Tr9   r   zOuter radius r must be >= 0rf   Nr	   rF   )
rU  rV  rW  rX  rY  rZ  r.   r   r  r  rK   rJ   sigmar   c                    > U T-
  T-  $ r   r   )r6  r  r  s    r   sigma_to_lambda.shape_radial_gradient.<locals>.sigma_to_lambda  s    
"i//r!   lamc                 P   > [        TTU 5      [        TTU 5      [        TTU 5      4$ r   r$   )r:  r  r  r4  r2  r3  r1  s    r   	circle_at(shape_radial_gradient.<locals>.circle_at  s1    RRQ
 	
r!      r   F)r*   r   r  r}   r   rT  r  r)   r[   rY   rZ   rN   r   r,   r  r   r  r   ro   r  r   )7r  r  r1  r;   r2  r3  r4  r  r_  r^   r  r  rh   r.   r  r   r  r  r  r  r8  r<  target_sigma	max_tilesr:  cx_lamcy_lamr_lamtiles_neededr  r   r!  r]   ru   r"  
clip_limitpairr%  r&  rb   r  r5   r'  r(  r)  r  r  srexeyerr.  r/  r  r  s7   ``` ```                                              @@r   shape_radial_gradientrK  (  s   " 899(//>M%4Ut%L"A1u677	Av	z	z	Av,000DL
 )99(8HA%(89*:1R*@A*@YV&*@A! "
 ' 	-111 	 T!	 	Na  -2BJAq!J"~a HHz)95II
	%
 1r6{i(89(8HA%(89*:1R*@A*@YV&*@A! "
 '0u 0 0 0
u 
ueU':!; 
 
 L	y!A!,/C$-cN!FFE))&&9UT\II%L " $i)&;;LLhyy,"9Y!FG68H<!#$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	"D19:v1B$"F:2D2D4JBB4JBB #6*F"#FDAqaFF#"1RL)LDAqaLF)H #HO} :AF :At D
 ; $)s6   OOO%/O+?O1O1 O6O<,P)T)8r   r   r  abcr   typingr   r   r   r   r   drawing_primitivesr
   r   r   r   r   enumsr   syntaxr   r   r   r   utilr   rq   drawingr   rY   rN   r    r-   r   r8   r   r}   r   r   r   r   r   r   r   r   r   r   rH  rT  r^  r  r  r  r   r0  rK  r   r!   r   <module>rS     s      > >  ( ? ? iZ/0$	E e  % =UCZ="5#:.=38=
5#:=U c4;>N8O & "H0 	H0eU5#:../0H0H0 	H0
 	#tE%,'(
()	#tE%,'($uUE\/B*C
CDFH0VeU5#:../0	%uUCZ((
)*<&% &!5 &% &	!$uUE\23 	! 	!%s
BS 	!%u%&	%u
+$i +$\I .		 	GI G$#i #Lg*s g*T/X /d:X :zZ" Zz|#I |#P #!&YYY Y 	Y
 eU5#:../0Y (Y Y smY Y YD	 7K6N6N$(CCC 	C 		C
 eU5#:../0C -s23C =
!C CV 6J6N6N$(ggg g eU5#:../0	g
 	g 	g 	g -s23g =
!g gr!   