
    kfx                        d Z dZddlT ddl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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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&          Z'd Z(d Z)d Z*d/dZ+ e,ddd          Z-dZ. G d d          Z/d d!dej$        ej        d"fd#Z0d d!dej$        ej        d"fd$Z1d d!dej$        ej        d"fd%Z2d&d d!dej$        ej        d"fd'Z3d&d d!dej$        ej        d"fd(Z4e3Z5d0d+Z6e7d,k    r e6d-.           dS dS )1z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)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      [/var/www/html/nettyfy-visnx/env/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    	Color2Hexr1   D   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	   r/   s    r    
CairoColorr4   I   s    
 71:::A-r2   c                 p    t                      }|                    t          |           ||||           dS )z
As it saysshowBoundaryN)_PMRendererdrawr   )drawingcanvasxyr7   Rs         r    r9   r9   Q   s6    AFFw''ALFQQQQQr2   )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 )r8   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    rD   z_PMRenderer.pop\   s,    r2   c                     t          |          }| j                            |           |                                  d S rB   )r   rC   pushrE   )rG   nodedeltass      r    rI   z_PMRenderer.push`   s;    t$$6"""r2   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)rC   getState_canvasrM   rN   rO   setStrokeColorlineCaplineJoinrS   
isinstancelisttuplelen	dashArrayrV   setFillColorr   )rG   salphadas       r    rE   z_PMRenderer.applyStatee   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:::::r2   c                     | j         j        d         }| j        j        dd         ||fz   x|d<   |d<   | j                             |           |                                  d S )Nr      	transformrM   )rC   	_combinedr[   _baseCTMrI   rE   )rG   r<   r=   rK   s       r    	initStatez_PMRenderer.initState   sg    (,.2l.CAaC.H!A.NN{fUm6"""r2   c                     |                      |           |                     |           |                                  dS )zEThis is the recursive method called for each node
        in the treeN)rI   drawNodeDispatcherrD   )rG   rJ   s     r    drawNodez_PMRenderer.drawNode   s<    
 			$ 	%%% 	




r2   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   )	r[   rxryrectr<   r=   widthheight	roundRect)rG   ru   r0   s      r    drawRectz_PMRenderer.drawRect   s    L7dg"""""""""FF46$&$*dk:::::KKtvtz4;QQQQQr2   c                 h    | j                             |j        |j        |j        |j                   d S rB   )r[   linex1y1x2y2)rG   r{   s     r    drawLinez_PMRenderer.drawLine   s,    $'$'$'$':::::r2   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   )pathr_   strosisfiler&   openr   hasattrsizerv   rw   r[   	_aapixbufr<   r=   _backendr   tostring)rG   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		 	 	 	 	r2   c                     | j         }|                    |j        |j        |j                   |                                 d S rB   )r[   circlecxcyrfillstrokepath)rG   r   r0   s      r    
drawCirclez_PMRenderer.drawCircle   s=    L	69fh///	r2   r   c                    |j         }t          |          dk    s
J d            | j        }|                                 |                    |d         |d                    t          dt          |          d          D ]'}|                    ||         ||dz                       (|r(|                                 |                                 |	                                 d S )NrU   z#Polyline must have 1 or more pointsr   r   )
pointsrb   r[   	pathBeginmoveTorangelineTo	pathClosepathFill
pathStroke)rG   polyline_doClosePr0   is         r    drawPolyLinez_PMRenderer.drawPolyLine   s    O1vv{{{A{{{L		1qtq#a&&!$$ 	# 	#AHHQqT1QqS6"""" 	KKMMMJJLLL	r2   c                     | j         }|                    |j        |j        |j        |j                   |                                 d S rB   )r[   ellipser   r   rs   rt   r   )rG   r   r0   s      r    drawEllipsez_PMRenderer.drawEllipse   sA    
,			'*gj'*WZ@@@	r2   c                 4    |                      |d           d S )Nr   )r   )r   )rG   polygons     r    drawPolygonz_PMRenderer.drawPolygon   s!    '1-----r2   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   
textAnchorrX   rY   )start	inheritedendmiddlerU   numericzbad value for textAnchor )	_fontInfo)r[   rW   getattrrC   rZ   textr<   r=   stringWidthnumericXShiftencoding
ValueErrorr   r   
drawString)rG   	stringObjcanvfillr   Stext_anchorrX   rY   r   r<   r=   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 )Nri   r   r   )_renderPath	autoclose Fc                 H                                       |           S )N
forceClose)r   )r   r   r0   	drawFuncsr   s    r    rPz _PMRenderer.drawPath.<locals>.rP   s'    KKMMM;tY:FFFFr2   rS   svgTr   pdf)F)r[   EmptyClipPath
_clipPaths
isClipPathdrawPathclipPathClearreportlab.graphics.shapesr   r   r   curveTor   r   clipPathSetappendrW   rP   r   r   )rG   r   r   icpr   r   r   strokerS   r   r0   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$$$LLNNNNNr2   N)r   )__name__
__module____qualname____doc__rD   rI   rE   rn   rq   ry   r   r   r   r   r   r   r   r    r2   r    r8   r8   W   s        : :    
; ; ;4    R R R; ; ;  (  
     
. . .8 8 8:/ / / / /r2   r8   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Er2   c                 ,    |                      d          S )NLr   r   s    r    _convert2pilLr         ::c??r2   c                 ,    |                      d          S )N1r   r   s    r    _convert2pil1r      r   r2   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rowsre   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 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S )-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   rm   r   	configPIL_dpir   r   r   _backendfmt_colorConverterN)r+   
_getGState__dict__typer  r   powr   r4   r1   rm   rM   )	rG   whdpibgr  r   
backendFmtscales	            r    __init__zPMCanvas.__init__3  s    D%%#q2g*MMe!e%*1QuQq$9j!&(l#%.k" #f378J3K3KTRUYY3V3VKK\gj!'1m$9=9S9S::Yb'(=r2   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._getGStateE  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)rM   rN   rP   r]   r^   rc   rW   r'  r  )r  _drawingrv   rw   r  rX   rY   keysr   r   r(  r  setattrr   )	rG   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r2   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  rv   rw   	frombytespixBuf)rG   r   s     r    toPILzPMCanvas.toPILi  s    [[__t}k'A'AgdSYFZFZ\dFdFdVVjow{w  xF  HL  HP  HW  wX_  Y  Y
TX_%%%	r2   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   rE  )PCTr   r  )r  )PNGBMPPPM)JPGJPEGrO  zUnknown image kind %sr   )
ImageChopsr$   i   )r      i   r(   r  
resolution)zresolution unitinchchops_invert)rP  	preSaveCBr   r   r   r   )$r@  r_   r   r   asciir   r   r  
startswithr  
setdefaultrD   r+  r   endswithr   r   r
  r-  r   r%   rP  r$   zip
bitmap_rgbmergesplitinvertpointr   r  saver   r  r  r   )rG   r  r  r   r  rB  tcrP  r$   Tor0   adrU  r   s                   r    
saveToFilezPMCanvas.saveToFilen  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$$$$$$	% 	%~~r2   rD  c                 t    t                      }|                     ||           |                                S )Nr  )r   rf  getvalue)rG   r  re   s      r    saveToStringzPMCanvas.saveToString  s/    IIc"""zz||r2   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   r<  r?  rv   rw   r   packrb   r   )	rG   r	  ro  r6  pixrv   rw   rowbrc  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""""	r2   c                 2    t          | j        ||           d S rB   )_setFontr  )rG   rX   rY   leadings       r    r   zPMCanvas.setFont  s    (8,,,,,r2   c                 2    t          | j        ||           d S rB   )r4  r  )rG   r  values      r    __setattr__zPMCanvas.__setattr__  s    e$$$$$r2   c                 ,    t          | j        |          S rB   )r   r  )rG   r  s     r    __getattr__zPMCanvas.__getattr__  s    tx%%%r2   r   c                 b    |r|                                   |r|                                  d S d S rB   )r   r   )rG   r   r   s      r    r   zPMCanvas.fillstrokepath  s5     $4??$$$$$$$r2   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   )rG   r   r   rs   rt   theta0theta1cos0sin0x0y0cos1sin1x3y3dx1dy1halfAngr9  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6r2   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  r+   r   floatr   r   r  )rG   r   r   rs   rt   r  r  angularExtent	angleListNfrag	fragAngleiird  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!!r2   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   )rG   r   r   rs   rt   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++++	, 	,r2   r   c                 8    |                      ||||           d S )Nr   r   )rG   r<   r=   r   r   s        r    drawCentredStringzPMCanvas.drawCentredString  s"    !Dk:::::r2   c                 8    |                      |||d           d S )Nr   r  r  )rG   r   r<   r=   s       r    drawRightStringzPMCanvas.drawRightString  s"    QqU33333r2   leftc                    | j         }|j        }|j        }|r|||fk    r|\  }	}
t          ||	|
           n|}	|}
	 |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   r   r   r   r   g       @r   r   utf8rU   rj   

   z-->z<--r   )r  rY   rX   ru  r   r   r   r   r   _dynamicFontr   decodeUnicodeDecodeErrorargsr   substitutionFontsrb   r   encNamer   )rG   r<   r=   r   r   r   r6  gs_fontSizegs_fontNamerX   rY   r   fontfcer   jFTnnm1r	  ts                         r    r   zPMCanvas.drawString  s   Xkk 	#[$===!*HhR****"H"H%	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{;////s2   B0I -D I 
E2A E--E22B9I Ic                     | j         V|                                  |                     ||           |                     ||           |                                  d S d S rB   )rP   r   r   r   r   )rG   r|   r}   r~   r   s        r    r{   zPMCanvas.lineP  sa    'NNKK2KK2OO	 ('r2   c                 L   |                                   |                     ||           |                     ||z   |           |                     ||z   ||z              |                     |||z              |                                  |                     ||           d S )N)r   r   )r   r   r   r   r   )rG   r<   r=   rv   rw   r   r   s          r    ru   zPMCanvas.rectW  s    AqAeGQAeGQZ(((Aq6z"""6t44444r2   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   )	rG   r<   r=   rv   rw   rs   rt   r~   r   s	            r    rx   zPMCanvas.roundRect`  s   
 q55r"q55r"YZAbDr"uadBC>>>r"ubeRQ;;;qtRUBB<<<qtQrT2r3===r2   c                 6    |                      ||||           dS )zRadd closed path circle with center cx,cy and axes r: counter-clockwise orientationN)r   )rG   r   r   r   s       r    r   zPMCanvas.circler  s     R1Qr2   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   )rG   r   r   rs   rt   r  r  r  r  r|   r}   r~   r   s                r    r   zPMCanvas.ellipsev  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'''r2   c                     dS )zdo nothing for compatibilityNr   rF   s    r    	saveStatezPMCanvas.saveState  s    r2   c                 r    |                      |          | _        t          |dd           }|	|| _        d S d S Nrf   )r  rW   r   rV   rG   aColorrf   s      r    rd   zPMCanvas.setFillColor  sD    --f55wt,,$D r2   c                 r    |                      |          | _        t          |dd           }|	|| _        d S d S r  )r  rP   r   rO   r  s      r    r\   zPMCanvas.setStrokeColor  sE    //77wt,,!&D r2   c                     || _         d S rB   )r]   )rG   caps     r    
setLineCapzPMCanvas.setLineCap  s    r2   c                     || _         d S rB   )r^   )rG   joins     r    setLineJoinzPMCanvas.setLineJoin  s    r2   c                     || _         d S rB   )rN   )rG   rv   s     r    setLineWidthzPMCanvas.setLineWidth  s     r2   )r  r  NNr   )Nr  rB   rC  )r   r   )r   )Nr  )!r   r   r   r%  staticmethodr  r:  r@  rf  ri  rs  r   ry  r{  r   r  r  r  r  r  r   r{   ru   rx   r   r   r  rd   r\   restoreStater  r  r  r   r2   r    r  r  2  s       DH$! ! ! !$ Y Y Y \Y*     
6% 6% 6% 6%p   
  (- - - -% % %& & &% % % %!7 !7 !7F" " "<	, 	, 	,; ; ; ;4 4 400 00 00 00d  5 5 5 5  $     9 9 9v  % % %' ' ' L    ! ! ! ! !r2   r  r  r  r   c           	          t          |           } t          | j        | j        |||||          }t	          | |dd|           |S )N)r!  r"  r  r   r#  r   r6   )r   r  rv   rw   r9   )re  r!  r"  r  r7   r   r#  r0   s           r    drawToPMCanvasr    sO    AA!(iQXdnoooAAq!,////Hr2   c           	      R    t          | ||||||                                          S )Nr!  r"  r  r7   r   r#  )r  r@  )re  r!  r"  r  r7   r   r#  s          r    	drawToPILr    sI    !y|el  yC  D  D  D  J  J  L  L  Lr2   c           	          t                      }t          | ||||||          }|                    d|j        |j                  S )Nr  r   r   )r&   r  r   r   r   )	re  r!  r"  r  r7   r   r#  r$   r   s	            r    
drawToPILPr    sE    KKE	1#"	]dpz	{	{	{B::c%*en:EEEr2   rD  c	           	      ^    t          | ||||||          }	|	                    ||           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  rf  )
re  r  r  r!  r"  r  r7   r   r#  r0   s
             r    
drawToFiler    s<     	qcbILaht~ALLCr2   c           
      t    t                      }t          | |||||||           |                                S )N)r  r!  r"  r  r   r#  )r   r  rh  )	re  r  r!  r"  r  r7   r   r#  re   s	            r    drawToStringr    s9    		Aqsi[effff::<<r2   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   )r<   s    r    r   ztest.<locals>.ext  s    f99ar2   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=)rW  .0rd  s     r    
<listcomp>ztest.<locals>.<listcomp>  s)    333qALL223333r2   )gifr  pngjpgpctpyr   ,c                 "    g | ]}|d d         S )   Nr   r  s     r    r  ztest.<locals>.<listcomp>  s     (((qu(((r2   )escapec                 &   d| d|d}sdk    rt          |                               d|z             t                      }                    |                               d |                                          z             d S )NzProblem drawing z fmt=z filerU   z"<br/><h2 style="color:red">%s</h2>)filez<pre>%s</pre>)printr   r   	print_excrh  )	r  r  msgbuferrsr  shout	tracebackr  s	       r    handleErrorztest.<locals>.handleError
  s     04SSS9)GAIIuSzzz83>???jj%%%OffS\\^^&<&<<=====r2   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>
rU   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  r]  r  xml.sax.saxutilsr  r   r   rX  r+   rv   rw   r   r+  r   r  r
   r`  r  rV  r.  environr-  r  replaceextendr   
writelinesplatformr  r   ) r   r  r   r   r  r	  drawingshtmlTop
htmlBottomhtmlnamesr  Erd  r  r:   	docstringr  r   r  r  r   r9  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  rB   )r  F)8__version__r   r   reportlab.graphics.renderbaser   r   reportlab.pdfbase.pdfmetricsr   r   r  r   reportlab.lib.colorsr	   r
   	reportlabr   utilsr   ru  r   r   r  ior   r   mathr   r   r   r   r!   r   r   r&   r1   r4   _unset_r9   r?   r8   r   r   r   r
  dictr,  r  r  r  r  r  r  r  r`  r  r   r   r2   r    <module>r+     s   	1 ( ' ' ' L L L L L L L L < < < < < < < < ) ) ) ) ) ) / / / / / / / /       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??? Y! Y! Y! Y! Y! Y! Y! Y!v T	HYbkb{  HM     H9CT]f]v  CH L L L L 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' 'A10A1