+
    ̧6jΔ                        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   &&, T/opt/hart-platform/venv/lib/python3.14/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 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      o\        S\        4      '       d   V3R lS n
        M-\        S4      '       d	   SS n
        M\        R\        : R24      h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   \:        S n        M\<        S n        V 3R lS n        \A        R4      pVPC                  RRR4      p	VPE                  RRV	4      S n#        S PF                  PH                  S n%        \M        \        V^ ,          4      \        S P"                  4      RRS P                   S P"                  3,          RRR7      p
\N        S P                  ,          V
R&   RV
R&   V
PQ                  VP                  R/ 4      4       V
PS                  4        F   w  rS PJ                  PU                  W4       K"  	  S PF                  PW                  R4      pS PF                  PY                  R4      pVP[                  V4       S PJ                  P[                  V4       S PF                  PW                  R4      pS PF                  PY                  R4      pVP[                  V4       S PJ                  P[                  V4       S P]                  \^        R,          \^        R ,          4       S Pa                  \^        R!,          4       S Pc                  ^4       S Pe                  ^ 4       S Pg                  ^4       V'       g   \i        S PF                  R"R#R$7      p\i        S PF                  R%^ ^ S P                   S P"                  R&7      pVP[                  V4       S PJ                  P[                  V4       \M        R'R(7      pM)\M        RS P                   S P"                  3,          R)7      p\i        S PF                  R*3R+R,R-R.S P"                  ,          /VB S n5        V'       dj   \i        S PF                  R*VR/R07      S n6        S Pl                  P[                  S Pj                  4       S PJ                  P[                  S Pl                  4       M%S PJ                  P[                  S Pj                  4       S Pj                  S n7        R# )1a  
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
fontSizer = 'px'    a string unit or acallable that returns a string fontSize value
useClipF	fontHacks	fontSizerpxc                    < R S 2V ,          # )%s )vfzs   &r   <lambda>$SVGCanvas.__init__.<locals>.<lambda>   s    B4y1}r   z
fontSizer=zB should be a str unit eg px/pt or a callable that returns a stringextraXmlDeclrf   scaleGroupIdN
use_fp_strc                  D   < SP                   ! V !  P                  R R4      # )r}   ,)r   replace)r   rV   s   *r   r   r      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   )8verboserP   rQ   rR   rS   rW   popr   
isinstancer<   r   callabler^   r   r   	_fillModer$   r%   sizecoder   path_strokeColor
_fillColor
_lineWidth_font	_fontSize_lineCap	_lineJoinr   r   cfp_strr   createDocumentTypecreateDocumentr?   documentElementr   dict_fillRuleMapupdater;   r=   r:   createTextNodeappendChildsetFontr
   setStrokeColor
setLineCapsetLineJoinsetLineWidthrH   	groupTree	scaleTree	currGroup)rV   r   rS   r   rW   r   r   r   implementationdoctyper   kr   r   textr   r   clipRectgtkwr   s   f&&&&,             @r   rO   SVGCanvas.__init__   s@    h/44((9U++b1XXk$'b4DNb\\DN
	|+mnoo 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 renderPSr   )rV   r   s   &&r   _escapeSVGCanvas._escape5  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._genArcCode9  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._fillAndStrokeO  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.setLineCap]  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.setLineJoinc  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)
r   floatintrh   mapr<   r   tuplerN   r3   )rV   arrayphases   &&&r   setDashSVGCanvas.setDashi  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%%)r   zstroke-opacity)r   r   redgreenbluenormalizedAlpharV   colorr0   r   balphas   &&    r   r   SVGCanvas.setStrokeColort  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.setFillColor  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&   V P                  V4      VR&   R# R# )zfont-zfont-familyz	font-sizeN)r   r   r   TEXT_STYLESr   r   r   r   iterr   r;   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$!%!9E+# "<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%   rF  rG  r   NrH   r?   r   rE  r  r   r   )
rV   r   r   r   r   rF  rG  r  rH  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   rB  r   r   r   r   r   numericXShiftr^   r<   r   r   r:  r   EXTRA_FILL_STYLESEXTRA_STROKE_STYLESrH   r?   r   r   r  r   )rV   r   r.   r/   angler  text_anchortextRenderModerH  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.drawCentredStringrZ  r  r[  r\  Nr   rB  rb  )	rV   r   r.   r/   rZ  r[  r  r\  rH  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.drawRightStringrZ  r  r[  r\  Nre  )	rV   r   r.   r/   rZ  r[  r  r\  rH  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   rm  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   rq  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   r  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.
ellipserR  )cxcyrF  rG  r   NrK  )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   NrK  )rV   xcycr0   r  r  s   &&&&& r   r  SVGCanvas.circle8  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.drawCurveB  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.
rR  r|  r}  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  rF  rG  mxmyaxayr   r   r   s   &&&&&&&&           r   drawArcSVGCanvas.drawArcO  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   rE  r  r   r   )rV   r  r  r  pptspolylines   &&&&   r   r  SVGCanvas.polygonq  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   r  s   &&&&  r   linesSVGCanvas.lines  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  )r1  r  )
r3   r   rh   r   rH   r?   r   rE  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   rB  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   rB  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   rr  r}   N)r  r!   r!   r  r!   r!   )r   rB  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  rt  )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$   )),  r  rZ   r!   Fr  )NN)   r  N)r!   NrV  r!   )r!   rQ  Nr!   )r!   rP  Nr!   )T)r!   )r!   ih  r!   r!   N)2rk   rl   rm   rn   rO   r'   r   r   r   r  rE  r  r   r   r!  r   r2  r5  r   r   r  r   rL  rb  rf  ri  rm  ry  r  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    r(h$. $&r &, )*TVZ 
33 a 	=1/2/
:()") +-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   rB  _canvasrm  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   rB  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# )rH  r  N)r  r  rF  rG  r  r   r.   r/   r$   r%   rL  )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  r[  r\  rH  N)	r  r  r.   r/   r   r  rb  r  r  )rV   	stringObjSr[  r.   r/   r   s   &&     r   rb  _SVGRenderer.drawString2  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   r  r   r   r   r   )rV   r  s   &&r   drawLine_SVGRenderer.drawLine9  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.drawCircle=  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.drawWedge@  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.drawPolyLineQ  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  rF  r  rG  r  r  r  )rV   r  r   r   r   r   s   &&    r   drawEllipse_SVGRenderer.drawEllipseU  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.drawPolygon]  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   r0  	drawFuncsr   s   ,r   rP!_SVGRenderer.drawPath.<locals>.rPi  s    tY7$77r   r   )r   r  r	  pdfT)
forceClose)reportlab.graphics.shapesr0  r  r  r  r  r  r  r   r  r  r  r   r2  )rV   r   r	  r)   r  r1  r4  isClosedofcr0  r3  s   &f&      @@r   r  _SVGRenderer.drawPath`  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)rw  )r   r   r<   osisfiler   r   r   r   r$   r%   r  ry  r.   r/   )rV   rq  r   imsrcWsrcHdstWdstHs   &&      r   ry  _SVGRenderer.drawImage~  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!  r2  getr   r   r   r5  )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  rb  r  r  r$  r(  r+  r   r   r  ry  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)r>  r   isdirmkdirreportlab.graphicsrQ  dirr  r4   rh   r   reportlab.graphics.testshapesrT  reportlab.lib.corprU  r8  rV  r$   r%   add)outDirrQ  drawingsfuncnamefuncr,   	docstringr7   r   filenamerT  rU  rV  rls   &             r   testre    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\   r>  rP   ru  ior   r   reportlab.pdfbase.pdfmetricsr   reportlab.lib.rl_accelr   reportlab.lib.utilsr   reportlab.graphics.renderbaser   r   r	   r8  r
   r   r   	reportlabr   r   r   r   reportlab.pdfgen.canvasr   r   renderPMr   xml.domr   r  r  r  r   rE  r~  r:  rY  rX  r   r   r   r&   r8   rH   rN   rJ   r   r   r#   r+   re  rk   r   r   r   <module>rq     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n n`g08 g0R 7D ZF r   