o
    &zh{                     @   s4  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 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& dAddZ'ze'ej(Z)W n ey   dZ)Y nw 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/Z0dd Z1d d! Z2d"d# Z3dAd$d%Z4e5d&d&d'd(Z6d)Z7G d*d+ d+Z8d,d-dej-ej(d.fd/d0Z9d,d-dej-ej(d.fd1d2Z:d,d-dej-ej(d.fd3d4Z;d5d,d-dej-ej(d.fd6d7Z<d5d,d-dej-ej(d.fd8d9Z=e<Z>dBd<d=Z?e@d>kre?d?d@ dS 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)bidiShapedText)	isUnicode	asUnicode)ABag)toColorwhite)	rl_config   )setFontRenderPMErrorN)BytesIOStringIO)sincospiceilc                 C   s   | st j} | dkr6zdd l}W |S  ty5 } zzdd l}W n ty)   tdw W Y d }~|S d }~ww d|  v rmzdd l}W |S  tyl } zzdd l}W n ty`   td|  dw W Y d }~|S d }~ww td|  )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   renderPMBackend_rl_renderPMImportError	rlPyCairor   lower)backendMerrMsg r$   V/var/www/html/kangema/venv/lib/python3.10/site-packages/reportlab/graphics/renderPM.py_getPMBackend   s<   






r&   c                  C   s0   z	ddl m}  W | S  ty   dd l} Y | S w )Nr   Image)PILr(   r   r'   r$   r$   r%   	_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         )intredgreenbluecr$   r$   r%   	Color2HexG   s   Br4   c                 C   s   | du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   r2   r$   r$   r%   
CairoColorL   s   r5   c                 K   s.   t  }|j| |jt| ||||d dS )z
As it says)showBoundaryN)_PMRenderer__dict__updatedrawr   )drawingcanvasxyr6   kwdsRr$   r$   r%   r:   T   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 )!r7   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%   rD   `   s   
z_PMRenderer.popc                 C   s    t |}| j| |   d S rB   )r   rC   pushrE   )rG   nodedeltasr$   r$   r%   rH   d   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strokeColorstrokeLineCapstrokeLineJoinfillModestrokeDashArray   r   r   fillOpacity	fillColorfontNamefontSize)rC   getState_canvasrK   rL   rM   setStrokeColorlineCaplineJoinrQ   
isinstancelisttuplelen	dashArrayrT   setFillColorr   )rG   salphadar$   r$   r%   rE   i   s.   
z_PMRenderer.applyStatec                 C   sH   | j jd }| jjdd ||f  |d< |d< | j | |   d S )Nr      	transformrK   )rC   	_combinedrY   _baseCTMrH   rE   )rG   r=   r>   rJ   r$   r$   r%   	initState   s   $z_PMRenderer.initStatec                 C   s    |  | | | |   dS )zEThis is the recursive method called for each node
        in the treeN)rH   drawNodeDispatcherrD   )rG   rI   r$   r$   r%   drawNode   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   )	rY   rxryrectr=   r>   widthheight	roundRect)rG   rp   r3   r$   r$   r%   drawRect   s   $z_PMRenderer.drawRectc                 C   s   | j |j|j|j|j d S rB   )rY   linex1y1x2y2)rG   ru   r$   r$   r%   drawLine   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convertr   tobytes   )pathr]   strosisfiler*   openr|   hasattrsizerq   rr   rY   	_aapixbufr=   r>   _backendr}   tostring)rG   imager   imsrcWsrcHdstWdstHr$   r$   r%   	drawImage   s"   


z_PMRenderer.drawImagec                 C   s&   | j }||j|j|j |  d S rB   )rY   circlecxcyrfillstrokepath)rG   r   r3   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 )NrS   z#Polyline must have 1 or more pointsr   r   )
pointsr`   rY   	pathBeginmoveTorangelineTo	pathClosepathFill
pathStroke)rG   polyline_doClosePr3   ir$   r$   r%   drawPolyLine   s   z_PMRenderer.drawPolyLinec                 C   s*   | j }||j|j|j|j |  d S rB   )rY   ellipser   r   rn   ro   r   )rG   r   r3   r$   r$   r%   drawEllipse   s   z_PMRenderer.drawEllipsec                 C   s   | j |dd d S )Nr   )r   )r   )rG   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   
textAnchorrV   rW   )start	inheritedendmiddlerS   numericzbad value for textAnchor )	_fontInfo)rY   rU   getattrrC   rX   textr=   r>   r   numericXShiftencoding
ValueErrorr   r   
drawString)rG   	stringObjcanvfillr   Stext_anchorrV   rW   r   r=   r>   textLen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 )Nrf   r   r   )_renderPath	autoclose Fc                    s       | dS )N
forceClose)r   r   r   r3   	drawFuncsr   r$   r%   rP   s   z _PMRenderer.drawPath.<locals>.rPrQ   svgTr   pdf)F)rY   EmptyClipPath
_clipPaths
isClipPathdrawPathclipPathClearreportlab.graphics.shapesr   r   r   curveTor   r   clipPathSetappendrU   rN   r   r   )	rG   r   r   icpr   r   r   strokerQ   r$   r   r%   r      s\   









z_PMRenderer.drawPathN)r   )__name__
__module____qualname____doc__rD   rH   rE   rk   rm   rt   rz   r   r   r   r   r   r   r   r$   r$   r$   r%   r7   [   s     
r7   c                 C   s   t  }| jd|j|jdS )Nr   ditherpalette)r*   r|   NONEADAPTIVE)r   r(   r$   r$   r%   _convert2pilp  s   r   c                 C   
   |  dS )NLr|   r   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   r   
_pmBackendpil2pictr   r}   r   r   
getpaletter   r   r   splitextr    r   namereportlab.lib.utilsr   )	r   fnfmttransparentcolsrowsrc   fr   r$   r$   r%   _saveAsPICT'  s   
*
$
r   ARGB32RGB24)ARGBRGBAr{   gOQ?c                   @   s  e Zd Z		dEddZedFdd	ZdGd
dZdd ZdGddZdHddZ	dd Z
dGddZdd Zdd ZdIddZdd Zd d! Zd"d# ZdJd&d'ZdGd(d)ZdKd+d,Zd-d. ZdId/d0Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< ZeZd=d> Zd?d@ ZdAdB Z dLdCdDZ!dS )MPMCanvasH    Nr{   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rLdnd| jd< || jd< | jdkr]tnt	| jd< | j
| _dS )z-configPIL dict is passed to image save methodg      R@g      ?r   _gs_bgr   rj   r   	configPIL_dpir   r   r   _backendfmt_colorConverterN)r.   
_getGStater8   typer  r   powr   r5   r4   rj   rK   )	rG   whdpibgr  r!   
backendFmtscaler$   r$   r%   __init__7  s   



"
zPMCanvas.__init__r   c              	   C   s   t |}|d u rtj}|dkr3z	|j| ||dW S  ty2   z|j| |||dW  Y S    Y Y n-w d| v r_| }t	||}z
|j| |||dW S  t
y^   |j| ||d Y S w td|)Nr   r  r  r   z.Cannot obtain PM graphics state using backend )r&   r   r   gstate	TypeErrorGStater    upper_pycairoFmtsMapgetAttributeErrorRuntimeError)r  r  r  r!   r   modr$   r$   r%   r  I  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)rK   rL   rN   r[   r\   ra   rU   r  r  )r  _drawingrq   rr   r  rV   rW   keysr   r   r  r8   setattrr   )	rG   r  r  r  AgsfN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   r{   )r   )	r*   newr   r   r  rq   rr   	frombytespixBuf)rG   r   r$   r$   r%   toPILm  s   8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)TIFFTIFFPTIFFLTIFTIFF1r   r   r   r-  )PCTr   r   )r   )PNGBMPPPM)JPGJPEGr7  zUnknown image kind %sr   )
ImageChopsr(   i   )r      i   r+   r   
resolution)zresolution unitinchchops_invert)r8  	preSaveCBr   r   r   r   )$r)  r]   r   r   asciir   r   r   
startswithr  
setdefaultrD   r  r   endswithr   r   r   r  r   r)   r8  r(   zip
bitmap_rgbmergesplitinvertpointr|   r  saver   r   r   r   )rG   r   r   r   r  r*  tcr8  r(   Tor3   adr=  r   r$   r$   r%   
saveToFiler  sh   









:

zPMCanvas.saveToFiler,  c                 C   s   t  }| j||d | S )Nr  )r   rN  getvalue)rG   r   rc   r$   r$   r%   saveToString  s   zPMCanvas.saveToStringc           	      C   s   ddl }| j}| jdkr|jdkrd|_|j}d|_n|j}|j|j}}||ddt	|d ddd	||d
d
 |d }t
t	|d| D ]}|||| |  qG|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=2sLLLLLLhh24xBM6   (   r      r~   z              )structr  r   r%  r(  rq   rr   r   packr`   r   )	rG   r   rU  r   pixrq   rr   rowbrK  r$   r$   r%   
_saveToBMP  s   *zPMCanvas._saveToBMPc                 C      t | j|| d S rB   )_setFontr  )rG   rV   rW   leadingr$   r$   r%   r     r   zPMCanvas.setFontc                 C   rZ  rB   )r  r  )rG   r   valuer$   r$   r%   __setattr__  r   zPMCanvas.__setattr__c                 C   s   t | j|S rB   )r   r  )rG   r   r$   r$   r%   __getattr__  s   zPMCanvas.__getattr__r   c                 C   s    |r|    |r|   d S d S rB   )r   r   )rG   r   r   r$   r$   r%   r     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   )rG   r   r   rn   ro   theta0theta1cos0sin0x0y0cos1sin1x3y3dx1dy1halfAngr#  rv   rw   dx2dy2rx   ry   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@)ra  r.   r   floatr   r   rq  )rG   r   r   rn   ro   rb  rc  angularExtent	angleListNfrag	fragAngleiirL  bctrlptsrf  rg  ptstmpx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   )rG   r   r   rn   ro   ang1ang2rf  rg  ry  rv   rw   rx   ry   rj  rk  r$   r$   r%   addEllipsoidalArc  s
   zPMCanvas.addEllipsoidalArcr   Fc                 C   s   | j ||||||d d S )N)r   	directionshapingr   )rG   r=   r>   r   r   r  r  r$   r$   r%   drawCentredString  s   zPMCanvas.drawCentredStringc                 C   s   | j |||d|d d S )Nr   )r   r  r  )rG   r   r=   r>   r  r$   r$   r%   drawRightString  s   zPMCanvas.drawRightStringleftc                 C   s@  | j }|j}	|j}
|r||	|
fkr|\}}t||| n|
}|	}t|||||d\}}z|dv rXt|||}|dkr?||8 }n|dkrJ||d 8 }n|dkrX|t|||||8 }| jdkre|||| nt	|}|j
rt|||| 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)rV   rW   r  )r   r   r   r   r   g       @r   r   utf8rS   rg   z%s
%s-->%s<--%s
   r   )r  rW   rV   r[  r
   r   r   r   r   r   _dynamicFontr   decodeUnicodeDecodeErrorargsr   substitutionFontsr`   r   encNamer   )rG   r=   r>   r   r   r   r  r  r   gs_fontSizegs_fontNamerV   rW   r   fontfcer   jFTnnm1r   tr$   r$   r%   r   "  sd   

J	zPMCanvas.drawStringc                 C   s:   | j d ur|   | || | || |   d S d S rB   )rN   r   r   r   r   )rG   rv   rw   rx   ry   r$   r$   r%   ru   V  s   
zPMCanvas.linec                 C   sb   |    | || | || | | || ||  | |||  |   | j||d d S )N)r   r   )r   r   r   r   r   )rG   r=   r>   rq   rr   r   r   r$   r$   r%   rp   ]  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   )	rG   r=   r>   rq   rr   rn   ro   rx   ry   r$   r$   r%   rs   f  s   zPMCanvas.roundRectc                 C   s   |  |||| dS )zRadd closed path circle with center cx,cy and axes r: counter-clockwise orientationN)r   )rG   r   r   r   r$   r$   r%   r   x  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   )rG   r   r   rn   ro   rf  rg  rj  rk  rv   rw   rx   ry   r$   r$   r%   r   |  sN   zPMCanvas.ellipsec                 C   s   dS )zdo nothing for compatibilityNr$   rF   r$   r$   r%   	saveState  s   zPMCanvas.saveStatec                 C   .   |  || _t|dd }|d ur|| _d S d S Nrd   )r  rU   r   rT   rG   aColorrd   r$   r$   r%   rb     
   
zPMCanvas.setFillColorc                 C   r  r  )r  rN   r   rM   r  r$   r$   r%   rZ     r  zPMCanvas.setStrokeColorc                 C   
   || _ d S rB   )r[   )rG   capr$   r$   r%   
setLineCap  r   zPMCanvas.setLineCapc                 C   r  rB   )r\   )rG   joinr$   r$   r%   setLineJoin  r   zPMCanvas.setLineJoinc                 C   r  rB   )rL   )rG   rq   r$   r$   r%   setLineWidth  r   zPMCanvas.setLineWidthc                 C   s&   t ||p| jj|d ur|S | jjS rB   )r   r  rV   rW   )rG   r   rV   rW   r$   r$   r%   r     s
   
zPMCanvas.stringWidth)r   r   NNr{   )Nr   rB   r+  )r   r   )r   NF)Nr  NF)NN)"r   r   r   r  staticmethodr  r$  r)  rN  rP  rY  r   r^  r_  r   rq  r}  r  r  r  r   ru   rp   rs   r   r   r  rb   rZ   restoreStater  r  r  r   r$   r$   r$   r%   r   6  sD    



8

#


4
	;r   r   r   r{   c           	   	   K   s@   t | } t| j| j|||||d}t| |ddfd|i| |S )N)r  r  r  r!   r  r   r6   )r   r   rq   rr   r:   )	rM  r  r  r  r6   r!   r  r?   r3   r$   r$   r%   drawToPMCanvas  s   r  c              	   K   s"   t | f||||||d| S )Nr  r  r  r6   r!   r  )r  r)  )rM  r  r  r  r6   r!   r  r?   r$   r$   r%   	drawToPIL  s   "r  c           
   	   K   s8   t  }t| f||||||d|}	|	jd|j|jdS )Nr  r   r   )r*   r  r|   r   r   )
rM  r  r  r  r6   r!   r  r?   r(   r   r$   r$   r%   
drawToPILP  s   r  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 methodr  N)r  rN  )rM  r   r   r  r  r  r6   r!   r  r?   r3   r$   r$   r%   
drawToFile  s   r  c           
   	   K   s.   t  }	t| |	f||||||d| |	 S )N)r   r  r  r  r!   r  )r   r  rO  )
rM  r   r  r  r  r6   r!   r  r?   rc   r$   r$   r%   drawToString  s    r  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|   zwd|||f }|j| |}|j|r|| |dkrt|||dt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#|  s/d$kr7td%t|  W q tyG   ||| Y qw |j !d&d'd(krWd|j"d)< d*D ]}z|j|g| |d W qY   ||| Y qYqw r|	d #d+d,|	d< |	d- |	$  |	| |j| d.}t%|d/}|&|	 W d    n	1 sw   Y  t	j'd0krdd1l(m)} ||d2d3 s̈d$krtd%|  d S d S )4Nc                 S   s   | dkrd} | S )Ntiff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?  .0rL  r$   r$   r%   
<listcomp>  s    ztest.<locals>.<listcomp>)gifr  pngjpgpctpyr   ,c                 S   s   g | ]}|d d qS )   Nr$   r  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 filerS   z"<br/><h2 style="color:red">%s</h2>)filez<pre>%s</pre>)printr   r   	print_excrO  )r   r   msgbuferrsr  shout	tracebackr  r$   r%   handleError  s   ztest.<locals>.handleErrorft_get_face)doTTFz.%02dz%<hr><h2>Drawing %s</h2>
<pre>%s</pre>)r  r  r  r  z<p>%s format</p>
z%s.%sr  r   )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>
rS   zwrote %sRL_NOEPSPREVIEW0r   preview)epsr   z</h1>z7 <a href="#errors" style="color: red">(errors)</a></h1>z<a name="errors"/>zpm-index.htmlr  r   r   HTMLr   )*r   reportlab.graphicsr  reportlab.rl_configr  getAllTestDrawingsr   isdirmkdirsysargvremover  rE  r  xml.sax.saxutilsr  r   r   r@  r.   rq   rr   r   r  r   r  r   rH  r  r>  r  environr  r8   replaceextendr   
writelinesplatformr   r   )r  r  r   r   r  r  drawingshtmlTop
htmlBottomhtmlnamesr  ErL  r  r;   	docstringr   r   r  r  r  r#  filenamefullpathhtmlFileNamer   r   r$   r  r%   test  s   

	





 


$r  __main__T)r  rB   )r  F)A__version__r   r   reportlab.graphics.renderbaser   r   reportlab.pdfbase.pdfmetricsr   r   r   reportlab.pdfbase.ttfontsr   r	   reportlab.pdfgen.textobjectr
   r   r   r   reportlab.lib.abagr   reportlab.lib.colorsr   r   	reportlabr   utilsr   r[  r   r   r  ior   r   mathr   r   r   r   r&   r   r   r*   r4   r5   _unset_r:   rA   r7   r   r   r   r   dictr  r  r   r  r  r  r  r  rH  r  r   r$   r$   r$   r%   <module>   s`   

 C
   #

_