o
    ¬+ ZÀØ  ã                   @   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	 ddl
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' ddl(m)Z) e$eddƒZ*e$eddƒZ+e$eddƒZ,G dd„ de-ƒZ.dZ/dZ0i dd“dej1“dd“dd“dd“dd“dd“dd“d d“d!d"“d#d"“d$d“d%ej1“d&e&“d'd“d(e“d)d*“Z2d+d,„ Z3d-d.„ Z4d/d0„ Z5d1d2„ Z6d3d4„ Z7d5d6„ Z8d7d8„ Z9d9d:„ Z:d;d<„ Z;d=d>„ Z<d?d@„ Z=dAdB„ Z>dCdD„ Z?dEdF„ Z@G dGdH„ dHƒZAG dIdJ„ dJƒZBdKdL„ ZCdMdN„ ZDdOdP„ ZEdQdR„ ZFG dSdT„ dTeBeAƒZGG dUdV„ dVeGƒZHd’dWdX„ZId’dYdZ„ZJd“d\d]„ZKd^d_„ ZLG d`da„ daeHeƒZMG dbdc„ dcƒZNG ddde„ deeGƒZOG dfdg„ dgeOƒZPG dhdi„ dieOƒZQeReSdjƒƒ\ZTZUZVZWdkZXg dl¢ZYd”dmdn„ZZdde'e'doe'dpe'e&e&dqe&dre&iZ[G dsdt„ dteQƒZ\e\ƒ Z]d•dudv„Z^G dwdx„ dxe\ƒZ_g dddfdydz„Z`G d{d|„ d|eQƒZaG d}d~„ d~eQƒZbG dd€„ d€eQƒZcG d�d‚„ d‚eQƒZdG dƒd„„ d„eQƒZeG d…d†„ d†eQƒZfG d‡dˆ„ dˆeOƒZgdefd‰dŠ„ZhG d‹dŒ„ dŒeGƒZiG d�dŽ„ dŽeAƒZjd�d�„ Zkeld‘k�rekƒ  dS dS )–z3.3.0z9Core of the graphics library - defines Drawing and Shapesé    N)ÚpiÚcosÚsinÚtanÚsqrt)Úpprint)ÚFlowable)ÚshapeCheckingÚverboseÚdefaultGraphicsFontNameÚ_unset_ÚdecimalSymbol)Úlogger)Úcolors)Ú*)ÚisSeqÚasBytesé   )Úfp_str)ÚstringWidth)Útt2ps)ÚFILL_EVEN_ODDÚFILL_NON_ZERO)Úxrangec                   @   s   e Zd ZdS )ÚNotImplementedErrorN)Ú__name__Ú
__module__Ú__qualname__© r   r   úK/var/www/html/env/lib/python3.10/site-packages/reportlab/graphics/shapes.pyr      s    r   zNon-Zero WindingzEven-OddÚ	transform©r   r   r   r   r   r   ÚstrokeColorÚstrokeWidthÚstrokeLineCapÚstrokeLineJoinÚstrokeMiterLimité
   ÚstrokeDashArrayÚstrokeOpacityÚfillOpacityÚfillOverprintFÚstrokeOverprintÚoverprintMaskÚ	fillColorÚfillModeÚfontSizeÚfontNameÚ
textAnchorÚstartc                   C   s   dS )Nr!   r   r   r   r   r   ÚnullTransformI   s   r4   c                 C   s   dddd| |fS )Nr   r   r   )ÚdxÚdyr   r   r   Ú	translateL   ó   r7   c                 C   s   | dd|ddfS ©Nr   r   )ÚsxÚsyr   r   r   ÚscaleO   r8   r<   c                 C   s.   | t  d }t|ƒt|ƒt|ƒ t|ƒddfS )Né´   r   )r   r   r   ©ÚangleÚar   r   r   ÚrotateR   s   "rA   c                 C   s    | t  d }ddt|ƒdddfS ©Nr=   r   r   ©r   r   r>   r   r   r   ÚskewXV   ó   rD   c                 C   s    | t  d }dt|ƒddddfS rB   rC   r>   r   r   r   ÚskewYZ   rE   rF   c              	   C   sÈ   | d |d  | d |d   | d |d  | d |d   | d |d  | d |d   | d |d  | d |d   | d |d  | d |d   | d  | d |d  | d |d   | d  fS )zA postmultiplied by Br   é   r   é   é   é   r   )ÚAÚBr   r   r   Úmmult^   s   &&ûrM   c                 C   s    t | d | d  | d | d   ƒ}| d | | d  | | d  | | d | g}t||d  | d  |d | d   |d  | d  |d | d   g ƒS )zBFor A affine 2D represented as 6vec return 6vec version of A**(-1)r   rH   rG   r   rI   rJ   )ÚfloatÚtuple)rK   ÚdetÚRr   r   r   Úinversel   s   $0LrR   c                 C   s@   | d |d  | d |d   | d |d  | d |d   fS )zBApply the homogenous part of atransformation a to vector v --> A*vr   rG   r   rH   r   ©rK   Úvr   r   r   ÚzTransformPoints   s   @rU   c                 C   sP   | d |d  | d |d   | d  | d |d  | d |d   | d  fS )z*Apply transformation a to vector v --> A*vr   rG   r   rI   rH   rJ   r   rS   r   r   r   ÚtransformPointw   s   PrV   c                    s(   ‡ fdd„|D ƒ}t |tƒrt|ƒ}|S )Nc                    s   g | ]}t ˆ |ƒ‘qS r   )rV   )Ú.0rT   ©Úmatrixr   r   Ú
<listcomp>|   s    z#transformPoints.<locals>.<listcomp>)Ú
isinstancerO   )rY   ÚVÚrr   rX   r   ÚtransformPoints{   s   r^   c                 C   s   t t| fdd„|ƒƒS )Nc                 S   s
   t || ƒS ©N)rU   )ÚxrY   r   r   r   Ú<lambda>�   s   
 z"zTransformPoints.<locals>.<lambda>)ÚlistÚmap)rY   r\   r   r   r   ÚzTransformPoints€   s   rd   c                 C   s  d}| D ]}t |t|||ƒƒ}qt| ƒ| }|}	|d dkr&| }
|	| }	n|d dkr/d}
n	| d }
|	|
 }	|d dkrV| }|dkrHd}n?|dkrP| }n7| d }n1|d d	krqd}|dkre|}n"|dkrld}n|d }n| d }|dkr~| }n	|dkr…|}nd}||
||||	fS )
Nr   ÚsÚng       @éÿÿÿÿÚeÚendr3   Úw)Úmaxr   Úlen)ÚtextÚfontr0   Úleadingr2   Ú	boxAnchorrj   ÚtÚhÚytÚybÚxbÚxtr   r   r   Ú_textBoxLimitsƒ   s6   



rw   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   ó   g | ]}|d  ‘qS ©r   r   ©rW   r`   r   r   r   rZ   «   ó    z%_rotatedBoxLimits.<locals>.<listcomp>c                 S   rx   ©r   r   rz   r   r   r   rZ   ¬   r{   )rd   rA   Úminrk   )r`   Úyrj   rr   r?   ÚCÚXÚYr   r   r   Ú_rotatedBoxLimits¥   s   6r‚   c                   @   ó   e Zd ZdZdd„ ZdS )Ú_DrawTimeResizeablez:Addin class to provide the horribleness of _drawTimeResizec                 C   sF   t | dƒr| j}|j}|||_|_t |dƒr!| ||¡ d S d S d S )NÚ_canvasÚ_drawTimeResize)Úhasattrr…   Ú_drawingÚwidthÚheightr†   )Úselfrj   rr   ÚcanvasÚdrawingr   r   r   r†   ±   s   

ûz#_DrawTimeResizeable._drawTimeResizeN)r   r   r   Ú__doc__r†   r   r   r   r   r„   ¯   s    r„   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)r‹   ÚkeywordsÚkeyÚvaluer   r   r   Ú__init__º   s   ÿz_SetKeyWordArgs.__init__N)r   r   r   r•   r   r   r   r   r�   ¹   s    r�   c           
      C   s|   dd„ | D ƒ}|sd S |d \}}}}|dd … D ]\}}}}	||k r%|}||kr+|}||k r1|}|	|kr7|	}q||||fS )Nc                 S   s   g | ]}|d ur|‘qS r_   r   rz   r   r   r   rZ   Ç   s    z"getRectsBounds.<locals>.<listcomp>r   r   r   )
ÚrectListÚLÚxMinÚyMinÚxMaxÚyMaxÚx1Úy1Úx2Úy2r   r   r   ÚgetRectsBoundsÅ   s   €r    c                 C   s  |d||   |  }d|d|  |   }||  }| g}|| d| |  }|dkr‚t |ƒ}|dk r4| }d||  }	g }
z	|
 |	| ¡ W n   Y z	|
 ||	 ¡ W n   Y |d9 }|d9 }|
D ]}d|  krndkr�n qb| |||| |  |  |  ¡ qb| |¡ |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
    rH   rG   rI   r   g      à¿g      ø?r   )r   Úappend)Úy0r�   rŸ   Úy3r@   ÚbÚcr�   ÚdÚqrQ   rq   r   r   r   Ú_getBezierExtremaÖ   s4   "€
r¨   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   ra     s    zgetPathBounds.<locals>.<lambda>r   rG   r   )rl   rb   rc   Úranger}   rk   )Úpointsrf   ÚfÚxsÚysr   r   r   ÚgetPathBounds  s
   r°   c                 C   sP   | d }t |ƒr$dd„ | D ƒ}dd„ | D ƒ}t|ƒt|ƒt|ƒt|ƒfS t| ƒS )z"Helper function for list of pointsr   c                 S   rx   ry   r   ©rW   Úxyr   r   r   rZ     r{   z#getPointsBounds.<locals>.<listcomp>c                 S   rx   r|   r   r±   r   r   r   rZ     r{   )r   r}   rk   r°   )Ú	pointListÚfirstr®   r¯   r   r   r   ÚgetPointsBounds  s   rµ   c                   @   sX   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r&	 d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 ƒ‚)zReturn a clone of this shape.z!No copy method implemented for %s)r   Ú	__class__r   ©r‹   r   r   r   Úcopy*  ó   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__r�   )r‹   ÚrecurÚpropsr“   r”   r   r   r   ÚgetProperties0  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)r‹   r¾   r   r   r   ÚsetProperties=  rº   zShape.setPropertiesÚ c                 C   sH   t |  ¡  ¡ ƒ}| ¡  |r|d }|D ]\}}td|||f ƒ qdS )z�Convenience. Lists them on standard output.  You
        may provide a prefix - mostly helps to generate code
        samples for documentation.Ú.z	%s%s = %sN)rb   r¿   r�   ÚsortÚprint)r‹   ÚprefixÚpropListÚnamer”   r   r   r   ÚdumpPropertiesD  s   ÿzShape.dumpPropertiesc                 C   s    | j durL| j ¡ D ]}|d dkr|| j v sJ d|| f ƒ‚q
| j  ¡ D ](\}}t| |ƒs6J d|| f ƒ‚t| |ƒ}| |¡sKJ d||| jjf ƒ‚q%dS d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¼   Úkeysr�   r‡   ÚgetattrÚvalidater·   r   )r‹   r“   ÚattrÚ	metavaluer”   r   r   r   ÚverifyP  s   
€
"ùzShape.verifyc                 C   s   t | ||ƒ dS )zSBy default we verify.  This could be off
            in some parallel base classes.N)ÚvalidateSetattr)r‹   rÎ   r”   r   r   r   Ú__setattr__e  s   zShape.__setattr__c                 C   ó   t dƒ‚)ú5Returns bounding rectangle of object as (x1,y1,x2,y2)z+Shapes and widgets must implement getBounds©r   r¸   r   r   r   Ú	getBoundsj  s   zShape.getBoundsNr|   )rÂ   )r   r   r   rŽ   Ú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d3dd„Zdd„ Zdd„ Zdd„ Zd4d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 )5Ú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   ©ÚdescÚ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 )z‰Initial 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    Úaddr�   r•   )r‹   Úelementsr’   Úeltr   r   r   r•   }  s   zGroup.__init__c                 C   s8   |r|t | j ¡ ƒvrttƒ| j|< t| ||ƒ dS dS )zLif name is not None add an attribute pointing to node and add to the attrMapN)rb   rÊ   rË   ÚAttrMapValueÚisValidChildr‘   )r‹   rÈ   Únoder   r   r   Ú_addNamedNode�  s
   ýzGroup._addNamedNodeNc                 C   s8   |durt |ƒsJ dƒ‚| j |¡ |  ||¡ dS dS )z“Appends 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¡   rè   )r‹   rç   rÈ   r   r   r   râ   ”  s
   ýz	Group.addc                 C   s   |   |¡ | jd S )Nrg   )râ   rà   )r‹   rç   r   r   r   Ú_nnž  s   

z	Group._nnc                 C   sT   |dur(t |ƒsJ dƒ‚|dk r|g| j||…< n| j ||¡ |  ||¡ dS dS )z4Inserts sub-node n in contents at specified locationNz4Can only insert Shape or UserNode objects in a Groupr   )ræ   rà   Úinsertrè   )r‹   r©   rf   rÈ   r   r   r   rê   ¢  s   úzGroup.insertc                 C   s¢   t | tƒrt| j| jƒptƒ }| j ¡ |_t|dƒr"| jdd… |_| j	}|j	j
}|D ]}t |tƒr7| ¡ }nt |tƒrA| ¡ }n| ¡ }||ƒ q+|  |¡ |S )z9Return a new object which only contains primitive shapes.r    N)r[   ÚDrawingr‰   rŠ   rØ   rÊ   rá   r‡   r    rà   r¡   ÚUserNodeÚprovideNodeÚexpandUserNodesr¹   Ú_copyNamedContents)r‹   ÚobjÚself_contentsr@   ÚchildÚnewChildr   r   r   rî   ¬  s   





zGroup.expandUserNodesc                 C   sÀ   ddl m} tƒ }t| dƒr| j|_t|dƒr| jdd… |_|  ¡ dd… }|r^| d¡}t|t	ƒr;| 
| ¡ ¡ n!t|tƒrW| ¡ }|jdkrQ|j |j¡ n| |¡ n| |¡ |s)|S )z return a fully expanded objectr   )ÚWidgetÚ	__label__r    Nr!   )Úreportlab.graphics.widgetbaserô   rØ   r‡   rõ   r    ÚgetContentsÚpopr[   rì   r¡   rí   Ú_exploderà   Úextendrâ   )r‹   rô   rð   ÚPrf   r   r   r   rù   Â  s$   





õzGroup._explodec                 C   s   | j D ]}|j  |¡ qd S r_   )rà   r¡   )r‹   rð   rò   r   r   r   Ú_copyContentsØ  s   
ÿzGroup._copyContents©rà   c           	      C   s‚   ddl m } | j}|st| j ¡ ƒ}| j ¡ D ]'\}}||v r.| |¡}t|||j| ƒ q||v r>||vr>t||||ƒƒ qd S )Nr   )r¹   )	r¹   rà   rb   rÊ   rË   r¼   r�   Úindexr‘   )	r‹   rð   ÚaKeysÚnoCopyr¹   rñ   ÚkrT   Úposr   r   r   rï   Ü  s   
€ûzGroup._copyNamedContentsc                 C   s$   | j  ¡ |_ |  |¡ |  |¡ |S )zcopies to obj)rÊ   rá   rü   rï   ©r‹   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)rM   r    rA   )r‹   Úthetar   r   r   rA   ò  ó   zGroup.rotatec                 C   ó   t | jt||ƒƒ| _dS r  )rM   r    r7   )r‹   r5   r6   r   r   r   r7   ö  ó   zGroup.translatec                 C   r  r  )rM   r    r<   )r‹   r:   r;   r   r   r   r<   ú  r	  zGroup.scalec                 C   s    t t | jt|ƒƒt|ƒƒ| _dS r  )rM   r    rD   rF   )r‹   ÚkxÚkyr   r   r   Úskewþ  ó    z
Group.skewc                 C   s   | j dd… ||f | _ dS )z2Convenience function to set the origin arbitrarilyNéþÿÿÿ)r    ©r‹   r`   r~   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À   Ú_xtraAttrMapr‰   rŠ   )r‹   r‰   rŠ   r   r   r   Ú	asDrawing  s   
zGroup.asDrawingc                 C   s,   t | ddƒ}| j}|r||vr|g| }|S )z[Return the list of things to be rendered
        override to get more complicated behaviourÚ
backgroundN)rÌ   rà   )r‹   r¤   r   r   r   r   r÷     s   zGroup.getContentsc                 C   s�   | j rFg }| j D ]	}| | ¡ ¡ qt|ƒ}|d u rd S |\}}}}| j}||g||g||g||gg}g }	|D ]
}
|	 t||
ƒ¡ q7t|	ƒS d S r_   )rà   r¡   rÖ   r    r    rV   rµ   )r‹   r¤   Úelemrœ   r�   rž   rŸ   ÚtransÚcornersÚ
newCornersÚcornerr   r   r   rÖ     s   
zGroup.getBoundsr_   )Nrý   )r   r   r   rŽ   r×   rå   ÚisTransformÚisListOfShapesÚ	isBooleanrÊ   r•   rè   râ   ré   rê   rî   rù   rü   rï   r  r¹   rA   r7   r<   r  r  r  r÷   rÖ   r   r   r   r   rØ   n  s8    

û




	rØ   c                 C   s^   ddl m} | j}||ƒj}|p|j}||vr|g||< dS ||| vr-||  |¡ dS dS )z7add an import of obj's class to a dictionary of importsr   )Ú	getmoduleN)Úinspectr  r·   r   r¡   )rð   ÚIrf   r  r¥   Úmr   r   r   Ú_addObjImport,  s   

ÿr   c                 C   s²  t | tƒr	t| ƒS t| ƒr<d}| D ]}|dt||ƒ  }qt | tƒr*d|dd…  S d|dd… t| ƒdkr8dp9df S | tu rJ|rHt| |d	ƒ d	S t | t	ƒrÕ|rVt| |ƒ d
dl
m} || jƒ\}}}}|ry|t|ƒ d… }	|t|ƒ d…= ng }	|  ¡ }
| jjd }|dd… D ]}|
| }|
|= |dt||ƒ  }q‹|	D ]}|
| }|
|= |d|t||ƒf  }q |
 ¡ D ]\}}|
| }|d|t||ƒf  }q¹|dd… d S t| ƒS )zEreturn a repr style string with named fixed args first, then keywordsrÂ   z%s,z[%s]Nrg   z(%s%s)r   ú,ÚEmptyClipPathr   )Ú
getargspecú(z%s=%s,ú))r[   rN   r   r   Ú_reprrb   rl   r"  r   r¶   r  r#  r•   r¿   r·   r   r�   Úrepr)r‹   r  re   rT   r#  ÚargsÚvarargsÚvarkwÚdefaultsÚkargsrû   rf   r   r   r   r&  7  sF   

$
r&  ú		c           
      C   sº   d}t | dd ƒ}|r|d||t|ƒf  }| j}|D ]@}t|tƒrNd| }|d7 }t |ddƒ}	|	r5d|	 }	|d||||	f  }|t|||||ƒ }|d8 }q|d	||t||ƒf  }q|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  r©   Úindentre   r   rf   ÚnpfxÚlr   r   r   r/  `  s   

r/  c                 K   sH   |  | j¡ i }t|ƒ}| ¡ D ]}| |¡r!|| |||d … < q|S r_   )rÀ   r¼   rl   rË   Ú
startswith)r‹   r1  ÚkwrQ   rf   r  r   r   r   Ú_extraKWr  s   
€r7  c                   @   s,  e Zd ZdZd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	ddddddddddddd d!d"d#ƒ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.)ÚpdfÚpsÚepsÚgifÚpngÚjpgÚjpegÚpctÚpictÚtiffÚtifÚpyÚbmpÚsvgÚtiffpÚtifflÚtiff1zDrawing width in points.rÜ   zDrawing height in points.Nz=Background widget for the drawing e.g. Rect(0,0,width,height)ÚLEFTÚRIGHTÚCENTERÚCENTREz+Horizontal alignment within parent documentÚ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)	r‰   rŠ   Úcanvr  ÚhAlignÚvAlignÚrenderScaleÚinitialFontNameÚinitialFontSizer8  r;  r<  rB  r=  rA  r?  r@  rD  rF  rG  rH  r:  rE  r9  rC  r   r   )ÚloÚemptyOKzOne or more plot modes)ÚBASEÚformatsé�  éÈ   c                 O   s@   d | _ tj| g|¢R i |¤Ž || _|| _d| _d| _d| _d S )NrI  rN  ç      ð?)r  rØ   r•   r‰   rŠ   rP  rQ  rR  )r‹   r‰   rŠ   Únodesr’   r   r   r   r•   ›  s   
zDrawing.__init__c                 C   s¨   g d¢g d¢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Ø   )ÚColorÚ	CMYKColorÚ
PCMYKColor)zreportlab.graphics.shapeszreportlab.lib.colorsr‹   ÚExplodedDrawing_z0#Autogenerated by ReportLab guiedit do not edit
zfrom %s import %s
r   rg   ú'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·   r   r�   ÚstrÚreplacer‰   rŠ   )r‹   r  r0  rf   re   r  Úor   r   r   Ú	_renderPy¤  s   þ&zDrawing._renderPyc                 C   s&   ddl m} |j| | jdd|d� dS )zšThis 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   ©Ú	renderPDF©ÚshowBoundaryN)Úreportlab.graphicsrh  ÚdrawrO  )r‹   rj  rh  r   r   r   rl  µ  s   zDrawing.drawc                 C   s2   | j }| j}| j}|dkr||9 }||9 }||fS )Nr[  )r‰   rŠ   rR  )r‹   Ú
availWidthÚavailHeightr‰   rŠ   rR  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î   r‰   rŠ   r  r   r   r   rî   Å  s   
zDrawing.expandUserNodesc                 C   s   |   |  | j| j¡¡S )zReturns a copy)r  r·   r‰   rŠ   r¸   r   r   r   r¹   Ì  r  zDrawing.copyc                 O   s   |   t|i |¤Ž¡S r_   )r  rØ   )r‹   r(  r6  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}	|sft| d| jjd ƒ}t| d	dƒ}
t|
d
ƒr9|
| ƒ}
t|d
ƒrC||
ƒ}n#z||
 }W n t	ye } zt
|ƒ d¡dk r[‚ W Y d}~nd}~ww tj |¡rutj |¡\}}n|p|t| ddƒ}| ¡  tj¡}|s‰d}tj |¡s¡tj t| dtj tjd ¡ƒ|¡}tj |¡s¬t |¡ tj tj ||¡¡}tj |¡}|d dd…  ¡ | jv rÎ|d }dd„ |pÙt| ddgƒD ƒ}|durã|fpét| d|ƒfd }tjjtjjf}| tj_tj_d|v �rOddl m!} |d }|�rt"|d|f ƒ |j#| ||fdt| d|j$ƒit%| dfi |¤Ž¤Ž |	d }	tj&dk�rOddl'}ddl(}| )|¡ *dd¡ | +|¡ d D ]i}||v �r¹dd!l m,} d"||f }|�rot"|||f ƒ t| d#dƒ}|�r’t|d|gƒ}||v �r�t|d$dƒ�s�| -¡  nd}|j#| |f|t| d|j$ƒd%œt%| d&fi |¤Ž¤Ž |	d' | }	|�r¹| .|¡ �qQd(|v �r"zdd)l/m0} W n t1�yØ   dd*l m2} Y nw |d+ }|�rèt"|d,|f ƒ |j#| |f|t| d-d.gƒd t| d-dd/gƒd t| d0|j3ƒt| d|j$ƒt| d1|j4ƒd2œt%| d3fi |¤Ž¤Ž |	d4 }	d5|v �rXdd6l m5} |d7 }|�r<t"|d8|f ƒ |j#| |fdt| d|j$ƒit%| d9fi |¤Ž¤Ž |	d: }	d;|v �rŽdd*l m2} |d< }|�rrt"|d,|f ƒ |j#| |fdt| d|j$ƒit%| d3fi |¤Ž¤Ž |	d= }	d>|v �rÊ|d? }|�r¢t"|d>|f ƒ t6|d@ƒ�}| 7t8|  9¡  :dAtj;¡ƒ¡ W d  ƒ n	1 �sÁw   Y  |	dB }	|\tj_tj_t| dCƒ�rÞ|  <||	¡ |	�rê||	dd…  �pëdS )DzÞSaves 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)
        Ú	seqNumberrÂ   z%4d: zgenerating %s file %sr   ©Ú	rl_configÚfileNamePatternz%03dÚchartIdÚ__call__znot all arguments convertedNÚoutDirrÃ   Ú_override_CWDr   c                 S   s   g | ]}|  ¡ ‘qS r   )Úlowerrz   r   r   r   rZ   þ  r{   z Drawing.save.<locals>.<listcomp>rX  r8  r
   rg  z.pdfÚPDFrj  Ú
showBorderÚ_renderPDF_z/.pdfÚmacÚCAROzPDF )r;  r<  rB  r=  rA  r?  r@  rD  rF  rG  rH  ©ÚrenderPMz%s.%sÚ_drawTimeCollectorÚdisabled©Úfmtrj  Ú
_renderPM_z/.r:  ©ÚrenderPS_SEP©ÚrenderPSz.epsÚEPSÚEPS_infoÚTestingÚ	ReportLabÚpreviewÚ	ttf_embed)ÚtitleÚdeptÚcompanyrŽ  rj  r�  Ú
_renderPS_z/.epsrE  )Ú	renderSVGz.svgÚSVGÚ_renderSVG_z/.svgr9  z.psz/.psrC  z.pyÚwbÚ
z/.pyÚ
saveLogger)=rø   r[   ÚintÚ	reportlabrs  rÌ   r·   r   r‡   Ú	TypeErrorrc  ÚfindÚosÚpathÚisabsÚsplitÚrstripÚsepÚjoinÚdirnameÚsysÚargvÚisdirÚmakedirsÚnormpathÚsplitextry  Ú
_saveModesr   ÚwarnOnceÚenabledÚinfoOncerk  rh  rÅ   Ú
drawToFilerj  r7  ÚplatformÚmacfsÚ
macostoolsÚFSSpecÚSetCreatorTypeÚtouchedr€  ÚclearÚsaveÚrlextra.graphicsr‡  ÚImportErrorr‰  Úeps_previewÚeps_ttf_embedr”  ÚopenÚwriter   rf  rd  Úlinesepr™  )r‹   rX  r
   ÚfnRootrw  r�  r6  ÚgenFmtrs  Úextru  ÚerrÚfnrootÚplotModeÚ_savedrh  Úfilenamer²  r³  ÚbmFmtr€  ÚdtcÚdtcfmtsr‰  r”  r­   r   r   r   r¸  Ó  sÜ   




 €ý0 
2


2€
ÿÿùø	
ÿþþ
0
ÿzDrawing.savec           	      K   s  |dv s
J d| ƒ‚ddl m} |dkrddlm} | | ¡S |dv rAddlm} |j| f|t| d	|jƒd
œt| dfi |¤Ž¤ŽS |dkrjzddl	m
} W n ty\   ddlm} Y nw |j| |t| d	|jƒd�S |dkr€ddlm} |j| t| d	|jƒd�S |dkrˆ|  ¡ S dS )z,Converts to an 8 bit string in given format.)r8  r9  r:  r;  r<  r=  r>  rD  ÚppmrA  rB  rC  r@  r?  rF  rG  rH  zUnknown file format "%s"r   rr  r8  rg  )r;  r<  rB  rA  r=  r?  r@  rD  rË  rF  rG  rH  r  r{  rƒ  r…  r:  r†  rˆ  )rŽ  rj  r9  ri  rC  N)r›  rs  rk  rh  ÚdrawToStringr€  rÌ   rj  r7  r¹  r‡  rº  r‰  rf  )	r‹   Úformatr
   rŽ  r6  rs  rh  r€  r‰  r   r   r   ÚasStringK  s8   
ÿÿÿþÿzDrawing.asStringÚfitc                 C   sP  |   ¡ }| j}| j}t||g|¢R Ž }	|	 ¡ \}
}}}|dks7|dkrX|
|k s7||| ks7||k s7||| krX||
 | | |	_|| | | |	_dddd||
 || f|	_|	S |dksj|dkr€|
|k sj||| kr€||
 | | |	_dddd||
 df|	_|	S |dks’|dkr¦||k s’||| kr¦|| | | |	_ddddd|| f|	_|	S )	z?return a base class drawing which ensures all the contents fitsrÏ  Úexpandr   r   ÚfitxÚexpandxÚfityÚexpandy)r÷   r‰   rŠ   rë   rÖ   r    )r‹   ÚkindÚlpadÚrpadÚbpadÚtpadr   ÚoWÚoHr�   ÚxLÚyLÚxHÚyHr   r   r   Úresizedf  s$   8$ú$ýzDrawing.resized)rY  rZ  )NNNNrÂ   r9   )rÏ  r   r   r   r   )r   r   r   rŽ   r¬  r×   rå   ÚisNumberÚisValidChildOrNoneÚOneOfÚisStringOrNoneÚisNumberOrNoner  rØ   Ú
SequenceOfrÊ   rÀ   r•   rf  r   rl  ro  rî   r¹   rp  r¸  rÎ  rà  r   r   r   r   rë   {  sF    





õÿýýÿ

		

xrë   c                   @   ó   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 |ƒ}|r&t|dƒr&d|jvr|j ¡ |_|r|du rt }t||ƒ|j|< t|dƒr@|r@|r8| |||¡ dS | ||¡ dS |rJt|||ƒ dS t	dƒ‚)zb
        effectively setattr(obj,name,value), but takes care of things with _attrMaps etc
        rÊ   Nrâ   zCan't add, need name)
ræ   r‡   r¼   rÊ   rá   rå   rê   râ   r‘   Ú
ValueError)r‹   rð   r”   rÈ   rÍ   rÚ   r  Úivcr   r   r   Ú_add{  s   
z_DrawingEditorMixin._add©NNNN)r   r   r   rŽ   rê  r   r   r   r   r]  y  ó    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   rG   z#Line cap 0=butt, 1=round & 2=squarerÜ   z$Line join 0=miter, 1=round & 2=bevelz$miter limit control miter line joinsz7a sequence of numbers represents on and off, e.g. (2,1)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Á   ©r‹   r6  r   r   r   r•   ž  s   
zLineShape.__init__N)r   r   r   r×   rå   ÚisColorOrNonerá  rã  ÚisListOfNumbersOrNoneÚ	isOpacityr  rÊ   r•   r   r   r   r   rí  �  s    



÷rí  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Ü   )rW  rœ   r�   rž   rŸ   c                 K   ó(   t  | |¡ || _|| _|| _|| _d S r_   )rí  r•   rœ   r�   rž   rŸ   )r‹   rœ   r�   rž   rŸ   r6  r   r   r   r•   °  ó
   
zLine.__init__c                 C   s   | j | j| j| jfS )rÔ   )rœ   r�   rž   rŸ   r¸   r   r   r   rÖ   ·  s   zLine.getBoundsN)
r   r   r   r×   rí  rå   rá  rÊ   r•   rÖ   r   r   r   r   ró  ¨  s    



üró  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Ù   )rW  r.   r*   r+   r-   r/   c                 C   s    t d | _d | _t | |¡ d S )Nr.   )rî  r.   r*   rí  r•   rï  r   r   r   r•   Æ  s   
zSolidShape.__init__N)r   r   r   r×   rí  rå   rð  rò  r  rã  r   r   rÊ   r•   r   r   r   r   rö  »  s    


ûrö  rI   )rG   rG   é   r   )ÚmoveToÚlineToÚcurveToÚ	closePathc                 C   sÄ   | j }d}d}d}| }| jD ];}	|	tkr,|r(|r(|
tkr(|d7 }|r(|t ƒ  |d7 }t|	 }|| }||	 |||… Ž  |}|	tkrH|d7 }|	}
q|r^|r^|
tkr^|d7 }|r^|t ƒ  ||kS )zHelper function for renderers.r   r   )r¬   Ú	operatorsÚ_MOVETOÚ
_CLOSEPATHÚ_PATH_OP_ARG_COUNT)rŸ  Ú	drawFuncsÚ	countOnlyÚ
forceCloser¬   r©   ÚhadClosePathÚ	hadMoveToÚactiveÚoprø   ÚnArgsÚjr   r   r   Ú_renderPathÒ  s2   


r	  znon-zeroÚnonzerozeven-oddÚ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„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.rE  r8  )rW  r¬   rü  Ú
isClipPathÚ	autocloser/   Nr   c                 K   sX   t  | |¡ |d u rg }|d u rg }t|ƒd dksJ dƒ‚|| _|| _|| _|| _d S ©NrG   r   ú-Point list must have even number of elements!)rö  r•   rl   r¬   rü  r  r  )r‹   r¬   rü  r  r  r/   r6  r   r   r   r•     s   
zPath.__init__c                 C   s2   |   | jd d … | jd d … ¡}| |  ¡ ¡ |S r_   )r·   r¬   rü  rÁ   r¿   ©r‹   Únewr   r   r   r¹     s    z	Path.copyc                 C   ó    | j  ||g¡ | j t¡ d S r_   )r¬   rú   rü  r¡   rý  r  r   r   r   rø    ó   zPath.moveToc                 C   r  r_   )r¬   rú   rü  r¡   Ú_LINETOr  r   r   r   rù    r  zPath.lineToc                 C   s(   | j  ||||||g¡ | j t¡ d S r_   )r¬   rú   rü  r¡   Ú_CURVETO)r‹   rœ   r�   rž   rŸ   Úx3r£   r   r   r   rú    s   zPath.curveToc                 C   s   | j  t¡ d S r_   )rü  r¡   rþ  r¸   r   r   r   rû  !  r8   zPath.closePathc                 C   s  | j }ztg }|j}|j}g }|j}|j}d}| jD ]O}	t|	 }
||
 }|
dkr6||| ƒ |||d  ƒ n0|
dkrf|||d… \}}}|t|d |||ƒƒ ||d |d… \}}}|t|d |||ƒƒ |}qt|ƒt|ƒt|ƒt|ƒfW S    t|ƒ Y S )Nr   rG   r   r÷  rg   )	r¬   r¡   rú   rü  rÿ  r¨   r}   rk   r°   )r‹   r¬   r€   ÚaXÚeXr�   ÚaYÚeYr©   r  r  r  rœ   rž   r  r�   rŸ   r£   r   r   r   rÖ   $  s0   
zPath.getBounds)NNr   NN)r   r   r   rŽ   r×   rö  rå   ÚisListOfNumbersr  ÚNoneOrrã  r   r   rÊ   r•   r¹   rø  rù  rú  rû  rÖ   r   r   r   r   r  ù  s     û
r  c                 C   s  |d u r|}g }ddl m}	m}
m} |d }|| }|| }||k r,|d|  }||k s"t|| ƒ}|j}|dkrXt||p>dƒ}|| }tt|| d ƒdƒ}|| }|d7 }nd}d}t	|ƒD ]}|||  }|| ||
|ƒ  |||	|ƒ  fƒ q`|r�| 
¡  |S )	Nr   ©r   r   r   ç     €f@rG   çü©ñÒMbP?r[  ç      à?r   )Úmathr   r   r   rN   r¡   r}   rk   rš  r«   Úreverse)ÚcenterxÚcenteryÚradiusÚstartangledegreesÚendangledegreesÚyradiusÚdegreedeltar#  r¬   r   r   r   ÚdegreestoradiansÚ
startangleÚendangler?   r@   Úradiansdeltarf   r   r   r   ÚgetArcPointsB  s0   ÿ
&r/  c                   @   rç  )ÚArcPathzPath with an addArc methodNc
              
   C   sf   t ||||||||	d�}
|st| jƒs$|  |
d d |
d d ¡ |
d= |
D ]
\}}|  ||¡ q&d S )N)r)  r*  r#  r   r   )r/  rl   rü  rø  rù  )r‹   r$  r%  r&  r'  r(  r)  r*  rø  r#  rû   r`   r~   r   r   r   ÚaddArc`  s
   zArcPath.addArcrë  )r   r   r   rŽ   r1  r   r   r   r   r0  ^  rì  r0  c                 K   sæ   g }g }| D ]B}t |ƒs|}g }	n
|d }|dd … }	|tvr%td| ƒ‚t |¡}
t|	ƒt|
 kr<td|t|	ƒf ƒ‚| |
¡ | t	|	ƒ¡ q|df|dffD ]\}}t
|t|ƒdƒD ]
}|| | ||< q]qQt|||fi |¤ŽS )Nr   r   zbad operator name %sz%s bad arguments %srG   )r   Ú_PATH_OP_NAMESrè  rþ   rl   rÿ  rc  r¡   rú   rb   r«   r  )ÚpathSegsr  r5   r6   r6  ÚOrû   ÚsegÚopNamer(  r  r¦   re  r©   r   r   r   Ú
definePathg  s(   

ÿr7  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)rW  r`   r~   r‰   rŠ   ÚrxÚryr   c                 K   s4   t  | |¡ || _|| _|| _|| _|| _|| _d S r_   )rö  r•   r`   r~   r‰   rŠ   r;  r<  )r‹   r`   r~   r‰   rŠ   r;  r<  r6  r   r   r   r•   ‰  s   
zRect.__init__c                 C   ó*   |   | j| j| j| j¡}| |  ¡ ¡ |S r_   )r·   r`   r~   r‰   rŠ   rÁ   r¿   r  r   r   r   r¹   ’  ó   z	Rect.copyc                 C   ó    | j | j| j | j | j| j fS r_   ©r`   r~   r‰   rŠ   r¸   r   r   r   rÖ   —  s    zRect.getBoundsN)r   r   )r   r   r   rŽ   r×   rö  rå   rá  rÊ   r•   r¹   rÖ   r   r   r   r   r8  }  s    

ú
		r8  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.r9  rÜ   r:  N)rW  r`   r~   r‰   rŠ   rŸ  c                 K   s.   t  | |¡ || _|| _|| _|| _|| _d S r_   )rö  r•   r`   r~   r‰   rŠ   rŸ  )r‹   r`   r~   r‰   rŠ   rŸ  r6  r   r   r   r•   ¥  s   
zImage.__init__c                 C   ó.   |   | j| j| j| j| j¡}| |  ¡ ¡ |S r_   )r·   r`   r~   r‰   rŠ   rŸ  rÁ   r¿   r  r   r   r   r¹   ­  s   z
Image.copyc                 C   r?  r_   r@  r¸   r   r   r   rÖ   ²  r  zImage.getBounds)r   r   r   rŽ   r×   rö  rå   rá  rå  rÊ   r•   r¹   rÖ   r   r   r   r   rA  š  s    

ûrA  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)rW  ÚcxÚcyr]   c                 K   s"   t  | |¡ || _|| _|| _d S r_   )rö  r•   rG  rH  r]   )r‹   rG  rH  r]   r6  r   r   r   r•   ¾  s   
zCircle.__init__c                 C   ó&   |   | j| j| j¡}| |  ¡ ¡ |S r_   )r·   rG  rH  r]   rÁ   r¿   r  r   r   r   r¹   Ä  ó   zCircle.copyc                 C   s,   | j | j | j| j | j | j | j| j fS r_   )rG  r]   rH  r¸   r   r   r   rÖ   É  ó   ,zCircle.getBoundsN©r   r   r   r×   rö  rå   rá  rÊ   r•   r¹   rÖ   r   r   r   r   rC  ¶  s    


ýrC  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 )ÚEllipserD  rÜ   rE  zx radiuszy radius)rW  rG  rH  r;  r<  c                 K   rô  r_   )rö  r•   rG  rH  r;  r<  )r‹   rG  rH  r;  r<  r6  r   r   r   r•   Ô  rõ  zEllipse.__init__c                 C   r=  r_   )r·   rG  rH  r;  r<  rÁ   r¿   r  r   r   r   r¹   Û  r>  zEllipse.copyc                 C   s,   | j | j | j| j | j | j | j| j fS r_   )rG  r;  rH  r<  r¸   r   r   r   rÖ   à  rK  zEllipse.getBoundsNrL  r   r   r   r   rM  Ì  s    



ürM  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 anglerD  rÜ   rE  rF  ztreat as annular ring)
rW  r$  r%  r&  r'  r(  r)  Úradius1Úyradius1Úannularr   NFc           	      K   sV   t  | |¡ ||k r|d }||k s
|||||f\| _| _| _| _| _|| _|| _d S )Nih  )	rö  r•   r$  r%  r&  r'  r(  r)  rQ  )	r‹   r$  r%  r&  r'  r(  r)  rQ  r6  r   r   r   r•   õ  s   ÿÿ
zWedge.__init__c                 C   sH   t | dd ƒ}|d u r| j}t | dd ƒ}t | d|ƒ}|d u r|}|||fS )Nr)  rO  rP  )rÌ   r&  )r‹   r)  rO  rP  r   r   r   Ú
_xtraRadii   s   
zWedge._xtraRadiic                 C   sx  | j }| j}| j}|  ¡ \}}}| j}| j}ddlm}	m}
m	} |d }|| }|| }||k r:|d|  }||k s0t
|| ƒ}g }|dkrft| jpKd|ƒ}|| }tdt|| d ƒƒ}|| }|d7 }nd}d}g }|j}|j}t|ƒD ]}|||  }||
|ƒ|	|ƒfƒ qv|D ]\}}||||  ƒ ||||  ƒ q‹|dks¨|d u r¹|dks°|d u r¹||ƒ ||ƒ n| ¡  |D ]\}}||||  ƒ ||||  ƒ q¿| j�r8tt| d	d ƒd
�}| |d |d ¡ tdd| dƒD ]}| || ||d  ¡ qó| ¡  | |d|  |d| d  ¡ td| d d| dƒD ]}| || ||d  ¡ �q"| ¡  |S t|ƒS )Nr   r  r  rG   r   r[  r   r!  r/   )r/   rI   )r$  r%  r&  rR  r'  r(  r"  r   r   r   rN   r}   r*  rk   rš  r¡   r   r#  rQ  r  rÌ   rø  rù  rû  ÚPolygon)r‹   r$  r%  r&  r)  rO  rP  r'  r(  r   r   r   r+  r,  r-  r?   r¬   r*  r.  rf   ÚCAÚCAAr@   r¥   re   rû   r`   r   r   r   Ú	asPolygon  sd   ÿ
  zWedge.asPolygonc                 C   rB  r_   )r·   r$  r%  r&  r'  r(  rÁ   r¿   r  r   r   r   r¹   C  s   üz
Wedge.copyc                 C   s   |   ¡  ¡ S r_   )rV  rÖ   r¸   r   r   r   rÖ   L  s   zWedge.getBounds)NF)r   r   r   rŽ   r×   rö  rå   rá  rå  r  rÊ   r*  r•   rR  rV  r¹   rÖ   r   r   r   r   rN  ã  s*    



÷
ÿ7	rN  c                   @   ó@   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 )rS  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Ü   ©rW  r¬   c                 K   s2   t  | |¡ t|ƒd dksJ dƒ‚|pg | _d S r  )rö  r•   rl   r¬   )r‹   r¬   r6  r   r   r   r•   W  s   zPolygon.__init__c                 C   ó   |   | j¡}| |  ¡ ¡ |S r_   ©r·   r¬   rÁ   r¿   r  r   r   r   r¹   \  ó   zPolygon.copyc                 C   ó
   t | jƒS r_   ©rµ   r¬   r¸   r   r   r   rÖ   a  ó   
zPolygon.getBoundsN)r   r   r   rŽ   r×   rö  rå   r  rÊ   r•   r¹   rÖ   r   r   r   r   rS  O  s    
ÿrS  c                   @   rW  )ÚPolyLinez–Series of line segments.  Does not define a
    closed shape; never filled even if apparently joined.
    Put the numbers in the list, not two-tuples.rX  rÜ   rY  c                 K   sz   t  | |¡ |p	g }t|ƒ}|r8t|d ƒr,g }|D ]\}}| |¡ | |¡ q|}nt|ƒd dks8J dƒ‚|| _d S )Nr   rG   r  )rí  r•   rl   r   r¡   r¬   )r‹   r¬   r6  Ú	lenPointsr—   r`   r~   r   r   r   r•   m  s   

zPolyLine.__init__c                 C   rZ  r_   r[  r  r   r   r   r¹   |  r\  zPolyLine.copyc                 C   r]  r_   r^  r¸   r   r   r   rÖ   �  r_  zPolyLine.getBoundsN)r   r   r   rŽ   r×   rí  rå   r  rÊ   r•   r¹   rÖ   r   r   r   r   r`  d  s    
ÿr`  c           
      C   sH   t | d|ƒ}| |¡}|dkr"t | ddƒ}	|	t|d |… |||ƒ }|S )NÚ_dpr   Ú_dpLen)rÌ   Úrfindr   )
ÚtArm   rj   r1   r0   ÚencodingÚpivotCharacterÚdpr©   ÚdpOffsr   r   r   ÚnumericXShift„  s   
rj  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ƒ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 fontr3   Úmiddleri   Únumericz(treat (x,y) as one of the options below.)r`   r~   rm   r1   r0   r.   r2   rf  Úutf8c                 K   sD   || _ || _|| _d| _td | _td | _td | _|  |¡ d S )Nr3   r1   r0   r.   )	r`   r~   rm   r2   rî  r1   r0   r.   rÁ   )r‹   r`   r~   rm   r6  r   r   r   r•   �  s   


zString.__init__c                 C   s   | j t| j| j| j| jƒ S r_   )r`   r   rm   r1   r0   rf  r¸   r   r   r   ÚgetEast§  s   zString.getEastc                 C   rI  r_   )r·   r`   r~   rm   rÁ   r¿   r  r   r   r   r¹   ª  rJ  zString.copyc                 C   sž   | j }t|| j| j| jƒ}| j}| j}|dkr=|dkr"|d| 8 }n|dkr+||8 }n|dkr=|t|||| j| j| jƒ8 }|| jd| j  || | j| j fS )Nr3   rl  r!  ri   rm  gš™™™™™É?)	rm   r   r1   r0   rf  r2   r`   rj  r~   )r‹   rq   rj   re  r`   r   r   r   rÖ   ¯  s   
$zString.getBounds)r   r   r   rŽ   r×   rå   rá  ÚisStringrð  rã  rÊ   rf  r•   ro  r¹   rÖ   r   r   r   r   rk  Œ  s"    





ø

rk  c                   @   rƒ   )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   rÓ   )zºOverride 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.z4this method must be redefined by the user/programmerrÕ   r¸   r   r   r   rí   Æ  s   zUserNode.provideNodeN)r   r   r   rŽ   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'   rZ  é2   r   za Rectangle: z
verifying...z OK
zdeleting rect.width zverifying...)r8  r   r¦  Ústdoutr¾  r¿   rÐ   r‰   )r]   r   Úpprj   r   r   r   ÚtestÍ  s   rt  Ú__main__r_   )r   r-  )FF)NNN)mÚ__version__rŽ   rž  r¦  r"  r   r   r   r   r   r   Úreportlab.platypusr   Úreportlab.rl_configr	   r
   r   Ú_baseGFontNamer   r   Úreportlab.libr   r   Úreportlab.lib.validatorsÚreportlab.lib.utilsr   r   r  ÚisNumberInRangerò  Úreportlab.lib.attrmapÚreportlab.lib.rl_accelr   Úreportlab.pdfbase.pdfmetricsr   Úreportlab.lib.fontsr   Úreportlab.pdfgen.canvasr   r   r›  r   Ú_baseGFontNameBÚ_baseGFontNameIÚ_baseGFontNameBIÚ	Exceptionr   ÚNON_ZERO_WINDINGÚEVEN_ODDÚblackrî  r4   r7   r<   rA   rD   rF   rM   rR   rU   rV   r^   rd   rw   r‚   r„   r�   r    r¨   r°   rµ   r¶   rØ   r   r&  r/  r7  rë   r]  rí  ró  rö  rb   r«   rý  r  r  rþ  rÿ  r2  r	  Ú_fillModeMapr  r"  r/  r0  r7  r8  rA  rC  rM  rN  rS  r`  rj  rk  rì   rt  r   r   r   r   r   Ú<module>   sö   	ÿüûúùø	÷
öõôóòðïíìë"

5M 
?

)	 
ù
G
	l 2

ÿ