U
    9g|                     @   s&  d Z dZddlT ddlmZmZ ddlmZmZm	Z	 ddl
mZmZ ddlmZmZ ddlmZ dd	lmZ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$ d@ddZ%ze%ej&Z'W n ek
r   dZ'Y nX dd Z(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  Z0d!d" Z1dAd#d$Z2e3d%d%d&d'Z4d(Z5G d)d* d*Z6d+d,dej+ej&d-fd.d/Z7d+d,dej+ej&d-fd0d1Z8d+d,dej+ej&d-fd2d3Z9d4d+d,dej+ej&d-fd5d6Z:d4d+d,dej+ej&d-fd7d8Z;e:Z<dBd;d<Z=e>d=kr"e=d>d? dS )Cz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stringWidth)	ShapedStrshapeFragWord)	isUnicode	asUnicode)ABag)toColorwhite)	rl_config   )setFontRenderPMErrorN)BytesIOStringIO)sincospiceilc                 C   s   | s
t j} | dkrnzdd l}W q tk
rj } z.zdd l}W n tk
rX   tdY nX W 5 d }~X Y qX n~d|  krzdd l}W q tk
r } z6zdd l}W n$ tk
r   td|  dY nX W 5 d }~X Y qX ntd|  |S )N	_renderPMr   zCannot import desired renderPM backend, {backend}.
No module named _rl_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-userscairoz'cannot import desired renderPM backend z^
Seek advice at the users list see
https://pairlist2.pair.net/mailman/listinfo/reportlab-userszInvalid renderPM backend, )r   renderPMBackendZ_rl_renderPMImportError	rlPyCairor   lower)backendMZerrMsg r!   ?/tmp/pip-unpacked-wheel-w2r18j3o/reportlab/graphics/renderPM.py_getPMBackend   s(     "*r#   c                  C   s2   zddl m}  W n tk
r,   dd l} Y nX | S )Nr   Image)PILr%   r   r$   r!   r!   r"   	_getImage?   s
    r'   c                 C   sF   | rBd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"   	Color2HexF   s     >r.   c                 C   s   | dk	rt | S | S )z
    c should be None or something convertible to Color
    rlPyCairo.GState can handle Color directly in either RGB24 or ARGB32
    N)r   r,   r!   r!   r"   
CairoColorK   s    r/   c                 K   s.   t  }|j| |jt| ||||d dS )z
As it says)showBoundaryN)_PMRenderer__dict__updatedrawr   )drawingZcanvasxyr0   kwdsRr!   r!   r"   r4   S   s    r4   )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 )!r1   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"   rA   c   s    z_PMRenderer.pushc                 C   s  | j  }|d | j_|d | j_|d }|d k	r:|| j_| j|d  |d | j_|d | j_|d | j_	|d }|sd }n:t
|ttfs|f}t|d	kst
|d
 ttfsd|f}|| j_|d }|d k	r|| 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_canvasrD   rE   rF   setStrokeColorlineCaplineJoinrH   
isinstancelisttuplelen	dashArrayrJ   setFillColorr   )r@   salphadar!   r!   r"   r>   h   s.    
z_PMRenderer.applyStatec                 C   sH   | j jd }| jjdd ||f  |d< |d< | j | |   d S )Nr      Z	transformrD   )r<   Z	_combinedrO   _baseCTMrA   r>   )r@   r6   r7   rC   r!   r!   r"   	initState   s    $z_PMRenderer.initStatec                 C   s    |  | | | |   dS )zEThis is the recursive method called for each node
        in the treeN)rA   ZdrawNodeDispatcherr=   )r@   rB   r!   r!   r"   drawNode   s    

z_PMRenderer.drawNodec                 C   s`   | j }|j|j  krdkr<n n||j|j|j|j n ||j|j|j|j|j|j d S )Nr   )	rO   rxryrectr6   r7   widthheight	roundRect)r@   rc   r-   r!   r!   r"   drawRect   s    z_PMRenderer.drawRectc                 C   s   | j |j|j|j|j d S r;   )rO   linex1y1x2y2)r@   rh   r!   r!   r"   drawLine   s    z_PMRenderer.drawLinec              
   C   s   |j }t|tr8|r tj |s$d S t |d}nt|drN|d}nd S |j	\}}|j
|j }}|d krv|}|d kr|}| j|j|j||| jjdkr|nt|dr|jn|j ||d d S )NRGBconvertr   tobytes   )pathrS   strosisfiler'   openro   hasattrsizerd   re   rO   	_aapixbufr6   r7   _backendrp   tostring)r@   imagerr   imZsrcWZsrcHZdstWZdstHr!   r!   r"   	drawImage   s2    
 

       z_PMRenderer.drawImagec                 C   s&   | j }||j|j|j |  d S r;   )rO   circlecxcyrfillstrokepath)r@   r   r-   r!   r!   r"   
drawCircle   s    z_PMRenderer.drawCircler   c                 C   s   |j }t|dkstd| j}|  ||d |d  tdt|dD ]}||| ||d   qL|r~|  |	  |
  d S )NrI   z#Polyline must have 1 or more pointsr   r   )ZpointsrV   AssertionErrorrO   	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;   )rO   ellipser   r   ra   rb   r   )r@   r   r-   r!   r!   r"   drawEllipse   s    z_PMRenderer.drawEllipsec                 C   s   | j |dd d S )Nr   )r   )r   )r@   Zpolygonr!   r!   r"   drawPolygon   s    z_PMRenderer.drawPolygonc                 C   s   | j }|j}t|dd}|d k	s$|r| j }|d }|d }|d }|j}	|j}
|j}|dkrt|	||}|dkr~|
|8 }
nH|dkr|
|d	 8 }
n2|d
kr|
t	||	||||j
8 }
ntdt| |j}||_z|j|
||	||fd W 5 ||_X d S )NtextRenderModer   Z
textAnchorrL   rM   )startZ	inheritedendmiddlerI   numericzbad value for textAnchor )	_fontInfo)rO   rK   getattrr<   rN   textr6   r7   r   numericXShiftencoding
ValueErrorrs   r   
drawString)r@   Z	stringObjZcanvfillr   Stext_anchorrL   rM   r   r6   r7   textLenZoldTextRenderModer!   r!   r"   r      s2    

z_PMRenderer.drawStringc           	         s  | j tkrPjd= jrDjd }|j}d|_| | ||_n  d S ddlm  jj	j
jftdd}d fdd		}jr|    j jd k	}jd k	}td
d}|dkr<|r
|r
|dd | |    n0|r&|dd | n|r|    nN|dkrp|dd |r`| |r  n| r|   d S )Nr\   r   r   )_renderPath	autoclose Fc                    s       | dS )NZ
forceClose)r   r   r   r-   Z	drawFuncsrr   r!   r"   rP   s    z _PMRenderer.drawPath.<locals>.rPrH   svgTr   pdf)F)rO   ZEmptyClipPath
_clipPathsZ
isClipPathdrawPathZclipPathClearreportlab.graphics.shapesr   r   r   curveTor   r   ZclipPathSetappendrK   rG   r   r   )	r@   rr   r   Zicpr   r   r   strokerH   r!   r   r"   r      sV    














z_PMRenderer.drawPathN)r   )__name__
__module____qualname____doc__r=   rA   r>   r_   r`   rg   rm   r~   r   r   r   r   r   r   r!   r!   r!   r"   r1   Z   s   
r1   c                 C   s   t  }| jd|j|jdS )Nr   ZditherZpalette)r'   ro   NONEADAPTIVE)r}   r%   r!   r!   r"   _convert2pilp  s    r   c                 C   s
   |  dS )NLro   r}   r!   r!   r"   _convert2pilL   s    r   c                 C   s
   |  dS )N1r   r   r!   r!   r"   _convert2pil1#  s    r   c           	   	   C   s   t | } | j\}}t||t| dr*| jn| j | j }t|dst	t
j|d d |  d}|| W 5 Q R X t
jdkrddlm} ||dd	 n
|| d S )
Nrp   writer   .wbmacmarkfilenamePICText)r   rx   
_pmBackendZpil2pictrw   rp   r{   r}   Z
getpaletterv   rt   rr   splitextr   r   namereportlab.lib.utilsr   )	r}   fnfmttransparentcolsZrowsrY   fr   r!   r!   r"   _saveAsPICT&  s    
*
$
r   ARGB32RGB24)ZARGBRGBArn   gOQ?c                   @   s  e Zd ZdFddZedGdd	ZdHd
dZdd ZdIddZdJddZ	dd Z
dKddZdd Zdd ZdLddZdd Zd d! Zd"d# ZdMd%d&Zd'd( ZdNd*d+Zd,d- ZdOd.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 dPdBdCZ!dDdE Z"dS )QPMCanvasH    Nrn   c           	      C   s   |d }t || d }t || d }| j|||||d| jd< || jd< |dd|ddf| jd< g | jd< || jd	< || jd
< t| jjttkrdnd| jd< || jd< | jdkrtnt	| jd< | j
| _dS )z-configPIL dict is passed to image save methodg      R@g      ?r   _gs_bgr   r^   r   	configPIL_dpir   r   rz   Z_backendfmt_colorConverterN)r+   
_getGStater2   typer   ry   powrz   r/   r.   r^   rD   )	r@   whdpibgr   r   
backendFmtZscaler!   r!   r"   __init__6  s    



"
zPMCanvas.__init__r   c              	   C   s   t |}|d krtj}|dkrnz|j| ||dW S  tk
rj   z|j| |||dW  Y S    Y nX Y qX nZd| kr| }t	||}z|j| |||dW S  t
k
r   |j| ||d Y S X td|d S )Nr   r   r   r   z.Cannot obtain PM graphics state using backend )r#   r   r   gstate	TypeErrorZGStater   upper_pycairoFmtsMapgetAttributeErrorRuntimeError)r   r   r   r   r   modr!   r!   r"   r   H  s&    zPMCanvas._getGStatec           	      C   s   |d kr| j }|| | j_| j_d d d d d d d d}| j}|j|j }}| D ]}t||||< qP~| `t	j
|||d }| jd< | D ]}t| |||  q||| d S )N)rD   rE   rG   rQ   rR   rW   rK   r   r   )r   Z_drawingrd   re   r   rL   rM   keysr   r   r   r2   setattrr   )	r@   r   r   r   AgsZfNZfSkr!   r!   r"   _drawTimeResize^  s     zPMCanvas._drawTimeResizec                 C   sJ   t  j| jdkr"t| ddkr"dnd| jj| jjfd}|| jj |S )Nr   _fmtr   r   rn   )rx   )	r'   newrz   r   r   rd   re   Z	frombytespixBuf)r@   r}   r!   r!   r"   toPILl  s    8zPMCanvas.toPILc              
   C   s~  |   }|d krPt|ts*tdt| tj|d }|drP|dd  }| j	pXi }|
dd  |d}|r|||}| }|dkrt|}n|dkr|drt|}n&|drt|}n|d	rt|}d
}nJ|dkr t||||dd dS |dkrn|dkrd}ntd| |d
kr|dd }|rddlm}m} ddg }	td| D ]\}
}d|	|
| < ql|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| t |dsztj!dkrzddl"m#} |||d  d S )!Nz*Invalid value '%s' for fn when fmt is Noner   r   preConvertCB)GIF)TIFFZTIFFPZTIFFLZTIFZTIFF1r   r   r   r   )ZPCTr   r   )r   )ZPNGZBMPZPPM)ZJPGJPEGr   zUnknown image kind %sr   )
ImageChopsr%   i   )r      i   r(   r   
resolution)zresolution unitZinchZchops_invert)r   	preSaveCBr   r   r   r   )$r   rS   rs   r   asciirt   rr   r   
startswithr   
setdefaultr=   r   r   endswithr   r   r   r   r   r&   r   r%   zipZ
bitmap_rgbmergesplitinvertpointro   r   saverw   r   r   r   )r@   r   r   r}   r   r   Ztcr   r%   Tor-   adr  r   r!   r!   r"   
saveToFileq  sh    

 












:

zPMCanvas.saveToFiler   c                 C   s   t  }| j||d | S )Nr   )r   r  getvalue)r@   r   rY   r!   r!   r"   saveToString  s    zPMCanvas.saveToStringc           	      C   s   ddl }| j}| jdkr6|jdkr6d|_|j}d|_n|j}|j|j }}||ddt	|d ddd	||d
d
 |d }t
t	|d| D ]}|||| |  q|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   Nr   r   r   z=2sLLLLLLhh24xZBM6   (   r      rq   z              )structr   rz   r   r   rd   re   r   packrV   r   )	r@   r   r  r   Zpixrd   re   Zrowbr  r!   r!   r"   
_saveToBMP  s    *zPMCanvas._saveToBMPc                 C   s   t | j|| d S r;   )_setFontr   )r@   rL   rM   leadingr!   r!   r"   r     s    zPMCanvas.setFontc                 C   s   t | j|| d S r;   )r   r   )r@   r   valuer!   r!   r"   __setattr__  s    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 r;   )r   r   )r@   r   r   r!   r!   r"   r     s      zPMCanvas.fillstrokepathc                 C   s"  t || dkst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   )r@   r   r   ra   rb   theta0theta1Zcos0Zsin0x0y0Zcos1Zsin1x3y3Zdx1Zdy1ZhalfAngr   ri   rj   Zdx2Zdy2rk   rl   r!   r!   r"   _bezierArcSegmentCCW  s(    

zPMCanvas._bezierArcSegmentCCWc              	   C   s   || }t |dkr ||fg}nTttt |d }	t||	 }
g }t|	D ]&}|||
  }||
 }|||f qLg }|D ]Z\}}|s| ||||||\\}}}|| 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   floatr   r   r'  )r@   r   r   ra   rb   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,  r   r   )r@   r   r   ra   rb   Zang1Zang2r#  r$  r+  ri   rj   rk   rl   r%  r&  r!   r!   r"   addEllipsoidalArc  s    zPMCanvas.addEllipsoidalArcr   c                 C   s   | j ||||d d S )Nr   r   )r@   r6   r7   r   r   r!   r!   r"   drawCentredString  s    zPMCanvas.drawCentredStringc                 C   s   | j |||dd d S )Nr   r.  r/  )r@   r   r6   r7   r!   r!   r"   drawRightString  s    zPMCanvas.drawRightStringleftc                 C   s$  | j }|j}|j}|r8|||fkr8|\}	}
t||	|
 n|}	|}
| |\}}z|dkrt||	|
}|dkrx||8 }n2|dkr||d 8 }n|dkr|t||||	|
8 }| jdkr|	||| nHt
|	}|jr|	||| n(|}t|sz|d}W n tk
r } z`|jdd	 \}}t|jd d	 d
|jd	 ||d | ||| |||d  f f  W 5 d }~X Y nX t||g|j }t|}|d }t|D ]^}|| \}}||krt||j|
 |}|	||| ||kr||||j|
7 }qW 5 ||| X d S )N)r   r   r   r   r   g       @r   r   utf8rI   r]   z%s
%s-->%s<--%s
   r   )r   rM   rL   r  
shapedTextr   r   r   rz   r   r   Z_dynamicFontr
   decodeUnicodeDecodeErrorargsr   ZsubstitutionFontsrV   r   ZencName)r@   r6   r7   r   r   r   r   Zgs_fontSizeZgs_fontNamerL   rM   r   fontZfcer   jZFTnZnm1r   tr!   r!   r"   r   !  sT    


\

 zPMCanvas.drawStringc                 C   s6   | j d k	r2|   | || | || |   d S r;   )rG   r   r   r   r   )r@   ri   rj   rk   rl   r!   r!   r"   rh   U  s
    
zPMCanvas.linec                 C   sb   |    | || | || | | || ||  | |||  |   | j||d d S )N)r   r   )r   r   r   r   r   )r@   r6   r7   rd   re   r   r   r!   r!   r"   rc   \  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)r   r   r-  r   r   )	r@   r6   r7   rd   re   ra   rb   rk   rl   r!   r!   r"   rf   e  s      zPMCanvas.roundRectc                 C   s   |  |||| dS )zRadd closed path circle with center cx,cy and axes r: counter-clockwise orientationN)r   )r@   r   r   r   r!   r!   r"   r   w  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)r   BEZIER_ARC_MAGICr   r   r   )r@   r   r   ra   rb   r#  r$  r%  r&  ri   rj   rk   rl   r!   r!   r"   r   {  sN    zPMCanvas.ellipsec                 C   s   dS )zdo nothing for compatibilityNr!   r?   r!   r!   r"   	saveState  s    zPMCanvas.saveStatec                 C   s*   |  || _t|dd }|d k	r&|| _d S NrZ   )r   rK   r   rJ   r@   ZaColorrZ   r!   r!   r"   rX     s    zPMCanvas.setFillColorc                 C   s*   |  || _t|dd }|d k	r&|| _d S rA  )r   rG   r   rF   rB  r!   r!   r"   rP     s    zPMCanvas.setStrokeColorc                 C   s
   || _ d S r;   )rQ   )r@   capr!   r!   r"   
setLineCap  s    zPMCanvas.setLineCapc                 C   s
   || _ d S r;   )rR   )r@   joinr!   r!   r"   setLineJoin  s    zPMCanvas.setLineJoinc                 C   s
   || _ d S r;   )rE   )r@   rd   r!   r!   r"   setLineWidth  s    zPMCanvas.setLineWidthc                 C   s$   t ||p| jj|d k	r|n| jjS r;   )r   r   rL   rM   )r@   r   rL   rM   r!   r!   r"   r     s    zPMCanvas.stringWidthc                 C   s   t |tsVt|}t| jj}|jrVt |tsVtdt| jj| jj	d|fgd d }t |trt
dd |jD | jj	 d nt|| jj| jj	}||fS )Nr   )rL   rM   r   c                 s   s   | ]}|j V  qd S r;   )Z	x_advance).0_r!   r!   r"   	<genexpr>  s     z&PMCanvas.shapedText.<locals>.<genexpr>i  )rS   r   r   r   r   rL   ZisShapedr	   r   rM   sumZ__shapeData__r   )r@   r   r9  rd   r!   r!   r"   r5    s    
(*zPMCanvas.shapedText)r   r   NNrn   )Nr   )N)N)r   )N)r   r   )r   )Nr2  )r   r   )NN)#r   r   r   r   staticmethodr   r   r   r  r  r  r   r  r  r   r'  r,  r-  r0  r1  r   rh   rc   rf   r   r   r@  rX   rP   ZrestoreStaterD  rF  rG  r   r5  r!   r!   r!   r"   r   5  sD     


8


#

4
	;
r   r   r   rn   c           	   	   K   s@   t | } t| j| j|||||d}t| |ddfd|i| |S )N)r   r   r   r   r   r   r0   )r   r   rd   re   r4   )	r  r   r   r   r0   r   r   r8   r-   r!   r!   r"   drawToPMCanvas  s    rM  c              	   K   s"   t | f||||||d| S )Nr   r   r   r0   r   r   )rM  r   )r  r   r   r   r0   r   r   r8   r!   r!   r"   	drawToPIL  s    rO  c           
   	   K   s8   t  }t| f||||||d|}	|	jd|j|jdS )NrN  r   r   )r'   rO  ro   r   r   )
r  r   r   r   r0   r   r   r8   r%   r}   r!   r!   r"   
drawToPILP  s    rP  r   c	              	   K   s.   t | f||||||d|	}
|
|| dS )zocreate a pixmap and draw drawing, d to it then save as a file
    configPIL dict is passed to image save methodrN  N)rM  r  )r  r   r   r   r   r   r0   r   r   r8   r-   r!   r!   r"   
drawToFile  s    rQ  c           
   	   K   s.   t  }	t| |	f||||||d| |	 S )N)r   r   r   r   r   r   )r   rQ  r  )
r  r   r   r   r   r0   r   r   r8   rY   r!   r!   r"   drawToString  s     rR  pmoutFc              
      s  dd }dd l }ddlm} ddlm |j}g }|j| sH||  d}d}|g}	i }
t	j
dd  }d	d
 |D }|sdddddddg}n.|D ]}|| qddd
 |D d}g  dd lddlm  fdd}|ttddD ]\}}}|
|dd  }|
|< |dkr6|d|d  7 }|rH||krHq|}t|j}t|j}|	d||f  |D ]8}|dkr|	d|   zd|||f }|j| |}|j|r|| |dkrt|||dtid n.|d kr|jddg| |d! nt|||d" |d#kr8|	d$|  n2|dkrR|	d%|  n|dkrj|	d&|  szd'krtd(t|  W n  tk
r   ||| Y nX qv|j !d)d*d+krd|j"d,< d-D ]4}z|j|g| |d! W n   ||| Y nX qq r:|	d #d.d/|	d< |	d0 |	$  |	| |j| d1}t%|d2}|&|	 W 5 Q R X t	j'd3krdd4l(m)} ||d5d6 sd'krtd(|  d S )7Nc                 S   s   | dkrd} | S )NtiffZtifr!   )r6   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  rH  r  r!   r!   r"   
<listcomp>  s     
 ztest.<locals>.<listcomp>gifrT  pngjpgpctpyr   ,c                 S   s   g | ]}|d d qS )   Nr!   rW  r!   r!   r"   rX    s     )escapec                    sZ   d| |f }sdkr t |  d|  t }j|d  d|   d S )NzProblem drawing %s fmt=%s filerI   z"<br/><h2 style="color:red">%s</h2>)filez<pre>%s</pre>)printr   r   	print_excr  )r   r   msgbufZerrsr`  shout	tracebackrV  r!   r"   handleError  s     ztest.<locals>.handleErrorZft_get_face)ZdoTTFz.%02dz%<hr><h2>Drawing %s</h2>
<pre>%s</pre>)rY  rZ  r[  r\  z<p>%s format</p>
z%s.%sr   )r   r   )r]  r   )formatsoutDirfnRootr   )rY  rZ  r[  z<img src="%s" border="1"><br>
z#<a href="%s">python source</a><br>
z<a href="%s">SVG</a><br>
rI   zwrote %sZRL_NOEPSPREVIEW0r   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   )*rt   Zreportlab.graphicsrU  Zreportlab.rl_configrV  getAllTestDrawingsrr   isdirmkdirsysargvremoverE  r	  rh  xml.sax.saxutilsr`  rw   r   r  r+   rd   re   r   r   ru   rQ  r   r  rb  r  r   environr   r2   replaceextendrv   
writelinesplatformr   r   )rk  rg  r   rt   rU  ro  ZdrawingsZhtmlTopZ
htmlBottomhtmlnamesrs  Er  ri  r5   Z	docstringr   r   rl  r   r   r   filenamefullpathZhtmlFileNamer   r   r!   rf  r"   test  s    
	
  









  



 r  __main__T)rg  )N)N)rS  F)?__version__r   r   Zreportlab.graphics.renderbaser   r   Zreportlab.pdfbase.pdfmetricsr   r   r   Zreportlab.pdfbase.ttfontsr   r	   r   r
   r   Zreportlab.lib.abagr   Zreportlab.lib.colorsr   r   Z	reportlabr   utilsr   r  r   rt   rr  ior   r   mathr   r   r   r   r#   r   r   r'   r.   r/   Z_unset_r4   r:   r1   r   r   r   r   dictr   r?  r   rM  rO  rP  rQ  rR  r  r  r   r!   r!   r!   r"   <module>   sX   


 C
   -
_
