U
    '1e                     @   s  d Z dZddlZddlZddlmZmZmZmZm	Z	m
Z
 ddlmZ ddlmZmZmZmZmZ ddlmZ ddlmZ dd	lT dd
lmZmZ eedd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' e$eddZ(e$eddZ)e$eddZ*dZ+dZ,dej-ddddddddddej-e&deddZ.dd	l/T dd Z0dd Z1G dd dZ2G dd dZ3dd  Z4d!d" Z5d#d$ Z6d%d& Z7G d'd( d(e3e2Z8G d)d* d*e8Z9dod+d,Z:dpd-d.Z;dqd0d1Z<d2d3 Z=G d4d5 d5e9eZ>G d6d7 d7Z?G d8d9 d9e@ZAeA ZAG d:d; d;e8ZBG d<d= d=eBZCG d>d? d?eBZDeEeFd@\ZGZHZIZJdAZKdBdCdDdEgZLdrdFdGZMdde'e'dHe'dIe'e&e&dJe&dKe&iZNG dLdM dMeDZOeO ZPdsdNdOZQG dPdQ dQeOZRg dddfdRdSZSG dTdU dUeDZTG dVdW dWeDZUG dXdY dYeDZVG dZd[ d[eDZWG d\d] d]eDZXG d^d_ d_eDZYG d`da daeBZZG dbdc dceOZ[defdddeZ\G dfdg dge8Z]G dhdi die2Z^G djdk dke8Z_dldm Z`eadnkre`  dS )tz3.5.60z9Core of the graphics library - defines Drawing and Shapes    N)picossinsqrtradiansfloor)Flowable)shapeCheckingverbosedefaultGraphicsFontName_unset_decimalSymbol)logger)colors)*)isSeqasBytes   )fp_str)stringWidth)tt2ps)FILL_EVEN_ODDFILL_NON_ZEROzNon-Zero WindingzEven-Oddr   r   r   r   r   r   
   Fstart)	transformstrokeColorstrokeWidthstrokeLineCapstrokeLineJoinstrokeMiterLimitstrokeDashArraystrokeOpacityfillOpacityfillOverprintstrokeOverprintoverprintMask	fillColorfillModefontSizefontName
textAnchorc                 C   s   d}| D ]}t |t|||}qt| | }|}	|d dkrL| }
|	| }	n$|d dkr^d}
n| d }
|	|
 }	|d dkr| }|dkrd}n|dkr| }n
| d }nd|d d	krd}|dkr|}n|dkrd}n|d }n.| d }|dkr| }n|dkr|}nd}||
||||	fS )
Nr   sng       @eendr   w)maxr   len)textfontr*   leadingr,   Z	boxAnchorr2   thZytZybxbZxt r;   =/tmp/pip-unpacked-wheel-109iniqw/reportlab/graphics/shapes.py_textBoxLimitsC   sB    

    

 
 r=   c                 C   sp   t t|| |f| | |f| | || f| || ff}dd |D }dd |D }t|t|t|t||fS )z
    Find the corner points of the rotated w x h sized box at x,y
    return the corner points and the min max points in the original space
    c                 S   s   g | ]}|d  qS r   r;   .0xr;   r;   r<   
<listcomp>k   s     z%_rotatedBoxLimits.<locals>.<listcomp>c                 S   s   g | ]}|d  qS r   r;   r?   r;   r;   r<   rB   l   s     )ZzTransformPointsrotateminr3   )rA   yr2   r9   angleCXYr;   r;   r<   _rotatedBoxLimitse   s    6rK   c                   @   s   e Zd ZdZdd ZdS )_DrawTimeResizeablez:Addin class to provide the horribleness of _drawTimeResizec                 C   s>   t | dr:| j}|j}|| |_|_t |dr:||| d S )N_canvas_drawTimeResize)hasattrrM   Z_drawingwidthheightrN   )selfr2   r9   canvasdrawingr;   r;   r<   rN   q   s    

z#_DrawTimeResizeable._drawTimeResizeN)__name__
__module____qualname____doc__rN   r;   r;   r;   r<   rL   o   s   rL   c                   @   s   e Zd Zi fddZdS )_SetKeyWordArgsc                 C   s"   |  D ]\}}t| || qdS )z9In general properties may be supplied to the constructor.N)itemssetattr)rR   keywordskeyvaluer;   r;   r<   __init__z   s    z_SetKeyWordArgs.__init__N)rU   rV   rW   r_   r;   r;   r;   r<   rY   y   s   rY   c           
      C   s|   dd | D }|sd S |d \}}}}|dd  D ]<\}}}}	||k rJ|}||krV|}||k rb|}|	|kr2|	}q2||||fS )Nc                 S   s   g | ]}|d k	r|qS Nr;   r?   r;   r;   r<   rB      s      z"getRectsBounds.<locals>.<listcomp>r   r   r;   )
ZrectListLZxMinZyMinZxMaxZyMaxx1y1x2y2r;   r;   r<   getRectsBounds   s     rf   c                 C   s  |d||   |  }d|d|  |   }||  }| g}|| d| |  }|dkrt |}|dk rj| }d||  }	g }
z|
|	|  W n   Y nX z|
||	  W n   Y nX |d9 }|d9 }|
D ]>}d|  krdkrn q||||| |  |  |   q|| |S )ag  
    this is used to find if a curveTo path operator has extrema in its range
    The curveTo operator is defined by the points y0, y1, y2, y3

        B(t):=(1-t)^3*y0+3*(1-t)^2*t*y1+3*(1-t)*t^2*y2+t^3*y3
            :=t^3*(y3-3*y2+3*y1-y0)+t^2*(3*y2-6*y1+3*y0)+t*(3*y1-3*y0)+y0
    and is a cubic bezier curve.

    The differential is a quadratic
        t^2*(3*y3-9*y2+9*y1-3*y0)+t*(6*y2-12*y1+6*y0)+3*y1-3*y0

    The extrema must be at real roots, r, of the above which lie in 0<=r<=1

    The quadratic coefficients are
        a=3*y3-9*y2+9*y1-3*y0 b=6*y2-12*y1+6*y0 c=3*y1-3*y0
    or
        a=y3-3*y2+3*y1-y0 b=2*y2-4*y1+2*y0 c=y1-y0  (remove common factor of 3)
    or
        a=y3-3*(y2-y1)-y0 b=2*(y2-2*y1+y0) c=y1-y0

    The returned value is [y0,x1,x2,y3] where if found x1, x2 are any extremals that were found;
    there can be 0, 1 or 2 extremals
             r   g      g      ?r   )r   append)Zy0rc   re   y3abcrJ   dqRr8   r;   r;   r<   _getBezierExtrema   s4    
 $
rr   c                 C   s\   t | }| fdd}tt|td|d}tt|td|d}t|t|t|t|fS )Nc                 S   s   ||  S r`   r;   )ipr;   r;   r<   <lambda>       zgetPathBounds.<locals>.<lambda>r   rh   r   )r4   listmaprangerE   r3   )pointsr.   fxsysr;   r;   r<   getPathBounds   s
    r~   c                 C   sT   | d }t |rHdd | D }dd | D }t|t|t|t|fS t| S dS )z"Helper function for list of pointsr   c                 S   s   g | ]}|d  qS r>   r;   r@   Zxyr;   r;   r<   rB      s     z#getPointsBounds.<locals>.<listcomp>c                 S   s   g | ]}|d  qS rC   r;   r   r;   r;   r<   rB      s     N)r   rE   r3   r~   )Z	pointListfirstr|   r}   r;   r;   r<   getPointsBounds   s    r   c                   @   sV   e Zd ZdZe Zdd ZdddZdd Zdd
dZ	dd Z
erJdd Zdd ZdS )Shapea1  Base class for all nodes in the tree. Nodes are simply
    packets of data to be created, stored, and ultimately
    rendered - they don't do anything active.  They provide
    convenience methods for verification but do not
    check attribiute assignments or use any clever setattr
    tricks this time.c                 C   s   t d| jj dS )zReturn a clone of this shape.z!No copy method implemented for %sN)NotImplementedError	__class__rU   rR   r;   r;   r<   copy   s    z
Shape.copyr   c                 C   s4   i }| j  D ] \}}|dd dkr|||< q|S )zDInterface to make it easy to extract automatic
        documentationr   r   _)__dict__rZ   )rR   Zrecurpropsr]   r^   r;   r;   r<   getProperties   s
    
zShape.getPropertiesc                 C   s   | j | dS )zfSupports the bulk setting if properties from,
        for example, a GUI application or a config file.N)r   update)rR   r   r;   r;   r<   setProperties   s    zShape.setProperties c                 C   sH   t |   }|  |r$|d }|D ]\}}td|||f  q(dS )zConvenience. Lists them on standard output.  You
        may provide a prefix - mostly helps to generate code
        samples for documentation..z	%s%s = %sN)rw   r   rZ   sortprint)rR   prefixZpropListnamer^   r;   r;   r<   dumpProperties  s    zShape.dumpPropertiesc                 C   s   | j dk	r| j D ]*}|d dkr|| j kstd|| f q| j  D ]L\}}t| |sltd|| f t| |}||sJtd||| jj	f qJdS )a.  If the programmer has provided the optional
        _attrMap attribute, this checks all expected
        attributes are present; no unwanted attributes
        are present; and (if a checking function is found)
        checks each attribute.  Either succeeds or raises
        an informative exception.Nr   r   z#Unexpected attribute %s found in %szMissing attribute %s from %sz-Invalid value %s for attribute %s in class %s)
_attrMapr   keysAssertionErrorrZ   rO   getattrvalidater   rU   )rR   r]   attrZ	metavaluer^   r;   r;   r<   verify  s    

zShape.verifyc                 C   s   t | || dS )zSBy default we verify.  This could be off
            in some parallel base classes.N)ZvalidateSetattr)rR   r   r^   r;   r;   r<   __setattr__%  s    zShape.__setattr__c                 C   s   t ddS )5Returns bounding rectangle of object as (x1,y1,x2,y2)z+Shapes and widgets must implement getBoundsNr   r   r;   r;   r<   	getBounds*  s    zShape.getBoundsN)r   )r   )rU   rV   rW   rX   AttrMapr   r   r   r   r   r   r	   r   r   r;   r;   r;   r<   r      s   

r   c                
   @   s   e Zd ZdZeeedddeeddeeddeedddeed	ddd
Z	dd Z
dd Zd3ddZdd Zd4ddZdd Zdd Zdd Zd5d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/d0 Zd1d2 ZdS )6Groupa  Groups elements together.  May apply a transform
    to its contents.  Has a publicly accessible property
    'contents' which may be used to iterate over contents.
    In addition, child nodes may be given a name in which
    case they are subsequently accessible as properties.z"Coordinate transformation to applyr   descZadvancedUsagezContained drawable elementsr   Turn on stroke overprintingTurn on fill overprintingoverprinting for ordinary CMYK)r   contentsr&   r%   r'   c                 O   s<   | j  | _ g | _d| _|D ]}| | qt| | dS )zInitial lists of elements may be provided to allow
        compact definitions in literal Python code.  May or
        may not be useful.r   N)r   cloner   r   addrY   r_   )rR   elementsr\   eltr;   r;   r<   r_   =  s    zGroup.__init__c                 C   s4   |r0|t | j kr$tt| j|< t| || dS )zLif name is not None add an attribute pointing to node and add to the attrMapN)rw   r   r   AttrMapValueisValidChildr[   )rR   r   noder;   r;   r<   _addNamedNodeM  s    zGroup._addNamedNodeNc                 C   s4   |dk	r0t |std| j| | || dS )zAppends non-None child node to the 'contents' attribute. In addition,
        if a name is provided, it is subsequently accessible by name
        Nz1Can only add Shape or UserNode objects to a Group)r   r   r   rj   r   )rR   r   r   r;   r;   r<   r   T  s    z	Group.addc                 C   s   |  | | jd S )Nr/   )r   r   )rR   r   r;   r;   r<   _nn^  s    
z	Group._nnc                 C   sP   |dk	rLt |std|dk r2|g| j||< n| j|| | || dS )z4Inserts sub-node n in contents at specified locationNz4Can only insert Shape or UserNode objects in a Groupr   )r   r   r   insertr   )rR   rs   r.   r   r;   r;   r<   r   b  s    zGroup.insertc                 C   s   t | trt| j| jpt }| j |_t|drD| jdd |_| j	}|j	j
}|D ]<}t |trn| }nt |tr| }n| }|| qV| | |S )z9Return a new object which only contains primitive shapes.r   N)
isinstanceDrawingrP   rQ   r   r   r   rO   r   r   rj   UserNodeprovideNodeexpandUserNodesr   _copyNamedContents)rR   objself_contentsrl   childZnewChildr;   r;   r<   r   l  s    
 





zGroup.expandUserNodesc                 C   s   t  }t| dr| j|_t|dr2| jdd |_|  dd }|r|d}t|trj||	  qBt|t r|
 }|jdkr|j|j q|| qB|| qB|S )z return a fully expanded object	__label__r   Nr   r   )r   rO   r   r   getContentspopr   r   rj   r   _exploder   extendr   )rR   r   Pr.   r;   r;   r<   r     s"    

 



zGroup._explodec                 C   s   | j D ]}|j | qd S r`   )r   rj   )rR   r   r   r;   r;   r<   _copyContents  s    
zGroup._copyContentsr   c           	      C   s   ddl m } | j}|s$t| j }| j D ]N\}}||kr\||}t|||j|  q.||kr.||kr.t|||| q.d S )Nr   )r   )	r   r   rw   r   r   r   rZ   indexr[   )	rR   r   ZaKeysZnoCopyr   r   kvposr;   r;   r<   r     s     
zGroup._copyNamedContentsc                 C   s$   | j  |_ | | | | |S )zcopies to obj)r   r   r   r   rR   r   r;   r;   r<   _copy  s    

zGroup._copyc                 C   s   |  |  S )zreturns a copy)r   r   r   r;   r;   r<   r     s    z
Group.copyc                 C   s   t | jt|| _dS z&Convenience to help you set transformsN)mmultr   rD   )rR   thetar;   r;   r<   rD     s    zGroup.rotatec                 C   s   t | jt||| _dS r   )r   r   	translate)rR   dxdyr;   r;   r<   r     s    zGroup.translatec                 C   s   t | jt||| _dS r   )r   r   scale)rR   ZsxZsyr;   r;   r<   r     s    zGroup.scalec                 C   s    t t | jt|t|| _dS r   )r   r   ZskewXZskewY)rR   Zkxkyr;   r;   r<   skew  s    z
Group.skewc                 C   s   | j dd ||f | _ dS )z2Convenience function to set the origin arbitrarilyN)r   rR   rA   rF   r;   r;   r<   shift  s    zGroup.shiftc                 C   s$   t | _| j| j || _|| _dS )z| Convenience function to make a drawing from a group
            After calling this the instance will be a drawing!
        N)r   r   r   r   _xtraAttrMaprP   rQ   )rR   rP   rQ   r;   r;   r<   	asDrawing  s    zGroup.asDrawingc                 C   s,   t | dd}| j}|r(||kr(|g| }|S )z[Return the list of things to be rendered
        override to get more complicated behaviour
backgroundN)r   r   )rR   rm   rH   r;   r;   r<   r     s
     
zGroup.getContentsc                 C   s   | j rg }| j D ]}||  qt|}|d kr8d S |\}}}}| j}||g||g||g||gg}g }	|D ]}
|	t||
 qnt|	S d S d S r`   )r   rj   r   rf   r   ZtransformPointr   )rR   rm   elemrb   rc   rd   re   ZtransZcornersZ
newCornersZcornerr;   r;   r<   r     s    
 zGroup.getBounds)N)N)Nr   )rU   rV   rW   rX   r   r   ZisTransformZisListOfShapes	isBooleanr   r_   r   r   r   r   r   r   r   r   r   r   rD   r   r   r   r   r   r   r   r;   r;   r;   r<   r   .  s6   






	r   c                 C   sX   ddl m} | j}||j}|p$|j}||kr:|g||< n||| krT|| | dS )z7add an import of obj's class to a dictionary of importsr   )	getmoduleN)inspectr   r   rU   rj   )r   Ir.   r   rn   mr;   r;   r<   _addObjImport  s    

r   c                 C   s  t | trt| S t| r|d}| D ]}|dt||  }q"t | trTd|dd  S d|dd t| dkrpdprdf S nF| tkr|rt| |d	 d	S t | t	r|rt| | d
dl
m} || j\}}}}}	}
}|r |t| d }|t| d= ng }|  }| jjd }|dd D ]$}||d}|dt|| 7 }q$|D ](}||d}|d|t||f 7 }qN| D ](\}}|| }|d|t||f 7 }q|dd d S t| S dS )zEreturn a repr style string with named fixed args first, then keywordsr   z%s,z[%s]Nr/   z(%s%s)r   ,EmptyClipPathr   )getfullargspec(z%s=%s,))r   floatr   r   _reprrw   r4   r   r   r   r   r   r_   r   r   rU   r   rZ   repr)rR   r   r-   r   r   argsvarargsvarkwdefaults
kwonlyargskwonlydefaultsannotationsZkargsr   r.   r;   r;   r<   r     sF    

(  
r   		c           
      C   s   d}t | dd }|r*|d||t|f  }| j}|D ]}t|trd| }|d7 }t |dd}	|	rjd|	 }	|d||||	f  }|t||||| }|d8 }q4|d	||t||f  }q4|S )
Nr   r   z%s%s.transform = %s
zv%dr   r   #z%s%s=%s._nn(Group())%s
z%s%s.add(%s)
)r   r   r   r   r   _renderGroupPy)
Gpfxr   rs   indentr-   rH   r.   Znpfxlr;   r;   r<   r     s"     
 
r   c                 K   sH   | | j i }t|}| D ]"}||r || |||d  < q |S r`   )r   r   r4   r   
startswith)rR   r   kwrq   r.   r   r;   r;   r<   _extraKW/  s    
r   c                   @   sB  e Zd ZdZdddddddd	d
ddddddddhZedddddh Zeeeddeeddedee	ddee
ddddddee
ddddddeed deed!deed"dd#	Zeeeee
e d$d%d&d'dd(Zee dAd+d,Zd-d. Zefd/d0Zd1d2 Zd3d4 Zd5d6 Zd7d8 ZdBd:d;ZdCd<d=ZdDd?d@ZdS )Er   zOutermost container; the thing a renderer works on.
    This has no properties except a height, width and list
    of contents.ZbmpepsZgifZjpegZjpgZpctpdfZpictZpngpspysvgZtifZtiffZtiff1ZtifflZtiffpzDrawing width in points.r   zDrawing height in points.Nz=Background widget for the drawing e.g. Rect(0,0,width,height)LEFTRIGHTZCENTERZCENTREz+Horizontal alignment within parent documentZTOPBOTTOMz)Vertical alignment within parent documentzGlobal scaling for renderingz.override the STATE_DEFAULTS value for fontNamez.override the STATE_DEFAULTS value for fontSize)	rP   rQ   canvr   hAlignvAlignrenderScaleZinitialFontNameZinitialFontSizer   r   )loZemptyOKzOne or more plot modes)BASEformats     c                 O   s:   d | _ tj| f|| || _|| _d| _d| _d| _d S )Nr   r         ?)r   r   r_   rP   rQ   r  r  r  )rR   rP   rQ   Znodesr\   r;   r;   r<   r_   h  s    zDrawing.__init__c                 C   s   dddgdddgd}t |  d|}d	| jj }d
}| D ],\}}|d|t|dd ddf  }q>|d|  }|d| j| jf  }|d }|| }|d|  }|S )N_DrawingEditorMixinr   r   ZColorZ	CMYKColorZ
PCMYKColor)zreportlab.graphics.shapeszreportlab.lib.colorsrR   ZExplodedDrawing_z0#Autogenerated by ReportLab guiedit do not edit
zfrom %s import %s
r   r/   'r   z(
class %s(_DrawingEditorMixin,Drawing):
z3	def __init__(self,width=%s,height=%s,*args,**kw):
z1		Drawing.__init__(self,width,height,*args,**kw)
zZ

if __name__=="__main__": #NORUNTESTS
	%s().save(formats=['pdf'],outDir='.',fnRoot=None)
)	r   r   r   rU   rZ   strreplacerP   rQ   )rR   r   r   r.   r-   r   or;   r;   r<   	_renderPyq  s    &zDrawing._renderPyc              	   C   s:   ddl m} |j| | jdd|tk	r&|n
t| dtd dS )zThis is used by the Platypus framework to let the document
        draw itself in a story.  It is specific to PDF and should not
        be used directly.r   	renderPDFZ_showBoundaryshowBoundaryN)reportlab.graphicsr  drawr   r   r   )rR   r  r  r;   r;   r<   r    s    zDrawing.drawc                 C   s2   | j }| j}| j}|dkr*||9 }||9 }||fS )Nr	  )rP   rQ   r  )rR   Z
availWidthZavailHeightrP   rQ   r  r;   r;   r<   wrap  s    zDrawing.wrapc                 C   s   t | }| j|_| j|_|S )z:Return a new drawing which only contains primitive shapes.)r   r   rP   rQ   r   r;   r;   r<   r     s    
zDrawing.expandUserNodesc                 C   s   |  | | j| jS )zReturns a copy)r   r   rP   rQ   r   r;   r;   r<   r     s    zDrawing.copyc                 O   s   |  t||S r`   )r   r   )rR   r   r   r;   r;   r<   asGroup  s    zDrawing.asGroupr   c                 K   s  | dd}t|tr d| }nd}|d7 }ddlm} d}	|st| d| jjd }t| d	d}
t|
d
rr|
| }
t|d
r||
}nDz||
 }W n6 t	k
r } zt
|ddk r W 5 d}~X Y nX |dkrt| dd}t|d
r|| }tj|rtj|\}}n|p t| dd}| tj}|s<d}tj|sntjt| dtjtjd |}tj|st| tjtj||}tj|}|d dd  | jkr|d }dd |pt| ddgD }|dk	r|fpt| d|fd }tjjtjjf}| tj_tj_d|krddl m!} |d }|rbt"|d|f  |j#| ||fdt| d|j$it%| df| |	d }	tj&dkrddl'}ddl(}|)|*dd |+| | j,D ]}||krdd l m-} d!||f }|rt"|||f  t| d"d}|rXt|d|g}||krTt|d#dsT|.  nd}|j#| |f|t| d|j$d$t%| d%f| |	d& | }	|r|/| qd'|krrzdd(l0m1} W n" t2k
r   dd)l m3} Y nX |d* }|rt"|d+|f  |j#| |f|t| d,d-gd t| d,dd.gd t| d/|j4t| d|j$t| d0|j5d1t%| d2f| |	d3 }	d4|krdd5l m6} |d6 }|rt"|d7|f  |j#| |fdt| d|j$it%| d8f| |	d9 }	d:|krBdd)l m3} |d; }|rt"|d+|f  |j#| |fdt| d|j$it%| d2f| |	d< }	d=|kr|d> }|rjt"|d=|f  t7|d?"}|8t9| : ;d@tj< W 5 Q R X |	dA }	|\tj_tj_t| dBr| =||	 |	r||	dd  pdS )CzSaves copies of self in desired location and formats.
        Multiple formats can be supported in one call

        the extra keywords can be of the form
        _renderPM_dpi=96 (which passes dpi=96 to renderPM)
        Z	seqNumberr   z%4d: zgenerating %s file %sr   	rl_configZfileNamePatternz%03dchartId__call__znot all arguments convertedNoutDirr   Z_override_CWDr   c                 S   s   g | ]}|  qS r;   )lowerr?   r;   r;   r<   rB     s     z Drawing.save.<locals>.<listcomp>r  r   r
   r  z.pdfZPDFr  
showBorderZ_renderPDF_z/.pdfmacZCAROzPDF renderPMz%s.%sZ_drawTimeCollectordisabledfmtr  
_renderPM_z/.r   renderPS_SEPrenderPSz.epsZEPSZEPS_infoZTestingZ	ReportLabpreview	ttf_embed)titleZdeptZcompanyr*  r  r+  Z
_renderPS_z/.epsr   	renderSVGz.svgZSVG_renderSVG_z/.svgr   z.psz/.psr   z.pywb
z/.py
saveLogger)>r   r   int	reportlabr  r   r   rU   rO   	TypeErrorr  findospathisabssplitrstripsepjoindirnamesysargvisdirmakedirsnormpathsplitextr  
_saveModesr   ZwarnOnceZenabledZinfoOncer  r  r   Z
drawToFiler  r   platformmacfs
macostoolsZFSSpecZSetCreatorTypeZtouched_bmModesr!  clearsaverlextra.graphicsr'  ImportErrorr)  Zeps_previewZeps_ttf_embedr.  openwriter   r  r  linesepr2  )rR   r  r
   ZfnRootr  r,  r   ZgenFmtr  extr  errZfnrootZplotModeZ_savedr  filenamerG  rH  ZbmFmtr!  ZdtcZdtcfmtsr)  r.  r{   r;   r;   r<   rK    s    




 
  $ 
$
 .


 
. 
 	
 
 ,
 &zDrawing.savec           
      K   sZ  || j kstd| ddlm} |dkr@ddlm} || S || jkrddlm} |j| f|t	| d|j
dt| d	f|S |d
krzddlm} W n  tk
r   ddlm} Y nX |j| |t	| d|j
dS |dkrddlm} |j| t	| d|j
dS |dkr|  S |dkrVddlm}	 |	j| fdt	| d|j
it| df|S dS )z,Converts to an 8 bit string in given format.zUnknown file format "%s"r   r  r   r  r   r  r#  r%  r   r&  r(  )r*  r  r   r  r   r   r-  r  r/  N)rE  r   r4  r  r  r  ZdrawToStringrI  r!  r   r  r   rL  r'  rM  r)  r  r.  )
rR   formatr
   r*  r   r  r  r!  r)  r.  r;   r;   r<   asString  s:    




zDrawing.asStringfitc                 C   sR  |   }| j}| j}t||f| }	|	 \}
}}}|dksl|dkr|
|k sl||| ksl||k sl||| kr||
 | | |	_|| | | |	_dddd||
 || f|	_n|dks|dkr|
|k s||| kr||
 | | |	_dddd||
 df|	_nT|dks&|dkrN||k s&||| krN|| | | |	_ddddd|| f|	_|	S )	z?return a base class drawing which ensures all the contents fitsrV  expandr   r   ZfitxZexpandxZfityZexpandy)r   rP   rQ   r   r   r   )rR   kindZlpadZrpadZbpadZtpadrH   ZoWZoHrT   ZxLZyLZxHZyHr;   r;   r<   resized;  s     8$,zDrawing.resized)r  r  )NNNNr   )Nr   )rV  r   r   r   r   )rU   rV   rW   rX   rE  rI  r   r   isNumberZisValidChildOrNoneOneOfZisStringOrNoneisNumberOrNoner   r   
SequenceOfr   r   r_   r  r   r  r  r   r   r  rK  rU  rY  r;   r;   r;   r<   r   8  sf   





 

		
|
r   c                   @   s   e Zd ZdZdddZdS )r
  z<This is a mixin to provide functionality for edited drawingsNc                 C   s   t |}|rLt|drLd|jkr,|j |_|r<|dkr<t }t|||j|< t|dr||r||rn|||| q||| n|rt||| nt	ddS )zb
        effectively setattr(obj,name,value), but takes care of things with _attrMaps etc
        r   Nr   zCan't add, need name)
r   rO   r   r   r   r   r   r   r[   
ValueError)rR   r   r^   r   r   r   r   Zivcr;   r;   r<   _addP  s    
 z_DrawingEditorMixin._add)NNNN)rU   rV   rW   rX   r_  r;   r;   r;   r<   r
  N  s   r
  c                   @   s   e Zd Zdd ZdS )isStrokeDashArrayc                 C   s0   t |p.t|ttfo.t|d o.t|d S )Nr   r   )ZisListOfNumbersOrNonetestr   rw   tuplerZ  isListOfNumbers)rR   rA   r;   r;   r<   ra  e  s    zisStrokeDashArray.testN)rU   rV   rW   ra  r;   r;   r;   r<   r`  d  s   r`  c                   @   s   e Zd Zeeeeeeedddddeedddddeeddeeddee	d	dee
d
dee
dddd	Zdd ZdS )	LineShaper   r   rh   z#Line cap 0=butt, 1=round & 2=squarer   z$Line join 0=miter, 1=round & 2=bevelz$miter limit control miter line joinsz[numbers] or [phase,[numbers]]zEThe level of transparency of the line, any real number betwen 0 and 1r   r   r   )	r   r   r   r    r!   r"   r#   r&   r'   c                 C   s<   t d | _d| _d| _d| _d| _d | _d | _| | d S )Nr   r   r   )	STATE_DEFAULTSr   r   r   r    r!   r"   r#   r   rR   r   r;   r;   r<   r_   x  s    
zLineShape.__init__N)rU   rV   rW   r   r   isColorOrNonerZ  r[  r`  	isOpacityr   r   r_   r;   r;   r;   r<   rd  i  s   



rd  c                	   @   sN   e Zd ZeeeeddeeddeeddeedddZdd Zdd Z	dS )	Liner   r   )r  rb   rc   rd   re   c                 K   s(   t | | || _|| _|| _|| _d S r`   )rd  r_   rb   rc   rd   re   )rR   rb   rc   rd   re   r   r;   r;   r<   r_     s
    zLine.__init__c                 C   s   | j | j| j| jfS )r   )rb   rc   rd   re   r   r;   r;   r<   r     s    zLine.getBoundsN)
rU   rV   rW   r   rd  r   rZ  r   r_   r   r;   r;   r;   r<   ri    s   



ri  c                
   @   sT   e Zd Zeeeeddeeddeeddeedddee	e
edZd	d
 ZdS )
SolidShapez$filling color of the shape, e.g. redr   zGthe level of transparency of the color, any real number between 0 and 1r   r   r   r   )r  r(   r$   r%   r'   r)   c                 C   s    t d | _d | _t| | d S )Nr(   )re  r(   r$   rd  r_   rf  r;   r;   r<   r_     s    
zSolidShape.__init__N)rU   rV   rW   r   rd  r   rg  rh  r   r[  r   r   r   r_   r;   r;   r;   r<   rj    s   


rj  ri   )rh   rh      r   moveTolineTocurveTo	closePathc                 C   s   | j }d}d}d}| }| jD ]v}	|	tkrX|rP|rP|
tkrP|d7 }|rP|t   |d7 }t|	 }|| }||	 |||   |}|	tkr|d7 }|	}
q|r|r|
tkr|d7 }|r|t   ||kS )zHelper function for renderers.r   r   )rz   	operators_MOVETO
_CLOSEPATH_PATH_OP_ARG_COUNT)r8  Z	drawFuncsZ	countOnlyZ
forceCloserz   rs   ZhadClosePathZ	hadMoveToactiveopr   nArgsjr;   r;   r<   _renderPath  s2    


rx  znon-zeroZnonzerozeven-oddZevenoddc                
   @   s   e Zd ZdZeeeeeeeeee	e
ddee
eedZddddefddZd	d
 Zdd Zdd Zdd Zdd Zdd ZdS )Pathz2Path, made up of straight lines and bezier curves.r   r   )r  rz   rp  
isClipPath	autocloser)   Nr   c                 K   s^   t | | |d krg }|d kr$g }t|d dks<td|| _|| _|| _|| _|| _d S Nrh   r   -Point list must have even number of elements!)	rj  r_   r4   r   rz   rp  rz  r{  r)   )rR   rz   rp  rz  r{  r)   r   r;   r;   r<   r_     s    zPath.__init__c                 C   s2   |  | jd d  | jd d  }||   |S r`   )r   rz   rp  r   r   rR   newr;   r;   r<   r     s     z	Path.copyc                 C   s    | j ||g | jt d S r`   )rz   r   rp  rj   rq  r   r;   r;   r<   rl    s    zPath.moveToc                 C   s    | j ||g | jt d S r`   )rz   r   rp  rj   _LINETOr   r;   r;   r<   rm    s    zPath.lineToc                 C   s(   | j ||||||g | jt d S r`   )rz   r   rp  rj   _CURVETO)rR   rb   rc   rd   re   x3rk   r;   r;   r<   rn    s    zPath.curveToc                 C   s   | j t d S r`   )rp  rj   rr  r   r;   r;   r<   ro    s    zPath.closePathc                 C   s  | j }zg }|j}|j}g }|j}|j}d}| jD ]}	t|	 }
||
 }|
dkrl|||  |||d   n`|
dkr|||d \}}}|t|d ||| ||d |d \}}}|t|d ||| |}q2t|t|t|t|fW S    t| Y S X d S )Nr   rh   r   rk  r/   )	rz   rj   r   rp  rs  rr   rE   r3   r~   )rR   rz   rI   ZaXZeXrJ   ZaYZeYrs   ru  rv  rw  rb   rd   r  rc   re   rk   r;   r;   r<   r     s0    
zPath.getBounds)rU   rV   rW   rX   r   rj  r   rc  r   NoneOrr[  r   r   r   r_   r   rl  rm  rn  ro  r   r;   r;   r;   r<   ry    s   ry  c                 C   s   |d kr|}g }t d }	||	 }
||	 }||
k r>|dt   }q(t||
 }|j}|dkrt||pbd}||	 }tt|| d d}|| }|d7 }nd}d}t|D ]4}|
||  }|| |t|  ||t|  f q|r|	  |S )N     f@rh   MbP?r	        ?r   r   )
r   r   rj   rE   r3   r3  ry   r   r   reverse)centerxcenteryradiusstartangledegreesendangledegreesyradiusdegreedeltar  rz   degreestoradians
startangleendanglerG   rl   radiansdeltar.   r;   r;   r<   getArcPoints  s0     
& r  c                   @   s   e Zd ZdZdddZdS )ArcPathzPath with an addArc methodNc
              
   C   sf   t ||||||||	d}
|s&t| jsH| |
d d |
d d  |
d= |
D ]\}}| || qLd S )N)r  r  r  r   r   )r  r4   rp  rl  rm  )rR   r  r  r  r  r  r  r  rl  r  r   rA   rF   r;   r;   r<   addArc:  s     zArcPath.addArc)NNNN)rU   rV   rW   rX   r  r;   r;   r;   r<   r  8  s   r  c                 K   sL  g }g }| D ]}t |s"|}g }	n|d }|dd  }	|tkrJtd| t|}
t|	t|
 krxtd|t|	f ||
 |t	|	 q|df|dffD ].\}}t
|t|dD ]}|| | ||< qq|dd }|r<dD ]P}|| ||d  f}|d d kr |d d kr q||d d }t|t| }}|d d k	r|d d k	rt|t| }}|| }t|dkr|| | }t
|t|dD ]}|||| |   ||< qn(t
|t|dD ]}|| d	 ||< qq|d d k	r|d | n
|d | }t
|t|dD ]}||  |7  < q"qt|||f|S )
Nr   r   zbad operator name %sz%s bad arguments %srh   bbox)r   r   gư>r  )r   _PATH_OP_NAMESr^  r   r4   rs  r  rj   r   rw   ry   r   rE   r3   absry  )ZpathSegsrz  r   r   r   Or   segZopNamer   ru  ro   r  rs   r  rw  rl   rm   rn   Zfacr;   r;   r<   
definePathA  sN    


 &r  c                	   @   s`   e Zd ZdZeeeeeeeeddeeddeeeedZdddZ	d	d
 Z
dd ZdS )Rectz)Rectangle, possibly with rounded corners.width of the object in pointsr   height of the objects in points)r  rA   rF   rP   rQ   rxryr   c                 K   s4   t | | || _|| _|| _|| _|| _|| _d S r`   )rj  r_   rA   rF   rP   rQ   r  r  )rR   rA   rF   rP   rQ   r  r  r   r;   r;   r<   r_     s    zRect.__init__c                 C   s*   |  | j| j| j| j}||   |S r`   )r   rA   rF   rP   rQ   r   r   r~  r;   r;   r<   r     s    z	Rect.copyc                 C   s    | j | j| j | j | j| j fS r`   rA   rF   rP   rQ   r   r;   r;   r<   r     s    zRect.getBoundsN)r   r   )rU   rV   rW   rX   r   rj  r   rZ  r   r_   r   r   r;   r;   r;   r<   r  s  s   

	
	r  c                	   @   sX   e Zd ZdZeeeeeeeeddeeddeddZ	dd Z
d	d
 Zdd ZdS )ImagezBitmap image.r  r   r  N)r  rA   rF   rP   rQ   r8  c                 K   s.   t | | || _|| _|| _|| _|| _d S r`   )rj  r_   rA   rF   rP   rQ   r8  )rR   rA   rF   rP   rQ   r8  r   r;   r;   r<   r_     s    zImage.__init__c                 C   s.   |  | j| j| j| j| j}||   |S r`   )r   rA   rF   rP   rQ   r8  r   r   r~  r;   r;   r<   r     s    z
Image.copyc                 C   s    | j | j| j | j | j| j fS r`   r  r   r;   r;   r<   r     s    zImage.getBounds)rU   rV   rW   rX   r   rj  r   rZ  r\  r   r_   r   r   r;   r;   r;   r<   r    s   

r  c                   @   sL   e Zd ZeeeeddeeddeedddZdd Zdd	 Z	d
d Z
dS )Circlex of the centrer   y of the centreradius in points)r  cxcyrc                 K   s"   t | | || _|| _|| _d S r`   )rj  r_   r  r  r  )rR   r  r  r  r   r;   r;   r<   r_     s    zCircle.__init__c                 C   s&   |  | j| j| j}||   |S r`   )r   r  r  r  r   r   r~  r;   r;   r<   r     s    zCircle.copyc                 C   s,   | j | j | j| j | j | j | j| j fS r`   )r  r  r  r   r;   r;   r<   r     s    zCircle.getBoundsNrU   rV   rW   r   rj  r   rZ  r   r_   r   r   r;   r;   r;   r<   r    s   


r  c                	   @   sV   e Zd ZeeeeddeeddeeddeedddZdd Zd	d
 Z	dd Z
dS )Ellipser  r   r  zx radiuszy radius)r  r  r  r  r  c                 K   s(   t | | || _|| _|| _|| _d S r`   )rj  r_   r  r  r  r  )rR   r  r  r  r  r   r;   r;   r<   r_     s
    zEllipse.__init__c                 C   s*   |  | j| j| j| j}||   |S r`   )r   r  r  r  r  r   r   r~  r;   r;   r<   r     s    zEllipse.copyc                 C   s,   | j | j | j| j | j | j | j| j fS r`   )r  r  r  r  r   r;   r;   r<   r     s    zEllipse.getBoundsNr  r;   r;   r;   r<   r    s   



r  c                   @   s   e Zd ZdZeeeeddeeddeeddeeeeeeeeeeee	ddd
Z
dZdddZdd Zdd Zdd Zdd Zd	S )WedgeznA "slice of a pie" by default translates to a polygon moves anticlockwise
       from start angle to end angler  r   r  r  ztreat as annular ring)
r  r  r  r  r  r  r  radius1yradius1annularr   NFc           	      K   sP   t | | ||k r|d }q|||||f\| _| _| _| _| _|| _|| _d S )Nih  )	rj  r_   r  r  r  r  r  r  r  )	rR   r  r  r  r  r  r  r  r   r;   r;   r<   r_     s    
zWedge.__init__c                 C   sH   t | dd }|d kr| j}t | dd }t | d|}|d kr>|}|||fS )Nr  r  r  )r   r  )rR   r  r  r  r;   r;   r<   
_xtraRadii  s      zWedge._xtraRadiic                 C   sn  | j }| j}| j}|  \}}}| j}| j}td }	||	 }
||	 }||
k rZ|dt  }qDt||
 }g }|dkrt| j	p|d|}||	 }t
dt|| d }|| }|d7 }nd}d}g }|j}|j}t|D ]$}|
||  }|t|t|f q|D ](\}}||||   ||||   q|dks:|d kr`|dksN|d kr`|| || n8|  |D ]*\}}||||   ||||   ql| jrbtt| dtd	}||d |d  tdd| dD ]}||| ||d   q|  ||d|  |d| d   td| d d
| dD ]}||| ||d   q6|  |S t|S d S )Nr  rh   r  r	  r   r  r   r)   )r)   ri   )r  r  r  r  r  r  r   r   rE   r  r3   r3  rj   ry   r   r   r  r  ry  r   r   rl  rm  ro  Polygon)rR   r  r  r  r  r  r  r  r  r  r  r  rG   rz   r  r  r.   CAZCAArl   rn   r-   r   rA   r;   r;   r<   	asPolygon  sb    
( 
 zWedge.asPolygonc                 C   s.   |  | j| j| j| j| j}||   |S r`   )r   r  r  r  r  r  r   r   r~  r;   r;   r<   r   8  s    z
Wedge.copyc                 C   s   |    S r`   )r  r   r   r;   r;   r<   r   A  s    zWedge.getBounds)NF)rU   rV   rW   rX   r   rj  r   rZ  r\  r   r   r  r_   r  r  r   r   r;   r;   r;   r<   r    s(   



  
6	r  c                   @   s@   e Zd ZdZeeeedddZg fddZ	dd Z
d	d
 ZdS )r  zKDefines a closed shape; Is implicitly
    joined back to the start for you.5list of numbers in the form x1, y1, x2, y2 ... xn, ynr   r  rz   c                 K   s2   t | | t|d dks$td|p*g | _d S r|  )rj  r_   r4   r   rz   )rR   rz   r   r;   r;   r<   r_   L  s    zPolygon.__init__c                 C   s   |  | j}||   |S r`   r   rz   r   r   r~  r;   r;   r<   r   Q  s    zPolygon.copyc                 C   s
   t | jS r`   r   rz   r   r;   r;   r<   r   V  s    zPolygon.getBoundsN)rU   rV   rW   rX   r   rj  r   rc  r   r_   r   r   r;   r;   r;   r<   r  D  s   
r  c                   @   s@   e Zd ZdZeeeedddZg fddZ	dd Z
d	d
 ZdS )PolyLinezSeries of line segments.  Does not define a
    closed shape; never filled even if apparently joined.
    Put the numbers in the list, not two-tuples.r  r   r  c                 K   sz   t | | |pg }t|}|rpt|d rXg }|D ]\}}|| || q4|}nt|d dksptd|| _d S )Nr   rh   r}  )rd  r_   r4   r   rj   r   rz   )rR   rz   r   Z	lenPointsra   rA   rF   r;   r;   r<   r_   b  s    
zPolyLine.__init__c                 C   s   |  | j}||   |S r`   r  r~  r;   r;   r<   r   q  s    zPolyLine.copyc                 C   s
   t | jS r`   r  r   r;   r;   r<   r   v  s    zPolyLine.getBoundsN)rU   rV   rW   rX   r   rd  r   rc  r   r_   r   r   r;   r;   r;   r<   r  Y  s   
r  c                	   @   sn   e Zd ZdZeeeeee	eddfdddeee
edfddeee
ed	fd
ddZddg fddZdS )Hatchingz\define a hatching of a set of polygons defined by lists of the form [x0,y0,x1,y1,....,xn,yn]r   )r  z
xy list(s)z8list(s) of numbers in the form x1, y1, x2, y2 ... xn, ynr   zangle(s)zCthe angle or list of angles at which hatching lines should be drawnzspacings(s)z-orthogonal distance(s) between hatching lines)r  xyListsanglesspacingsrh   -   c              
   K   s  t j| f| t|r|f}t|r*|f}t|r8|f}t|t| }|dkrft|||d g  }|| _|| _|| _| j	}| j
}t|D ]<\}}|| }	t|}t|}
t|}d}| }|D ]J}tdt|dD ]4}||d  |
 || |  }t||}t||}qqtt||	 d }tt||	 d }t||D ]}g }|	| }|D ]}t|d }tdt|dD ]}|| }||d  }||
 ||  }||
 ||  }|| }||d  }||
 ||  }||
 ||  }||k r||ks||k r.||kr.|||| ||  ||    |}qxqX|  tdt|dD ]r}|| |
 ||  }||
 || |  }||d  |
 ||  }||
 ||d  |  }||| ||| qRqBqd S )Nr   r/   irh   r   )ry  r_   rc  rZ  r4   rw   r  r  r  rl  rm  	enumerater   r   r   ry   rE   r3   r3  r   rj   r   )rR   r  r  r  kwdsrs   rl  rm  r   spacingZcosThetaZsinThetaZspanMinZspanMaxr   rw  rF   Z	spanStartZspanEndstepZnodeXZstripeYr   rl   rm   Za1Zb1rA   rb   rc   r;   r;   r<   r_     sl    
("
zHatching.__init__N)rU   rV   rW   rX   r   ry  r   ZEitherOrrc  r]  rZ  r   r_   r;   r;   r;   r<   r  y  s   r  c           
      C   sH   t | d|}||}|dkrDt | dd}	|	t|d | ||| }|S )NZ_dpr   Z_dpLen)r   rfindr   )
tAr5   r2   r+   r*   encodingZpivotCharacterZdprs   ZdpOffsr;   r;   r<   numericXShift  s    
r  c                   @   s   e Zd ZdZeeeddeeddeeddedddeeddeed	dee	d
dddddeeee	ddddddddddd	Z
dZdd Zdd Zdd Zd d! ZdS )"StringziNot checked against the spec, just a way to make something work.
    Can be anchored left, middle or end.zx point of anchoringr   zy point of anchoringzthe text of the stringNz_font name of the text - font is either acrobat standard or registered when using external font.z	font sizezcolor of the fontr   middler1   numericz(treat (x,y) as one of the options below.r   r   rh   rg   ri      rk     z.Control whether text is filled/stroked etc etc)	rA   rF   r5   r+   r*   r(   r,   r  ZtextRenderModeutf8c                 K   sD   || _ || _|| _d| _td | _td | _td | _| | d S )Nr   r+   r*   r(   )	rA   rF   r5   r,   re  r+   r*   r(   r   )rR   rA   rF   r5   r   r;   r;   r<   r_     s    


zString.__init__c                 C   s   | j t| j| j| j| j S r`   )rA   r   r5   r+   r*   r  r   r;   r;   r<   getEast  s    zString.getEastc                 C   s&   |  | j| j| j}||   |S r`   )r   rA   rF   r5   r   r   r~  r;   r;   r<   r     s    zString.copyc                 C   s   | j }t|| j| j| j}| j}| j}|dkrz|dkrD|d| 8 }n6|dkrV||8 }n$|dkrz|t|||| j| j| j8 }|| jd| j  || | j| j fS )Nr   r  r  r1   r  g?)	r5   r   r+   r*   r  r,   rA   r  rF   )rR   r8   r2   r  rA   r;   r;   r<   r     s    
zString.getBounds)rU   rV   rW   rX   r   r   rZ  ZisStringrg  r[  r   r  r_   r  r   r   r;   r;   r;   r<   r    s"   






r  c                   @   s   e Zd ZdZdd ZdS )r   ak  A simple template for creating a new node.  The user (Python
    programmer) may subclasses this.  provideNode() must be defined to
    provide a Shape primitive when called by a renderer.  It does
    NOT inherit from Shape, as the renderer always replaces it, and
    your own classes can safely inherit from it without getting
    lots of unintended behaviour.c                 C   s   t ddS )zOverride this to create your own node. This lets widgets be
        added to drawings; they must create a shape (typically a group)
        so that the renderer can draw the custom node.4this method must be redefined by the user/programmerNr   r   r;   r;   r<   r     s    zUserNode.provideNodeN)rU   rV   rW   rX   r   r;   r;   r;   r<   r     s   r   c                   @   s   e Zd ZdZdd ZdS )
DirectDrawz"try to draw directly on the canvasc                 C   s   t dd S )Nr  r   )rR   rS   r;   r;   r<   drawDirectly  s    zDirectDraw.drawDirectlyN)rU   rV   rW   rX   r  r;   r;   r;   r<   r    s   r  c                  C   sp   t dddd} dd l}|j}tjj}|d ||   |d |   |d |d | `|d	 |   d S )
Nr   r  2   r   za Rectangle: z
verifying...z OK
zdeleting rect.width zverifying...)r  pprintr?  stdoutrO  r   r   rP   )r  r  ppr2   r;   r;   r<   ra     s    ra  __main__)N)N)r   r   )FF)NNN)b__version__rX   r7  r?  mathr   r   r   r   r   r   Zreportlab.platypusr   Zreportlab.rl_configr	   r
   r   Z_baseGFontNamer   r   Zreportlab.libr   r   Zreportlab.lib.validatorsZreportlab.lib.utilsr   r   r  ZisNumberInRangerh  Zreportlab.lib.attrmapZreportlab.lib.rl_accelr   Zreportlab.pdfbase.pdfmetricsr   Zreportlab.lib.fontsr   Zreportlab.pdfgen.canvasr   r   Z_baseGFontNameBZ_baseGFontNameIZ_baseGFontNameBIZNON_ZERO_WINDINGZEVEN_ODDZblackre  r   r=   rK   rL   rY   rf   rr   r~   r   r   r   r   r   r   r   r   r
  Z	Validatorr`  rd  ri  rj  rw   ry   rq  r  r  rr  rs  r  rx  Z_fillModeMapry  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  ra  rU   r;   r;   r;   r<   <module>   s    
"

5M >

'
	  
       
H
	2k X3
