
    Kwgt                        d Z dZddl ddlmZmZ ddlmZmZ ddl	m
Z
 ddlmZ dd	lmZmZ dd
lZdd
lZddlmZmZ ddlmZmZmZmZ d'dZ	  eej8                        Zd Zd Zej@                  fdZ!ddlm"Z"  G d de"      Z#d Z$d Z%d Z&d'dZ'dZ( G d d      Z)ddd
ej@                  ej8                  fdZ*ddd
ej@                  ej8                  fdZ+ddd
ej@                  ej8                  fdZ,d ddd
ej@                  ej8                  fd!Z-d ddd
ej@                  ej8                  fd"Z.e-Z/d(d#Z0e1d$k(  r
 e0d%&       y
y
# e$ r d
ZY w xY w))z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)	isUnicode)	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      R/var/www/horilla/myenv/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   	Color2Hexr.   C   s_    4CI&2-4CK8H3HQ2NOSWX[\_`a`f`f\fXgSgh
hH    c                 V    t               }|j                  t        |       ||||       y)z
As it saysshowBoundaryN)_PMRendererdrawr   )drawingcanvasxyr2   Rs         r   r4   r4   I   s%    AFFw'ALFQr/   )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)r3   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   r?   z_PMRenderer.popT   s    r/   c                 p    t        |      }| j                  j                  |       | j                          y r=   )r   r>   pushr@   )rB   nodedeltass      r   rD   z_PMRenderer.pushX   s(    t$6"r/   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)r>   getState_canvasrH   rI   rJ   setStrokeColorlineCaplineJoinrN   
isinstancelisttuplelen	dashArrayrQ   setFillColorr   )rB   salphadas       r   r@   z_PMRenderer.applyState]   sB   MM""$U8#$]#3 /").DLL&##Am$45 1 !"2 3 !* !Bb$u.S2wzBqE4,!?U!#- ',DLL$!!!K.1Qz]AjM:r/   c                     | j                   j                  d   }| j                  j                  dd ||fz   x|d<   |d<   | j                   j	                  |       | j                          y )Nr      	transformrH   )r>   	_combinedrV   _baseCTMrD   r@   )rB   r7   r8   rF   s       r   	initStatez_PMRenderer.initStatew   s_    ((,.2ll.C.CAa.H!A.NN{fUm6"r/   c                 h    | j                  |       | j                  |       | j                          y)zEThis is the recursive method called for each node
        in the treeN)rD   drawNodeDispatcherr?   )rB   rE   s     r   drawNodez_PMRenderer.drawNode}   s*    
 			$ 	% 	
r/   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   )	rV   rxryrectr7   r8   widthheight	roundRect)rB   rp   r-   s      r   drawRectz_PMRenderer.drawRect   sp    LL77dgg""FF466$&&$**dkk:KKtvvtzz4;;Qr/   c                     | j                   j                  |j                  |j                  |j                  |j
                         y r=   )rV   linex1y1x2y2)rB   rv   s     r   drawLinez_PMRenderer.drawLine   s*    $''$''$''$'':r/   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   )pathrZ   strosisfiler$   openr~   hasattrsizerq   rr   rV   	_aapixbufr7   r8   _backendr   tostring)rB   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		r/   c                     | j                   }|j                  |j                  |j                  |j                         |j                          y r=   )rV   circlecxcyrfillstrokepath)rB   r   r-   s      r   
drawCirclez_PMRenderer.drawCircle   s3    LL	699fhh/	r/   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 )NrP   z#Polyline must have 1 or more pointsr   r
   )
pointsr]   rV   	pathBeginmoveTorangelineTo	pathClosepathFill
pathStroke)rB   polyline_doClosePr-   is         r   drawPolyLinez_PMRenderer.drawPolyLine   s    OO1v{AAA{LL		1qtq#a&!$ 	#AHHQqT1QqS6"	#KKMJJL	r/   c                     | j                   }|j                  |j                  |j                  |j                  |j
                         |j                          y r=   )rV   ellipser   r   rn   ro   r   )rB   r   r-   s      r   drawEllipsez_PMRenderer.drawEllipse   s9    
,,			'**gjj'**WZZ@	r/   c                 *    | j                  |d       y )Nr
   )r   )r   )rB   polygons     r   drawPolygonz_PMRenderer.drawPolygon   s    '1-r/   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   
textAnchorrS   rT   )start	inheritedendmiddlerP   numericzbad value for textAnchor )	_fontInfo)rV   rR   getattrr>   rU   textr7   r8   stringWidthnumericXShiftencoding
ValueErrorr   r   
drawString)rB   	stringObjcanvfillr   Stext_anchorrS   rT   r   r7   r8   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 )Nrd   r
   r   )_renderPath	autoclose c                 :    j                           |       S )N
forceClose)r   )r   r   r-   	drawFuncsr   s    r   rPz _PMRenderer.drawPath.<locals>.rP   s    KKMtY:FFr/   rN   svgTr   pdf)F)rV   EmptyClipPath
_clipPaths
isClipPathdrawPathclipPathClearreportlab.graphics.shapesr   r   r   curveTor   r   clipPathSetappendrR   rK   r   r   )rB   r   r   icpr   r   r   strokerN   r   r-   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$LLNr/   N)r   )__name__
__module____qualname____doc__r?   rD   r@   ri   rl   rt   r{   r   r   r   r   r   r   r    r/   r   r3   r3   O   sN    :
;4R;(

.8:/r/   r3   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Er/   c                 $    | j                  d      S )NLr~   r   s    r   _convert2pilLr         ::c?r/   c                 $    | j                  d      S )N1r   r   s    r   _convert2pil1r     r   r/   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rowsr`   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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 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 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	<   t        | j                  j
                        t        t              k(  rd
nd| j                  d<   || j                  d<   | j                  | _        y)z-configPIL dict is passed to image save methodg      R@g      ?_gs_bgr   rh   r   	configPIL_dpir   r   r   _backendfmtN)	r)   
_getGState__dict__typer	  r   powrh   rH   )	rB   whdpibgr  r   
backendFmtscales	            r   __init__zPMCanvas.__init__*  s     D%%#q2g>e!e%*1QuQq$9j!&(l#%.k" #f378J8J3KTRUY3VK\gj!'1m$==r/   c                 ~   t        |      }|t        j                  }|dk(  r	 |j                  | ||      S d|j                         v r	 |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   AttributeErrorRuntimeError)r  r  r  r   r   mods         r   r  zPMCanvas._getGState;  s    G$?//GKzz!Az,, '-zz!AbSz11 KG;WXX  ::a":55D	 " -zz!Az,,-s;   A. B .	B8BBBBB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)rH   rI   rK   rX   rY   r^   rR   r  r	  )r
  _drawingrq   rr   r	  rS   rT   keysr   r   r  r  setattrr   )	rB   r  r  r  AgsfNfSks	            r   _drawTimeResizezPMCanvas._drawTimeResizeO  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r/   c                     t               j                  d| j                  j                  | j                  j                  f      }|j                  | j                  j                         |S )Nr}   )r   )r$   newr	  rq   rr   	frombytespixBuf)rB   r   s     r   toPILzPMCanvas.toPIL]  sD    [__U$((..$((//)J_K
TXX__%	r/   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   r5  )PCTr   r  )r  )PNGBMPPPM)JPGJPEGr?  zUnknown image kind %sr   )
ImageChopsr"   i   )r      i   r&   RGBA
resolution)zresolution unitinchchops_invert)r@  	preSaveCBr   r   r   r   )$r0  rZ   r   r   asciir   r   r   
startswithr  
setdefaultr?   upperr   endswithr   r   r  getr   r#   r@  r"   zip
bitmap_rgbmergesplitinvertpointr~   r  saver   r   r   r   )rB   r   r   r   r  r2  tcr@  r"   Tor-   adrF  r   s                   r   
saveToFilezPMCanvas.saveToFileb  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"r/   c                 \    t               }| j                  ||       |j                         S )Nr  )r   rY  getvalue)rB   r   r`   s      r   saveToStringzPMCanvas.saveToString  s%    Ic"zz|r/   c                 h   ddl }| j                  }|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   Nz=2sLLLLLLhh24xBM6   (   r
      r   z              )	structr	  r/  rq   rr   r   packr]   r   )	rB   r  rb  r'  pixrq   rr   rowbrV  s	            r   
_saveToBMPzPMCanvas._saveToBMP  s    
 	XXYY"))FU	,T#c(2+a2eFSTUWXYqys3x4%( 	#AGGC$qM"	#	r/   c                 2    t        | j                  ||       y r=   )_setFontr	  )rB   rS   rT   leadings       r   r   zPMCanvas.setFont  s    (8,r/   c                 2    t        | j                  ||       y r=   )r%  r	  )rB   r   values      r   __setattr__zPMCanvas.__setattr__  s    e$r/   c                 .    t        | j                  |      S r=   )r   r	  )rB   r   s     r   __getattr__zPMCanvas.__getattr__  s    txx%%r/   c                 N    |r| j                          |r| j                          y y r=   )r   r   )rB   r   r   s      r   r   zPMCanvas.fillstrokepath  s    4??$6r/   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   )rB   r   r   rn   ro   theta0theta1cos0sin0x0y0cos1sin1x3y3dx1dy1halfAngr*  rw   rx   dx2dy2ry   rz   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6r/   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@)rr  r)   r   floatr   r   r  )rB   r   r   rn   ro   rs  rt  angularExtent	angleListNfrag	fragAngleiirW  bctrlptsrw  rx  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!!r/   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   )rB   r   r   rn   ro   ang1ang2rw  rx  r  rw   rx   ry   rz   r{  r|  s                   r   addEllipsoidalArczPMCanvas.addEllipsoidalArc  sm    
 "..r"bDF"R'Br*1 	,&Wbgr"gr"LLBr"R+	,r/   c                 .    | j                  ||||       y )Nr   r   )rB   r7   r8   r   r   s        r   drawCentredStringzPMCanvas.drawCentredString  s    !Dk:r/   c                 .    | j                  |||d       y )Nr   r  r  )rB   r   r7   r8   s       r   drawRightStringzPMCanvas.drawRightString	  s    QqU3r/   c                 P   | j                   }|j                  }|j                  }|r|||fk7  r|\  }	}
t        ||	|
       n|}	|}
	 |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   g       @r   r   utf8rP   re   

   z-->z<--r
   )r	  rT   rS   rh  r   r   r   r   r   _dynamicFontr   decodeUnicodeDecodeErrorargsr   substitutionFontsr]   r   encNamer   )rB   r7   r8   r   r   r   r'  gs_fontSizegs_fontNamerS   rT   r   fontfcer   jFTnnm1r  ts                         r   r   zPMCanvas.drawString  sz   XXkkkk[$==!*HhR*"H"H%	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 #F. 4A6H +0H .	H7AH		HH H%c                     | j                   E| j                          | j                  ||       | j                  ||       | j	                          y y r=   )rK   r   r   r   r   )rB   rw   rx   ry   rz   s        r   rv   zPMCanvas.line>  sC    'NNKK2KK2OO	 (r/   c                    | j                          | j                  ||       | j                  ||z   |       | j                  ||z   ||z          | j                  |||z          | j                          | j	                  ||       y )N)r   r   )r   r   r   r   r   )rB   r7   r8   rq   rr   r   r   s          r   rp   zPMCanvas.rectE  sq    AqAeGQAeGQZ(Aq6z"6t4r/   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  rq     N)r   r   r  r   r   )	rB   r7   r8   rq   rr   rn   ro   ry   rz   s	            r   rs   zPMCanvas.roundRectN  s    
 q5r"q5r"YZAbDr"uadBC>r"ubeRQ;qtRUBB<qtQrT2r3=r/   c                 ,    | j                  ||||       y)zRadd closed path circle with center cx,cy and axes r: counter-clockwise orientationN)r   )rB   r   r   r   s       r   r   zPMCanvas.circle`  s    R1Qr/   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   )rB   r   r   rn   ro   rw  rx  r{  r|  rw   rx   ry   rz   s                r   r   zPMCanvas.ellipsed  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'r/   c                      y)zdo nothing for compatibilityNr   rA   s    r   	saveStatezPMCanvas.saveState  s    r/   c                 R    t        |      | _        t        |dd       }||| _        y y Nra   )r.   rR   r   rQ   rB   aColorra   s      r   r_   zPMCanvas.setFillColor  s/    "6*wt,$D r/   c                 R    t        |      | _        t        |dd       }||| _        y y r  )r.   rK   r   rJ   r  s      r   rW   zPMCanvas.setStrokeColor  s0    $V,wt,!&D r/   c                     || _         y r=   )rX   )rB   caps     r   
setLineCapzPMCanvas.setLineCap  s	    r/   c                     || _         y r=   )rY   )rB   joins     r   setLineJoinzPMCanvas.setLineJoin  s	    r/   c                     || _         y r=   )rI   )rB   rq   s     r   setLineWidthzPMCanvas.setLineWidth  s
     r/   )H    NNr}   )NRGB24r=   r3  )r
   r
   )r   )Nleft)!r   r   r   r  staticmethodr  r+  r0  rY  r\  rf  r   rl  rn  r   r  r  r  r  r  r   rv   rp   rs   r   r   r  r_   rW   restoreStater  r  r  r   r/   r   r  r  )  s    DH$!" Y Y&
6%p
-%&%!7F"<	,;400d5$ 9v%' L!r/   r  r  r  c                     t        |       } t        | j                  | j                  ||||      }t	        | |dd|       |S )N)r  r  r  r   r   r1   )r   r  rq   rr   r4   )rX  r  r  r  r2   r   r-   s          r   drawToPMCanvasr    s>    AA!((iQXYAAq!,/Hr/   c                 @    t        | |||||      j                         S )Nr  r  r  r2   r   )r  r0  )rX  r  r  r  r2   r   s         r   	drawToPILr    s!    !y|elmssuur/   c                     t               }t        | |||||      }|j                  d|j                  |j                        S )Nr  r   r   )r$   r  r~   r   r   )rX  r  r  r  r2   r   r"   r   s           r   
drawToPILPr    s;    KE	1#"	]d	eB::c%**enn:EEr/   r4  c                 J    t        | |||||      }|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  rY  )	rX  r   r   r  r  r  r2   r   r-   s	            r   
drawToFiler    s'     	qcbILahiALLCr/   c           	      Z    t               }t        | ||||||       |j                         S )N)r   r  r  r  r   )r   r  r[  )rX  r   r  r  r  r2   r   r`   s           r   drawToStringr    s)    	AqsiP::<r/   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 ]0  }|dv r"|	j1                  d|j3                         z         	 |d ||      }|j                  j                  | |      }|j                  j5                  |      r |j                  |       |dk(  rddlm} t;        |||d|i       n)|dv r|j=                  ddg| |       nt;        |||       |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%tA        |      z         3 |jD                  jG                  d&d'      d(k(  rd|jH                  d)<   d*D ]  }	 |j=                  |g| |          r:|	d   jK                  d+d,      |	d<   |	j1                  d-       |	jM                         |	j1                  |       |j                  j                  | d.      }tO        |d/      5 }|jQ                  |	       d d d        t        jR                  d0k(  rdd1l*m+}  ||d23       s d$kD  rt?        d%|z         y y c c}w c c}w # tB        $ r  |||       Y jw xY w#   |||       Y xY w# 1 sw Y   wxY w)4Nc                     | dk(  rd} | S )Ntifftifr   )r7   s    r   r   ztest.<locals>.ext  s    f9ar/   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 filerP   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   handleErrorztest.<locals>.handleError  sb    04S9GAIuSz83>?j%OfS\\^&<<=r/   ft_get_face)doTTFz.%02dz<hr><h2>Drawing z</h2>
<pre>z</pre>)r  r  r  r  z<p>%s format</p>
r   r  )whiter  )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>
rP   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argvrH  remover  rP  r  xml.sax.saxutilsr  r   r   rI  r)   rq   rr   r   rJ  r   reportlab.lib.colorsr  r  rS  r  rG  r  environrL  r  replaceextendr   
writelinesplatformr   r   )!r  r  r   r   r  r  drawingshtmlTop
htmlBottomhtmlnamesr  rW  Er  r5   	docstringr   r   r  r  r  r*  filenamefullpathr  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+	$0 ::>>+C0#5UVw7G7G	7R 	$A$aSfE	$E&$P q'//'*cdQ()DKK
77<<8L	lC	  A	T
||U4\f-	5l!:;	O 	4 )Z " $D#$$D# s=   4OO?O7DO!4O:P!O76O7:PP__main__T)r  r=   )pmoutF)2__version__r   r   reportlab.graphics.renderbaser   r   reportlab.pdfbase.pdfmetricsr   r   r   r   	reportlabr	   utilsr   rh  r   r   r  ior   r   mathr   r   r   r   r   r   r   r$   r.   _unset_r4   r:   r3   r   r   r   r  r  r  r  r  r  r  r  rS  r  r   r   r/   r   <module>r     s   	1 ( L < )  5    # #:y889J .7->-> R
 3@( @DF   P! P!d T	HYHYbkb{b{  H9CTCT]f]v]v v XIDUDU^g^w^w F
 2(dQZQbQbkt  lE  lE  "TPYPaPajs  kD  kD 
 ^<@ Zt {  Js   E	 	EE