o
    `bdp                  
   @   s  d Z dZddlT ddlmZmZ ddlmZmZ ddl	m
Z
 ddlmZ dd	lmZmZ dd
lZdd
lZddlmZmZ ddlmZmZmZmZ zddlmZ W n ey` Z zedd
Z[ww dd Zdd Z ej!fddZ"ddlm#Z# G dd de#Z$dd Z%dd Z&dd Z'd7ddZ(d Z)G d!d" d"Z*d#d$d
ej!ej+fd%d&Z,d#d$d
ej!ej+fd'd(Z-d#d$d
ej!ej+fd)d*Z.d+d#d$d
ej!ej+fd,d-Z/d+d#d$d
ej!ej+fd.d/Z0e/Z1d8d2d3Z2e3d4kre2d5d6 d
S d
S )9z3.3.0a$  Render drawing objects in common bitmap formats

Usage::

    from reportlab.graphics import renderPM
    renderPM.drawToFile(drawing,filename,fmt='GIF',configPIL={....})

Other functions let you create a PM drawing as string or into a PM buffer.
Execute the script to see some test drawings.    )*)getStateDeltarenderScaledDrawing)getFont
unicode2T1)	isUnicode)	rl_config   )setFontRenderPMErrorN)BytesIOStringIO)sincospiceil)	_renderPMzNo module named _renderPM
it may be badly or not installed!
You may need to install development tools
or seek advice at the users list see
https://pairlist2.pair.net/mailman/listinfo/reportlab-usersc                  C   s0   z	ddl m}  W | S  ty   dd l} Y | S w )Nr   Image)PILr   ImportErrorr    r   =/usr/lib/python3/dist-packages/reportlab/graphics/renderPM.py	_getImage"   s   
r   c                 C   sF   | r!dt d| j @ d> dt d| j @ d> B dt d| j @ B S | S )N         )intZredZgreenZblue)cr   r   r   	Color2Hex)   s   Br   c                 C   s"   t  }|jt| ||||d dS )z
As it saysshowBoundaryN)_PMRendererdrawr   )drawingZcanvasxyr!   Rr   r   r   r#   /   s   r#   )Rendererc                   @   s   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zd ddZdd Zdd Zdd Zdd ZdS )!r"   zThis draws onto a pix map image. It needs to be a class
    rather than a function, as some image-specific state tracking is
    needed outside of the state info in the SVG model.c                 C   s   | j   |   d S N)_trackerpop
applyStateselfr   r   r   r+   :   s   
z_PMRenderer.popc                 C   s    t |}| j| |   d S r)   )r   r*   pushr,   )r.   nodedeltasr   r   r   r/   >   s   z_PMRenderer.pushc                 C   s  | j  }|d | j_|d | j_|d }|d ur|| j_| j|d  |d | j_|d | j_|d | j_	|d }|s@d }nt
|ttfsJ|f}t|d	ksYt
|d
 ttfs]d|f}|| j_|d }|d urm|| j_| j|d  | j|d |d  d S )NctmstrokeWidthstrokeOpacitystrokeColorZstrokeLineCapZstrokeLineJoinfillModeZstrokeDashArray   r	   r   fillOpacity	fillColorfontNamefontSize)r*   getState_canvasr2   r3   r4   setStrokeColorlineCaplineJoinr6   
isinstancelisttuplelen	dashArrayr8   setFillColorr
   )r.   salphadar   r   r   r,   C   s.   
z_PMRenderer.applyStatec                 C   s@   | j jd }| jjdd ||f |d< | j | |   d S )Nr      Z	transform)r*   Z	_combinedr=   _baseCTMr/   r,   )r.   r%   r&   r1   r   r   r   	initState]   s   z_PMRenderer.initStatec                 C   s    |  | | | |   dS )zEThis is the recursive method called for each node
        in the treeN)r/   ZdrawNodeDispatcherr+   )r.   r0   r   r   r   drawNodec   s   

z_PMRenderer.drawNodec                 C   sb   | j }|j|j  krdkrn n||j|j|j|j d S ||j|j|j|j|j|j d S )Nr   )	r=   rxryrectr%   r&   widthheight	roundRect)r.   rQ   r   r   r   r   drawRectp   s   $z_PMRenderer.drawRectc                 C   s   | j |j|j|j|j d S r)   )r=   linex1y1x2y2)r.   rV   r   r   r   drawLinex   s   z_PMRenderer.drawLinec              
   C   s   |j }t|tr|rtj |sd S t |d}nt|dr'|d}nd S |j	\}}|j
|j}}|d u r;|}|d u rA|}| j|j|j||| jjdkrR|nt|drZ|jn|j ||d d S )NRGBconvert	rlPyCairotobytes   )pathrA   strosisfiler   openr]   hasattrsizerR   rS   r=   Z	_aapixbufr%   r&   _backendr_   tostring)r.   Zimagera   imZsrcWZsrcHZdstWZdstHr   r   r   	drawImage{   s"   


z_PMRenderer.drawImagec                 C   s&   | j }||j|j|j |  d S r)   )r=   circlecxcyrfillstrokepath)r.   rl   r   r   r   r   
drawCircle   s   z_PMRenderer.drawCircler   c                 C   s   |j }t|dksJ d| j}|  ||d |d  tdt|dD ]}||| ||d   q&|r?|  |  |	  d S )Nr7   z#Polyline must have 1 or more pointsr   r	   )
ZpointsrD   r=   	pathBeginmoveTorangelineTo	pathClosepathFill
pathStroke)r.   Zpolyline_doClosePr   ir   r   r   drawPolyLine   s   z_PMRenderer.drawPolyLinec                 C   s*   | j }||j|j|j|j |  d S r)   )r=   ellipserm   rn   rO   rP   rp   )r.   r}   r   r   r   r   drawEllipse   s   z_PMRenderer.drawEllipsec                 C   s   | j |dd d S )Nr	   )ry   )r|   )r.   Zpolygonr   r   r   drawPolygon      z_PMRenderer.drawPolygonc                 C   s  | j }|j}t|dd}|d us|r| j }|d }|d }|d }|j}	|j}
|j}|dvrct|	||}|dkr?|
|8 }
n$|dkrJ|
|d	 8 }
n|d
kr[|
t	||	||||j
8 }
ntdt| |j}||_z|j|
||	||fd W ||_d S ||_w d S )NtextRenderModer   Z
textAnchorr:   r;   )startZ	inheritedendmiddler7   numericzbad value for textAnchor )	_fontInfo)r=   r9   getattrr*   r<   textr%   r&   stringWidthnumericXShiftencoding
ValueErrorrb   r   
drawString)r.   Z	stringObjZcanvfillr   Stext_anchorr:   r;   r   r%   r&   textLenZoldTextRenderModer   r   r   r      s4   

z_PMRenderer.drawStringc           	         s  | j tu r)jd= jr#jd }|j}d|_| | ||_d S   d S ddlm  jj	j
jftdd}d fdd		}jrY|    j jd u}jd u}td
d}|dkr|r|r|dd | |    d S |r|dd | d S |r|    d S d S |dkr|dd |r| |r  d S d S | r|   d S )NrJ   r	   r   )_renderPath	autoclose Fc                    s       | dS )NZ
forceClose)rr   r   r   r   Z	drawFuncsra   r   r   rP   s   z _PMRenderer.drawPath.<locals>.rPr6   svgTr   pdf)F)r=   ZEmptyClipPath
_clipPathsZ
isClipPathdrawPathZclipPathClearreportlab.graphics.shapesr   rs   ru   curveTorv   r   ZclipPathSetappendr9   r5   rw   rx   )	r.   ra   rz   Zicpr   r   r   stroker6   r   r   r   r      s\   









z_PMRenderer.drawPathN)r   )__name__
__module____qualname____doc__r+   r/   r,   rM   rN   rU   r[   rk   rq   r|   r~   r   r   r   r   r   r   r   r"   5   s     
r"   c                 C   s   t  }| jd|j|jdS )Nrz   ZditherZpalette)r   r]   NONEADAPTIVE)rj   r   r   r   r   _convert2pilp   s   r   c                 C   
   |  dS )NLr]   rj   r   r   r   _convert2pilL      
r   c                 C   r   )N1r   r   r   r   r   _convert2pil1   r   r   c           	      C   s   t | } | j\}}t||t| dr| jn| j | j }t|ds^t	t
j|d d |  d}|| W d    n1 sDw   Y  t
jdkr\ddlm} ||dd	 d S d S || d S )
Nr_   writer   .wbmacmarkfilenamePICText)r   rg   r   Zpil2pictrf   r_   ri   rj   Z
getpalettere   rc   ra   splitextlowerr   namereportlab.lib.utilsr   )	rj   fnfmttransparentZcolsZrowsrG   fr   r   r   r   _saveAsPICT  s   
*
$
r   gOQ?c                   @   s  e Zd ZdddejfddZedBdd	ZdCd
dZdd Z	dCddZ
dDddZdd ZdCddZdd Zdd ZdEddZdd Zd d! Zd"d# ZdFd%d&Zd'd( ZdGd*d+Zd,d- ZdEd.d/Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; ZeZd<d= Z d>d? Z!d@dA Z"dS )HPMCanvasH    Nc                 C   s   |d }t || d }t || d }| ||||| jd< || jd< |dd|ddf| jd< g | jd< || jd< || jd	< || jd
< | j| _dS )z-configPIL dict is passed to image save methodg      R@g      ?_gs_bgr   rL   r   	configPIL_dpirh   N)r   
_getGState__dict__rL   r2   )r.   whdpibgr   backendZscaler   r   r   __init__  s   




zPMCanvas.__init__r   RGB24c                 C   sd   |dkrt j| ||dS |dkr,zddlm} W n ty#   tdw || |||dS td| )	Nr   r   r^   r   )GStatez:cannot import rlPyCairo; perhaps it needs to be installed!r   z&Invalid backend, %r, given to PMCanvas)r   gstater^   r   r   r   )r   r   r   r   r   r   r   r   r   r     s   zPMCanvas._getGStatec           	      C   s   |d u r| j }||| j_| j_d d d d d d d d}| j}|j|j}}| D ]	}t||||< q(~| `t	j
|||d }| jd< | D ]
}t| |||  qF||| d S )N)r2   r3   r5   r?   r@   rE   r9   r   r   )r   Z_drawingrR   rS   r   r:   r;   keysr   r   r   r   setattrr
   )	r.   r   r   r   AgsZfNZfSkr   r   r   _drawTimeResize-  s   zPMCanvas._drawTimeResizec                 C   s>   t  jd| jj| jjfd}t|dd pt|d| jj |S )Nr\   )rg   Z	frombytesZ
fromstring)r   newr   rR   rS   r   pixBuf)r.   rj   r   r   r   toPIL;  s   zPMCanvas.toPILc              
   C   s|  |   }|d u r(t|tstdt| tj|d }|dr(|dd  }| j	p,i }|
dd  |d}|r>||}| }|dv rKt|}nF|dv ro|drYt|}n|drct|}n	|d	rlt|}d
}n"|dv rt||||dd dS |dv rn|dv rd}ntd| |d
kr|dd }|rddlm}m} ddg }	td| D ]
\}
}d|	|
| < q|d| |||	dddg dg f }d| jfdfD ]\}}|||||< q|
dd |drddlm} ||}|
dd  |d}|r||}|j||fi | t |ds:tj!dkr<ddl"m#} |||d  d S d S d S )!Nz*Invalid value '%s' for fn when fmt is Noner	   r   preConvertCBGIF)TIFFZTIFFPZTIFFLZTIFZTIFF1rz   r   r   r   )ZPCTr   r   )r   )ZPNGZBMPZPPM)ZJPGJPEGr   zUnknown image kind %sr   )
ImageChopsr   i   )r      i   r   ZRGBAZ
resolution)zresolution unitZinchZchops_invert)r   	preSaveCBr   r   r   r   )$r   rA   rb   r   asciirc   ra   r   
startswithr   
setdefaultr+   upperr   endswithr   r   r   getr   r   r   r   zipZ
bitmap_rgbZmergesplitinvertZpointr]   r   saverf   r   r   r   )r.   r   r   rj   r   r   Ztcr   r   Tor   adr   r   r   r   r   
saveToFile@  sh   









:

zPMCanvas.saveToFiler   c                 C   s   t  }| j||d | S )Nr   )r   r   getvalue)r.   r   rG   r   r   r   saveToStringx  s   zPMCanvas.saveToStringc           	      C   s   ddl }| j}|j|j|j}}}||ddt|d ddd||dd
 |d	 }tt|d| D ]}|||| |  q4|d
 dS )z
        Niki Spahiev, <niki@vintech.bg>, asserts that this is a respectable way to get BMP without PIL
        f is a file like object to which the BMP is written
        r   Nz=2sLLLLLLhh24xZBM6   (   r	      r`   z              )	structr   r   rR   rS   r   ZpackrD   rt   )	r.   r   r   r   ZpixrR   rS   Zrowbr   r   r   r   
_saveToBMP}  s   *zPMCanvas._saveToBMPc                 C      t | j|| d S r)   )_setFontr   )r.   r:   r;   Zleadingr   r   r   r
     r   zPMCanvas.setFontc                 C   r   r)   )r   r   )r.   r   valuer   r   r   __setattr__  r   zPMCanvas.__setattr__c                 C   s   t | j|S r)   )r   r   )r.   r   r   r   r   __getattr__  s   zPMCanvas.__getattr__r	   c                 C   s    |r|    |r|   d S d S r)   )rw   rx   )r.   r   r   r   r   r   rp     s   zPMCanvas.fillstrokepathc                 C   s"  t || dks
J tt| d }tt| d }|||  }	|||  }
tt| d }tt| d }|||  }|||  }| | }|| }t||  d }t ddt|  t| }|	||  }|
||  }| | }|| }|||  }|||  }|	|
f||f||f||fffS )a-  compute the control points for a bezier arc with theta1-theta0 <= 90.
        Points are computed for an arc with angle theta increasing in the
        counter-clockwise (CCW) direction.  returns a tuple with starting point
        and 3 control points of a cubic bezier curve for the curvto opertatorZ   g     f@g     v@gUUUUUU?g      ?)absr   r   r   )r.   rm   rn   rO   rP   theta0theta1Zcos0Zsin0x0y0Zcos1Zsin1x3y3Zdx1Zdy1ZhalfAngr   rW   rX   Zdx2Zdy2rY   rZ   r   r   r   _bezierArcSegmentCCW  s(   

zPMCanvas._bezierArcSegmentCCWc              	   C   s   || }t |dkr||fg}n*ttt |d }	t||	 }
g }t|	D ]}|||
  }||
 }|||f q&g }|D ]-\}}|sX| ||||||\\}}}|| q>| ||||||\\}}}|| q>||f|fS )zreturn a set of control points for Bezier approximation to an arc
        with angle increasing counter clockwise. No requirement on (theta1-theta0) <= 90
        However, it must be true that theta1-theta0 > 0.g     V@)r  r   r   floatrt   r   r
  )r.   rm   rn   rO   rP   r  r  ZangularExtentZ	angleListZNfragZ	fragAngleiir   bctrlptsr  r  ZptsZtmpxZtmpyr   r   r   bezierArcCCW  s$   zPMCanvas.bezierArcCCWc              	   C   s\   |  ||||||\\}}}	| || |	D ]\\}
}\}}\}}| |
||||| qdS )zadds an ellisesoidal arc segment to a path, with an ellipse centered
        on cx,cy and with radii (major & minor axes) rx and ry.  The arc is
        drawn in the CCW direction.  Requires: (ang2-ang1) > 0N)r  ru   r   )r.   rm   rn   rO   rP   Zang1Zang2r  r  r  rW   rX   rY   rZ   r  r	  r   r   r   addEllipsoidalArc  s
   zPMCanvas.addEllipsoidalArcr   c                 C   s   | j ||||d d S )Nr   r   )r.   r%   r&   r   r   r   r   r   drawCentredString     zPMCanvas.drawCentredStringc                 C   s   | j |||dd d S )Nr   r  r  )r.   r   r%   r&   r   r   r   drawRightString  r  zPMCanvas.drawRightStringleftc                 C   s*  | j }|j}|j}|r|||fkr|\}	}
t||	|
 n|}	|}
z|dv rMt||	|
}|dkr4||8 }n|dkr?||d 8 }n|dkrM|t||||	|
8 }| jdkrZ|||| nt|	}|j	ri|||| n|}t
|sz|d}W n: ty } z.|jdd	 \}}t|jd d	 d
|jd	 ||d | ||| |||d  f f  d }~ww t||g|j }t|}|d }t|D ]>}|| \}}||krt||j|
 |}|||| ||kr||||j|
7 }qW ||| d S W ||| d S W ||| d S ||| w )N)r   r   r   r   r   g       @r   r^   utf8r7   rK   z%s
%s-->%s<--%s
   r	   )r   r;   r:   r   r   r   rh   r   r   Z_dynamicFontr   decodeUnicodeDecodeErrorargsr   ZsubstitutionFontsrD   rt   ZencNamer
   )r.   r%   r&   r   r   r   r   Zgs_fontSizeZgs_fontNamer:   r;   r   ZfontZfcer{   jZFTnZnm1r   tr   r   r   r     sb   

J	zPMCanvas.drawStringc                 C   s:   | j d ur|   | || | || |   d S d S r)   )r5   rr   rs   ru   rx   )r.   rW   rX   rY   rZ   r   r   r   rV     s   
zPMCanvas.linec                 C   sb   |    | || | || | | || ||  | |||  |   | j||d d S )N)r   r   )rr   rs   ru   rv   rp   )r.   r%   r&   rR   rS   r   r   r   r   r   rQ   #  s   zPMCanvas.rectc           	      C   s   |dkr|}|dkr|}|| }|| }|    | || | | || || ||dd | || || ||dd | || || ||dd | || || ||dd |   |   dS )zrect(self, x, y, width, height, rx,ry):
        Draw a rectangle if rx or rx and ry are specified the corners are
        rounded with ellipsoidal arcs determined by rx and ry
        (drawn in the counter-clockwise direction)r   i  ih  r     N)rr   rs   r  rv   rp   )	r.   r%   r&   rR   rS   rO   rP   rY   rZ   r   r   r   rT   ,  s   zPMCanvas.roundRectc                 C   s   |  |||| dS )zRadd closed path circle with center cx,cy and axes r: counter-clockwise orientationN)r}   )r.   rm   rn   ro   r   r   r   rl   >  s   zPMCanvas.circlec                 C   s\  |    || }|}|}|| }|| }	||t  }
||t  }|}| || | |	|
|||| |}|}|| }|}||t  }	|| }
|}||t  }| |	|
|||| |}|}|}|| }|| }	||t  }
||t  }|| }| |	|
|||| |}|}|| }|}||t  }	|| }
|| }||t  }| |	|
|||| |   dS )zadd closed path ellipse with center cx,cy and axes rx,ry: counter-clockwise orientation
        (remember y-axis increases downward) N)rr   BEZIER_ARC_MAGICrs   r   rv   )r.   rm   rn   rO   rP   r  r  r  r	  rW   rX   rY   rZ   r   r   r   r}   B  sN   zPMCanvas.ellipsec                 C   s   dS )zdo nothing for compatibilityNr   r-   r   r   r   	saveState}  s   zPMCanvas.saveStatec                 C   ,   t || _t|dd }|d ur|| _d S d S NrH   )r   r9   r   r8   r.   ZaColorrH   r   r   r   rF     
   

zPMCanvas.setFillColorc                 C   r#  r$  )r   r5   r   r4   r%  r   r   r   r>     r&  zPMCanvas.setStrokeColorc                 C   
   || _ d S r)   )r?   )r.   Zcapr   r   r   
setLineCap  r   zPMCanvas.setLineCapc                 C   r'  r)   )r@   )r.   joinr   r   r   setLineJoin  r   zPMCanvas.setLineJoinc                 C   r'  r)   )r3   )r.   rR   r   r   r   setLineWidth  r   zPMCanvas.setLineWidth)r   r   r)   r   )r	   r	   )r   )Nr  )#r   r   r   r   renderPMBackendr   staticmethodr   r   r   r   r   r   r
   r   r  rp   r
  r  r  r  r  r   rV   rQ   rT   rl   r}   r"  rF   r>   ZrestoreStater(  r*  r+  r   r   r   r   r     s>    


8

#

2
	;r   r   r   c                 C   s6   t | } t| j| j||||d}t| |dd|d |S )N)r   r   r   r   r   r    )r   r   rR   rS   r#   )r   r   r   r   r!   r   r   r   r   r   drawToPMCanvas  s   r.  c                 C   s   t | |||||d S )Nr   r   r   r!   r   )r.  r   )r   r   r   r   r!   r   r   r   r   	drawToPIL  s   r0  c                 C   s.   t  }t| |||||d}|jd|j|jdS )Nr/  rz   r   )r   r0  r]   r   r   )r   r   r   r   r!   r   r   rj   r   r   r   
drawToPILP  s   r1  r   c           	      C   s$   t | |||||d}||| dS )zocreate a pixmap and draw drawing, d to it then save as a file
    configPIL dict is passed to image save methodr/  N)r.  r   )	r   r   r   r   r   r   r!   r   r   r   r   r   
drawToFile  s   r2  c              	   C   s$   t  }t| ||||||d | S )N)r   r   r   r   r   )r   r2  r   )r   r   r   r   r   r!   r   rG   r   r   r   drawToString  s   r3  pmoutFc              
      s  dd }dd l }ddlm} ddlm |j}g }|j| s$||  d}d}|g}	i }
t	j
dd  }d	d
 |D }|sBg d}n|D ]}|| qDddd
 |D d}g  dd lddlm  fdd}|ttddD ]\}}}|
|dd  }|
|< |dkr|d|d  7 }|r||vrqw|}t|j}t|j}|	d||f  |D ]}|dv r|	d|   z~d|||f }|j| |}|j|r|| |dkrddlm} t|||d|id n|dv r|jddg| |d nt|||d  |d!v r|	d"|  n|dkr#|	d#|  n|dkr/|	d$|  s7d%kr?td&t|  W q t yO   ||| Y qw |j!"d'd(d)kr_d|j#d*< d+D ]}z|j|g| |d W qa   ||| Y qaqw r|	d $d,d-|	d< |	d. |	%  |	| |j| d/}t&|d0}|'|	 W d    n	1 sw   Y  t	j(d1krdd2l)m*} ||d3d4 sԈd%krtd&|  d S d S )5Nc                 S   s   | dkrd} | S )NtiffZtifr   )r%   r   r   r   r     s   ztest.<locals>.extr   )
testshapes)verbosezq<html><head><title>renderPM output results</title></head>
    <body>
    <h1>renderPM results of output</h1>
    z</body>
    </html>
    r	   c                 S   s   g | ]	}| d r|qS )z--ext=)r   .0r   r   r   r   
<listcomp>  s    ztest.<locals>.<listcomp>)gifr5  pngjpgpctpyr   ,c                 S   s   g | ]}|d d qS )   Nr   r8  r   r   r   r:    s    )escapec                    sZ   d| |f }sdkrt |  d|  t }j|d  d|   d S )NzProblem drawing %s fmt=%s filer7   z"<br/><h2 style="color:red">%s</h2>)filez<pre>%s</pre>)printr   r   	print_excr   )r   r   msgbufZerrsrB  shout	tracebackr7  r   r   handleError  s   ztest.<locals>.handleErrorZft_get_face)ZdoTTFz.%02dz%<hr><h2>Drawing %s</h2>
<pre>%s</pre>)r;  r<  r=  r>  z<p>%s format</p>
z%s.%sr>  )whiter   )r   r   )r?  r   r?  r   )formatsoutDirfnRootr   )r;  r<  r=  z<img src="%s" border="1"><br>
z#<a href="%s">python source</a><br>
z<a href="%s">SVG</a><br>
r7   zwrote %sZRL_NOEPSPREVIEW0r   Zpreview)Zepsr   z</h1>z7 <a href="#errors" style="color: red">(errors)</a></h1>z<a name="errors"/>zpm-index.htmlr   r   r   ZHTMLr   )+rc   reportlab.graphicsr6  Zreportlab.rl_configr7  getAllTestDrawingsra   isdirmkdirsysargvremover)  r   rJ  Zxml.sax.saxutilsrB  rf   r   r   r   rR   rS   r   r   rd   Zreportlab.lib.colorsrL  r2  r   rD  r   AttributeErrorenvironr   r   replaceextendre   
writelinesplatformr   r   )rN  rI  r   rc   r6  rR  ZdrawingsZhtmlTopZ
htmlBottomZhtmlnamesrV  Er   rK  r$   Z	docstringr   r{   rO  r   r   r   filenamefullpathrL  ZhtmlFileNamer   r   r   rH  r   test  s   

	






 


$rb  __main__T)rI  r)   )r4  F)4__version__r   r   Zreportlab.graphics.renderbaser   r   Zreportlab.pdfbase.pdfmetricsr   r   r   r   Z	reportlabr   Zutilsr
   r   r   rc   rU  ior   r   Zmathr   r   r   r   rQ  r   r   ZerrMsgr   r   Z_unset_r#   r(   r"   r   r   r   r   r!  r   r,  r.  r0  r1  r2  r3  r   rb  r   r   r   r   r   <module>   sT   
 C
   
`