a
    ¦¾de6“  ã                   @   sÂ  d Z ddlZddlZddlZddlZddlZddlmZmZ ddl	m
Z
 ddlmZ ddlmZ ddlmZmZmZ ddlmZmZmZ dd	lT dd
lmZ ddlmZmZmZ ddlmZmZ ddlm Z  ddl!m"Z" ej#Z#ej$Z$ej%Z%d &¡ Z'd &¡ Z(d &¡ Z)d &¡ Z*d &¡ Z+ej,fdd„Z-ej,fdd„Z.ddej,fdd„Z/dd„ Z0d/dd„Z1G dd „ d e2ƒZ3ed!d"d!d!d!ed#d$d#d#d#iZ4d%d&„ Z5G d'd(„ d(ƒZ6G d)d*„ d*eƒZ7d0d,d-„Z8e9d.k�r¾e8ƒ  dS )1a  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                 K   s$   t ƒ }t| |fd|i|¤Ž | ¡ S )z>Returns a SVG as a string in memory, without touching the diskÚshowBoundary)r   Ú
drawToFileÚgetvalue)Údr   ÚkwdsÚs© r   úU/var/www/sistema_ama/venv/lib/python3.9/site-packages/reportlab/graphics/renderSVG.pyÚdrawToString'   s    r    c                 K   s@   t | ƒ} t| j| jffi |¤Ž}t| |dd|d� | |¡ d S )Nr   ©r   )r
   Ú	SVGCanvasÚwidthÚheightÚdrawÚsave)r   Úfnr   r   Úcr   r   r   r   -   s    r   c                 C   s"   t ƒ }|jt| ƒ||||d� dS )zAs it says.r!   N)Ú_SVGRendererr%   r
   )ÚdrawingZcanvasÚxÚyr   Úrr   r   r   r%   3   s    r%   c                 C   s8   g }t dt| ƒdƒD ]}| | | | |d  f¡ q|S )zo
    given a list of coordinates [x0, y0, x1, y1....]
    produce a list of points [(x0,y0), (y1,y0),....]
    r   é   r   )ÚrangeÚlenÚappend)ÚLÚPÚir   r   r   Ú_pointsFromList9   s    r5   c           	      K   sT   |   |¡}| ¡ D ]<\}}t|ƒ}|s4| ||¡ q| |¡}| ||pJ|¡ q|S )aŸ  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)	ÚdocZnewTagÚnodeÚattrDictZnewNodeZnewAttrÚattrZsattrZattrValr   r   r   ÚtransformNodeE   s    

r?   c                   @   sH   e Zd ZdZejejejejej	ej
dœZddd„Zdd„ Zdd	„ Zd
S )Ú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-leFc                 C   sD   t  | ¡ t |¡j | _}|r(d|v s0d|v r@|  | j| ¡ d S )NZ16Z32)ÚlistÚ__init__ÚcodecsÚlookupÚnameÚencodingÚwriteÚBOMS)ÚselfrF   Úbomr   r   r   rB   r   s    
zEncodedWriter.__init__c                 C   sv   t |ƒrPz| d¡}W qh   t ¡ \}}}t|ƒ}~~td||f ƒ‚Y qh0 nt|ƒshtdt|ƒ ƒ‚|  |¡ d S )Núutf-8z)String %r not encoded as 'utf-8'
error=%sz?EncodedWriter.write(%s) argument should be 'utf-8' bytes or str)	r   ÚdecodeÚsysÚexc_infor8   Ú
ValueErrorr   Úasciir1   )rI   ÚuÚetZevÚtbr   r   r   rG   x   s    zEncodedWriter.writec                 C   s   d  | ¡}| d d …= |S )NÚ ©Újoin)rI   r-   r   r   r   r   …   s    

zEncodedWriter.getvalueN)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rC   Ú	BOM_UTF32ÚBOM_UTF32_BEÚBOM_UTF32_LEÚ	BOM_UTF16ÚBOM_UTF16_BEÚBOM_UTF16_LErH   rB   rG   r   r   r   r   r   r@   d   s   ú
r@   Znonzeroznon-zeroZevenoddzeven-oddc                  G   s   d  dd„ | D ƒ¡S )Nú c                 s   s"   | ]}d |   d¡  d¡V  qdS )z%fÚ0Ú.N)Úrstrip)Ú.0Úar   r   r   Ú	<genexpr>”   ó    zpy_fp_str.<locals>.<genexpr>rU   ©Úargsr   r   r   Ú	py_fp_str“   s    rk   c                   @   sš  e Zd Zdbdd„Zdcdd	„Zddd
d„Zg dfdd„Zdd„ Zdd„ Zdde	dfdd„Z
dd„ Zdd„ Zg dfdd„Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zded(d)„Zdfd*d+„Zdgd-d.„Zdhd0d1„Zdid3d4„Zd5d6„ Zdjd8d9„Zd:d;„ Zdkd<d=„Zdld>d?„Zdmd@dA„ZdndCdD„ZdodEdF„Z dpdGdH„Z!dIdJ„ Z"e#ddK�fdLdM„Z$dNdO„ Z%dPdQ„ Z&dRdS„ Z'dTdU„ Z(dVdW„ Z)dXdY„ Z*dZd[„ Z+d\d]„ Z,d^d_„ Z-d`da„ Z.dS )qr"   ©é,  rm   rK   r   Fc                    sê  |ˆ _ t |¡jˆ _|ˆ _| dd¡}| di ¡ˆ _| dd¡ˆ _| dd¡}t	ˆ _
| \ˆ _ˆ _ˆ _g ˆ _i ˆ _dˆ _d ˆ _ ˆ _ ˆ _ ˆ _ ˆ _ ˆ _ˆ _| dd¡r¶tˆ _ntˆ _‡ fd	d
„ˆ _tdƒ}| ddd¡}	| dd|	¡ˆ _ˆ jjˆ _ t!t"|d ƒt"ˆ jƒddˆ jˆ jf ddd�}
t#ˆ j
 |
d< d|
d< |
 $| di ¡¡ |
 %¡ D ]\}}ˆ j  &||¡ �qXˆ j 'd¡}ˆ j (d¡}| )|¡ ˆ j  )|¡ ˆ j 'd¡}ˆ j (d¡}| )|¡ ˆ j  )|¡ ˆ  *t+d t+d ¡ ˆ  ,t+d ¡ ˆ  -d¡ ˆ  .d¡ ˆ  /d ¡ |�s`t0ˆ jd!d"d#�}t0ˆ jd$ddˆ jˆ jd%�}| )|¡ ˆ j  )|¡ t!d&d'�}nt!dˆ jˆ jf d(�}t0ˆ jd)fd*d+ˆ j d,œ|¤Žˆ _1|�rÐt0ˆ jd)|d-d,�ˆ _2ˆ j2 )ˆ j1¡ ˆ j  )ˆ j2¡ nˆ j  )ˆ j1¡ ˆ j1ˆ _3dS ).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ÚextraXmlDeclrT   ÚscaleGroupIdNZ
use_fp_strc                     s   ˆ j | Ž  dd¡S )Nra   ú,)r   Úreplaceri   ©rI   r   r   Ú<lambda>¶   rh   z$SVGCanvas.__init__.<locals>.<lambda>ÚminidomÚsvgz-//W3C//DTD SVG 1.0//ENz8http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtdr   zxMinYMin meetz	0 0 %d %dzhttp://www.w3.org/2000/svgz1.0)r#   r$   ÚpreserveAspectRatioÚviewBoxÚxmlnsÚversionú	fill-rulezhttp://www.w3.org/1999/xlinkzxmlns:xlinkÚsvgAttrsÚtitlez...ÚdescÚfontNameÚfontSizeÚstrokeColorr.   r   ÚclipPathÚclip)ÚidÚrect)r+   r,   r#   r$   zclip-path: url(#clip)©Ústyle)r„   ÚgÚgroupzscale(1,-1) translate(0,-%d))r…   Ú	transformz
scale(1,1))4ÚverboserC   rD   rE   rF   rJ   Úpopro   rp   r   Ú	_fillModer#   r$   ÚsizeÚcoderˆ   ÚpathÚ_strokeColorÚ
_fillColorÚ
_lineWidthÚ_fontÚ	_fontSizeÚ_lineCapÚ	_lineJoinr   rk   Úcfp_strr   ZcreateDocumentTypeZcreateDocumentr;   ZdocumentElementrw   Údictr8   Ú_fillRuleMapÚupdater7   r9   r6   ÚcreateTextNodeÚappendChildÚsetFontr   ÚsetStrokeColorÚ
setLineCapÚsetLineJoinÚsetLineWidthr?   Z	groupTreeZ	scaleTreeÚ	currGroup)rI   r�   rF   rŒ   rJ   r   rn   rq   ÚimplementationÚdoctyper}   ÚkÚvr~   Útextr   rƒ   ZclipRectZgtkwr   rt   r   rB   ˜   sœ    	þÿÿþ

÷




ÿ

þýzSVGCanvas.__init__Nc                 C   s†   t | j| jd�}| jj|dd| jd� t|dƒr6|}nt|d| jd�}| ¡ }| j}|rh| 	dd| ¡}| 
|¡ ||ur‚| ¡  d S )	N)rJ   ú	Ú
)Z	addindentZnewlrF   rG   Úw)rF   z?>)r@   rF   rJ   r;   ZwritexmlÚhasattrÚopenr   rp   rs   rG   Úclose)rI   r'   ÚwriterÚfrw   Zexdr   r   r   r&     s    

zSVGCanvas.savec                 C   s    |p| j }|p| j}t|||ƒS )zuReturn the logical width of the string if it were drawn
        in the current font (defaults to self.font).
        )r•   r–   r   )rI   r   Úfontr�   r   r   r   ÚNOTUSED_stringWidth  s    

zSVGCanvas.NOTUSED_stringWidthrT   c                    sx   | j  ¡ ‰ˆ |¡ tˆ ¡ ƒ}ˆr6‡fdd„|D ƒ}ˆ rXˆ  ¡ ‰ ‡ ‡fdd„|D ƒ}n‡fdd„|D ƒ}d |¡d S )Nc                    s   g | ]}|ˆ v r|‘qS r   r   ©re   r§   )Úincluder   r   Ú
<listcomp>%  rh   z*SVGCanvas._formatStyle.<locals>.<listcomp>c                    s(   g | ] }|ˆ vr|d  t ˆ| ƒ ‘qS ©z: ©r8   r´   )Úexcluderˆ   r   r   r¶   (  rh   c                    s    g | ]}|d  t ˆ | ƒ ‘qS r·   r¸   r´   r‡   r   r   r¶   *  rh   z; ú;)rˆ   Úcopyrœ   rA   ÚkeysÚsplitrV   )rI   rµ   r¹   r   r¼   r7   r   )r¹   rµ   rˆ   r   Ú_formatStyle   s    

zSVGCanvas._formatStylec                 C   s   |S )zKI don't think this was ever needed; seems to have been copied from renderPSr   )rI   r   r   r   r   Ú_escape-  s    zSVGCanvas._escapec                 C   s&   dS d}|	|
||||| |f}|| S )zXCalculate the path for an arc inscribed in rectangle defined
        by (x1,y1),(x2,y2).Nç       @zImatrix currentmatrix %s %s translate %s %s scale 0 0 1 %s %s %s setmatrixr   ÚarcZarcn)Úabs)rI   Úx1Úy1Úx2Úy2ÚstartAngÚextentZxScaleZyScaler+   r,   ÚcodelinerÁ   Údatar   r   r   Ú_genArcCode1  s          zSVGCanvas._genArcCodec                 C   sT   i }|rt | |d< t| jd| j|  |¡d�}|r>|  ||¡}| j |¡ d| _d S )Nr|   r‘   ©r   rˆ   rT   )r›   r?   r;   r‘   r¾   Ú	_add_linkr¤   rž   )rI   r�   r„   Ú	link_infoZstylesÚfillModeZxtrar‘   r   r   r   Ú_fillAndStrokeG  s    ÿzSVGCanvas._fillAndStrokec                 C   s.   ddddœ}| j |kr*|| _ || | jd< d S )NZbuttÚroundZsquare©r   r   r.   ústroke-linecap)r—   rˆ   ©rI   r¨   Úvalsr   r   r   r¡   U  s    
zSVGCanvas.setLineCapc                 C   s.   ddddœ}| j |kr*|| _ || | jd< d S )NZmiterrÑ   ZbevelrÒ   rÓ   )r˜   rˆ   rÔ   r   r   r   r¢   [  s    
zSVGCanvas.setLineJoinc                 C   s„   t |ttfƒr*d tt||gƒ¡| jd< nVt |ttfƒr€t	|ƒdkr€|dksTJ dƒ‚d tt|ƒ¡| jd< |dkr€t|ƒ| jd< dS )z7Two notations. Pass two numbers, or an array and phase.ú, zstroke-dasharrayr   zphase is a length in user spacezstroke-dashoffsetN)
Ú
isinstanceÚfloatÚintrV   Úmapr8   rˆ   ÚtuplerA   r0   )rI   ÚarrayÚphaser   r   r   ÚsetDasha  s    zSVGCanvas.setDashc                 C   s„   || _ |d krd| jd< nf|j|j|j  }}}d|d |d |d f | jd< |j}|dkrnd| | jd< nd| jv r€| jd= d S )NÚnoneZstrokeúrgb(%d%%,%d%%,%d%%)éd   r   ú%szstroke-opacity)r’   rˆ   ÚredÚgreenÚblueÚnormalizedAlpha©rI   Úcolorr-   r‰   ÚbÚalphar   r   r   r    l  s     
zSVGCanvas.setStrokeColorc                 C   s„   || _ |d krd| jd< nf|j|j|j  }}}d|d |d |d f | jd< |j}|dkrnd| | jd< nd| jv r€| jd= d S )Nrß   Úfillrà   rá   r   râ   zfill-opacity)r“   rˆ   rã   rä   rå   ræ   rç   r   r   r   ÚsetFillColory  s     
zSVGCanvas.setFillColorc                 C   s   || _ t| | jd< d S )Nr|   )rŽ   r›   rˆ   )rI   r¨   r   r   r   ÚsetFillMode†  s    zSVGCanvas.setFillModec                 C   s   || j kr|| _ || jd< d S )Nzstroke-width)r”   rˆ   )rI   r#   r   r   r   r£   Š  s    
zSVGCanvas.setLineWidthc                 C   sÂ   | j |ks| j|kr¾|| _ || _| j}tD ]}||v r*||= q*|| jv rR| j| ni }t|tƒrt| t|j	 
¡ ƒ¡ |r¢| 
¡ D ] \}}d| }|tv r€|||< q€d|vr²||d< d| |d< d S )Nzfont-zfont-familyz%spxz	font-size)r•   r–   rˆ   ÚTEXT_STYLESro   r×   r   rœ   Úiterr}   r7   )rI   r²   r�   rˆ   r§   r}   r¨   rf   r   r   r   rŸ   �  s$    

zSVGCanvas.setFontc                 C   s0   t |tƒsJ ‚t| jdfi |¤Ž}| |¡ |S )Nrf   )r×   rš   r?   r;   rž   )rI   Z
dom_objectrÎ   Úlinkr   r   r   rÍ   £  s    
zSVGCanvas._add_linké   c              	   K   s€   | j rtdƒ t||ƒ}	t||ƒ}
i }t| jdf|	|
t||ƒ|	 t||ƒ|
 |  t¡dœ|¤Ž}|rp|  ||¡}| j	 
|¡ dS )z)Draw a rectangle between x1,y1 and x2,y2.z+++ SVGCanvas.rectr†   )r+   r,   r#   r$   rˆ   N)rŒ   ÚprintÚminr?   r;   Úmaxr¾   ÚAREA_STYLESrÍ   r¤   rž   )rI   rÃ   rÄ   rÅ   rÆ   ÚrxÚryrÎ   Ú	_svgAttrsr+   r,   r   r†   r   r   r   r†   ª  s    


þþzSVGCanvas.rectc           
      K   sR   t | jdf|||| || |||  t¡dœ|¤Ž}	|rB|  |	|¡}	| j |	¡ dS )z·Draw 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$   rö   r÷   rˆ   N©r?   r;   r¾   rõ   rÍ   r¤   rž   )
rI   rÃ   rÄ   rÅ   rÆ   rö   r÷   rÎ   rø   r†   r   r   r   Ú	roundRect»  s    
þþzSVGCanvas.roundRectÚleftc                 K   sÂ  |dkrd S t |ƒ}| jr"tdƒ |dkp@|dkp@|dkp@|dk}	|dkp`|dkp`|dkp`|dk}
| jd krp|	s‚| jd k�r¾|
�r¾|d	vrôt|| j| jƒ}|d
kr¬||8 }nH|dkrÂ||d 8 }n2|dkrä|t|||| j| jƒ8 }nt	dt
|ƒ ƒ‚|  |¡}|  t¡}|dk�r(|d|  |||¡  }|	�r>||  t¡7 }n|d7 }|
�r\||  t¡7 }n|d7 }t| jdf|||dd|  dœ|¤Ž}| j |¡}| |¡ |�r²|  ||¡}| j |¡ d S )Né   z+++ SVGCanvas.drawStringr   r.   é   é   r   é   )ÚstartZ	inheritedrû   ÚendÚmiddlerÀ   Únumericzbad value for text_anchor z rotate(%s);z fill:none;z stroke:none;r©   ztranslate(0,%d) scale(1,-1))r+   r,   rˆ   r‹   )r   rŒ   rò   r“   r’   r   r•   r–   ZnumericXShiftrO   r8   r¿   r¾   rî   r   ÚEXTRA_FILL_STYLESÚEXTRA_STROKE_STYLESr?   r;   r�   rž   rÍ   r¤   )rI   r   r+   r,   ÚanglerÎ   Útext_anchorÚtextRenderModerø   ZneedFillZ
needStrokeZtextLenÚstr©   Úcontentr   r   r   Ú
drawStringË  sH       





þý
zSVGCanvas.drawStringr  c           	      K   s2   | j rtdƒ | j|||f||||dœ|¤Ž d S )Nz+++ SVGCanvas.drawCentredString©r  rÎ   r  r  ©rŒ   rò   r  )	rI   r   r+   r,   r  r  rÎ   r  rø   r   r   r   ÚdrawCentredStringø  s    ÿÿzSVGCanvas.drawCentredStringr  c           	      K   s2   | j rtdƒ | j|||f||||dœ|¤Ž d S )Nz+++ SVGCanvas.drawRightStringr  r  )	rI   r©   r+   r,   r  r  rÎ   r  rø   r   r   r   ÚdrawRightStringþ  s    ÿÿzSVGCanvas.drawRightStringc                 C   s   | j  |¡}dS )zAdd a comment.N)r;   ZcreateComment)rI   rÊ   Úcommentr   r   r   r    s    zSVGCanvas.commentTc                 C   sj   t ƒ }| |d¡ tt | ¡ ¡ƒ}| j t| j	d||||d| d|  
ddddd|d|  ¡ d	�¡ d S )
NZpngÚimagezdata:image/png;base64,ú
matrix(%s)r   r   éÿÿÿÿr.   )r+   r,   r#   r$   Úhrefr‹   )r   r&   r   Úbase64Ú	b64encoder   r¤   rž   r?   r;   r™   )rI   r  r+   r,   r#   r$   ÚembedÚbufr   r   r   Ú	drawImage
  s    ýÿzSVGCanvas.drawImagec              	   C   sJ   | j d krFt| jdd|  ||¡|  ||¡f |  t¡d�}| j |¡ d S )Nr‘   zM %s L %s ZrÌ   )r’   r?   ÚLINE_STYLESr;   r™   r¾   r¤   rž   )rI   rÃ   rÄ   rÅ   rÆ   r‘   r   r   r   Úline  s    
þzSVGCanvas.linec              
   C   s^   t | jd|| d || d || d || d |  t¡d�}|rN|  ||¡}| j |¡ dS )z{Draw an orthogonal ellipse inscribed within the rectangle x1,y1,x2,y2.

        These should have x1<x2 and y1<y2.
        ÚellipserÀ   )ÚcxÚcyrö   r÷   rˆ   Nrù   )rI   rÃ   rÄ   rÅ   rÆ   rÎ   r  r   r   r   r  "  s    (þzSVGCanvas.ellipsec              	   C   s<   t | jd||||  t¡d�}|r,|  ||¡}| j |¡ d S )NÚcircle)r  r  r-   rˆ   rù   )rI   ZxcZycr-   rÎ   r  r   r   r   r  0  s    þzSVGCanvas.circlec
                 C   s2   d S | jd kr.| j |
| |	r"dp$d d ¡ d S )Nz%s m %s curvetoz eofillz
 closepathrT   z stroke)r   r“   r�   r1   r’   )rI   rÃ   rÄ   rÅ   rÆ   Úx3Úy3Zx4Zy4ÚclosedrÉ   rÊ   r   r   r   Ú	drawCurve:  s        

ÿþzSVGCanvas.drawCurveéh  c              
   C   sh  || d || d  }}	|| d || d  }
}|
t |t d ƒ | }|t|t d ƒ |	 }|
t || t d ƒ | }|t|| t d ƒ |	 }| j}g j}|rÈ|d|||	ƒ|||ƒf ƒ |rô|d||
|ƒd|dkd|||ƒf ƒ n.|d|||ƒ||
|ƒd|dkd|||ƒf ƒ |�r:|d|||	ƒ ƒ t| jdd	 |j¡|  	¡ d
�}| j
 |¡ dS )a  Draw 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.
        rÀ   é´   z	M %s L %szA %s %d %d %d %sr   zM %s A %s %d %d %d %s ZzL %s Zr‘   ra   rÌ   N)ÚcosÚpiÚsinr™   r1   r?   r;   rV   Ú__self__r¾   r¤   rž   )rI   rÃ   rÄ   rÅ   rÆ   rÇ   rÈ   Ú
fromcenterr  r  rö   r÷   ZmxZmyÚaxZayr™   r   r‘   r   r   r   ÚdrawArcG  s.    ÿ$ÿÿzSVGCanvas.drawArcc                 C   st   t |ƒdksJ dƒ‚| jd ks(| jd krpd dd„ |D ƒ¡}t| jd||  t¡d�}|rd|  ||¡}| j	 
|¡ d S )Nr.   z"Polygon must have 2 or more pointsrÖ   c                 S   s   g | ]}t |Ž ‘qS r   r   ©re   Úpr   r   r   r¶   m  rh   z%SVGCanvas.polygon.<locals>.<listcomp>Úpolygon©Úpointsrˆ   )r0   r’   r“   rV   r?   r;   r¾   rõ   rÍ   r¤   rž   )rI   r1  r"  rÎ   ÚptsÚpolyliner   r   r   r/  i  s    
ÿzSVGCanvas.polygonc                 C   s2   d S ](}| j |t|d ƒt|d ƒf ¡ qd S )Nz%s m %s l stroker   r   )r’   r�   r1   r   )rI   ZlineListrè   r#   rÉ   r  r   r   r   Úlinesx  s
      zSVGCanvas.linesc                 C   s^   t |ƒdksJ dƒ‚| jd krZd dd„ |D ƒ¡}t| jd|| jtd d�d�}| j |¡ d S )	Nr   z#Polyline must have 1 or more pointsrÖ   c                 S   s   g | ]}t |Ž ‘qS r   r   r-  r   r   r   r¶   …  rh   z&SVGCanvas.polyLine.<locals>.<listcomp>r3  )rë   r0  )	r0   r’   rV   r?   r;   r¾   rõ   r¤   rž   )rI   r1  r2  r3  r   r   r   ÚpolyLine�  s    
ÿzSVGCanvas.polyLine)r‹   c                 C   sJ   | j rtdƒ | j}t| jdfi |¤Ž}| |¡ || _| j rFtdƒ |S )Nz+++ begin SVGCanvas.startGroupr‰   z+++ end SVGCanvas.startGroup)rŒ   rò   r¤   r?   r;   rž   )rI   r=   r¤   rŠ   r   r   r   Ú
startGroup‹  s    
zSVGCanvas.startGroupc                 C   s&   | j rtdƒ || _| j r"tdƒ d S )Nz+++ begin SVGCanvas.endGroupz+++ end SVGCanvas.endGroup)rŒ   rò   r¤   )rI   r¤   r   r   r   ÚendGroup”  s    zSVGCanvas.endGroupc           	   	   C   sl   | j rtd||||||ƒ | j d¡}||||||fdkrhd|  ||||||¡ }| j dd||f ¡ d S )Nz!!! begin SVGCanvas.transformr‹   )r   r   r   r   r   r   r  ú%s %s)rŒ   rò   r¤   r:   r™   r9   )	rI   rf   ré   r(   r   Úer±   ÚtrÚtr   r   r   r‹   ™  s
    zSVGCanvas.transformc              
   C   s:   ||fdkr6| j  dd| j  d¡d|  ||¡ f ¡ d S )N)r   r   r‹   r8  ztranslate(%s))r¤   r9   r:   r™   ©rI   r+   r,   r   r   r   Ú	translate   s    

ÿÿzSVGCanvas.translatec              
   C   s>   ||fdkr:| j  dd| jd  d¡d|  ||¡ f ¡ d S )N)r   r   r‹   r8  r  z	scale(%s))r¤   r9   Úgroupsr:   r™   )rI   ZsxZsyr   r   r   Úscale¦  s    
ÿÿzSVGCanvas.scalec                 C   s   | j d|  ||¡  | _ d S )NzM %s ©r‘   r   r<  r   r   r   ÚmoveTo­  s    zSVGCanvas.moveToc                 C   s   | j d|  ||¡  | _ d S )NzL %s r@  r<  r   r   r   ÚlineTo°  s    zSVGCanvas.lineToc              
   C   s$   | j d|  ||||||¡  | _ d S )NzC %s r@  )rI   rÃ   rÄ   rÅ   rÆ   r   r!  r   r   r   ÚcurveTo³  s    zSVGCanvas.curveToc                 C   s   | j d | _ d S )NzZ )r‘   rt   r   r   r   Ú	closePath¶  s    zSVGCanvas.closePathc                 C   s   d S ©Nr   rt   r   r   r   Ú	saveState¹  s    zSVGCanvas.saveStatec                 C   s   d S rE  r   rt   r   r   r   ÚrestoreState¼  s    zSVGCanvas.restoreState)rl   rK   r   F)N)NN)rñ   rñ   N)rñ   rñ   N)r   Nrû   r   )r   r  Nr   )r   r  Nr   )T)N)N)r   )r   r$  r   )r   N)NN)/rW   rX   rY   rB   r&   r³   r¾   r¿   rË   rõ   rÐ   r¡   r¢   rÞ   r    rì   rí   r£   rŸ   rÍ   r†   rú   r  r  r  r  r  r  r  r  r#  r,  r/  r4  r5  rš   r6  r7  r‹   r=  r?  rA  rB  rC  rD  rF  rG  r   r   r   r   r"   —   s\   
l





-  ÿ
  ÿ






"

	
	r"   c                   @   s    e Zd ZdZdd„ Zdd„ Zdddd	d
dddœZdd„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zefd"d#„Zd$d%„ Zd&d'„ Zd(S ))r)   z%This draws onto an SVG document.
    c                 C   s
   d| _ d S )Nr   )rŒ   rt   r   r   r   rB   Ã  s    z_SVGRenderer.__init__c                 C   sà   | j rtd| ƒ | j d| ¡ | jj ¡ }t|tƒr>|js>t	|ƒ}| j
 |¡ |  |i ¡ |  |¡ | j
 ¡ }t|tƒr‚|js‚| j d| ¡ | ¡ D ]&\}}|| jv ršt| j| j| |ƒ qš|| j_| j rÜtd| ƒ dS )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ò   Ú_canvasr  rˆ   r»   r×   r   Ú
isClipPathr   Ú_trackerÚpushÚapplyStateChangesZdrawNodeDispatcherr�   r7   Ú	_restoresÚsetattr)rI   r<   rˆ   ZdeltasZrDeltasr§   r¨   r   r   r   ÚdrawNodeÆ  s     


z_SVGRenderer.drawNoder’   r”   r—   r˜   r“   r•   r–   )r‚   ÚstrokeWidthÚstrokeLineCapÚstrokeLineJoinÚ	fillColorr€   r�   c                 C   s8   t |ddƒpd}t |ddƒpd}|r0||ddœS d S d S )NZhrefURLrT   Z	hrefTitleZ_top)z
xlink:hrefzxlink:titleÚtarget)Úgetattr)rI   ÚobjÚurlr~   r   r   r   Ú_get_link_info_dictê  s
    z _SVGRenderer._get_link_info_dictc                 C   s–   | j rtdƒ | j ¡ }| j ¡ d \}}}}}}| ¡ D ]&}	t|	tƒrR|	 	¡ }
n|	}
|  
|
¡ q:| j ||||||¡ | j |¡ | j r’tdƒ d S )Nz ### begin _SVGRenderer.drawGroupr‹   z### end _SVGRenderer.drawGroup)rŒ   rò   rH  r6  rJ  ÚgetStateZgetContentsr×   r   ZprovideNoderO  r‹   r7  )rI   rŠ   r¤   rf   ré   r(   r   r9  r±   Z	childNodeÚnode2r   r   r   Ú	drawGroup	  s    


z_SVGRenderer.drawGroupc                 C   s¤   |   |¡}t|di ƒ}|j|j  kr.dkrfn n4| jj|j|j|j|j |j|j	 fd|i|¤Ž n:| jj
|j|j|j|j |j|j	 |j|jfd|i|¤Ž d S )Nrø   r   rÎ   )rX  rU  rö   r÷   rH  r†   r+   r,   r#   r$   rú   )rI   r†   rÎ   r}   r   r   r   ÚdrawRect  s(    
þþþýüüz_SVGRenderer.drawRectc                 C   sb   | j  ¡ }|d |j|j|jf\}}}}| jj|||f|  |¡|t|ddƒdœt|di ƒ¤Ž d S )NZ
textAnchorr  r   )rÎ   r  r  rø   )	rJ  rY  r+   r,   r©   rH  r  rX  rU  )rI   Z	stringObjÚSr  r+   r,   r©   r   r   r   r  *  s    
ÿ
þz_SVGRenderer.drawStringc                 C   s&   | j jr"| j  |j|j|j|j¡ d S rE  )rH  r’   r  rÃ   rÄ   rÅ   rÆ   )rI   r  r   r   r   ÚdrawLine1  s    z_SVGRenderer.drawLinec                 C   s$   | j j|j|j|j|  |¡d� d S ©N)rÎ   )rH  r  r  r  r-   rX  )rI   r  r   r   r   Ú
drawCircle5  s    z_SVGRenderer.drawCirclec              	   C   sÖ   |  ¡ \}}}|dks|d u rª|dks.|d u rª|jsª|j|j|j|j|jf\}}}}}	|jp`|j}|| ||  }
}|| ||  }}|	| }| jj	|
|||||dd� n(| 
¡ }t|tƒrÈ|  |¡ n
|  |¡ d S )Nr   r   )r*  )Z
_xtraRadiiZannularÚcenterxÚcenteryÚradiusÚstartangledegreesÚendangledegreesÚyradiusrH  r,  Z	asPolygonr×   r   ÚdrawPathÚdrawPolygon)rI   Zwedgerf  Zradius1Zyradius1ra  rb  rc  rd  re  rÃ   rÄ   rÅ   rÆ   rÈ   r3   r   r   r   Ú	drawWedge8  s    &ÿ
z_SVGRenderer.drawWedgec                 C   s   | j jr| j  t|jƒ¡ d S rE  )rH  r’   r5  r5   r1  ©rI   r.  r   r   r   ÚdrawPolyLineI  s    z_SVGRenderer.drawPolyLinec                 C   sP   |j |j }|j |j }|j|j }|j|j }| jj|||||  |¡d� d S r_  )r  rö   r  r÷   rH  r  rX  )rI   r  rÃ   rÅ   rÄ   rÆ   r   r   r   ÚdrawEllipseM  s
    z_SVGRenderer.drawEllipsec                 C   s"   | j jt|jƒd|  |¡d� d S )Nr   )r"  rÎ   )rH  r/  r5   r1  rX  rj  r   r   r   rh  U  s    z_SVGRenderer.drawPolygonc           	   	      s  ddl m‰  | j}|j|j|j|jf‰|d u r:tˆdtƒ}|  	ˆ¡}tˆddƒ}‡ ‡‡fdd„}|dkr„|ƒ  |j
g ˆj||d	� nŒ|d
kr¬|dd� |j
g ˆj||d	� nd|ƒ }|sü|j}| d ¡ z&d }|j
g ˆj||d	� W | |¡ n| |¡ 0 n|j
g ˆj||d	� d S )Nr   )Ú_renderPathrÏ   Ú	autocloserT   c                     s   ˆ ˆˆfi | ¤ŽS rE  r   )r   ©rm  Z	drawFuncsr‘   r   r   ÚrPa  s    z!_SVGRenderer.drawPath.<locals>.rPrw   )r„   rÎ   rÏ   ZpdfT)Z
forceClose)Úreportlab.graphics.shapesrm  rH  rA  rB  rC  rD  rU  r   rX  rÐ   rI  r“   rì   )	rI   r‘   rÏ   r(   rÎ   rn  rp  ZisClosedZofcr   ro  r   rg  X  s.    


z_SVGRenderer.drawPathc                 C   s–   |j }t|tƒr2|r tj  |¡s$d S tƒ  |¡}nt|dƒrB|}nd S |j\}}|j	|j
 }}|d u rj|}|d u rv|}| jj||j|j||dd� d S )NÚconvertT)r  )r‘   r×   r8   ÚosÚisfiler   r®   r­   r�   r#   r$   rH  r  r+   r,   )rI   r  r‘   ZimZsrcWZsrcHZdstWZdstHr   r   r   r  v  s    


z_SVGRenderer.drawImagec                 C   sH  |  ¡ D �]8\}}|dkrq|dkr2| j |¡ q|dkrH| j |¡ q|dkr^| j |¡ q|dkrt| j |¡ q|dkrÞ|rÒt|ttfƒr¾t	|ƒdkr¾t|d ttfƒr¾|d	 }|d }nd	}| j 
||¡ n
| j 
¡  q|d
krô| j |¡ q|dv �r.| d| jj¡}| d| jj¡}| j ||¡ q|dkr| j |¡ qdS )z\This takes a set of states, and outputs the operators
        needed to set those propertiesr‹   r‚   rP  rQ  rR  ZstrokeDashArrayr.   r   r   rS  )r�   r€   r€   r�   rÏ   N)r7   rH  r    r£   r¡   r¢   r×   rA   rÛ   r0   rÞ   rì   Úgetr•   r–   rŸ   rí   )rI   ÚdeltaZnewStateÚkeyÚvaluerÝ   ZfontnameZfontsizer   r   r   rL  …  s6    ,

z_SVGRenderer.applyStateChangesN)rW   rX   rY   rZ   rB   rO  rM  rX  r[  r\  r  r^  r`  ri  rk  rl  rh  r   rg  r  rL  r   r   r   r   r)   ¿  s(    þr)   úout-svgc                 C   s  t j | ¡st  | ¡ ddlm} g }t|ƒD ]>}|dd… dkr.t||ƒ}|ƒ }t|ddƒ}| ||f¡ q.d}|D ],\}}t j 	| d| ¡}	t
||	ƒ |d7 }qvdd	lm}
 |
ƒ }t
|t j 	| d
¡ƒ ddlm} ddlm} |ƒ }||j|jƒ}| |¡ t
|t j 	| d¡ƒ d S )Nr   )Ú
testshapesé
   Z
getDrawingrZ   rT   zrenderSVG_%d.svgr   )ÚgetDrawing01ztest.svg)ÚRL_CorpLogo)ÚDrawingzcorplogo.svg)rs  r‘   ÚisdirÚmkdirZreportlab.graphicsrz  ÚdirrU  r1   rV   r   Zreportlab.graphics.testshapesr|  Zreportlab.lib.corpr}  rq  r~  r#   r$   Úadd)ZoutDirrz  ZdrawingsÚfuncnameÚfuncr*   Ú	docstringr4   r   Úfilenamer|  r}  r~  Zrlr   r   r   Útest¨  s0    




r‡  Ú__main__)N)ry  ):rZ   ÚmathrM   rs  rC   r  Úior   r   Zreportlab.pdfbase.pdfmetricsr   Zreportlab.lib.rl_accelr   Zreportlab.lib.utilsr   Zreportlab.graphics.renderbaser   r	   r
   rq  r   r   r   Z	reportlabr   r   r   r   Zreportlab.pdfgen.canvasr   r   ZrenderPMr   Úxml.domr   r(  r&  r'  r½   rõ   r  rî   r  r  r   r    r   r%   r5   r?   rA   r@   r›   rk   r"   r)   r‡  rW   r   r   r   r   Ú<module>   sZ   	(
'ú	    , j
"
