
    Rj                        d Z ddlZddlZddlmZ ddlmZmZmZm	Z	 ddl
mZmZmZmZmZmZmZmZ ddlmZ ddlmZmZmZmZ dd	lmZmZmZ erdd
lmZ de de de de fdZ!de"e df         de"e df         de de"e df         fdZ#de$e         de"e%e$e         f         fdZ&	 dMdddee"e e	ee%f         f                  de'de'de"e%e$e"e ef                  ee$e"e ef                           f         fdZ(dee"e e	ee%f         f                  dee"e e	ee%f         f                  fdZ)de dede fdZ*d e$e"e ef                  de de"e df         fd!Z+d e$e"e ef                  de$e"e e f                  fd"Z, G d# d$e          Z- G d% d&e          Z. G d' d(e          Z/ G d) d*e          Z0 G d+ d,e          Z1 G d- d.e          Z2 G d/ d0e2          Z3 G d1 d2e2          Z4 G d3 d4e          Z5 G d5 d6e          Z6	 	 dNd8e d9e d:e d;e dee"e e	ee%f         f                  d<ed=d>d?ee7         d@e de5fdAZ8ej9        dfdBe dCe dDe dEe dee"e e	ee%f         f                  d<e	ee%f         d=ed>         de3fdFZ:dddGej9        dfd8e d9e dHe dee"e e	ee%f         f                  dIee          dJee          dKe d<e	ee%f         d=ed>         de4fdLZ;dS )Ozx
Handles the creation of patterns and gradients

Usage documentation at: <https://py-pdf.github.io/fpdf2/Patterns.html>
    N)ABC)TYPE_CHECKINGOptionalSequenceUnion   )Color
ColorClass
ColorInput
DeviceCMYK
DeviceGray	DeviceRGB	Transformconvert_to_device_color)GradientSpreadMethod)NamePDFArrayPDFContentStream	PDFObject)FloatToleranceNumberClassformat_number)BoundingBoxabtreturnc                     | || z
  |z  z   S N r   r   r   s      M/usr/local/lib/hermes-agent/venv/lib/python3.11/site-packages/fpdf/pattern.pylerpr#      s    A{?    .c                      t                     t                    k    rt          d          t           fdt          t                               D                       S )Nz!Mismatched color component countsc              3   R   K   | ]!}t          |         |                   V  "d S r   r#   ).0ir   r   r   s     r"   	<genexpr>zlerp_tuple.<locals>.<genexpr>'   s7      <<adAaD!$$<<<<<<r$   )len
ValueErrortupleranger!   s   ```r"   
lerp_tupler/   "   sb     1vvQ<===<<<<<<eCFFmm<<<<<<r$   colorsc                     d | D             }d|v r"t          |          dk    rt          d          |ddhk    rd | D             }d|fS |dhk    rd| fS |dhk    rd| fS d| fS )Nc                 6    h | ]}t          |          j        S r    )type__name__r(   cs     r"   	<setcomp>z.pick_colorspace_and_promote.<locals>.<setcomp>+   s!    ...!T!WW...r$   r   r   'Can't mix CMYK with other color spaces.r   r   c                 |    g | ]9}t          |t                    r t          |j        |j        |j                  n|:S r    )
isinstancer   r   gr5   s     r"   
<listcomp>z/pick_colorspace_and_promote.<locals>.<listcomp>0   sK     !
 !
 !
MN
1j(A(AHIac13$$$q!
 !
 !
r$   )r+   r,   )r0   kindspromoteds      r"   pick_colorspace_and_promoter?   *   s    ..v...EuUaBCCC{+++!
 !
RX!
 !
 !
 H$$V##F""r$   TF
return_rawstopscoerce_to_devicerA   c                   | st          d          g }| D ]N\  }}t          |          }|rt          |d          st          |          n|}|                    ||f           O|                    d            g |D ]G\  }}r)t          j        d         d         |          r||fd<   0                    ||f           Hdt          dt          d	t          d
t          fddt          d
dffd}	 |	d            |	d           g }
D ]0\  }}|dk     rd}n|dk    rd}n|}|
                    ||f           1|
                    d            g }|
D ]G\  }}|r)t          j        |d         d         |          r||f|d<   0|                    ||f           Ht          |          dk    r|d         \  }}d|fd|fg}nt          j
        |d         d                   s%|                    dd|d         d         f           nd|d         d         f|d<   t          j        |d         d         d          s$|                    d|d         d         f           nd|d         d         f|d<   t          d |D                       \  }d t          ||          D             }|s|dfS dt          d
t          ffdfdD             }||fS )a~  
    Clamp/sort/merge, ensure endpoints at 0 and 1, coerce to single Device* colorspace.

    When ``return_raw`` is true, also returns a list of the original stop positions
    (prior to clamping to [0,1]) converted to the same device colorspace. The raw
    offsets are sorted and merged (last stop wins for near-duplicates) but no
    implicit 0/1 endpoints are synthesized.
    At least one stop is requiredr0   c                     | d         S Nr   r    r   s    r"   <lambda>z!normalize_stops.<locals>.<lambda>V   s
    1Q4 r$   keyr   c0c1r   r   c                 B   | j         }|j         }t          |||          }t          | dd           }t          |dd           }d }||3t          |dnt	          |          |dnt	          |          |          }t          | t                    rt          |d         |          S t          | t                    r$t          |d         |d         |d         |          S t          | t                    r+t          |d         |d         |d         |d         |          S | S )Nr         ?r   r         )	r0   r/   getattrr#   floatr:   r   r   r   )	rM   rN   r   comps0comps1blendeda0a1alphas	            r"   _lerp_colorz$normalize_stops.<locals>._lerp_color_   s   VVQ//Rd##Rd##>R^zuRyy##rTU E b*%% 	1gaj%000b)$$ 	HWQZWQZGGGb*%% 	Ugaj'!*gaj'!*eTTT	r$   targetNc           
      4   sd S t          j        | d         d                   s!t          j        | d         d                   rd S D ]\  }}t          j        ||           r d S t	          dt                              D ]}|dz
           \  }}|         \  }}t          j        | |          r`t          j        | |          rKt          ||z
  t           j	                  }| |z
  |z  }	
                    ||  
|||	          f            d S d S )Nr   rL   r   )r   	less_thangreater_thanequalr.   r+   greater_equal
less_equalmax	TOLERANCEinsert)r\   u_idxu0rM   u1rN   spanr   r[   
merged_raws             r"   _ensure_stopz%normalize_stops.<locals>._ensure_stops   sY    	F#JqM!$
 
 	(B1BCC	 F 	 	DAq#Av.. C
OO,, 		 		Ca(FB_FB+FB77 N<U= =  27N$<==b[D(!!#BA0F0F'GHHH		 		r$           rP   c                     | d         S rG   r    rH   s    r"   rI   z!normalize_stops.<locals>.<lambda>   s
    qt r$   r   c                     g | ]\  }}|S r    r    r(   rg   r6   s      r"   r<   z#normalize_stops.<locals>.<listcomp>   s    6T6T6TTQq6T6T6Tr$   c                 "    g | ]\  \  }}}||fS r    r    )r(   rf   rg   ps       r"   r<   z#normalize_stops.<locals>.<listcomp>   s$    GGGYVaQ1a&GGGr$   colorc                    dk    rdt          | t                    r| S t          | t                    r|                                 S t          | t                    rt          d          dk    rLt          | t                    r| S t          | t                    r t          | j        | j        | j                  S | S )Nr   z&Can't mix CMYK with non-CMYK gradientsr   )r:   r   r   to_grayr   r,   r;   )rt   
space_names    r"   promote_rawz$normalize_stops.<locals>.promote_raw   s    %%%,, %++ '}}&%,, K !IJJJ$$%++ %,, < %'57;;;r$   c                 0    g | ]\  }}| |          fS r    r    )r(   rf   rt   rx   s      r"   r<   z#normalize_stops.<locals>.<listcomp>   s,    III
EQE**+IIIr$   )r,   rT   hasattrr   appendsortr   r`   r	   r+   is_zerore   r?   zip)rB   rC   rA   raw_entriesoffcolraw_ur6   rt   rm   clamped_entriesrf   merged_clampedpalette
normalizedraw_promotedr[   rl   rx   rw   s                   @@@@r"   normalize_stopsr   ;   s     :8999-/K ' 'Sc

 !)0h)?)?#C((( 	

 	E1:&&&&(((,.J# . .u 	...z"~a/@%HH 	.#U^JrNNuen---- 5 U u    (U t       * LL13O" + +u3;;AAS[[AAA5z****^^,,,02N# . .5 	.n2>"3Ea3H!LL 	."#UN2!!1e*----
>a!!$5,e5%nQ&7&:;; 	<!!!c>!+<Q+?%@AAAA!$nQ&7&: ;N1#N2$6q$93?? 	>!!3r(:1(=">????"%~b'9!'<!=N256T6T^6T6T6TUUJGG#ng*F*FGGGJ ,:t++5 U       JIIIjIIILz<//r$   pairsc           	         g }| D ]\  }}|rt          j        |d         d         |          r|d         \  }}||k    r||f|d<   Bt          t           j        dz  d          }||z
  }t          j        |d          r||f|d<   |                    ||f           ||z   }|dk    r)d}t          dt          |||z
                      |f|d<   n||f|d<   |                    ||f           |                    ||f           |S )NrL   r   
   ư>rn   rP   )r   r`   rc   rd   ra   r{   min)	r   outrf   r   prev_uprev_colstepnudged_prevnudgeds	            r"   merge_near_duplicatesr      sG    24C ! !3 	!>'B
A66 	!"2wFH3c(B~/"4d;;D 4-K+K== 
*&1B

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

FC=))))JJ3x    Jr$   rf   methodc                     |t           j        k    r| dk     rdn	| dk    rdn| S |t           j        k    r| t          j        |           z
  S | dz  }|dk    r|nd|z
  S )u*   Map u∈R -> [0,1] via PAD/REPEAT/REFLECT.rn   rP          @)r   PADREPEATmathfloor)rf   r   vs      r"   
spread_mapr      sp    %)))#ggss!c''33q8%,,,4:a==  	CAS11cAg%r$   stops01c                 H   t          dt          |                     D ]r}| |         \  }}t          j        ||          rP| |dz
           \  }}t	          ||z
  t          j                  }||z
  |z  }t          |j        |j        |          c S s| d         d         j        S )zTPiecewise-linear sampling in [0,1]. Assumes normalized/sorted stops incl. endpoints.r   rL   )r.   r+   r   rb   rc   rd   r/   r0   )	r   rf   r)   rj   rN   ri   rM   rk   r   s	            r"   sample_stopsr      s    1c'll## 7 7B$Q++ 	7QU^FBrBw 899DR4AbiA66666		7
 2;q>  r$   c                     g }| D ]>\  }}t          |dd          }|                    ||dnt          |          f           ?|S )u5   Return [(u, a)] with a∈[0,1]; missing alpha => 1.0.r   NrP   )rS   r{   rT   )r   r   rf   r6   r   s        r"   extract_alpha_stopsr      sZ     &(C 8 81AsD!!

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

    Currently, this class supports only "shading patterns" (pattern_type 2),
    using either a linear or radial gradient. Tiling patterns (pattern_type 1)
    are not yet implemented.
    shading)GradientShadingMeshShadingc                     t                                                       t          d          | _        d| _        || _        t          j                    | _        d| _	        d S )Nr   rQ   T)
super__init__r   r3   pattern_type_shadingr   identity_matrix_apply_page_ctm)selfr   	__class__s     r"   r   zPattern.__init__  sU    OO	 )++  $r$   r   c                 D    | j                                         j         dS )N 0 R)r   get_shading_objectidr   s    r"   r   zPattern.shading  s"    -22447====r$   c                 @   dt          | j        j                   dt          | j        j                   dt          | j        j                   dt          | j        j                   dt          | j        j                   dt          | j        j                   dS )N[ ])r   r   r   r   r6   defr   s    r"   matrixzPattern.matrix  s    Pdln-- P Pdln0M0M P PT\^,,P P/<T\^/L/LP PT\^,,P P/<T\^/L/LP P P	
r$   r   c                     || _         | S r   r   )r   r   s     r"   
set_matrixzPattern.set_matrix$  s    r$   c                     | j         S r   r   r   s    r"   
get_matrixzPattern.get_matrix(  
    |r$   applyNc                     || _         d S r   r   )r   r   s     r"   set_apply_page_ctmzPattern.set_apply_page_ctm+  s    $r$   c                     | j         S r   r   r   s    r"   get_apply_page_ctmzPattern.get_apply_page_ctm.  s    ##r$   )r4   
__module____qualname____doc__r   r   propertystrr   r   r   r   r   boolr   r   __classcell__r   s   @r"   r   r     s        	$&J K 	$ 	$ 	$ 	$ 	$ 	$ > > > > X> 
 
 
 
 X
 y    I    % % % % % %$D $ $ $ $ $ $ $ $r$   r   c                   \     e Zd ZdZdedef fdZededeedf         fd            Z	 xZ
S )	Type2FunctionzTransition between 2 colorscolor_1color_2c                    t                                                       d| _        d| _        |                     |          }|                     |          }t          |          t          |          k    rt          d          dd                    d |D                        d| _        dd                    d |D                        d| _	        d	| _
        d S )
NrQ   [0 1]z6Type2Function endpoints must have same component countr   r   c              3   4   K   | ]}t          |          V  d S r   r   r5   s     r"   r*   z)Type2Function.__init__.<locals>.<genexpr>>  *      <<A}Q//<<<<<<r$   r   c              3   4   K   | ]}t          |          V  d S r   r   r5   s     r"   r*   z)Type2Function.__init__.<locals>.<genexpr>?  r   r$   r   )r   r   function_typedomain_get_color_componentsr+   r,   joinrM   rN   n)r   r   r   rN   c2r   s        r"   r   zType2Function.__init__5  s    ''00''00r77c"ggUVVV?chh<<<<<<<????chh<<<<<<<???r$   rt   r   .c                 J    t          |t                    r|j        fS |j        S r   )r:   r   r;   r0   )clsrt   s     r"   r   z#Type2Function._get_color_componentsB  s&    eZ(( 	G:|r$   )r4   r   r   r   r	   r   classmethodr-   rT   r   r   r   s   @r"   r   r   2  s        %%        % E%*4E    [    r$   r   c                   ,     e Zd ZdZdedef fdZ xZS )Type2FunctionGrayu@   1‑channel exponential interpolation for alpha/luminance ramps.g0g1c                     t                                                       d| _        d| _        dt	          |           d| _        dt	          |           d| _        d| _        d S )NrQ   r   r   r   r   )r   r   r   r   r   rM   rN   r   )r   r   r   r   s      r"   r   zType2FunctionGray.__init__L  sg    *mB''****mB''***r$   )r4   r   r   r   rT   r   r   r   s   @r"   r   r   I  sQ        JJ5 e          r$   r   c                   r     e Zd ZdZdeeeed f                  dee         f fdZ	e
defd            Z xZS )Type3FunctionzWhen multiple colors are used, a type 3 function is necessary to stitch type 2 functions together
    and define the bounds between each color transition	functionsboundsc                    t                                                       d| _        d| _        || _        dd                    d |D                        d| _        dd                    d |D                        d| _        d S )NrR   r   r   r   c              3   4   K   | ]}t          |          V  d S r   r   )r(   bounds     r"   r*   z)Type3Function.__init__.<locals>.<genexpr>c  s*      "L"LE=#7#7"L"L"L"L"L"Lr$   r   c              3      K   | ]}d V  dS )z0 1Nr    )r(   rg   s     r"   r*   z)Type3Function.__init__.<locals>.<genexpr>d  s"      "<"<Q5"<"<"<"<"<"<r$   )r   r   r   r   
_functionsr   r   encode)r   r   r   r   s      r"   r   zType3Function.__init__Y  s    
 	#O#(("L"LV"L"L"LLLOOO?#(("<"<)"<"<"<<<???r$   r   c                 R    dd                     d | j        D                        dS )Nr   r   c              3   *   K   | ]}|j          d V  dS )r   N)r   )r(   r   s     r"   r*   z*Type3Function.functions.<locals>.<genexpr>h  s*      CCaqtMMMCCCCCCr$   r   )r   r   r   s    r"   r   zType3Function.functionsf  s0    F388CC4?CCCCCFFFFr$   )r4   r   r   r   r   r   r   r   rT   r   r   r   r   r   r   s   @r"   r   r   U  s        ; ;@E-1BO"STU@ @ @ @ @ @ @ G3 G G G XG G G G Gr$   r   c                        e Zd Zdedee         dedee         ez  dee	e
z  ez           dedef fdZed	efd
            Zd	ee	e
z  ez           fdZddZ xZS )r   shading_type
backgroundcolor_spacecoordsr   extend_beforeextend_afterc                 6   t                                                       || _        |r(dd                    d |j        D                        dnd | _        t          |          | _        || _        || _	        d|rdnd d|rdnd d| _
        d| _        d S )Nr   r   c              3   4   K   | ]}t          |          V  d S r   r   r5   s     r"   r*   z#Shading.__init__.<locals>.<genexpr>y  *      EEaq))EEEEEEr$   r   truefalseT)r   r   r   r   r0   r   r   r   r   r   extend
anti_alias)	r   r   r   r   r   r   r   r   r   s	           r"   r   zShading.__init__l  s     	( HEE:3DEEEEEHHHH 	
  ,,#gM>&&wgg<Ad]dgggr$   r   c                 ,    | j         d         j         dS )zHReference to the *top-level* function object for the shading dictionary.rL   r   )r   r   r   s    r"   functionzShading.function  s     /"%(....r$   c                     | j         S )zIAll function objects used by this shading (Type2 segments + final Type3).)r   r   s    r"   get_functionszShading.get_functions  s     r$   c                     | S )z1Return self, as this is already a shading object.r    r   s    r"   r   zShading.get_shading_object  s    r$   r   r   )r4   r   r   intr   r	   r   r   rT   r   r   r   r   r   r   r  r	  r   r   r   s   @r"   r   r   k  s        UO 	
 #% M,==MN       . /# / / / X/	-"33mC	D          r$   r   c                   h   e Zd Zdee         dee         dededeee                  f
dZe	dee         de
eee         ee         f         fd            Zdeeez  ez           fd	Zdeeez  ez           fd
ZddZdefdZdefdZdeeez  ez           fdZ	 dded         ded         fdZdS )r   r0   r   r   r   r   c                                           |          \   _         _         _        d  _        |rt          |t          gt          t          R           rt          |          nt          | } j        dk    rOt          |t                    r|                                }nt          |t                    rt          d          ne j        dk    rZt          |t                    r!t          |j        |j        |j                  }n$t          |t                    rt          d          | _        | _        | _        |r|n/ fdt%          t'           j                  dz
            D              _        t'           j                  t'           j                  dz
  k    rt          d                                            _        t/                      _        d  _        d  _        d  _        d _        d  _        d S )Nr   z0Can't mix CMYK background with non-CMYK gradientr   c                 J    g | ]}|d z   t          j                  d z
  z   S )r   )r+   r0   )r(   r)   r   s     r"   r<   z%Gradient.__init__.<locals>.<listcomp>  s1    XXXq1q5S--12XXXr$   rQ   z>Bounds array length must be two less than the number of colorsr   )_convert_colorsr   r0   _alphasr   r:   r   r
   r   r   r   rv   r   r,   r   r;   r   r   r.   r+   r   _generate_functionsr   r   pattern_shading_object_alpha_shading_objectr   r   	raw_stops)r   r0   r   r   r   r   bgs   `      r"   r   zGradient.__init__  s    7;6J6J66R6R3$+t| 	! j3*J*Jk*J*JKK:'
333,j9  <//b),, YBBJ// Y$%WXXXY![00b*-- Y"24rt44BBJ// Y$%WXXX DO*( YFFXXXXE#dkBRBRUVBV<W<WXXX 	
 t{s4;//!333P   1133t}}268<"15>Br$   r   c                    t          |          dk     rt          d          g }t                      }g }|D ]}t          |t          gt
          t          R           rt          |          nt          | }|                    |           |	                    t          |          j                   t          |dd          }|                    |t          |          nd           d|v r"t          |          dk    rt          d          |dhk    rd||fS |d	d
hk    rg }|D ]w}	t          |	t                    r4|                    t          |	j        |	j        |	j                             Kt          |	t                    sJ |                    |	           xd
||fS |d	hk    rd	||fS |d
hk    r9d |D             }
t#          d |
D                       rd	d |
D             |fS d
||fS d
||fS )zXNormalize colors to a single device colorspace and capture per-stop alpha (default 1.0).rQ   (A gradient must have at least two colorsr   NrP   r   r   r8   r   r   c                 <    g | ]}t          |t                    |S r    )r:   r   r5   s     r"   r<   z,Gradient._convert_colors.<locals>.<listcomp>  s7     , , ,jI&>&>,, , ,r$   c              3   >   K   | ]}|                                 V  d S r   )is_achromaticr5   s     r"   r*   z+Gradient._convert_colors.<locals>.<genexpr>  s,      ::1??$$::::::r$   c                 6    g | ]}|                                 S r    )rv   r5   s     r"   r<   z,Gradient._convert_colors.<locals>.<listcomp>  s     %G%G%Gaaiikk%G%G%Gr$   )r+   r,   setr:   r   r
   r   r   r{   addr3   r4   rS   rT   r   r   r;   all)r   r0   r   spacesalphasrt   dcr   r>   r6   rgb_palettes              r"   r  zGradient._convert_colors  sh   
 v;;??GHHH  "55  		> 		>E ec%EJ%E%E%EFF5'...,e4 
 NN2JJtBxx()))C&&AMMam%(((==== 6!!c&kkAooFGGG l^##&00 lK000$&H ' 'a,, 'OOIac13$<$<====%a33333OOA&&&&&00 l^##&00 k]"", ,", , ,K ::k::::: P#%G%G;%G%G%GOO// GV++r$   c           	          t          | j                  dk     rt          d          t          | j                  dk    r't          | j        d         | j        d                   gS t          | j                  }g }t	          |dz
            D ]>}|                    t          | j        |         | j        |dz                                 ?|                    t          |d d          | j                             |S )NrQ   r  r   r   )r+   r0   r,   r   r.   r{   r   r   )r   number_of_colorsr   r)   s       r"   r  zGradient._generate_functions  s     t{aGHHHt{q  !$+a.$+a.AABBt{++MO	'!+,, 	P 	PA]4;q>4;q1u;MNNOOOOy|T[AABBBr$   c                     | j         S r   )r   r   s    r"   r	  zGradient.get_functions  s
    ~r$   r   c           	         | j         sr| j        dn/t          d | j        D                                                       }t	          | j        | j        | j        || j        | j	        | j
                  | _         | j         S )N c                 h    g | ]/}t          |t          t          f          rt          |          n|0S r    )r:   r  rT   r   r(   values     r"   r<   z/Gradient.get_shading_object.<locals>.<listcomp>  sM        "  *%#u>>'M%000!&	  r$   r   r   r   r   r   r   r   )r  r   r   	serializer   r   r   r   r   r   r   )r   r   s     r"   r   zGradient.get_shading_object  s    # 	 ;&   &*[  	 	 )++  $+!.? ,."0!.$ $ $D  ##r$   c                     | j         S r   )r  r   s    r"   get_patternzGradient.get_pattern*  r   r$   c                 >    t          d | j        D                       S )z&True if any stop carries alpha != 1.0.c              3   B   K   | ]}t          j        |d            V  dS )rP   N)r   r`   )r(   r   s     r"   r*   z%Gradient.has_alpha.<locals>.<genexpr>/  s2      JJ~+As333JJJJJJr$   )anyr  r   s    r"   	has_alphazGradient.has_alpha-  s!    JJT\JJJJJJr$   c           	         t          | j                  dk     rt          d          t          | j                  dk    r't          | j        d         | j        d                   gS g }t	          t          | j                  dz
            D ]>}|                    t          | j        |         | j        |dz                                 ?|                    t          |dd         | j                             |S )z>Stitched Type2 gray functions mirroring the color ramp bounds.rQ   z&Alpha ramp requires at least two stopsr   r   N)r+   r  r,   r   r.   r{   r   r   )r   r   r)   s      r"   _generate_alpha_functionsz"Gradient._generate_alpha_functions1  s     t|q  EFFFt|!!%dl1ot|AGGHH=?	s4<((1,-- 	V 	VA.t|AQQRU@STTUUUUy|T[AABBBr$   Nrg   r   c           	         |                                  sdS | j        s| j        `t          | j        t          t
          f          r?t          | j                  dk    r't          | j                                                  }nd}t          | j
        dd||                                 | j        | j                  | _        | j        S )zGGrayscale Shading object representing the alpha ramp (for a soft mask).Nr   r)  r   r-  )r4  r  r   r:   listr-   r+   r   r.  r   r   r6  r   r   )r   rg   r   s      r"   get_alpha_shading_objectz!Gradient.get_alpha_shading_object?  s     ~~ 	4) 	't{T5M:: ($$q((!$+..88::)0!.(88::"0!.* * *D& ))r$   r  r   )r4   r   r   r   r   r   r   rT   r   r   r-   r   r8  r	   r  r   r   r   r  r	  r   r   r0  r4  r6  r9  r    r$   r"   r   r     s       -C$-C Z(-C 	-C
 -C %)-C -C -C -C^ 8,j)8,	sDKe,	-8, 8, 8, [8,t	m//-?	@   tM4E$E$UV    $ $ $ $6W    K4 K K K K	-"33mC	D    ,0* *-(*	)	* * * * * *r$   r   c                   ~     e Zd Z	 	 	 	 ddededededee         dee         d	ed
edeee                  f fdZ	 xZ
S )LinearGradientNFfrom_xfrom_yto_xto_yr0   r   r   r   r   c
                 v    t                                          |||||	           ||||f| _        d| _        dS )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.
        rQ   Nr   r   r   r   )r   r<  r=  r>  r?  r0   r   r   r   r   r   s             r"   r   zLinearGradient.__init__[  sP    X 	]L&QQQ 	
 	 r$   NFFNr4   r   r   rT   r   r   r   r   r8  r   r   r   s   @r"   r;  r;  Z  s         ,0#"(,5 55 5 	5
 5 $5 Z(5 5 5 e%5 5 5 5 5 5 5 5 5 5r$   r;  c                        e Zd Z	 	 	 	 ddedededededed	ee         d
ee         dededeee                  f fdZ	 xZ
S )RadialGradientNFstart_circle_xstart_circle_ystart_circle_radiusend_circle_xend_circle_yend_circle_radiusr0   r   r   r   r   c                 z    t                                          |||	|
|           ||||||f| _        d| _        dS )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.
        rR   NrA  )r   rF  rG  rH  rI  rJ  rK  r0   r   r   r   r   r   s               r"   r   zRadialGradient.__init__  sV    ` 	]L&QQQ 
 	 r$   rB  rC  r   s   @r"   rE  rE    s         ,0#"(,; ;; ; #	;
 ; ; !; $; Z(; ; ; e%; ; ; ; ; ; ; ; ; ;r$   rE  c                   8    e Zd ZdZddddeddded	eeeeef         eeef         eeef         f                  d
eeeedf         eedf         eedf         f                  de	d         de
f fdZddZdefdZedeeez  ez           fd            Z xZS )r   zV
    PDF Shading type 4 (free-form Gouraud triangle mesh) with per-vertex colors.
    NT)r   r  r   bboxr   
comp_count	trianglesr0   .r   r	   r  c                    t          d          | _        d| _        t          |          | _        |r(dd                    d |j        D                        dnd | _        || _        || _        || _	        || _
        || _        d| _        d| _        d| _        |j        |j        |j        |j        gd	d
g|z  }t'          d |D                       | _        t+                                          |                                 d           d S )Nr      r   r   c              3   4   K   | ]}t          |          V  d S r   r   r5   s     r"   r*   z'MeshShading.__init__.<locals>.<genexpr>  r  r$   r         rn   rP   c                 ,    g | ]}t          |          S r    r   r+  s     r"   r<   z(MeshShading.__init__.<locals>.<listcomp>  s     PPPe 4 4PPPr$   T)contentscompress)r   r3   r   r   r   r0   r   _bbox
_triangles_triangle_colorsr  _comp_countbits_per_coordinatebits_per_componentbits_per_flagx0x1y0y1r   decoder   r   _encode_stream_raw)
r   r   rN  rO  rP  r0   r   r  decode_valuesr   s
            r"   r   zMeshShading.__init__  s-    OO	,, HEE:3DEEEEEHHHH 	
 
# &$% $& "$ GGGG	

 Cj:%
 PP-PPPQQ$"9"9";";dKKKKKr$   r   c                     | S r   r    r   s    r"   r   zMeshShading.get_shading_object  s    r$   c                    | j         j        | j         j        }}| j         j        | j         j        }}d| j        z  dz
  t          ||z
  t          j                  z  }t          ||z
  t          j                  z  }d| j	        z  dz
  dt          dt          dt          dt          ffd}dt          dt          ffd| j	        d	k    rd
nd}d|| j        z  z   }	t                      }
t          | j        | j                  D ]p\  \  }}}\  }}}||f||f||ffD ]W\  \  }}fdt#          | j                  D             }|
t%          j        |	d ||||           ||||          g|R  z  }
Xqt)          |
          S )Nr   rf   uminscaler   c                 l    t          t          | |z
  |z                      }|dk     rdn	|k    rn|S rG   )r  round)rf   ri  rj  uimaxcs       r"   q16z+MeshShading._encode_stream_raw.<locals>.q16  s?    UAH-..//BQ11BIIDD2=r$   r   c                     t          t          t          |           z                      }|dk     rdn	|k    rn|S rG   )r  rl  rT   )r   ivmax_comps     r"   q_componentz3MeshShading._encode_stream_raw.<locals>.q_component  sA    U588h.//00BQ11XHH2Er$   rU  HBz>BHHc                 \    g | ](}|t                    k     r |                   nd )S r   )r+   )r(   r)   compsrs  s     r"   r<   z2MeshShading._encode_stream_raw.<locals>.<listcomp>  sJ     # # # ./U^^KKa)))# # #r$   r   )rY  r`  ra  rb  rc  r]  rc   r   rd   r^  rT   r  r\  	bytearrayr~   rZ  r[  r.   structpackbytes)r   xminxmaxyminymaxsxsyro  comp_fmt
vertex_fmtr   v0v1v2rM   rN   r   xycomponent_bytesrx  rr  rn  rs  s                       @@@@r"   re  zMeshShading._encode_stream_raw  s   Z]DJMdZ]DJMdT--2Ct^%=>>>Ct^%=>>>00A5	>5 	> 	>e 	> 	> 	> 	> 	> 	> 	>	F5 	FS 	F 	F 	F 	F 	F 	F 1A55333x$*::;
kk*-dot?T*U*U 	 	&LRR,2r2#%r(RHr2h!?  A# # # # #"4#344# # # v{C4$$C4$$	
 %    Szzr$   c                     g S )zNType-4 mesh shadings don't use Function objects; return empty list for output.r    )r   s    r"   r	  zMeshShading.get_functions)  s	    
 	r$   )r   r   )r4   r   r   r   r   r  r8  r-   rT   r   r   r   r   r|  re  r   r   r   r   r   r	  r   r   s   @r"   r   r     sw         )-*L *L *L *L 	*L
 *L %u%uUE\':E%,<OOP
*L U5,eE3J.?uczARRST*L W%*L *L *L *L *L *L *LZ    E        D 	-"33mC	D   [    r$   r   c                        e Zd ZdZdZej        ddfdedededed	ee	ee
eef         f                  d
e
def         dee         def fdZdefdZddZddded         fdZ xZS )SweepGradientz
    Conic/sweep gradient that materializes as a type-4 (mesh) Shading.
    Build is bbox-dependent, so we create the shading lazily at emit time.
    )cxcystart_angle	end_anglerB   spread_methodsegmentsinner_radius_factor_cached_keyr   _alpha_shadingNMb`?r  r  r  r  rB   r  r   r  r  c	                    t                                                       t          |          t          |          c| _        | _        t          |          t          |          c| _        | _        || _        t          t          d          rt          j
        |          nt          |          | _        || _        || _        d | _        d | _        d | _        d S )Ncoerce)r   r   rT   r  r  r  r  rB   rz   r   r  r  r  r  r  r   r  )
r   r  r  r  r  rB   r  r  r  r   s
            r"   r   zSweepGradient.__init__E  s     	 99eBii+0+=+=uY?O?O($.
 +X665 '666%m44 	
 !#6   	 0459r$   r   c                     | j         D ]^\  }}t          |d          st          |          n|}t          |dd           }|%t	          j        t          |          d          s dS _dS )Nr0   r   rP   TF)rB   rz   r   rS   r   r`   rT   )r   rg   r6   r#  r   s        r"   r4  zSweepGradient.has_alpham  ss    J 	 	DAq3:1h3G3GN(+++QBC&&A}^%9%((C%H%H}ttur$   rN  r   r   c                 l   |j         |j        |j        |j        | j        | j        | j        | j        | j        | j	        | j
        j        f}| j        | j        |k    r| j        S || _        t          | j        | j        | j        | j        | j        | j
        || j        | j	        	  	        | _        | j        S )Nr  rN  r  r  )r`  rb  ra  rc  r  r  r  r  r  r  r  r,  r   r  shape_sweep_gradient_as_meshrB   )r   rN  rK   s      r"   r   z SweepGradient.get_shading_objectv  s    GGGGGGNM$$
 =$)9S)@)@= 4GGNJ,] $ 8

 

 

 }r$   c                    |                                  sd S t          | j                  \  }}}t          |          }d |D             }d|j        |j        |j        |j        | j        | j	        | j
        | j        | j        | j        | j        j        f}t!          | dd           |k    r| j        S t%          | j        | j	        | j
        | j        || j        || j        | j        	  	        | _        || _        | j        S )Nc                 6    g | ]\  }}|t          |          fS r    )r   )r(   rf   r   s      r"   r<   z:SweepGradient.get_alpha_shading_object.<locals>.<listcomp>  s4     7
 7
 7
#)AqQ
17
 7
 7
r$   rZ   _alpha_cached_keyr  )r4  r   rB   r   r`  rb  ra  rc  r  r  r  r  r  r  r  r,  rS   r  r  r  )r   rN  rg   r   alpha01
gray_stopsrK   s          r"   r9  z&SweepGradient.get_alpha_shading_object  s   ~~ 	4 (
337A%g..7
 7
-47
 7
 7


 GGGGGGNM$$
 4,d33s::&&:GGN,] $ 8

 

 

 "%""r$   )rN  r   r   r   )r4   r   r   r   	__slots__r   r   rT   r   r-   r   r	   r   r   r  r   r   r4  r   r9  r   r   s   @r"   r  r  1  s.        
I* =Q<T"&%*&: &:&: &: 	&:
 &: eU5#:%6678&: 3S89&: 3-&: #&: &: &: &: &: &:P4       <)#] )#x?V )# )# )# )# )# )# )# )#r$   r  r  r  r  r  r  r  rN  r   r  r  c	           
        BCDEFGHIJK t          |          \  }	}
}	|
d         d         }t          |t                    rd}d}nt          |t                    rd}d}nd}d}dt          j        z  K|z
  }t          j        |          rK}|d	k     r+|c}d
 |
D             }
|
                    d            | }t          j	        |d	          r|nKGt          GK          D|!t          dt          |
          dz            }nt          d|          }Dt          |          z  }t          t          |t          j        dz            t          j        dz            }|                    | |          }t          t          |j        |j                  t          |          z  t          j                  }t	          j        K          IId	k     rIKz  It	          j        IGz   K          }|d	k     r|Kz  }t          j        GK          o|Ik     }t          j        GK          HKIz
  Kz  Ft          j        Fd	          rDFd	g}t-          t	          j        DGz                      }D|Gz  z
  }t          j        |d	          rd	}t1          |          D ]*}|Gz  }|
D ] \  }}	|                    ||Gz  z              !+|d	k    rZ|Gz  }|Gz  }|
D ]7\  }}	t          j	        ||          r n|                    ||Gz  z              8|                    D           n|                    D           t4          j        k    rHs
t          DGz
  d	          }t          j	        Fd	          r*t          j        FD          r|                    F           t          j	        |d	          rt          j        FD          rt          j	        FG          ryt          t          Gdz  t          j                  FGz
  t          j        z
  DFz
  t          j        z
            }t          j	        |d	          r|                    F|z
             |                                 g }|D ]:}|r!t          j        ||d                   r||d<   %|                    |           ;|sd	Dg}n1t          |          dk    r|                    |d         Dz              IGz   } t          j	        | K          EFz   }!dt          dt          fDEFGHIKf	d}"g }#|D ]}t          j        |D          r(Hs&t          j	        DG          rt4          j        k    r?|z   }$ |"|          }%t4          j        k    r|%d	k    rd	n	|%dk    rdn|%}&nt;          |%          }&t=          |
|&          }'|#                    |$|%|'f           |#sg }(nt4          j        k    rHs|rFz   }!|#d         d         })g }(d}*|#D ]Z\  }$}%}'|(                    |$|'f           |*s;t          j        |$|!          r&|(                    |$t          j        z   |)f           d}*[|*s$|(                    |!t          j        z   |)f           nd |#D             }(g }+|
d         d         j        },|(rE|+                    |(d                    t1          t          |(          dz
            D ]	}-|(|-         \  }.B|(|-dz            \  }/C|/|.z
  }0t          j        |0d	          r"|+r|/Cf|+d<   n|+                    |/Cf           X|rt          j	        |.|!          r|,B|,Ct          dt-          t	          j         |0|z                                }1t1          d|1dz             D ]P}2|2|1z  J|.J|0z  z   }$tC          BCJfdt1          |          D                       }'|+                    |$|'f           Qt          |+          dk    r@|(r|(d         d         n}$|(r|(d         d         n|
d         d         j        }3|$|3f|$Dz   |3fg}+g }4g }5|+d         \  }6}7| |t	          j"        |6          z  z   }8||t	          j#        |6          z  z   }9| |t	          j"        |6          z  z   }:||t	          j#        |6          z  z   };|+dd         D ]\  }<}=| |t	          j"        |<          z  z   }>||t	          j#        |<          z  z   }?| |t	          j"        |<          z  z   }@||t	          j#        |<          z  z   }A|4                    |8|9f|:|;f|@|Aff           |5                    |7|7|=f           |4                    |8|9f|@|Af|>|?ff           |5                    |7|=|=f           |<|=}7}6|>|?}9}8|@|A};}:tI          ||||4|5dd          S )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   rR   r   rR  r   rn   c                 "    g | ]\  }}d |z
  |fS )rP   r    )r(   rf   r6   s      r"   r<   z0shape_sweep_gradient_as_mesh.<locals>.<listcomp>  s$    <<<v1sQwl<<<r$   c                     | d         S rG   r    rH   s    r"   rI   z.shape_sweep_gradient_as_mesh.<locals>.<lambda>  s
    ad r$   rJ   Ni   `   rT  g     v@g{Gz?rL   progressr   c                 H  	 t          j        d          rdS | z   }t          j        |           r+
t          j        k    r	st          j                  rdS dS 
t          j        k    r	rt          j        d          r| z  ndS s[t          j        |          }|dk     r|z  }z   }t          j        |          rdS t          j        ||          r|z
  z  S dS t          t           j
                  }t          j        | |          r| |z  S dS | z  S )Nrn   rP   )r   rb   ra   r   r   r_   r   fmodr^   rc   rd   )r  theta	angle_mod	end_limitvisible
cover_spancrosses_360seam_progressrk   span_covers_full_circler  r  	start_modtaus        r"   raw_from_progressz7shape_sweep_gradient_as_mesh.<locals>.raw_from_progress>  sm   $T3// 	3h&'*== 	!5!999/ :"/
DAA : s30444& '5'B4'M'MVHtOOSV  	 IeS11	s??$I%,	!+IyAA 3!,Y	BB :%	1T99s -)ABBG(7;; *'))3$r$   rP   rQ   FTc                     g | ]
\  }}}||fS r    r    )r(   r  rg   rt   s       r"   r<   z0shape_sweep_gradient_as_mesh.<locals>.<listcomp>  s#    III'8q%UENIIIr$   c              3   R   K   | ]!}|         |         |         z
  z  z   V  "d S r   r    )r(   jcolor0color1r   s     r"   r*   z/shape_sweep_gradient_as_mesh.<locals>.<genexpr>  sO        @AF1IVAY!6! ;;     r$   )r   rN  rO  rP  r0   r   r  )%r   r:   r   r   r   pir   r}   r|   r_   rc   r+   rT   r   max_distance_to_pointwidthheightrd   r  r^   ra   rb   r  r   r.   r{   r   r   r`   r   r   r0   ceilr-   cossinr   )Lr  r  r  r  rB   r  rN  r  r  rg   
norm_stopsfirst_cr   rO  deltabase_segments	max_angler_outerr_innerend_modwrapsprogress_candidates
tile_count	remaindertilebase_progressrf   portiontail_lengthseam_epsprogress_nodesr  	span_pluslimit_thetar  fan_line_rawr  rawmappedrt   fan_line	pad_colorinsertedsamplesstart_color_componentsrh   theta0theta1delta_thetasplitss
base_colorrP  
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  rk   r  r  r   r  sL     `  `                                                            @@@@@@@@@@r"   r  r    s     'u--Az1mAG':&& "

	GY	'	' !

"

-C#Ee$$ s{{!*KY<<<<<
NN+++"/s;;D55DT3JD#j//B"677B))U=111IC	47S=1147U?CCI((R00GDJ$$u-@'A'AA  G
 	+s++I3S	i	D(#..G}}3$T3//GGi4GE,:4EE9_+M 44 #"(+uTZ
T 12233JZ$..I C00 	j!! A At 	A 	ADAq&&}q4x'?@@@@	A 3d""T) 	A 	ADAq*1g66 &&}q4x'?@@@@"":...."":...,0009P0*t+S11&3
 
 	6'zBB	6  &&}555'S99	E(
CC	E +M4@@	E
 D4K!9::$~'??]*^-EE H
 *8S99 E#**=8+CDDD"$N' , , 	,n28^B=OPP 	,!)N2!!(++++ >z*	^			!	!nQ/*<===D I -i==K-K&E &e & & & & & & & & & & & & & &P BDL" 1 1(:>>	+	 +J==	 !5!999h&))04443JJSS3#::CC3FF]33FZ00UC/0000 J:<-111' 	2 	2 "M1 OA&	!- 	  	 E3OOUEN+++   4UK H H  )A!A9 MNNN 	QOO[>+CCYOPPPIILIII57G']1-4 /x{###X*++ 	/ 	/C%c]NFF%cAg.NFF 6/K(c::  5#)6"2GBKKNNFF#3444 04V[II 0//C	+	*A B BCCDDF1fqj)) / /J[0      EJ:EVEV     u~..../ 7||q"*;A'/LXa[^^Z]15E5L
JZ,
 	  	  %QZJ
$(:"6"666L$(:"6"666L$(:"6"666L$(:"6"666L")!""+ @ @
JGdhz&:&:::Gdhz&:&:::Gdhz&:&:::Gdhz&:&:::|,|,|,	
 	
 	
 	:z:>???|,|,|,	
 	
 	
 	:z:>???!+ZJ
%1<l%1<l   r$   ra  rc  x2y2c           
      p  ./01 |st          d          t          j        |          }t          |d          \  }}}	|t          j        k    s|@d |D             }
d |dd         D             }t          | ||||
|dd	          }|	|_        |S |	duot          |	          d
k    }|r|	n|}|J |d         d         }|d         d         }t          ||z
  t          j
                  }t          j        |d          rd}d}|}|                    | |||          \  }}}t          j        |d          r5|d         d         |d         d         }}t          | |||||gg dd	          S ||z  }||z  }t          j        ||z
  |z            dz
  }t          j        ||z
  |z            dz   }g }t!          ||dz             D ]}}||z  }|t          j        k    s	|dz  dk    r#|D ]\  }}|                    ||z   |f            Ct'          |          D ]*\  }}||z   |z   ||z
  z
  } |                    | |f           +~t          |d          }!||!z
  .||!z   /./fd|D             p|}"|"d         d         0|"d         d         }#t          |#0z
  t          j
                  101fd|"D             }$0}%01z   }&| |%|| z
  z  z   }'||%||z
  z  z   }(| |&|| z
  z  z   })||&||z
  z  z   }*t)          |$          }+d |+D             },d |+dd         D             }-t          |'|(|)|*|,|-dd	          }|	|_        |S )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.
    rE   Tr@   Nc                     g | ]\  }}|S r    r    r(   rg   rt   s      r"   r<   z)shape_linear_gradient.<locals>.<listcomp>      999HAu%999r$   c                     g | ]\  }}|S r    r    r(   offsetrg   s      r"   r<   z)shape_linear_gradient.<locals>.<listcomp>      AAAYVQ&AAAr$   r   rL   )r<  r=  r>  r?  r0   r   r   r   rQ   r   rn   rP   Fc                 r    g | ]3\  }}t          j        |          t          j        |          /||f4S r    )r   ra   rb   )r(   r  r6   r   r   s      r"   r<   z)shape_linear_gradient.<locals>.<listcomp>>  s\       Q'1-- 3A2KAq2Q2Q	
A  r$   c                 *    g | ]\  }}|z
  z  |fS r    r    r(   r  r6   s0rk   s      r"   r<   z)shape_linear_gradient.<locals>.<listcomp>H  s*    999v1B$"999r$   c                     g | ]\  }}|S r    r    rq   s      r"   r<   z)shape_linear_gradient.<locals>.<listcomp>U      333DAqa333r$   c                     g | ]\  }}|S r    r    r(   org   s      r"   r<   z)shape_linear_gradient.<locals>.<listcomp>V      999DAqa999r$   )r,   r   r  r   r   r;  r  r+   rc   r   rd   rb   project_interval_on_axisr   r   r  r.   r   r{   reversedr   )2ra  rc  r  r  rB   r  rN  rg   normalized_stopsr  r0   r   gradientuse_raw_period
tile_stops
base_startbase_end	base_spantmintmaxLrM   rN   	tmin_norm	tmax_norm
start_tileend_tileexpandedkshiftrf   r   mirroredmarginclippedsNrenormlam0lam1nx1ny1nx2ny2mergedlinear_gradient_colorslinear_gradient_boundsr   r   r  rk   s2                                                 @@@@r"   shape_linear_gradientr&    s     :8999(/>>M%4Ut%L%L%L"A,000DL
 :9(8999AA*:1R4*@AAA!	
 	
 	
 ' d*Bs9~~/BN,B2BJ!!!Aq!J"~a HHz)>+CDDI C00 &
	%
11"b"bAAMD$ C(( 
!!$Q')9")=a)@B8	
 	
 	
 		
 qIqIY3y@AAAEJy)j0I=>>BH68H:x!|,, 
1 
1I0777AEa<<$ 2 23C 011112 #:.. 1 13 :-	9Q^L300001
 C  FFAFA        
	  
AB	QBrBw011D99999999F D9D
trBw
C
trBw
C
trBw
C
trBw
C #6**F33F33399F1R4L999%%	 	 	H #HOr$   rn   rfxfyfrc	                    ./012 |st          d          t          j        |          }t          |d          \  }	}
}dk     rt          d          dk     rd k    r|t          j        k    s|Bd |
D             }d	 |
d
d         D             }t           ||dd
  
        }||_        |S |duot          |          dk    }|r|n|
}|J |d         d         /|d         d         }t          |/z
  t          j
                  .t          j        .d          rd/d.|
}t          j                  rBd |
D             }d |
d
d         D             }t           ||dd
  
        }||_        |S dt          dt          f./fd}dt          dt          t          t          t          f         f fd}|}|fd}t          |          D ]L}	 ||          } ||          \  }}}t          j        |                    ||          |          r n|.z  }M||.z  z   }d}||k    rt#          j        ||z
  .z            }g }t          |d
z             D ]}}|.z  }|t          j        k    s	|d
z  dk    r#|D ]\  }}|                    ||z   |f            Ct+          |          D ]*\  }}|/z   .z   |/z
  z
  } |                    | |f           +~|s
|dd         }|.z   dz   00fd|D             }|d         d         1|d         d         }!t          |!1z
  t          j
                  212fd|D             }" |1          }# ||!          }$ ||#          \  }%}&}' ||$          \  }(})}*t-          |"          }+d |+D             },d |+d
d         D             }-t          |%|&|'|(|)|*|,|-dd
  
        }||_        |S )a  
    Create a radial gradient for a shape with SVG-like stops (offset in [0,1]).
    - (cx, cy, r): outer circle
    - (fx, fy, fr): focal/inner circle (defaults to center with radius 0)
    REPEAT/REFLECT are implemented by expanding stops to cover the bbox projection.
    rE   Tr@   r   zOuter radius r must be >= 0rn   Nc                     g | ]\  }}|S r    r    r  s      r"   r<   z)shape_radial_gradient.<locals>.<listcomp>  r  r$   c                     g | ]\  }}|S r    r    r  s      r"   r<   z)shape_radial_gradient.<locals>.<listcomp>  r  r$   r   rL   )
rF  rG  rH  rI  rJ  rK  r0   r   r   r   rQ   rP   c                     g | ]\  }}|S r    r    r  s      r"   r<   z)shape_radial_gradient.<locals>.<listcomp>  r  r$   c                     g | ]\  }}|S r    r    r  s      r"   r<   z)shape_radial_gradient.<locals>.<listcomp>  r  r$   sigmar   c                     | z
  z  S r   r    )r0  r  r  s    r"   sigma_to_lambdaz.shape_radial_gradient.<locals>.sigma_to_lambda  s    
"i//r$   lamc                 h    t          |           t          |           t          |           fS r   r'   )r3  r  r  r*  r(  r)  r'  s    r"   	circle_atz(shape_radial_gradient.<locals>.circle_at  s:    RRQ
 	
r$      r   c                 ,    g | ]}|d          k    |S rw  r    )r(   pair
clip_limits     r"   r<   z)shape_radial_gradient.<locals>.<listcomp>  s'    CCCT!W
-B-B-B-B-Br$   c                 *    g | ]\  }}|z
  z  |fS r    r    r  s      r"   r<   z)shape_radial_gradient.<locals>.<listcomp>  s*    :::v1B$":::r$   c                     g | ]\  }}|S r    r    rq   s      r"   r<   z)shape_radial_gradient.<locals>.<listcomp>  r   r$   c                     g | ]\  }}|S r    r    r  s      r"   r<   z)shape_radial_gradient.<locals>.<listcomp>  r  r$   F)r,   r   r  r   r   rE  r  r+   rc   r   rd   rb   r`   rT   r-   r.   r  r   r  r   r{   r  r   )3r  r  r'  rB   r(  r)  r*  r  rN  rg   r  r  r0   r   r  r	  r
  r  r2  r5  target_sigma	max_tilesr3  cx_lamcy_lamr_lamtiles_neededr  r  r  rf   r   r  r  r  r  r  r  r  srexeyerr#  radial_gradient_colorsradial_gradient_boundsr  r  r9  r  rk   s3   ``` ```                                       @@@@@r"   shape_radial_gradientrI  f  s   "  :8999(/>>M%4Ut%L%L%L"A1uu6777	Avv	z	z	Avv,000DL
 :9(8999AA*:1R4*@AAA! "
 
 
 ' d*Bs9~~/BN,B2BJ!!!Aq!J"~a HHz)>+CDDI C00 &
	%
 Ar"" 99(8999AA*:1R4*@AAA! "
 
 
 '0u 0 0 0 0 0 0 0 0
u 
ueU':!; 
 
 
 
 
 
 
 
 
 
 
 L	y!! 		< 		<A!/,//C$-IcNN!FFE(**66::E   I%LL#i)&;;LLhy,"9Y!FGG*,H<!#$$ 1 1I0777AEa<<$ 2 23C 011112 #:.. 1 13 :-	9Q^L300001  !aaa= 	)D0JCCCCCCCH	!QB	"aBrBw011D::::::::F?2D?2D4JBB4JBB #6**F33F33399F1R4L999%%  H #HOr$   )T)Nr  )<r   r   rz  abcr   typingr   r   r   r   drawing_primitivesr	   r
   r   r   r   r   r   r   enumsr   syntaxr   r   r   r   utilr   r   r   drawingr   rT   r#   r-   r/   r8  r   r?   r   r   r   r   r   r   r   r   r   r   r   r   r;  rE  r   r  r  r  r   r&  rI  r    r$   r"   <module>rQ     sx            ; ; ; ; ; ; ; ; ; ; ; ;	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ( ' ' ' ' ' ? ? ? ? ? ? ? ? ? ? ? ? < < < < < < < < < < %$$$$$$E e  %    =UCZ="5#:.=38=
5#:= = = =U c4;>N8O    & "F0 	F0 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0 F0 F0 F0RE%ucz!2234eE5,,-.   <&% &!5 &% & & & &	!$uUE\23 	! 	!%s
BS 	! 	! 	! 	!%u%&	%u
   +$ +$ +$ +$ +$i +$ +$ +$\    I   .	 	 	 	 		 	 	 	G G G G GI G G G,% % % % %i % % %PD* D* D* D* D*s D* D* D*N6 6 6 6 6X 6 6 6r< < < < <X < < <~\ \ \ \ \" \ \ \~L# L# L# L# L#I L# L# L#n #!&` ``` ` 	`
 E%ucz!2234` (` ` sm` ` ` ` ` `R	 7K6N$(@ @@@ 	@ 		@
 E%ucz!2234@ -s23@ =
!@ @ @ @ @P 6J6N$(e eee e E%ucz!2234	e
 	e 	e 	e -s23e =
!e e e e e e er$   