o
    §…ËY²m  ã                
   @   sÌ  d Z dZddlT ddlmZmZmZ ddlmZm	Z	 ddl
mZmZmZmZ ddlmZmZmZmZ ddlmZmZ G d	d
„ d
eƒZddlZddlZzddlmZ W n eyb Z zedƒ‚dZ[ww 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'dd„ Z(d8dd „Z)d!Z*G d"d#„ d#ƒZ+d$d%dej!fd&d'„Z,d$d%dej!fd(d)„Z-d$d%dej!fd*d+„Z.d,d$d%dej!fd-d.„Z/d,d$d%dej!fd/d0„Z0e/Z1d9d3d4„Z2e3d5kräe2d6d7� dS 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.é    )Ú*)ÚStateTrackerÚgetStateDeltaÚrenderScaledDrawing)ÚgetFontÚ
unicode2T1)ÚsinÚcosÚpiÚceil)ÚgetStringIOÚ
getBytesIOÚopen_and_readÚ	isUnicode)Ú	rl_configÚasciic                   @   s   e Zd ZdS )ÚRenderPMErrorN)Ú__name__Ú
__module__Ú__qualname__© r   r   úM/var/www/html/env/lib/python3.10/site-packages/reportlab/graphics/renderPM.pyr      s    r   N)Ú	_renderPMzÆNo module named _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-usersc                  C   s0   z	ddl m}  W | S  ty   dd l} Y | S w )Nr   ©ÚImage)ÚPILr   ÚImportErrorr   r   r   r   Ú	_getImage#   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   Ú	Color2Hex*   s   Br&   c                 C   s"   t ƒ }|jt| ƒ||||d� dS )z
As it says©ÚshowBoundaryN)Ú_PMRendererÚdrawr   )ÚdrawingÚcanvasÚxÚyr(   ÚRr   r   r   r*   0   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   r3   ;   s   
z_PMRenderer.popc                 C   s    t |ƒ}| j |¡ |  ¡  d S r1   )r   r2   Úpushr4   )r6   ÚnodeÚdeltasr   r   r   r7   ?   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   ÚfillOpacityÚ	fillColorÚfontNameÚfontSize)r2   ÚgetStateÚ_canvasr:   r;   r<   ÚsetStrokeColorÚlineCapÚlineJoinr@   Ú
isinstanceÚlistÚtupleÚlenÚ	dashArrayrD   ÚsetFillColorÚsetFont)r6   ÚsÚalphaÚdar   r   r   r4   D   s.   
z_PMRenderer.applyStatec                 C   s@   | j jd }| jjdd… ||f |d< | j  |¡ |  ¡  d S )Néÿÿÿÿr   é   Ú	transform)r2   Ú	_combinedrI   Ú_baseCTMr7   r4   )r6   r-   r.   r9   r   r   r   Ú	initState^   s   z_PMRenderer.initStatec                 C   s    |   |¡ |  |¡ |  ¡  dS )zEThis is the recursive method called for each node
        in the treeN)r7   ÚdrawNodeDispatcherr3   )r6   r8   r   r   r   ÚdrawNoded   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   )	rI   ÚrxÚryÚrectr-   r.   ÚwidthÚheightÚ	roundRect)r6   ra   r%   r   r   r   ÚdrawRectq   s   $z_PMRenderer.drawRectc                 C   s   | j  |j|j|j|j¡ d S r1   )rI   ÚlineÚx1Úy1Úx2Úy2)r6   rf   r   r   r   ÚdrawLiney   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||t|dƒrR|jn|jƒ ||d¡ d S )NÚRGBÚconvertÚtobytesé   )ÚpathrM   ÚstrÚosÚisfiler   Úopenrm   ÚhasattrÚsizerb   rc   rI   Ú	_aapixbufr-   r.   rn   Útostring)r6   Úimagerp   ÚimÚsrcWÚsrcHÚdstWÚdstHr   r   r   Ú	drawImage|   s   


þz_PMRenderer.drawImagec                 C   s&   | j }| |j|j|j¡ | ¡  d S r1   )rI   ÚcircleÚcxÚcyÚrÚfillstrokepath)r6   r€   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  ¡ q&|r?| ¡  | ¡  | 	¡  d S )NrB   z#Polyline must have 1 or more pointsr   rC   )
ÚpointsrP   rI   Ú	pathBeginÚmoveToÚrangeÚlineToÚ	pathCloseÚpathFillÚ
pathStroke)r6   ÚpolylineÚ_doCloseÚPr%   Úir   r   r   ÚdrawPolyLine“   s   z_PMRenderer.drawPolyLinec                 C   s*   | j }| |j|j|j|j¡ | ¡  d S r1   )rI   Úellipser�   r‚   r_   r`   r„   )r6   r“   r%   r   r   r   ÚdrawEllipse    s   z_PMRenderer.drawEllipsec                 C   s   | j |dd� d S )NrC   )r�   )r’   )r6   Úpolygonr   r   r   ÚdrawPolygon¥   ó   z_PMRenderer.drawPolygonc                 C   sÔ   | j }|j}|d urh| j ¡ }|d }|d }|d }|j}|j}	|j}
|dvr[t|||ƒ}|dkr7|	|8 }	n$|dkrB|	|d 8 }	n|dkrS|	t||||||j	ƒ8 }	nt
d	t|ƒ ƒ‚|j|	|
|||fd
� d S d S )NÚ
textAnchorrF   rG   )ÚstartÚ	inheritedÚendÚmiddlerB   Únumericzbad value for textAnchor )Ú	_fontInfo)rI   rE   r2   rH   Útextr-   r.   ÚstringWidthÚnumericXShiftÚencodingÚ
ValueErrorrq   Ú
drawString)r6   Ú	stringObjÚcanvÚfillÚSÚtext_anchorrF   rG   rŸ   r-   r.   ÚtextLenr   r   r   r¤   ¨   s*   

î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 )NrW   rC   r   )Ú_renderPathÚ	autocloseÚ Fc                    s   ˆ  ¡  ˆ ˆˆ| d�S )N©Ú
forceClose)r‡   r®   ©r«   r%   Ú	drawFuncsrp   r   r   ÚrPÏ   s   z _PMRenderer.drawPath.<locals>.rPr@   ÚsvgTr®   Úpdf)F)rI   ÚEmptyClipPathÚ
_clipPathsÚ
isClipPathÚdrawPathÚclipPathClearÚreportlab.graphics.shapesr«   rˆ   rŠ   ÚcurveTor‹   ÚgetattrÚclipPathSetÚappendrE   r=   rŒ   r�   )	r6   rp   r�   Úicpr¬   r²   r§   Ústroker@   r   r°   r   r¸   ¿   s\   

ÿ




þ

ÿ
z_PMRenderer.drawPathN)r   )r   r   r   Ú__doc__r3   r7   r4   r\   r^   re   rk   r   r…   r’   r”   r–   r¤   r¸   r   r   r   r   r)   6   s     
r)   c                 C   s¶   z	|   ||¡ W d S  tyZ } zE|jd  d¡s‚ zt|ƒ}t ||j ¡ |j	j
t¡ W n   tttt ¡ d d… ƒƒ\}}td|||f ƒ‚|   ||¡ W Y d }~d S d }~ww )Nr   zCan't find font!rB   z9Can't setFont(%s) missing the T1 files?
Originally %s: %s)rS   r£   ÚargsÚendswithr   r   Ú
makeT1FontÚfaceÚ
findT1Filer¢   Úvectorr   rN   Úmaprq   ÚsysÚexc_infor   )ÚgsrF   rG   ÚeÚfÚs1Ús2r   r   r   Ú_setFontð   s   €÷rÐ   c                 C   s   t ƒ }| jd|j|jd�S )Nr�   ©ÚditherÚpalette)r   rm   ÚNONEÚADAPTIVE)rz   r   r   r   r   Ú_convert2pilpþ   s   rÖ   c                 C   ó
   |   d¡S )NÚL©rm   ©rz   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 )
Nrn   Úwriter   Ú.ÚwbÚmac©ÚmarkfilenameÚPICT©Úext)rÖ   rv   r   Úpil2pictru   rn   rx   rz   Ú
getpalettert   rr   rp   ÚsplitextÚlowerrß   ÚnameÚreportlab.lib.utilsrä   )	rz   ÚfnÚfmtÚtransparentÚcolsÚrowsrT   rÍ   rä   r   r   r   Ú_saveAsPICT  s   
*
$ÿ
þró   g¯OQ¬á?c                   @   sú   e Zd Zd=dd„Zd>dd„Zdd	„ Zd>d
d„Zd?dd„Zdd„ Zd>dd„Z	dd„ Z
dd„ Zd@dd„Zdd„ Zdd„ Zdd„ ZdAd!d"„Zd#d$„ Zd>d%d&„Zd'd(„ Zd@d)d*„Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ ZeZd7d8„ Zd9d:„ Zd;d<„ ZdS )BÚPMCanvaséH   éÿÿÿ Nc                 C   sˆ   |d }t || d ƒ}t || d ƒ}tj|||d�| jd< || jd< |dd|ddf| jd< g | jd< || jd	< || jd
< | j| _dS )z-configPIL dict is passed to image save methodg      R@g      à?©ÚbgÚ_gsÚ_bgr   r[   r¶   Ú	configPILÚ_dpiN)r!   r   ÚgstateÚ__dict__r[   r:   )r6   ÚwÚhÚdpirø   rû   Úscaler   r   r   Ú__init__  s   



zPMCanvas.__init__c           	      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)r:   r;   r=   rK   rL   rQ   rE   r÷   rù   )rú   Ú_drawingrb   rc   rù   rF   rG   Úkeysr¼   r   rý   rþ   ÚsetattrrS   )	r6   rÿ   r   rø   ÚArË   ÚfNÚfSÚkr   r   r   Ú_drawTimeResize%  s   zPMCanvas._drawTimeResizec                 C   s:   t ƒ jd| jj| jjfd�}t|dt|dƒƒ| jjƒ |S )Nrl   )rv   Ú	frombytesÚ
fromstring)r   Únewrù   rb   rc   r¼   ÚpixBuf)r6   rz   r   r   r   ÚtoPIL3  s   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|ƒ}n|dv ro| d¡rYt|ƒ}n| d¡rct|ƒ}n	| d	¡rlt|ƒ}d
}n[|dv rt|||| dd ¡d�S |dv r¸|dkr�zddlm} W n: tyœ   dd l}Y n.w |dkr·zddlm} W n  ty¶   dd l}Y nw n|dv r¿d}n|dv rÄ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 ¡}|�rR||ƒ}|j"||fi |¤Ž t#|d!ƒ�svtj$d"k�rxdd#l%m&} |||d$� d S d S d S )%Nz*Invalid value '%s' for fn when fmt is NonerC   rà   ÚpreConvertCB©ÚGIF)ÚTIFFÚTIFFPÚTIFFLÚTIFÚTIFF1r�   rØ   rÝ   r  )ÚPCTrå   rð   )rð   )ÚPNGÚBMPÚPPMr  r   )ÚPngImagePluginr  )ÚBmpImagePlugin)ÚJPGÚJPEGr   zUnknown image kind %s)Ú
ImageChopsr   i   )r   é   i   r   ÚRGBAÚ
resolution)zresolution unitÚinchÚchops_invert)r!  Ú	preSaveCBrß   râ   rã   ræ   )'r  rM   rq   r£   r   rr   rp   rê   Ú
startswithrû   Ú
setdefaultr3   ÚupperrÖ   rÃ   rÛ   rÞ   ró   Úgetr   r  r   r  r   r!  r   ÚzipÚ
bitmap_rgbÚmergeÚsplitÚinvertÚpointrm   rü   Úsaveru   rì   rí   rä   )r6   rî   rï   rz   rû   r  r  r  Útcr!  r   ÚTÚor%   ÚaÚdr'  rä   r   r   r   Ú
saveToFile8  s„   








ÿÿý

:

þzPMCanvas.saveToFiler  c                 C   s   t ƒ }| j||d� | ¡ S )N©rï   )r   r8  Úgetvalue)r6   rï   rT   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 ]}| ||| |… ¡ q4| 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=2sLLLLLLhh24xÚBMé6   é(   rC   é   ro   z              )	Ústructrù   r  rb   rc   rß   ÚpackrP   r‰   )	r6   rÍ   r@  rË   Úpixrb   rc   Úrowbr5  r   r   r   Ú
_saveToBMP€  s   *zPMCanvas._saveToBMPc                 C   ó   t | j||ƒ d S r1   )rÐ   rù   )r6   rF   rG   Úleadingr   r   r   rS   Ž  r—   zPMCanvas.setFontc                 C   rE  r1   )r  rù   )r6   rì   Úvaluer   r   r   Ú__setattr__‘  r—   zPMCanvas.__setattr__c                 C   s   t | j|ƒS r1   )r¼   rù   )r6   rì   r   r   r   Ú__getattr__”  s   zPMCanvas.__getattr__rC   c                 C   s    |r|   ¡  |r|  ¡  d S d S r1   )rŒ   r�   )r6   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   )r6   r�   r‚   r_   r`   Útheta0Útheta1Úcos0Úsin0Úx0Úy0Úcos1Úsin1Úx3Úy3Údx1Údy1ÚhalfAngr
  rg   rh   Údx2Údy2ri   rj   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@)rK  r!   r   Úfloatr‰   r¾   r[  )r6   r�   r‚   r_   r`   rL  rM  ÚangularExtentÚ	angleListÚNfragÚ	fragAngleÚiir6  ÚbÚctrlptsrP  rQ  Ú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)rg  rŠ   r»   )r6   r�   r‚   r_   r`   Úang1Úang2rP  rQ  rc  rg   rh   ri   rj   rT  rU  r   r   r   ÚaddEllipsoidalArcÜ  s
   ÿzPMCanvas.addEllipsoidalArcrœ   c                 C   sx   | j d ur:t|| j| jƒ}|dkr||8 }n|dkr!||d 8 }n|dkr1|t|||| j| jƒ8 }|  |||¡ d S d S )Nr›   rœ   g       @r�   )rE   r    rF   rG   r¡   r¤   )r6   r-   r.   rŸ   r©   rª   r   r   r   ÚdrawCentredStringç  s   

øzPMCanvas.drawCentredStringc                 C   s   | j |||dd� d S )Nr›   )r©   )rk  )r6   rŸ   r-   r.   r   r   r   ÚdrawRightStringò  ó   zPMCanvas.drawRightStringc                 C   sŒ  | j }|r
|\}}n|j}|j}zt|jƒ}W n   d }Y t|ƒ}	|	jr.| |||¡ d S |	}
t|ƒsvz| d¡}W n: tyu } 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‹|	|
krÄt|||ƒ d S d S )NÚutf8rB   rX   z%s
%s-->%s<--%sé
   rC   )rù   rG   rF   r   Ú_dynamicFontr¤   r   ÚdecodeÚUnicodeDecodeErrorrÂ   r   ÚsubstitutionFontsrP   r‰   rÐ   r    ÚencName)r6   r-   r.   rŸ   rž   rË   rF   rG   ÚgfontÚfontÚfcrÌ   r‘   ÚjÚFTÚnÚnm1rÍ   Útr   r   r   r¤   õ  sH   
J€þ€ÿzPMCanvas.drawStringc                 C   s:   | j d ur|  ¡  |  ||¡ |  ||¡ |  ¡  d S d S r1   )r=   r‡   rˆ   rŠ   r�   )r6   rg   rh   ri   rj   r   r   r   rf     s   
üzPMCanvas.linec                 C   sb   |   ¡  |  ||¡ |  || |¡ |  || || ¡ |  ||| ¡ |  ¡  | j||d� d S )N)rÀ   r§   )r‡   rˆ   rŠ   r‹   r„   )r6   r-   r.   rb   rc   rÀ   r§   r   r   r   ra   !  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  rJ  é´   N)r‡   rˆ   rj  r‹   r„   )	r6   r-   r.   rb   rc   r_   r`   ri   rj   r   r   r   rd   *  s   zPMCanvas.roundRectc                 C   s   |   ||||¡ dS )zRadd closed path circle with center cx,cy and axes r: counter-clockwise orientationN)r“   )r6   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‹   )r6   r�   r‚   r_   r`   rP  rQ  rT  rU  rg   rh   ri   rj   r   r   r   r“   @  sN   zPMCanvas.ellipsec                 C   s   dS )zdo nothing for compatibilityNr   r5   r   r   r   Ú	saveState{  s   zPMCanvas.saveStatec                 C   ó,   t |ƒ| _t|dd ƒ}|d ur|| _d S d S ©NrU   )r&   rE   r¼   rD   ©r6   ÚaColorrU   r   r   r   rR     ó
   

ÿzPMCanvas.setFillColorc                 C   r€  r�  )r&   r=   r¼   r<   r‚  r   r   r   rJ   …  r„  zPMCanvas.setStrokeColorc                 C   ó
   || _ d S r1   )rK   )r6   Úcapr   r   r   Ú
setLineCapŽ  rÜ   zPMCanvas.setLineCapc                 C   r…  r1   )rL   )r6   Újoinr   r   r   ÚsetLineJoin‘  rÜ   zPMCanvas.setLineJoinc                 C   r…  r1   )r;   )r6   rb   r   r   r   ÚsetLineWidth”  rÜ   zPMCanvas.setLineWidth)rõ   rö   Nr1   r  )rC   rC   )rœ   )r   r   r   r  r  r  r8  r;  rD  rS   rH  rI  r„   r[  rg  rj  rk  rl  r¤   rf   ra   rd   r€   r“   r  rR   rJ   ÚrestoreStater‡  r‰  rŠ  r   r   r   r   rô     s:    



C

#

%
	;rô   rõ   rö   c                 C   s4   t | ƒ} t| j| j|||d�}t| |dd|d� |S )N)r  rø   rû   r   r'   )r   rô   rb   rc   r*   )r7  r  rø   rû   r(   r%   r   r   r   ÚdrawToPMCanvas—  s   rŒ  c                 C   s   t | ||||d� ¡ S )N©r  rø   rû   r(   )rŒ  r  )r7  r  rø   rû   r(   r   r   r   Ú	drawToPIL�  rm  rŽ  c                 C   s,   t ƒ }t| ||||d�}|jd|j|jd�S )Nr�  r�   rÑ   )r   rŽ  rm   rÔ   rÕ   )r7  r  rø   rû   r(   r   rz   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)rŒ  r8  )r7  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:  )r7  rï   r  rø   rû   r(   rT   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| ¡  ¡ 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"| ¡ n|dk�r#|	 d#| ¡ n|dk�r/|	 d$| ¡ ˆ�s7ˆd%k�r?td&t|ƒ ƒ W q³ t �yO   |||ƒ Y q³w |j! "d'd(¡d)k�r_d|j#d*< d+D ]}z|j|g| |d� W �qa   |||ƒ Y �qaqwˆ �r“|	d  $d,d-¡|	d< |	 d.¡ |	 %ˆ ¡ |	 |¡ |j | d/¡}t&|d0ƒ�}| '|	¡ W d   ƒ n	1 �sµw   Y  t	j(d1k�rÌdd2l)m*} ||d3d4� ˆ�sÔˆd%k�rÜtd&| ƒ d S d S )5Nc                 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>
    rC   c                 S   s   g | ]	}|  d ¡r|‘qS )z--ext=)r(  ©Ú.0r6  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 filerB   z"<br/><h2 style="color:red">%s</h2>)Úfilez<pre>%s</pre>)Úprintr¾   r   Ú	print_excr:  )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�  )Úwhiterð   )rï   rû   )rž  r³   rž  r³   )ÚformatsÚoutDirÚfnRootr9  )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>
rB   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æ   )+rr   Úreportlab.graphicsr•  Úreportlab.rl_configr–  ÚgetAllTestDrawingsrp   ÚisdirÚmkdirrÉ   ÚargvÚremoverˆ  r/  rª  Úxml.sax.saxutilsr¡  ru   r   r)  r!   rb   rc   r¾   r*  rs   Úreportlab.lib.colorsr®  r�  r2  r£  r   ÚAttributeErrorÚenvironr+  rþ   ÚreplaceÚextendrt   Ú
writelinesÚplatformrí   rä   )r°  r©  rç   rr   r•  r¹  ÚdrawingsÚhtmlTopÚ
htmlBottomÚhtmlÚnamesr¼  ÚEr6  r«  r+   Ú	docstringrì   r‘   r±  rÿ   r   r
  ÚfilenameÚfullpathr®  ÚhtmlFileNamerÍ   rä   r   r§  r   Útest²  s˜   

	






 €ÿü


ÿ$rÐ  Ú__main__T)r©  r1   )r’  F)4Ú__version__rÁ   rº   Úreportlab.graphics.renderbaser   r   r   Úreportlab.pdfbase.pdfmetricsr   r   Úmathr   r	   r
   r   rí   r   r   r   r   Ú	reportlabr   r   Ú	Exceptionr   rr   rÉ   r·  r   r   ÚerrMsgr   r&   Ú_unset_r*   r0   r)   rÐ   rÖ   rÛ   rÞ   ró   r~  rô   rŒ  rŽ  r�  r�  r‘  r2  rÐ  r   r   r   r   r   Ú<module>   sT   
€ÿ ;
   
`ÿ