
     h:q                     4   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 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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j        fdZ*ddd
ej         ej        fdZ+ddd
ej         ej        fdZ,d ddd
ej         ej        fd!Z-d ddd
ej         ej        fd"Z.e-Z/d*d%Z0e1d&k    r e0d'(           d
S d
S )+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                    | st           j        } | dk    r)	 ddlm} np# t          $ r}t	          d          d }~ww xY wd|                                 v r'	 dd l}n3# t          $ r}t	          d          d }~ww xY wt          d|            |S )N	_renderPMr   )r   zNo module named _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cairozcannot import desired renderPM backend rlPyCairo
Seek advice at the users list see
https://pairlist2.pair.net/mailman/listinfo/reportlab-userszInvalid renderPM backend, )r	   renderPMBackendreportlab.graphicsr   ImportErrorlower	rlPyCairor   )backendMerrMsgs      W/var/www/html/Sam_Eipo/venv/lib/python3.11/site-packages/reportlab/graphics/renderPM.py_getPMBackendr      s    7i7G	@9999999 	@ 	@ 	@ ? @ @ @	@ 
GMMOO	#	#	@!!!!! 	@ 	@ 	@ ? @ @ @	@
 BBBCCCHs(    
;6;A 
A8$A33A8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$   2   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   	Color2Hexr.   9   sc    h4CI&2-4CK8H8H3HQ2NOSWX[\_`a`f\fXgXgSgh
hH    c                 p    t                      }|                    t          |           ||||           dS )z
As it saysshowBoundaryN)_PMRendererdrawr   )drawingcanvasxyr2   Rs         r   r4   r4   ?   s6    AFFw''ALFQQQQQr/   )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 )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                 `    | j                                          |                                  d S N)_trackerpop
applyStateselfs    r   r?   z_PMRenderer.popJ   s,    r/   c                     t          |          }| j                            |           |                                  d S r=   )r   r>   pushr@   )rB   nodedeltass      r   rD   z_PMRenderer.pushN   s;    t$$6"""r/   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)r>   getState_canvasrH   rI   rJ   setStrokeColorlineCaplineJoinrN   
isinstancelisttuplelen	dashArrayrQ   setFillColorr   )rB   salphadas       r   r@   z_PMRenderer.applyStateS   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:::::r/   c                     | j         j        d         }| j        j        dd         ||fz   x|d<   |d<   | j                             |           |                                  d S )Nr      	transformrH   )r>   	_combinedrV   _baseCTMrD   r@   )rB   r7   r8   rF   s       r   	initStatez_PMRenderer.initStatem   sg    (,.2l.CAaC.H!A.NN{fUm6"""r/   c                     |                      |           |                     |           |                                  dS )zEThis is the recursive method called for each node
        in the treeN)rD   drawNodeDispatcherr?   )rB   rE   s     r   drawNodez_PMRenderer.drawNodes   s<    
 			$ 	%%% 	




r/   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   )	rV   rxryrectr7   r8   widthheight	roundRect)rB   rp   r-   s      r   drawRectz_PMRenderer.drawRect   s    L7dg"""""""""FF46$&$*dk:::::KKtvtz4;QQQQQr/   c                 h    | j                             |j        |j        |j        |j                   d S r=   )rV   linex1y1x2y2)rB   rv   s     r   drawLinez_PMRenderer.drawLine   s,    $'$'$'$':::::r/   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   )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!   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		 	 	 	 	r/   c                     | j         }|                    |j        |j        |j                   |                                 d S r=   )rV   circlecxcyrfillstrokepath)rB   r   r-   s      r   
drawCirclez_PMRenderer.drawCircle   s=    L	69fh///	r/   r   c                    |j         }t          |          dk    s
J d            | j        }|                                 |                    |d         |d                    t          dt          |          d          D ]'}|                    ||         ||dz                       (|r(|                                 |                                 |	                                 d S )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    O1vv{{{A{{{L		1qtq#a&&!$$ 	# 	#AHHQqT1QqS6"""" 	KKMMMJJLLL	r/   c                     | j         }|                    |j        |j        |j        |j                   |                                 d S r=   )rV   ellipser   r   rn   ro   r   )rB   r   r-   s      r   drawEllipsez_PMRenderer.drawEllipse   sA    
,			'*gj'*WZ@@@	r/   c                 4    |                      |d           d S )Nr
   )r   )r   )rB   polygons     r   drawPolygonz_PMRenderer.drawPolygon   s!    '1-----r/   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   
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   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 )Nrd   r
   r   )_renderPath	autoclose Fc                 H                                       |           S )N
forceClose)r   )r   r   r-   	drawFuncsr   s    r   rPz _PMRenderer.drawPath.<locals>.rP   s'    KKMMM;tY:FF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   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$$$LLNNNNNr/   N)r   )__name__
__module____qualname____doc__r?   rD   r@   ri   rl   rt   r{   r   r   r   r   r   r   r    r/   r   r3   r3   E   s        : :    
; ; ;4    R R R; ; ;  (  
     
. . .8 8 8:/ / / / /r/   r3   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Er/   c                 ,    |                      d          S )NLr~   r   s    r   _convert2pilLr         ::c??r/   c                 ,    |                      d          S )N1r   r   s    r   _convert2pil1r     r   r/   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rowsr`   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gOQ?c                       e Zd Zdddej        f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    Nc                 @   |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	<   || j        d
<   | j        | _        dS )z-configPIL dict is passed to image save methodg      R@g      ?_gs_bgr   rh   r   	configPIL_dpir   N)r)   
_getGState__dict__rh   rH   )rB   whdpibgr  r   scales           r   __init__zPMCanvas.__init__   s    D%%#q2g>>e!e%*1QuQq$9j!&(l#%.k" #f$+j!=r/   RGB24c                     t          |          }|dk    r|                    | ||          S d|                                v r|                    | |||          S d S )Nr   r  r   r   )r   gstater   GState)r  r  r  r   r   mods         r   r  zPMCanvas._getGState.  sg    G$$K::aR:(((''::a":--- ('r/   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)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._drawTimeResize6  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r/   c                     t                                          d| j        j        | j        j        f          } t          |dd           pt          |d          | j        j                   |S )Nr}   )r   	frombytes
fromstring)r$   newr  rq   rr   r   pixBuf)rB   r   s     r   toPILzPMCanvas.toPILD  s\    [[__U$(.$(/)J_KK	AK	%	%	AL)A)A48?SSS	r/   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   r2  )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   )$r-  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  r/  tcr=  r"   Tor-   adrC  r   s                   r   
saveToFilezPMCanvas.saveToFileI  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$$$$$$	% 	%~~r/   r1  c                 t    t                      }|                     ||           |                                S )Nr  )r   rV  getvalue)rB   r   r`   s      r   saveToStringzPMCanvas.saveToString  s/    IIc"""zz||r/   c                    ddl }| j        }|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   Nz=2sLLLLLLhh24xBM6   (   r
      r   z              )	structr  r,  rq   rr   r   packr]   r   )	rB   r  r_  r#  pixrq   rr   rowbrS  s	            r   
_saveToBMPzPMCanvas._saveToBMP  s    
 	XY")FU	,T#c((2+a2eFSTUWXXYYYqys3xx4%(( 	# 	#AGGC$qM""""	r/   c                 2    t          | j        ||           d S r=   )_setFontr  )rB   rS   rT   leadings       r   r   zPMCanvas.setFont  s    (8,,,,,r/   c                 2    t          | j        ||           d S 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    tx%%%r/   r
   c                 b    |r|                                   |r|                                  d S d S r=   )r   r   )rB   r   r   s      r   r   zPMCanvas.fillstrokepath  s5     $4??$$$$$$$r/   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   )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  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6r/   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@)ro  r)   r   floatr   r   r  )rB   r   r   rn   ro   rp  rq  angularExtent	angleListNfrag	fragAngleiirT  bctrlptsrt  ru  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!!r/   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   )rB   r   r   rn   ro   ang1ang2rt  ru  r  rw   rx   ry   rz   rx  ry  s                   r   addEllipsoidalArczPMCanvas.addEllipsoidalArc  s    
 "..r"bDFF"R'Br*1 	, 	,&Wbgr"gr"LLBr"R++++	, 	,r/   r   c                 8    |                      ||||           d S )Nr   r   )rB   r7   r8   r   r   s        r   drawCentredStringzPMCanvas.drawCentredString  s"    !Dk:::::r/   c                 8    |                      |||d           d S )Nr   r  r  )rB   r   r7   r8   s       r   drawRightStringzPMCanvas.drawRightString  s"    QqU33333r/   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   utf8rP   re   

   z-->z<--r
   )r  rT   rS   re  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  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 r=   )rK   r   r   r   r   )rB   rw   rx   ry   rz   s        r   rv   zPMCanvas.line%  sa    'NNKK2KK2OO	 ('r/   c                 L   |                                   |                     ||           |                     ||z   |           |                     ||z   ||z              |                     |||z              |                                  |                     ||           d S )N)r   r   )r   r   r   r   r   )rB   r7   r8   rq   rr   r   r   s          r   rp   zPMCanvas.rect,  s    AqAeGQAeGQZ(((Aq6z"""6t44444r/   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  rn     N)r   r   r  r   r   )	rB   r7   r8   rq   rr   rn   ro   ry   rz   s	            r   rs   zPMCanvas.roundRect5  s   
 q55r"q55r"YZAbDr"uadBC>>>r"ubeRQ;;;qtRUBB<<<qtQrT2r3===r/   c                 6    |                      ||||           dS )zRadd closed path circle with center cx,cy and axes r: counter-clockwise orientationN)r   )rB   r   r   r   s       r   r   zPMCanvas.circleG  s     R1Qr/   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   )rB   r   r   rn   ro   rt  ru  rx  ry  rw   rx   ry   rz   s                r   r   zPMCanvas.ellipseK  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                     dS )zdo nothing for compatibilityNr   rA   s    r   	saveStatezPMCanvas.saveState  s    r/   c                 f    t          |          | _        t          |dd           }|	|| _        d S d S Nra   )r.   rR   r   rQ   rB   aColorra   s      r   r_   zPMCanvas.setFillColor  s>    "6**wt,,$D r/   c                 f    t          |          | _        t          |dd           }|	|| _        d S d S r  )r.   rK   r   rJ   r  s      r   rW   zPMCanvas.setStrokeColor  s?    $V,,wt,,!&D r/   c                     || _         d S r=   )rX   )rB   caps     r   
setLineCapzPMCanvas.setLineCap  s    r/   c                     || _         d S r=   )rY   )rB   joins     r   setLineJoinzPMCanvas.setLineJoin  s    r/   c                     || _         d S r=   )rI   )rB   rq   s     r   setLineWidthzPMCanvas.setLineWidth  s     r/   )Nr  r=   r0  )r
   r
   )r   )Nr  )#r   r   r   r	   r   r  staticmethodr  r'  r-  rV  rY  rc  r   ri  rk  r   r  r  r  r  r  r   rv   rp   rs   r   r   r  r_   rW   restoreStater  r  r  r   r/   r   r  r    s        HtID] ! ! ! ! . . . \.     
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    ! ! ! ! !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   )rU  r  r  r  r2   r   r-   s          r   drawToPMCanvasr    sL    AA!(iQXYYYAAq!,////Hr/   c                 P    t          | |||||                                          S )Nr  r  r  r2   r   )r  r-  )rU  r  r  r  r2   r   s         r   	drawToPILr    s*    !y|elmmmssuuur/   c                     t                      }t          | |||||          }|                    d|j        |j                  S )Nr  r   r   )r$   r  r~   r   r   )rU  r  r  r  r2   r   r"   r   s           r   
drawToPILPr    sB    KKE	1#"	]d	e	e	eB::c%*en:EEEr/   r1  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  rV  )	rU  r   r   r  r  r  r2   r   r-   s	            r   
drawToFiler    s9     	qcbILahiiiALLCr/   c           	      r    t                      }t          | ||||||           |                                S )N)r   r  r  r  r   )r   r  rX  )rU  r   r  r  r  r2   r   r`   s           r   drawToStringr    s6    		AqsiPPPP::<<r/   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 ]Z\  }}}|
                    |d          dz   x}|
|<   |dk    r|d|dz
  z  z  }|r||vr=|}t)          |j                  }t)          |j                  }|	                    d|d|d           |D ]x}|dv r*|	                    d|                                z             	 |d ||          }|j                            | |          }|j                            |          r |j        |           |dk    rddlm} t9          |||d|i           n1|dv r|                    ddg| |           nt9          |||           |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 vw 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.          }tM          |d/          5 }|'                    |	           d d d            n# 1 swxY w Y   t          j(        d0k    rdd1l)m*}  ||d23           s d$k    rt=          d%|z             d S d S )4Nc                     | dk    rd} | S )Ntifftifr   )r7   s    r   r   ztest.<locals>.ext  s    f99ar/   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=)rE  .0rT  s     r   
<listcomp>ztest.<locals>.<listcomp>  s)    333qALL223333r/   )gifr  pngjpgpctpyr   ,c                 "    g | ]}|d d         S )   Nr   r  s     r   r  ztest.<locals>.<listcomp>  s     (((qu(((r/   )escapec                 &   d| d|d}sdk    rt          |                               d|z             t                      }                    |                               d |                                          z             d S )NzProblem drawing z fmt=z filerP   z"<br/><h2 style="color:red">%s</h2>)filez<pre>%s</pre>)printr   r   	print_excrX  )	r   r   msgbuferrsr  shout	tracebackr  s	       r   handleErrorztest.<locals>.handleError  s     04SSS9)GAIIuSzzz83>???jj%%%OffS\\^^&<&<<=====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   r   r  reportlab.rl_configr  getAllTestDrawingsr   isdirmkdirsysargvremover  rM  r  xml.sax.saxutilsr  r   r   rF  r)   rq   rr   r   rG  r   reportlab.lib.colorsr  r  rP  r  rD  AttributeErrorenvironrI  r  replaceextendr   
writelinesplatformr   r   )!r  r  r   r   r  r  drawingshtmlTop
htmlBottomhtmlnamesr  ErT  r  r5   	docstringr   r   r  r  r  r&  filenamefullpathr  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K87K8)MM#PP	P	__main__T)r  r=   )r  F)2__version__r   r   reportlab.graphics.renderbaser   r   reportlab.pdfbase.pdfmetricsr   r   r   r   	reportlabr	   utilsr   re  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  rP  r  r   r   r/   r   <module>r     s0   	1 ( ' ' ' L L L L L L L L < < < < < < < < ) ) ) ) ) )       5 5 5 5 5 5 5 5                  # # # # # # # # # # # #   , ]9455
     .7-> R R R R
 3 2 2 2 2 2@ @ @ @ @( @ @ @DF F F          A! A! A! A! A! A! A! A!F T	HYbkb{     H9CT]f]v v v v v XIDU^g^w F F F F
 2(dQZQbkt  lE     "TPYPajs  kD    
 ^< ^< ^< ^<@ ZDt r/   