
    i{                        d Z dZddlT ddlmZmZ ddlmZmZm	Z	 ddl
mZmZ ddlmZ ddlmZmZ dd	lmZ dd
lmZmZ ddlmZ ddlmZmZ ddlZddlZddlm Z m!Z! ddl"m#Z#m$Z$m%Z%m&Z& d2dZ'	  e'ej(                  Z)n# e$ r dZ)Y nw xY wd Z*d Z+d Z,ej-        fdZ.ddlm/Z/  G d de/          Z0d Z1d Z2d Z3d2dZ4 e5ddd          Z6d Z7 G d! d"          Z8d#d$dej-        ej(        d%fd&Z9d#d$dej-        ej(        d%fd'Z:d#d$dej-        ej(        d%fd(Z;d)d#d$dej-        ej(        d%fd*Z<d)d#d$dej-        ej(        d%fd+Z=e<Z>d3d.Z?e@d/k    r e?d01           dS dS )4z3.3.0a$  Render drawing objects in common bitmap formats

Usage::

    from reportlab.graphics import renderPM
    renderPM.drawToFile(drawing,filename,fmt='GIF',configPIL={....})

Other functions let you create a PM drawing as string or into a PM buffer.
Execute the script to see some test drawings.    )*)getStateDeltarenderScaledDrawing)getFont
unicode2T1stringWidth)	ShapedStrshapeFragWord)bidiShapedText)	isUnicode	asUnicode)ABag)toColorwhite)	rl_config   )setFontRenderPMErrorN)BytesIOStringIO)sincospiceilc                    | st           j        } | dk    r@	 dd l}n# t          $ r-}	 dd l}n# t          $ r t          d          w xY wY d }~ntd }~ww xY wd|                                 v rD	 dd l}nP# t          $ r1}	 dd l}n!# t          $ r t          d|  d          w xY wY d }~nd }~ww xY wt          d|            |S )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/var/www/html/Pagina-Ingenieria-Requisitos/venv/lib/python3.11/site-packages/reportlab/graphics/renderPM.py_getPMBackendr'      s   7i7G	@$$$$$ 		@ 		@ 		@@%%%%% @ @ @# %? @ @ @@ &%%%%		@ 
GMMOO	#	#	@!!!!! 	@ 	@ 	@@((((( @ @ @# %?PW %? %? %? @ @ @@ )((((	@ BBBCCCHsM    
A+AAAA,A1 1
B,<B B'BB''B,c                  >    	 ddl m}  n# t          $ r dd l} Y nw xY w| S )Nr   Image)PILr*   r    r)   s    r&   	_getImager,   @   sI       Ls   	 c                     | rVd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   sc    h4CI&2-4CK8H8H3HQ2NOSWX[\_`a`f\fXgXgSgh
hH    c                 (    | t          |           n| 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                            |           |                    t	          |           ||||           dS )z
As it says)showBoundaryN)_PMRenderer__dict__updatedrawr   )drawingcanvasxyr<   kwdsRs          r&   r@   r@   T   sL    AJdFFw''ALFQQQQQr8   )Rendererc                   h    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dS )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                 `    | j                                          |                                  d S N)_trackerpop
applyStateselfs    r&   rL   z_PMRenderer.pop`   s,    r8   c                     t          |          }| j                            |           |                                  d S rJ   )r   rK   pushrM   )rO   nodedeltass      r&   rQ   z_PMRenderer.pushd   s;    t$$6"""r8   c                    | j                                         }|d         | j        _        |d         | j        _        |d         }||| j        _        | j                            |d                    |d         | j        _        |d         | j        _        |d         | j        _	        |d         }|sd }nXt          |t          t          f          s|f}t          |          d	k    s"t          |d
         t          t          f          sd|f}|| j        _        |d         }||| j        _        | j                            |d                    | j                            |d         |d                    d S )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   s]   M""$$U8#$]#3 /").DL&##Am$4555 1 !"2 3 !* ! 	BBb$u.. S2wwzzBqE4,!?!?zU!#- ',DL$!!!K.111Qz]AjM:::::r8   c                     | j         j        d         }| j        j        dd         ||fz   x|d<   |d<   | j                             |           |                                  d S )Nr      	transformrU   )rK   	_combinedrc   _baseCTMrQ   rM   )rO   rC   rD   rS   s       r&   	initStatez_PMRenderer.initState   sg    (,.2l.CAaC.H!A.NN{fUm6"""r8   c                     |                      |           |                     |           |                                  dS )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    r1n n.|                    |j        |j        |j        |j                   d S |                    |j        |j        |j        |j        |j        |j                   d S )Nr   )	rc   rxryrectrC   rD   widthheight	roundRect)rO   r}   r6   s      r&   drawRectz_PMRenderer.drawRect   s    L7dg"""""""""FF46$&$*dk:::::KKtvtz4;QQQQQr8   c                 h    | j                             |j        |j        |j        |j                   d S rJ   )rc   linex1y1x2y2)rO   r   s     r&   drawLinez_PMRenderer.drawLine   s,    $'$'$'$':::::r8   c                 @   |j         }t          |t                    rX|rt          j                             |          sd S t                                          |                              d          }n(t          |d          r|                    d          }nd S |j	        \  }}|j
        |j        }}||}||}| j                            |j        |j        ||| j        j        dk    r|n% t          |d          r|j        n|j                    ||d           d S )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!   zd3 	:RW^^D11:FF!!$''//66BBT)$$ 	e$$BBFW
d[%,d<<$|,k99N9(=(=N"**2;QQdA		 	 	 	 	r8   c                     | j         }|                    |j        |j        |j                   |                                 d S rJ   )rc   circlecxcyrfillstrokepath)rO   r   r6   s      r&   
drawCirclez_PMRenderer.drawCircle   s=    L	69fh///	r8   r   c                    |j         }t          |          dk    s
J d            | j        }|                                 |                    |d         |d                    t          dt          |          d          D ]'}|                    ||         ||dz                       (|r(|                                 |                                 |	                                 d S )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    O1vv{{{A{{{L		1qtq#a&&!$$ 	# 	#AHHQqT1QqS6"""" 	KKMMMJJLLL	r8   c                     | j         }|                    |j        |j        |j        |j                   |                                 d S rJ   )rc   ellipser   r   r{   r|   r   )rO   r   r6   s      r&   drawEllipsez_PMRenderer.drawEllipse   sA    
,			'*gj'*WZ@@@	r8   c                 4    |                      |d           d S )Nr   )r   )r   )rO   polygons     r&   drawPolygonz_PMRenderer.drawPolygon   s!    '1-----r8   c           	      :   | j         }|j        }t          |dd          }||r| j                                        }|d         }|d         }|d         }|j        }	|j        }
|j        }|dvrnt          |	||          }|dk    r|
|z  }
nQ|dk    r	|
|d	z  z  }
nB|d
k    r|
t          ||	||||j
                  z  }
nt          dt          |          z             |j        }||_        	 |                    |
||	||f           ||_        d S # ||_        w xY wd S )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   sf   |~ +;A>>~&&((AL/K}H}H>DAA"777%dHX>>%%LAA (**NAA )++{4R[RdeeeAA$%@[AQAQ%QRRR $ 3"0D8!DHX3FGGG&7###&7#7777/ s   +D 	Dc                 4  	
 | j         
t          u r]
j        d= 
j        r8
j        d         }|j        }d|_        |                     |           ||_        n
                                 d S ddlm	 
j        
j	        
j
        
j        ft          dd          }d	
fd	}j        r8 |             
                                 
j                                       
j        d u}
j        d u}t          d	d          }|d
k    r|rC|rA |d           
                    |            |             
                                 d S |r# |d           
                    |           d S |r  |             
                                 d S d S |dk    r= |d           |r
                    |           |r
                                 d S d S  |            r
                    |           
                                 d S )Nrq   r   r   )_renderPath	autoclose Fc                 H                                       |           S )N
forceClose)r   )r   r   r6   	drawFuncsr   s    r&   rPz _PMRenderer.drawPath.<locals>.rP   s'    KKMMM;tY:FF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   L=  R | "L$l a   "!!!F999999XqxAK@	DR00		G 	G 	G 	G 	G 	G 	G 	G 	G ? 	&BDDDMMOOOL%%%{$&d*4
2..e 
 
d####

8$$$ d####

8$$$$$   B$ %

8$$$   rtt %

8$$$LLNNNNNr8   N)r   )__name__
__module____qualname____doc__rL   rQ   rM   rv   ry   r   r   r   r   r   r   r   r   r    r8   r&   r=   r=   [   s        : :    
; ; ;4    R R R; ; ;  (  
     
. . .8 8 8:/ / / / /r8   r=   c                 b    t                      }|                     d|j        |j                  S )Nr   ditherpalette)r,   r   NONEADAPTIVE)r   r*   s     r&   _convert2pilpr     s'    KKE::c%*en:EEEr8   c                 ,    |                      d          S )NLr   r   s    r&   _convert2pilLr   !      ::c??r8   c                 ,    |                      d          S )N1r   r   s    r&   _convert2pil1r   $  r   r8   c           	      p   t          |           } | j        \  }}t                              || t	          | d          r| j        n| j                    | j                                                  }t	          |d          st          t          j                            |          d         dz   |                                z   d          5 }|                    |           d d d            n# 1 swxY w Y   t          j        dk    rddlm}  ||d	           d S d S |                    |           d S )
Nr   writer   .wbmacmarkfilenamePICText)r   r   
_pmBackendpil2pictr   r   r   r   
getpaletter   r   r   splitextr"   r   namereportlab.lib.utilsr  )	r   fnfmttransparentcolsrowsrm   fr  s	            r&   _saveAsPICTr  '  sc   	r		BJD$D'[WR	5J5J'[rzzPRP[&^&^_a_d_o_o_q_qrrA2g "'""2&&q)#-ciikk9$?? 	1GGAJJJ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	7E>>888888L'''''' > 	s   C//C36C3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!dS )0PMCanvasH    Nr   c                    |dz  }t          ||z  dz             }t          ||z  dz             }|                     |||||          | 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
        | _        dS )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Me!e%*1QuQq$9j!&(l#%.k" #f378J3K3KTRUYY3V3VKK\gj!'1m$9=9S9S::Yb'(=r8   r  c                    t          |          }|t          j        }|dk    rL	 |                    | ||          S # t          $ r& 	 |                    | |||          cY S #  Y nxY wY nw xY wd|                                v rq|                                }t          	                    ||          }	 |                    | |||          S # t          $ r |                    | ||          cY S w xY wt          d|          )Nr   r(  r  r   z.Cannot obtain PM graphics state using backend )r'   r   r   gstate	TypeErrorGStater"   upper_pycairoFmtsMapgetAttributeErrorRuntimeError)r%  r&  r(  r#   r  mods         r&   r"  zPMCanvas._getGStateI  s<   G$$?/GKzz!Az,,,   ::a":55555DDD	
 ''))++C!%%c#..C-zz!AbSz111! - - -zz!Az,,,,,-WGWWXXXs9   = 
A-A# A-#A'%A-,A-6C "C43C4c                    || j         }||c| j        _        | j        _        d d d d d d d d}| j        }|j        |j        }}|                                D ]}t          ||          ||<   ~| `t          
                    |||          x}| j        d<   |                                D ]}t          | |||                    |                    ||           d S )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    :DHr45q1T]1t44\`nr  AE  F  FXR[2 	! 	!A2a==AaDD$.$5$5aR$5$@$@@T]5! 	! 	!AD1Q4    


2br8   c                     t                                          | j        dk    rt          | d          dk    rdnd| j        j        | j        j        f          }|                    | 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'A'AgdSYFZFZ\dFdFdVVjow{w  xF  HL  HP  HW  wX_  Y  Y
TX_%%%	r8   c           
         |                                  }|xt          |t                    st          dt	          |          z            t
          j                            |          d         }|                    d          r
|dd          }| j	        pi }|
                    dd            |                    d          }|r ||          }|                                }|dv rt          |          }n|dv rq|                    d          rt          |          }nI|                    d          rt          |          }n$|                    d	          rt!          |          }d
}nI|dv r't#          ||||                    dd                     S |dv rn|dv rd}nt'          d|z            |d
k    r |                    dd           }|rddlm}m} ddgz  }	t/          d|                                          D ]\  }
}d|	|
|z   <   |                    d|                                |                    |                    |	                              d                              ddgz  dgz                       fz             }d| j        fdfD ]\  }}|                    ||          ||<   |
                    dd           |                    d          rddlm} |                    |          }|
                    dd            |                    d          }|r ||          } |j        ||fi | tA          |d          s%t
          j!        dk    rddl"m#}  |||            d S d S d S )!Nz*Invalid value '%s' for fn when fmt is Noner   r   preConvertCBGIF)TIFFTIFFPTIFFLTIFTIFF1r   r   r   rK  )PCTr  r  )r  )PNGBMPPPM)JPGJPEGrU  zUnknown image kind %sr   )
ImageChopsr*   i   )r      i   r.   r  
resolution)zresolution unitinchchops_invert)rV  	preSaveCBr   r   r   r  )$rF  rg   r   r   asciir   r   r  
startswithr  
setdefaultrL   r1  r   endswithr   r   r  r3  r   r+   rV  r*   zip
bitmap_rgbmergesplitinvertpointr   r  saver   r	  r
  r  )rO   r  r  r   r  rH  tcrV  r*   Tor6   adr[  r  s                   r&   
saveToFilezPMCanvas.saveToFiler  s   ZZ\\;b%% [ !MPUVXPYPY!YZZZ'""2&&q)C~~c""1#abb'CN(b	^D111]]>22 	"b!!Biikk(??r""BB:::||C   '"2&&c"" '"2&&c"" '"2&&CCN""r"SY]]=QU5V5VWWWW(((N""CC 7# =>>>;;}T22B y11111111GR]]__== ! !DAq AacFF[[Z5F5FrxxPQ{{GZGZ[^G_G_GeGefikljmfmornsfsGtGt5u5u4w)wxx$TY/0JJ 2 2!(}}Qq11	!^A...==(( 	'&&&&&&""2&&B[...--,,	 	2B3#####r'"" 	%rw~~888888L$$$$$$	% 	%~~r8   rJ  c                 t    t                      }|                     ||           |                                S )Nr  )r   rl  getvalue)rO   r  rm   s      r&   saveToStringzPMCanvas.saveToString  s/    IIc"""zz||r8   c                    ddl }| j        }| j        dk    r!|j        dk    rd|_        |j        }d|_        n|j        }|j        |j        }}|                    |                    ddt          |          dz   ddd	||d
d
  
                   |dz  }t          t          |          d|           D ]"}|                    |||z
  |                    #|                    d           dS )z
        Niki Spahiev, <niki@vintech.bg>, asserts that this is a respectable way to get BMP without PIL
        f is a file like object to which the BMP is written
        r   Nr!   r  r  z=2sLLLLLLhh24xBM6   (   r      r   z              )structr  r   rB  rE  r~   r   r   packrj   r   )	rO   r  ru  r<  pixr~   r   rowbri  s	            r&   
_saveToBMPzPMCanvas._saveToBMP  s    
 	X=+%%"'8*;*;BG)CBGG)C")v	,T#c((2+a2eFSTUWXXYYYqys3xx4%(( 	# 	#AGGC$qM""""	r8   c                 2    t          | j        ||           d S rJ   )_setFontr  )rO   r`   ra   leadings       r&   r   zPMCanvas.setFont  s    (8,,,,,r8   c                 2    t          | j        ||           d S rJ   )r:  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    tx%%%r8   r   c                 b    |r|                                   |r|                                  d S d S rJ   )r   r   )rO   r   r   s      r&   r   zPMCanvas.fillstrokepath  s5     $4??$$$$$$$r8   c                 P   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  sd    6F?##r))))2f9U?##2f9U?##"T'\"T'\2f9U?##2f9U?##"T'\"T'\cDj4i fVm$k2	S3w<</1CLLACC#'\#'\cDj4i#'\#'\B2b'Br7RG466r8   c           	      $   ||z
  }t          |          dk    r||fg}nvt          t          t          |          dz                      }	t          |          |	z  }
g }t	          |	          D ]&}|||
z  z   }||
z   }|                    ||f           'g }|D ]r\  }}|s6|                     ||||||          \  \  }}}|                    |           =|                     ||||||          \  \  }}}|                    |           s||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iirj  bctrlptsr  r  ptstmpxtmpys                       r&   bezierArcCCWzPMCanvas.bezierArcCCW  sR    }%% )IIs=11#56688Em,,e3IIEll ( (R)^+	M  !A'''' 	$ 	$EQq $!%!:!:2b"R1!M!M"R#s####%)%>%>r"bQq%Q%Q"$tcs####B!!r8   c           	          |                      ||||||          \  \  }}}	|                     ||           |	D ])\  \  }
}\  }}\  }}|                     |
|||||           *dS )zadds an ellisesoidal arc segment to a path, with an ellipse centered
        on cx,cy and with radii (major & minor axes) rx and ry.  The arc is
        drawn in the CCW direction.  Requires: (ang2-ang1) > 0N)r  r   r   )rO   r   r   r{   r|   ang1ang2r  r  r  r   r   r   r   r  r  s                   r&   addEllipsoidalArczPMCanvas.addEllipsoidalArc  s    
 "..r"bDFF"R'Br*1 	, 	,&Wbgr"gr"LLBr"R++++	, 	,r8   r   Fc                 <    |                      ||||||           d S )N)r   	directionshapingr   )rO   rC   rD   r   r   r  r  s          r&   drawCentredStringzPMCanvas.drawCentredString  s'    !DkIW^_____r8   c                 :    |                      |||d|           d S )Nr   )r   r  r  )rO   r   rC   rD   r  s        r&   drawRightStringzPMCanvas.drawRightString  s$    QqUYGGGGGr8   leftc                    | j         }|j        }	|j        }
|r||	|
fk    r|\  }}t          |||           n|
}|	}t	          |||||          \  }}	 |dv rHt          |||          }|dk    r||z  }n+|dk    r	||dz  z  }n|dk    r|t          |||||          z  }| j        dk    r|                    |||           nt          |          }|j
        r|                    |||           nP|}t          |          s	 |                    d          }nr# t          $ re}|j        d	d
         \  }}t          |j        d d
         |j        d
         d||dz
  |         d|||         d|||dz            fz    d }~ww xY wt          ||g|j        z             }t#          |          }|dz
  }t%          |          D ]y}||         \  }}||k    rt          ||j        |           |}|                    |||           ||k    r1||                    |                    |j                  |          z  }z|                    |
|	           d S # |                    |
|	           w xY w)N)r`   ra   r  )r   r   r   r   r   g       @r   r!   utf8r]   rr   

   z-->z<--r   )r  ra   r`   r{  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;   Xkk 	#[$===!*HhR****"H"H&tIxQYbijjjg%	0555%dHX>>%%LAA (**OAA )++{4RRRA}k))a$''''x(($ MMM!Ad++++B$T?? LL#';;v#6#6DD1 L L L"#&1+CAa"4qvbqbzYZY_`aYbYbYbcghijlhlmnhncococoptuvwxuxpypypyz~  @A  BC  DF  BF  @F  {G  {G  DH  CJ  8J  #L  LL $D$0F)FGGBBAA#C"1XX M M!!u1b55$R
8<<<!"Ba!,,,c66qxx	/B/B8!L!LLAJJ{;/////BJJ{;////s3   B0I D I 
F	$A FF		B9I I2c                     | j         V|                                  |                     ||           |                     ||           |                                  d S d S rJ   )rX   r   r   r   r   )rO   r   r   r   r   s        r&   r   zPMCanvas.lineV  sa    'NNKK2KK2OO	 ('r8   c                 L   |                                   |                     ||           |                     ||z   |           |                     ||z   ||z              |                     |||z              |                                  |                     ||           d S )N)r   r   )r   r   r   r   r   )rO   rC   rD   r~   r   r   r   s          r&   r}   zPMCanvas.rect]  s    AqAeGQAeGQZ(((Aq6z"""6t44444r8   c                    |dk    r|}|dk    r|}||z   }||z   }|                                   |                     ||z   |           |                     ||z
  ||z   ||dd           |                     ||z
  ||z
  ||dd           |                     ||z   ||z
  ||dd           |                     ||z   ||z   ||dd           |                                  |                                  dS )zrect(self, x, y, width, height, rx,ry):
        Draw a rectangle if rx or rx and ry are specified the corners are
        rounded with ellipsoidal arcs determined by rx and ry
        (drawn in the counter-clockwise direction)r   i  ih  r     N)r   r   r  r   r   )	rO   rC   rD   r~   r   r{   r|   r   r   s	            r&   r   zPMCanvas.roundRectf  s   
 q55r"q55r"YZAbDr"uadBC>>>r"ubeRQ;;;qtRUBB<<<qtQrT2r3===r8   c                 6    |                      ||||           dS )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   }|}|}||z
  }||z   }	||t          z  z
  }
||t          z  z   }|}|                     ||           |                     |	|
||||           |}|}||z
  }|}||t          z  z
  }	||z
  }
|}||t          z  z
  }|                     |	|
||||           |}|}|}||z   }||z
  }	||t          z  z   }
||t          z  z
  }||z   }|                     |	|
||||           |}|}||z   }|}||t          z  z   }	||z   }
||z   }||t          z  z   }|                     |	|
||||           |                                  dS )zadd closed path ellipse with center cx,cy and axes rx,ry: counter-clockwise orientation
        (remember y-axis increases downward) N)r   BEZIER_ARC_MAGICr   r   r   )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                     dS )zdo nothing for compatibilityNr   rN   s    r&   	saveStatezPMCanvas.saveState  s    r8   c                 r    |                      |          | _        t          |dd           }|	|| _        d S d S Nrn   )r!  r_   r   r^   rO   aColorrn   s      r&   rl   zPMCanvas.setFillColor  sD    --f55wt,,$D r8   c                 r    |                      |          | _        t          |dd           }|	|| _        d S d S r  )r!  rX   r   rW   r  s      r&   rd   zPMCanvas.setStrokeColor  sE    //77wt,,!&D r8   c                     || _         d S rJ   )re   )rO   caps     r&   
setLineCapzPMCanvas.setLineCap  s    r8   c                     || _         d S rJ   )rf   )rO   joins     r&   setLineJoinzPMCanvas.setLineJoin  s    r8   c                     || _         d S rJ   )rV   )rO   r~   s     r&   setLineWidthzPMCanvas.setLineWidth  s     r8   c                 X    t          ||p| j        j        ||n| j        j                  S rJ   )r   r  r`   ra   )rO   r   r`   ra   s       r&   r   zPMCanvas.stringWidth  s6    4!>TX->-5-AtxGX[ [ 	[r8   )r  r  NNr   )Nr  rJ   rI  )r   r   )r   NF)Nr  NF)NN)"r   r   r   r+  staticmethodr"  r@  rF  rl  ro  ry  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  s2       DH$! ! ! !$ Y Y Y \Y*     
6% 6% 6% 6%p   
  (- - - -% % %& & &% % % %!7 !7 !7F" " "<	, 	, 	,` ` ` `H H H H20 20 20 20h  5 5 5 5  $     9 9 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@   )	rk  r'  r(  r  r<   r#   r)  rE   r6   s	            r&   drawToPMCanvasr    sW    AA!(iQXdnoooAAq!66,6666Hr8   c           
      N    t          | f||||||d|                                S )Nr'  r(  r  r<   r#   r)  )r  rF  )rk  r'  r(  r  r<   r#   r)  rE   s           r&   	drawToPILr    s\    !  Ly|el  yC  L  L  GK  L  L  R  R  T  T  Tr8   c           
          t                      }t          | f||||||d|}	|	                    d|j        |j                  S )Nr  r   r   )r,   r  r   r   r   )
rk  r'  r(  r  r<   r#   r)  rE   r*   r   s
             r&   
drawToPILPr    sa    KKE	1  
D#"	]dpz  
D  
D  C  
D  
DB::c%*en:EEEr8   rJ  c	           
      Z    t          | f||||||d|	}
|
                    ||           dS )zocreate a pixmap and draw drawing, d to it then save as a file
    configPIL dict is passed to image save methodr  N)r  rl  )rk  r  r  r'  r(  r  r<   r#   r)  rE   r6   s              r&   
drawToFiler    sX     	q  	HcbILaht~  	H  	H  CG  	H  	HALLCr8   c           
      p    t                      }	t          | |	f||||||d| |	                                S )N)r  r'  r(  r  r#   r)  )r   r  rn  )
rk  r  r'  r(  r  r<   r#   r)  rE   rm   s
             r&   drawToStringr    sB    		Aqnsi[ennimnnn::<<r8   pmoutFc           	         d }dd l }ddlm} ddlm |j        }g }|j                            |           s |j        |            d}d}|g}	i }
t          j
        dd          }d |D             }|sg d	}nL|D ]}|                    |           d
                    d |D                                           d
          }g dd lddlm fd} |t#          t$          d                    D ]Y\  }}}|
                    |d          dz   x}|
|<   |dk    r|d|dz
  z  z  }|r||vr=|}t)          |j                  }t)          |j                  }|	                    d|d|d           |D ]w}|dv r*|	                    d|                                z             	 |d ||          }|j                            | |          }|j                            |          r |j        |           |dk    rt5          |||dt6          i           n1|dv r|                    ddg| |           nt5          |||           |dv r|	                    d |z             n=|dk    r|	                    d!|z             n|dk    r|	                    d"|z             sd#k    rt;          d$t=          |          z             \# t>          $ r  |||           Y uw xY w|j         !                    d%d&          d'k    r
d|j"        d(<   d)D ]/}	 |                    |g| |           #   |||           Y -xY w[rI|	d         #                    d*d+          |	d<   |	                    d,           |	$                               |	                    |           |j                            | d-          }tK          |d.          5 }|&                    |	           d d d            n# 1 swxY w Y   t          j'        d/k    rdd0l(m)}  ||d12           sd#k    rt;          d$|z             d S d S )3Nc                     | dk    rd} | S )Ntifftifr   )rC   s    r&   r  ztest.<locals>.ext  s    f99ar8   r   )
testshapes)verbosezq<html><head><title>renderPM output results</title></head>
    <body>
    <h1>renderPM results of output</h1>
    z</body>
    </html>
    r   c                 <    g | ]}|                     d           |S )z--ext=)r]  .0rj  s     r&   
<listcomp>ztest.<locals>.<listcomp>  s)    333qALL223333r8   )gifr  pngjpgpctpyr   ,c                 "    g | ]}|d d         S )   Nr   r  s     r&   r  ztest.<locals>.<listcomp>  s     (((qu(((r8   )escapec                 &   d| d|d}sdk    rt          |                               d|z             t                      }                    |                               d |                                          z             d S )NzProblem drawing z fmt=z filer]   z"<br/><h2 style="color:red">%s</h2>)filez<pre>%s</pre>)printr   r   	print_excrn  )	r	  r  msgbuferrsr  shout	tracebackr  s	       r&   handleErrorztest.<locals>.handleError  s     04SSS9)GAIIuSzzz83>???jj%%%OffS\\^^&<&<<=====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argvremover  rc  r  xml.sax.saxutilsr  r   r  r^  r1   r~   r   r   r1  r   r  r   rf  r  r\  r4  environr3  r>   replaceextendr   
writelinesplatformr
  r  ) r  r  r  r   r  r  drawingshtmlTop
htmlBottomhtmlnamesr  Erj  r  rA   	docstringr	  r   r	  r%  r&  r?  filenamefullpathhtmlFileNamer  r  r  r  r  r  s     `                          @@@@r&   testr'    s     
 III------++++++#6H7==   GJ 9DE8ABB<D33D333A 6<<< 	 	AKKNNNNXX((a((())0055D''''''> > > > > > > > > '9&8wzR_?`?`&a&a&a %$ %$")T**422144E$KQ331Q3'.D$$hiiiPQQQ 	$ 	$A---017799<===$&,ffcc!fff57<<997>>(++ (BIh'''e88wxAu@UVVVVV,&&LL$uV6LRRRRwxA6666+++KK AH LMMMMWWKK F QRRRRXXKK <x GHHHHGAIIuZh-G'H'H'H! $ $ $D#####$:>>+C00#55UVw7G	7R 	$ 	$A$aSfEEEE$D#####		$  q'//'*cddQ()))DKK
7<<88L	lC	 	  A	T              
|U444444\f----;		5l!:;;;;;		s1   3D(KK76K7(MM"PPP__main__T)r  rJ   )r  F)A__version__r   r   reportlab.graphics.renderbaser   r   reportlab.pdfbase.pdfmetricsr   r   r   reportlab.pdfbase.ttfontsr	   r
   reportlab.pdfgen.textobjectr   r
  r   r   reportlab.lib.abagr   reportlab.lib.colorsr   r   	reportlabr   utilsr   r{  r   r   r  ior   r   mathr   r   r   r   r'   r   r  r,   r7   r:   _unset_r@   rG   r=   r   r   r   r  dictr2  r  r  r  r  r  r  r  rf  r'  r   r   r8   r&   <module>r6     s	   	1 ( ' ' ' L L L L L L L L I I I I I I I I I I > > > > > > > > 6 6 6 6 6 6 4 4 4 4 4 4 4 4 # # # # # # / / / / / / / /       5 5 5 5 5 5 5 5                  # # # # # # # # # # # #   :y899JJ   JJJ    
. . . .7-> R R R R 3 2 2 2 2 2@ @ @ @ @( @ @ @DF F F        $H(w??? _[ _[ _[ _[ _[ _[ _[ _[@ T	HYbkb{  HM     H9CT]f]v  CH T T T T XIDU^g^w  DI F F F F
 2(dQZQbkt  lE  QV     "TPYPajs  kD  PU    
 ]< ]< ]< ]<~ ZDt s   .A? ?B	B	