
    F j                        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	  SSK
JrJrJr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JrJr  \(       a  SS
KJ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& SKSS.S\\"\ \	\\%4   4      S\'S\'S\"\%\$\"\ \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      r0 " S* S+\5      r1 " S, S-\5      r2 " S. S/\25      r3 " S0 S1\25      r4 " S2 S3\5      r5 " S4 S5\5      r6  SLS6\ S7\ S8\ S9\ S\\"\ \	\\%4   4      S:\S;S<S=\\7   S>\ S\54S? jjr8\Rr                  S4S@\ SA\ SB\ SC\ S\\"\ \	\\%4   4      S:\	\\%4   S;\S<   S\34SD jjr:SSSE\Rr                  S4S6\ S7\ SF\ S\\"\ \	\\%4   4      SG\\    SH\\    SI\ S:\	\\%4   S;\S<   S\44SJ jjr;g)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                     XU -
  U-  -   $ N r   r   r   s      ]/root/GenerationalWealth/GenerationalWealth/venv/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_tupler0   "   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)r1   ckindspromoteds       r"   pick_colorspace_and_promoter;   *   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 HH  u  phT(       a*  [        R                  " TS   S   U5      (       a  Xh4TS'   M6  TR	                  Xh45        MJ     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
 HH  u  pU(       a*  [        R                  " US   S   U5      (       a  X4US'   M6  UR	                  X45        MJ     [        U5      S:X  a  US   u  pSU4SU4/nO[        R                  " US   S   5      (       d  UR                  SSUS   S   45        OSUS   S   4US'   [        R                  " US   S   S5      (       d  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 requiredr1   c                     U S   $ Nr   r    r   s    r"   <lambda>!normalize_stops.<locals>.<lambda>V   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         )	r1   r0   getattrr#   floatr6   r   r   r   )	rJ   rK   r   comps0comps1blendeda0a1alphas	            r"   _lerp_color$normalize_stops.<locals>._lerp_color_   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           
      8  > T(       d  g [         R                  " U TS   S   5      (       d"  [         R                  " U TS   S   5      (       a  g T H"  u  p[         R                  " X5      (       d  M"    g    [	        S[        T5      5       H  nTUS-
     u  pETU   u  pg[         R                  " X5      (       d  M1  [         R                  " X5      (       d  MN  [        Xd-
  [         R                  5      nX-
  U-  n	TR                  X0T
" XWU	5      45          g    g )Nr   rI   r   )r   	less_thangreater_thanequalr/   r,   greater_equal
less_equalmax	TOLERANCEinsert)rZ   u_idxu0rJ   u1rK   spanr   rX   
merged_raws             r"   _ensure_stop%normalize_stops.<locals>._ensure_stops   s    ##JqM!$
 
((B1BCCDA##A..  C
O,Ca(FB_FB++F77N<U<U= = 27N$<$<=[D(!!#BA0F'GH -r$           rM   c                     U S   $ rC   r    rD   s    r"   rE   rF      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   )r6   r   r   to_grayr   r-   r7   )ro   
space_names    r"   promote_raw$normalize_stops.<locals>.promote_raw   s    %%,,%++}}&%,, !IJJ$%++%,, %''577;;r$   )r-   rQ   hasattrr   appendsortr   r^   r	   r,   is_zerorc   r;   zip)r>   r?   r=   raw_entriesoffcolraw_ur8   ro   rk   clamped_entriesrd   merged_clampedre   palettep
normalizedrs   raw_promotedrX   rj   rr   s                      @@@r"   normalize_stopsr   ;   s     899-/Kc
 !h)?)? $C( 	

 	E:&  (,.J#...z"~a/@%HH#^JrNun-	 $ 5 U u (U t  * 13O"3;AS[AAz* # ^,02N#n22>"3Ea3H!LL"#N2!!1*-	 $ >a!!$,e5%%nQ&7&:;;!!!c>!+<Q+?%@A!$nQ&7&: ;N1##N2$6q$93??!!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   K
9K4Kpairsc           	         / nU  H  u  p#U(       a  [         R                  " US   S   U5      (       a  US   u  pEXS:X  a  X#4US'   MB  [        [         R                  S-  S5      nXF-
  n[         R                  " US5      (       a  Xu4US'   UR                  X#45        M  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$ )NrI   r   
   ư>rm   rM   )r   r^   ra   rb   r_   rv   min)	r   outrd   r|   prev_uprev_colstepnudged_prevnudgeds	            r"   merge_near_duplicatesr      s     24C>''B
A66"2wF(B~//"4d;D -K++K==&1B

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

F=)JJx - . Jr$   rd   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.rm   rM          @)r   PADREPEATmathfloor)rd   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       Hs  nX   u  p4[        R                  " X5      (       d  M&  XS-
     u  pV[	        X5-
  [        R
                  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   rI   )r/   r,   r   r`   ra   rb   r0   r1   )	r   rd   r)   rh   rK   rg   rJ   ri   r   s	            r"   sample_stopsr      s    1c'l#$$Q++U^FBrw 8 89D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   NrM   )rP   rv   rQ   )r   r   rd   r8   r   s        r"   extract_alpha_stopsr      sC     &(CAsD!

AisU1X67  Jr$   c                      ^  \ rS rSrSrS\S   4U 4S jjr\S\4S j5       r	\S\4S j5       r
S	\SS 4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.
shading)GradientShadingMeshShadingc                    > [         TU ]  5         [        S5      U l        SU l        Xl        [        R                  " 5       U l        SU l	        g )Nr   rN   T)
super__init__r   r4   pattern_type_shadingr   identity_matrix_apply_page_ctm)selfr   	__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   r8   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$   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_ctm.  s    ###r$   )r   r   r   r   r4   )r5   
__module____qualname____firstlineno____doc__r   r   propertystrr   r   r   r   r   boolr   r   __static_attributes____classcell__r   s   @r"   r   r     s    	$&J K 	$ > > > 
 
 
 y I % % %$D $ $r$   r   c                   ^   ^  \ rS rSrSrS\S\4U 4S jjr\S\S\\	S4   4S	 j5       r
S
rU =r$ )Type2Functioni2  zTransition between 2 colorscolor_1color_2c                 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 )
NrN   [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(   r8   s     r"   r*   )Type2Function.__init__.<locals>.<genexpr>>       <A}Q//   r   c              3   8   #    U  H  n[        U5      v   M     g 7fr   r   r   s     r"   r*   r   ?  r   r   r   )r   r   function_typedomain_get_color_componentsr,   r-   joinrJ   rK   n)r   r   r   rK   c2r   s        r"   r   Type2Function.__init__5  s    ''0''0r7c"gUVVchh<<<=Q?chh<<<=Q?r$   ro   r   .c                 ^    [        U[        5      (       a  UR                  4$ UR                  $ r   )r6   r   r7   r1   )clsro   s     r"   r   #Type2Function._get_color_componentsB  s%    eZ((GG:||r$   rJ   rK   r   r   r   )r5   r   r   r   r   r	   r   classmethodr.   rQ   r   r   r   r   s   @r"   r   r   2  sD    %   % E%*4E  r$   r   c                   8   ^  \ rS rSrSrS\S\4U 4S jjrSrU =r$ )Type2FunctionGrayiI  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 )NrN   r   r   r   r   )r   r   r   r   r   rJ   rK   r   )r   r   r   r   s      r"   r   Type2FunctionGray.__init__L  sP    mB'(*mB'(*r$   r   )	r5   r   r   r   r   rQ   r   r   r   r   s   @r"   r   r   I  s    J5 e  r$   r   c                   h   ^  \ rS rSrSrS\\\\S 4      S\\	   4U 4S jjr
\S\4S j5       rSrU =r$ )	Type3FunctioniU  zWhen 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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 )NrO   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(   re   s     r"   r*   r   d  s     "<)Q5)s   )r   r   r   r   
_functionsr   r   encode)r   r   r   r   s      r"   r   Type3Function.__init__Y  sd    
 	##(("LV"LLMQO#(("<)"<<=Q?r$   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   )r5   r   r   r   r   r   r   r   r   rQ   r   r   r   r   r   r   r   s   @r"   r   r   U  sV    ;@E-1BO"STU@ @ G3 G Gr$   r   c                      ^  \ rS rSrS\S\\   S\S\\	   \-  S\\
\-  \-     S\S\4U 4S	 jjr\S
\4S j5       rS
\\
\-  \-     4S jrSS jrSrU =r$ )r   ik  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   r1   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.rI   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   )r5   r   r   r   intr   r	   r   r   rQ   r   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                   .   \ rS rSrS\\   S\\   S\S\S\\\      4
S jr	\
S\\   S\\\\   \\   4   4S	 j5       rS\\\-  \-     4S
 jrS\\\-  \-     4S jrSS jrS\4S jrS\4S jrS\\\-  \-     4S jr SS\S   S\S   4S jjrSrg)r   i  r1   r
  r  r  r   c                 N   U R                  U5      u  U l        U l        U l        S U l        U(       Ga  [        U[        /[        Q[        Q7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        S U l        g s  snf )Nr   z0Can't mix CMYK background with non-CMYK gradientr   rN   r   z>Bounds array length must be two less than the number of colorsr   )_convert_colorsr  r1   _alphasr
  r6   r   r
   r   r   r   rq   r   r-   r   r7   r  r  r/   r,   r   _generate_functionsr   r   pattern_shading_object_alpha_shading_objectr  r	  	raw_stops)r   r1   r
  r  r  r   bgr)   s           r"   r   Gradient.__init__  s    7;6J6J66R3$+t| j3*J*Jk*JKK (
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}268<"15>B Ys   0'H"r   c                    [        U5      S:  a  [        S5      e/ n[        5       n/ nU H  n[        U[        /[
        Q[        Q7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  a  / nU H|  n	[        U	[        5      (       a<  UR                  [        U	R                   U	R                   U	R                   5      5        MT  [        U	[        5      (       d   eUR                  U	5        M~     S
X4$ US	1:X  a  S	X$4$ US
1:X  ag  U V	s/ s H  n	[        U	[        5      (       d  M  U	PM     n
n	[#        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 s  sn	f )zXNormalize colors to a single device colorspace and capture per-stop alpha (default 1.0).rN   (A gradient must have at least two colorsr   NrM   r   r   r3   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     :k??$$ks   )r,   r-   setr6   r   r
   r   r   rv   addr4   r5   rP   rQ   r   r   r7   allrq   )r   r1   r   spacesalphasro   dcr   r:   r8   rgb_palettes              r"   r$  Gradient._convert_colors  s   
 v;?GHH  "5 E ec%EJ%E%EF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3OOA&  00 l^#00 k]" #,"ajI&>7  , :k:::#;%G;aiik;%GOO// G++, &Hs   H7HH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$ )NrN   r.  r   r   )r,   r1   r-   r   r/   rv   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{{+MO	'!+,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$   r   c           
         U R                   (       d  U R                  c  SOY[        U R                   Vs/ s H+  n[        U[        [
        45      (       a  [        U5      OUPM-     sn5      R                  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 )N r	  r
  r  r  r   r  r  )r(  r  r   r6   r!  rQ   r   	serializer   r	  r
  r  r   r  r  )r   valuer  s      r"   r   Gradient.get_shading_object  s    ## ;;&  &*[[ &1E  *%#u>> *%0!&' &1	 )+  $+!..?? ,,.."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   Z   #    U  H!  n[         R                  " US 5      (       + v   M#     g7f)rM   N)r   r^   )r(   r   s     r"   r*   %Gradient.has_alpha.<locals>.<genexpr>/  s#     J\~++As333\s   )+)anyr%  r   s    r"   	has_alphaGradient.has_alpha-  s    JT\\JJJr$   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.rN   z&Alpha ramp requires at least two stopsr   r   N)r,   r%  r-   r   r/   rv   r   r   )r   r   r)   s      r"   _generate_alpha_functions"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$   Nre   r   c           
         U R                  5       (       d  gU R                  (       d  U R                  bb  [        U R                  [        [
        45      (       a=  [        U R                  5      S:  a$  [        U R                  5      R                  5       nOS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@  r   rA  )rL  r)  r  r6   listr.   r,   r   rB  r   r	  rO  r  r  )r   re   r  s      r"   get_alpha_shading_object!Gradient.get_alpha_shading_object?  s     ~~))'t{{T5M::$q(!$++.88:)0!..(88:"00!..*D& )))r$   )r)  r%  r(  r
  r   r  r1   r  r  r  r   r'  r*  r	  r   r   )r5   r   r   r   r   r   r   r   rQ   r   r   r.   r   rR  r	   r$  r   r   r   r&  r  r   r   rF  rL  rO  rS  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                   t   ^  \ rS rSr    SS\S\S\S\S\\   S\\   S\S	\S
\\	\      4U 4S jjjr
SrU =r$ )LinearGradientiZ  from_xfrom_yto_xto_yr1   r
  r  r  r   c
                 L   > [         T
U ]  XVXxU	5        UUUU4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.
rN   Nr   r   r  r	  )r   rW  rX  rY  rZ  r1   r
  r  r  r   r   s             r"   r   LinearGradient.__init__[  s;    X 	]&Q 	
 	 r$   r  r	  NFFNr5   r   r   r   rQ   r   r   r   r   rR  r   r   r   r   s   @r"   rV  rV  Z  s     ,0#"(,55 5 	5
 5 $5 Z(5 5 5 e%5 5r$   rV  c                   |   ^  \ rS rSr    SS\S\S\S\S\S\S\\   S	\\   S
\S\S\\	\      4U 4S jjjr
SrU =r$ )RadialGradienti  start_circle_xstart_circle_ystart_circle_radiusend_circle_xend_circle_yend_circle_radiusr1   r
  r  r  r   c                 P   > [         TU ]  XxXU5        UUUUUU4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.
rO   Nr\  )r   rc  rd  re  rf  rg  rh  r1   r
  r  r  r   r   s               r"   r   RadialGradient.__init__  sA    ` 	]&Q 
 	 r$   r^  r_  r`  r   s   @r"   rb  rb    s     ,0#"(,;; ; #	;
 ; ; !; $; Z(; ; ; e%; ;r$   rb  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\\\-  \-     4S j5       rSrU =r$ )r   i  zN
PDF Shading type 4 (free-form Gouraud triangle mesh) with per-vertex colors.
NT)r
  r  r  bboxr   
comp_count	trianglesr1   .r
  r	   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         rm   rM   T)contentscompress)r   r4   r	  r  r   r1   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  rl  rm  rn  r1   r
  r  decode_valuesrC  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                   ^^ U R                   R                  U R                   R                  p!U R                   R                  U R                   R                  pCSU R
                  -  S-
  mT[        X!-
  [        R                  5      -  nT[        XC-
  [        R                  5      -  nSU R                  -  S-
  mS[        S[        S[        S[        4U4S jjnS[        S[        4U4S j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   rd   uminscaler   c                 Z   > [        [        X-
  U-  5      5      nUS:  a  S$ UT:  a  T$ U$ rC   )r!  round)rd   r  r  uimaxcs       r"   q16+MeshShading._encode_stream_raw.<locals>.q16  s5    UAH-./BQ1=BID=2=r$   r   c                 h   > [        [        [        U 5      T-  5      5      nUS:  a  S$ UT:  a  T$ U$ rC   )r!  r  rQ   )r   ivmax_comps     r"   q_component3MeshShading._encode_stream_raw.<locals>.q_component  s7    U58h./0BQ1EXHE2Er$   rt  HBz>BHHr   )rw  r~  r  r  r  r{  ra   r   rb   r|  rQ   r!  rz  	bytearrayry   rx  ry  r/   r,   structpackbytes)r   xminxmaxyminymaxsxsyr  r  comp_fmt
vertex_fmtr   v0v1v2rJ   rK   r   xycompsr)   component_bytesr  r  s                          @@r"   r  MeshShading._encode_stream_raw  s   ZZ]]DJJMMdZZ]]DJJMMdT---2C^%=%=>>C^%=%=>>000A5	>5 	> 	>e 	> 	>	F5 	FS 	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   5&G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$   )rw  rz  ry  rx  r  r
  r|  r{  r}  r  r  r	  r4   )r   r   )r5   r   r   r   r   r   r!  rR  r.   rQ   r   r   r   r   r  r  r   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 *LZ E  D 	-"33mC	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SS\S   4S jrSrU =r$ )SweepGradienti1  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   rQ   r  r  r  r  r>   ru   r   r  r  r  r  r  r   r  )
r   r  r  r  r  r>   r  r  r  r   s
            r"   r   SweepGradient.__init__E  s     	 9eBi+0+=uY?O($.
 +X66 !''6%m4 	
 !#6   	 0459r$   r   c                     U R                    H\  u  p[        US5      (       d  [        U5      OUn[        USS 5      nUc  M5  [        R
                  " [        U5      S5      (       a  M\    g   g)Nr1   r   rM   TF)r>   ru   r   rP   r   r^   rQ   )r   re   r8   r7  r   s        r"   rL  SweepGradient.has_alpham  s\    JJDA3:1h3G3G(+QBC&A}^%9%9%(C%H%H	 
 r$   rl  r   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  rl  r  r  )r~  r  r  r  r  r  r  r  r  r  r  rC  r   r  shape_sweep_gradient_as_meshr>   )r   rl  rH   s      r"   r    SweepGradient.get_shading_objectv  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 )NrW   _alpha_cached_keyr  )rL  r   r>   r   r   r~  r  r  r  r  r  r  r  r  r  r  rC  rP   r  r  r  )	r   rl  re   r   alpha01rd   r   
gray_stopsrH   s	            r"   rS  &SweepGradient.get_alpha_shading_object  s@   ~~ (

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

 GGGGGGGGGGGGNNMM$$$$
 4,d3s:&&&:GGGGNN,,]] $ 8 8

 "%"""E7
s   E,)r  r  r  r   r  r  r  r  r  r  r  r>   )rl  r   r   r   )r5   r   r   r   r   	__slots__r   r   rQ   r   r.   r   r	   r   r   r!  r   r   rL  r   rS  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  rl  r   r  r  c	           
      l  ^^^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[        R                  " 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[        R                  " US	5      (       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      -  [        R"                  5      n[        R$                  " TTL5      mJTJS	:  a  TJTL-  mJ[        R$                  " TJTH-   TL5      nUS	:  a  UTL-  n[        R&                  " THTL5      =(       a    UTJ:  n[        R(                  " THTL5      mITLTJ-
  TL-  mG[        R*                  " TGS	5      (       a  TEmGS	/n[-        [        R.                  " TETH-  5      5      nTEUTH-  -
  n[        R*                  " US	5      (       a  S	n[1        U5       H*  nUTH-  nU
 H  u  pUR3                  UUTH-  -   5        M     M,     US	:  a\  UTH-  nUTH-  nU
 H:  u  p[        R                  " UU5      (       a    OUR3                  UUTH-  -   5        M<     UR3                  TE5        OUR3                  TE5        T[4        R6                  :X  Ga4  TI(       Gd,  [        TETH-
  S	5      n[        R                  " TGS	5      (       a-  [        R*                  " TGTE5      (       a  UR3                  TG5        [        R                  " US	5      (       a  [        R&                  " TGTE5      (       a  [        R                  " TGTH5      (       a  [        [        THS-  [        R"                  5      TGTH-
  [        R"                  -
  TETG-
  [        R"                  -
  5      n[        R                  " US	5      (       a  UR3                  TGU-
  5        UR                  5         / nU HA  n U(       a&  [        R8                  " U US   5      (       a  U US'   M0  UR3                  U 5        MC     U(       d  S	TE/nO&[        U5      S:X  a  UR3                  US   TE-   5        TJTH-   n![        R                  " U!TL5      mFTTG-   n"S[        S[        4UEUFUGUHUIUUUJUL4	S jjn#/ n$U H  n [        R(                  " U TE5      (       a9  TI(       d2  [        R                  " TETH5      (       a  T[4        R6                  :w  a  MX  TU -   n%U#" U 5      n&T[4        R6                  :X  a  U&S	::  a  S	O	U&S
:  a  S
OU&n'O[;        U&T5      n'[=        U
U'5      n(U$R3                  U%U&U(45        M     U$(       d  / n)OT[4        R6                  :X  a  TI(       d  U(       a  TTG-   n"U$S   S   n*/ n)Sn+U$ Hg  u  n%n&n(U)R3                  U%U(45        U+(       a  M#  [        R8                  " U%U"5      (       d  MA  U)R3                  U%[        R"                  -   U*45        Sn+Mi     U+(       d$  U)R3                  U"[        R"                  -   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   R>                  n-U)(       Ga5  U,R3                  U)S   5        [1        [        U)5      S-
  5       GH  n.U)U.   u  n/mCU)U.S-      u  n0mDU0U/-
  n1[        R*                  " U1S	5      (       a$  U,(       a  U0TD4U,S'   OU,R3                  U0TD45        M\  U(       a   [        R                  " U/U"5      (       a  U-mCU-mD[        S[-        [        R@                  " U1U-  5      5      5      n2[1        SU2S-   5       HC  n3U3U2-  mKU/TKU1-  -   n%[C        UCUDUK4S j[1        U5       5       5      n(U,R3                  U%U(45        ME     GM     [        U,5      S::  a=  U)(       a  U)S   S   OTn%U)(       a  U)S   S   OU
S   S   R>                  n4U%U44U%TE-   U44/n,/ n5/ n6U,S   u  n7n8U U[        RD                  " U75      -  -   n9UU[        RF                  " U75      -  -   n:U U[        RD                  " U75      -  -   n;UU[        RF                  " U75      -  -   n<U,SS  H  u  n=n>U U[        RD                  " U=5      -  -   n?UU[        RF                  " U=5      -  -   n@U U[        RD                  " U=5      -  -   nAUU[        RF                  " U=5      -  -   nBU5R3                  U9U:4U;U<4UAUB445        U6R3                  U8U8U>45        U5R3                  U9U:4UAUB4U?U@445        U6R3                  U8U>U>45        U=U>n8n7U?U@n:n9UAUBn<n;M     [I        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   rO   r   rp  r   rm   rM   c                     U S   $ rC   r    rD   s    r"   rE   .shape_sweep_gradient_as_mesh.<locals>.<lambda>  s    adr$   rG   Ni   `   rs  g     v@g{Gz?rI   progressr   c                   >	 [         R                  " TS5      (       a  gTU -   n[         R                  " U T5      (       a9  T
[        R                  :X  a$  T	(       d  [         R
                  " TT5      (       a  ggT
[        R                  :X  a  T	(       a#  [         R
                  " TS5      (       a  U T-  $ S$ T(       dh  [        R                  " UT5      nUS:  a  UT-  nTT-   n[         R                  " UT5      (       a  g[         R                  " X#5      (       a  UT-
  T-  $ g[        T[         R                  5      n[         R                  " X5      (       a  X-  $ gU T-  $ )Nrm   rM   )r   r`   r_   r   r   r]   r   fmodr\   ra   rb   )r  theta	angle_mod	end_limitvisible
cover_spancrosses_360seam_progressri   span_covers_full_circler  r  	start_modtaus        r"   raw_from_progress7shape_sweep_gradient_as_mesh.<locals>.raw_from_progress>  s>   $$T3//h&''*==!5!9!99/"//
DAA0444&'5'B'B4'M'MHtOSV  IIeS1	s?$I%,	!++IyAA!,,YBB%	1T99 -)A)ABG((;;))$r$   rN   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>  s0      EVF1IVAY!6! ;;EVs   !$)r  rl  rm  rn  r1   r
  r  )%r   r6   r   r   r   pir   rx   rw   r]   ra   r,   rQ   r   max_distance_to_pointwidthheightrb   r  r\   r_   r`   r!  r   r/   rv   r   r   r^   r   r   r1   ceilr.   cossinr   )Mr  r  r  r  r>   r  rl  r  r  re   
norm_stopsfirst_cr  rm  deltard   r8   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mappedro   fan_line	pad_colorinsertedsamplesstart_color_componentsrf   theta0theta1delta_thetasplitss
base_colorrn  
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  ri   r  r  r   r  sM     `  `                                                             @@@@@@@@@@r"   r  r    s	     'u-A1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((0GDJJ$u-@'AA  G
 		+s+I3S	ii	D(#.G}3$$T3/GGi4GE,::4E9_+M  44"(+uTZZ
T 123JZ$..I  C00	j!tDA&&}q4x'?@  "
 3d""T)DA**1g66&&}q4x'?@  	"":."":.,0009P*t+S1&&3
 
''zBB&&}5''S99((
CC++M4@@D4K!9!9:$~'?'??]*^-E-EEH
 **8S99#**=8+CD"$N'n228^B=OP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+8 4 4UK H 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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l5 #.8  k =P Js    h)h/r  r  x2y2c                 H   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	SL=(       a    [        U	5      S:  nU(       a  U	OUnUc   eUS	   S	   nUS   S	   n[        UU-
  [        R                  5      n[        R                  " US
5      (       a  S
nSnUnUR                  XX#5      u  nnn[        R                  " US
5      (       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 HF  u  n&n'[        R(                  " U&U$5      (       d  M$  [        R                  " U&U%5      (       d  MB  U&U'4PMH     sn'n&=(       d    Un(U(S	   S	   n)U(S   S	   n*[        U*U)-
  [        R                  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
     n4nn'U3SS  V5Vs/ s H  u  n5nU5PM
     n6n5n[        U/U0U1U2U4U6S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n5f )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.
rA   Tr<   Nr   rI   )rW  rX  rY  rZ  r1   r   r  r  rN   r   rm   rM   F)r-   r   r  r   r   rV  r*  r,   ra   r   rb   r`   project_interval_on_axisr   r   r  r/   r   rv   reversedr_   r   )7r  r  r  r  r>   r  rl  re   normalized_stopsr*  ro   r1   offsetr   gradientuse_raw_period
tile_stops
base_startbase_end	base_spantmintmaxLrJ   rK   	tmin_norm	tmax_norm
start_tileend_tileexpandedkshiftrd   r|   mirroredmarginr   r   r  r8   clippeds0sNri   renormlam0lam1nx1ny1nx2ny2mergedlinear_gradient_colorsolinear_gradient_boundss7                                                          r"   shape_linear_gradientr>    sG    899(//>M%4Ut%L"A,000DL
 )99(8HA%(89*:1R*@A*@YV&*@A!	
 ' d*Bs9~/BN,2BJ!!!Aq!J"~a HHz)>+C+CDI  C00
	%
11""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- 	2@2K2KAq2Q 	A  
	  
AB	QBrBw001D189v1B$"F9 D9D
trw
C
trw
C
trw
C
trw
C #6*F,23FDAqaF3,21RL9LDAqaL9%%	H #OO :AB : 49s0   N +N#N>NN#N<NNrm   rfxfyfrc	                 d  ^ ^^^^^^7^8 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SL=(       a    [        U5      S:  nU(       a  UOU
nUc   eUS   S   m8US	   S   n[        UT8-
  [        R                  5      m7[        R                  " T7S5      (       a  Sm8Sm7U
n[        R                  " 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U7U84S jjnS[        S[        [        [        [        4   4U UUUUU4S jjnUnUbc  Sn[        U5       HJ  n	U" U5      nU" U5      u  nnn[        R                  " UR!                  UU5      U5      (       a    OUT7-  nML     UUT7-  -   nSnUU:  a  ["        R$                  " UU-
  T7-  5      n/ n[        US-   5       H  nUT7-  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T8-   T7-   U T8-
  -
  n"UR)                  U"U!45        M)     M     U(       d  USS nUT7-   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%-
  [        R                  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
     n4n	n)U3SS	  V5V	s/ s H  u  n5n	U5PM
     n6n5n	[        U-U.U/U0U1U2U4U6S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	n5f )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.
rA   Tr<   r   zOuter radius r must be >= 0rm   Nr   rI   )
rc  rd  re  rf  rg  rh  r1   r   r  r  rN   rM   sigmar   c                    > U T-
  T-  $ r   r    )rD  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'   )rH  r  r  rB  r@  rA  r?  s    r"   	circle_at(shape_radial_gradient.<locals>.circle_at  s1    RRQ
 	
r$      r   F)r-   r   r  r   r   rb  r*  r,   ra   r   rb   r`   r^   rQ   r.   r/   r  r   r  r   rv   r  r   )9r  r  r?  r>   r@  rA  rB  r  rl  re   r  r*  ro   r1   r  r   r  r  r   r"  rF  rJ  target_sigma	max_tilesrH  cx_lamcy_lamr_lamtiles_neededr+  r,  r-  rd   r|   r.  
clip_limitpairr1  r2  ri   r  r8   r3  r4  r5  r  r  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(8HA%(89*:1R*@A*@YV&*@A! "
 ' d*Bs9~/BN,2BJ!!!Aq!J"~a HHz)>+C+CDI  C00
	%
 Ar""(89(8HA%(89*:1R*@A*@YV&*@A! "
 '0u 0 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   PP	#P<PP0P*P <P&P,)T)Nr  )<r   r   r  abcr   typingr   r   r   r   drawing_primitivesr	   r
   r   r   r   r   r   r   enumsr   syntaxr   r   r   r   utilr   r   r   drawingr   rQ   r#   r.   r0   rR  r   r;   r   r   r   r   r   r   r   r   r   r   r   r   rV  rb  r   r  r!  r  r   r>  r[  r    r$   r"   <module>rc     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$   