
    Q?h6                        S r SSKrSSKrSSKrSSKrSSKrSSKJrJr  SSK	J
r
  SSKJr  SSKJr  SSKJrJrJr  SSKJrJrJr  SS	K7  SS
KJr  SSKJrJrJr  SSKJrJr  SSKJ r   SSK!J"r"  \RF                  r#\RH                  r$\RJ                  r%SRM                  5       r'SRM                  5       r(SRM                  5       r)SRM                  5       r*SRM                  5       r+\RX                  4S jr-\RX                  4S jr.SS\RX                  4S jr/S r0S'S jr1 " S S\25      r3\SSSSS\SSSSS0r4S  r5 " S! S"5      r6 " S# S$\5      r7S(S% jr8\9S&:X  a  \8" 5         gg))a  An experimental SVG renderer for the ReportLab graphics framework.

This will create SVG code from the ReportLab Graphics API (RLG).
To read existing SVG code and convert it into ReportLab graphics
objects download the svglib module here:

  http://python.net/~gherman/#svglib
    N)BytesIOStringIO)stringWidth)fp_str)asNative)getStateDeltaRendererrenderScaledDrawing)STATE_DEFAULTSPathUserNode)*)	rl_config)RLString	isUnicodeisBytes)FILL_EVEN_ODDFILL_NON_ZERO   )	_getImage)getDOMImplementationzsstroke-width stroke-linecap stroke stroke-opacity fill fill-opacity stroke-dasharray stroke-dashoffset fill-rule idzWstroke-width stroke-linecap stroke stroke-opacity stroke-dasharray stroke-dashoffset idz<font-family font-weight font-style font-variant font-size idzTstroke-width stroke-linecap stroke stroke-opacity stroke-dasharray stroke-dashoffsetzfill fill-opacityc                 R    [        5       n[        X4SU0UD6  UR                  5       $ )z>Returns a SVG as a string in memory, without touching the diskshowBoundary)r   
drawToFilegetvalue)dr   kwdsss       N/var/www/html/env/lib/python3.13/site-packages/reportlab/graphics/renderSVG.pydrawToStringr    '   s'    
Aq6,66::<    c                     [        U 5      n [        U R                  U R                  440 UD6n[	        XSSUS9  UR                  U5        g )Nr   r   )r
   	SVGCanvaswidthheightdrawsave)r   fnr   r   cs        r   r   r   -   sA    AA177AHH%--Aq!,/FF2Jr!   c                 L    [        5       nUR                  [        U 5      XX4S9  g)zAs it says.r#   N)_SVGRendererr'   r
   )drawingcanvasxyr   rs         r   r'   r'   3   s!    AFFw'AFQr!   c                 x    / n[        S[        U 5      S5       H  nUR                  X   XS-      45        M     U$ )zc
given a list of coordinates [x0, y0, x1, y1....]
produce a list of points [(x0,y0), (y1,y0),....]
r      r   )rangelenappend)LPis      r   _pointsFromListr:   9   s?     	A1SVQ	!$A#    Hr!   c                     U R                  U5      nUR                  5        HU  u  pV[        U5      nU(       d  UR                  XW5        M*  UR	                  U5      nUR                  XX=(       d    U5        MW     U$ )ao  Transform a DOM node into new node and copy selected attributes.

Creates a new DOM node with tag name 'newTag' for document 'doc'
and copies selected attributes from an existing 'node' as provided
in 'attrDict'. The source 'node' can be None. Attribute values will
be converted to strings.

E.g.

    n = transformNode(doc, "node1", x="0", y="1")
    -> DOM node for <node1 x="0" y="1"/>

    n = transformNode(doc, "node1", x=0, y=1+1)
    -> DOM node for <node1 x="0" y="2"/>

    n = transformNode(doc, "node1", node0, x="x0", y="x0", zoo=bar())
    -> DOM node for <node1 x="[node0.x0]" y="[node0.y0]" zoo="[bar()]"/>
)createElementitemsstrsetAttributegetAttribute)	docnewTagnodeattrDictnewNodenewAttrattrsattrattrVals	            r   transformNoderJ   E   sk    ( 'G!)T  0''.G  *:U; * Nr!   c                       \ rS rSrSr\R                  \R                  \R                  \R                  \R                  \R                  S.rS	S jrS rS rSrg)
EncodedWriterd   z}
EncodedWriter(encoding) assumes .write will be called with
either unicode or utf8 encoded bytes. it will accumulate
unicode
)zutf-32z	utf-32-bez	utf-32-lezutf-16z	utf-16-bez	utf-16-lec                     [         R                  U 5        [        R                  " U5      R                  =U l        nU(       a  SU;   d  SU;   a  U R                  U R                  U   5        g g )N1632)list__init__codecslookupnameencodingwriteBOMS)selfrV   boms      r   rR   EncodedWriter.__init__r   sT    d#)==#:#?#??48#tx'7JJtyy*+ (8r!   c                 4   [        U5      (       a   UR                  S5      nO'[        U5      (       d  [        S[        U5      -  5      eU R                  U5        g !   [        R                  " 5       u  p#n[	        U5      nAA[        SU< SU< 35      e= f)Nutf-8zString z not encoded as 'utf-8'
error=z?EncodedWriter.write(%s) argument should be 'utf-8' bytes or str)	r   decodesysexc_infor>   
ValueErrorr   asciir6   )rY   uetevtbs        r   rW   EncodedWriter.writex   s    1::XXXg& 1^afghaiijjAX \\^
W QRSU!VWWs   A :Bc                 2    SR                  U 5      nU S S 2	 U$ )N join)rY   r1   s     r   r   EncodedWriter.getvalue   s    GGDMGr!   rV   N)F)__name__
__module____qualname____firstlineno____doc__rS   	BOM_UTF32BOM_UTF32_BEBOM_UTF32_LE	BOM_UTF16BOM_UTF16_BEBOM_UTF16_LErX   rR   rW   r   __static_attributes__ r!   r   rL   rL   d   sU     !!''''!!''''
D,r!   rL   nonzeroznon-zeroevenoddzeven-oddc                  2    SR                  S U  5       5      $ )N c              3   h   #    U  H(  nS U-  R                  S5      R                  S5      v   M*     g7f)z%f0.N)rstrip).0as     r   	<genexpr>py_fp_str.<locals>.<genexpr>   s-     FAdQh&&s+22377s   02rj   )argss    r   	py_fp_strr      s    88FFGGr!   c                   ~   \ rS rSrS1S jrS2S jrS3S jr/ S4S jrS	 rS
 r	SS\
S4S jrS rS r/ S4S jrS rS rS rS rS rS rS4S jrS4S jrS5S jr  S6S jr  S7S jrS rS8S jrS rS2S jrS2S jrS9S jrS:S  jr S;S! jr!S3S" jr"S# r#\$" SS$94S% jr%S& r&S' r'S( r(S) r)S* r*S+ r+S, r,S- r-S. r.S/ r/S0r0g)<r$      r   c           	      	  ^  UT l         [        R                  " U5      R                  T l        UT l        UR                  SS5      nUR                  S0 5      T l        UR                  SS5      T l        UR                  SS5      n[        T l
        U=u  T l        T l        T l        / T l        0 T l        ST l        S=T l        =T l        =T l        =T l        =T l        =T l        T l        UR                  SS5      (       a  [0        T l        O[2        T l        U 4S	 jT l        [7        S
5      nUR9                  SSS5      n	UR;                  SSU	5      T l        T R<                  R>                  T l         [C        [E        US   5      [E        T R                  5      SST R                  T R                  4-  SSS9n
[F        T R                     U
S'   SU
S'   U
RI                  UR                  S0 5      5        U
RK                  5        H   u  pT R@                  RM                  X5        M"     T R<                  RO                  S5      nT R<                  RQ                  S5      nURS                  U5        T R@                  RS                  U5        T R<                  RO                  S5      nT R<                  RQ                  S5      nURS                  U5        T R@                  RS                  U5        T RU                  [V        S   [V        S   5        T RY                  [V        S   5        T R[                  S5        T R]                  S5        T R_                  S5        U(       dw  [a        T R<                  S S!S"9n[a        T R<                  S#SST R                  T R                  S$9nURS                  U5        T R@                  RS                  U5        [C        S%S&9nO"[C        ST R                  T R                  4-  S'9n[a        T R<                  S(4S)S*T R                  -  S+.UD6T l1        U(       af  [a        T R<                  S(US,S+9T l2        T Rd                  RS                  T Rb                  5        T R@                  RS                  T Rd                  5        O%T R@                  RS                  T Rb                  5        T Rb                  T l3        g)-a  
verbose = 0 >0 means do verbose stuff
useClip = False True means don't use a clipPath definition put the global clip into the clip property
                to get around an issue with safari
extraXmlDecl = ''   use to add extra xml declarations
scaleGroupId = ''   id of an extra group to add around the drawing to allow easy scaling
svgAttrs = {}       dictionary of attributes to be applied to the svg tag itself
useClipF	fontHacksextraXmlDeclri   scaleGroupIdN
use_fp_strc                  B   > TR                   " U 6 R                  SS5      $ )Nr~   ,)r   replace)r   rY   s    r   <lambda>$SVGCanvas.__init__.<locals>.<lambda>   s    T[[$%7%?%?C%Hr!   minidomsvgz-//W3C//DTD SVG 1.0//ENz8http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtdr   zxMinYMin meetz	0 0 %d %dzhttp://www.w3.org/2000/svgz1.0)r%   r&   preserveAspectRatioviewBoxxmlnsversion	fill-rulezhttp://www.w3.org/1999/xlinkzxmlns:xlinksvgAttrstitlez...descfontNamefontSizestrokeColorr3   r   clipPathclip)idrect)r/   r0   r%   r&   zclip-path: url(#clip))style)r   ggroupzscale(1,-1) translate(0,-%d))r   	transformz
scale(1,1))4verboserS   rT   rU   rV   rZ   popr   r   r   	_fillModer%   r&   sizecoder   path_strokeColor
_fillColor
_lineWidth_font	_fontSize_lineCap	_lineJoinr   r   cfp_strr   createDocumentTypecreateDocumentrA   documentElementr   dictr>   _fillRuleMapupdater=   r?   r<   createTextNodeappendChildsetFontr   setStrokeColor
setLineCapsetLineJoinsetLineWidthrJ   	groupTree	scaleTree	currGroup)rY   r   rV   r   rZ   r   r   r   implementationdoctyper   kvr   textr   r   clipRectgtkws   `                  r   rR   SVGCanvas.__init__   s    h/44((9U++b1 HH^B7xxr2&.22
DK$)	
	 "	" 	"DO 	"do 	"J	"	"*.-N88L'' DK#DKH-i8 !33E+LN "00eGD88++QLt{{+(7'4::t{{*CC 7!
 !-T^^ <"@B/0>>#CAHH!!!& $ &&w/xx&&u-$U#xx%%f-xx&&u-T"^J/
1KLN=9:!$TXXzfEH$TXXvajj6H  *HH  *56D[DJJt{{+CCDD&txx 4t{{B  *488S\UabDNNN&&t~~6HH  0HH  0r!   Nc                    [        U R                  U R                  S9nU R                  R	                  USSU R                  S9  [        US5      (       a  UnO[        USU R                  S9nUR                  5       nU R                  nU(       a  UR                  SSU-   5      nUR                  U5        X1La  UR                  5         g g )	N)rZ   	
)	addindentnewlrV   rW   wrm   z?>)rL   rV   rZ   rA   writexmlhasattropenr   r   r   rW   close)rY   r)   writerfr   exds         r   r(   SVGCanvas.save  s    t}}:&4T4==Q2gARdmm4Aoo++d48,C	;GGI r!   c                 n    U=(       d    U R                   nU=(       d    U R                  n[        XU5      $ )zeReturn the logical width of the string if it were drawn
in the current font (defaults to self.font).
)r   r   r   )rY   r   fontr   s       r   NOTUSED_stringWidthSVGCanvas.NOTUSED_stringWidth  s-    
 !tzz-t~~1H--r!   ri   c                    U R                   R                  5       nUR                  U5        [        UR	                  5       5      nU(       a  U Vs/ s H  ofU;   d  M
  UPM     nnU(       a;  UR                  5       nU Vs/ s H  ofU;  d  M
  US-   [        XF   5      -   PM     nnO"U Vs/ s H  ofS-   [        XF   5      -   PM     nnSR                  U5      S-   $ s  snf s  snf s  snf )Nz: z; ;)r   copyr   rQ   keyssplitr>   rk   )rY   includeexcluder   r   r   r   r=   s           r   _formatStyleSVGCanvas._formatStyle   s    

!TEJJL!#4t!G|AtD4mmoG37L4aG;K)QtVCM)4ELE3784atVCM)4E8yy#%% 5 M8s   	CC 	C"C"+C'c                     U$ )zKI don't think this was ever needed; seems to have been copied from renderPSrz   )rY   r   s     r   _escapeSVGCanvas._escape-  s    r!   c                     g)zPCalculate the path for an arc inscribed in rectangle defined
by (x1,y1),(x2,y2).N)abs)rY   x1y1x2y2startAngextentxScaleyScaler/   r0   codelinearcdatas                 r   _genArcCodeSVGCanvas._genArcCode1  s     	r!   c                     0 nU(       a  [         U   US'   [        U R                  SU R                  U R	                  U5      S9nU(       a  U R                  Xs5      nU R                  R                  U5        SU l        g )Nr   r   r   r   ri   )r   rJ   rA   r   r   	_add_linkr   r   )rY   r   r   	link_infostylesfillModextrar   s           r   _fillAndStrokeSVGCanvas._fillAndStrokeG  sk     ,X 6DTXXviit008 >>$2D""4(	r!   c                 `    SSSS.nU R                   U:w  a  Xl         X!   U R                  S'   g g )Nbuttroundsquarer   r   r3   stroke-linecap)r   r   rY   r   valss      r   r   SVGCanvas.setLineCapU  s5    Gx0==AM+/7DJJ'( r!   c                 `    SSSS.nU R                   U:w  a  Xl         X!   U R                  S'   g g )Nmiterr	  bevelr  r  )r   r   r  s      r   r   SVGCanvas.setLineJoin[  s5    W0>>QN+/7DJJ'( r!   c                    [        U[        [        45      (       a.  SR                  [	        [
        X/5      5      U R                  S'   g[        U[        [        45      (       ai  [        U5      S:  aY  US:  d   S5       eSR                  [	        [
        U5      5      U R                  S'   US:  a  [        U5      U R                  S'   gggg)z7Two notations. Pass two numbers, or an array and phase., zstroke-dasharrayr   zphase is a length in user spacezstroke-dashoffsetN)

isinstancefloatintrk   mapr>   r   tuplerQ   r5   )rY   arrayphases      r   setDashSVGCanvas.setDasha  s     eU3K((-1YYs3%7Q-RDJJ)*uTl++E
QA:@@@:-1YYs3-GDJJ)*Qw25e*

./  1?+r!   c                 D   Xl         US :X  a  SU R                  S'   g UR                  UR                  UR                  pCnSUS-  US-  US-  4-  U R                  S'   UR
                  nUS:w  a  SU-  U R                  S'   g SU R                  ;   a  U R                  S	 g g )Nnonestrokergb(%d%%,%d%%,%d%%)rM   r   %szstroke-opacity)r   r   redgreenbluenormalizedAlpharY   colorr1   r   balphas         r   r   SVGCanvas.setStrokeColorl  s    !D=#)DJJx iiejj!A#8AcE1S5!C%;P#PDJJx ))Eax/3e|

+,!TZZ/JJ/0 0r!   c                 D   Xl         US :X  a  SU R                  S'   g UR                  UR                  UR                  pCnSUS-  US-  US-  4-  U R                  S'   UR
                  nUS:w  a  SU-  U R                  S'   g SU R                  ;   a  U R                  S	 g g )Nr   fillr"  rM   r   r#  zfill-opacity)r   r   r$  r%  r&  r'  r(  s         r   setFillColorSVGCanvas.setFillColory  s    D=!'DJJviiejj!A!6!C%3#9N!NDJJv))Eax-1E\

>*4::-JJ~. .r!   c                 <    Xl         [        U   U R                  S'   g )Nr   )r   r   r   )rY   r   s     r   setFillModeSVGCanvas.setFillMode  s    ".q/

;r!   c                 L    XR                   :w  a  Xl         XR                  S'   g g )Nzstroke-width)r   r   )rY   r%   s     r   r   SVGCanvas.setLineWidth  s"    OO##O).JJ~& $r!   c                    U R                   U:w  d  U R                  U:w  a  Xl         X l        U R                  n[         H  nXC;   d  M
  X4	 M     XR                  ;   a  U R                  U   O0 n[        U[        5      (       a2  UR                  [        UR                  R                  5       5      5        U(       a.  UR                  5        H  u  pFSU-   nU[        ;   d  M  XcU'   M     SU;  a  XS'   SU-  US'   g g )Nzfont-zfont-familyz%spxz	font-size)r   r   r   TEXT_STYLESr   r  r   r   iterr   r=   )rY   r   r   r   r   r   r   r   s           r   r   SVGCanvas.setFont  s    ::8!;J%NJJE : ! 04~~/Et~~d+2H$x((T]]%8%8%: ;<#>>+CA	AK'#$a , E)'+m$!'(!2E+# "<r!   c                     [        U[        5      (       d   e[        U R                  S40 UD6nUR	                  U5        U$ )Nr   )r  r   rJ   rA   r   )rY   
dom_objectr  links       r   r   SVGCanvas._add_link  s=    )T****TXXs8i8$r!   c           
      `   U R                   (       a  [        S5        [        X5      n	[        X$5      n
0 n[        U R                  S4X[        X5      U	-
  [        X$5      U
-
  U R                  [        5      S.UD6nU(       a  U R                  X5      nU R                  R                  U5        g)z)Draw a rectangle between x1,y1 and x2,y2.z+++ SVGCanvas.rectr   )r/   r0   r%   r&   r   N)r   printminrJ   rA   maxr   AREA_STYLESr   r   r   )rY   r   r   r   r   rxryr  	_svgAttrsr/   r0   r   r   s                r   r   SVGCanvas.rect  s     <<34JJTXXv >CJqLRA##K0>3<> >>$2D""4(r!   c                     [        U R                  S4XX1-
  XB-
  XVU R                  [        5      S.UD6n	U(       a  U R	                  X5      n	U R
                  R                  U	5        g)zDraw a rounded rectangle between x1,y1 and x2,y2.

Corners inset as ellipses with x-radius rx and y-radius ry.
These should have x1<x2, y1<y2, rx>0, and ry>0.
r   )r/   r0   r%   r&   rC  rD  r   NrJ   rA   r   rB  r   r   r   )
rY   r   r   r   r   rC  rD  r  rE  r   s
             r   	roundRectSVGCanvas.roundRect  sc     TXXv ?beBEb##K0?4=? >>$2D""4(r!   c           	         US:X  a  g [        U5      nU R                  (       a  [        S5        US:H  =(       d    US:H  =(       d    US:H  =(       d    US:H  n	US:H  =(       d    US:H  =(       d    US:H  =(       d    US:H  n
U R                  S :w  a  U	(       d  U R                  S :w  Ga  U
(       Ga  US	;  a{  [        XR                  U R                  5      nUS
:X  a  X+-  nOPUS:X  a  X+S-  -  nOBUS:X  a%  U[        XaXR                  U R                  5      -  nO[        S[        U5      -   5      eU R                  U5      nU R                  [        5      nUS:w  a  USU R                  XBU5      -  -   nU	(       a  XR                  [        5      -  nOUS-  nU
(       a  XR                  [         5      -  nOUS-  n[#        U R$                  S4X#USSU-  -  S.UD6nU R$                  R'                  U5      nUR)                  U5        U(       a  U R+                  X5      nU R,                  R)                  U5        g g g )N   z+++ SVGCanvas.drawStringr   r3         r      )start	inheritedleftendmiddle       @numericzbad value for text_anchor z rotate(%s);z fill:none;z stroke:none;r   ztranslate(0,%d) scale(1,-1))r/   r0   r   r   )r   r   r?  r   r   r   r   r   numericXShiftra   r>   r   r   r7  r   EXTRA_FILL_STYLESEXTRA_STROKE_STYLESrJ   rA   r   r   r   r   )rY   r   r/   r0   angler  text_anchortextRenderModerE  needFill
needStroketextLenstr   contents                  r   
drawStringSVGCanvas.drawString  s   1fQK<<9:!1$c(9c^Q=NcR`bcRc#Q&e.!*;e~q?PeTbdeTe
OOT!hD4E4Et4KPZ"@@%a

4>>B%LA (*OA )+{WZZWWA$%ACDT%TUUQA"";/Bz$++e*BBBr''(9::m#''(;<<o% !6 71Q3? D
 hh--a0GW%~~d6NN&&t,I Q[4Kr!   c                 l    U R                   (       a  [        S5        U R                  " XU4XFUUS.UD6  g )Nz+++ SVGCanvas.drawCentredStringrZ  r  r[  r\  r   r?  rb  )	rY   r   r/   r0   rZ  r[  r  r\  rE  s	            r   drawCentredStringSVGCanvas.drawCentredString  s5    <<@AA 	<EK-	<1:	<r!   c                 l    U R                   (       a  [        S5        U R                  " XU4XFUUS.UD6  g )Nz+++ SVGCanvas.drawRightStringre  rf  )	rY   r   r/   r0   rZ  r[  r  r\  rE  s	            r   drawRightStringSVGCanvas.drawRightString  s5    <<>?q 	<u{-	<1:	<r!   c                 :    U R                   R                  U5      ng)zAdd a comment.N)rA   createComment)rY   r   comments      r   rn  SVGCanvas.comment  s     ((((.r!   c                 8   [        5       nUR                  US5        [        [        R                  " UR                  5       5      5      nU R                  R                  [        U R                  SX#XESU-   SU R                  SSSSSUSU-  -   5      -  S	95        g )
Npngimagezdata:image/png;base64,
matrix(%s)r   r   r3   )r/   r0   r%   r&   hrefr   )r   r(   r   base64	b64encoder   r   r   rJ   rA   r   )rY   rr  r/   r0   r%   r&   embedbufs           r   	drawImageSVGCanvas.drawImage
  s    i

3uv''78""dhhw%1#5*T\\!Aa1VAaCZ-PP	r!   c                     U R                   S :w  am   [        U R                  SSU R                  X5      < SU R                  X45      < S3U R                  [        5      S9nU R
                  R                  U5        g g )Nr   M  L z Zr   )r   rJ   rA   r   LINE_STYLESr   r   r   )rY   r   r   r   r   liner   s          r   r  SVGCanvas.line  sh    $
 !6#'<<#6t||B7JK''46D NN&&t, %r!   c                     [        U R                  SX-   S-  X$-   S-  X1-
  S-  XB-
  S-  U R                  [        5      S9nU(       a  U R	                  Xe5      nU R
                  R                  U5        g)zkDraw an orthogonal ellipse inscribed within the rectangle x1,y1,x2,y2.

These should have x1<x2 and y1<y2.
ellipserU  )cxcyrC  rD  r   NrH  )rY   r   r   r   r   r  r  s          r   r  SVGCanvas.ellipse"  sj    
  )s{s{s{s{##K02 nnW8G""7+r!   c           
          [        U R                  SXUU R                  [        5      S9nU(       a  U R	                  XT5      nU R
                  R                  U5        g )Ncircle)r  r  r1   r   rH  )rY   xcycr1   r  r  s         r   r  SVGCanvas.circle0  sL    txxA##K02 ^^F6F""6*r!   c
                      g N)r   r   r   r6   r   )rY   r   r   r   r   x3y3x4y4closedr   r   s               r   	drawCurveSVGCanvas.drawCurve:  s    r!   c                    X-   S-  X$-   S-  pX1-
  S-  XB-
  S-  pU
[        U[        -  S-  5      -  U-   nU[        U[        -  S-  5      -  U	-   nU
[        XV-   [        -  S-  5      -  U-   nU[        XV-   [        -  S-  5      -  U	-   nU R                  n/ R                  nU(       a  U" SU" X5      < SU" X5      < 35        U(       a   U" SU" X5      SUS:  SU" X5      4-  5        O&U" SU" X5      U" X5      SUS:  SU" X5      4-  5        U(       a  U" SU" X5      -  5        [        U R                  S	S
R                  UR                  5      U R                  5       S9nU R                  R                  U5        g)zDraw a partial ellipse inscribed within the rectangle x1,y1,x2,y2.

Starting at startAng degrees and covering extent degrees. Angles
start with 0 to the right (+x) and increase counter-clockwise.
These should have x1<x2 and y1<y2.
rU     r}  r~  zA %s %d %d %d %sr   zM %s A %s %d %d %d %s ZzL %s Zr   r~   r   N)cospisinr   r6   rJ   rA   rk   __self__r   r   r   )rY   r   r   r   r   r   r   
fromcenterr  r  rC  rD  mxmyaxayr   r   r   s                      r   drawArcSVGCanvas.drawArcG  s    %ruckB%ruckB#hrk#o&&+#hrk#o&&+#x*3.//"4#x*3.//"4,,IIWR_gbo>? r63;72?CD E 'rFCKGBOTU V h()TXXvhhqzz"$*;*;*=?""4(r!   c                    [        U5      S:  d   S5       eU R                  S :w  d  U R                  S :w  a  SR                  U Vs/ s H  n[	        U6 PM     sn5      n[        U R                  SXPR                  [        5      S9nU(       a  U R                  Xc5      nU R                  R                  U5        g g s  snf )Nr3   z"Polygon must have 2 or more pointsr  polygonpointsr   )r5   r   r   rk   r   rJ   rA   r   rB  r   r   r   )rY   r  r  r  pptspolylines          r   r  SVGCanvas.polygoni  s    6{aE!EEd"doot&;))8AVQZ89C$TXXy"3"3K"@BH >>(>NN&&x0 '<8s   B<c                     g r  )r   r   r6   r   )rY   lineListr)  r%   r   r  s         r   linesSVGCanvas.linesx  s    r!   c           
      0   [        U5      S:  d   S5       eU R                  S :w  ak  SR                  U Vs/ s H  n[        U6 PM     sn5      n[	        U R
                  SX0R                  [        S S9S9nU R                  R                  U5        g g s  snf )Nr   z#Polyline must have 1 or more pointsr  r  )r.  r  )
r5   r   rk   r   rJ   rA   r   rB  r   r   )rY   r  r  r  r  s        r   polyLineSVGCanvas.polyLine  s    6{aF!FF$))8AVQZ89C$TXXz"3"3KT"3"JLHNN&&x0	 %8s   B)r   c                     U R                   (       a  [        S5        U R                  n[        U R                  S40 UD6nUR                  U5        X0l        U R                   (       a  [        S5        U$ )Nz+++ begin SVGCanvas.startGroupr   z+++ end SVGCanvas.startGroup)r   r?  r   rJ   rA   r   )rY   rD   r   r   s       r   
startGroupSVGCanvas.startGroup  sW    <<?@NN	dhh8x8e$<<=>r!   c                     U R                   (       a  [        S5        Xl        U R                   (       a  [        S5        g g )Nz+++ begin SVGCanvas.endGroupz+++ end SVGCanvas.endGroup)r   r?  r   )rY   r   s     r   endGroupSVGCanvas.endGroup  s'    <<=>"<<;<<r!   c           	          U R                   (       a  [        SXX4XV5        U R                  R                  S5      nXX4XV4S:w  a:  SU R	                  XX4XV5      -  nU R                  R                  SU< SU< 35        g g )Nz!!! begin SVGCanvas.transformr   )r   r   r   r   r   r   rs  r~   )r   r?  r   r@   r   r?   )	rY   r   r*  r*   r   er   trts	            r   r   SVGCanvas.transform  sp    <<>aAQ^^((5!!33t||AA88ANN''A5FG 4r!   c           
          X4S:w  aO  U R                   R                  SU R                   R                  S5      < SSU R                  X5      -  < 35        g g )N)r   r   r   r~   ztranslate(%s))r   r?   r@   r   rY   r/   r0   s      r   	translateSVGCanvas.translate  sL    5E>NN''>>..{;#dll1&7769 : r!   c           
          X4S:w  aR  U R                   R                  SU R                  S   R                  S5      < SSU R	                  X5      -  < 35        g g )N)r   r   r   rt  r~   z	scale(%s))r   r?   groupsr@   r   )rY   sxsys      r   scaleSVGCanvas.scale  sQ    7eNN''{{233K@#dll2&::6< = r!   c                 P    U R                   SU R                  X5      -  -   U l         g )NzM %s r   r   r  s      r   moveToSVGCanvas.moveTo       II$++a*; ;;	r!   c                 P    U R                   SU R                  X5      -  -   U l         g )NzL %s r  r  s      r   lineToSVGCanvas.lineTo  r  r!   c           
      T    U R                   SU R                  XX4XV5      -  -   U l         g )NzC %s r  )rY   r   r   r   r   r  r  s          r   curveToSVGCanvas.curveTo  s$    II$++bbb*M MM	r!   c                 ,    U R                   S-   U l         g )NzZ )r   rY   s    r   	closePathSVGCanvas.closePath  s    II$	r!   c                     g r  rz   r  s    r   	saveStateSVGCanvas.saveState      r!   c                     g r  rz   r  s    r   restoreStateSVGCanvas.restoreState  r  r!   )r   r   r   r   r   r   r   r   rZ   r   r   r   rA   rV   r   r   r   r   r&   r   r   r   r   r   r   r%   )),  r  r]   r   Fr  )NN)   r  N)r   NrR  r   )r   rT  Nr   )r   rS  Nr   )T)r   )r   ih  r   )r   N)1rn   ro   rp   rq   rR   r(   r   r   r   r   rB  r  r   r   r  r   r/  r2  r   r   r   r   rI  rb  rg  rj  rn  rz  r  r  r  r  r  r  r  r  r   r  r  r   r  r  r  r  r  r  r  r  ry   rz   r!   r   r$   r$      s   j(X$. $&r &, )*TVZ 
33 a 	=1/2/
3()") +-Z ?G+,< ?D+,</

-,+) )D1P1 "&!3 =
H:=<<N%r!   r$   c                       \ rS rSrSrS rS rSSSSS	S
SS.rS rS r	S r
S rS rS rS rS rS rS r\4S jrS rS rSrg)r,   i  z%This draws onto an SVG document.
    c                     SU l         g )Nr   r   r  s    r   rR   _SVGRenderer.__init__  s	    r!   c                 `   U R                   (       a  [        SU-  5        U R                  R                  SU-  5        U R                  R                  R                  5       n[        U[        5      (       a  UR                  (       d   [        U5      nU R                  R                  U5        U R                  U0 5        U R                  U5        U R                  R                  5       n[        U[        5      (       a  UR                  (       d   U R                  R                  SU-  5        UR                  5        H:  u  pVXPR                   ;   d  M  [#        U R                  U R                   U   U5        M<     X R                  l        U R                   (       a  [        SU-  5        gg)zGThis is the recursive method called for each node in the tree.
        z#### begin _SVGRenderer.drawNode(%r)zbegin node %rzend node %rz!### end _SVGRenderer.drawNode(%r)N)r   r?  _canvasrn  r   r   r  r   
isClipPathr   _trackerpushapplyStateChangesdrawNodeDispatcherr   r=   	_restoressetattr)rY   rC   r   deltasrDeltasr   r   s          r   drawNode_SVGRenderer.drawNode  s3    <<DtKL_T12""'')4&&4?? t$6"vr* 	%--##%4&&4??]4/0 MMODANN"T^^A%6q9 $ #<<BTIJ<r!   r   r   r   r   r   r   r   )r   strokeWidthstrokeLineCapstrokeLineJoin	fillColorr   r   c                 t    [        USS5      =(       d    Sn[        USS5      =(       d    SnU(       a  X#SS.$ g )NhrefURLri   	hrefTitle_top)z
xlink:hrefzxlink:titletarget)getattr)rY   objurlr   s       r   _get_link_info_dict _SVGRenderer._get_link_info_dict  s?     c9b)/R["-3 "%FKK$ r!   c                    U R                   (       a  [        S5        U R                  R                  5       nU R                  R                  5       S   u  p4pVpxUR                  5        H<  n	[        U	[        5      (       a  U	R                  5       n
OU	n
U R                  U
5        M>     U R                  R                  X4XVXx5        U R                  R                  U5        U R                   (       a  [        S5        g g )Nz ### begin _SVGRenderer.drawGroupr   z### end _SVGRenderer.drawGroup)r   r?  r  r  r  getStategetContentsr  r   provideNoder  r   r  )rY   r   r   r   r*  r*   r   r  r   	childNodenode2s              r   	drawGroup_SVGRenderer.drawGroup	  s    <<ABLL++-	==113K@aA**,I)X..!--/!MM%  - 	qQ10i(<<?@<r!   c                 F   U R                  U5      n[        US0 5      nUR                  UR                  s=:X  a  S:X  ah  O  OeU R                  R
                  " UR                  UR                  UR                  UR                  -   UR                  UR                  -   4SU0UD6  g U R                  R                  " UR                  UR                  UR                  UR                  -   UR                  UR                  -   UR                  UR                  4SU0UD6  g )NrE  r   r  )r  r  rC  rD  r  r   r/   r0   r%   r&   rI  )rY   r   r  r   s       r   drawRect_SVGRenderer.drawRect  s    ,,T2	4B/77dgg""LLFFDFFFF4::%tvvdkk'9\EN\RZ\ LL""FFDFFFF4::%tvvdkk'9GGTWW5 (	5 ,4	5r!   c           
         U R                   R                  5       nUS   UR                  UR                  UR                  4u  p4pVU R
                  R                  " XdU4U R                  U5      U[        USS5      S.[        US0 5      D6  g )N
textAnchorr\  r   )r  r[  r\  rE  )	r  r  r/   r0   r   r  rb  r  r  )rY   	stringObjSr[  r/   r0   r   s          r   rb  _SVGRenderer.drawString*  s    MM""$"#L/9;;	Y^^"[q 	943K3KI3V'	JZ[\8]	9iB7	9r!   c                     U R                   R                  (       aG  U R                   R                  UR                  UR                  UR
                  UR                  5        g g r  )r  r   r  r   r   r   r   )rY   r  s     r   drawLine_SVGRenderer.drawLine1  s<    <<$$LLdggtwwA %r!   c                     U R                   R                  UR                  UR                  UR                  U R                  U5      S9  g N)r  )r  r  r  r  r1   r  )rY   r  s     r   
drawCircle_SVGRenderer.drawCircle5  s5    VYY		688tG_G_`fGghr!   c           
         UR                  5       u  p#nUS:X  d  Uc  US:X  d  Uc  UR                  (       d  UR                  UR                  UR                  UR
                  UR                  4u  pVpxn	UR                  =(       d    UR                  nXW-
  Xb-
  pXW-   Xb-   pX-
  nU R                  R                  XXXSS9  g UR                  5       n[        U[        5      (       a  U R                  U5        g U R                  U5        g )Nr   r   )r  )
_xtraRadiiannularcenterxcenteryradiusstartangledegreesendangledegreesyradiusr  r  	asPolygonr  r   drawPathdrawPolygon)rY   wedger  radius1yradius1r  r  r  r  r  r   r   r   r   r   r8   s                   r   	drawWedge_SVGRenderer.drawWedge8  s    %*%5%5%7"(QJ'/!x?OY^YfYf]]EMM5<<9P9PRWRgRgg IGfmm3u||G$8FLL  1BWX Y!A!D!!a   #r!   c                     U R                   R                  (       a/  U R                   R                  [        UR                  5      5        g g r  )r  r   r  r:   r  rY   r  s     r   drawPolyLine_SVGRenderer.drawPolyLineI  s/    <<$$LL!!/!((";< %r!   c           	          UR                   UR                  -
  nUR                   UR                  -   nUR                  UR                  -
  nUR                  UR                  -   nU R                  R                  X$X5U R                  U5      S9  g r  )r  rC  r  rD  r  r  r  )rY   r  r   r   r   r   s         r   drawEllipse_SVGRenderer.drawEllipseM  sn    ZZ'**$ZZ'**$ZZ'**$ZZ'**$R2D4L4LW4UVr!   c                 ~    U R                   R                  [        UR                  5      SU R	                  U5      S9  g )Nr   )r  r  )r  r  r:   r  r  r&  s     r   r  _SVGRenderer.drawPolygonU  s0    _QXX6qDLdLdefLghr!   c                   ^^	^
 SSK Jm	  U R                  nUR                  UR                  UR
                  UR                  4m
Uc  [        TS[        5      nU R                  T5      n[        TSS5      nU	U
U4S jnUS:X  a#  U" 5         UR                  / TR                  XBS9  g US	:X  a"  U" S
S9  UR                  / TR                  XBS9  g U" 5       nU(       dM  UR                  nUR                  S 5         S nUR                  / TR                  XBS9  UR                  U5        g UR                  / TR                  XBS9  g ! UR                  U5        f = f)Nr   )_renderPathr  	autocloseri   c                     > T" TT40 U D6$ r  rz   )r   r/  	drawFuncsr   s    r   rP!_SVGRenderer.drawPath.<locals>.rPa  s    tY7$77r!   r   )r   r  r  pdfT)
forceClose)reportlab.graphics.shapesr/  r  r  r  r  r  r  r   r  r  r  r   r/  )rY   r   r  r*   r  r0  r3  isClosedofcr/  r2  s    `       @@r   r  _SVGRenderer.drawPathX  s*   9LLXXqxxAKK@	tJ}=H,,T2	DR0		8eDRdoo^$Rdoo^tHllt$( $I$$Rdoo$fNN3'  $//Y b NN3's   ;E Ec           	         UR                   n[        U[        5      (       aF  U(       a$  [        R                   R	                  U5      (       d  g [        5       R                  U5      nO[        US5      (       a  UnOg UR                  u  pEUR                  UR                  pvUc  UnUc  UnU R                  R                  X1R                  UR                  XgSS9  g )NconvertT)rx  )r   r  r>   osisfiler   r   r   r   r%   r&   r  rz  r/   r0   )rY   rr  r   imsrcWsrcHdstWdstHs           r   rz  _SVGRenderer.drawImagev  s    zzd3RWW^^D11F!!$'BT)$$BWW
[[%,,d<<r77EGGTtLr!   c                    UR                  5        GH  u  p4US:X  a  M  US:X  a  U R                  R                  U5        M1  US:X  a  U R                  R                  U5        MT  US:X  a  U R                  R	                  U5        Mw  US:X  a  U R                  R                  U5        M  US:X  a  U(       as  [        U[        [        45      (       a8  [        U5      S:X  a)  [        US   [        [        45      (       a  US	   nUS   nOS	nU R                  R                  XE5        GM  U R                  R                  5         GM7  US
:X  a  U R                  R                  U5        GM[  US;   aj  UR                  SU R                  R                  5      nUR                  SU R                  R                  5      nU R                  R                  Xg5        GM  US:X  d  GM  U R                  R!                  U5        GM     g)zTThis takes a set of states, and outputs the operators
needed to set those propertiesr   r   r  r  r  strokeDashArrayr3   r   r   r  )r   r   r   r   r  N)r=   r  r   r   r   r   r  rQ   r  r5   r  r/  getr   r   r   r2  )rY   deltanewStatekeyvaluer  fontnamefontsizes           r   r  _SVGRenderer.applyStateChanges  s     ++-JCk!%++E2%))%0'''.((((/))!%e55#e*a-JW\]^W_afgk`lLmLm %a %a !LL((5LL((*#))%000 99Z1C1CD 99Z1G1GH$$X8
"((/; (r!   r  N)rn   ro   rp   rq   rr   rR   r  r  r  r  r  rb  r  r  r#  r'  r*  r  r   r  rz  r  ry   rz   r!   r   r,   r,     s|    K@  .\Zd!,QX&(I>A 5"9Bi$"=Wi '4 c<M!0r!   r,   c                    [         R                  R                  U 5      (       d  [         R                  " U 5        SSKJn  / n[        U5       H?  nUSS S:X  d  M  [        X5      nU" 5       n[        USS5      nUR                  XV45        MA     SnU H8  u  p[         R                  R                  U SU-  5      n	[        X5        US-  nM:     SS	KJn
  U
" 5       n[        U[         R                  R                  U S
5      5        SSKJn  SSKJn  U" 5       nU" UR"                  UR$                  5      nUR'                  U5        [        U[         R                  R                  U S5      5        g )Nr   )
testshapes
   
getDrawingrr   ri   zrenderSVG_%d.svgr   )getDrawing01ztest.svg)RL_CorpLogo)Drawingzcorplogo.svg)r=  r   isdirmkdirreportlab.graphicsrP  dirr  r6   rk   r   reportlab.graphics.testshapesrS  reportlab.lib.corprT  r7  rU  r%   r&   add)outDirrP  drawingsfuncnamefuncr-   	docstringr9   r   filenamerS  rT  rU  rls                 r   testrd    s    77==  
-H
OAb>\):/DfGYr2IOOW01 $ 	
A"77<<'9A'=>1	Q #
 ;Aq"'',,vj12.1	B#AEE"Iq"'',,vn56r!   __main__r  )zout-svg):rr   mathr_   r=  rS   rv  ior   r   reportlab.pdfbase.pdfmetricsr   reportlab.lib.rl_accelr   reportlab.lib.utilsr   reportlab.graphics.renderbaser   r	   r
   r7  r   r   r   	reportlabr   r   r   r   reportlab.pdfgen.canvasr   r   renderPMr   xml.domr   r  r  r  r   rB  r  r7  rY  rX  r   r    r   r'   r:   rJ   rQ   rL   r   r   r$   r,   rd  rn   rz   r!   r   <module>rp     sd  	 % $ $   4 ) ( V V D D '  < < @  ( hh
hh	WW D  J  J  LgmmoLRRTlrrt '--/  "+!7!7  $-#9#9  1G1G R
>$D $N 	yI9yI9
Hf fPg08 g0R 7D ZF r!   