a
    ¦¾deÆt  ã                   @   sÐ  d Z dZddlT ddlmZmZ ddlmZmZ ddl	m
Z
 ddlmZ dd	lmZmZ dd
lZdd
lZddlmZmZ ddlmZmZmZmZ d7dd„ZzeejƒZW n ey¾   d
ZY n0 dd„ Zdd„ Zej fdd„Z!ddlm"Z" G dd„ de"ƒZ#dd„ Z$dd„ Z%dd„ Z&d8dd„Z'd Z(G d!d"„ d"ƒZ)d#d$d
ej ejfd%d&„Z*d#d$d
ej ejfd'd(„Z+d#d$d
ej ejfd)d*„Z,d+d#d$d
ej ejfd,d-„Z-d+d#d$d
ej ejfd.d/„Z.e-Z/d9d2d3„Z0e1d4k�rÌe0d5d6� d
S ):z3.3.0a$  Render drawing objects in common bitmap formats

Usage::

    from reportlab.graphics import renderPM
    renderPM.drawToFile(drawing,filename,fmt='GIF',configPIL={....})

Other functions let you create a PM drawing as string or into a PM buffer.
Execute the script to see some test drawings.é    )Ú*)ÚgetStateDeltaÚrenderScaledDrawing)ÚgetFontÚ
unicode2T1)Ú	isUnicode)Ú	rl_configé   )ÚsetFontÚRenderPMErrorN)ÚBytesIOÚStringIO)ÚsinÚcosÚpiÚceilc                 C   sð   | s
t j} | dkrnzdd l}W qì tyj } z4zdd l}W n tyT   tdƒ‚Y n0 W Y d }~qìd }~0 0 n~d|  ¡ v rÞzdd l}W qì tyÚ } z<zdd l}W n" tyÄ   td| › d�ƒ‚Y n0 W Y d }~qìd }~0 0 ntd| › �ƒ‚|S )NÚ	_renderPMr   züCannot import desired renderPM backend, {backend}.
No module named _rl_renderPM
it may be badly or not installed!
You may need to install development tools
or seek advice at the users list see
https://pairlist2.pair.net/mailman/listinfo/reportlab-usersÚcairoz'cannot import desired renderPM backend z^
Seek advice at the users list see
https://pairlist2.pair.net/mailman/listinfo/reportlab-userszInvalid renderPM backend, )r   ÚrenderPMBackendZ_rl_renderPMÚImportErrorÚ	rlPyCairor   Úlower)ÚbackendÚMZerrMsg© r   úT/var/www/sistema_ama/venv/lib/python3.9/site-packages/reportlab/graphics/renderPM.pyÚ_getPMBackend   s&    
&.r   c                  C   s0   zddl m}  W n ty*   dd l} Y n0 | S )Nr   ©ÚImage)ÚPILr   r   r   r   r   r   Ú	_getImage<   s
    r    c                 C   sF   | rBdt d| j ƒ@ d> dt d| j ƒ@ d> B dt d| j ƒ@ B S | S )Néÿ   é   é   )ÚintZredZgreenZblue)Úcr   r   r   Ú	Color2HexC   s    Br&   c                 C   s"   t ƒ }|jt| ƒ||||d� dS )z
As it says©ÚshowBoundaryN)Ú_PMRendererÚdrawr   )ÚdrawingZcanvasÚxÚyr(   ÚRr   r   r   r*   I   s    r*   )ÚRendererc                   @   s‚   e Zd Z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d„Zdd„ Zdd„ Zdd„ Zdd„ ZdS )!r)   z³This draws onto a pix map image. It needs to be a class
    rather than a function, as some image-specific state tracking is
    needed outside of the state info in the SVG model.c                 C   s   | j  ¡  |  ¡  d S ©N)Ú_trackerÚpopÚ
applyState©Úselfr   r   r   r2   T   s    
z_PMRenderer.popc                 C   s    t |ƒ}| j |¡ |  ¡  d S r0   )r   r1   Úpushr3   )r5   ÚnodeÚdeltasr   r   r   r6   X   s    z_PMRenderer.pushc                 C   s  | j  ¡ }|d | j_|d | j_|d }|d ur:|| j_| j |d ¡ |d | j_|d | j_|d | j_	|d }|s€d }n:t
|ttfƒs”|f}t|ƒd	ks²t
|d
 ttfƒsºd|f}|| j_|d }|d urÚ|| j_| j |d ¡ | j |d |d ¡ d S )NÚctmÚstrokeWidthÚstrokeOpacityÚstrokeColorZstrokeLineCapZstrokeLineJoinÚfillModeZstrokeDashArrayé   r	   r   ÚfillOpacityÚ	fillColorÚfontNameÚfontSize)r1   ÚgetStateÚ_canvasr9   r:   r;   ÚsetStrokeColorÚlineCapÚlineJoinr=   Ú
isinstanceÚlistÚtupleÚlenÚ	dashArrayr?   ÚsetFillColorr
   )r5   ÚsÚalphaÚdar   r   r   r3   ]   s.    
z_PMRenderer.applyStatec                 C   sH   | j jd }| jjdd… ||f  |d< |d< | j  |¡ |  ¡  d S )Néÿÿÿÿr   é   Z	transformr9   )r1   Z	_combinedrD   Ú_baseCTMr6   r3   )r5   r,   r-   r8   r   r   r   Ú	initStatew   s    $z_PMRenderer.initStatec                 C   s    |   |¡ |  |¡ |  ¡  dS )zEThis is the recursive method called for each node
        in the treeN)r6   ZdrawNodeDispatcherr2   )r5   r7   r   r   r   ÚdrawNode}   s    

z_PMRenderer.drawNodec                 C   s`   | j }|j|j  krdkr<n n| |j|j|j|j¡ n | |j|j|j|j|j|j¡ d S )Nr   )	rD   ÚrxÚryÚrectr,   r-   ÚwidthÚheightÚ	roundRect)r5   rX   r%   r   r   r   ÚdrawRectŠ   s    z_PMRenderer.drawRectc                 C   s   | j  |j|j|j|j¡ d S r0   )rD   ÚlineÚx1Úy1Úx2Úy2)r5   r]   r   r   r   ÚdrawLine’   s    z_PMRenderer.drawLinec              
   C   sÈ   |j }t|tƒr8|r tj  |¡s$d S tƒ  |¡ d¡}nt|dƒrN| d¡}nd S |j	\}}|j
|j }}|d u rv|}|d u r‚|}| j |j|j||| jjdkr¤|nt|dƒr´|jn|jƒ ||d¡ d S )NÚRGBÚconvertr   Útobytesé   )ÚpathrH   ÚstrÚosÚisfiler    Úopenrd   ÚhasattrÚsizerY   rZ   rD   Ú	_aapixbufr,   r-   Ú_backendre   Útostring)r5   Úimagerg   ÚimZsrcWZsrcHZdstWZdstHr   r   r   Ú	drawImage•   s"    


üz_PMRenderer.drawImagec                 C   s&   | j }| |j|j|j¡ | ¡  d S r0   )rD   ÚcircleÚcxÚcyÚrÚfillstrokepath)r5   rt   r%   r   r   r   Ú
drawCircle©   s    z_PMRenderer.drawCircler   c                 C   sŠ   |j }t|ƒdksJ dƒ‚| j}| ¡  | |d |d ¡ tdt|ƒdƒD ]}| || ||d  ¡ qL|r~| ¡  | ¡  | 	¡  d S )Nr>   z#Polyline must have 1 or more pointsr   r	   )
ZpointsrK   rD   Ú	pathBeginÚmoveToÚrangeÚlineToÚ	pathCloseÚpathFillÚ
pathStroke)r5   ZpolylineÚ_doCloseÚPr%   Úir   r   r   ÚdrawPolyLine®   s    z_PMRenderer.drawPolyLinec                 C   s*   | j }| |j|j|j|j¡ | ¡  d S r0   )rD   Úellipseru   rv   rV   rW   rx   )r5   r…   r%   r   r   r   ÚdrawEllipse»   s    z_PMRenderer.drawEllipsec                 C   s   | j |dd� d S )Nr	   )r�   )r„   )r5   Zpolygonr   r   r   ÚdrawPolygonÀ   s    z_PMRenderer.drawPolygonc                 C   s   | j }|j}t|ddƒ}|d us$|rü| j ¡ }|d }|d }|d }|j}	|j}
|j}|dvrÆt|	||ƒ}|dkr~|
|8 }
nH|dkr”|
|d	 8 }
n2|d
kr¶|
t	||	||||j
ƒ8 }
ntdt|ƒ ƒ‚|j}||_z |j|
||	||fd� W ||_n||_0 d S )NÚtextRenderModer   Z
textAnchorrA   rB   )ÚstartZ	inheritedÚendÚmiddler>   Únumericzbad value for textAnchor )Ú	_fontInfo)rD   r@   Úgetattrr1   rC   Útextr,   r-   ÚstringWidthÚnumericXShiftÚencodingÚ
ValueErrorrh   rˆ   Ú
drawString)r5   Z	stringObjZcanvÚfillrˆ   ÚSÚtext_anchorrA   rB   r�   r,   r-   ÚtextLenZoldTextRenderModer   r   r   r”   Ã   s2    

z_PMRenderer.drawStringc           	         sŽ  | j ‰ˆtu rPˆjd= ˆjrDˆjd }|j}d|_|  |¡ ||_nˆ ¡  d S ddlm‰  ˆjˆj	ˆj
ˆjf‰tˆddƒ}d‡ ‡‡‡fdd	„	}ˆjr°|ƒ  ˆ ¡  ˆj ˆ¡ ˆjd u}ˆjd u}tˆd
dƒ}|dk�r<|�r
|�r
|dd� ˆ |¡ |ƒ  ˆ ¡  n0|�r&|dd� ˆ |¡ n|�rŠ|ƒ  ˆ ¡  nN|dk�rp|dd� |�r`ˆ |¡ |�rŠˆ ¡  n|ƒ �r‚ˆ |¡ ˆ ¡  d S )NrQ   r	   r   )Ú_renderPathÚ	autocloseÚ Fc                    s   ˆ  ¡  ˆ ˆˆ| d�S )N©Z
forceClose)rz   rœ   ©r™   r%   Z	drawFuncsrg   r   r   ÚrPð   s    z _PMRenderer.drawPath.<locals>.rPr=   ÚsvgTrœ   Úpdf)F)rD   ZEmptyClipPathÚ
_clipPathsZ
isClipPathÚdrawPathZclipPathClearÚreportlab.graphics.shapesr™   r{   r}   ÚcurveTor~   rŽ   ZclipPathSetÚappendr@   r<   r   r€   )	r5   rg   r‚   Zicprš   rž   r•   Ústroker=   r   r�   r   r¢   à   sV    














z_PMRenderer.drawPathN)r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r2   r6   r3   rT   rU   r\   rb   rs   ry   r„   r†   r‡   r”   r¢   r   r   r   r   r)   O   s   
r)   c                 C   s   t ƒ }| jd|j|jd�S )Nr‚   ©ZditherZpalette)r    rd   ÚNONEÚADAPTIVE)rr   r   r   r   r   Ú_convert2pilp  s    r®   c                 C   s
   |   d¡S )NÚL©rd   ©rr   r   r   r   Ú_convert2pilL  s    r²   c                 C   s
   |   d¡S )NÚ1r°   r±   r   r   r   Ú_convert2pil1  s    r´   c           	      C   sÄ   t | ƒ} | j\}}t ||t| dƒr*| jn| jƒ | j ¡ ¡}t|dƒs¶t	t
j |¡d d | ¡  dƒ�}| |¡ W d   ƒ n1 sˆ0    Y  t
jdkrÀddlm} ||dd	� n
| |¡ d S )
Nre   Úwriter   Ú.ÚwbÚmac©ÚmarkfilenameÚPICT©Úext)r®   rm   Ú
_pmBackendZpil2pictrl   re   rp   rr   Z
getpaletterk   ri   rg   Úsplitextr   rµ   ÚnameÚreportlab.lib.utilsrº   )	rr   ÚfnÚfmtÚtransparentÚcolsÚrowsrN   Úfrº   r   r   r   Ú_saveAsPICT  s    
*
$(
rÈ   g¯OQ¬á?c                   @   s  e Zd ZdBdd„ZedCdd	„ƒZdDd
d„Zdd„ ZdEdd„ZdFdd„Z	dd„ Z
dGdd„Zdd„ Zdd„ ZdHdd„Zdd„ Zd d!„ Zd"d#„ ZdId%d&„Zd'd(„ ZdJd*d+„Zd,d-„ ZdKd.d/„Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ ZeZd<d=„ Zd>d?„ Zd@dA„ Z dS )LÚPMCanvaséH   éÿÿÿ Nrc   c           	      C   s´   |d }t || d ƒ}t || d ƒ}|  ||||¡| jd< || jd< |dd|ddf| jd< g | jd< || jd< || jd	< t| jjƒttƒkr”d
nd| jd< || jd< | j| _dS )z-configPIL dict is passed to image save methodg      R@g      à?Ú_gsÚ_bgr   rS   r¡   Ú	configPILÚ_dpir   r   ro   Z_backendfmtN)	r$   Ú
_getGStateÚ__dict__ÚtyperÌ   rn   ÚpowrS   r9   )	r5   ÚwÚhÚdpiÚbgrÎ   r   Z
backendFmtZscaler   r   r   Ú__init__*  s    



"
zPMCanvas.__init__ÚRGB24c              	   C   sÂ   t |ƒ}|d u rtj}|dkrlz|j| ||d�W S  tyh   z|j| |||d�W  Y S    Y n0 Y q°0 nDd| ¡ v r°z|j| |||d�W S  ty®   |j| ||d� Y S 0 td|›�ƒ‚d S )Nr   ©r×   ©rÃ   r   z.Cannot obtain PM graphics state using backend )	r   r   r   ÚgstateÚ	TypeErrorZGStater   ÚAttributeErrorÚRuntimeError)rÔ   rÕ   r×   r   rÃ   Úmodr   r   r   rÐ   ;  s"    zPMCanvas._getGStatec           	      C   s²   |d u r| j }|| | j_| j_d d d d d d d dœ}| j}|j|j }}| ¡ D ]}t||ƒ||< qP~| `t	j
|||d� }| jd< | ¡ D ]}t| ||| ƒ qŒ| ||¡ d S )N)r9   r:   r<   rF   rG   rL   r@   rÚ   rÌ   )rÍ   Z_drawingrY   rZ   rÌ   rA   rB   ÚkeysrŽ   r¾   rÜ   rÑ   Úsetattrr
   )	r5   rÔ   rÕ   r×   ÚAÚgsZfNZfSÚkr   r   r   Ú_drawTimeResizeO  s    zPMCanvas._drawTimeResizec                 C   s.   t ƒ jd| jj| jjfd�}| | jj¡ |S )Nrc   )rm   )r    ÚnewrÌ   rY   rZ   Ú	frombytesÚpixBuf)r5   rr   r   r   r   ÚtoPIL]  s    zPMCanvas.toPILc              
   C   s‚  |   ¡ }|d u rPt|tƒs*tdt|ƒ ƒ‚tj |¡d }| d¡rP|dd … }| j	pXi }| 
dd ¡ | d¡}|r|||ƒ}| ¡ }|dv r–t|ƒ}n’|dv rÞ| d¡r²t|ƒ}n&| d¡rÆt|ƒ}n| d	¡rØt|ƒ}d
}nJ|dv �r t|||| dd ¡d�S |dv �rn|dv �rd}ntd| ƒ‚|d
k�rè| dd ¡}|�r¾ddlm}m} ddg }	td| ¡ ƒD ]\}
}d|	|
| < �ql| d| ¡ | | |	¡ d¡ ddg dg ¡¡f ¡}d| jfdfD ]\}}| ||¡||< �qÌ| 
dd¡ | d¡�rddlm} | |¡}| 
dd ¡ | d¡}|�r:||ƒ}|j||fi |¤Ž t |dƒ�s~tj!dk�r~ddl"m#} |||d � d S )!Nz*Invalid value '%s' for fn when fmt is Noner	   r¶   ÚpreConvertCB)ÚGIF)ÚTIFFZTIFFPZTIFFLZTIFZTIFF1r‚   r¯   r³   rí   )ZPCTr»   rÄ   )rÄ   )ZPNGZBMPZPPM)ZJPGÚJPEGrî   zUnknown image kind %sr   )Ú
ImageChopsr   i   )r   é   i   r!   ZRGBAÚ
resolution)zresolution unitZinchZchops_invert)rï   Ú	preSaveCBrµ   r¸   r¹   r¼   )$rê   rH   rh   r“   Úasciiri   rg   r¿   Ú
startswithrÎ   Ú
setdefaultr2   Úupperr®   Úendswithr²   r´   rÈ   Úgetr   r   rï   r   ÚzipZ
bitmap_rgbÚmergeÚsplitÚinvertZpointrd   rÏ   Úsaverl   rÀ   rÁ   rº   )r5   rÂ   rÃ   rr   rÎ   rë   Ztcrï   r   ÚTÚor%   ÚaÚdrò   rº   r   r   r   Ú
saveToFileb  sf    













:

zPMCanvas.saveToFilerì   c                 C   s   t ƒ }| j||d� | ¡ S )NrÛ   )r   r  Úgetvalue)r5   rÃ   rN   r   r   r   ÚsaveToStringš  s    zPMCanvas.saveToStringc           	      C   s’   ddl }| j}|j|j|j  }}}| | ddt|ƒd ddd||dd¡
¡ |d	 }tt|ƒd| ƒD ]}| ||| |… ¡ qh| d
¡ dS )z¬
        Niki Spahiev, <niki@vintech.bg>, asserts that this is a respectable way to get BMP without PIL
        f is a file like object to which the BMP is written
        r   Nz=2sLLLLLLhh24xZBMé6   é(   r	   é   rf   z              )	ÚstructrÌ   ré   rY   rZ   rµ   ÚpackrK   r|   )	r5   rÇ   r  rä   ZpixrY   rZ   Zrowbrÿ   r   r   r   Ú
_saveToBMPŸ  s    *zPMCanvas._saveToBMPc                 C   s   t | j||ƒ d S r0   )Ú_setFontrÌ   )r5   rA   rB   Úleadingr   r   r   r
   ­  s    zPMCanvas.setFontc                 C   s   t | j||ƒ d S r0   )râ   rÌ   )r5   rÀ   Úvaluer   r   r   Ú__setattr__°  s    zPMCanvas.__setattr__c                 C   s   t | j|ƒS r0   )rŽ   rÌ   )r5   rÀ   r   r   r   Ú__getattr__³  s    zPMCanvas.__getattr__r	   c                 C   s   |r|   ¡  |r|  ¡  d S r0   )r   r€   )r5   r¦   r•   r   r   r   rx   ¶  s    zPMCanvas.fillstrokepathc                 C   s"  t || ƒdksJ ‚tt| d ƒ}tt| d ƒ}|||  }	|||  }
tt| d ƒ}tt| d ƒ}|||  }|||  }| | }|| }t||  d }t ddt|ƒ  t|ƒ ƒ}|	||  }|
||  }| | }|| }|||  }|||  }|	|
f||f||f||fffS )a-  compute the control points for a bezier arc with theta1-theta0 <= 90.
        Points are computed for an arc with angle theta increasing in the
        counter-clockwise (CCW) direction.  returns a tuple with starting point
        and 3 control points of a cubic bezier curve for the curvto opertatoréZ   g     €f@g     €v@gUUUUUUõ?g      ð?)Úabsr   r   r   )r5   ru   rv   rV   rW   Útheta0Útheta1Zcos0Zsin0Úx0Úy0Zcos1Zsin1Úx3Úy3Zdx1Zdy1ZhalfAngrå   r^   r_   Zdx2Zdy2r`   ra   r   r   r   Ú_bezierArcSegmentCCWº  s(    

zPMCanvas._bezierArcSegmentCCWc              	   C   sä   || }t |ƒdkr ||fg}nTttt |ƒd ƒƒ}	t|ƒ|	 }
g }t|	ƒD ]&}|||
  }||
 }| ||f¡ qLg }|D ]Z\}}|s°|  ||||||¡\\}}}| |¡ q||  ||||||¡\\}}}| |¡ q|||f|fS )zÓreturn a set of control points for Bezier approximation to an arc
        with angle increasing counter clockwise. No requirement on (theta1-theta0) <= 90
        However, it must be true that theta1-theta0 > 0.g     €V@)r  r$   r   Úfloatr|   r¥   r  )r5   ru   rv   rV   rW   r  r  ZangularExtentZ	angleListZNfragZ	fragAngleÚiir   ÚbÚctrlptsr  r  ZptsZtmpxZtmpyr   r   r   ÚbezierArcCCWÝ  s$    zPMCanvas.bezierArcCCWc              	   C   s\   |   ||||||¡\\}}}	|  ||¡ |	D ]*\\}
}\}}\}}|  |
|||||¡ q,dS )zÏadds an ellisesoidal arc segment to a path, with an ellipse centered
        on cx,cy and with radii (major & minor axes) rx and ry.  The arc is
        drawn in the CCW direction.  Requires: (ang2-ang1) > 0N)r  r}   r¤   )r5   ru   rv   rV   rW   Zang1Zang2r  r  r  r^   r_   r`   ra   r  r  r   r   r   ÚaddEllipsoidalArcû  s    zPMCanvas.addEllipsoidalArcr‹   c                 C   s   | j ||||d� d S )N©r—   ©r”   )r5   r,   r-   r�   r—   r   r   r   ÚdrawCentredString  s    zPMCanvas.drawCentredStringc                 C   s   | j |||dd� d S )NrŠ   r  r   )r5   r�   r,   r-   r   r   r   ÚdrawRightString	  s    zPMCanvas.drawRightStringÚleftc                 C   s$  | j }|j}|j}|r8|||fkr8|\}	}
t||	|
ƒ n|}	|}
�zÎ|dv rœt||	|
ƒ}|dkrj||8 }n2|dkr€||d 8 }n|dkrœ|t||||	|
ƒ8 }| jdkr¸| |||¡ �nJt|	ƒ}|j	rØ| |||¡ �n*|}t
|ƒ�sxz| d¡}W n‚ t�yv } zh|jdd	… \}}t|jd d	… d
|jd	 ||d |… |||… |||d … f f Ž ‚W Y d }~n
d }~0 0 t||g|j ƒ}t|ƒ}|d }t|ƒD ]^}|| \}}||k�rÎt||j|
ƒ |}| |||¡ ||k�r¢|| | |j¡|
¡7 }�q¢W | ||¡ n| ||¡ 0 d S )N)rŠ   r‹   rŠ   rŠ   r‹   g       @rŒ   r   Úutf8r>   rR   z%s
%s-->%s<--%sé
   r	   )rÌ   rB   rA   r  r�   r‘   ro   r”   r   Z_dynamicFontr   ÚdecodeÚUnicodeDecodeErrorÚargsr   ZsubstitutionFontsrK   r|   ZencNamer
   )r5   r,   r-   r�   r�   r—   rä   Zgs_fontSizeZgs_fontNamerA   rB   r˜   ÚfontZfcÚerƒ   ÚjZFTÚnZnm1rÇ   Útr   r   r   r”     sR    


`

zPMCanvas.drawStringc                 C   s6   | j d ur2|  ¡  |  ||¡ |  ||¡ |  ¡  d S r0   )r<   rz   r{   r}   r€   )r5   r^   r_   r`   ra   r   r   r   r]   >  s
    
zPMCanvas.linec                 C   sb   |   ¡  |  ||¡ |  || |¡ |  || || ¡ |  ||| ¡ |  ¡  | j||d� d S )N)r¦   r•   )rz   r{   r}   r~   rx   )r5   r,   r-   rY   rZ   r¦   r•   r   r   r   rX   E  s    zPMCanvas.rectc           	      C   sÄ   |dkr|}|dkr|}|| }|| }|   ¡  |  || |¡ |  || || ||dd¡ |  || || ||dd¡ |  || || ||dd¡ |  || || ||dd¡ |  ¡  |  ¡  dS )zârect(self, x, y, width, height, rx,ry):
        Draw a rectangle if rx or rx and ry are specified the corners are
        rounded with ellipsoidal arcs determined by rx and ry
        (drawn in the counter-clockwise direction)r   i  ih  r  é´   N)rz   r{   r  r~   rx   )	r5   r,   r-   rY   rZ   rV   rW   r`   ra   r   r   r   r[   N  s    zPMCanvas.roundRectc                 C   s   |   ||||¡ dS )zRadd closed path circle with center cx,cy and axes r: counter-clockwise orientationN)r…   )r5   ru   rv   rw   r   r   r   rt   `  s    zPMCanvas.circlec                 C   s\  |   ¡  || }|}|}|| }|| }	||t  }
||t  }|}|  ||¡ |  |	|
||||¡ |}|}|| }|}||t  }	|| }
|}||t  }|  |	|
||||¡ |}|}|}|| }|| }	||t  }
||t  }|| }|  |	|
||||¡ |}|}|| }|}||t  }	|| }
|| }||t  }|  |	|
||||¡ |  ¡  dS )z…add closed path ellipse with center cx,cy and axes rx,ry: counter-clockwise orientation
        (remember y-axis increases downward) N)rz   ÚBEZIER_ARC_MAGICr{   r¤   r~   )r5   ru   rv   rV   rW   r  r  r  r  r^   r_   r`   ra   r   r   r   r…   d  sN    zPMCanvas.ellipsec                 C   s   dS )zdo nothing for compatibilityNr   r4   r   r   r   Ú	saveStateŸ  s    zPMCanvas.saveStatec                 C   s(   t |ƒ| _t|dd ƒ}|d ur$|| _d S ©NrO   )r&   r@   rŽ   r?   ©r5   ZaColorrO   r   r   r   rM   £  s    
zPMCanvas.setFillColorc                 C   s(   t |ƒ| _t|dd ƒ}|d ur$|| _d S r1  )r&   r<   rŽ   r;   r2  r   r   r   rE   ©  s    
zPMCanvas.setStrokeColorc                 C   s
   || _ d S r0   )rF   )r5   Úcapr   r   r   Ú
setLineCap²  s    zPMCanvas.setLineCapc                 C   s
   || _ d S r0   )rG   )r5   Újoinr   r   r   ÚsetLineJoinµ  s    zPMCanvas.setLineJoinc                 C   s
   || _ d S r0   )r:   )r5   rY   r   r   r   ÚsetLineWidth¸  s    zPMCanvas.setLineWidth)rÊ   rË   NNrc   )NrÙ   )N)N)rì   )N)r	   r	   )r‹   )Nr#  )r	   r	   )!r§   r¨   r©   rØ   ÚstaticmethodrÐ   ræ   rê   r  r  r
  r
   r  r  rx   r  r  r  r!  r"  r”   r]   rX   r[   rt   r…   r0  rM   rE   ZrestoreStater4  r6  r7  r   r   r   r   rÉ   )  s@     ÿ


8


#

2
	;rÉ   rÊ   rË   c                 C   s6   t | ƒ} t| j| j||||d�}t| |dd|d� |S )N)rÖ   r×   rÎ   r   r   r'   )r   rÉ   rY   rZ   r*   )r  rÖ   r×   rÎ   r(   r   r%   r   r   r   ÚdrawToPMCanvas»  s    r9  c                 C   s   t | |||||d� ¡ S )N©rÖ   r×   rÎ   r(   r   )r9  rê   )r  rÖ   r×   rÎ   r(   r   r   r   r   Ú	drawToPILÁ  s    r;  c                 C   s.   t ƒ }t| |||||d�}|jd|j|jd�S )Nr:  r‚   r«   )r    r;  rd   r¬   r­   )r  rÖ   r×   rÎ   r(   r   r   rr   r   r   r   Ú
drawToPILPÄ  s    r<  rì   c           	      C   s$   t | |||||d�}| ||¡ dS )zocreate a pixmap and draw drawing, d to it then save as a file
    configPIL dict is passed to image save methodr:  N)r9  r  )	r  rÂ   rÃ   rÖ   r×   rÎ   r(   r   r%   r   r   r   Ú
drawToFileÉ  s    r=  c              	   C   s$   t ƒ }t| ||||||d� | ¡ S )N)rÃ   rÖ   r×   rÎ   r   )r   r=  r  )r  rÃ   rÖ   r×   rÎ   r(   r   rN   r   r   r   ÚdrawToStringÏ  s    r>  ÚpmoutFc              
      sÎ  dd„ }dd l }ddlm} ddlm‰ |j}g }|j | ¡sH| | ¡ d}d}|g}	i }
t	j
dd … }d	d
„ |D ƒ}|s„g d¢}n.|D ]}| |¡ qˆd dd
„ |D ƒ¡ d¡}g ‰ dd l‰ddlm‰ ‡ ‡‡‡‡fdd„}|ttdƒd�D �]\}}}|
 |d¡d  }|
|< |dk�r,|d|d  7 }|�r>||v�r>qî|}t|jƒ}t|jƒ}|	 d||f ¡ |D �]D}|dv �rŽ|	 d| ¡  ¡ �z d|||ƒf }|j | |¡}|j |¡�rÈ| |¡ |dk�rôddlm} t|||d|id� n.|dv �r|jddg| |d� nt|||d � |d!v �r<|	 d"| ¡ n2|dk�rV|	 d#| ¡ n|dk�rn|	 d$| ¡ ˆ�s~ˆd%k�rŽtd&t|ƒ ƒ W n t �y®   |||ƒ Y n0 �ql|j! "d'd(¡d)k�rÒd|j#d*< d+D ]4}z|j|g| |d� W n   |||ƒ Y n0 �qÖqîˆ �r<|	d  $d,d-¡|	d< |	 d.¡ |	 %ˆ ¡ |	 |¡ |j | d/¡}t&|d0ƒ�}| '|	¡ W d   ƒ n1 �s€0    Y  t	j(d1k�r®dd2l)m*} ||d3d4� ˆ�s¾ˆd%k�rÊtd&| ƒ d S )5Nc                 S   s   | dkrd} | S )NÚtiffZtifr   )r,   r   r   r   r½   ×  s    ztest.<locals>.extr   )Ú
testshapes)Úverbosezq<html><head><title>renderPM output results</title></head>
    <body>
    <h1>renderPM results of output</h1>
    z</body>
    </html>
    r	   c                 S   s   g | ]}|  d ¡r|‘qS )z--ext=)rô   ©Ú.0r   r   r   r   Ú
<listcomp>í  ó    ztest.<locals>.<listcomp>)Úgifr@  ÚpngÚjpgÚpctÚpyrŸ   ú,c                 S   s   g | ]}|d d… ‘qS )é   Nr   rC  r   r   r   rE  ó  rF  )Úescapec                    sZ   d| |f }ˆsˆdkr t |ƒ ˆ  d| ¡ tƒ }ˆj|d� ˆ  dˆ| ¡ ƒ ¡ d S )NzProblem drawing %s fmt=%s filer>   z"<br/><h2 style="color:red">%s</h2>)Úfilez<pre>%s</pre>)Úprintr¥   r   Ú	print_excr  )rÀ   rÃ   ÚmsgÚbuf©ZerrsrN  ÚshoutÚ	tracebackrB  r   r   ÚhandleErrorø  s    ztest.<locals>.handleErrorZft_get_face)ZdoTTFz.%02dz%<hr><h2>Drawing %s</h2>
<pre>%s</pre>)rG  rH  rI  rJ  z<p>%s format</p>
z%s.%srJ  )ÚwhiterÄ   )rÃ   rÎ   )rK  rŸ   rK  rŸ   )ÚformatsÚoutDirÚfnRootrÛ   )rG  rH  rI  z<img src="%s" border="1"><br>
z#<a href="%s">python source</a><br>
z<a href="%s">SVG</a><br>
r>   zwrote %sZRL_NOEPSPREVIEWÚ0r³   Úpreview)Zepsr    z</h1>z7 <a href="#errors" style="color: red">(errors)</a></h1>z<a name="errors"/>zpm-index.htmlrÔ   r¸   r¹   ZHTMLr¼   )+ri   Zreportlab.graphicsrA  Zreportlab.rl_configrB  ÚgetAllTestDrawingsrg   ÚisdirÚmkdirÚsysÚargvÚremover5  rû   rV  Úxml.sax.saxutilsrN  rl   r¾   rõ   r$   rY   rZ   r¥   rö   rj   Zreportlab.lib.colorsrX  r=  rý   rP  ró   rÞ   Úenvironrø   rÑ   ÚreplaceÚextendrk   Ú
writelinesÚplatformrÁ   rº   )rZ  rU  r½   ri   rA  r^  ZdrawingsZhtmlTopZ
htmlBottomÚhtmlÚnamesrb  ÚEr   rW  r+   Ú	docstringrÀ   rƒ   r[  rÔ   rÕ   rå   ÚfilenameÚfullpathrX  ZhtmlFileNamerÇ   rº   r   rT  r   ÚtestÖ  s�    

	









$


*rp  Ú__main__T)rU  )N)N)r?  F)2Ú__version__rª   r£   Zreportlab.graphics.renderbaser   r   Zreportlab.pdfbase.pdfmetricsr   r   rÁ   r   Z	reportlabr   Úutilsr
   r  r   ri   ra  Úior   r   Úmathr   r   r   r   r   r   r¾   r    r&   Z_unset_r*   r/   r)   r®   r²   r´   rÈ   r/  rÉ   r9  r;  r<  r=  r>  rý   rp  r§   r   r   r   r   Ú<module>   sN   


 C
   
`
