Warning: session_start(): Session cannot be started after headers have already been sent in /home/tvrreohg/public_html/manga.php on line 13
3 Neb6“ã @sÂdZddlZddlZddlZddlZddlZddlmZmZddl m Z ddl m Z ddl mZddlmZmZmZddlmZmZmZdd lTdd lmZdd l mZmZmZdd lmZmZd dlm Z ddl!m"Z"ej#Z#ej$Z$ej%Z%dj&ƒZ'dj&ƒZ(dj&ƒZ)dj&ƒZ*dj&ƒZ+ej,fdd„Z-ej,fdd„Z.ddej,fdd„Z/dd„Z0d/dd„Z1Gdd „d e2ƒZ3ed!d"d!d!d!ed#d$d#d#d#iZ4d%d&„Z5Gd'd(„d(ƒZ6Gd)d*„d*eƒZ7d0d,d-„Z8e9d.k�r¾e8ƒdS)1aAn 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 idzReturns a SVG as a string in memory, without touching the diskÚ showBoundary)rÚ drawToFileÚgetvalue)ÚdrÚkwdsÚs©rú=/tmp/tmp4i9tl1d3/lib64/python/reportlab/graphics/renderSVG.pyÚ drawToString'srcKs<t|ƒ}t|j|jff|Ž}t||dd|d�|j|ƒdS)Nr)r)r Ú SVGCanvasÚwidthÚheightÚdrawÚsave)rÚfnrrÚcrrrr-srcCs"tƒ}|jt|ƒ||||d�dS)z As it says.)rN)Ú _SVGRendererr#r )ÚdrawingZcanvasÚxÚyrÚrrrrr#3sr#cCs<g}x2tdt|ƒdƒD]}|j||||dfƒqW|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ÚirrrÚ_pointsFromList9sr3c KsX|j|ƒ}xH|jƒD]<\}}t|ƒ}|s6|j||ƒq|j|ƒ}|j||pL|ƒqW|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 n = transformNode(doc, "node1", x=0, y=1+1) -> DOM node for n = transformNode(doc, "node1", node0, x="x0", y="x0", zoo=bar()) -> DOM node for )Ú createElementÚitemsÚstrÚ setAttributeÚ getAttribute) ÚdocZnewTagÚnodeÚattrDictZnewNodeZnewAttrÚattrZsattrZattrValrrrÚ transformNodeEs  r=c@sHeZdZdZejejejejej ej dœZ d dd„Z dd„Z dd „Zd S) Ú EncodedWriterz� EncodedWriter(encoding) assumes .write will be called with either unicode or utf8 encoded bytes. it will accumulate unicode )zutf-32z utf-32-bez utf-32-lezutf-16z utf-16-bez utf-16-leFcCsDtj|ƒtj|ƒj|_}|r(d|ks0d|kr@|j|j|ƒdS)NZ16Z32)ÚlistÚ__init__ÚcodecsÚlookupÚnameÚencodingÚwriteÚBOMS)ÚselfrDÚbomrrrr@rs zEncodedWriter.__init__c Csvt|ƒrPy|jdƒ}Wqhtjƒ\}}}t|ƒ}~~td||fƒ‚YqhXnt|ƒshtdt|ƒƒ‚|j|ƒdS)Nzutf-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_infor6Ú ValueErrorrÚasciir/)rGÚuÚetZevÚtbrrrrExszEncodedWriter.writecCsdj|ƒ}|dd…=|S)NÚ)Újoin)rGr+rrrr…s  zEncodedWriter.getvalueN)F)Ú__name__Ú __module__Ú __qualname__Ú__doc__rAÚ BOM_UTF32Ú BOM_UTF32_BEÚ BOM_UTF32_LEÚ BOM_UTF16Ú BOM_UTF16_BEÚ BOM_UTF16_LErFr@rErrrrrr>ds   r>Znonzeroznon-zeroZevenoddzeven-oddcGsdjdd„|DƒƒS)Nú css"|]}d|jdƒjdƒVqdS)z%fÚ0Ú.N)Úrstrip)Ú.0Úarrrú ”szpy_fp_str..)rR)ÚargsrrrÚ py_fp_str“srec@sšeZdZdcdd„Zdddd „Zded d „Zgd fd d„Zdd„Zdd„Zdde dfdd„Z dd„Z dd„Z gdfdd„Z dd„Zdd„Zdd „Zd!d"„Zd#d$„Zd%d&„Zdfd(d)„Zdgd*d+„Zdhd-d.„Zdid0d1„Zdjd3d4„Zd5d6„Zdkd8d9„Zd:d;„Zdldd?„Zdnd@dA„ZdodCdD„ZdpdEdF„Z dqdGdH„Z!dIdJ„Z"e#d dK�fdLdM„Z$dNdO„Z%dPdQ„Z&dRdS„Z'dTdU„Z(dVdW„Z)dXdY„Z*dZd[„Z+d\d]„Z,d^d_„Z-d`da„Z.dS)rr é,úutf-8rFc sî|ˆ_tj|ƒjˆ_|ˆ_|jddƒ}|jdiƒˆ_|jddƒˆ_|jddƒ}t ˆ_ |\ˆ_ ˆ_ ˆ_ gˆ_iˆ_dˆ_dˆ_ˆ_ˆ_ˆ_ˆ_ˆ_ˆ_|jddƒr¶tˆ_ntˆ_‡fd d „ˆ_td ƒ}|jd d dƒ} |jdd | ƒˆ_ˆjjˆ_ t!t"|dƒt"ˆj ƒddˆj ˆj fddd�} t#ˆj | d<d| d<| j$|jdiƒƒx$| j%ƒD]\} } ˆj j&| | ƒ�qZWˆjj'dƒ} ˆjj(dƒ}| j)|ƒˆj j)| ƒˆjj'dƒ}ˆjj(dƒ}|j)|ƒˆj j)|ƒˆj*t+dt+dƒˆj,t+dƒˆj-dƒˆj.dƒˆj/d ƒ|�sdt0ˆjd!d"d#�}t0ˆjd$ddˆj ˆj d%�}|j)|ƒˆj j)|ƒt!d&d'�}nt!dˆj ˆj fd(�}t0ˆjd)fd*d+ˆj d,œ|—Žˆ_1|�rÔt0ˆjd)|d-d,�ˆ_2ˆj2j)ˆj1ƒˆj j)ˆj2ƒnˆj j)ˆj1ƒˆj1ˆ_3dS).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Ú extraXmlDeclrQÚ scaleGroupIdNZ use_fp_strcsˆj|ŽjddƒS)Nr]ú,)rÚreplace)rd)rGrrÚ¶sz$SVGCanvas.__init__..ZminidomÚsvgz-//W3C//DTD SVG 1.0//ENz8http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtdrz xMinYMin meetz 0 0 %d %dzhttp://www.w3.org/2000/svgz1.0)r!r"ZpreserveAspectRatioZviewBoxZxmlnsÚversionz fill-rulezhttp://www.w3.org/1999/xlinkz xmlns:xlinkÚsvgAttrsÚtitlez...ÚdescÚfontNameÚfontSizeÚ strokeColorr,rÚclipPathÚclip)ÚidÚrect)r)r*r!r"zclip-path: url(#clip))Ústyle)rxÚgÚgroupzscale(1,-1) translate(0,-%d))ryÚ transformz scale(1,1))4ÚverboserArBrCrDrHÚpoprirjrÚ _fillModer!r"ÚsizeÚcoder{ÚpathÚ _strokeColorÚ _fillColorÚ _lineWidthÚ_fontÚ _fontSizeÚ_lineCapÚ _lineJoinrreÚcfp_strrZcreateDocumentTypeZcreateDocumentr9ZdocumentElementroÚdictr6Ú _fillRuleMapÚupdater5r7r4ÚcreateTextNodeÚ appendChildÚsetFontr ÚsetStrokeColorÚ setLineCapÚ setLineJoinÚ setLineWidthr=Z groupTreeZ scaleTreeÚ currGroup)rGr‚rDrrHrrhrkÚimplementationÚdoctyperqÚkÚvrrÚtextrsrwZclipRectZgtkwr)rGrr@˜s„   *                      zSVGCanvas.__init__NcCs†t|j|jd�}|jj|dd|jd�t|dƒr6|}nt|d|jd�}|jƒ}|j}|rh|j dd|ƒ}|j |ƒ||k r‚|j ƒdS) N)rHú Ú )Z addindentZnewlrDrEÚw)rDz?>) r>rDrHr9ZwritexmlÚhasattrÚopenrrjrmrEÚclose)rGr%ÚwriterÚfroZexdrrrr$s  zSVGCanvas.savecCs |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)rGrÚfontrurrrÚNOTUSED_stringWidths  zSVGCanvas.NOTUSED_stringWidthrQc sx|jjƒ‰ˆj|ƒtˆjƒƒ}ˆr6‡fdd„|Dƒ}ˆrXˆjƒ‰‡‡fdd„|Dƒ}n‡fdd„|Dƒ}dj|ƒdS)Ncsg|]}|ˆkr|‘qSrr)rarš)Úincluderrú %sz*SVGCanvas._formatStyle..cs(g|] }|ˆkr|dtˆ|ƒ‘qS)z: )r6)rarš)Úexcluder{rrr¨(scs g|]}|dtˆ|ƒ‘qS)z: )r6)rarš)r{rrr¨*sz; ú;)r{Úcopyr�r?ÚkeysÚsplitrR)rGr§r©rr¬r5r)r©r§r{rÚ _formatStyle s   zSVGCanvas._formatStylecCs|S)zKI don't think this was ever needed; seems to have been copied from renderPSr)rGrrrrÚ_escape-szSVGCanvas._escapecCs&dSd} | | |||||| f} | | S)zXCalculate the path for an arc inscribed in rectangle defined by (x1,y1),(x2,y2).Ng@zImatrix currentmatrix %s %s translate %s %s scale 0 0 1 %s %s %s setmatrixrÚarcZarcn)Úabs)rGÚx1Úy1Úx2Úy2ÚstartAngÚextentZxScaleZyScaler)r*Úcodeliner°ÚdatarrrÚ _genArcCode1szSVGCanvas._genArcCodecCsTi}|rt||d<t|jd|j|j|ƒd�}|r>|j||ƒ}|jj|ƒd|_dS)Nz fill-ruler„)rr{rQ)rŽr=r9r„r®Ú _add_linkr—r‘)rGrƒrxÚ link_infoZstylesÚfillModeZxtrar„rrrÚ_fillAndStrokeGs   zSVGCanvas._fillAndStrokecCs.ddddœ}|j|kr*||_|||jd<dS)NZbuttÚroundZsquare)rrr,zstroke-linecap)rŠr{)rGr›Úvalsrrrr”Us  zSVGCanvas.setLineCapcCs.ddddœ}|j|kr*||_|||jd<dS)NZmiterr¿Zbevel)rrr,zstroke-linecap)r‹r{)rGr›rÀrrrr•[s  zSVGCanvas.setLineJoincCs„t|ttfƒr*djtt||gƒƒ|jd<nVt|ttfƒr€t |ƒdkr€|dksTt dƒ‚djtt|ƒƒ|jd<|dkr€t|ƒ|jd<dS)z7Two notations. Pass two numbers, or an array and phase.z, zstroke-dasharrayrzphase is a length in user spacezstroke-dashoffsetN) Ú isinstanceÚfloatÚintrRÚmapr6r{Útupler?r.ÚAssertionError)rGÚarrayÚphaserrrÚsetDashaszSVGCanvas.setDashcCs„||_|dkrd|jd<nf|j|j|j}}}d|d|d|df|jd<|j}|dkrnd||jd<nd|jkr€|jd=dS)NÚnoneZstrokezrgb(%d%%,%d%%,%d%%)édrz%szstroke-opacity)r…r{ÚredÚgreenÚblueÚnormalizedAlpha)rGÚcolorr+r|ÚbÚalpharrrr“ls   zSVGCanvas.setStrokeColorcCs„||_|dkrd|jd<nf|j|j|j}}}d|d|d|df|jd<|j}|dkrnd||jd<nd|jkr€|jd=dS)NrÊÚfillzrgb(%d%%,%d%%,%d%%)rËrz%sz fill-opacity)r†r{rÌrÍrÎrÏ)rGrÐr+r|rÑrÒrrrÚ setFillColorys   zSVGCanvas.setFillColorcCs||_t||jd<dS)Nz fill-rule)r�rŽr{)rGr›rrrÚ setFillMode†szSVGCanvas.setFillModecCs||jkr||_||jd<dS)Nz stroke-width)r‡r{)rGr!rrrr–Šs zSVGCanvas.setLineWidthcCsÊ|j|ks|j|krÆ||_||_|j}xtD]}||kr,||=q,W||jkrV|j|ni}t|tƒrx|jt|j j ƒƒƒ|rªx,|j ƒD] \}}d|}|tkr†|||<q†Wd|krº||d<d||d<dS)Nzfont-z font-familyz%spxz font-size) rˆr‰r{Ú TEXT_STYLESrirÁrr�Úiterrqr5)rGr¥rur{ršrqr›rbrrrr’�s$    zSVGCanvas.setFontcCs,t|tƒst‚t|jdf|Ž}|j|ƒ|S)Nrb)rÁr�rÆr=r9r‘)rGZ dom_objectr¼Úlinkrrrr»£s zSVGCanvas._add_linkéc Ks€|jrtdƒt||ƒ} t||ƒ} i} t|jdf| | t||ƒ| t||ƒ| |jtƒdœ|—Ž} |rp|j| |ƒ} |j j | ƒdS)z)Draw a rectangle between x1,y1 and x2,y2.z+++ SVGCanvas.rectrz)r)r*r!r"r{N) rÚprintÚminr=r9Úmaxr®Ú AREA_STYLESr»r—r‘) rGr²r³r´rµÚrxÚryr¼Ú _svgAttrsr)r*rrzrrrrzªs    zSVGCanvas.rectc KsRt|jdf|||||||||jtƒdœ|—Ž} |rB|j| |ƒ} |jj| ƒdS)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 x10, and ry>0. rz)r)r*r!r"rÞrßr{N)r=r9r®rÝr»r—r‘) rGr²r³r´rµrÞrßr¼ràrzrrrÚ roundRect»s   zSVGCanvas.roundRectÚleftcKsÀ|dkr dSt|ƒ}|jr"tdƒ|dkp@|dkp@|dkp@|dk} |dkp`|dkp`|dkp`|dk} |jdkrp| s€|jdko|| �r¼|dkròt||j|jƒ} |d krª|| 8}nH|d krÀ|| d8}n2|dkrâ|t||| |j|jƒ8}nt dt |ƒƒ‚|j |ƒ}|j t ƒ} |dk�r&| d|j|||ƒ} | �r<| |j tƒ7} n| d7} | �rZ| |j tƒ7} n| d7} t|jdf||| dd|dœ|—Ž} |jj|ƒ}| j|ƒ|�r°|j| |ƒ} |jj| ƒdS)Néz+++ SVGCanvas.drawStringrr,ééréÚstartÚ inheritedrâÚendÚmiddleg@Únumericzbad value for text_anchor z rotate(%s);z fill:none;z stroke:none;rœztranslate(0,%d) scale(1,-1))r)r*r{r~)rçrèrâ)rrrÚr†r…rrˆr‰Z numericXShiftrLr6r¯r®rÖrÚEXTRA_FILL_STYLESÚEXTRA_STROKE_STYLESr=r9r�r‘r»r—)rGrr)r*Úangler¼Ú text_anchorÚtextRenderModeràZneedFillZ needStrokeZtextLenÚstrœÚcontentrrrÚ drawStringËsH          zSVGCanvas.drawStringrêc Ks2|jrtdƒ|j|||f||||dœ|—ŽdS)Nz+++ SVGCanvas.drawCentredString)rîr¼rïrð)rrÚró) rGrr)r*rîrïr¼rðràrrrÚdrawCentredStringøszSVGCanvas.drawCentredStringréc Ks2|jrtdƒ|j|||f||||dœ|—ŽdS)Nz+++ SVGCanvas.drawRightString)rîr¼rïrð)rrÚró) rGrœr)r*rîrïr¼rðràrrrÚdrawRightStringþszSVGCanvas.drawRightStringcCs|jj|ƒ}dS)zAdd a comment.N)r9Z createComment)rGr¹ÚcommentrrrröszSVGCanvas.commentTcCsjtƒ}|j|dƒttj|jƒƒƒ}|jjt|j d||||d|d|j dddd d|d|ƒd�ƒdS) NZpngÚimagezdata:image/png;base64,z matrix(%s)rrr,)r)r*r!r"Zhrefr~éÿÿÿÿ) rr$rÚbase64Ú b64encoderr—r‘r=r9rŒ)rGr÷r)r*r!r"ÚembedÚbufrrrÚ drawImage s zSVGCanvas.drawImagecCsJ|jdkrFt|jdd|j||ƒ|j||ƒf|jtƒd�}|jj|ƒdS)Nr„z M %s L %s Z)rr{)r…r=r9rŒr®Ú LINE_STYLESr—r‘)rGr²r³r´rµr„rrrÚlines  zSVGCanvas.linec Cs^t|jd||d||d||d||d|jtƒd�}|rN|j||ƒ}|jj|ƒdS)z{Draw an orthogonal ellipse inscribed within the rectangle x1,y1,x2,y2. These should have x1.Úpolygon)Úpointsr{) r.rÆr…r†rRr=r9r®rÝr»r—r‘)rGrrr¼ÚptsÚpolylinerrrris zSVGCanvas.polygoncCs4dS](}|jj|t|dƒt|dƒfƒqWdS)Nz%s m %s l strokerr)r…rƒr/r)rGZlineListrÐr!r¸rÿrrrÚlinesxs zSVGCanvas.linescCs^t|ƒdkstdƒ‚|jdkrZdjdd„|Dƒƒ}t|jd||jtdd�d�}|jj |ƒdS) Nrz#Polyline must have 1 or more pointsz, cSsg|] }t|Ž‘qSr)r)rarrrrr¨…sz&SVGCanvas.polyLine..r)rÓ)rr{) r.rÆr…rRr=r9r®rÝr—r‘)rGrrrrrrÚpolyLine�s  zSVGCanvas.polyLine)r~cCsF|jrtdƒ|j}t|jdf|Ž}|j|ƒ||_|jrBtdƒ|S)Nz+++ begin SVGCanvas.startGroupr|z+++ end SVGCanvas.startGroup)rrÚr—r=r9r‘)rGr;r—r}rrrÚ startGroup‹s zSVGCanvas.startGroupcCs&|jrtdƒ||_|jr"tdƒdS)Nz+++ begin SVGCanvas.endGroupz+++ end SVGCanvas.endGroup)rrÚr—)rGr—rrrÚendGroup”s zSVGCanvas.endGroupc Csl|jrtd||||||ƒ|jjdƒ}||||||fdkrhd|j||||||ƒ}|jjdd||fƒdS)Nz!!! begin SVGCanvas.transformr~rrz matrix(%s)z%s %s)rrrrrr)rrÚr—r8rŒr7) rGrbrÑr&rÚer¤ÚtrÚtrrrr~™s  zSVGCanvas.transformcCs:||fdkr6|jjdd|jjdƒd|j||ƒfƒdS)Nrr~z%s %sz translate(%s))rr)r—r7r8rŒ)rGr)r*rrrÚ translate s   zSVGCanvas.translatecCs>||fdkr:|jjdd|jdjdƒd|j||ƒfƒdS)Nrr~z%s %sz scale(%s))rrrø)r—r7Úgroupsr8rŒ)rGZsxZsyrrrÚscale¦s  zSVGCanvas.scalecCs|jd|j||ƒ|_dS)NzM %s )r„r)rGr)r*rrrÚmoveTo­szSVGCanvas.moveTocCs|jd|j||ƒ|_dS)NzL %s )r„r)rGr)r*rrrÚlineTo°szSVGCanvas.lineToc Cs$|jd|j||||||ƒ|_dS)NzC %s )r„r)rGr²r³r´rµrrrrrÚcurveTo³szSVGCanvas.curveTocCs|jd|_dS)NzZ )r„)rGrrrÚ closePath¶szSVGCanvas.closePathcCsdS)Nr)rGrrrÚ saveState¹szSVGCanvas.saveStatecCsdS)Nr)rGrrrÚ restoreState¼szSVGCanvas.restoreState©rfrf)r%rgrF)N)NN)rÙrÙN)rÙrÙN)rNrâr)rrêNr)rréNr)T)N)N)r)rrr)rN)NN)/rSrTrUr@r$r¦r®r¯rºrÝr¾r”r•rÉr“rÔrÕr–r’r»rzrárórôrõrörýrÿrrrrrrrr�rrr~rrrr r!r"r#r$rrrrr —sX l         -     "    r c@s eZdZdZdd„Zdd„Zdddd d d d d œZdd„Zdd„Zdd„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zd d!„Zefd"d#„Zd$d%„Zd&d'„Zd(S))r'z%This draws onto an SVG document. cCs d|_dS)Nr)r)rGrrrr@Ãsz_SVGRenderer.__init__cCsä|jrtd|ƒ|jjd|ƒ|jjjƒ}t|tƒo<|js>t |ƒ}|j j |ƒ|j |iƒ|j |ƒ|j jƒ}t|tƒo€|js‚|jjd|ƒx2|jƒD]&\}}||jkrœt|j|j||ƒqœW||j_|jràtd|ƒdS)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)rrÚÚ_canvasrör{r«rÁr Ú isClipPathrÚ_trackerÚpushÚapplyStateChangesZdrawNodeDispatcherr€r5Ú _restoresÚsetattr)rGr:r{ZdeltasZrDeltasršr›rrrÚdrawNodeÆs$       z_SVGRenderer.drawNoder…r‡rŠr‹r†rˆr‰)rvÚ strokeWidthÚ strokeLineCapÚstrokeLineJoinÚ fillColorrtrucCs8t|ddƒpd}t|ddƒpd}|r0||ddœSdSdS)NZhrefURLrQZ hrefTitleZ_top)z xlink:hrefz xlink:titleÚtarget)Úgetattr)rGÚobjÚurlrrrrrÚ_get_link_info_dictês  z _SVGRenderer._get_link_info_dictc Csš|jrtdƒ|jjƒ}|jjƒd\}}}}}}x2|jƒD]&} t| tƒrT| j ƒ} n| } |j | ƒqr?r@rArBr²r³r´rµr·r1rrrÚ drawWedge8s("   z_SVGRenderer.drawWedgecCs|jjr|jjt|jƒƒdS)N)r&r…rr3r)rGrrrrÚ drawPolyLineIsz_SVGRenderer.drawPolyLinecCsP|j|j}|j|j}|j|j}|j|j}|jj|||||j|ƒd�dS)N)r¼)rrÞrrßr&rr6)rGrr²r´r³rµrrrÚ drawEllipseMs     z_SVGRenderer.drawEllipsecCs"|jjt|jƒd|j|ƒd�dS)Nr)rr¼)r&rr3rr6)rGrrrrrEUsz_SVGRenderer.drawPolygonc s ddlm‰|j}|j|j|j|jf‰|dkr:tˆdtƒ}|j ˆƒ}tˆddƒ}‡‡‡fdd„}|dkr„|ƒ|j gˆj ||d �n‚|d kr¬|d d �|j gˆj ||d �nZ|ƒ}|sò|j }|j dƒzd}|j gˆj ||d �Wd|j |ƒXn|j gˆj ||d �dS) Nr)Ú _renderPathr½Ú autocloserQcsˆˆˆf|ŽS)Nr)r)rIÚ drawFuncsr„rrÚrPasz!_SVGRenderer.drawPath..rPro)rxr¼r½ZpdfT)Z forceClose)Úreportlab.graphics.shapesrIr&rr r!r"r3rr6r¾r'r†rÔ) rGr„r½r&r¼rJrLZisClosedZofcr)rIrKr„rrDXs.      z_SVGRenderer.drawPathcCs–|j}t|tƒr2|otjj|ƒs$dStƒj|ƒ}nt|dƒrB|}ndS|j\}}|j |j }}|dkrj|}|dkrv|}|j j ||j |j||dd�dS)NÚconvertT)rû)r„rÁr6ÚosÚisfilerr¡r r‚r!r"r&rýr)r*)rGr÷r„ZimZsrcWZsrcHZdstWZdstHrrrrývs   z_SVGRenderer.drawImagecCsN�xF|jƒD�]8\}}|dkr q |dkr6|jj|ƒq |dkrL|jj|ƒq |dkrb|jj|ƒq |dkrx|jj|ƒq |dkrâ|rÖt|ttfƒrÂt |ƒdkrÂt|dttfƒrÂ|d }|d}nd }|jj ||ƒn |jj ƒq |d krø|jj |ƒq |dk�r2|j d |jj ƒ}|j d |jjƒ}|jj||ƒq |d kr |jj|ƒq WdS)z\This takes a set of states, and outputs the operators needed to set those propertiesr~rvr.r/r0ZstrokeDashArrayr,rrr1rurtr½N)rurt)r5r&r“r–r”r•rÁr?rÅr.rÉrÔÚgetrˆr‰r’rÕ)rGÚdeltaZnewStateÚkeyÚvaluerÈZfontnameZfontsizerrrr*…s6,   z_SVGRenderer.applyStateChangesN)rSrTrUrVr@r-r+r6r9r:rór<r=rFrGrHrErrDrýr*rrrrr'¿s&  r'úout-svgcCs tjj|ƒstj|ƒddlm}g}xJt|ƒD]>}|dd…dkr0t||ƒ}|ƒ}t|ddƒ}|j||fƒq0Wd}x4|D],\}}tjj |d|ƒ} t || ƒ|d7}q|Wdd l m } | ƒ}t |tjj |d ƒƒdd l m} dd lm} | ƒ} | | j| jƒ}|j| ƒt |tjj |d ƒƒdS)Nr)Ú testshapesé Z getDrawingrVrQzrenderSVG_%d.svgr)Ú getDrawing01ztest.svg)Ú RL_CorpLogo)ÚDrawingz corplogo.svg)rOr„ÚisdirÚmkdirZreportlab.graphicsrVÚdirr3r/rRrZreportlab.graphics.testshapesrXZreportlab.lib.corprYrMrZr!r"Úadd)ZoutDirrVZdrawingsÚfuncnameÚfuncr(Z docstringr2rÚfilenamerXrYrZZrlrrrÚtest¨s0           rbÚ__main__)N)rU):rVÚmathrJrOrArùÚiorrZreportlab.pdfbase.pdfmetricsrZreportlab.lib.rl_accelrZreportlab.lib.utilsrZreportlab.graphics.renderbaserrr rMr r r Ú reportlabrrrrZreportlab.pdfgen.canvasrrÚrenderPMrZxml.domrr r r r­rÝrþrÖrírìrrrr#r3r=r?r>rŽrer r'rbrSrrrrÚsX(       ',j "