+
    bIi6                        R t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIHtHt ^ RI	H
t
 ^ RIHt ^ RIHt ^ RIHtHtHt ^ RIHtHtHt ^ RI5 ^ R	IHt ^ R
IHtHtHt ^ RIHtHt ^RIH t  ^ RI!H"t" ]PF                  t#]PH                  t$]PJ                  t%RPM                  4       t'RPM                  4       t(RPM                  4       t)RPM                  4       t*RPM                  4       t+]PX                  3R lt-]PX                  3R lt.^ ^ ]PX                  3R lt/R t0R%R lt1 ! R R]24      t3]RRRRR]RRRRR/t4R t5 ! R R 4      t6 ! R! R"]4      t7R&R# lt8]9R$8X  d
   ]8! 4        R# R# )'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    \        4       p\        W3RV/VB  VP                  4       # )z>Returns a SVG as a string in memory, without touching the diskshowBoundary)r   
drawToFilegetvalue)dr   kwdsss   &&, څC:\Users\petid\OneDrive\Desktop\Maestro\MAESTRO CLAUDE\MAESTRO\maestro-backend\venv\Lib\site-packages\reportlab/graphics/renderSVG.pydrawToStringr   '   s'    
Aq6,66::<    c                     \        V 4      p \        V P                  V P                  33/ VB p\	        W^ ^ VR7       VP                  V4       R# )    r   N)r	   	SVGCanvaswidthheightdrawsave)r   fnr   r   cs   &&&, r   r   r   -   sA    AA177AHH%--Aq!,/FF2Jr   c                T    \        4       pVP                  \        V 4      WW4R7       R# )zAs it says.r"   N)_SVGRendererr&   r	   )drawingcanvasxyr   rs   &&&&& r   r&   r&   3   s!    AFFw'AFQr   c                    . p\        ^ \        V 4      ^4       F)  pVP                  W,          W^,           ,          34       K+  	  V# )zc
given a list of coordinates [x0, y0, x1, y1....]
produce a list of points [(x0,y0), (y1,y0),....]
)rangelenappend)LPis   &  r   _pointsFromListr8   9   s?     	A1SVQ	!$A#    Hr   c                    V P                  V4      pVP                  4        FW  w  rV\        V4      pV'       g   VP                  WW4       K+  VP	                  V4      pTP                  YX;'       g    T4       KY  	  V# )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   transformNoderH   E   sn    ( 'G!)T  0''.G  *:*:U; * Nr   c                      a  ] tR t^dt o RtR]P                  R]P                  R]P                  R]P                  R]P                  R]P                  /tRR ltR	 tR
 tRtV tR# )EncodedWriterz}
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                    \         P                  V 4       \        P                  ! V4      P                  ;V n        pV'       d   R V9   g   RV9   d%   V P                  V P                  V,          4       R# R# )1632N)list__init__codecslookupnameencodingwriteBOMS)selfrS   boms   &&&r   rO   EncodedWriter.__init__r   sT    d#)==#:#?#??48#tx'7JJtyy*+ (8r   c                B   \        V4      '       d    VP                  R 4      pM,\        V4      '       g   \        R\        V4      ,          4      hV P                  V4       R#    \        P                  ! 4       w  r#p\	        T4      p??\        RT: RT: 24      h; i)utf-8zString z not encoded as 'utf-8'
error=z?EncodedWriter.write(%s) argument should be 'utf-8' bytes or strN)	r   decodesysexc_infor<   
ValueErrorr   asciir4   )rV   uetevtbs   &&   r   rT   EncodedWriter.writex   s    1::XXXg& 1^afghaiijjAX \\^
W QRSU!VWWs   A$ $:Bc                .    R P                  V 4      pV R V# ) :NNNjoin)rV   r0   s   & r   r   EncodedWriter.getvalue   s    GGDMGr   rS   N)F)__name__
__module____qualname____firstlineno____doc__rP   	BOM_UTF32BOM_UTF32_BEBOM_UTF32_LE	BOM_UTF16BOM_UTF16_BEBOM_UTF16_LErU   rO   rT   r   __static_attributes____classdictcell____classdict__s   @r   rJ   rJ   d   si      	!!F''F''!!F''F''
D, r   rJ   nonzeroznon-zeroevenoddzeven-oddc                  2    R P                  R V  4       4      # ) c              3   p   "   T F,  pR V,          P                  R4      P                  R4      x  K.  	  R# 5i)z%f0.N)rstrip).0as   & r   	<genexpr>py_fp_str.<locals>.<genexpr>   s-     FAdQh&&s+22377s   46rg   )argss   *r   	py_fp_strr      s    88FFGGr   c                     a  ] tR t^t o R/R ltR0R ltR1R lt. R3R ltR tR t	^ R]
R3R	 ltR
 tR t. ^ 3R ltR tR tR tR tR tR tR2R ltR2R ltR3R ltR4R ltR5R ltR tR6R ltR tR0R ltR0R ltR7R ltR8R lt R9R lt!R1R  lt"R! t#]$! RR"7      3R# lt%R$ t&R% t'R& t(R' t)R( t*R) t+R* t,R+ t-R, t.R- t/R.t0V t1R# ):r#   c           	     
  a  VS n         \        P                  ! V4      P                  S n        VS n        VP                  RR4      pVP                  R/ 4      S n        VP                  RR4      S n        VP                  RR4      p\        S n
        V;w  S n        S n        S n        . S n        / S n        RS n        R;S n        ;S n        ;S n        ;S n        ;S n        ;S n        S n        VP                  RR4      '       d   \0        S n        M\2        S n        V 3R	 lS n        \7        R
4      pVP9                  RRR4      p	VP;                  RRV	4      S n        S P<                  P>                  S n         \C        \E        V^ ,          4      \E        S P                  4      RRS P                  S P                  3,          RRR7      p
\F        S P                  ,          V
R&   RV
R&   V
PI                  VP                  R/ 4      4       V
PK                  4        F   w  rS P@                  PM                  W4       K"  	  S P<                  PO                  R4      pS P<                  PQ                  R4      pVPS                  V4       S P@                  PS                  V4       S P<                  PO                  R4      pS P<                  PQ                  R4      pVPS                  V4       S P@                  PS                  V4       S PU                  \V        R,          \V        R,          4       S PY                  \V        R,          4       S P[                  ^4       S P]                  ^ 4       S P_                  ^4       V'       g   \a        S P<                  RRR7      p\a        S P<                  R ^ ^ S P                  S P                  R!7      pVPS                  V4       S P@                  PS                  V4       \C        R"R#7      pM)\C        RS P                  S P                  3,          R$7      p\a        S P<                  R%3R&R'R(R)S P                  ,          /VB S n1        V'       dj   \a        S P<                  R%VR*R+7      S n2        S Pd                  PS                  S Pb                  4       S P@                  PS                  S Pd                  4       M%S P@                  PS                  S Pb                  4       S Pb                  S n3        R# ),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extraXmlDeclrf   scaleGroupIdN
use_fp_strc                  D   < SP                   ! V !  P                  R R4      # )r}   ,)r   replace)r   rV   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.dtdz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strokeColorclipPathclip)idrect)r.   r/   r$   r%   zclip-path: url(#clip))style)r   gr   group	transformzscale(1,-1) translate(0,-%d)z
scale(1,1))r   r   )4verboserP   rQ   rR   rS   rW   popr   r   r   	_fillModer$   r%   sizecoder   path_strokeColor
_fillColor
_lineWidth_font	_fontSize_lineCap	_lineJoinr   r   cfp_strr   createDocumentTypecreateDocumentr?   documentElementr   dictr<   _fillRuleMapupdater;   r=   r:   createTextNodeappendChildsetFontr
   setStrokeColor
setLineCapsetLineJoinsetLineWidthrH   	groupTree	scaleTree	currGroup)rV   r   rS   r   rW   r   r   r   implementationdoctyper   kvr   textr   r   clipRectgtkws   f&&&&,             r   rO   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                   \        V P                  V P                  R 7      pV P                  P	                  VRRV P                  R7       \        VR4      '       d   TpM\        VRV P                  R7      pVP                  4       pV P                  pV'       d   VP                  RRV,           4      pVP                  V4       W1Jd   VP                  4        R# R# )	)rW   	
)	addindentnewlrS   rT   wrj   z?>N)rJ   rS   rW   r?   writexmlhasattropenr   r   r   rT   close)rV   r(   writerfr   exds   &&    r   r'   SVGCanvas.save  s    t}}:&4T4==Q2gARdmm4Aoo++d48,C	;GGI r   c                r    T;'       g    V P                   pT;'       g    V P                  p\        WV4      # )zeReturn the logical width of the string if it were drawn
in the current font (defaults to self.font).
)r   r   r   )rV   r   fontr   s   &&&&r   NOTUSED_stringWidthSVGCanvas.NOTUSED_stringWidth  s3    
 !!tzz--t~~1H--r   rf   c                   V P                   P                  4       pVP                  V4       \        VP	                  4       4      pV'       d   V Uu. uF  qfV9   g   K  VNK  	  ppV'       dH   VP                  4       pV Uu. uF*  qfV9  g   K  VR ,           \        WF,          4      ,           NK,  	  ppM-V Uu. uF!  qfR ,           \        WF,          4      ,           NK#  	  ppRP                  V4      R,           # u upi u upi u upi )z: z; ;)r   copyr   rN   keyssplitr<   rh   )rV   includeexcluder   r   r   r   r;   s   &&&,    r   _formatStyleSVGCanvas._formatStyle   s    

!TEJJL!#4t!G|AAtD4mmoG37L4aG;K)QtVCM))4ELE3784atVCM))4E8yy#%% 5 M8s   C:C:C?#C?9'Dc                    V# )zKI don't think this was ever needed; seems to have been copied from renderPS )rV   r   s   &&r   _escapeSVGCanvas._escape-  s    r   c                    R# )zPCalculate the path for an arc inscribed in rectangle defined
by (x1,y1),(x2,y2).N)abs)rV   x1y1x2y2startAngextentxScaleyScaler.   r/   codelinearcdatas   &&&&&&&       r   _genArcCodeSVGCanvas._genArcCode1  s     	r   c                   / pV'       d   \         V,          VR &   \        V P                  RV P                  V P	                  V4      R7      pV'       d   V P                  Ws4      pV P                  P                  V4       RV n        R# )r   r   r   r   rf   N)r   rH   r?   r   r   	_add_linkr   r   )rV   r   r   	link_infostylesfillModextrar   s   &&&&&&  r   _fillAndStrokeSVGCanvas._fillAndStrokeG  sk     ,X 6DTXXviit008 >>$2D""4(	r   c                r    ^ R^R^R/pV P                   V8w  d   Wn         W!,          V P                  R&   R# R# )r!   buttroundsquarestroke-linecapN)r   r   rV   r   valss   && r   r   SVGCanvas.setLineCapU  s;    &!GQx0==AM+/7DJJ'( r   c                r    ^ R^R^R/pV P                   V8w  d   Wn         W!,          V P                  R&   R# R# )r!   miterr  bevelr
  N)r   r   r  s   && r   r   SVGCanvas.setLineJoin[  s;    '1Wa0>>QN+/7DJJ'( r   c                   \        V\        \        34      '       d0   RP                  \	        \
        W.4      4      V P                  R&   R# \        V\        \        34      '       dp   \        V4      ^ 8  d^   V^ 8  g   Q R4       hRP                  \	        \
        V4      4      V P                  R&   V^ 8  d   \        V4      V P                  R&   R# R# R# R# )z7Two notations. Pass two numbers, or an array and phase., zstroke-dasharrayzphase is a length in user spacezstroke-dashoffsetN)

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

./  1?+r   c                z   Wn         VR 8X  d   RV P                  R&   R # VP                  VP                  VP                  rCpRV^d,          V^d,          V^d,          3,          V P                  R&   VP
                  pV^8w  d   RV,          V P                  R&   R # RV P                  9   d   V P                  R R # R # )Nnonestrokergb(%d%%,%d%%,%d%%)%szstroke-opacity)r   r   redgreenbluenormalizedAlpharV   colorr0   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                z   Wn         VR 8X  d   RV P                  R&   R # VP                  VP                  VP                  rCpRV^d,          V^d,          V^d,          3,          V P                  R&   VP
                  pV^8w  d   RV,          V P                  R&   R # RV P                  9   d   V P                  R R # R # )Nr  fillr   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                F    Wn         \        V,          V P                  R &   R# )r   N)r   r   r   )rV   r   s   &&r   setFillModeSVGCanvas.setFillMode  s    ".q/

;r   c                R    WP                   8w  d   Wn         WP                  R &   R# R# )zstroke-widthN)r   r   )rV   r$   s   &&r   r   SVGCanvas.setLineWidth  s"    OO##O).JJ~& $r   c                *   V P                   V8w  g   V P                  V8w  d   Wn         W n        V P                  p\         F  pWC9   g   K  W4 K  	  WP                  9   d   V P                  V,          M/ p\        V\        4      '       d3   VP                  \        VP                  P                  4       4      4       V'       d4   VP                  4        F  w  rFR V,           pV\        9   g   K  WcV&   K!  	  RV9  d   WR&   RV,          VR&   R# R# )zfont-zfont-familyz%spxz	font-sizeN)r   r   r   TEXT_STYLESr   r  r   r   iterr   r;   )rV   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                    \        V\        4      '       g   Q h\        V P                  R 3/ VB pVP	                  V4       V# )r   )r  r   rH   r?   r   )rV   
dom_objectr   links   &&& r   r   SVGCanvas._add_link  s=    )T****TXXs8i8$r   c                   V P                   '       d   \        R4       \        W4      p	\        W$4      p
/ p\        V P                  R3RV	RV
R\        W4      V	,
          R\        W$4      V
,
          RV P                  \        4      /VB pV'       d   V P                  W4      pV P                  P                  V4       R# )	z)Draw a rectangle between x1,y1 and x2,y2.z+++ SVGCanvas.rectr   r.   r/   r$   r%   r   N)r   printminrH   r?   maxr   AREA_STYLESr   r   r   )rV   r   r   r   r   rxryr   	_svgAttrsr.   r/   r   r   s   &&&&&&&&,    r   r   SVGCanvas.rect  s     <<<34JJTXXv >>>JqL>14RA>##K0>3<> >>$2D""4(r   c                    \        V P                  R3RVRVRW1,
          RWB,
          RVRVRV P                  \        4      /VB p	V'       d   V P	                  W4      p	V P
                  P                  V	4       R	# )
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.   r/   r$   r%   rA  rB  r   NrH   r?   r   r@  r   r   r   )
rV   r   r   r   r   rA  rB  r   rC  r   s
   &&&&&&&&, r   	roundRectSVGCanvas.roundRect  s     TXXv ??? e?,.E?68?=??##K0?4=? >>$2D""4(r   c                "   V^8X  d   R# \        V4      pV P                  '       d   \        R4       V^ 8H  ;'       g     V^8H  ;'       g    V^8H  ;'       g    V^8H  p	V^8H  ;'       g     V^8H  ;'       g    V^8H  ;'       g    V^8H  p
V P                  R8w  d	   V	'       g   V P                  R8w  Ed   V
'       Ed   VR9   g   \        WP                  V P                  4      pVR8X  d
   W+,          pMbVR8X  d   W+R,          ,          pMKVR8X  d*   V\        WaWP                  V P                  4      ,          pM\        R\        V4      ,           4      hV P                  V4      pV P                  \        4      pV^ 8w  d!   VRV P                  WBV4      ,          ,           pV	'       d   WP                  \        4      ,          pM	VR	,          pV
'       d   WP                  \         4      ,          pM	VR
,          p\#        V P$                  R3RVRVRVRR^V,          ,          /VB pV P$                  P'                  V4      pVP)                  V4       V'       d   V P+                  W4      pV P,                  P)                  V4       R# R# R# )   Nz+++ SVGCanvas.drawStringendmiddle       @numericzbad value for text_anchor z rotate(%s);z fill:none;z stroke:none;r   r.   r/   r   r   ztranslate(0,%d) scale(1,-1))start	inheritedleft)r   r   r=  r   r   r   r   r   numericXShiftr^   r<   r   r   r5  r   EXTRA_FILL_STYLESEXTRA_STROKE_STYLESrH   r?   r   r   r   r   )rV   r   r.   r/   angler   text_anchortextRenderModerC  needFill
needStroketextLenstr   contents   &&&&&&&&,      r   
drawStringSVGCanvas.drawString  s>   1fQK<<<9:!1$cc(9cc^Q=NccR`bcRc#Q&ee.!*;ee~q?PeeTbdeTe
OOT!hD4E4Et4KPZPZ"@@%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                x    V P                   '       d   \        R 4       V P                  ! WV3RVRVRVRV/VB  R# )z+++ SVGCanvas.drawCentredStringrU  r   rV  rW  Nr   r=  r]  )	rV   r   r.   r/   rU  rV  r   rW  rC  s	   &&&&&&&&,r   drawCentredStringSVGCanvas.drawCentredString  sH    <<<@AA 	<E 	<Y 	<K 	<-	<1:	<r   c                x    V P                   '       d   \        R 4       V P                  ! WV3RVRVRVRV/VB  R# )z+++ SVGCanvas.drawRightStringrU  r   rV  rW  Nr`  )	rV   r   r.   r/   rU  rV  r   rW  rC  s	   &&&&&&&&,r   drawRightStringSVGCanvas.drawRightString  sH    <<<>?q 	<u 	<	 	<{ 	<-	<1:	<r   c                <    V P                   P                  V4      pR# )zAdd a comment.N)r?   createComment)rV   r   comments   && r   rh  SVGCanvas.comment  s     ((((.r   c                `   \        4       pVP                  VR 4       \        \        P                  ! VP                  4       4      4      pV P                  P                  \        V P                  RW#WERV,           RV P                  ^^ ^ R^ V^V,          ,           4      ,          R7      4       R# )pngimagezdata:image/png;base64,
matrix(%s))r.   r/   r$   r%   hrefr   N)r   r'   r   base64	b64encoder   r   r   rH   r?   r   )rV   rl  r.   r/   r$   r%   embedbufs   &&&&&&& r   	drawImageSVGCanvas.drawImage
  s    i

3uv''78""dhhw%1#5*T\\!Aa1VAaCZ-PP	r   c                
   V P                   R 8w  dr    \        T P                  RRT P                  Y4      : RT P                  Y44      : R2T P                  \        4      R7      pT P
                  P                  T4       R # R # )Nr   M  L z Zr   )r   rH   r?   r   LINE_STYLESr   r   r   )rV   r   r   r   r   liner   s   &&&&&  r   rz  SVGCanvas.line  sh    $
 !6#'<<#6t||B7JK''46D NN&&t, %r   c                4   \        V P                  RW,           R,          W$,           R,          W1,
          R,          WB,
          R,          V P                  \        4      R7      pV'       d   V P	                  We4      pV P
                  P                  V4       R# )zkDraw an orthogonal ellipse inscribed within the rectangle x1,y1,x2,y2.

These should have x1<x2 and y1<y2.
ellipserM  )cxcyrA  rB  r   NrF  )rV   r   r   r   r   r   r}  s   &&&&&& r   r}  SVGCanvas.ellipse"  sj    
  )s{s{s{s{##K02 nnW8G""7+r   c           
         \        V P                  R WVV P                  \        4      R7      pV'       d   V P	                  WT4      pV P
                  P                  V4       R# )circle)r~  r  r0   r   NrF  )rV   xcycr0   r   r  s   &&&&& r   r  SVGCanvas.circle0  sL    txxA##K02 ^^F6F""6*r   c
                     R # N)r   r   r   r4   r   )rV   r   r   r   r   x3y3x4y4closedr   r   s   &&&&&&&&&&  r   	drawCurveSVGCanvas.drawCurve:  s    r   c                   W,           R,          W$,           R,          rW1,
          R,          WB,
          R,          rV
\        V\        ,          ^,          4      ,          V,           pV\        V\        ,          ^,          4      ,          V	,           pV
\        WV,           \        ,          ^,          4      ,          V,           pV\        WV,           \        ,          ^,          4      ,          V	,           pV P                  p. P                  pV'       d   V! RV! W4      : RV! W4      : 24       V'       d%   V! RV! W4      ^ V^8  ^ V! W4      3,          4       M*V! RV! W4      V! W4      ^ V^8  ^ V! W4      3,          4       V'       d   V! RV! W4      ,          4       \        V P                  RRP                  VP                  4      V P                  4       R	7      pV P                  P                  V4       R
# )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.
rM  rw  rx  zA %s %d %d %d %szM %s A %s %d %d %d %s ZzL %s Zr   r}   r   N)cospisinr   r4   rH   r?   rh   __self__r   r   r   )rV   r   r   r   r   r   r   
fromcenterr~  r  rA  rB  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           	        \        V4      ^8  g   Q R4       hV P                  R8w  g   V P                  R8w  d   RP                  V Uu. uF  p\	        V!  NK  	  up4      p\        V P                  RWPP                  \        4      R7      pV'       d   V P                  Wc4      pV P                  P                  V4       R# R# u upi )   z"Polygon must have 2 or more pointsNr  polygonpointsr   )r3   r   r   rh   r   rH   r?   r   r@  r   r   r   )rV   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   	Cc                    R # r  )r   r   r4   r   )rV   lineListr'  r$   r   rz  s   &&&&  r   linesSVGCanvas.linesx  s    r   c           
     D   \        V4      ^8  g   Q R4       hV P                  R8w  ds   RP                  V Uu. uF  p\        V!  NK  	  up4      p\	        V P
                  RW0P                  \        RR7      R7      pV P                  P                  V4       R# R# u upi )   z#Polyline must have 1 or more pointsNr  r  )r,  r  )
r3   r   rh   r   rH   r?   r   r@  r   r   )rV   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                    V P                   '       d   \        R 4       V P                  p\        V P                  R3/ VB pVP                  V4       W0n        V P                   '       d   \        R4       V# )z+++ begin SVGCanvas.startGroupr   z+++ end SVGCanvas.startGroup)r   r=  r   rH   r?   r   )rV   rB   r   r   s   &&  r   
startGroupSVGCanvas.startGroup  s[    <<<?@NN	dhh8x8e$<<<=>r   c                    V P                   '       d   \        R 4       Wn        V P                   '       d   \        R4       R# R# )z+++ begin SVGCanvas.endGroupz+++ end SVGCanvas.endGroupN)r   r=  r   )rV   r   s   &&r   endGroupSVGCanvas.endGroup  s+    <<<=>"<<<;<<r   c           	        V P                   '       d   \        R WW4WV4       V P                  P                  R4      pWW4WV3R8w  d@   RV P	                  WW4WV4      ,          pV P                  P                  RV: RV: 24       R# R# )z!!! begin SVGCanvas.transformr   rm  r}   N)r  r!   r!   r  r!   r!   )r   r=  r   r>   r   r=   )	rV   r   r(  r)   r   er   trts	   &&&&&&&  r   r   SVGCanvas.transform  sr    <<<>aAQ^^((5!!33t||AA88ANN''A5FG 4r   c           
         W3R8w  dU   V P                   P                  RV P                   P                  R4      : RRV P                  W4      ,          : 24       R# R# )r!   r   r}   ztranslate(%s)N)r!   r!   )r   r=   r>   r   rV   r.   r/   s   &&&r   	translateSVGCanvas.translate  sL    5E>NN''>>..{;#dll1&7769 : r   c           
         W3R8w  d\   V P                   P                  RV P                  R,          P                  R4      : RRV P	                  W4      ,          : 24       R# R# )r  r   r}   z	scale(%s)N)r  r  ro  )r   r=   groupsr>   r   )rV   sxsys   &&&r   scaleSVGCanvas.scale  sQ    7eNN''{{233K@#dll2&::6< = r   c                b    V P                   R V P                  W4      ,          ,           V n         R# )zM %s Nr   r   r  s   &&&r   moveToSVGCanvas.moveTo       II$++a*; ;;	r   c                b    V P                   R V P                  W4      ,          ,           V n         R# )zL %s Nr  r  s   &&&r   lineToSVGCanvas.lineTo  r  r   c           
     f    V P                   R V P                  WW4WV4      ,          ,           V n         R# )zC %s Nr  )rV   r   r   r   r   r  r  s   &&&&&&&r   curveToSVGCanvas.curveTo  s$    II$++bbb*M MM	r   c                6    V P                   R ,           V n         R# )zZ N)r   rV   s   &r   	closePathSVGCanvas.closePath  s    II$	r   c                    R # r  r   r  s   &r   	saveStateSVGCanvas.saveState      r   c                    R # r  r   r  s   &r   restoreStateSVGCanvas.restoreState  r  r   )r   r   r   r   r   r   r   r   rW   r   r   r   r?   rS   r   r   r   r   r%   r   r   r   r   r   r   r$   )),  r  rZ   r!   Fr  )NN)   r  N)r!   NrQ  r!   )r!   rL  Nr!   )r!   rK  Nr!   )T)r!   )r!   ih  r!   r!   N)2rk   rl   rm   rn   rO   r'   r   r   r   r   r@  r  r   r   r  r   r-  r0  r   r   r   r   rG  r]  ra  rd  rh  rt  rz  r}  r  r  r  r  r  r  r   r  r  r   r  r  r  r  r  r  r  r  rv   rw   rx   s   @r   r#   r#      s    j(X$. $&r &, )*TVZ 
33 a 	=1/2/
3()") +-Z<</

-,+) )D1P1 "&!3 =
H:=<<N% r   r#   c                      a  ] tR tRt o RtR tR tRRRRR	R
RRRRRRRR/tR tR t	R t
R tR tR tR tR tR tR t]3R ltR tR tR tV tR!# )"r+   i  z%This draws onto an SVG document.
    c                    ^ V n         R# r  r   r  s   &r   rO   _SVGRenderer.__init__  s	    r   c                   V P                   '       d   \        RV,          4       V P                  P                  RV,          4       V P                  P                  P                  4       p\        V\        4      '       d   VP                  '       g    \        V4      pV P                  P                  V4       V P                  V/ 4       V P                  V4       V P                  P                  4       p\        V\        4      '       d   VP                  '       g    V P                  P                  RV,          4       VP                  4        F?  w  rVWPP                   9   g   K  \#        V P                  V P                   V,          V4       KA  	  W P                  n        V P                   '       d   \        RV,          4       R# R# )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=  _canvasrh  r   r   r  r   
isClipPathr   _trackerpushapplyStateChangesdrawNodeDispatcherr   r;   	_restoressetattr)rV   rA   r   deltasrDeltasr   r   s   &&     r   drawNode_SVGRenderer.drawNode  s;    <<<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   strokeWidthr   strokeLineCapr   strokeLineJoinr   	fillColorr   r   r   r   r   c                    \        VR R4      ;'       g    Rp\        VRR4      ;'       g    RpV'       d	   RVRVRR/# R# )hrefURLrf   	hrefTitlez
xlink:hrefzxlink:titletarget_topN)getattr)rV   objurlr   s   &&  r   _get_link_info_dict _SVGRenderer._get_link_info_dict  sM     c9b)//R["-33 !mE8FKK$ r   c                   V P                   '       d   \        R 4       V P                  P                  4       pV P                  P                  4       R,          w  r4rVrxVP                  4        F=  p	\        V	\        4      '       d   V	P                  4       p
MT	p
V P                  V
4       K?  	  V P                  P                  W4WVWx4       V P                  P                  V4       V P                   '       d   \        R4       R# R# )z ### begin _SVGRenderer.drawGroupr   z### end _SVGRenderer.drawGroupN)r   r=  r  r  r  getStategetContentsr  r   provideNoder  r   r  )rV   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                n   V P                  V4      p\        VR / 4      pVP                  VP                  u;8X  d   ^ 8X  dr   M MnV P                  P
                  ! VP                  VP                  VP                  VP                  ,           VP                  VP                  ,           3RV/VB  R# V P                  P                  ! VP                  VP                  VP                  VP                  ,           VP                  VP                  ,           VP                  VP                  3RV/VB  R# )rC  r   N)r  r  rA  rB  r  r   r.   r/   r$   r%   rG  )rV   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                (   V P                   P                  4       pVR ,          VP                  VP                  VP                  3w  r4rVV P
                  P                  ! WdV3RV P                  V4      RVR\        VR^ 4      /\        VR/ 4      B  R# )
textAnchorr   rV  rW  rC  N)	r  r  r.   r/   r   r  r]  r  r  )rV   	stringObjSrV  r.   r/   r   s   &&     r   r]  _SVGRenderer.drawString*  s    MM""$"#L/9;;	Y^^"[q 	943K3KI3V 	9'	98?	JZ[\8]	9iB7	9r   c                    V P                   P                  '       dI   V P                   P                  VP                  VP                  VP
                  VP                  4       R # R # r  )r  r   rz  r   r   r   r   )rV   rz  s   &&r   drawLine_SVGRenderer.drawLine1  s?    <<$$$LLdggtwwA %r   c                    V P                   P                  VP                  VP                  VP                  V P                  V4      R 7       R# )r   N)r  r  r~  r  r0   r  )rV   r  s   &&r   
drawCircle_SVGRenderer.drawCircle5  s5    VYY		688tG_G_`fGghr   c           
     X   VP                  4       w  r#pV^ 8X  g   Vf   V^ 8X  g   Vf   VP                  '       g   VP                  VP                  VP                  VP
                  VP                  3w  rVrxp	VP                  ;'       g    VP                  pWW,
          Wb,
          rWW,           Wb,           rW,
          pV P                  P                  WWW^R7       R# VP                  4       p\        V\        4      '       d   V P                  V4       R# V P                  V4       R# )r!   N)r  )
_xtraRadiiannularcenterxcenteryradiusstartangledegreesendangledegreesyradiusr  r  	asPolygonr  r   drawPathdrawPolygon)rV   wedger  radius1yradius1r  r  r  r  r  r   r   r   r   r   r6   s   &&              r   	drawWedge_SVGRenderer.drawWedge8  s    %*%5%5%7"(QJ'/!x?OY^YfYfYf]]EMM5<<9P9PRWRgRgg IGfmm33u||G$8FLL  1BWX Y!A!D!!a   #r   c                    V P                   P                  '       d1   V P                   P                  \        VP                  4      4       R # R # r  )r  r   r  r8   r  rV   r  s   &&r   drawPolyLine_SVGRenderer.drawPolyLineI  s2    <<$$$LL!!/!((";< %r   c           	     H   VP                   VP                  ,
          pVP                   VP                  ,           pVP                  VP                  ,
          pVP                  VP                  ,           pV P                  P                  W$W5V P                  V4      R 7       R# r  )r~  rA  r  rB  r  r}  r  )rV   r}  r   r   r   r   s   &&    r   drawEllipse_SVGRenderer.drawEllipseM  sn    ZZ'**$ZZ'**$ZZ'**$ZZ'**$R2D4L4LW4UVr   c                    V P                   P                  \        VP                  4      ^V P	                  V4      R7       R# )r  )r  r   N)r  r  r8   r  r  r"  s   &&r   r  _SVGRenderer.drawPolygonU  s0    _QXX6qDLdLdefLghr   c                  aa	a
 ^ RI Ho	 V P                  pVP                  VP                  VP
                  VP                  3o
Vf   \        SR\        4      pV P                  S4      p\        SRR4      pV	V
V3R lpVR8X  d(   V! 4        VP                  . SP                  WBR7       R# VR	8X  d*   V! R
R7       VP                  . SP                  WBR7       R# V! 4       pV'       gR   VP                  pVP                  R4        RpVP                  . SP                  WBR7       VP                  V4       R# VP                  . SP                  WBR7       R#   TP                  T4       i ; i)r!   )_renderPathNr  	autocloserf   c                     < S! SS3/ V B # r  r   )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-  )rV   r   r  r)   r   r,  r/  isClosedofcr+  r.  s   &f&      @@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 E0c           	        VP                   p\        V\        4      '       dJ   V'       d&   \        P                   P	                  V4      '       g   R # \        4       P                  V4      pM\        VR4      '       d   TpMR # VP                  w  rEVP                  VP                  rvVf   TpVf   TpV P                  P                  W1P                  VP                  WgRR7       R # )NconvertT)rr  )r   r  r<   osisfiler   r   r   r   r$   r%   r  rt  r.   r/   )rV   rl  r   imsrcWsrcHdstWdstHs   &&      r   rt  _SVGRenderer.drawImagev  s    zzd3RWW^^D11F!!$'BT)$$BWW
[[%,,d<<r77EGGTtLr   c                @   VP                  4        EF  w  r4VR8X  d   K  VR8X  d   V P                  P                  V4       K3  VR8X  d   V P                  P                  V4       KW  VR8X  d   V P                  P	                  V4       K{  VR8X  d   V P                  P                  V4       K  VR8X  d   V'       d   \        V\        \        34      '       dG   \        V4      ^8X  d7   \        V^,          \        \        34      '       d   V^ ,          pV^,          pM^ pV P                  P                  WE4       EK0  V P                  P                  4        EKM  VR8X  d   V P                  P                  V4       EKr  VR9   dk   VP                  R	V P                  P                  4      pVP                  RV P                  P                  4      pV P                  P                  Wg4       EK  VR
8X  g   EK  V P                  P!                  V4       EK  	  R# )zTThis takes a set of states, and outputs the operators
needed to set those propertiesr   r   r  r  r  strokeDashArrayr  r   r   r  N)r   r   )r;   r  r   r   r   r   r  rN   r  r3   r  r-  getr   r   r   r0  )rV   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)rk   rl   rm   rn   ro   rO   r  r  r  r  r  r]  r
  r  r  r#  r&  r  r   r  rt  r  rv   rw   rx   s   @r   r+   r+     s     K@ ~m\/Zd [jQX;(I>A 5"9Bi$"=Wi '4 c<M!0 !0r   r+   c                    \         P                  P                  V 4      '       g   \         P                  ! V 4       ^ RIHp . p\        V4       FD  pVR,          R8X  g   K  \        W4      pV! 4       p\        VRR4      pVP                  WV34       KF  	  ^ pV F@  w  r\         P                  P                  V RV,          4      p	\        W4       V^,          pKB  	  ^ RIHp
 V
! 4       p\        V\         P                  P                  V R4      4       ^ R	IHp ^ R
IHp V! 4       pV! VP"                  VP$                  4      pVP'                  V4       \        V\         P                  P                  V R4      4       R# )r!   )
testshapes:r!   
   N
getDrawingro   rf   zrenderSVG_%d.svg)getDrawing01ztest.svg)RL_CorpLogo)Drawingzcorplogo.svgN)r9  r   isdirmkdirreportlab.graphicsrL  dirr  r4   rh   r   reportlab.graphics.testshapesrO  reportlab.lib.corprP  r3  rQ  r$   r%   add)outDirrL  drawingsfuncnamefuncr,   	docstringr7   r   filenamerO  rP  rQ  rls   &             r   testr`    s    77==  
-H
OD>\):/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):ro   mathr\   r9  rP   rp  ior   r   reportlab.pdfbase.pdfmetricsr   reportlab.lib.rl_accelr   reportlab.lib.utilsr   reportlab.graphics.renderbaser   r   r	   r3  r
   r   r   	reportlabr   r   r   r   reportlab.pdfgen.canvasr   r   renderPMr   xml.domr   r  r  r  r   r@  ry  r5  rT  rS  r   r   r   r&   r8   rH   rN   rJ   r   r   r#   r+   r`  rk   r   r   r   <module>rl     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   