U
    '1e4;                     @   s  d Z dZddlmZ ddlT ddlmZ ddlmZ ddl	m
Z
 ddlmZmZmZmZ e
jfd	d
ZG dd deZddlmZ G dd deZde
jdi fddZde
jdi fddZdddZedkr
edd ddlZeejdkrejd ZndZeedd dS )z3.3.0zRender Drawing objects within others PDFs or standalone

Usage::
    
    import renderpdf
    renderpdf.draw(drawing, canvas, x, y)

Execute the script to see some test drawings.
changed
    )BytesIO)*)Canvas)stringWidth)	rl_config)RenderergetStateDeltarenderScaledDrawingSTATE_DEFAULTSc                 C   s"   t  }|jt| ||||d dS )z
As it saysshowBoundaryN)_PDFRendererdrawr	   )drawingZcanvasxyr   R r   @/tmp/pip-unpacked-wheel-109iniqw/reportlab/graphics/renderPDF.pyr      s    r   c                   @   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 Zdd Zdd Zdd Zdd Zdd Zd S )!r   zThis draws onto a PDF document.  It needs to be a class
    rather than a function, as some PDF-specific state tracking is
    needed outside of the state info in the SVG model.c                 C   s   d| _ d| _d S Nr   )_stroke_fillselfr   r   r   __init__%   s    z_PDFRenderer.__init__c                 C   sl   t |tr|js| j  t|}| j| | |i  | 	| | j
  t |tr^|jsh| j  dS )zEThis is the recursive method called for each node
        in the treeN)
isinstancePath
isClipPath_canvasZ	saveStater   _trackerpushapplyStateChangesZdrawNodeDispatcherpopZrestoreState)r   nodeZdeltasr   r   r   drawNode)   s    


z_PDFRenderer.drawNodec              	   C   sn   |j |j  krdkrBn n&| jj|j|j|j|j| j| j	d n(| jj
|j|j|j|j|j | j	| jd d S )Nr   strokefillr'   r&   )rxryr   rectr   r   widthheightr   r   Z	roundRect)r   r+   r   r   r   drawRect=   s$      	   z_PDFRenderer.drawRectc                 C   sB   |j }|r>t|ds"tj |j r>| j||j|j|j|j	 d S )Nmode)
pathhasattrosexistsr   ZdrawInlineImager   r   r,   r-   )r   imager0   r   r   r   	drawImageP   s      z_PDFRenderer.drawImagec                 C   s$   | j r | j|j|j|j|j d S N)r   r   linex1y1x2y2)r   r7   r   r   r   drawLineZ   s    z_PDFRenderer.drawLinec                 C   s$   | j j|j|j|j| j| jd d S Nr(   )r   circlecxcyrr   r   )r   r>   r   r   r   
drawCircle^   s      z_PDFRenderer.drawCirclec                 C   s   | j rt|jdkstd|jdd |jdd   }}| j }||d |d  tdt|dD ]}||| ||d   qh| j	| d S )N   #Polyline must have 2 or more pointsr      )
r   lenpointsAssertionErrorr   	beginPathmoveTorangelineTodrawPath)r   Zpolylineheadtailr0   ir   r   r   drawPolyLinee   s    
z_PDFRenderer.drawPolyLinec                 C   s$  |j r| |  n|j|j|j|j|jf\}}}}}| \}}}	|d krT|}|| }
| j	
 }|dksv|d kr|	dks|	d kr||| ||| || || || ||
 nJ||| || || || ||
 ||| ||	 || ||	 ||
  |  | j	j|| j| jd d S )Nr   r(   )ZannularrM   Z	asPolygoncenterxcenteryradiusstartangledegreesendangledegreesZ
_xtraRadiir   rI   rJ   ZarcToZarccloser   r   )r   ZwedgerR   rS   rT   rU   rV   ZyradiusZradius1Zyradius1Zangler0   r   r   r   	drawWedgeo   s8     
    z_PDFRenderer.drawWedgec                 C   sP   |j |j }|j |j }|j|j }|j|j }| jj||||| j| jd d S r=   )r?   r)   r@   r*   r   ellipser   r   )r   rY   r8   r:   r9   r;   r   r   r   drawEllipse   s
    z_PDFRenderer.drawEllipsec                 C   s   t |jdkstd|jdd |jdd   }}| j }||d |d  tdt |dD ]}||| ||d   qb|  | jj	|| j
| jd d S )NrC   rD   r   rE   r%   )rF   rG   rH   r   rI   rJ   rK   rL   rW   rM   r   r   )r   ZpolygonrN   rO   r0   rP   r   r   r   drawPolygon   s    
z_PDFRenderer.drawPolygonc                 C   s   t |dd}|dk}|dk}| jr&|s0| jr|r| j }|d |j|j|j|jf\}}}}	}
|dkr|d |d  }}t	|	|||
}|d	kr||8 }nF|d
kr||d 8 }n0|dkr|t
||	||||
8 }ntdt| | jj|||	|pd d d S )NtextRenderModer   )r   rC         )rE   rC      r^   Z
textAnchor)startZ	inheritedfontNamefontSizeendZmiddleg      ?numericzbad value for textAnchor )r/   )getattrr   r   r   ZgetStater   r   textencodingr   ZnumericXShift
ValueErrorstrr   
drawString)r   Z	stringObjr\   ZneedFillZ
needStrokeSZtext_anchorr   r   rf   encfontZ	font_sizeZtextLenr   r   r   rj      s"    
$
z_PDFRenderer.drawStringc                 C   s   ddl m} | j }|j|j|j|jf}t|dd}| j	}| j
}||||oR|dkd}| jj}	|jrn| jjn|	}
t|dd }|dkr|r|r|s|
||dd	 |	||d|d
 q|
||||d n2|dkr|
||||d n|sd}|
||||d d S )Nr   )_renderPath	autoclose Zpdf)Z
forceClosefillModesvgr(   )r&   r'   rq   )r'   r&   rq   )reportlab.graphics.shapesrn   r   rI   rJ   rL   ZcurveTorW   re   r   r   rM   r   clipPath)r   r0   rn   ZpdfPathZ	drawFuncsro   r'   r&   ZisClosedZdPZcPrq   r   r   r   rM      s(    
z_PDFRenderer.drawPathc                 C   s   | j | d S r6   )r   setStrokeColorr   cr   r   r   ru      s    z_PDFRenderer.setStrokeColorc                 C   s   | j | d S r6   )r   setFillColorrv   r   r   r   rx      s    z_PDFRenderer.setFillColorc              
   C   sF  t jrt| n| D ]$\}}|dkr\| j|d |d |d |d |d |d  q|dkr|d	krtd| _nd| _| | q|d
kr| j| q|dkr| j	| q|dkr| j
| q|dkr<|r0t|ttfrt|dkrt|d ttfr|d }|d }nd}| j|| n
| j  q|dkrj|d	krXd| _nd| _| | q|dkr|d| jj}|d| jj}| j|| q|dkr|d	k	r@| j| q|dkr|d	k	r@| j| q|dkr | j| q|dkr| j| q|dkr0| j| q|dkr|| j_qd	S )z`This takes a set of states, and outputs the PDF operators
        needed to set those properties	transformr   rE   rC      r]   r_   ZstrokeColorNZstrokeWidthZstrokeLineCapZstrokeLineJoinZstrokeDashArrayZ	fillColor)rb   ra   ra   rb   ZfillOpacityZstrokeOpacityZfillOverprintZstrokeOverprintZoverprintMaskrq   )r   Z	invariantsorteditemsr   ry   r   ru   ZsetLineWidthZ
setLineCapZsetLineJoinr   listtuplerF   ZsetDashr   rx   getZ	_fontnameZ	_fontsizesetFontZsetFillAlphaZsetStrokeAlphaZsetFillOverprintZsetStrokeOverprintZsetOverprintMaskZ	_fillMode)r   deltaZnewStatekeyvaluephaseZfontnameZfontsizer   r   r   r!      sb    $  
2










z_PDFRenderer.applyStateChangesN)__name__
__module____qualname____doc__r   r$   r.   r5   r<   rB   rQ   rX   rZ   r[   rj   rM   ru   rx   r!   r   r   r   r   r       s    

r   )Flowablec                   @   s    e Zd ZdZdd Zdd ZdS )GraphicsFlowablez'Flowable wrapper around a Pingo drawingc                 C   s   || _ | j j| _| j j| _d S r6   )r   r,   r-   )r   r   r   r   r   r     s    
zGraphicsFlowable.__init__c                 C   s   t | j| jdd d S r   )r   r   Zcanvr   r   r   r   r     s    zGraphicsFlowable.drawN)r   r   r   r   r   r   r   r   r   r   r     s   r   rp   rE   c              
   C   s6  t | } dD ],}d| }t| |||td|  ||< qt|f|}|rf|tjd |dd| |	| |r|
| j| jf t| |dd|d n2|tjd	 d
}	d}
|	| j }	t| |d|	|d |  |  tjdkr2t|ds2z0ddl}ddl}||dd || W n   Y nX dS )zMakes a one-page PDF with just the drawing.

    If autoSize=1, the PDF will be the same size as
    the drawing; if 0, it will place the drawing on
    an A4 page with a title above it - possibly overflowing
    if too big.)NameSizeZinitialFontrm   $   P     r   r        rE   macwriteNZCAROzPDF )r	   re   r"   r
   r   r   r   ZdefaultGraphicsFontNamerj   ZsetTitleZsetPageSizer,   r-   r   showPagesavesysplatformr1   macfs
macostoolsZFSSpecZSetCreatorTypeZtouched)dfnmsgr   autoSize
canvasKwdsr   arw   r   rP   r   r   r   r   r   
drawToFile  s4    "

r   c                 C   s"   t  }t| |||||d | S )z>Returns a PDF as a string in memory, without touching the disk)r   r   r   r   )r   r   getvalue)r   r   r   r   r   sr   r   r   drawToStringD  s    r   pdfoutFc                 C   s  ddl m}m} ddlm} dd l}|j| s:||  |j	| d}t
|}||d |ddd dd	lm} g }	t|D ]>}
|
dd
 dkrt||
}| }t|dd}|	||f q||d d}d}|	D ]\}}|d k	std| |dk r|  d}|d }||d |d|d|  ||d |d }|d|}|| || | }||j }t||d| |d }q|dkr|  |  |s|dkrtdt|  d S )Nr   )_baseGFontName_baseGFontNameBI)verbosezrenderPDF.pdfr   r   r   zGraphics Test)
testshapes
   Z
getDrawingr   rp   r   r   rE   zDrawing %d has no docstring!i,     z
Drawing %d   rC   zsaved %s)rs   r   r   Zreportlab.rl_configr   r2   r0   isdirmkdirjoinr   r   rj   Zreportlab.graphicsr   dirre   appendrH   r   Z	beginTextZ	textLinesZdrawTextZgetYr-   r   r   printascii)ZoutDirshoutr   r   r   r2   r   rw   r   Zdrawingsfuncnamefuncr   Z	docstringr   rP   ZtextObjr   r   r   testP  sT    







 r   __main__T)r   N)r   F)__version__r   ior   rs   Zreportlab.pdfgen.canvasr   Zreportlab.pdfbase.pdfmetricsr   Z	reportlabr   Zreportlab.graphics.renderbaser   r   r	   r
   Z_unset_r   r   Zreportlab.platypusr   r   r   r   r   r   r   rF   argvZoutdirr   r   r   r   <module>   s,    t
&
4

