
    Q?h{                        S r SrSSK7  SSKJrJr  SSKJrJrJ	r	  SSK
JrJr  SSKJr  SSKJrJr  SS	KJr  SS
KJrJr  SSKJr  SSKJrJr  SSKrSSKrSSKJ r J!r!  SSK"J#r#J$r$J%r%J&r&  S0S jr' \'" \RP                  5      r)S r*S r+S r,\RZ                  4S jr.SSKJ/r/   " S S\/5      r0S r1S r2S r3S0S jr4\5" SSSS9r6S r7 " S! S"5      r8S#S$S\RZ                  \RP                  S%4S& jr9S#S$S\RZ                  \RP                  S%4S' jr:S#S$S\RZ                  \RP                  S%4S( jr;S)S#S$S\RZ                  \RP                  S%4S* jr<S)S#S$S\RZ                  \RP                  S%4S+ jr=\<r>S1S, jr?\@S-:X  a  \?" S.S/9  gg! \ a    Sr) GN	f = f)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                 |   U (       d  [         R                  n U S:X  a   SS KnU$ SU R                  5       ;   a   SS KnU$ [        SU  35      e! [         a)  n SS Kn S nAU$ ! [         a    [        S5      ef = fS nAff = f! [         a-  n SS Kn S nAU$ ! [         a    [        SU  S35      ef = fS nAff = f)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      M/var/www/html/env/lib/python3.13/site-packages/reportlab/graphics/renderPM.py_getPMBackendr'      s    i77G	@$. H 
GMMO	#	@! H 8	BCC+  		@@%( H'  @# %? @ @@		@  	@@( H  @#(OPWy Y< %? @ @@	@sF   A B 
BA##A99A<<B
B;BB33B66B;c                  >     SSK Jn   U $ ! [         a    SS Kn  U $ f = f)Nr   Image)PILr*   r    r)   s    r&   	_getImager,   @   s*     L  Ls   
 c                     U (       aY  S[        SU R                  -  5      -  S-  S[        SU R                  -  5      -  S-  -  S[        SU R                  -  5      -  -  $ U $ )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                 "    U b  [        U 5      $ U $ )zy
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                     [        5       nUR                  R                  U5        UR                  [	        U 5      XX4S9  g)z
As it says)showBoundaryN)_PMRenderer__dict__updatedrawr   )drawingcanvasxyr<   kwdsRs          r&   r@   r@   T   s3    AJJdFFw'AFQr8   )Rendererc                   p    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rSS jrS rS rS rS rSrg)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    U R                   R                  5         U R                  5         g N)_trackerpop
applyStateselfs    r&   rM   _PMRenderer.pop`   s    r8   c                 p    [        U5      nU R                  R                  U5        U R                  5         g rK   )r   rL   pushrN   )rP   nodedeltass      r&   rS   _PMRenderer.pushd   s(    t$6"r8   c                    U R                   R                  5       nUS   U R                  l        US   U R                  l        US   nUb  X R                  l        U R                  R                  US   5        US   U R                  l        US   U R                  l        US   U R                  l	        US   nU(       d  S nOO[        U[        [        45      (       d  U4n[        U5      S	:w  d  [        US
   [        [        45      (       d  SU4nX0R                  l        US   nUb  X R                  l        U R                  R!                  US   5        U R                  R#                  US   US   5        g )NctmstrokeWidthstrokeOpacitystrokeColorstrokeLineCapstrokeLineJoinfillModestrokeDashArray   r   r   fillOpacity	fillColorfontNamefontSize)rL   getState_canvasrX   rY   rZ   setStrokeColorlineCaplineJoinr^   
isinstancelisttuplelen	dashArrayra   setFillColorr   )rP   salphadas       r&   rN   _PMRenderer.applyStatei   sB   MM""$U8#$]#3 /").LL&##Am$45 1 !"2 3 !* !Bb$u..S2wzBqE4,!?!?U!#- ',LL$!!!K.1Qz]AjM:r8   c                     U R                   R                  S   nU R                  R                  SS X4-   =US'   US'   U R                   R	                  U5        U R                  5         g )Nr      	transformrX   )rL   	_combinedrf   _baseCTMrS   rN   )rP   rC   rD   rU   s       r&   	initState_PMRenderer.initState   s]    ((,.2ll.C.CAa.H!.NN{fUm6"r8   c                 h    U R                  U5        U R                  U5        U R                  5         g)z=This is the recursive method called for each node
in the treeN)rS   drawNodeDispatcherrM   )rP   rT   s     r&   drawNode_PMRenderer.drawNode   s*    
 			$ 	% 	
r8   c                    U R                   nUR                  UR                  s=:X  a  S:X  a@  O  O=UR                  UR                  UR
                  UR                  UR                  5        g UR                  UR                  UR
                  UR                  UR                  UR                  UR                  5        g )Nr   )	rf   rxryrectrC   rD   widthheight	roundRect)rP   r   r6   s      r&   drawRect_PMRenderer.drawRect   sp    LL77dgg""FF466$&&$**dkk:KKtvvtzz4;;Qr8   c                     U R                   R                  UR                  UR                  UR                  UR
                  5        g rK   )rf   linex1y1x2y2)rP   r   s     r&   drawLine_PMRenderer.drawLine   s*    $''$''$''$'':r8   c           
         UR                   n[        U[        5      (       aU  U(       a$  [        R                   R	                  U5      (       d  g [        5       R                  U5      R                  S5      nO$[        US5      (       a  UR                  S5      nOg UR                  u  pEUR                  UR                  pvUc  UnUc  UnU R                  R                  UR                  UR                  XgU R                  R                   S:X  a  UO-[        US5      (       a  UR"                  OUR$                  " 5       XES5        g )NRGBconvertr!   tobytes   )pathrj   strosisfiler,   openr   hasattrsizer   r   rf   	_aapixbufrC   rD   _backendr   tostring)rP   imager   imsrcWsrcHdstWdstHs           r&   	drawImage_PMRenderer.drawImage   s    zzd3RWW^^D11F!!$'//6BT)$$e$BWW
[[%,,d<<$||,,k9(/9(=(="**2;;NQA		r8   c                     U R                   nUR                  UR                  UR                  UR                  5        UR                  5         g rK   )rf   circlecxcyrfillstrokepath)rP   r   r6   s      r&   
drawCircle_PMRenderer.drawCircle   s3    LL	699fhh/	r8   c                    UR                   n[        U5      S:  d   S5       eU R                  nUR                  5         UR	                  US   US   5        [        S[        U5      S5       H  nUR                  X5   X5S-      5        M     U(       a   UR                  5         UR                  5         UR                  5         g )Nr`   z#Polyline must have 1 or more pointsr   r   )
pointsrm   rf   	pathBeginmoveTorangelineTo	pathClosepathFill
pathStroke)rP   polyline_doClosePr6   is         r&   drawPolyLine_PMRenderer.drawPolyLine   s    OO1v{AAA{LL		1qtq#a&!$AHHQT1qS6" %KKMJJL	r8   c                     U R                   nUR                  UR                  UR                  UR                  UR
                  5        UR                  5         g rK   )rf   ellipser   r   r   r   r   )rP   r   r6   s      r&   drawEllipse_PMRenderer.drawEllipse   s9    
,,			'**gjj'**WZZ@	r8   c                 $    U R                  USS9  g )Nr   )r   )r   )rP   polygons     r&   drawPolygon_PMRenderer.drawPolygon   s    '1-r8   c           	      0   U R                   nUR                  n[        USS5      nUc  U(       a  U R                  R	                  5       nUS   nUS   nUS   nUR
                  n	UR                  n
UR                  nUS;  a]  [        XU5      nUS:X  a  X-  n
OFUS:X  a  XS	-  -  n
O8US
:X  a  U
[        XiXXR                  5      -  n
O[        S[        U5      -   5      eUR                  nXBl         UR                  XXU4S9  Xl        g g ! Xl        f = f)NtextRenderModer   
textAnchorrc   rd   )start	inheritedendmiddler`   numericzbad value for textAnchor )	_fontInfo)rf   rb   getattrrL   re   textrC   rD   r   numericXShiftencoding
ValueErrorr   r   
drawString)rP   	stringObjcanvfillr   Stext_anchorrc   rd   r   rC   rD   textLenoldTextRenderModes                 r&   r   _PMRenderer.drawString   s"   ||~~ +;A>~&&(AL/K}H}H>>DAA"77%dX>%LA (*NA )+{RdRdeeA$%@[AQ%QRR $ 3 3"08DX3FG&7#/  .. '8#s   3D Dc                 P  ^^	^
^ U R                   m
T[        L ai  T
R                  S	 T
R                  (       a:  T
R                  S   nUR                  nSUl        U R	                  U5        X2l        g T
R                  5         g SSKJm	  T
R                  T
R                  T
R                  T
R                  4m[        TSS5      nSU	U
UU4S jjnTR                  (       a2  U" 5         T
R                  5         T
R                  R                  T5        T
R                  S LnT
R                   S Ln[        TSS5      nUS	:X  a|  U(       a6  U(       a/  U" S
S9  T
R#                  U5        U" 5         T
R%                  5         g U(       a  U" S
S9  T
R#                  U5        g U(       a  U" 5         T
R%                  5         g g US:X  a7  U" S
S9  U(       a  T
R#                  U5        U(       a  T
R%                  5         g g U" 5       (       a  T
R#                  U5        T
R%                  5         g )Nru   r   r   )_renderPath	autoclose c                 4   > TR                  5         T" TTU S9$ )N
forceClose)r   )r   r   r6   	drawFuncsr   s    r&   rP _PMRenderer.drawPath.<locals>.rP   s    KKMtY:FFr8   r^   svgTr   pdf)F)rf   EmptyClipPath
_clipPaths
isClipPathdrawPathclipPathClearreportlab.graphics.shapesr   r   r   curveTor   r   clipPathSetappendrb   r[   r   r   )rP   r   r   icpr   r   r   stroker^   r   r6   r   s    `       @@@r&   r   _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$  tt

8$LLNr8    N)r   )__name__
__module____qualname____firstlineno____doc__rM   rS   rN   rz   r~   r   r   r   r   r   r   r   r   r   __static_attributes__r   r8   r&   r=   r=   [   sN    :
;4R;(

.8:/r8   r=   c                 `    [        5       nU R                  SUR                  UR                  S9$ )Nr   ditherpalette)r,   r   NONEADAPTIVE)r   r*   s     r&   _convert2pilpr    s&    KE::c%**enn:EEr8   c                 $    U R                  S5      $ )NLr   r   s    r&   _convert2pilLr  !      ::c?r8   c                 $    U R                  S5      $ )N1r  r  s    r&   _convert2pil1r  $  r	  r8   c                 L   [        U 5      n U R                  u  pE[        R                  XE[	        U S5      (       a  U R
                  OU R                  " 5       U R                  R                  5       5      n[	        US5      (       d}  [        [        R                  R                  U5      S   S-   UR                  5       -   S5       nUR                  U5        S S S 5        [        R                  S:X  a  SSKJn  U" USS	9  g g UR                  U5        g ! , (       d  f       NC= f)
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rowsrp   fr  s	            r&   _saveAsPICTr#  '  s    	r	BJDDWR	5J5JrzzPRP[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                      \ rS rSr  S!S jr\S"S j5       rS#S jrS rS#S jr	S$S jr
S	 rS#S
 jrS rS rS%S jrS rS rS rS&S jrS#S jrS'S jrS rS%S jrS rS rS rS rS rS r\rS rS r S r!S(S jr"S r#g))PMCanvasi6  Nc                 8   US-  n[        X-  S-   5      n[        X(-  S-   5      nU R                  XXFUS9U R                  S'   X@R                  S'   USSUSS4U R                  S'   / U R                  S'   XPR                  S	'   X0R                  S
'   [        U R                  R
                  5      [        [        5      :X  a  SOSU R                  S'   XpR                  S'   U R                  S:X  a  [        O[        U R                  S'   U R                  U l        g)z-configPIL dict is passed to image save methodg      R@g      ?r  _gs_bgr   ry   r   	configPIL_dpir   r!   r   _backendfmt_colorConverterN)r1   
_getGStater>   typer,  r   powr   r:   r7   ry   rX   )	rP   whdpibgr.  r#   
backendFmtscales	            r&   __init__PMCanvas.__init__7  s     D#q2*Me!e%*1QuQq$9j!&(l#%.k" #f378J8J3KTRUY3VK\gj!'1m$9=9S:Yb'(==r8   c                    [        U5      nUc  [        R                  nUS:X  a   UR                  XUS9$ SUR                  5       ;   a6  UR                  5       n[        R                  XD5      n UR                  XX$S9$ [        SU< 35      e! [         a     UR                  XX$S9s $ !     N1= ff = f! [         a    UR                  XUS9s $ f = f)Nr   r8  r+  r   z.Cannot obtain PM graphics state using backend )r'   r   r   gstate	TypeErrorGStater"   upper_pycairoFmtsMapgetAttributeErrorRuntimeError)r5  r6  r8  r#   r  mods         r&   r2  PMCanvas._getGStateI  s    G$?//GKzz!z,, '))+C!%%c.C-zz!bz11 KG;WXX  ::a":55	 " -zz!z,,-s;   B 0B8 
B5B,)B5,B1.B51B58CCc                    Uc  U R                   nXsU R                  l        U R                  l        S S S S S S S S.nU R                  nUR
                  UR                  pvUR                  5        H  n[        XX5      XH'   M     AU ?[        R                  XUS9=oPR                  S'   UR                  5        H  n[        XXH   5        M     UR                  Xg5        g )N)rX   rY   r[   rh   ri   rn   rb   r>  r,  )r-  _drawingr   r   r,  rc   rd   keysr   r  r?  r>   setattrr   )	rP   r5  r6  r8  AgsfNfSks	            r&   _drawTimeResizePMCanvas._drawTimeResize_  s    :DHHr451T]]1t44\`nr  AE  FXXR[[2A2=AD $.$5$5aR$5$@@]]5!AD14  


2r8   c                    [        5       R                  U R                  S:X  a  [        U S5      S:X  a  SOSU R                  R
                  U R                  R                  4S9nUR                  U R                  R                  5        U$ )Nr!   _fmtr$  r'  r   )r   )	r,   newr   r   r,  r   r   	frombytespixBuf)rP   r   s     r&   toPIL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   U R                  5       nUci  [        U[        5      (       d  [        S[	        U5      -  5      e[
        R                  R                  U5      S   nUR                  S5      (       a  USS  nU R                  =(       d    0 nUR                  SS 5        UR                  S5      nU(       a  U" U5      nUR                  5       nUS;   a  [        U5      nOUS;   ah  UR                  S5      (       a  [        U5      nOCUR                  S5      (       a  [        U5      nO!UR                  S	5      (       a  [!        U5      nS
nO>US;   a  [#        X1X$R%                  SS 5      S9$ US;   a  OUS;   a  SnO['        SU-  5      eUS
:X  a  UR%                  SS 5      nU(       a  SSKJnJn  SS/-  n	[/        SUR1                  5       5       H  u  pSXU-   '   M     UR3                  SUR5                  5       UR7                  UR9                  U	5      R;                  S5      R9                  SS/-  S/-   5      5      4-   5      nSU R<                  4S4 H  u  pUR%                  X5      XL'   M     UR                  SS5        UR                  S5      (       a  SSKJn  UR7                  U5      nUR                  SS 5        UR                  S5      nU(       a  U" U5      nUR>                  " X40 UD6  [A        US5      (       d"  [
        RB                  S:X  a  SSK"J#n  U" XS 9  g g g )!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JPEGri  zUnknown image kind %sr   )
ImageChopsr*   i   )r      i   r.   r'  
resolution)zresolution unitinchchops_invert)rj  	preSaveCBr  r  r  r  )$rY  rj   r   r   asciir   r   r  
startswithr.  
setdefaultrM   rB  r  endswithr  r  r#  rD  r   r+   rj  r*   zip
bitmap_rgbmergesplitinvertpointr   r/  saver   r  r  r  )rP   r  r  r   r.  r\  tcrj  r*   Tor6   adro  r  s                   r&   
saveToFile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"rS]]=QU5VWW((N"C 7# =>>;}T2B1GR]]_=DA AcF > [[Z5F5FrxxPQ{GZGZ[^G_GeGefikljmfmornsfsGt5u4w)wx$TYY/0JJ(}}Q1	 K^A.==((&""2&B[.--,	2B
##r'""rww~8$ (6"r8   c                 T    [        5       nU R                  X!S9  UR                  5       $ )Nr+  )r   r  getvalue)rP   r  rp   s      r&   saveToStringPMCanvas.saveToString  s#    I"zz|r8   c                    SSK nU R                  nU R                  S:X  a+  UR                  S:X  a  SUl        UR                  nSUl        OUR                  nUR
                  UR                  peUR                  UR                  SS[        U5      S-   SSS	XVS
S5
      5        US-  n[        [        U5      SU* 5       H  nUR                  XHU-
  U 5        M     UR                  S5        g)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   rU  rX  r   r   r  packrm   r   )	rP   r"  r  rN  pixr   r   rowbr}  s	            r&   
_saveToBMPPMCanvas._saveToBMP  s    
 	XX==+%"''8*;BG))CBG))C"))v	,T#c(2+a2eSTUWXYqys3x4%(AGGC$qM" )	r8   c                 0    [        U R                  X5        g rK   )_setFontr,  )rP   rc   rd   leadings       r&   r   PMCanvas.setFont  s    (,r8   c                 0    [        U R                  X5        g rK   )rL  r,  )rP   r  values      r&   __setattr__PMCanvas.__setattr__  s    $r8   c                 .    [        U R                  U5      $ rK   )r   r,  )rP   r  s     r&   __getattr__PMCanvas.__getattr__  s    txx%%r8   c                 b    U(       a  U R                  5         U(       a  U R                  5         g g rK   )r   r   )rP   r   r   s      r&   r   PMCanvas.fillstrokepath  s    4??$6r8   c                    [        Xe-
  5      S::  d   e[        [        U-  S-  5      n[        [        U-  S-  5      nXU-  -   n	X$U-  -   n
[        [        U-  S-  5      n[        [        U-  S-  5      nXU-  -   nX$U-  -   nU* U-  nXG-  n[        Xe-
  -  S-  n[        SS[        U5      -
  -  [        U5      -  5      nXU-  -   nU
UU-  -   nU* U-  nXK-  nUUU-  -
  nUUU-  -
  nX4UU4UU4X444$ )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   )rP   r   r   r   r   theta0theta1cos0sin0x0y0cos1sin1x3y3dx1dy1halfAngrQ  r   r   dx2dy2r   r   s                            r&   _bezierArcSegmentCCWPMCanvas._bezierArcSegmentCCW  s5    6?#r)))2f9U?#2f9U?#T'\T'\2f9U?#2f9U?#T'\T'\cDji fm$k2	S3w</1CLAC'\#'\cDji#'\#'\2b'Br7RG466r8   c           	         Xe-
  n[        U5      S::  a  XV4/nO_[        [        [        U5      S-  5      5      n	[        U5      U	-  n
/ n[	        U	5       H   nX[U
-  -   nX-   nUR                  X45        M"     / nU Hb  u  pU(       d,  U R                  XX4X5      u  u  nnnUR                  U5        M8  U R                  XX4X5      u  u  nnnUR                  U5        Md     WW4U4$ )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  )rP   r   r   r   r   r  r  angularExtent	angleListNfrag	fragAngleiir~  bctrlptsr  r  ptstmpxtmpys                       r&   bezierArcCCWPMCanvas.bezierArcCCW  s     }% )Is=1#568Em,e3IIEl)^+M  !' #
 EQ!%!:!:2"!M"R#s#%)%>%>rbQ%Q"$tcs#  B!!r8   c           	          U R                  XX4XV5      u  u  pxn	U R                  Xx5        U	 H   u  u  pu  pu  pU R                  XXX5        M"     g)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   )rP   r   r   r   r   ang1ang2r  r  r  r   r   r   r   r  r  s                   r&   addEllipsoidalArcPMCanvas.addEllipsoidalArc  sR    
 "..rbDF"'B*1&WbgrgrLLrR+ +2r8   c           	      &    U R                  XX4XVS9  g )N)r   	directionshapingr   )rP   rC   rD   r   r   r  r  s          r&   drawCentredStringPMCanvas.drawCentredString  s    DI_r8   c                 (    U R                  XUSUS9  g )Nr   )r   r  r  )rP   r   rC   rD   r  s        r&   drawRightStringPMCanvas.drawRightString  s    qUYGr8   c                    U R                   nUR                  n	UR                  n
U(       a  XIU
4:w  a  Uu  p[        XU5        OU
nU	n[	        X6XUS9u  p= US;   a;  [        X;U5      nUS:X  a  X-  nO$US:X  a  XS-  -  nOUS:X  a  U[        XSXU5      -  nU R                  S:X  a  UR                  XU5        O[        U5      nUR                  (       a  UR                  XU5        OUn[        U5      (       d   UR                  S5      n[        X>/UR                   -   5      n[#        U5      nUS-
  n[%        U5       Hr  nUU   u  nnUU:w  a  [        UUR                  U5        UnUR                  XU5        UU:w  d  MD  UUR                  UR                  UR&                  5      U5      -  nMt     UR)                  X5        g ! [         a[  nUR                  S	S
 u  nn[        UR                  S S
 UR                  S
   < SUUS-
  U < SUUU < SUUUS-    < 34-   6 eS nAff = f! UR)                  X5        f = f)N)rc   rd   r  )r   r   r   r   r   g       @r   r!   utf8r`   rv   

   z-->z<--r   )r,  rd   rc   r  r   r   r   r   r   r   _dynamicFontr   decodeUnicodeDecodeErrorargsr   substitutionFontsrm   r   encNamer   )rP   rC   rD   r   r   r   r  r  rN  gs_fontSizegs_fontNamerc   rd   r   fontfcer   jFTnnm1r"  ts                           r&   r   PMCanvas.drawString"  sj   XXkkkk$==!*HR*"H"H&txbij%	055%dX>%LA (*OA )+{RRA}}k)a$'x($$MM!d+B$T??L#';;v#6D
 $D0F0F)FGBBAA#C"1X!!u1b5$R

8<!"Ba!,c6qxx		/B8!LLA & 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%H1 <G	 A4H1 2H1 	
H.AH))H..H1 1Ic                     U R                   bC  U R                  5         U R                  X5        U R                  X45        U R	                  5         g g rK   )r[   r   r   r   r   )rP   r   r   r   r   s        r&   r   PMCanvas.lineV  s?    'NNKKKKOO	 (r8   c                     U R                  5         U R                  X5        U R                  X-   U5        U R                  X-   X$-   5        U R                  XU-   5        U R                  5         U R	                  XVS9  g )N)r   r   )r   r   r   r   r   )rP   rC   rD   r   r   r   r   s          r&   r   PMCanvas.rect]  se    AAGQAGQZ(A6z"64r8   c                    US:X  a  UnUS:X  a  UnX-   nX$-   nU R                  5         U R                  X-   U5        U R                  Xu-
  X&-   XVSS5        U R                  Xu-
  X-
  XVSS5        U R                  X-   X-
  XVSS5        U R                  X-   X&-   XVSS5        U R                  5         U R	                  5         g)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   )	rP   rC   rD   r   r   r   r   r   r   s	            r&   r   PMCanvas.roundRectf  s    
 q5r"q5r"YZADruadBC>rubeRQ;qtRUBB<qtQT23=r8   c                 (    U R                  XX35        g)zRadd closed path circle with center cx,cy and axes r: counter-clockwise orientationN)r   )rP   r   r   r   s       r&   r   PMCanvas.circlex  s    R1r8   c                 :   U R                  5         X-   nUnUnX$-
  nX-   n	X$[        -  -
  n
Xs[        -  -   nUnU R                  XV5        U R                  XXXx5        UnUnX-
  nUnX[        -  -
  n	X$-
  n
UnX$[        -  -
  nU R                  XXXx5        UnUnUnX$-   nX-
  n	X$[        -  -   n
X[        -  -
  nX$-   nU R                  XXXx5        UnUnX-   nUnX[        -  -   n	X$-   n
X-   nX$[        -  -   nU R                  XXXx5        U R	                  5         g)z}add 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   )rP   r   r   r   r   r  r  r  r  r   r   r   r   s                r&   r   PMCanvas.ellipse|  sb    	WUU###%%%BR2'U###U$$$R2'UU###$$$UR2'U###UU###R2'r8   c                     g)zdo nothing for compatibilityNr   rO   s    r&   	saveStatePMCanvas.saveState  s    r8   c                 ^    U R                  U5      U l        [        USS 5      nUb  X l        g g Nrq   )r1  rb   r   ra   rP   aColorrq   s      r&   ro   PMCanvas.setFillColor  s3    --f5wt,$ r8   c                 ^    U R                  U5      U l        [        USS 5      nUb  X l        g g r  )r1  r[   r   rZ   r  s      r&   rg   PMCanvas.setStrokeColor  s4    //7wt,!& r8   c                     Xl         g rK   )rh   )rP   caps     r&   
setLineCapPMCanvas.setLineCap  s    r8   c                     Xl         g rK   )ri   )rP   joins     r&   setLineJoinPMCanvas.setLineJoin  s    r8   c                     Xl         g rK   )rY   )rP   r   s     r&   setLineWidthPMCanvas.setLineWidth  s     r8   c                     [        X=(       d    U R                  R                  Ub  U5      $ U R                  R                  5      $ rK   )r   r,  rc   rd   )rP   r   rc   rd   s       r&   r   PMCanvas.stringWidth  sC    4!>TXX->->-5-A[ 	[GKxxGXGX[ 	[r8   )rX   rb   ra   rh   ri   r[   rZ   rY   )H    NNr   )Nr%  rK   r]  )r   r   )r   NF)NleftNF)NN)$r   r   r   r   r;  staticmethodr2  rR  rY  r  r  r  r   r  r  r   r  r  r  r  r  r   r   r   r   r   r   r  ro   rg   restoreStater  r  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           
      ~    [        U 5      n [        U R                  U R                  XX5US9n[	        XSS4SU0UD6  U$ )N)r7  r8  r.  r#   r9  r   r<   )r   r)  r   r   r@   )	r  r7  r8  r.  r<   r#   r9  rE   r6   s	            r&   drawToPMCanvasr    sB    AA!((idnoAq!6,66Hr8   c           
      >    [        U 4XX4XVS.UD6R                  5       $ )Nr7  r8  r.  r<   r#   r9  )r  rY  )r  r7  r8  r.  r<   r#   r9  rE   s           r&   	drawToPILr    s?    !  Lyel  L  GK  L  R  R  T  Tr8   c           
          [        5       n[        U 4XX4XVS.UD6n	U	R                  SUR                  UR                  S9$ )Nr  r   r   )r,   r  r   r  r  )
r  r7  r8  r.  r<   r#   r9  rE   r*   r   s
             r&   
drawToPILPr    sM    KE	1  
D#	]d  
D  C  
DB::c%**enn:EEr8   r^  c	           
      F    [        U 4X4XVXxS.U	D6n
U
R                  X5        g)zkcreate a pixmap and draw drawing, d to it then save as a file
configPIL dict is passed to image save methodr  N)r  r  )r  r  r  r7  r8  r.  r<   r#   r9  rE   r6   s              r&   
drawToFiler    s7     	q  	HcIah  	H  CG  	HALLr8   c           
      V    [        5       n	[        X	4XX4XgS.UD6  U	R                  5       $ )N)r  r7  r8  r.  r#   r9  )r   r  r  )
r  r  r7  r8  r.  r<   r#   r9  rE   rp   s
             r&   drawToStringr    s,    	Aqnsnimn::<r8   c           	        ^^^^^ S nSS K nSSKJn  SSKJm  UR
                  n/ nUR                  R                  U 5      (       d  UR                  " U 5        SnSnU/n	0 n
[        R                  SS  nU Vs/ s H  oR                  S5      (       d  M  UPM     nnU(       d  / S	QnOMU H  nUR                  U5        M     S
R                  U Vs/ s H  oSS  PM	     sn5      R                  S
5      n/ mSS KmSSKJm  UUUUU4S jnU" [%        [&        S5      S9 GH  u  nnnU
R)                  US5      S-   =nU
U'   US:  a  USUS-
  -  -  nU(       a  UU;  a  MB  Un[+        UR,                  5      n[+        UR.                  5      nU	R1                  SU< SU< S35        U GH?  nUS;   a"  U	R1                  SUR3                  5       -  5         U< SU" U5      < 3nUR                  R                  U U5      nUR                  R5                  U5      (       a  UR                  " U5        US:X  a  [7        UUUS[8        0S9  O%US;   a  UR;                  SS/U US9  O[7        UUUS9  US;   a  U	R1                  S U-  5        O5US:X  a  U	R1                  S!U-  5        OUS:X  a  U	R1                  S"U-  5        T(       d  TS#:  a  [=        S$[?        U5      -  5        GM?  GMB     URB                  RE                  S%S&5      S':X  a  SURF                  S('   S) H  n UR;                  U/U US9  M     GM     T(       a:  U	S   RI                  S*S+5      U	S'   U	R1                  S,5        U	RK                  T5        U	R1                  U5        UR                  R                  U S-5      n[M        US.5       nURO                  U	5        S S S 5        [        RP                  S/:X  a  SS0K)J*n  U" US1S29  T(       d  TS#:  a  [=        S$U-  5        g g s  snf s  snf ! [@         a    U" UU5         GM  f = f!   U" UU5         GM%  = f! , (       d  f       N= f)3Nc                     U S:X  a  Sn U $ )Ntifftifr   )rC   s    r&   r  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                    > SU < SU< S3nT(       d  TS:  a  [        U5        TR                  SU-  5        [        5       nTR                  US9  TR                  ST" UR	                  5       5      -  5        g )NzProblem drawing z fmt=z filer`   z"<br/><h2 style="color:red">%s</h2>)filez<pre>%s</pre>)printr   r   	print_excr  )	r  r  msgbuferrsr$  shout	tracebackr  s	       r&   handleError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.htmlr5  r  r  HTMLr  )+r   reportlab.graphicsr  reportlab.rl_configr  getAllTestDrawingsr   isdirmkdirsysargvrq  remover  rw  r-  xml.sax.saxutilsr$  r   r  rr  r1   r   r   r   rB  r   r  r   rz  r'  rp  rE  environrD  r>   replaceextendr   
writelinesplatformr  r  ) r3  r,  r  r   r  r<  drawingshtmlTop
htmlBottomhtmlnamesr@  r~  Er.  rA   	docstringr  r   r4  r5  r6  rQ  filenamefullpathhtmlFileNamer"  r  r+  r$  r-  r  s     `                          @@@@r&   testrR    s   
 -+#66H77==  
GJ 9DE88AB<D3DqLL2DA3<AKKN XXa(aua()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>>(++IIh'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'HI) . ::>>+C0#5UVw7G7G	7RA$aSfE  C 'bN q'//'*cdQ()DKK
77<<8L	lC	 A	T 
!
||U4\f-	5l!:;	M 	4 )X " $D##$$D## 
!	 s=   9PPPDP$P69QP32P36Q
Q__main__T)r,  rK   )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   r  r   r   r?  ior   r   mathr   r   r   r   r'   r   r  r,   r7   r:   _unset_r@   rG   r=   r  r  r  r#  dictrC  r  r)  r  r  r  r  r  rz  rR  r   r   r8   r&   <module>rb     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   0F   FF