
    h{                        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                 h   | st         j                  } | dk(  r	 dd l}|S d| j                         v r	 dd l}|S t        d|        # t        $ r)}	 dd l}n# t        $ r t        d      w xY wY d }~|S d }~ww xY w# t        $ r-}	 dd l}n# t        $ r t        d|  d      w xY wY d }~|S d }~ww xY w)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errMsgs      K/home/dcms/DCMS/lib/python3.12/site-packages/reportlab/graphics/renderPM.py_getPMBackendr'      s   i77G	@$. H 
GMMO	#	@! H 8	BCC+  		@@% @# %? @ @@ &( H-		@  	@@( @#(OPWy Y< %? @ @@ ) H	@sR   A A; 	A8AA3A**A33A8;	B1B
	B,
B##B,,B1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,   @   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&   	Color2Hexr7   G   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   r5   s    r&   
CairoColorr:   L   s    
 71:-A-r8   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@   T   s7    AJJdFFw'ALFQr8   )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&   rL   z_PMRenderer.pop`   s    r8   c                 p    t        |      }| j                  j                  |       | j                          y rJ   )r   rK   pushrM   )rO   nodedeltass      r&   rQ   z_PMRenderer.pushd   s(    t$6"r8   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)rK   getState_canvasrU   rV   rW   setStrokeColorlineCaplineJoinr[   
isinstancelisttuplelen	dashArrayr^   setFillColorr   )rO   salphadas       r&   rM   z_PMRenderer.applyStatei   sB   MM""$U8#$]#3 /").DLL&##Am$45 1 !"2 3 !* !Bb$u.S2wzBqE4,!?U!#- ',DLL$!!!K.1Qz]AjM:r8   c                     | j                   j                  d   }| j                  j                  dd ||fz   x|d<   |d<   | j                   j	                  |       | j                          y )Nr      	transformrU   )rK   	_combinedrc   _baseCTMrQ   rM   )rO   rC   rD   rS   s       r&   	initStatez_PMRenderer.initState   s_    ((,.2ll.C.CAa.H!A.NN{fUm6"r8   c                 h    | j                  |       | j                  |       | j                          y)zEThis is the recursive method called for each node
        in the treeN)rQ   drawNodeDispatcherrL   )rO   rR   s     r&   drawNodez_PMRenderer.drawNode   s*    
 			$ 	% 	
r8   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   )	rc   rxryrectrC   rD   widthheight	roundRect)rO   r}   r6   s      r&   drawRectz_PMRenderer.drawRect   sp    LL77dgg""FF466$&&$**dkk:KKtvvtzz4;;Qr8   c                     | j                   j                  |j                  |j                  |j                  |j
                         y rJ   )rc   linex1y1x2y2)rO   r   s     r&   drawLinez_PMRenderer.drawLine   s*    $''$''$''$'':r8   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   )pathrg   strosisfiler,   openr   hasattrsizer~   r   rc   	_aapixbufrC   rD   _backendr   tostring)rO   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		r8   c                     | j                   }|j                  |j                  |j                  |j                         |j                          y rJ   )rc   circlecxcyrfillstrokepath)rO   r   r6   s      r&   
drawCirclez_PMRenderer.drawCircle   s3    LL	699fhh/	r8   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   )
pointsrj   rc   	pathBeginmoveTorangelineTo	pathClosepathFill
pathStroke)rO   polyline_doClosePr6   is         r&   drawPolyLinez_PMRenderer.drawPolyLine   s    OO1v{AAA{LL		1qtq#a&!$ 	#AHHQqT1QqS6"	#KKMJJL	r8   c                     | j                   }|j                  |j                  |j                  |j                  |j
                         |j                          y rJ   )rc   ellipser   r   r{   r|   r   )rO   r   r6   s      r&   drawEllipsez_PMRenderer.drawEllipse   s9    
,,			'**gjj'**WZZ@	r8   c                 *    | j                  |d       y )Nr   )r   )r   )rO   polygons     r&   drawPolygonz_PMRenderer.drawPolygon   s    '1-r8   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`   ra   )start	inheritedendmiddler]   numericzbad value for textAnchor )	_fontInfo)rc   r_   getattrrK   rb   textrC   rD   r   numericXShiftencoding
ValueErrorr   r   
drawString)rO   	stringObjcanvfillr   Stext_anchorr`   ra   r   rC   rD   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 )Nrq   r   r   )_renderPath	autoclose c                 :    j                           |       S )N
forceClose)r   )r   r   r6   	drawFuncsr   s    r&   rPz _PMRenderer.drawPath.<locals>.rP   s    KKMtY:FFr8   r[   svgTr   pdf)F)rc   EmptyClipPath
_clipPaths
isClipPathdrawPathclipPathClearreportlab.graphics.shapesr   r   r   curveTor   r   clipPathSetappendr_   rX   r   r   )rO   r   r   icpr   r   r   stroker[   r   r6   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$LLNr8   N)r   )__name__
__module____qualname____doc__rL   rQ   rM   rv   ry   r   r   r   r   r   r   r   r   r    r8   r&   r=   r=   [   sN    :
;4R;(

.8:/r8   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Er8   c                 $    | j                  d      S )NLr   r   s    r&   _convert2pilLr   !      ::c?r8   c                 $    | j                  d      S )N1r   r   s    r&   _convert2pil1r   $  r   r8   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rowsrm   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                 J   |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
<   t        | j                  j
                        t        t              k(  rdn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   ru   r   	configPIL_dpir   r!   r   _backendfmt_colorConverterN)r1   
_getGStater>   typer  r   powr   r:   r7   ru   rU   )	rO   whdpibgr  r#   
backendFmtscales	            r&   __init__zPMCanvas.__init__7  s    D%%#q2g*Me!e%*1QuQq$9j!&(l#%.k" #f378J8J3KTRUY3VK\gj!'1m$9=9S:Yb'(==r8   c                    t        |      }|t        j                  }|dk(  r	 |j                  | ||      S d|j                         v r<|j                         }t        j                  ||      }	 |j                  | |||      S t        d|      # t        $ r" 	 |j                  | |||      cY S #  Y nxY wY 8w xY w# t        $ r |j                  | ||      cY S w xY w)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  mods         r&   r   zPMCanvas._getGStateI  s    G$?//GKzz!Az,, '))+C!%%c#.C-zz!AbSz11 KG;WXX  ::a":55D	 " -zz!Az,,-s;   B 1C 	B?B52B?5B97B?>B?C"!C"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)rU   rV   rX   re   rf   rk   r_   r+  r  )r  _drawingr~   r   r  r`   ra   keysr   r  r,  r>   setattrr   )	rO   r#  r$  r&  AgsfNfSks	            r&   _drawTimeResizezPMCanvas._drawTimeResize_  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r8   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)rO   r   s     r&   toPILzPMCanvas.toPILm  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__%	r8   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   rI  )PCTr  r  )r  )PNGBMPPPM)JPGJPEGrS  zUnknown image kind %sr   )
ImageChopsr*   i   )r      i   r.   r  
resolution)zresolution unitinchchops_invert)rT  	preSaveCBr   r   r   r  )$rD  rg   r   r   asciir   r   r  
startswithr  
setdefaultrL   r/  r   endswithr   r   r  r1  r   r+   rT  r*   zip
bitmap_rgbmergesplitinvertpointr   r  saver   r	  r
  r  )rO   r  r  r   r  rF  tcrT  r*   Tor6   adrY  r  s                   r&   
saveToFilezPMCanvas.saveToFiler  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"r8   c                 \    t               }| j                  ||       |j                         S )Nr  )r   rj  getvalue)rO   r  rm   s      r&   saveToStringzPMCanvas.saveToString  s%    Ic"zz|r8   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@  rC  r~   r   r   packrj   r   )	rO   r  rs  r:  pixr~   r   rowbrg  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"	#	r8   c                 2    t        | j                  ||       y rJ   )_setFontr  )rO   r`   ra   leadings       r&   r   zPMCanvas.setFont  s    (8,r8   c                 2    t        | j                  ||       y rJ   )r8  r  )rO   r	  values      r&   __setattr__zPMCanvas.__setattr__  s    e$r8   c                 .    t        | j                  |      S rJ   )r   r  )rO   r	  s     r&   __getattr__zPMCanvas.__getattr__  s    txx%%r8   c                 N    |r| j                          |r| j                          y y rJ   )r   r   )rO   r   r   s      r&   r   zPMCanvas.fillstrokepath  s    4??$6r8   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   )rO   r   r   r{   r|   theta0theta1cos0sin0x0y0cos1sin1x3y3dx1dy1halfAngr=  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6r8   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  r1   r   floatr   r   r  )rO   r   r   r{   r|   r  r  angularExtent	angleListNfrag	fragAngleiirh  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!!r8   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   )rO   r   r   r{   r|   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+	,r8   c                 2    | j                  ||||||       y )N)r   	directionshapingr   )rO   rC   rD   r   r   r  r  s          r&   drawCentredStringzPMCanvas.drawCentredString  s    !DkIW^_r8   c                 0    | j                  |||d|       y )Nr   )r   r  r  )rO   r   rC   rD   r  s        r&   drawRightStringzPMCanvas.drawRightString  s    QqUYGr8   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`   ra   r  )r   r   r   r   r   g       @r   r!   utf8r]   rr   

   z-->z<--r   )r  ra   r`   ry  r   r   r   r   r   r   _dynamicFontr   decodeUnicodeDecodeErrorargsr   substitutionFontsrj   r   encNamer   )rO   rC   rD   r   r   r   r  r  r:  gs_fontSizegs_fontNamer`   ra   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 rJ   )rX   r   r   r   r   )rO   r   r   r   r   s        r&   r   zPMCanvas.lineV  sC    'NNKK2KK2OO	 (r8   c                    | j                          | j                  ||       | j                  ||z   |       | j                  ||z   ||z          | j                  |||z          | j                          | j	                  ||       y )N)r   r   )r   r   r   r   r   )rO   rC   rD   r~   r   r   r   s          r&   r}   zPMCanvas.rect]  sq    AqAeGQAeGQZ(Aq6z"6t4r8   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   )	rO   rC   rD   r~   r   r{   r|   r   r   s	            r&   r   zPMCanvas.roundRectf  s    
 q5r"q5r"YZAbDr"uadBC>r"ubeRQ;qtRUBB<qtQrT2r3=r8   c                 ,    | j                  ||||       y)zRadd closed path circle with center cx,cy and axes r: counter-clockwise orientationN)r   )rO   r   r   r   s       r&   r   zPMCanvas.circlex  s    R1Qr8   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   )rO   r   r   r{   r|   r  r  r  r  r   r   r   r   s                r&   r   zPMCanvas.ellipse|  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'r8   c                      y)zdo nothing for compatibilityNr   rN   s    r&   	saveStatezPMCanvas.saveState  s    r8   c                 ^    | j                  |      | _        t        |dd       }||| _        y y Nrn   )r  r_   r   r^   rO   aColorrn   s      r&   rl   zPMCanvas.setFillColor  s5    --f5wt,$D r8   c                 ^    | j                  |      | _        t        |dd       }||| _        y y r  )r  rX   r   rW   r  s      r&   rd   zPMCanvas.setStrokeColor  s6    //7wt,!&D r8   c                     || _         y rJ   )re   )rO   caps     r&   
setLineCapzPMCanvas.setLineCap  s	    r8   c                     || _         y rJ   )rf   )rO   joins     r&   setLineJoinzPMCanvas.setLineJoin  s	    r8   c                     || _         y rJ   )rV   )rO   r~   s     r&   setLineWidthzPMCanvas.setLineWidth  s
     r8   c                     t        ||xs | j                  j                  ||      S | j                  j                        S rJ   )r   r  r`   ra   )rO   r   r`   ra   s       r&   r   zPMCanvas.stringWidth  sE    4!>TXX->->-5-A[ 	[GKxxGXGX[ 	[r8   )H    NNr   )Nr  rJ   rG  )r   r   )r   NF)NleftNF)NN)"r   r   r   r)  staticmethodr   r>  rD  rj  rm  rw  r   r}  r  r   r  r  r  r  r  r   r   r}   r   r   r   r  rl   rd   restoreStater  r  r  r   r   r8   r&   r  r  6  s    DH$!$ Y Y*
6%p
(-%&%!7F"<	,`H20h5$ 9v%' L![r8   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@   )	ri  r%  r&  r  r<   r#   r'  rE   r6   s	            r&   drawToPMCanvasr    sI    AA!((iQXdnoAAq!6,66Hr8   c           
      D    t        | f||||||d|j                         S )Nr%  r&  r  r<   r#   r'  )r  rD  )ri  r%  r&  r  r<   r#   r'  rE   s           r&   	drawToPILr    sJ    !  Ly|el  yC  L  GK  L  R  R  T  Tr8   c           
          t               }t        | f||||||d|}	|	j                  d|j                  |j                        S )Nr  r   r   )r,   r  r   r   r   )
ri  r%  r&  r  r<   r#   r'  rE   r*   r   s
             r&   
drawToPILPr    sT    KE	1  
D#"	]dpz  
D  C  
DB::c%**enn:EEr8   rH  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  rj  )ri  r  r  r%  r&  r  r<   r#   r'  rE   r6   s              r&   
drawToFiler    s@     	q  	HcbILaht~  	H  CG  	HALLCr8   c           
      ^    t               }	t        | |	f||||||d| |	j                         S )N)r  r%  r&  r  r#   r'  )r   r  rl  )
ri  r  r%  r&  r  r<   r#   r'  rE   rm   s
             r&   drawToStringr    s5    	Aqnsi[enimn::<r8   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   )rC   s    r&   r  ztest.<locals>.ext  s    f9ar8   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_excrl  )	r	  r  msgbuferrsr  shout	tracebackr  s	       r&   handleErrorztest.<locals>.handleError  sb    04S9GAIuSz83>?j%OfS\\^&<<=r8   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argvr[  remover  ra  r  xml.sax.saxutilsr  r   r  r\  r1   r~   r   r   r/  r   r  r   rd  r  rZ  r2  environr1  r>   replaceextendr   
writelinesplatformr
  r  ) r  r  r  r   r  r  drawingshtmlTop
htmlBottomhtmlnamesr  rh  Er  rA   	docstringr	  r   r  r#  r$  r=  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  rJ   )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   ry  r   r   r  ior   r   mathr   r   r   r   r'   r   r  r,   r7   r:   _unset_r@   rG   r=   r   r   r   r  dictr0  r  r  r  r  r  r  r  rd  r!  r   r   r8   r&   <module>r1     s   	1 ( L I I > 6 4 # /  5    # #:y889J
. .7->-> R 3@( @DF H(w? _[ _[@ 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 g  Js   /E< <FF