
    <jw                        d Z dZddl 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& d0dZ'	  e'ejP                        Z)d Z*d Z+d Z,ejZ                  fdZ.ddlm/Z/  G d de/      Z0d Z1d Z2d Z3d0dZ4 e5ddd      Z6d Z7 G d! d"      Z8d#d$dejZ                  ejP                  d%fd&Z9d#d$dejZ                  ejP                  d%fd'Z:d#d$dejZ                  ejP                  d%fd(Z;d)d#d$dejZ                  ejP                  d%fd*Z<d)d#d$dejZ                  ejP                  d%fd+Z=e<Z>d1d,Z?e@d-k(  r
 e?d./       yy# e$ r dZ)Y w xY w)2z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                     | st         j                  } d| j                         v r	 dd l}|S t        d|        # t        $ r}t        d|  d      d }~ww xY w)Ncairor   z'cannot import desired renderPM backend zN
Seek advice at the users list see
https://groups.google.com/g/reportlab-userszInvalid renderPM backend, )r   renderPMBackendlower	rlPyCairoImportErrorr   )backendMerrMsgs      R/opt/lfcs-signon/.venv/lib/python3.12/site-packages/reportlab/graphics/renderPM.py_getPMBackendr%      sr    i77G'--/!	0! H 8	BCC  	0$KG9 U, !/ 0 0	0s   : 	AAAc                  <    	 ddl m}  | S # t        $ r dd l} Y | S w xY w)Nr   Image)PILr(   r    r'   s    r$   	_getImager*   0   s*     L  Ls   
 c                     | rYdt        d| j                  z        z  dz  dt        d| j                  z        z  dz  z  dt        d| j                  z        z  z  S | S )N         )intredgreenbluecs    r$   	Color2Hexr5   7   s_    4CI&2-4CK8H3HQ2NOSWX[\_`a`f`f\fXgSgh
hH    c                      | t        |       S | S )z
    c should be None or something convertible to Color
    rlPyCairo.GState can handle Color directly in either RGB24 or ARGB32
    )r   r3   s    r$   
CairoColorr8   <   s    
 71:-A-r6   c                     t               }|j                  j                  |       |j                  t	        |       ||||       y)z
As it says)showBoundaryN)_PMRenderer__dict__updatedrawr   )drawingcanvasxyr:   kwdsRs          r$   r>   r>   D   s7    AJJdFFw'ALFQr6   )Rendererc                   f    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 ZddZd Zd Zd Zd Zy)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                 X    | j                   j                          | j                          y N)_trackerpop
applyStateselfs    r$   rJ   z_PMRenderer.popP   s    r6   c                 p    t        |      }| j                  j                  |       | j                          y rH   )r   rI   pushrK   )rM   nodedeltass      r$   rO   z_PMRenderer.pushT   s(    t$6"r6   c                    | j                   j                         }|d   | j                  _        |d   | j                  _        |d   }||| j                  _        | j                  j                  |d          |d   | j                  _        |d   | j                  _        |d   | j                  _	        |d   }|sd }nDt        |t        t        f      s|f}t        |      d	k7  st        |d
   t        t        f      sd|f}|| j                  _        |d   }||| j                  _        | j                  j!                  |d          | j                  j#                  |d   |d          y )NctmstrokeWidthstrokeOpacitystrokeColorstrokeLineCapstrokeLineJoinfillModestrokeDashArray   r   r   fillOpacity	fillColorfontNamefontSize)rI   getState_canvasrS   rT   rU   setStrokeColorlineCaplineJoinrY   
isinstancelisttuplelen	dashArrayr\   setFillColorr   )rM   salphadas       r$   rK   z_PMRenderer.applyStateY   sB   MM""$U8#$]#3 /").DLL&##Am$45 1 !"2 3 !* !Bb$u.S2wzBqE4,!?U!#- ',DLL$!!!K.1Qz]AjM:r6   c                     | j                   j                  d   }| j                  j                  dd ||fz   x|d<   |d<   | j                   j	                  |       | j                          y )Nr      	transformrS   )rI   	_combinedra   _baseCTMrO   rK   )rM   rA   rB   rQ   s       r$   	initStatez_PMRenderer.initStates   s_    ((,.2ll.C.CAa.H!A.NN{fUm6"r6   c                 h    | j                  |       | j                  |       | j                          y)zEThis is the recursive method called for each node
        in the treeN)rO   drawNodeDispatcherrJ   )rM   rP   s     r$   drawNodez_PMRenderer.drawNodey   s*    
 			$ 	% 	
r6   c                 ~   | j                   }|j                  |j                  cxk(  rdk(  r@n n=|j                  |j                  |j
                  |j                  |j                         y |j                  |j                  |j
                  |j                  |j                  |j                  |j                         y )Nr   )	ra   rxryrectrA   rB   widthheight	roundRect)rM   r{   r4   s      r$   drawRectz_PMRenderer.drawRect   sp    LL77dgg""FF466$&&$**dkk:KKtvvtzz4;;Qr6   c                     | j                   j                  |j                  |j                  |j                  |j
                         y rH   )ra   linex1y1x2y2)rM   r   s     r$   drawLinez_PMRenderer.drawLine   s*    $''$''$''$'':r6   c                 ^   |j                   }t        |t              rK|rt        j                   j	                  |      sy t               j                  |      j                  d      }nt        |d      r|j                  d      }ny |j                  \  }}|j                  |j                  }}||}||}| j                  j                  |j                  |j                  ||| j                  j                   dk(  r|n( t        |d      r|j"                  n|j$                         ||d       y )NRGBconvertr   tobytes   )pathre   strosisfiler*   openr   hasattrsizer|   r}   ra   	_aapixbufrA   rB   _backendr   tostring)rM   imager   imsrcWsrcHdstWdstHs           r$   	drawImagez_PMRenderer.drawImage   s    zzd3RWW^^D1F!!$'//6BT)$e$BWW
d[[%,,d<<$||,,k9N9(="**2;;QdA		r6   c                     | j                   }|j                  |j                  |j                  |j                         |j                          y rH   )ra   circlecxcyrfillstrokepath)rM   r   r4   s      r$   
drawCirclez_PMRenderer.drawCircle   s3    LL	699fhh/	r6   c                 ~   |j                   }t        |      dk\  sJ d       | j                  }|j                          |j	                  |d   |d          t        dt        |      d      D ]  }|j                  ||   ||dz              |r |j                          |j                          |j                          y )Nr[   z#Polyline must have 1 or more pointsr   r   )
pointsrh   ra   	pathBeginmoveTorangelineTo	pathClosepathFill
pathStroke)rM   polyline_doClosePr4   is         r$   drawPolyLinez_PMRenderer.drawPolyLine   s    OO1v{AAA{LL		1qtq#a&!$ 	#AHHQqT1QqS6"	#KKMJJL	r6   c                     | j                   }|j                  |j                  |j                  |j                  |j
                         |j                          y rH   )ra   ellipser   r   ry   rz   r   )rM   r   r4   s      r$   drawEllipsez_PMRenderer.drawEllipse   s9    
,,			'**gjj'**WZZ@	r6   c                 *    | j                  |d       y )Nr   )r   )r   )rM   polygons     r$   drawPolygonz_PMRenderer.drawPolygon   s    '1-r6   c           	      6   | j                   }|j                  }t        |dd      }||r| j                  j	                         }|d   }|d   }|d   }|j
                  }	|j                  }
|j                  }|dvr`t        |	||      }|dk(  r|
|z  }
nH|dk(  r	|
|d	z  z  }
n:|d
k(  r|
t        ||	||||j                        z  }
nt        dt        |      z         |j                  }||_        	 |j                  |
||	||f       ||_        y y # ||_        w xY w)NtextRenderModer   
textAnchorr^   r_   )start	inheritedendmiddler[   numericzbad value for textAnchor )	_fontInfo)ra   r]   getattrrI   r`   textrA   rB   r   numericXShiftencoding
ValueErrorr   r   
drawString)rM   	stringObjcanvfillr   Stext_anchorr^   r_   r   rA   rB   textLenoldTextRenderModes                 r$   r   z_PMRenderer.drawString   s9   ||~~ +;A>~&&(AL/K}H}H>>DAA"77%dHX>%LA (*NA )+{4R[RdRdeeA$%@[AQ%QRR $ 3 3"0D8!DHX3FG&7#/  .. '8#s   /D 	Dc                    	
 | j                   
t        u re
j                  d= 
j                  r;
j                  d   }|j                  }d|_        | j	                  |       ||_        y 
j                          y ddlm	 
j                  
j                  
j                  
j                  ft        dd      }d	
fd	}j                  r2 |        
j                          
j                  j                         
j                  d u}
j                   d u}t        dd      }|d	k(  rn|r4|r2 |d
       
j#                  |        |        
j%                          y |r |d
       
j#                  |       y |r |        
j%                          y y |dk(  r0 |d
       |r
j#                  |       |r
j%                          y y  |       r
j#                  |       
j%                          y )Nro   r   r   )_renderPath	autoclose c                 :    j                           |       S )N
forceClose)r   )r   r   r4   	drawFuncsr   s    r$   rPz _PMRenderer.drawPath.<locals>.rP   s    KKMtY:FFr6   rY   svgTr   pdf)F)ra   EmptyClipPath
_clipPaths
isClipPathdrawPathclipPathClearreportlab.graphics.shapesr   r   r   curveTor   r   clipPathSetappendr]   rV   r   r   )rM   r   r   icpr   r   r   strokerY   r   r4   r   s    `       @@@r$   r   z_PMRenderer.drawPath   s   LL= R ||LL$ll a "  !9XXqxxAKK@	DR0		G 	G ??DMMOLL%{{$&d*4
2.ed#

8$d#

8$  $

8$  t

8$LLNr6   N)r   )__name__
__module____qualname____doc__rJ   rO   rK   rt   rw   r   r   r   r   r   r   r   r   r    r6   r$   r;   r;   K   sN    :
;4R;(

.8:/r6   r;   c                 f    t               }| j                  d|j                  |j                        S )Nr   ditherpalette)r*   r   NONEADAPTIVE)r   r(   s     r$   _convert2pilpr     s&    KE::c%**enn:EEr6   c                 $    | j                  d      S )NLr   r   s    r$   _convert2pilLr         ::c?r6   c                 $    | j                  d      S )N1r   r   s    r$   _convert2pil1r     r   r6   c           	      6   t        |       } | j                  \  }}t        j                  || t	        | d      r| j
                  n| j                         | j                  j                               }t	        |d      st        t        j                  j                  |      d   dz   |j                         z   d      5 }|j                  |       d d d        t        j                  dk(  rddlm}  ||d	       y y |j                  |       y # 1 sw Y   @xY w)
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rowsrk   fr   s	            r$   _saveAsPICTr    s    	r	BJD$D'[WR	5JrzzPRP[P[&^_a_d_d_o_o_qrA2g"''""2&q)#-ciik9$? 	1GGAJ	77E>8'  		 	s   >DDARGB32RGB24)ARGBRGBAr   gOQ?c                       e Zd Z	 	 ddZed d       Zd!dZd Zd!dZd"dZ	d Z
d!d	Zd
 Zd Zd#dZd Zd Zd Zd$dZd!dZd%dZd Zd#dZd Zd Zd Zd Zd Zd ZeZd Zd Zd Z d&dZ!y)'PMCanvasNc                    |dz  }t        ||z  dz         }t        ||z  dz         }| j                  |||||      | j                  d<   || j                  d<   |dd|ddf| j                  d<   g | j                  d<   || j                  d	<   || j                  d
<   d| j                  d<   || j                  d<   | j                  dk(  rt        nt
        | j                  d<   | j                  | _        y)z-configPIL dict is passed to image save methodg      R@g      ?r
  _gs_bgr   rs   r   	configPIL_dpir   r   _backendfmt_colorConverterN)r/   
_getGStater<   r   r8   r5   rs   rS   )	rM   whdpibgr  r!   
backendFmtscales	            r$   __init__zPMCanvas.__init__'  s     D%%#q2g*Me!e%*1QuQq$9j!&(l#%.k" #f$/j!'1m$9=9S:Yb'(==r6   c                 :   t        |      }|t        j                  }d|j                         v r<|j	                         }t
        j                  ||      }	 |j                  | |||      S t        d|      # t        $ r |j                  | ||      cY S w xY w)Nr   r  r"  z.Cannot obtain PM graphics state using backend )r%   r   r   r   upper_pycairoFmtsMapgetGStateAttributeErrorgstateRuntimeError)r  r   r"  r!   r
  mods         r$   r  zPMCanvas._getGState8  s    G$?//Ggmmo%))+C!%%c#.C-zz!AbSz11 KG;WXX " -zz!Az,,-s   A: :BBc                    || j                   }||c| j                  _        | j                  _        d d d d d d d d}| j                  }|j
                  |j                  }}|j                         D ]  }t        ||      ||<    ~| `t        j                  |||      x}| j                  d<   |j                         D ]  }t        | |||           |j                  ||       y )N)rS   rT   rV   rc   rd   ri   r]   r'  r  )r  _drawingr|   r}   r  r^   r_   keysr   r  r-  r<   setattrr   )	rM   r  r   r"  AgsfNfSks	            r$   _drawTimeResizezPMCanvas._drawTimeResizeF  s    :DHHr45q1T]]1t44\`nr  AE  FXXR[[2 	!A2a=AaD	!$.$5$5aR$5$@@T]]5! 	!AD1Q4 	!


2br6   c                    t               j                  | j                  dk(  rt        | d      dk(  rdnd| j                  j
                  | j                  j                  f      }|j                  | j                  j                         |S )Nr   _fmtr  r  r   )r   )	r*   newr   r   r  r|   r}   	frombytespixBuf)rM   r   s     r$   toPILzPMCanvas.toPILT  s    [__t}}k'AgdSYFZ\dFdVjow{ww  xF  xF  HL  HP  HP  HW  HW  wX_  Y
TXX__%	r6   c           
         | j                         }|_t        |t              st        dt	        |      z        t
        j                  j                  |      d   }|j                  d      r|dd  }| j                  xs i }|j                  dd        |j                  d      }|r ||      }|j                         }|dv rt        |      }n|dv rY|j                  d      rt        |      }n9|j                  d      rt        |      }n|j                  d	      rt!        |      }d
}n=|dv rt#        ||||j%                  dd             S |dv rn|dv rd}nt'        d|z        |d
k(  r|j%                  dd       }|rddlm}m} ddgz  }	t/        d|j1                               D ]  \  }
}d|	|
|z   <    |j3                  d|j5                         |j7                  |j9                  |	      j;                  d      j9                  ddgz  dgz               fz         }d| j<                  fdfD ]  \  }}|j%                  ||      ||<    |j                  dd       |j                  d      rddlm} |j7                  |      }|j                  dd        |j                  d      }|r ||      } |j>                  ||fi | tA        |d      s%t
        jB                  dk(  rddl"m#}  |||        y y y )!Nz*Invalid value '%s' for fn when fmt is Noner   r   preConvertCBGIF)TIFFTIFFPTIFFLTIFTIFF1r   r   r   rD  )PCTr   r  )r  )PNGBMPPPM)JPGJPEGrN  zUnknown image kind %sr   )
ImageChopsr(   i   )r      i   r,   r  
resolution)zresolution unitinchchops_invert)rO  	preSaveCBr   r   r   r  )$r?  re   r   r   asciir   r   r  
startswithr  
setdefaultrJ   r(  r   endswithr   r   r  r*  r   r)   rO  r(   zip
bitmap_rgbmergesplitinvertpointr   r  saver   r  r  r   )rM   r	  r
  r   r  rA  tcrO  r(   Tor4   adrT  r   s                   r$   
saveToFilezPMCanvas.saveToFileY  s   ZZ\;b% !MPUVXPY!YZZ''""2&q)C~~c"#ab'CNN(b	^D1]]>2b!Biik(?r"B::||C "2&c""2&c""2&CN"r"SY]]=QU5VWW((N"C 7# =>>;}T2B1GR]]_= !DAq AacF! [[Z5F5FrxxPQ{GZGZ[^G_GeGefikljmfmornsfsGt5u4w)wx$TYY/0JJ 2!(}}Qq1	!2^A.==(&""2&B[.--,	2B3##r'"rww~8$ (6"r6   c                 \    t               }| j                  ||       |j                         S )Nr  )r   re  getvalue)rM   r
  rk   s      r$   saveToStringzPMCanvas.saveToString  s%    Ic"zz|r6   c                    ddl }| j                  }| j                  dk(  r*|j                  dk(  rd|_        |j                  }d|_        n|j                  }|j
                  |j                  }}|j                  |j                  ddt        |      dz   ddd	||d
d
             |dz  }t        t        |      d|       D ]  }|j                  |||z
  |         |j                  d       y)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>  r|   r}   r   packrh   r   )	rM   r  rn  r5  pixr|   r}   rowbrb  s	            r$   
_saveToBMPzPMCanvas._saveToBMP  s    
 	XX==+%"''8*;BG))CBG))C"))v	,T#c(2+a2eFSTUWXYqys3x4%( 	#AGGC$qM"	#	r6   c                 2    t        | j                  ||       y rH   )_setFontr  )rM   r^   r_   leadings       r$   r   zPMCanvas.setFont  s    (8,r6   c                 2    t        | j                  ||       y rH   )r3  r  )rM   r  values      r$   __setattr__zPMCanvas.__setattr__  s    e$r6   c                 .    t        | j                  |      S rH   )r   r  )rM   r  s     r$   __getattr__zPMCanvas.__getattr__  s    txx%%r6   c                 N    |r| j                          |r| j                          y y rH   )r   r   )rM   r   r   s      r$   r   zPMCanvas.fillstrokepath  s    4??$6r6   c                    t        ||z
        dk  sJ t        t        |z  dz        }t        t        |z  dz        }|||z  z   }	|||z  z   }
t        t        |z  dz        }t        t        |z  dz        }|||z  z   }|||z  z   }| |z  }||z  }t        ||z
  z  dz  }t        ddt        |      z
  z  t        |      z        }|	||z  z   }|
||z  z   }| |z  }||z  }|||z  z
  }|||z  z
  }|	|
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   )rM   r   r   ry   rz   theta0theta1cos0sin0x0y0cos1sin1x3y3dx1dy1halfAngr8  r   r   dx2dy2r   r   s                            r$   _bezierArcSegmentCCWzPMCanvas._bezierArcSegmentCCW  sK    6F?#r)))2f9U?#2f9U?#"T'\"T'\2f9U?#2f9U?#"T'\"T'\cDj4i fVm$k2	S3w</1CLAC#'\#'\cDj4i#'\#'\B2b'Br7RG466r6   c           	         ||z
  }t        |      dk  r||fg}n`t        t        t        |      dz              }	t        |      |	z  }
g }t	        |	      D ]"  }|||
z  z   }||
z   }|j                  ||f       $ g }|D ]b  \  }}|s.| j                  ||||||      \  \  }}}|j                  |       6| j                  ||||||      \  \  }}}|j                  |       d 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  )rM   r   r   ry   rz   r  r  angularExtent	angleListNfrag	fragAngleiirc  bctrlptsr  r  ptstmpxtmpys                       r$   bezierArcCCWzPMCanvas.bezierArcCCW  s    }% )Is=1#568Em,e3IIEl (R)^+	M  !A'(
  	$EQq!%!:!:2b"R1!M"R#s#%)%>%>r"bQq%Q"$tcs#	$ B!!r6   c           	          | j                  ||||||      \  \  }}}	| j                  ||       |	D ]%  \  \  }
}\  }}\  }}| j                  |
|||||       ' y)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   )rM   r   r   ry   rz   ang1ang2r  r  r  r   r   r   r   r  r  s                   r$   addEllipsoidalArczPMCanvas.addEllipsoidalArc  sm    
 "..r"bDF"R'Br*1 	,&Wbgr"gr"LLBr"R+	,r6   c                 2    | j                  ||||||       y )N)r   	directionshapingr   )rM   rA   rB   r   r   r  r  s          r$   drawCentredStringzPMCanvas.drawCentredString  s    !DkIW^_r6   c                 0    | j                  |||d|       y )Nr   )r   r  r  )rM   r   rA   rB   r  s        r$   drawRightStringzPMCanvas.drawRightString  s    QqUYGr6   c                 v   | j                   }|j                  }	|j                  }
|r||	|
fk7  r|\  }}t        |||       n|
}|	}t	        |||||      \  }}	 |dv r=t        |||      }|dk(  r||z  }n%|dk(  r	||dz  z  }n|dk(  r|t        |||||      z  }| j                  dk(  r|j                  |||       nt        |      }|j                  r|j                  |||       n|}t        |      s	 |j                  d      }t        ||g|j                   z         }t#        |      }|dz
  }t%        |      D ]o  }||   \  }}||k7  rt        ||j                  |       |}|j                  |||       ||k7  sB||j                  |j                  |j&                        |      z  }q |j)                  |
|	       y # t        $ rW}|j                  d	d
 \  }}t        |j                  d d
 |j                  d
   d||dz
  | d||| d|||dz    fz    d }~ww xY w# |j)                  |
|	       w xY w)N)r^   r_   r  )r   r   r   r   r   g       @r   r   utf8r[   rp   

   z-->z<--r   )r  r_   r^   rt  r   r   r   r   r   r   _dynamicFontr   decodeUnicodeDecodeErrorargsr   substitutionFontsrh   r   encNamer   )rM   rA   rB   r   r   r   r  r  r5  gs_fontSizegs_fontNamer^   r_   r   fontfcer   jFTnnm1r  ts                           r$   r   zPMCanvas.drawString	  s   XXkkkk[$==!*HhR*"H"H&tIxQYbijg%	055%dHX>%LA (*OA )+{4RRA}}k)a$'x($$MM!Ad+B$T?L#';;v#6D
 $D$0F0F)FGBBAA#C"1X M!!u1b5$R

8<!"Ba!,c6qxx		/B8!LLAM JJ{;/!  2 L"#&&1+CAa"4qvvbqzYZY_Y_`aYbcghijlhlmncoptuvwxpyz~  @A  BC  DF  BF  {G  DH  CJ  8J  #L  LL  JJ{;/s9   BH$ 6G A6H$ >0H$ 	H!
AHH!!H$ $H8c                     | j                   E| j                          | j                  ||       | j                  ||       | j	                          y y rH   )rV   r   r   r   r   )rM   r   r   r   r   s        r$   r   zPMCanvas.line=  sC    'NNKK2KK2OO	 (r6   c                    | j                          | j                  ||       | j                  ||z   |       | j                  ||z   ||z          | j                  |||z          | j                          | j	                  ||       y )N)r   r   )r   r   r   r   r   )rM   rA   rB   r|   r}   r   r   s          r$   r{   zPMCanvas.rectD  sq    AqAeGQAeGQZ(Aq6z"6t4r6   c                    |dk(  r|}|dk(  r|}||z   }||z   }| j                          | j                  ||z   |       | j                  ||z
  ||z   ||dd       | j                  ||z
  ||z
  ||dd       | j                  ||z   ||z
  ||dd       | j                  ||z   ||z   ||dd       | j                          | j	                          y)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   )	rM   rA   rB   r|   r}   ry   rz   r   r   s	            r$   r~   zPMCanvas.roundRectM  s    
 q5r"q5r"YZAbDr"uadBC>r"ubeRQ;qtRUBB<qtQrT2r3=r6   c                 ,    | j                  ||||       y)zRadd closed path circle with center cx,cy and axes r: counter-clockwise orientationN)r   )rM   r   r   r   s       r$   r   zPMCanvas.circle_  s    R1Qr6   c                 z   | j                          ||z   }|}|}||z
  }||z   }	||t        z  z
  }
||t        z  z   }|}| j                  ||       | j                  |	|
||||       |}|}||z
  }|}||t        z  z
  }	||z
  }
|}||t        z  z
  }| j                  |	|
||||       |}|}|}||z   }||z
  }	||t        z  z   }
||t        z  z
  }||z   }| j                  |	|
||||       |}|}||z   }|}||t        z  z   }	||z   }
||z   }||t        z  z   }| j                  |	|
||||       | j	                          y)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   )rM   r   r   ry   rz   r  r  r  r  r   r   r   r   s                r$   r   zPMCanvas.ellipsec  s    	"WUU###"%%%BR2bB'U###U$$$R2bB'UU###$$$UR2bB'U###UU###R2bB'r6   c                      y)zdo nothing for compatibilityNr   rL   s    r$   	saveStatezPMCanvas.saveState  s    r6   c                 ^    | j                  |      | _        t        |dd       }||| _        y y Nrl   )r  r]   r   r\   rM   aColorrl   s      r$   rj   zPMCanvas.setFillColor  s5    --f5wt,$D r6   c                 ^    | j                  |      | _        t        |dd       }||| _        y y r  )r  rV   r   rU   r  s      r$   rb   zPMCanvas.setStrokeColor  s6    //7wt,!&D r6   c                     || _         y rH   )rc   )rM   caps     r$   
setLineCapzPMCanvas.setLineCap  s	    r6   c                     || _         y rH   )rd   )rM   joins     r$   setLineJoinzPMCanvas.setLineJoin  s	    r6   c                     || _         y rH   )rT   )rM   r|   s     r$   setLineWidthzPMCanvas.setLineWidth  s
     r6   c                     t        ||xs | j                  j                  ||      S | j                  j                        S rH   )r   r  r^   r_   )rM   r   r^   r_   s       r$   r   zPMCanvas.stringWidth  sE    4!>TXX->->-5-A[ 	[GKxxGXGX[ 	[r6   )H    NNr   )Nr  rH   rB  )r   r   )r   NF)NleftNF)NN)"r   r   r   r%  staticmethodr  r9  r?  re  rh  rr  r   rx  rz  r   r  r  r  r  r  r   r   r{   r~   r   r   r  rj   rb   restoreStater  r  r  r   r   r6   r$   r  r  &  s    DH$!" Y Y
6%p
(-%&%!7F"<	,`H20h5$ 9v%' L![r6   r  r  r  r   c           	          t        |       } t        | j                  | j                  |||||      }t	        | |ddfd|i| |S )N)r!  r"  r  r!   r#  r   r:   )r   r  r|   r}   r>   )	rd  r!  r"  r  r:   r!   r#  rC   r4   s	            r$   drawToPMCanvasr    sI    AA!((iQXdnoAAq!6,66Hr6   c           
      D    t        | f||||||d|j                         S )Nr!  r"  r  r:   r!   r#  )r  r?  )rd  r!  r"  r  r:   r!   r#  rC   s           r$   	drawToPILr    sJ    !  Ly|el  yC  L  GK  L  R  R  T  Tr6   c           
          t               }t        | f||||||d|}	|	j                  d|j                  |j                        S )Nr  r   r   )r*   r  r   r   r   )
rd  r!  r"  r  r:   r!   r#  rC   r(   r   s
             r$   
drawToPILPr    sT    KE	1  
D#"	]dpz  
D  C  
DB::c%**enn:EEr6   rC  c	           
      N    t        | f||||||d|	}
|
j                  ||       y)zocreate a pixmap and draw drawing, d to it then save as a file
    configPIL dict is passed to image save methodr  N)r  re  )rd  r	  r
  r!  r"  r  r:   r!   r#  rC   r4   s              r$   
drawToFiler    s@     	q  	HcbILaht~  	H  CG  	HALLCr6   c           
      ^    t               }	t        | |	f||||||d| |	j                         S )N)r
  r!  r"  r  r!   r#  )r   r  rg  )
rd  r
  r!  r"  r  r:   r!   r#  rC   rk   s
             r$   drawToStringr    s5    	Aqnsi[enimn::<r6   c           	      *   d }dd l }ddlm} ddlm |j
                  }g }|j                  j                  |       s |j                  |        d}d}|g}	i }
t        j                  dd  }|D cg c]  }|j                  d      s| }}|sg d	}nI|D ]  }|j                  |        d
j                  |D cg c]  }|dd  	 c}      j                  d
      }g dd lddlm fd} |t%        t&        d            D ]  \  }}}|
j)                  |d      dz   x}|
|<   |dkD  r|d|dz
  z  z  }|r||vr9|}t+        |j,                        }t+        |j.                        }|	j1                  d|d|d       |D ].  }|dv r"|	j1                  d|j3                         z         	 |d ||      }|j                  j                  | |      }|j                  j5                  |      r |j                  |       |dk(  rt7        |||dt8        i       n)|dv r|j;                  ddg| |       nt7        |||       |dv r|	j1                  d |z         n3|dk(  r|	j1                  d!|z         n|dk(  r|	j1                  d"|z         sd#kD  rt=        d$t?        |      z         1 |jB                  jE                  d%d&      d'k(  rd|jF                  d(<   d)D ]  }	 |j;                  |g| |         r:|	d   jI                  d*d+      |	d<   |	j1                  d,       |	jK                         |	j1                  |       |j                  j                  | d-      }tM        |d.      5 }|jO                  |	       d d d        t        jP                  d/k(  rdd0l)m*}  ||d12       sd#kD  rt=        d$|z         y y c c}w c c}w # t@        $ r  |||       Y hw xY w#   |||       Y xY w# 1 sw Y   wxY w)3Nc                     | dk(  rd} | S )Ntifftifr   )rA   s    r$   r  ztest.<locals>.ext  s    f9ar6   r   )
testshapes)verbosezq<html><head><title>renderPM output results</title></head>
    <body>
    <h1>renderPM results of output</h1>
    z</body>
    </html>
    r   z--ext=)gifr  pngjpgpctpyr   ,   )escapec                     d| d|d}sdkD  rt        |       j                  d|z         t               }j                  |       j                  d |j	                               z         y )NzProblem drawing z fmt=z filer[   z"<br/><h2 style="color:red">%s</h2>)filez<pre>%s</pre>)printr   r   	print_excrg  )	r  r
  msgbuferrsr  shout	tracebackr  s	       r$   handleErrorztest.<locals>.handleError  sb    04S9GAIuSz83>?j%OfS\\^&<<=r6   ft_get_face)doTTFz.%02dz<hr><h2>Drawing z</h2>
<pre>z</pre>)r  r  r  r  z<p>%s format</p>
r   r  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>
r[   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argvrV  remover  r\  r  xml.sax.saxutilsr  r   r  rW  r/   r|   r}   r   r(  r   r  r   r_  r  rU  r,  environr*  r<   replaceextendr   
writelinesplatformr  r   ) r  r  r  r   r  r  drawingshtmlTop
htmlBottomhtmlnamesr
  rc  Er  r?   	docstringr  r   r  r  r   r8  filenamefullpathhtmlFileNamer  r   r  r  r  r  s     `                          @@@@r$   testr    s   
 -+#66H77== GJ 9DE88AB<D3qALL23A3< 	AKKN	XXa(qu()005D'> > '9wzR_?`&a %$")T**42144E$KQ31Q3'D$hiPQ 	$A--01779<=$&,c!f577<<977>>(+BIIh'e8wxAu@UV,&LL$uV6LRwxA6++KK AH LMWKK F QRXKK <x GHGAIuZh-G'H)	$. ::>>+C0#5UVw7G7G	7R 	$A$aSfE	$C%$N q'//'*cdQ()DKK
77<<8L	lC	  A	T
||U4\f-	5l!:;	M 	4 )X " $D#$$D# s=   4OO?O7DO2O8P	O54O58P	P__main__T)r  rH   )pmoutF)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   rt  r   r   r	  ior   r   mathr   r   r   r   r%   r   r  r*   r5   r8   _unset_r>   rE   r;   r   r   r   r  dictr)  r  r  r  r  r  r  r  r_  r  r   r   r6   r$   <module>r,     s   	1 ( L I I > 6 4 # /  5    # #y889J
. .7->-> R 3@( @DF H(w? V[ V[n T	HYHYbkb{b{  HM  H9CTCT]f]v]v  CH T XIDUDU^g^w^w  DI F
 2(dQZQbQbkt  lE  lE  QV  "TPYPaPajs  kD  kD  PU 
 ]<~ Zt U  Js   /E< <FF