o
    à’Oj˜w  ã                   @   s4  d Z dZddlT ddlmZ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mZ dd	lmZ dd
lmZ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& dAdd„Z'ze'ej(ƒZ)W n ey   dZ)Y nw dd„ Z*dd„ Z+dd„ Z,ej-fdd„Z.ddlm/Z/ G dd„ de/ƒZ0dd„ Z1d d!„ Z2d"d#„ Z3dAd$d%„Z4e5d&d&d'd(�Z6d)Z7G d*d+„ d+ƒZ8d,d-dej-ej(d.fd/d0„Z9d,d-dej-ej(d.fd1d2„Z:d,d-dej-ej(d.fd3d4„Z;d5d,d-dej-ej(d.fd6d7„Z<d5d,d-dej-ej(d.fd8d9„Z=e<Z>dBd<d=„Z?e@d>k�re?d?d@� dS dS )Cz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ÚstringWidth)Ú	ShapedStrÚshapeFragWord)ÚbidiShapedText)Ú	isUnicodeÚ	asUnicode)ÚABag)ÚtoColorÚwhite)Ú	rl_configé   )ÚsetFontÚRenderPMErrorN)ÚBytesIOÚStringIO)ÚsinÚcosÚpiÚceilc              
   C   s\   | st j} d|  ¡ v r'zdd l}W |S  ty& } ztd| › d�ƒ‚d }~ww td| › �ƒ‚)NÚcairor   z'cannot import desired renderPM backend zN
Seek advice at the users list see
https://groups.google.com/g/reportlab-userszInvalid renderPM backend, )r   ÚrenderPMBackendÚlowerÚ	rlPyCairoÚImportErrorr   )ÚbackendÚMÚerrMsg© r"   úa/var/www/html/pharmsmart-cdr-gen/venv/lib/python3.10/site-packages/reportlab/graphics/renderPM.pyÚ_getPMBackend   s   

ú€ÿr$   c                  C   s0   z	ddl m}  W | S  ty   dd l} Y | S w )Nr   ©ÚImage)ÚPILr&   r   r%   r"   r"   r#   Ú	_getImage0   s   þ
þr(   c                 C   sF   | r!dt d| j ƒ@ d> dt d| j ƒ@ d> B dt d| j ƒ@ B S | S )Néÿ   é   é   )ÚintÚredÚgreenÚblue©Úcr"   r"   r#   Ú	Color2Hex7   s   Br2   c                 C   s   | durt | ƒS | S )z…
    c should be None or something convertible to Color
    rlPyCairo.GState can handle Color directly in either RGB24 or ARGB32
    N)r   r0   r"   r"   r#   Ú
CairoColor<   s   r3   c                 K   s.   t ƒ }|j |¡ |jt| ƒ||||d� dS )z
As it says)ÚshowBoundaryN)Ú_PMRendererÚ__dict__ÚupdateÚdrawr   )ÚdrawingÚcanvasÚxÚyr4   ÚkwdsÚRr"   r"   r#   r8   D   s   r8   )Ú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 )!r5   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#   rB   P   s   
z_PMRenderer.popc                 C   s    t |ƒ}| j |¡ |  ¡  d S r@   )r   rA   ÚpushrC   )rE   ÚnodeÚdeltasr"   r"   r#   rF   T   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ƒsJ|f}t|ƒd	ksYt
|d
 ttfƒs]d|f}|| j_|d }|d urm|| j_| j |d ¡ | j |d |d ¡ d S )NÚctmÚstrokeWidthÚstrokeOpacityÚstrokeColorÚstrokeLineCapÚstrokeLineJoinÚfillModeÚstrokeDashArrayé   r   r   ÚfillOpacityÚ	fillColorÚfontNameÚfontSize)rA   ÚgetStateÚ_canvasrI   rJ   rK   ÚsetStrokeColorÚlineCapÚlineJoinrO   Ú
isinstanceÚlistÚtupleÚlenÚ	dashArrayrR   ÚsetFillColorr   )rE   ÚsÚalphaÚdar"   r"   r#   rC   Y   s.   
z_PMRenderer.applyStatec                 C   sH   | j jd }| jjdd… ||f  |d< |d< | j  |¡ |  ¡  d S )Néÿÿÿÿr   é   Ú	transformrI   )rA   Ú	_combinedrW   Ú_baseCTMrF   rC   )rE   r;   r<   rH   r"   r"   r#   Ú	initStates   s   $z_PMRenderer.initStatec                 C   s    |   |¡ |  |¡ |  ¡  dS )zEThis is the recursive method called for each node
        in the treeN)rF   ÚdrawNodeDispatcherrB   )rE   rG   r"   r"   r#   ÚdrawNodey   s   

z_PMRenderer.drawNodec                 C   sb   | j }|j|j  krdkrn n| |j|j|j|j¡ d S | |j|j|j|j|j|j¡ d S )Nr   )	rW   ÚrxÚryÚrectr;   r<   ÚwidthÚheightÚ	roundRect)rE   rn   r1   r"   r"   r#   ÚdrawRect†   s   $z_PMRenderer.drawRectc                 C   s   | j  |j|j|j|j¡ d S r@   )rW   ÚlineÚx1Úy1Úx2Úy2)rE   rs   r"   r"   r#   ÚdrawLineŽ   s   z_PMRenderer.drawLinec              
   C   sÈ   |j }t|tƒr|rtj  |¡sd S tƒ  |¡ d¡}nt|dƒr'| d¡}nd S |j	\}}|j
|j}}|d u r;|}|d u rA|}| j |j|j||| jjdkrR|nt|dƒrZ|jn|jƒ ||d¡ d S )NÚRGBÚconvertr   Útobytesé   )Úpathr[   ÚstrÚosÚisfiler(   Úopenrz   ÚhasattrÚsizero   rp   rW   Ú	_aapixbufr;   r<   Ú_backendr{   Útostring)rE   Úimager}   ÚimÚsrcWÚsrcHÚdstWÚdstHr"   r"   r#   Ú	drawImage‘   s"   


üz_PMRenderer.drawImagec                 C   s&   | j }| |j|j|j¡ | ¡  d S r@   )rW   ÚcircleÚcxÚcyÚrÚfillstrokepath)rE   rŽ   r1   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  ¡ q&|r?| ¡  | ¡  | 	¡  d S )NrQ   z#Polyline must have 1 or more pointsr   r   )
Úpointsr^   rW   Ú	pathBeginÚmoveToÚrangeÚlineToÚ	pathCloseÚpathFillÚ
pathStroke)rE   ÚpolylineÚ_doCloseÚPr1   Úir"   r"   r#   ÚdrawPolyLineª   s   z_PMRenderer.drawPolyLinec                 C   s*   | j }| |j|j|j|j¡ | ¡  d S r@   )rW   Úellipser�   r�   rl   rm   r’   )rE   r¡   r1   r"   r"   r#   ÚdrawEllipse·   s   z_PMRenderer.drawEllipsec                 C   s   | j |dd� d S )Nr   )r�   )r    )rE   Úpolygonr"   r"   r#   ÚdrawPolygon¼   ó   z_PMRenderer.drawPolygonc                 C   s  | j }|j}t|ddƒ}|d us|r| j ¡ }|d }|d }|d }|j}	|j}
|j}|dvrct|	||ƒ}|dkr?|
|8 }
n$|dkrJ|
|d	 8 }
n|d
kr[|
t	||	||||j
ƒ8 }
ntdt|ƒ ƒ‚|j}||_z|j|
||	||fd� W ||_d S ||_w d S )NÚtextRenderModer   Ú
textAnchorrT   rU   )ÚstartÚ	inheritedÚendÚmiddlerQ   Únumericzbad value for textAnchor )Ú	_fontInfo)rW   rS   ÚgetattrrA   rV   Útextr;   r<   r   ÚnumericXShiftÚencodingÚ
ValueErrorr~   r¦   Ú
drawString)rE   Ú	stringObjÚcanvÚfillr¦   ÚSÚtext_anchorrT   rU   r¯   r;   r<   ÚtextLenÚoldTextRenderModer"   r"   r#   r³   ¿   s4   

éz_PMRenderer.drawStringc           	         sŽ  | j ‰ˆtu r)ˆjd= ˆjr#ˆjd }|j}d|_|  |¡ ||_d S ˆ ¡  d S ddlm‰  ˆjˆj	ˆj
ˆjf‰tˆddƒ}d‡ ‡‡‡fdd	„	}ˆjrY|ƒ  ˆ ¡  ˆj ˆ¡ ˆjd u}ˆjd u}tˆd
dƒ}|dkrŸ|r„|r„|dd� ˆ |¡ |ƒ  ˆ ¡  d S |r’|dd� ˆ |¡ d S |r�|ƒ  ˆ ¡  d S d S |dkr¹|dd� |r¯ˆ |¡ |r·ˆ ¡  d S d S |ƒ rÁˆ |¡ ˆ ¡  d S )Nrd   r   r   )Ú_renderPathÚ	autocloseÚ Fc                    s   ˆ  ¡  ˆ ˆˆ| d�S )N©Ú
forceClose)r•   r¾   ©r»   r1   Ú	drawFuncsr}   r"   r#   ÚrPì   s   z _PMRenderer.drawPath.<locals>.rPrO   ÚsvgTr¾   Úpdf)F)rW   ÚEmptyClipPathÚ
_clipPathsÚ
isClipPathÚdrawPathÚclipPathClearÚreportlab.graphics.shapesr»   r–   r˜   ÚcurveTor™   r®   ÚclipPathSetÚappendrS   rL   rš   r›   )	rE   r}   rž   Úicpr¼   rÂ   r¶   ÚstrokerO   r"   rÀ   r#   rÈ   Ü   s\   

ÿ




þ

ÿ
z_PMRenderer.drawPathN)r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rB   rF   rC   ri   rk   rr   rx   r�   r“   r    r¢   r¤   r³   rÈ   r"   r"   r"   r#   r5   K   s     
r5   c                 C   s   t ƒ }| jd|j|jd�S )Nrž   ©ÚditherÚpalette)r(   rz   ÚNONEÚADAPTIVE)rˆ   r&   r"   r"   r#   Ú_convert2pilp  s   rÙ   c                 C   ó
   |   d¡S )NÚL©rz   ©rˆ   r"   r"   r#   Ú_convert2pilL  ó   
rÞ   c                 C   rÚ   )NÚ1rÜ   rÝ   r"   r"   r#   Ú_convert2pil1  rß   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 sDw   Y  t
jdkr\ddlm} ||dd	� d S d S | |¡ d S )
Nr{   Úwriter   Ú.ÚwbÚmac©ÚmarkfilenameÚPICT©Úext)rÙ   rƒ   Ú
_pmBackendÚpil2pictr‚   r{   r†   rˆ   Ú
getpaletter�   r   r}   Úsplitextr   râ   ÚnameÚreportlab.lib.utilsrç   )	rˆ   ÚfnÚfmtÚtransparentÚcolsÚrowsra   Úfrç   r"   r"   r#   Ú_saveAsPICT  s   
*
$ÿ
þr÷   ÚARGB32ÚRGB24)ÚARGBÚRGBAry   g¯OQ¬á?c                   @   s  e Zd Z		dEdd„ZedFdd	„ƒZdGd
d„Zdd„ ZdGdd„ZdHdd„Z	dd„ Z
dGdd„Zdd„ Zdd„ ZdIdd„Zdd„ Zd d!„ Zd"d#„ ZdJd&d'„ZdGd(d)„ZdKd+d,„Zd-d.„ ZdId/d0„Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ ZeZd=d>„ Zd?d@„ ZdAdB„ Z dLdCdD„Z!dS )MÚPMCanvaséH   éÿÿÿ Nry   c           	      C   s¸   |d }t || d ƒ}t || d ƒ}| j|||||d�| jd< || jd< |dd|ddf| jd< g | jd< || jd	< || jd
< d| jd< || jd< | jdkrQtnt| jd< | j| _dS )z-configPIL dict is passed to image save methodg      R@g      à?©rò   Ú_gsÚ_bgr   rh   rÆ   Ú	configPILÚ_dpir   r…   Ú_backendfmtÚ_colorConverterN)r,   Ú
_getGStater6   r…   r3   r2   rh   rI   )	rE   ÚwÚhÚdpiÚbgr  r   Ú
backendFmtÚscaler"   r"   r#   Ú__init__'  s   





zPMCanvas.__init__rù   c                 C   s|   t |ƒ}|d u rtj}d| ¡ v r7| ¡ }t ||¡}z
|j| |||d�W S  ty6   |j	| ||d� Y S w t
d|›�ƒ‚)Nr   rÿ   ©r
  z.Cannot obtain PM graphics state using backend )r$   r   r   r   ÚupperÚ_pycairoFmtsMapÚgetÚGStateÚAttributeErrorÚgstateÚRuntimeError)r  r  r
  r   rò   Úmodr"   r"   r#   r  8  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||ƒ||< q(~| `t	j
|||d� }| jd< | ¡ D ]
}t| ||| ƒ qF| ||¡ d S )N)rI   rJ   rL   rY   rZ   r_   rS   r  r   )r  Ú_drawingro   rp   r   rT   rU   Úkeysr®   rë   r  r6   Úsetattrr   )	rE   r  r  r
  ÚAÚgsÚfNÚfSÚkr"   r"   r#   Ú_drawTimeResizeF  s   zPMCanvas._drawTimeResizec                 C   sJ   t ƒ j| jdkrt| dƒdkrdnd| jj| jjfd�}| | jj¡ |S )Nr   Ú_fmtrø   rû   ry   )rƒ   )	r(   Únewr…   r®   r   ro   rp   Ú	frombytesÚpixBuf)rE   rˆ   r"   r"   r#   ÚtoPILT  s   8zPMCanvas.toPILc              
   C   s|  |   ¡ }|d u r(t|tƒstdt|ƒ ƒ‚tj |¡d }| d¡r(|dd … }| j	p,i }| 
dd ¡ | d¡}|r>||ƒ}| ¡ }|dv rKt|ƒ}nF|dv ro| d¡rYt|ƒ}n| d¡rct|ƒ}n	| d	¡rlt|ƒ}d
}n"|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|	|
| < q±| 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 d S d S )!Nz*Invalid value '%s' for fn when fmt is Noner   rã   ÚpreConvertCB©ÚGIF)ÚTIFFÚTIFFPÚTIFFLÚTIFÚTIFF1rž   rÛ   rà   r(  )ÚPCTrè   ró   )ró   )ÚPNGÚBMPÚPPM)ÚJPGÚJPEGr2  zUnknown image kind %sr   )Ú
ImageChopsr&   i   )r   é   i   r)   rû   Ú
resolution)zresolution unitÚinchÚchops_invert)r3  Ú	preSaveCBrâ   rå   ræ   ré   )$r$  r[   r~   r²   Úasciir   r}   rî   Ú
startswithr  Ú
setdefaultrB   r  rÙ   ÚendswithrÞ   rá   r÷   r  r   r'   r3  r&   ÚzipÚ
bitmap_rgbÚmergeÚsplitÚinvertÚpointrz   r  Úsaver‚   rï   rð   rç   )rE   rñ   rò   rˆ   r  r%  Útcr3  r&   ÚTÚor1   ÚaÚdr8  rç   r"   r"   r#   Ú
saveToFileY  sh   









:

þzPMCanvas.saveToFiler'  c                 C   s   t ƒ }| j||d� | ¡ S )Nrÿ   )r   rI  Úgetvalue)rE   rò   ra   r"   r"   r#   ÚsaveToString‘  s   zPMCanvas.saveToStringc           	      C   s¸   ddl }| j}| jdkr|jdkrd|_|j}d|_n|j}|j|j}}| | ddt	|ƒd ddd	||d
d¡
¡ |d }t
t	|ƒd| ƒD ]}| ||| |… ¡ qG| 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   Nr   rø   rù   z=2sLLLLLLhh24xÚBMé6   é(   r   é   r|   z              )Ústructr   r…   r   r#  ro   rp   râ   Úpackr^   r—   )	rE   rö   rP  r  Úpixro   rp   ÚrowbrF  r"   r"   r#   Ú
_saveToBMP–  s   *zPMCanvas._saveToBMPc                 C   ó   t | j||ƒ d S r@   )Ú_setFontr   )rE   rT   rU   Úleadingr"   r"   r#   r   ª  r¥   zPMCanvas.setFontc                 C   rU  r@   )r  r   )rE   rï   Úvaluer"   r"   r#   Ú__setattr__­  r¥   zPMCanvas.__setattr__c                 C   s   t | j|ƒS r@   )r®   r   )rE   rï   r"   r"   r#   Ú__getattr__°  s   zPMCanvas.__getattr__r   c                 C   s    |r|   ¡  |r|  ¡  d S d S r@   )rš   r›   )rE   rÏ   r¶   r"   r"   r#   r’   ³  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   )rE   r�   r�   rl   rm   Útheta0Útheta1Úcos0Úsin0Úx0Úy0Úcos1Úsin1Úx3Úy3Údx1Údy1ÚhalfAngr  rt   ru   Údx2Údy2rv   rw   r"   r"   r#   Ú_bezierArcSegmentCCW·  s(   

zPMCanvas._bezierArcSegmentCCWc              	   C   sä   || }t |ƒdkr||fg}n*ttt |ƒd ƒƒ}	t|ƒ|	 }
g }t|	ƒD ]}|||
  }||
 }| ||f¡ q&g }|D ]-\}}|sX|  ||||||¡\\}}}| |¡ 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Í   rl  )rE   r�   r�   rl   rm   r]  r^  ÚangularExtentÚ	angleListÚNfragÚ	fragAngleÚiirG  ÚbÚctrlptsra  rb  ÚptsÚtmpxÚ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)rx  r˜   rË   )rE   r�   r�   rl   rm   Úang1Úang2ra  rb  rt  rt   ru   rv   rw   re  rf  r"   r"   r#   ÚaddEllipsoidalArcø  s
   ÿzPMCanvas.addEllipsoidalArcr«   Fc                 C   s   | j ||||||d� d S )N)r¸   Ú	directionÚshaping©r³   )rE   r;   r<   r¯   r¸   r|  r}  r"   r"   r#   ÚdrawCentredString  s   zPMCanvas.drawCentredStringc                 C   s   | j |||d|d� d S )Nrª   )r¸   r|  r~  )rE   r¯   r;   r<   r|  r"   r"   r#   ÚdrawRightString  s   zPMCanvas.drawRightStringÚleftc                 C   s@  | j }|j}	|j}
|r||	|
fkr|\}}t|||ƒ n|
}|	}t|||||d�\}}zí|dv rXt|||ƒ}|dkr?||8 }n|dkrJ||d 8 }n|dkrX|t|||||ƒ8 }| jdkre| |||¡ n™t	|ƒ}|j
rt| |||¡ n“|}t|ƒs¼z| d¡}W n: ty» } z.|jd	d
… \}}t|jd d
… d|jd
 ||d |… |||… |||d … f f Ž ‚d }~ww t||g|j ƒ}t|ƒ}|d }t|ƒD ]>}|| \}}||kræt||j|ƒ |}| |||¡ ||krý|| | |j¡|¡7 }qÑW | |
|	¡ d S W | |
|	¡ d S W | |
|	¡ d S | |
|	¡ w )N)rT   rU   r}  )rª   r«   rª   rª   r«   g       @r¬   r   Úutf8rQ   re   z%s
%s-->%s<--%sé
   r   )r   rU   rT   rV  r
   r   r°   r…   r³   r   Ú_dynamicFontr   ÚdecodeÚUnicodeDecodeErrorÚargsr   ÚsubstitutionFontsr^   r—   ÚencNamer   )rE   r;   r<   r¯   r­   r¸   r|  r}  r  Úgs_fontSizeÚgs_fontNamerT   rU   r¹   ÚfontÚfcÚerŸ   ÚjÚFTÚnÚnm1rö   Útr"   r"   r#   r³   	  sd   

J€þ€èê÷	zPMCanvas.drawStringc                 C   s:   | j d ur|  ¡  |  ||¡ |  ||¡ |  ¡  d S d S r@   )rL   r•   r–   r˜   r›   )rE   rt   ru   rv   rw   r"   r"   r#   rs   =  s   
üzPMCanvas.linec                 C   sb   |   ¡  |  ||¡ |  || |¡ |  || || ¡ |  ||| ¡ |  ¡  | j||d� d S )N)rÏ   r¶   )r•   r–   r˜   r™   r’   )rE   r;   r<   ro   rp   rÏ   r¶   r"   r"   r#   rn   D  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)r•   r–   r{  r™   r’   )	rE   r;   r<   ro   rp   rl   rm   rv   rw   r"   r"   r#   rq   M  s   zPMCanvas.roundRectc                 C   s   |   ||||¡ dS )zRadd closed path circle with center cx,cy and axes r: counter-clockwise orientationN)r¡   )rE   r�   r�   r‘   r"   r"   r#   rŽ   _  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)r•   ÚBEZIER_ARC_MAGICr–   rË   r™   )rE   r�   r�   rl   rm   ra  rb  re  rf  rt   ru   rv   rw   r"   r"   r#   r¡   c  sN   zPMCanvas.ellipsec                 C   s   dS )zdo nothing for compatibilityNr"   rD   r"   r"   r#   Ú	saveStatež  s   zPMCanvas.saveStatec                 C   ó.   |   |¡| _t|dd ƒ}|d ur|| _d S d S ©Nrb   )r  rS   r®   rR   ©rE   ÚaColorrb   r"   r"   r#   r`   ¢  ó
   
ÿzPMCanvas.setFillColorc                 C   r—  r˜  )r  rL   r®   rK   r™  r"   r"   r#   rX   ¨  r›  zPMCanvas.setStrokeColorc                 C   ó
   || _ d S r@   )rY   )rE   Úcapr"   r"   r#   Ú
setLineCap±  rß   zPMCanvas.setLineCapc                 C   rœ  r@   )rZ   )rE   Újoinr"   r"   r#   ÚsetLineJoin´  rß   zPMCanvas.setLineJoinc                 C   rœ  r@   )rJ   )rE   ro   r"   r"   r#   ÚsetLineWidth·  rß   zPMCanvas.setLineWidthc                 C   s&   t ||p| jj|d ur|ƒS | jjƒS r@   )r   r   rT   rU   )rE   r¯   rT   rU   r"   r"   r#   r   º  s
   
ÿÿzPMCanvas.stringWidth)rý   rþ   NNry   )Nrù   r@   r&  )r   r   )r«   NF)Nr�  NF)NN)"rÐ   rÑ   rÒ   r  Ústaticmethodr  r  r$  rI  rK  rT  r   rY  rZ  r’   rl  rx  r{  r  r€  r³   rs   rn   rq   rŽ   r¡   r–  r`   rX   ÚrestoreStaterž  r   r¡  r   r"   r"   r"   r#   rü   &  sD    
ÿ


8

#


4
	;rü   rý   rþ   ry   c           	   	   K   s@   t | ƒ} t| j| j|||||d�}t| |ddfd|i|¤Ž |S )N)r	  r
  r  r   r  r   r4   )r   rü   ro   rp   r8   )	rH  r	  r
  r  r4   r   r  r=   r1   r"   r"   r#   ÚdrawToPMCanvas½  s   r¤  c              	   K   s"   t | f||||||dœ|¤Ž ¡ S )N©r	  r
  r  r4   r   r  )r¤  r$  )rH  r	  r
  r  r4   r   r  r=   r"   r"   r#   Ú	drawToPILÃ  s   "r¦  c           
   	   K   s8   t ƒ }t| f||||||dœ|¤Ž}	|	jd|j|jd�S )Nr¥  rž   rÔ   )r(   r¦  rz   r×   rØ   )
rH  r	  r
  r  r4   r   r  r=   r&   rˆ   r"   r"   r#   Ú
drawToPILPÆ  s   r§  r'  c	              	   K   s.   t | f||||||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)r¤  rI  )rH  rñ   rò   r	  r
  r  r4   r   r  r=   r1   r"   r"   r#   Ú
drawToFileË  s   r¨  c           
   	   K   s.   t ƒ }	t| |	f||||||dœ|¤Ž |	 ¡ S )N)rò   r	  r
  r  r   r  )r   r¨  rJ  )
rH  rò   r	  r
  r  r4   r   r  r=   ra   r"   r"   r#   ÚdrawToStringÑ  s    r©  ÚpmoutFc              
      s¬  dd„ }dd l }ddlm} ddlm‰ |j}g }|j | ¡s$| | ¡ d}d}|g}	i }
t	j
dd … }d	d
„ |D ƒ}|sBg d¢}n|D ]}| |¡ qDd 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›qw|}t|jƒ}t|jƒ}|	 d||f ¡ |D ]•}|dv rÁ|	 d| ¡  ¡ zwd|||ƒf }|j | |¡}|j |¡rÜ| |¡ |dkrët|||dtid� n|dv rú|jddg| |d� nt|||d� |d v �r|	 d!| ¡ n|dk�r|	 d"| ¡ n|dk�r'|	 d#| ¡ ˆ�s/ˆd$k�r7td%t|ƒ ƒ W q² t�yG   |||ƒ Y q²w |j  !d&d'¡d(k�rWd|j"d)< d*D ]}z|j|g| |d� W �qY   |||ƒ Y �qYqwˆ �r‹|	d  #d+d,¡|	d< |	 d-¡ |	 $ˆ ¡ |	 |¡ |j | d.¡}t%|d/ƒ�}| &|	¡ W d   ƒ n	1 �s­w   Y  t	j'd0k�rÄdd1l(m)} ||d2d3� ˆ�sÌˆd$k�rÔtd%| ƒ d S d S )4Nc                 S   s   | dkrd} | S )NÚtiffÚ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:  ©Ú.0rG  r"   r"   r#   Ú
<listcomp>ï  s    ztest.<locals>.<listcomp>)Úgifr«  ÚpngÚjpgÚpctÚpyrÃ   ú,c                 S   s   g | ]}|d d… ‘qS )é   Nr"   r¯  r"   r"   r#   r±  õ  s    )Úescapec                    sZ   d| |f }ˆsˆdkrt |ƒ ˆ  d| ¡ tƒ }ˆj|d� ˆ  dˆ| ¡ ƒ ¡ d S )NzProblem drawing %s fmt=%s filerQ   z"<br/><h2 style="color:red">%s</h2>)Úfilez<pre>%s</pre>)ÚprintrÍ   r   Ú	print_excrJ  )rï   rò   ÚmsgÚbuf©Úerrsr¹  ÚshoutÚ	tracebackr®  r"   r#   ÚhandleErrorú  s   ztest.<locals>.handleErrorÚft_get_face)ÚdoTTFz.%02dz%<hr><h2>Drawing %s</h2>
<pre>%s</pre>)r²  r³  r´  rµ  z<p>%s format</p>
z%s.%srµ  ró   )rò   r  )r¶  rÃ   r¶  rÃ   )ÚformatsÚoutDirÚfnRootrÿ   )r²  r³  r´  z<img src="%s" border="1"><br>
z#<a href="%s">python source</a><br>
z<a href="%s">SVG</a><br>
rQ   zwrote %sÚRL_NOEPSPREVIEWÚ0rà   Úpreview)ÚepsrÄ   z</h1>z7 <a href="#errors" style="color: red">(errors)</a></h1>z<a name="errors"/>zpm-index.htmlr  rå   ræ   ÚHTMLré   )*r   Úreportlab.graphicsr­  Úreportlab.rl_configr®  ÚgetAllTestDrawingsr}   ÚisdirÚmkdirÚsysÚargvÚremoverŸ  r@  rÂ  Úxml.sax.saxutilsr¹  r‚   rë   r;  r,   ro   rp   rÍ   r  r€   r¨  r   rC  r»  r9  r  Úenvironr  r6   ÚreplaceÚextendr�   Ú
writelinesÚplatformrð   rç   )rÇ  rÁ  rê   r   r­  rÐ  ÚdrawingsÚhtmlTopÚ
htmlBottomÚhtmlÚnamesrÔ  ÚErG  rÃ  r9   Ú	docstringrï   rŸ   rÈ  r  r  r  ÚfilenameÚfullpathÚhtmlFileNamerö   rç   r"   r¿  r#   ÚtestØ  s–   

	





 €ÿü


ÿ$ræ  Ú__main__T)rÁ  r@   )rª  F)AÚ__version__rÓ   rÊ   Úreportlab.graphics.renderbaser   r   Úreportlab.pdfbase.pdfmetricsr   r   r   Úreportlab.pdfbase.ttfontsr   r	   Úreportlab.pdfgen.textobjectr
   rð   r   r   Úreportlab.lib.abagr   Úreportlab.lib.colorsr   r   Ú	reportlabr   Úutilsr   rV  r   r   rÓ  Úior   r   Úmathr   r   r   r   r$   r   rë   r(   r2   r3   Ú_unset_r8   r?   r5   rÙ   rÞ   rá   r÷   Údictr  r•  rü   r¤  r¦  r§  r¨  r©  rC  ræ  rÐ   r"   r"   r"   r#   Ú<module>   s`   

ÿ C
   

_ÿ