o
    Neb1                     @   s  d Z dZddlZddlmZmZ ddlmZmZm	Z	 ddl
mZmZmZmZmZ ddlmZ ddlmZmZmZ dd	lmZ dd
lmZ ddlmZ i ZedD ]-Zedk sZedkrade ee< qPeedededfv rwde e ee< qPe eee< qP[dd Z!dZ"G dd dZ#	 ddlT ddej$fddZ%dd Z&G dd deZ'ej$fdd Z(ej$fd!d"Z)d+d%d&Z*e+d'krddl,Z,e-e,j.d(kre,j.d( Z/nd#Z/e*e/d)d* dS dS ),z3.3.0z$Render drawing objects in Postscript    N)BytesIOStringIO)getFontstringWidth
unicode2T1)asByteschar2intrawBytesasNative	isUnicode)fp_str)RenderergetStateDeltarenderScaledDrawing)STATE_DEFAULTS)	rl_config)FILL_EVEN_ODD          z\%03o\()c                 C   s^   t | } g }|j}d}| D ]}tt| }|| |t|7 }|dkr)d}|d qd|S )Nr      z\
 )r   append_ESCAPEDICTr   lenjoin)sRZaRnc r#   =/usr/lib/python3/dist-packages/reportlab/graphics/renderPS.py_escape_and_limit   s   
r%   a?  
/RE { %def
  findfont begin
  currentdict dup length dict begin
 { %forall
   1 index /FID ne { def } { pop pop } ifelse
 } forall
 /FontName exch def dup length 0 ne { %if
   /Encoding Encoding 256 array copy def
   0 exch { %forall
     dup type /nametype eq { %ifelse
       Encoding 2 index 2 index put
       pop 1 add
     }{ %else
       exch pop
     } ifelse
   } forall
 } if pop
  currentdict dup end end
  /FontName get exch definefont pop
} bind def

/WinAnsiEncoding [
  39/quotesingle 96/grave 128/euro 130/quotesinglbase/florin/quotedblbase
  /ellipsis/dagger/daggerdbl/circumflex/perthousand
  /Scaron/guilsinglleft/OE 145/quoteleft/quoteright
  /quotedblleft/quotedblright/bullet/endash/emdash
  /tilde/trademark/scaron/guilsinglright/oe/dotlessi
  159/Ydieresis 164/currency 166/brokenbar 168/dieresis/copyright
  /ordfeminine 172/logicalnot 174/registered/macron/ring
  177/plusminus/twosuperior/threesuperior/acute/mu
  183/periodcentered/cedilla/onesuperior/ordmasculine
  188/onequarter/onehalf/threequarters 192/Agrave/Aacute
  /Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla
  /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute
  /Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute
  /Ocircumflex/Otilde/Odieresis/multiply/Oslash
  /Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn
  /germandbls/agrave/aacute/acircumflex/atilde/adieresis
  /aring/ae/ccedilla/egrave/eacute/ecircumflex
  /edieresis/igrave/iacute/icircumflex/idieresis
  /eth/ntilde/ograve/oacute/ocircumflex/otilde
  /odieresis/divide/oslash/ugrave/uacute/ucircumflex
  /udieresis/yacute/thorn/ydieresis
] def
c                   @   s  e Zd ZdkddZdd Zdldd	Zd
d Zdd ZdmddZdd Z	dd Z
dlddZdd Zdd Zg dfddZdd Zdd  Zd!d" Zd#d$ Zd%d& Zdmd'd(Zd)d* Zd+d, Zdnd-d.Zdnd/d0Zdod2d3Zdpd5d6Zdqd8d9Zdnd:d;Zdrd=d>Zdsd@dAZdBdC ZdDdE Z dtdGdHZ!dIdJ Z"dudKdLZ#dldMdNZ$dOdP Z%dQdR Z&dSdT Z'dUdV Z(dWdX Z)dndYdZZ*dvd[d\Z+d]d^ Z,d_d` Z-dadb Z.dcdd Z/dldedfZ0dgdh Z1dldidjZ2dS )wPSCanvas,  r(      c                 C   s   |\| _ | _g }|j| _|j| _d| _g | _| jj| _d| _	d  | _
 | _ | _ | _ | _ | _ | _| _g | _| td td  | td  | d | d | d || _t| _d S )Nr   
fontNamefontSizestrokeColorr)      )widthheightr   _xtraState_pushpop_xtraState_popcommentscodecode_append_sep_strokeColor
_fillColor
_lineWidth_font	_fontSize_lineCap	_lineJoin_color
_fontsUsedsetFontr   setStrokeColor
setLineCapsetLineJoinsetLineWidthPostScriptLevelr   	_fillMode)selfsizerF   Z	xtraStater#   r#   r$   __init__[   s2   




zPSCanvas.__init__c                 C   s   | j r| d|  d S d S )N%)r4   r6   )rH   msgr#   r#   r$   commentq   s   zPSCanvas.commentNc                 C   sN   | j dkr| ||||| d S | j dkr | ||||| d S td| j  )Nr.   r)   zUnsupported Postscript Level %s)rF   _drawImageLevel1_drawImageLevel2
ValueError)rH   imagex1y1r/   r0   r#   r#   r$   	drawImaget   s
   

zPSCanvas.drawImagec                 C      |  d d S )Nshowpager6   rH   r#   r#   r$   clear}      zPSCanvas.clearc                 C   sr   | j sd S g }| j D ]}t|}|js!|jdkr!|d||f  q
|r7|dt | jd| j	| d S d S )NZWinAnsiEncodingzWinAnsiEncoding /%s /%s REr   r.   )
r@   r   _dynamicFontencNamer   insertPS_WinAnsiEncodingr5   r7   r   )rH   Cr+   fontObjr#   r#   r$   _t1_re_encode   s   

zPSCanvas._t1_re_encodec                 C   s   t |dst|d}n|}| jd dkr|   | jdd| j| jf  |   |t	| j
| j ||urL|  ddlm} ||dd	d
 d S d S )NwritewbrV   r   z%%!PS-Adobe-3.0 EPSF-3.0
%%%%BoundingBox: 0 0 %d %d
%%%% Initialization:
/m {moveto} bind def
/l {lineto} bind def
/c {curveto} bind def
)markfilenameZXPR3ZEPSF)ZcreatorcodeZfiletype)hasattropenr5   rY   r]   r/   r0   ra   rb   r	   r7   r   closereportlab.lib.utilsre   )rH   fZ_fre   r#   r#   r$   save   s   


	zPSCanvas.savec                 C   s   |  | jf | d d S )Ngsave)r1   _fontCodeLocr6   rX   r#   r#   r$   	saveState   s   zPSCanvas.saveStatec                 C   s   |  d |  \| _d S )Ngrestore)r6   r3   rm   rX   r#   r#   r$   restoreState   s   
zPSCanvas.restoreStatec                 C   s    |p| j }|p	| j}t|||S )zlReturn the logical width of the string if it were drawn
        in the current font (defaults to self.font).)r;   r<   r   )rH   r   fontr,   r#   r#   r$   r      s   

zPSCanvas.stringWidthc                 C   &   | j |kr|| _ | d|  d S d S )Nz%d setlinecap)r=   r6   rH   vr#   r#   r$   rC         
zPSCanvas.setLineCapc                 C   rr   )Nz%d setlinejoin)r>   r6   rs   r#   r#   r$   rD      ru   zPSCanvas.setLineJoinr   c                 C   st   d}t |ttfr| d|||f  dS t |ttfr8|dks$J ddtt|}| d|||f  dS dS )z7Two notations.  pass two numbers, or an array and phaseZsetdashz[%s %s] 0 %sr   zphase is a length in user space z
[%s] %s %sN)	
isinstancefloatintr6   tuplelistr   mapstr)rH   ZarrayphaseZpsoperationZ	textarrayr#   r#   r$   setDash   s   zPSCanvas.setDashc                 C      || _ | | d S N)r8   setColorrH   colorr#   r#   r$   rB         zPSCanvas.setStrokeColorc                 C   sj   | j |kr1|| _ |r3t|dr!| dt|j|j|j|j  d S | dt|j|j	|j
  d S d S d S )Ncyanz%s setcmykcolorz%s setrgbcolor)r?   rf   r6   r   r   ZmagentaZyellowZblackZredZgreenZbluer   r#   r#   r$   r      s   

$ zPSCanvas.setColorc                 C   r   r   )r9   r   r   r#   r#   r$   setFillColor   r   zPSCanvas.setFillColorc                 C   s
   || _ d S r   )rG   rs   r#   r#   r$   setFillMode   s   
zPSCanvas.setFillModec                 C   s&   || j kr|| _ | d|  d S d S )Nz%s setlinewidth)r:   r6   )rH   r/   r#   r#   r$   rE      ru   zPSCanvas.setLineWidthc                 C   s>   | j |ks
| j|krt| j| _|| _ || _| d d S d S )Nr   )r;   r<   r   r5   rm   r6   )rH   rq   r,   Zleadingr#   r#   r$   rA      s   zPSCanvas.setFontc                 C   s<   | j d kr| | j  | dt||t||f  d S d S )N%s m %s l stroke)r8   r   r6   r   rH   rR   rS   x2y2r#   r#   r$   line   s   
"zPSCanvas.linec                 C   s"   zt |W S    tdt| )z{
        return a copy of string s with special characters in postscript strings
        escaped with backslashes.
        zcannot escape %s)r%   rP   ascii)rH   r   r#   r#   r$   _escape   s   
zPSCanvas._escapec           
      C   s"  |dkrd S t ||}| |}|dkr%| | j | d||f  d S |dkp4|dkp4|dkp4|dk}|dkpD|dkpD|dkpD|dk}|dk}|r|r| jd u rUd	}	nd
}	| | j | d|||	f  | d | jd ur~| | j | d d S d S | | j | d||f  d S )N   r   z%s m (%s) show r)         r.      r   zfill z %s m (%s) true charpath gsave %sz	grestore zstroke z%s m (%s) true charpath stroke )r   r   r   r9   r6   r8   )
rH   xyr   textRenderModeZxyfillstrokeZ	addToClipopr#   r#   r$   _textOut   s.   

  


zPSCanvas._textOutc                 C   sP  |}| j }| j}| j}	| j}
t|sTz|d}W n: tyS } z.|jdd \}}t|jd d d|jd ||d | ||| |||d  f f  d }~ww t||g|j	 D ]7\}}||krt
|jj}|d|t|f  ||	vr~|	| |}| |||| ||||j|7 }q]||krd | _| |jj| d S d S )Nutf8r)   r   z%s
%s-->%s<--%s
   "(%s) findfont %s scalefont setfont)r6   r<   r@   r   r   decodeUnicodeDecodeErrorargsr   ZsubstitutionFontsr
   facenamer   r   r   r   r\   r;   rA   )rH   r`   r   r   r   r   Zfcr6   r,   Z	fontsUsedescapeeijrj   tpsNamer#   r#   r$   _issueT1String  s4   J
zPSCanvas._issueT1Stringleftc                 C   sR  |dv }|dv }|s|r|dkr<t || j| j}	|dkr!||	8 }n|dkr,||	d 8 }n|dkr<|t|||	| j| j8 }t| j}
| j| j set|
jj	}d|t
| jf | j| j< || jvre| j| |d	kr{| d
t
||t
|f  d	 }}| j}|
jr| j||||d n
| j|
||||d | | |d	kr| d d S d S d S )N)r   r)   r   r   )r.   r)   r   r   r   endmiddle       @numericr   r   zgsave %s translate %s rotater   ro   )r   r;   r<   numericXShiftr   r5   rm   r
   r   r   r   r@   r   r6   r?   r[   r   r   r   )rH   r   r   r   Zangletext_anchorr   ZneedFillZ
needStroketextLenr`   r   ZoldColorr#   r#   r$   
drawString+  s:   



zPSCanvas.drawStringr   c                 C      | j |||||d d S N)r   r   r   )rH   r   r   textr   r   r#   r#   r$   drawCentredStringI     zPSCanvas.drawCentredStringr   c                 C   r   r   r   )rH   r   r   r   r   r   r#   r#   r$   drawRightStringL  r   zPSCanvas.drawRightStringc
                 C   s   d}
t ||t ||||||f}| jd kr$| | j | |
| d  | jd kr@| | j | |
| |	r8dp9d d  d S d S )Nz%s m %s curvetoz eofillz
 closepathr   z stroke)r   r9   r   r6   r8   )rH   rR   rS   r   r   x3y3Zx4Zy4closedcodelinedatar#   r#   r$   	drawCurveO  s   




zPSCanvas.drawCurver.   c                 C   sZ   t ||t||}}t ||t||}}| j||f||f||f||ffd||d dS )z)Draw a rectangle between x1,y1, and x2,y2r.   )r   r   r   N)minmaxpolygon)rH   rR   rS   r   r   r   r   r#   r#   r$   rect]  s   .zPSCanvas.rect   c           
      C   s   t ||t||}}t ||t||}}d}dg}|j}	|	||| || || ddf  |	||| || || ddf  |	||| || || ddf  |	||| || || ddf  |	d | | d	S )
zDraw a rounded rectangle between x1,y1, and x2,y2,
        with corners inset as ellipses with x radius rx and y radius ry.
        These should have x1<x2, y1<y2, rx>0, and ry>0.zJmatrix currentmatrix %s %s translate %s %s scale 0 0 1 %s %s arc setmatrixnewpathZ      i  h  r   	closepathN)r   r   r   _fillAndStroke)
rH   rR   rS   r   r   rxryZellipsePathZrrar#   r#   r$   	roundRecte  s   """"zPSCanvas.roundRectc                 C   s   |  |||| dS )zqDraw an orthogonal ellipse inscribed within the rectangle x1,y1,x2,y2.
        These should have x1<x2 and y1<y2.N)drawArcr   r#   r#   r$   ellipse  s   zPSCanvas.ellipsec                 C   s$   |  || || || ||  d S r   )r   )rH   ZxcZycrr#   r#   r$   circle  s   $zPSCanvas.circler   c                 C   sT  || d || d }}	|| d || d }
}|  ||||||}tj| d }tj| d }|| }d}| jdkri| | j | | d}| jdkrT| d | ||	 | d | jdkri| d | jdkr| | j ||
t|  |	|t	|  }}|s| | |r| ||	 | || | d	 | d
 dS dS )zDraw a partial ellipse inscribed within the rectangle x1,y1,x2,y2,
        starting at startAng degrees and covering extent degrees.   Angles
        start with 0 to the right (+x) and increase counter-clockwise.
        These should have x1<x2 and y1<y2.r   g     f@r   Nr.   rl   eofillro   r   r   )
_genArcCodemathZpir9   r   r6   r8   lineToZcosZsin)rH   rR   rS   r   r   startAngextent
fromcentercxcyr   r   r   ZstartAngleRadiansZextentRadiansZendAngleRadiansZcodelineAppendedZstartxZstartyr#   r#   r$   r     s4   



&

zPSCanvas.drawArcc                 C   sn   t || d }t || d }|| d || d }	}
d}|dkr&d}nd}|	|
||||| |f}|| S )zOCalculate the path for an arc inscribed in rectangle defined by (x1,y1),(x2,y2)r   zImatrix currentmatrix %s %s translate %s %s scale 0 0 1 %s %s %s setmatrixr   arcZarcn)abs)rH   rR   rS   r   r   r   r   ZxScaleZyScaler   r   r   r   r   r#   r#   r$   r     s   zPSCanvas._genArcCodec           	      C   s|   t |dks
J d|d }|dd  }g }|j}|dt|  |D ]
}|dt|  q#|r4|d | j|||d d S )	Nr)   z"Polygon must have 2 or more pointsr   r.   %s m%s lr   )r   r   )r   r   r   r   )	rH   pr   r   r   startZpolyr   Zpointr#   r#   r$   r     s   zPSCanvas.polygonc                 C   sN   | j d kr#| | j  d}|D ]}| |t|d t|d f  qd S d S )Nr   r   r.   )r8   Z	_setColorr6   r   )rH   ZlineListr   r/   r   r   r#   r#   r$   lines  s   
$zPSCanvas.linesc                 C      |  dt||  d S )Nr   r6   r   rH   r   r   r#   r#   r$   moveTo  r   zPSCanvas.moveToc                 C   r   )Nr   r   r   r#   r#   r$   r     r   zPSCanvas.lineToc              
   C       |  dt||||||  d S )Nz%s cr   )rH   rR   rS   r   r   r   r   r#   r#   r$   curveTo      zPSCanvas.curveToc                 C   rU   )Nr   rW   rX   r#   r#   r$   	closePath  rZ   zPSCanvas.closePathc                 C   s~   t |dks
J d| jd kr=| | j | |d d |d d  |dd  D ]}| |d |d  q)| d d S d S )Nr.   z#Polyline must have 1 or more pointsr   r   )r   r8   r   r   r   r6   )rH   r   r   r#   r#   r$   polyLine  s   
zPSCanvas.polyLinec              
   C   sJ  g }|j }d}|D ]}|d }t|dd  }|tkrE|r,d}|dt|d d   n|dt|d d   |dt|dd    q	|tkrdd}|d d \}	}
}}}}|| |	|
|||| q	|tkr|ryd}|dt|d d   n|dt|d d   |dt|dd    q	td| |r|d	 | | d S )
Nr.   r   r   r)   r   r   z
%s curvetozunknown figure operator: r   )	r   r{   Z
figureLiner   Z	figureArcr   ZfigureCurve	TypeErrorr   )rH   ZpartListr   Z
figureCoder   firstpartr   r   rR   rS   r   r   Z
startAngler   r#   r#   r$   
drawFigure  s4   zPSCanvas.drawFigurec                 C   s   | j o|}| jo	|}|s|s|rk| j| |rB|d u r| j}|s#|r(| d | | j  | |tkr6dnd |s=|rB| d |r]|rK| d | | j | d |r]| d |rm| d | d d S d S d S )Nrl   r   r   ro   r   clipr   )r9   r8   r5   extendrG   r6   r   r   )rH   r5   r   r   r   fillModer#   r#   r$   r     s*   



zPSCanvas._fillAndStrokec                 C   r   )Nz%s translater   r   r#   r#   r$   	translate,  r   zPSCanvas.translatec                 C   r   )Nz%s scaler   r   r#   r#   r$   scale/  r   zPSCanvas.scalec              
   C   r   )Nz[%s] concatr   )rH   r   br"   dr   rj   r#   r#   r$   	transform2  r   zPSCanvas.transformc                 C   s   ||| _ | _dS )z1if this is used we're probably in the wrong worldN)r/   r0   )rH   whr#   r#   r$   _drawTimeResize5  s   zPSCanvas._drawTimeResizec              
   C   s   d}| d}|j\}}	|s|}|s|	}| jdd||f d||f d| g | jd||	|f d|d	d	|	 d	|	f d
dg t|drH|jn|j }
| |
}t|}|	d}|dkrl| 
| |	d}|dks^| 
d | 
d d S )Nr   RGBrl   %s %s translate%s %s scalez/scanline %d 3 mul string defz%s %s %sz[%s %s %s %s %s %s]r   z2{ currentfile scanline readhexstring pop } false 3zcolorimage tobytesN   r   z% end of image dataro   )convertrI   r5   r   rf   r   tostring_AsciiHexEncoder   readr6   )rH   rQ   rR   rS   r/   r0   Zcomponent_depthmyimageZimgwidthZ	imgheightrawimagehex_encoded	outstreamdataliner#   r#   r$   rN   9  s:   










zPSCanvas._drawImageLevel1c                 C   s.   t  }t|D ]}|dt|  q| S )zHelper function used by imagesz%02x)r   r   rb   r   getvalue)rH   inputoutputcharr#   r#   r$   r  w  s   zPSCanvas._AsciiHexEncodec                 C   sr  |j dkrd}d}|}n|j dkr|d}d}|}n	|d}d}d}|j\}	}
|s-|	}|s1|
}| jdd||f d	||f g |dkrL| d
 n	|dkrU| d | d|	|
|f  |dkrh| d |dkrq| d | jd|	|
 |
f dddg t|dr|jn|j }| 	|}t
|}|d}|dkr| | |d}|dks| d | d dS )z"At present we're handling only PILLr   r.   1r   r   rl   r   r   z/DeviceRGB setcolorspacez/DeviceGray setcolorspacezY
<<
/ImageType 1
/Width %d /Height %d  %% dimensions of source image
/BitsPerComponent %dz/Decode [0 1]z6/Decode [0 1 0 1 0 1]  %% decode color values normallyz/ImageMatrix [%s 0 0 %s 0 %s]z./DataSource currentfile /ASCIIHexDecode filterz>> % End image dictionaryrQ   r   r   r   z> % end of image dataro   N)moder  rI   r5   r   r6   rf   r   r  r  r   r  )rH   rQ   rR   rS   r/   r0   ZimBitsPerComponentZimNumComponentsr  ZimwidthZimheightr  r  r  r	  r#   r#   r$   rO   ~  s^   














zPSCanvas._drawImageLevel2)r'   r)   )NNr   )r   )r   r   r   )r   r   )r   r   )r.   r.   )r   r   )r   r   r   )r   r.   r.   )r   r.   r.   N)3__name__
__module____qualname__rJ   rM   rT   rY   ra   rk   rn   rp   r   rC   rD   r   rB   r   r   r   rE   rA   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rN   r  rO   r#   r#   r#   r$   r&   Z   sb    

	

	










+


	
$
>r&   )*c                 C   s"   t  }|jt| ||||d dS )z
As it saysshowBoundaryN)_PSRendererdrawr   )drawingZcanvasr   r   r  r    r#   r#   r$   r    s   r  c                 C   s<   g }|j }tdt| dD ]}|| | | |d  f q|S )zo
    given a list of coordinates [x0, y0, x1, y1....]
    produce a list of points [(x0,y0), (y1,y0),....]
    r   r)   r.   )r   ranger   )r  Pr   r   r#   r#   r$   _pointsFromList  s
   r  c                   @   s   e Zd ZdZdd Zdddddd	d
dZdd Zdd Zdd Zdd Z	dd Z
dd Zdd Zdd Zd#ddZdd  Zd!d" ZdS )$r  zThis draws onto a EPS document.  It needs to be a class
    rather than a function, as some EPS-specific state tracking is
    needed outside of the state info in the SVG model.c                 C   s   | j d|  | j j}t|tr|js| j   t|}| j	| | 
|i  | | | j }t|tr;|js@| j   | j d|  || j _| D ]\}}|| jv rct| j | j| | qPdS )zEThis is the recursive method called for each node
        in the treezbegin node %rzend node %rN)_canvasrM   r?   rw   Path
isClipPathrn   r   _trackerpushapplyStateChangesZdrawNodeDispatcherr2   rp   items	_restoressetattr)rH   Znoder   ZdeltasZrDeltaskrt   r#   r#   r$   drawNode  s$   




z_PSRenderer.drawNoder8   r:   r=   r>   r9   r;   r<   )r-   strokeWidthstrokeLineCapstrokeLineJoin	fillColorr+   r,   c                 C   sx   |j |j  krdkr#n n| j|j|j|j|j |j|j  d S | j|j|j|j|j |j|j |j |j d S )Nr   )	r   r   r  r   r   r   r/   r0   r   )rH   r   r#   r#   r$   drawRect  s   z_PSRenderer.drawRectc                 C   s*   | j jr| j |j|j|j|j d S d S r   )r  r8   r   rR   rS   r   r   )rH   r   r#   r#   r$   drawLine
  s   z_PSRenderer.drawLinec                 C   s   | j |j|j|j d S r   )r  r   r   r   r   )rH   r   r#   r#   r$   
drawCircle     z_PSRenderer.drawCirclec              	   C   s   |  \}}}|dks|d u rD|dks|d u rD|jsD|j}|j}|j}|j}|j}	|| }
| jj||	 || ||	 || ||
dd d S |	 }t
|trT| | d S | | d S )Nr   r.   )r   )Z
_xtraRadiiZannularstartangledegreesendangledegreescenterxcenteryradiusr  r   Z	asPolygonrw   r  drawPathdrawPolygon)rH   ZwedgeZyradiusZradius1Zyradius1r0  r1  r2  r3  r4  r   r  r#   r#   r$   	drawWedge  s   &

z_PSRenderer.drawWedgec                 C   s"   | j jr| j t|j d S d S r   )r  r8   r   r  pointsrH   r   r#   r#   r$   drawPolyLine#  s   z_PSRenderer.drawPolyLinec                 C   sF   |j |j }|j |j }|j|j }|j|j }| j|||| d S r   )r   r   r   r   r  r   )rH   r   rR   r   rS   r   r#   r#   r$   drawEllipse'  s
   z_PSRenderer.drawEllipsec                 C   s   | j jt|jdd d S )Nr.   )r   )r  r   r  r8  r9  r#   r#   r$   r6  /  r/  z_PSRenderer.drawPolygonc              	   C   s   t |dd}| jjs|rl| j }|d |j|j|jf\}}}}|dvr`|d |d }}	t|||	}
|dkr<||
8 }n$|dkrG||
d	 8 }n|d
krX|t	|||
||	dd8 }nt
dt| | jj||||d d S d S )Nr   r   Z
textAnchor)r   Z	inheritedr+   r,   r   r   r)   r   Zwinansi)encodingzbad value for text_anchor r   )getattrr  r9   r   ZgetStater   r   r   r   r   rP   r}   r   )rH   Z	stringObjr   Sr   r   r   r   rq   r,   r   r#   r#   r$   r   2  s    

z_PSRenderer.drawStringNc                    sB  ddl m  | jjjjjftdd} fdd}d u r,tdjj	d u}j
d u}j}fdd	}fd
d	}	fdd	}
|dkr]|  ||||d d S |dkr|rq|dd ||||d d S |su|r|  ||d|d d S d S |r|ddr|  d S |s|r|  ||d|d d S d S )Nr   )_renderPath	autocloser   c                     s    fi | S r   r#   kwds)r?  	drawFuncspathr#   r$   rPI  s   z _PSRenderer.drawPath.<locals>.rPr   c                     s    j g fdi| S )Nr   r   rA  r"   r   r#   r$   <lambda>P  s    z&_PSRenderer.drawPath.<locals>.<lambda>c                      s    j g ddS )Nr   )r   r   rF  r#   rG  r#   r$   rH  Q  s    c                      s    j g ddS )Nr   )r   rF  r#   )r"   r#   r$   rH  R  s    Zsvg)r   r   r   ZpdfT)Z
forceClose)Z	countOnly)reportlab.graphics.shapesr?  r  r   r   r   r   r=  rG   r9   r8   r  )rH   rD  r   r@  rE  r   r   r   ZfasZpathFillZ
pathStroker#   )r?  r"   rC  r   rD  r$   r5  D  s<   



z_PSRenderer.drawPathc              
   C   s\  |  D ]\}}|dkr$| j|d |d |d |d |d |d  q|dkr/| j| q|d	kr:| j| q|d
krE| j| q|dkrP| j| q|dkr|rt|tt	frut
|dkrut|d t	tfru|d }|d }nd}| j|| q| j  q|dkr| j| q|dv r|d| jj}|d| jj}| j|| qdS )z\This takes a set of states, and outputs the operators
        needed to set those propertiesr   r   r.   r)   r   r   r   r-   r(  r)  r*  ZstrokeDashArrayr+  )r,   r+   r+   r,   N)r#  r  r   rB   rE   rC   rD   rw   r{   rz   r   r   r   getr;   r<   rA   )rH   ZdeltaZnewStatekeyvaluer~   ZfontnameZfontsizer#   r#   r$   r"  d  s:   ,
z_PSRenderer.applyStateChangesc                 C   s8   ddl m} ||j}| j|j|j|j|j|j	 d S )Nr   )ImageReader)
ri   rM  rD  r  rT   Z_imager   r   r/   r0   )rH   rQ   rM  Zimr#   r#   r$   rT     s   
"z_PSRenderer.drawImager   )r  r  r  __doc__r'  r$  r,  r-  r.  r7  r:  r;  r6  r   r5  r"  rT   r#   r#   r#   r$   r    s$    
 /r  c                 K   s8   t | } t| j| jf}t| |dd|d || d S )Nr   r  )r   r&   r/   r0   r  rk   )r   fnr  Zkwdr"   r#   r#   r$   
drawToFile  s   rP  c                 C   s   t  }t| ||d | S )z=Returns a PS as a string in memory, without touching the diskr  )r   rP  r
  )r   r  r   r#   r#   r$   drawToString  s   rQ  epsoutFc              
   C   s  ddl m} ddlm} |jd d  }g d|jd d < zhdd l}|j| s,||  g }t	|D ]}|dd dkrQt
||}| }	t
|dd}
||	|
f q2d}|D ]$\}}
| |j d	|  }t|| |sn|d
krvtdt|  |d7 }qVW ||jd d < d S ||jd d < w )Nr   )
testshapes)verbose)zTimes-Romanz
Times-BoldzTimes-ItaliczTimes-BoldItalicZCourierr   Z
getDrawingrN  r   zrenderPS_%d.epsr)   zrenderPS test saved %sr.   )Zreportlab.graphicsrS  Zreportlab.rl_configrT  Z_FONTSosrD  isdirmkdirdirr=  r   seprP  printr   )ZoutDirshoutrS  rT  ZOLDFONTSrU  Zdrawingsfuncnamefuncr  Z	docstringr   r   filenamer#   r#   r$   test  s0   



"r_  __main__r.   T)r[  )rR  F)0__version__rN  r   ior   r   Zreportlab.pdfbase.pdfmetricsr   r   r   ri   r   r   r	   r
   r   Zreportlab.lib.rl_accelr   Zreportlab.graphics.renderbaser   r   r   rI  r   Z	reportlabr   Zreportlab.pdfgen.canvasr   r   r  r"   ordchrr%   r^   r&   r  r  r  r  rP  rQ  r_  r  sysr   argvZoutdirr#   r#   r#   r$   <module>   sT   /    e D
