)EjdZddlZddlZddlmZddlmZmZmZm Z ddl m Z m Z m Z mZmZmZmZmZddlmZddlmZmZmZmZdd lmZmZmZerdd lmZd e d e d e de fdZ!d e"e dfd e"e dfd e de"e dffdZ#de$e de"e%e$e ffdZ& dMdddee"e e e e%ffde'de'de"e%e$e"e e fee$e"e e fffdZ(dee"e e e e%ffdee"e e e e%fffdZ)de dede fdZ*d e$e"e e fde de"e dffd!Z+d e$e"e e fde$e"e e ffd"Z,Gd#d$eZ-Gd%d&eZ.Gd'd(eZ/Gd)d*eZ0Gd+d,eZ1Gd-d.eZ2Gd/d0e2Z3Gd1d2e2Z4Gd3d4eZ5Gd5d6eZ6 dNd8e d9e d:e d;e dee"e e e e%ffdd?ee7d@e de5fdAZ8ej9dfdBe dCe dDe dEe dee"e e e e%ffdde3fdFZ:dddGej9dfd8e d9e dHe dee"e e e e%ffdIee dJee dKe dde4fdLZ;dS)Ozx Handles the creation of patterns and gradients Usage documentation at: N)ABC) TYPE_CHECKINGOptionalSequenceUnion)Color ColorClass ColorInput DeviceCMYK DeviceGray DeviceRGB Transformconvert_to_device_color)GradientSpreadMethod)NamePDFArrayPDFContentStream PDFObject)FloatTolerance NumberClass format_number) BoundingBoxabtreturnc|||z |zzSNrrrs >C:\PYTHON\MyICR_Suite\python\Lib\site-packages\fpdf/pattern.pylerpr#s A{?.cttkrtdtfdttDS)Nz!Mismatched color component countsc3RK|]!}t||V"dSrr#).0irrrs r" zlerp_tuple..'s7<<adAaD!$$<<<<<z.pick_colorspace_and_promote..+s! . . .!T!WW  . . .r$r r'Can't mix CMYK with other color spaces.r rc|g|]9}t|tr t|j|j|jn|:Sr ) isinstancer rgr5s r" z/pick_colorspace_and_promote..0sK! ! ! MN 1j(A(A HIac13 $ $ $q! ! ! r$)r+r,)r0kindspromoteds r"pick_colorspace_and_promoter?*s . .v . . .EuUaBCCC {+++! ! RX! ! ! H$$ V##  F""  r$TF return_rawstopscoerce_to_devicerAc|stdg}|D]N\}}t|}|rt|dst|n|}|||fO|dg|D]G\}}r)t jdd|r||fd<0||fHdtdtd td tfd d td d ffd } | d| dg} D]0\}}|dkrd} n |dkrd} n|} | | |f1| dg} | D]G\} }| r)t j| dd| r| |f| d<0| | |fHt| dkr| d\} }d|fd|fg} nt j | dds%| dd| ddfnd| ddf| d<t j| ddds$| d| ddfnd| ddf| d<td| D\} dt| | D}|s|d fSdtd tffd fdD}||fS)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 requiredr0c|dSNrr rs r"z!normalize_stops..Vs 1Q4r$keyrc0c1rrcB|j}|j}t|||}t|dd}t|dd}d}||3t|dnt ||dnt ||}t |t rt |d|St |tr$t|d|d|d|St |tr+t|d|d|d|d|S|S)Nr?rr) r0r/getattrr#floatr:r rr ) rMrNrcomps0comps1blendeda0a1alphas r" _lerp_colorz$normalize_stops.._lerp_color_sVVQ// Rd # # Rd # # >R^zuRyy##rTUE b* % % 1gaj%00 0 b) $ $ HWQZWQZGG G b* % % Ugaj'!*gaj'!*eTT T r$targetNc 4 sdStj| dds!tj| ddrdS D]\}}tj||rdSt dt D]} |dz \}} |\}}tj||r`tj||rKt||z tj }||z |z } || ||| fdSdS)NrrLr) r less_than greater_thanequalr.r+ greater_equal less_equalmax TOLERANCEinsert) r\u_idxu0rMu1rNspanrr[ merged_raws r" _ensure_stopz%normalize_stops.._ensure_stopssY  F  # JqM!$     (B1B C C  F  DAq#Av..  C OO,,  Ca(FB_FB+FB77 N.s qtr$rcg|]\}}|Sr r r(rgr6s r"r<z#normalize_stops..s6T6T6TTQq6T6T6Tr$c"g|] \\}}}||f Sr r )r(rfrgps r"r<z#normalize_stops..s$GGGYVaQ1a&GGGr$colorcdkrdt|tr|St|tr|St|trt ddkrLt|tr|St|tr t|j|j|jS|S)Nr z&Can't mix CMYK with non-CMYK gradientsr)r:r rto_grayr r,r;)rt space_names r" promote_rawz$normalize_stops..promote_raws  % %%,,  %++ '}}&%,, K !IJJJ  $ $%++  %,, < %'57;;; r$c0g|]\}}||fSr r )r(rfrtrxs r"r<z#normalize_stops..s,III EQ E**+IIIr$)r,rThasattrrappendsortrr`r r+is_zerorer?zip)rBrCrA raw_entriesoffcolraw_ur6rtrmclamped_entriesrfmerged_clampedpalette normalized raw_promotedr[rlrxrws @@@@r"normalize_stopsr;s :8999-/K''Sc ! )0h)?)?  #C ( ( ( E1:&&&&(((,.J#.. u  ...z"~a/@%HH .#U^JrNN   uen - - - -5Uu(Ut*LL13O"++ u 3;;AA S[[AAA5z****^^,,,02N#..5  .n2>"3Ea3H!LL ."#UN2    ! !1e* - - - - >a!!$5,e 5%nQ&7&:;; <  ! !!c>!+  ! !3r(:1(="> ? ? ? ?"%~b'9!'rnrP)rr`rcrdrar{min) routrfrprev_uprev_colstep nudged_prevnudgeds r"merge_near_duplicatesrsG24C!!3  !>'B A66 !"2w FH3c(B~/"4d;;D 4-K+K== *&1B As8$$$$TC<< F"3FFTM(B(BCCXNCGG%x0CG FC=)))) JJ3x Jr$rfmethodc|tjkr|dkrdn |dkrdn|S|tjkr|tj|z S|dz}|dkr|nd|z S)u*Map u∈R -> [0,1] via PAD/REPEAT/REFLECT.rnrP@)rPADREPEATmathfloor)rfrvs r" spread_maprsp %)))#ggss!c''33q8 %,,,4:a==   CAS11cAg%r$stops01cHtdt|D]r}||\}}tj||rP||dz \}}t ||z tj}||z |z }t |j|j|cSs|ddjS)zTPiecewise-linear sampling in [0,1]. Assumes normalized/sorted stops incl. endpoints.rrL)r.r+rrbrcrdr/r0) rrfr)rjrNrirMrkrs r" sample_stopsrs 1c'll # #77B  $Q + + 7QU^FBrBw 899DR4AbiA66 6 6 6  7 2;q>  r$cg}|D]>\}}t|dd}|||dnt|f?|S)u5Return [(u, a)] with a∈[0,1]; missing alpha => 1.0.rNrP)rSr{rT)rrrfr6rs r"extract_alpha_stopsrsZ&(C881 AsD ! ! AaissU1XX67777 Jr$ceZdZdZdedffd ZedefdZedefdZ de ddfd Z de fd Z d e dd fd Zde fdZxZS)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)GradientShading MeshShadingcttd|_d|_||_t j|_d|_ dS)NrrQT) super__init__rr3 pattern_type_shadingridentity_matrix_apply_page_ctm)selfr __class__s r"rzPattern.__init__ sU OO   )++  $r$rcD|jjdS)N 0 R)rget_shading_objectidrs r"rzPattern.shadings"-22447====r$c@dt|jjdt|jjdt|jjdt|jjdt|jjdt|jjd S)N[ ])rrrrr6defrs r"matrixzPattern.matrixs P dln-- P P dln0M0M P PT\^,, P P/>>>X>    X yI%%%%%%$D$$$$$$$$r$rc\eZdZdZdedeffd ZededeedffdZ xZ S) Type2FunctionzTransition between 2 colorscolor_1color_2ctd|_d|_||}||}t |t |krt dddd|Dd|_ddd|Dd|_ d |_ dS) NrQ[0 1]z6Type2Function endpoints must have same component countrrc34K|]}t|VdSrrr5s r"r*z)Type2Function.__init__..>*<.?rr$r) rr function_typedomain_get_color_componentsr+r,joinrMrNn)rrrrNc2rs r"rzType2Function.__init__5s   ' ' 0 0  ' ' 0 0 r77c"gg  UVV V?chh<<<<<<<????chh<<<<<<<???r$rtr.cJt|tr|jfS|jSr)r:r r;r0)clsrts r"rz#Type2Function._get_color_componentsBs& eZ ( ( G: |r$) r4rrrr r classmethodr-rTrrrs@r"rr2s%%        %E%*4E[r$rc,eZdZdZdedeffd ZxZS)Type2FunctionGrayu@1‑channel exponential interpolation for alpha/luminance ramps.g0g1ctd|_d|_dt |d|_dt |d|_d|_dS)NrQrrrr)rrrrrrMrNr)rrrrs r"rzType2FunctionGray.__init__Lsg  *mB''****mB''***r$)r4rrrrTrrrs@r"rrIsQJJ5er$rcreZdZdZdeeeedfdeeffd Z e de fdZ xZ 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 functionsboundsctd|_d|_||_ddd|Dd|_ddd|Dd|_dS)NrRrrrc34K|]}t|VdSrr)r(bounds r"r*z)Type3Function.__init__..cs*"L"LE=#7#7"L"L"L"L"L"Lr$rc3K|]}dVdS)z0 1Nr )r(rgs r"r*z)Type3Function.__init__..ds""<".hs*CCaqtMMMCCCCCCr$r)rrrs r"rzType3Function.functionsfs0F388CC4?CCCCCFFFFr$)r4rrrrrrrrTrrrrrrs@r"rrUs;; @E-1BO"STU @ @ @ @ @ @ @G3GGGXGGGGGr$rceZdZdedeededeeezdee e ze zde de ffd Z ed efd Zd ee e ze zfd Zd d ZxZS)r shading_type background color_spacecoordsr extend_before extend_afterc6t||_|r(ddd|jDdnd|_t ||_||_||_ d|rdndd|rdndd|_ d|_ dS)Nrrc34K|]}t|VdSrrr5s r"r*z#Shading.__init__..y*EEaq))EEEEEEr$rtruefalseT) rrrrr0rrrrrextend anti_alias) rrrrrrrrrs r"rzShading.__init__ls (  HEE:3DEEEEE H H H H   ,, #gM>&&wgg.s1XXXq1q5S--12XXXr$rQz>Bounds array length must be two less than the number of colorsr)_convert_colorsrr0_alphasrr:rr rrrrvr r,r r;rrr.r+r_generate_functionsrrpattern_shading_object_alpha_shading_objectrr raw_stops)rr0rrrrbgs` r"rzGradient.__init__s 7;6J6J66R6R3$+t|  !j3*J*Jk*J*JKK:' 333,j9  <//b),,YBBJ//Y$%WXXXY![00b*--Y"24rt44BBJ//Y$%WXXX DO*( YFFXXXXE#dkBRBRUVBVBr$rct|dkrtdg}t}g}|D]}t|tgt t Rrt|nt|}||| t|j t|dd}||t|ndd|vr"t|dkrtd|dhkrd||fS|d d hkrg}|D]w} t| tr4|t| j| j| jKt| tsJ|| xd ||fS|d hkrd ||fS|d hkr9d |D} t#d | Drd d | D|fSd ||fSd ||fS)zXNormalize colors to a single device colorspace and capture per-stop alpha (default 1.0).rQ(A gradient must have at least two colorsrNrPr rr8r rc<g|]}t|t|Sr )r:rr5s r"r<z,Gradient._convert_colors..s7,,,jI&>&>,,,,r$c3>K|]}|VdSr) is_achromaticr5s r"r*z+Gradient._convert_colors..s,::1??$$::::::r$c6g|]}|Sr )rvr5s r"r<z,Gradient._convert_colors..s %G%G%Gaaiikk%G%G%Gr$)r+r,setr:rr rrr{addr3r4rSrTr rr;all) rr0rspacesalphasrtdcrr>r6 rgb_palettes r"rzGradient._convert_colorssh v;;??GHH H "55  > >Eec%EJ%E%E%EFF5'...,e4  NN2    JJtBxx( ) ) )C&&A MMam%((( = = = = 6 ! !c&kkAooFGG G l^ # #&0 0 lK0 0 0$&H ' 'a,,'OOIac13$<$<====%a33333OOA&&&&&0 0 l^ # #&0 0 k] " ",,",,,K::k::::: P#%G%G;%G%G%GOO/ /GV++r$c t|jdkrtdt|jdkr't|jd|jdgSt|j}g}t |dz D]>}|t|j||j|dz?|t |dd|j|S)NrQrrr)r+r0r,rr.r{rr)rnumber_of_colorsrr)s r"rzGradient._generate_functionss t{  a  GHH H t{  q !$+a.$+a.AAB Bt{++MO '!+,, P PA   ]4;q>4;q1u;MNN O O O Oy|T[AABBBr$c|jSr)rrs r"r zGradient.get_functions s ~r$rc |jsr|jdn/td|jD}t |j|j|j||j|j |j |_|jS)Nchg|]/}t|ttfrt|n|0Sr )r:r rTrr(values r"r<z/Gradient.get_shading_object..sM " *%#u>>'M%000!& r$rrrrrrr) rrr serializerrrrrrr)rrs r"rzGradient.get_shading_objects# ;& &*[   )++ $+!.? ,."0!.$$$D ##r$c|jSr)rrs r" get_patternzGradient.get_pattern*rr$c>td|jDS)z&True if any stop carries alpha != 1.0.c3BK|]}tj|d VdS)rPN)rr`)r(rs r"r*z%Gradient.has_alpha../s2JJ~+As333JJJJJJr$)anyrrs r" has_alphazGradient.has_alpha-s!JJT\JJJJJJr$c t|jdkrtdt|jdkr't|jd|jdgSg}t t|jdz D]>}|t|j||j|dz?|t |dd|j|S)z>Stitched Type2 gray functions mirroring the color ramp bounds.rQz&Alpha ramp requires at least two stopsrrN)r+rr,rr.r{rr)rrr)s r"_generate_alpha_functionsz"Gradient._generate_alpha_functions1s t|  q EFF F t|   ! !%dl1ot|AGGH H=? s4<((1,-- V VA   .t|A QQRU@STT U U U Uy|T[AABBBr$Nrgrc |sdS|js|j`t|jtt fr?t |jdkr't|j}nd}t|j dd|| |j |j |_|jS)zGGrayscale Shading object representing the alpha ramp (for a soft mask).Nrr)r r-)r4rrr:listr-r+rr.rrr6rr)rrgrs r"get_alpha_shading_objectz!Gradient.get_alpha_shading_object?s~~ 4)  't{T5M::( $$q((!$+..88::)0!.(88::"0!.***D &))r$r r)r4rrrr rrrTrrr-rr8r rrrrrr rrr0r4r6r9r r$r"rrs-C$-CZ(-C -C  -C %) -C-C-C-C^8,j)8, sDKe, -8,8,8,[8,t  m//-? @    tM4E$E $UV$$$$6WK4KKKK  -"33mC D    ,0**-(* ) ******r$rc~eZdZ d dededededeedeed ed ed eeeffd Z xZ S)LinearGradientNFfrom_xfrom_yto_xto_yr0rrrrc vt||||| ||||f|_d|_dS)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. rQNrrrr) rr<r=r>r?r0rrrrrs r"rzLinearGradient.__init__[sPX ]L&QQQ       r$NFFN r4rrrTrr rrr8rrrs@r"r;r;Zs,0#"(,5555 5  5 $ 5Z(555e%5555555555r$r;ceZdZ ddedededededed eed eed ed ed eeeffd Z xZ S)RadialGradientNFstart_circle_xstart_circle_ystart_circle_radius end_circle_x end_circle_yend_circle_radiusr0rrrrc zt||| | | ||||||f|_d|_dS)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. rRNrA) rrFrGrHrIrJrKr0rrrrrs r"rzRadialGradient.__init__sV` ]L&QQQ         r$rBrCrs@r"rErEs,0#"(,;;;;# ;  ;  ;!;$;Z(;;;e%;;;;;;;;;;r$rEc8eZdZdZddddeddded eeeeefeeefeeeffd eeeed feed feed ffd e d de ffdZ ddZ de fdZedeeezezfdZxZS)rzV PDF Shading type 4 (free-form Gouraud triangle mesh) with per-vertex colors. NT)rrrbboxr comp_count trianglesr0.rr rc td|_d|_t||_|r(ddd|jDdnd|_||_||_||_ ||_ ||_ d|_ d|_ d|_|j|j|j|jgd d g|z}t'd |D|_t+|d dS)Nrrrc34K|]}t|VdSrrr5s r"r*z'MeshShading.__init__..rr$rrnrPc,g|]}t|Sr rr+s r"r<z(MeshShading.__init__..s PPP e 4 4PPPr$T)contentscompress)rr3rrrr0r_bbox _triangles_triangle_colorsr _comp_countbits_per_coordinatebits_per_component bits_per_flagx0x1y0y1rdecoderr_encode_stream_raw) rrrNrOrPr0rr decode_valuesrs r"rzMeshShading.__init__s-OO  ,,  HEE:3DEEEEE H H H H   # &$%$& "$ G G G G  Cj:%  PP-PPPQQ  $"9"9";";dKKKKKr$rc|Srr rs r"rzMeshShading.get_shading_objects r$c |jj|jj}}|jj|jj}}d|jzdz t ||z tjz }t ||z tjz }d|j zdz dtdtdtdtffd }dtdtffd |j d krd nd }d ||j zz} t} t|j|jD]p\\} } } \}}}| |f| |f| |ffD]W\\}}fd t#|j D}| t%j| d||||||||g|Rz } Xqt)| S)Nrrfuminscalercltt||z |z}|dkrdn |krn|SrG)r round)rfrirjuimaxcs r"q16z+MeshShading._encode_stream_raw..q16s?UAH-..//BQ11BIIDD2 =r$rcttt|z}|dkrdn |krn|SrG)r rlrT)rivmax_comps r" q_componentz3MeshShading._encode_stream_raw..q_componentsAU588h.//00BQ11X HH2 Er$rUHBz>BHHc\g|](}|tkr|nd)Sr)r+)r(r)compsrss r"r<z2MeshShading._encode_stream_raw..sJ###./U^^KKa)))###r$r)rYr`rarbrcr]rcrrdr^rTr r\ bytearrayr~rZr[r.structpackbytes)rxminxmaxyminymaxsxsyrocomp_fmt vertex_fmtrv0v1v2rMrNrxycomponent_bytesrxrrrnrss @@@@r"rezMeshShading._encode_stream_rawsZ]DJMdZ]DJMdT--2 Ct ^%=>> > Ct ^%=>> >00A5 >5 > >e > > > > > > > F5 FS F F F F F F1A55333x$*::; kk*-dot?T*U*U   &LRR,2r2#%r(RHr2h!?   A#####"4#344###v{C4$$C4$$  %  Szzr$cgS)zNType-4 mesh shadings don't use Function objects; return empty list for output.r )rs r"r zMeshShading.get_functions)s  r$)rr)r4rrrrr r8r-rTrrrrr|rerrrrrr rrs@r"rrsw)-*L*L*L*L *L  *L  %u %uUE\':E%,.s47 7 7 #)AqQ 1 7 7 7 r$rZ_alpha_cached_keyr)r4rrBrr`rbrarcrrrrrrrr,rSrrr)rrNrgralpha01 gray_stopsrKs r"r9z&SweepGradient.get_alpha_shading_objects~~ 4( 33 7A%g..7 7 -47 7 7  G G G G G G   N M  $   $   4,d 3 3s : :& &: G G   N ,] $ 8    "%""r$)rNrrr)r4rrr __slots__rrrTrr-rr rrr rrr4rr9rrs@r"rr1s. I*=Q||t j#|<zz}?||t j"|<zz}@||t j#|<zz}A|4|8|9f|:|;f|@|Aff|5|7|7|=f|4|8|9f|@|Af|>|?ff|5|7|=|=f|<|=}7}6|>|?}9}8|@|A};}:tI| || |4|5d dS)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. rrr rrRr rRrrnc"g|] \}}d|z |f S)rPr )r(rfr6s r"r<z0shape_sweep_gradient_as_mesh..s$<<.s adr$rJNi`rTgv@g{Gz?rLprogressrcH tjdrdS |z}tj|r+ tjkr stjrdSdS tjkr rtjdr|z ndSs[t j| }|dkr| z } z}tj| rdStj||r| z z SdSttj }tj||r||z SdS|z S)NrnrP) rrbrarrr_rfmodr^rcrd)rtheta angle_mod end_limitvisible cover_span crosses_360 seam_progressrkspan_covers_full_circlerr start_modtaus r"raw_from_progressz7shape_sweep_gradient_as_mesh..raw_from_progress>sm  $T3 / / 3h&  '* = = !5!999/:"/ DAA:s3 04 4 4& '5'B4'M'MVHtOOSV  IeS11 s??$I%, !+IyAA3!,Y BB:% 1T99s-)ABBG(7;; *'))3$r$rPrQFTcg|] \}}}||f Sr r )r(rrgrts r"r<z0shape_sweep_gradient_as_mesh..s#III'8q%UENIIIr$c3RK|]!}|||z zzV"dSrr )r(jcolor0color1rs r"r*z/shape_sweep_gradient_as_mesh..sO@AF1IVAY!6! ;;r$)rrNrOrPr0rr)%rr:r rrpirr}r|r_rcr+rTrmax_distance_to_pointwidthheightrdrr^rarbr rr.r{rrr`rrr0ceilr-cossinr)LrrrrrBrrNrrrg norm_stopsfirst_crrOdelta base_segments max_angler_outerr_innerend_modwrapsprogress_candidates tile_count remaindertile base_progressrfportion tail_lengthseam_epsprogress_nodesr span_plus limit_thetar fan_line_rawrrawmappedrtfan_line pad_colorinsertedsamplesstart_color_componentsrhtheta0theta1 delta_thetasplitss 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_outerrrrrrrkrrrrsL ` ` @@@@@@@@@@r"rrs 'u--Az1mAG':&&"  GY ' '!  "  -C  #Ee$$ s{{!*K Y<<<<< NN+++"/s;; D55DT3JD#j//B"677 B)) U=111IC 47S=1147U?CCI((R00G DJ $$u-@'A'AA G  +s++I3S i D(#..G}}3  $T3 / / GGi4GE,:4EE9_+M 44#" (+uTZ T 12233JZ$..I C00 j!!AAt  A ADAq  & &}q4x'? @ @ @ @ A3d""T)  A ADAq*1g66   & &}q4x'? @ @ @ @"":...."":...,0009P0*t+S11  & 3   6' zBB 6 & &} 5 5 5  ' S 9 9 E( CC E+M4@@ E D4K!9::$~'??]*^-EEH *8S99 E#**=8+CDDD"$N',,  ,n28^B=OPP ,!)N2    ! !( + + + + >z* ^   ! !nQ/*<===D I -i==K -K&E&e&&&&&&&&&&&&&&PBDL"11  (: > > + +J== !5!999 h&)) 04 4 43JJSS3#::CC3FF]33FZ00UC/0000 J:<-111' 2  2"M1  OA& !-  E3 OOUEN + + +  4UK H H )A!A9 MNNN Q OO[>+CCYO P P PIILIII57G']1-4/x{###X*++ / /C%c]NFF%cAg.NFF 6/K(c:: 5#)6"2GBKKNNFF#3444 04V[II 0//C + *A B BCCDDF1fqj)) / /J[0EJ:EVEVu~....  / 7||q"*; A '/LXa[^^Z]15E5L J  Z  ,   %QZJ $(:"6"666L$(:"6"666L$(:"6"666L$(:"6"666L")!""+@@ JGdhz&:&::: Gdhz&:&::: Gdhz&:&::: Gdhz&:&::: |,|,|,     :z:>???|,|,|,     :z:>???!+ZJ %1.999HAu%999r$cg|]\}}|Sr r r(offsetrgs r"r<z)shape_linear_gradient..AAAYVQ&AAAr$rrL)r<r=r>r?r0rrrrQrrnrPFcrg|]3\}}tj|tj|/||f4Sr )rrarb)r(rr6rrs r"r<z)shape_linear_gradient..>s\ Q  '1 - -3A2KAq2Q2Q Ar$c*g|]\}}|z z |fSr r r(rr6s0rks r"r<z)shape_linear_gradient..Hs* 9 9 9v1B$" 9 9 9r$cg|]\}}|Sr r rqs r"r<z)shape_linear_gradient..U333DAqa333r$cg|]\}}|Sr r r(orgs r"r<z)shape_linear_gradient..V999DAqa999r$)r,rrrrr;rr+rcrrdrbproject_interval_on_axisrrrr.rr{reversedr)2rarcrrrBrrNrgnormalized_stopsrr0rgradientuse_raw_period tile_stops base_startbase_end base_spantmintmaxLrMrN tmin_norm tmax_norm start_tileend_tileexpandedkshiftrfrmirroredmarginclippedsNrenormlam0lam1nx1ny1nx2ny2mergedlinear_gradient_colorslinear_gradient_boundsrrrrks2 @@@@r"shape_linear_gradientr&s :8999(/ >>M%4Ut%L%L%L"A,000DL :9(8999AA*:1R4*@AAA!    'd*Bs9~~/BN,B2BJ  ! ! !Aq!J"~a HHz)>+CDDI C00&  % 11"b"bAAMD$ C((  !!$Q')9")=a)@B8    qIqIY3y@AAAEJy)j0I=>>BH68H :x!| , , 1 1I  07 7 7AEa<<$ 2 23C 01111 2#:.. 1 13 :- 9Q^L30000 1 C FFAFA    AB QB rBw0 1 1D 9 9 9 9 9 9 9 9F D 9D trBw C trBw C trBw C trBw C#6 * *F33F33399F1R4L999  %%   H#H Or$rnrfxfyfrc ./012|stdtj|}t|d\} } } dkrtddkrdkr|tjks|Bd| D} d | d d D} t | | dd }| |_|S| duot| d k}|r| n| }|J|dd/|d d}t|/z tj .tj .drd/d.| }tj rBd| D} d| d d D} t | | dd }| |_|Sdtdtf./fd }dtdttttfffd }|}|fd}t|D]L} ||}||\}}}tj ||||rn|.z }M||.zz}d}||krt#j||z .z }g}t|d zD]}}|.z}|tjks |d zdkr#|D]\}}|||z|f Ct+|D]*\}}|/z.z|/z z } || |f+~|s |dd}|.zdz00fd|D}|dd1|d d}!t|!1z tj 212fd|D}"|1}#||!}$||#\}%}&}'||$\}(})}*t-|"}+d|+D},d|+d d D}-t |%|&|'|(|)|*|,|-dd }| |_|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. rETr@rzOuter radius r must be >= 0rnNcg|]\}}|Sr r rs r"r<z)shape_radial_gradient..rr$cg|]\}}|Sr r rs r"r<z)shape_radial_gradient..rr$rrL) rFrGrHrIrJrKr0rrrrQrPcg|]\}}|Sr r rs r"r<z)shape_radial_gradient..rr$cg|]\}}|Sr r rs r"r<z)shape_radial_gradient..rr$sigmarc|z z Srr )r0r r s r"sigma_to_lambdaz.shape_radial_gradient..sigma_to_lambdas "i//r$lamcht|t|t|fSrr')r3rrr*r(r)r's r" circle_atz(shape_radial_gradient..circle_ats: R   R   Q    r$rc,g|]}|dk|Srwr )r(pair clip_limits r"r<z)shape_radial_gradient..s'CCCT!W -B-B-B-B-Br$c*g|]\}}|z z |fSr r rs r"r<z)shape_radial_gradient..s* : : :v1B$" : : :r$cg|]\}}|Sr r rqs r"r<z)shape_radial_gradient..rr$cg|]\}}|Sr r rs r"r<z)shape_radial_gradient..rr$F)r,rrrrrErr+rcrrdrbr`rTr-r.rrrrr{rr)3rrr'rBr(r)r*rrNrgrrr0rrr r r r2r5 target_sigma max_tilesr3cx_lamcy_lamr_lam tiles_neededrrrrfrrrrrrrrsrexeyerr#radial_gradient_colorsradial_gradient_boundsr r r9rrks3``` ``` @@@@@r"shape_radial_gradientrIfs" :8999(/ >>M%4Ut%L%L%L"A1uu6777 Avv  z  z  Avv ,000DL :9(8999AA*:1R4*@AAA! "    'd*Bs9~~/BN,B2BJ  ! ! !Aq!J"~a HHz)>+CDDI C00&  % Ar""99(8999AA*:1R4*@AAA! "    '0u00000000 u ueU':!;           L  y!! < rQsx  ;;;;;;;;;;;;                    ('''''????????????<<<<<<<<<<%$$$$$$Ee%= UCZ="5#:.=38= 5#:====U c4;>N8O&"F0 F0F0F0 E%ucz!223 4F0F0 F0  3U5%<()8Due|9L4M+N NO F0F0F0F0R E%ucz!223 4 eE5,,-.<&%&!5&%&&&& !$uUE\23 ! !%s BS ! ! ! ! %u % & %u +$+$+$+$+$i+$+$+$\I.        GGGGGIGGG,%%%%%i%%%PD*D*D*D*D*sD*D*D*N66666X666r<<<<<X<<<~\\\\\"\\\~L#L#L#L#L#IL#L#L#n#!&`` ` `` ` E%ucz!223 4 ` ( ` `sm``````R 7K6N$(@@ @ @ @  @ E%ucz!223 4 @ -s23 @ = !@@@@@P6J6N$(ee e e e E%ucz!223 4 e  e  e e-s23e = !eeeeeeer$