U
    '1e1                     @   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 ]ZZedk sedkrde ee< qeedededfkrde e ee< qe eee< q[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 ),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 ]8}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#   ?/tmp/pip-unpacked-wheel-109iniqw/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
dnd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dod'd(Zd)d* Zd+d, Zdpd-d.Zdqd/d0Zdrd2d3Zdsd5d6Zdtd8d9Zdud:d;Zdvd=d>Zdwd@dAZdBdC ZdDdE Z dxdGdHZ!dIdJ Z"dydKdLZ#dzdMdNZ$dOdP Z%dQdR Z&dSdT Z'dUdV Z(dWdX Z)d{dYdZZ*d|d[d\Z+d]d^ Z,d_d` Z-dadb Z.dcdd Z/d}dedfZ0dgdh Z1d~didjZ2dS )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__[   s4    
 


zPSCanvas.__init__c                 C   s   | j r| d|  d S )N%)r4   r6   )rH   msgr#   r#   r$   commentq   s     zPSCanvas.commentNc                 C   sN   | j dkr| ||||| n,| j dkr<| ||||| ntd| j  d S )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   s   |  d d S )Nshowpager6   rH   r#   r#   r$   clear}   s    zPSCanvas.clearc                 C   sn   | j s
d S g }| j D ].}t|}|js|jdkr|d||f  q|rj|dt | jd| j	| 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r0|   | jdd| j| jf  |   |t	| j
| j ||k	r|  ddlm} ||dd	d
 d S )NwritewbrU   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   rX   r[   r/   r0   r_   r`   r	   r7   r   closereportlab.lib.utilsrc   )rH   f_frc   r#   r#   r$   save   s    
 

	zPSCanvas.savec                 C   s   |  | jf | d d S )Ngsave)r1   _fontCodeLocr6   rW   r#   r#   r$   	saveState   s    zPSCanvas.saveStatec                 C   s   |  d |  \| _d S )Ngrestore)r6   r3   rl   rW   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   s"   | j |kr|| _ | d|  d S )Nz%d setlinecap)r=   r6   rH   vr#   r#   r$   rC      s    
zPSCanvas.setLineCapc                 C   s"   | j |kr|| _ | d|  d S )Nz%d setlinejoin)r>   r6   rq   r#   r#   r$   rD      s    
zPSCanvas.setLineJoinr   c                 C   sn   d}t |ttfr(| d|||f  nBt |ttfrj|dksFtddtt	|}| d|||f  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listAssertionErrorr   mapstr)rH   arrayphaseZpsoperationZ	textarrayr#   r#   r$   setDash   s    zPSCanvas.setDashc                 C   s   || _ | | d S N)r8   setColorrH   colorr#   r#   r$   rB      s    zPSCanvas.setStrokeColorc                 C   s`   | j |kr\|| _ |r\t|dr@| dt|j|j|j|j  n| dt|j|j	|j
  d S )Ncyanz%s setcmykcolorz%s setrgbcolor)r?   rd   r6   r   r   ZmagentaZyellowZblackZredZgreenZbluer   r#   r#   r$   r      s    

"zPSCanvas.setColorc                 C   s   || _ | | d S r   )r9   r   r   r#   r#   r$   setFillColor   s    zPSCanvas.setFillColorc                 C   s
   || _ d S r   )rG   rq   r#   r#   r$   setFillMode   s    zPSCanvas.setFillModec                 C   s"   || j kr|| _ | d|  d S )Nz%s setlinewidth)r:   r6   )rH   r/   r#   r#   r$   rE      s    
zPSCanvas.setLineWidthc                 C   s:   | j |ks| j|kr6t| j| _|| _ || _| d d S )Nr   )r;   r<   r   r5   rl   r6   )rH   rp   r,   leadingr#   r#   r$   rA      s
    zPSCanvas.setFontc                 C   s8   | j d kr4| | j  | dt||t||f  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| Y nX dS )z{
        return a copy of string s with special characters in postscript strings
        escaped with backslashes.
        zcannot escape %sN)r%   rP   ascii)rH   r   r#   r#   r$   _escape   s    
zPSCanvas._escapec           
      C   s  |dkrd S t ||}| |}|dkrJ| | j | d||f  d S |dkph|dkph|dkph|dk}|dkp|dkp|dkp|dk}|dk}|r|r| jd krd	}	nd
}	| | j | d|||	f  | d | jd k	r| | j | d n| | 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   s\  |}| j }| j}| j}	| j}
t|sz|d}W n~ tk
r } z`|jdd \}}t|jd d d|jd ||d | ||| |||d  f f  W 5 d }~X Y nX t||g|j	 D ]r\}}||krt
|jj}|d|t|f  ||	kr
|	| |}| |||| ||||j|7 }q||krXd | _| |jj| 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   rZ   r;   rA   )rH   r^   r   r   r   r   Zfcr6   r,   Z	fontsUsedescapeeijrh   tpsNamer#   r#   r$   _issueT1String  s.    \



zPSCanvas._issueT1Stringleftc                 C   sP  |dk}|dk}|s|rL|dkrzt || j| j}	|dkrD||	8 }n6|dkrZ||	d 8 }n |dkrz|t|||	| j| j8 }t| j}
| j| j st|
jj	}d|t
| jf | j| j< || jkr| j| |d	kr| d
t
||t
|f  d	 }}| j}|
jr| j||||d n| j|
||||d | | |d	krL| d d S )N)r   r)   r   r   )r.   r)   r   r   r   endmiddle       @numericr   r   zgsave %s translate %s rotater   rn   )r   r;   r<   numericXShiftr   r5   rl   r
   r   r   r   r@   r   r6   r?   rY   r   r   r   )rH   r   r   r   Zangletext_anchorr   ZneedFillZ
needStroketextLenr^   r   ZoldColorr#   r#   r$   
drawString+  s6    





zPSCanvas.drawStringr   c                 C   s   | j |||||d d S N)r   r   r   )rH   r   r   textr   r   r#   r#   r$   drawCentredStringI  s    zPSCanvas.drawCentredStringr   c                 C   s   | j |||||d d S r   r   )rH   r   r   r   r   r   r#   r#   r$   drawRightStringL  s    zPSCanvas.drawRightStringc
                 C   s   d}
t ||t ||||||f}| jd krH| | j | |
| d  | jd kr|| | j | |
| |	rpdprd d  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ellipsePath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   sV  || d || d  }}	|| d || d  }
}|  ||||||}tj| d }tj| d }|| }d}| jdkr| | j | | d}| jdkr| d | ||	 | d | jdkr| d | jdkrR| | j ||
t|  |	|t	|   }}|s | | |rH| ||	 | || | d	 | d
 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.   rk   eofillrn   r   r   )
_genArcCodemathpir9   r   r6   r8   lineTocossin)rH   rR   rS   r   r   startAngextent
fromcentercxcyr   r   r   ZstartAngleRadiansZextentRadiansZendAngleRadiansZcodelineAppendedZstartxZstartyr#   r#   r$   r     s6    


 


 
&

zPSCanvas.drawArcc                 C   sn   t || d }t || d }|| d || d  }	}
d}|dkrLd}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td|d }|dd  }g }|j}|dt|  |D ]}|dt|  qF|rh|d | j|||d d S )	Nr)   z"Polygon must have 2 or more pointsr   r.   %s m%s lr   )r   r   )r   ry   r   r   r   )	rH   pr   r   r   startZpolyr   Zpointr#   r#   r$   r     s    zPSCanvas.polygonc                 C   sJ   | j d krF| | j  d}|D ]&}| |t|d t|d f  qd S )Nr   r   r.   )r8   Z	_setColorr6   r   )rH   ZlineListr   r/   r   r   r#   r#   r$   lines  s
    
zPSCanvas.linesc                 C   s   |  dt||  d S )Nr   r6   r   rH   r   r   r#   r#   r$   moveTo  s    zPSCanvas.moveToc                 C   s   |  dt||  d S )Nr   r   r   r#   r#   r$   r     s    zPSCanvas.lineToc              
   C   s    |  dt||||||  d S )Nz%s cr   )rH   rR   rS   r   r   r   r   r#   r#   r$   curveTo  s    zPSCanvas.curveToc                 C   s   |  d d S )Nr   rV   rW   r#   r#   r$   	closePath  s    zPSCanvas.closePathc                 C   sz   t |dkstd| jd krv| | j | |d d |d d  |dd  D ]}| |d |d  qR| d d S )Nr.   z#Polyline must have 1 or more pointsr   r   )r   ry   r8   r   r   r   r6   )rH   r   r   r#   r#   r$   polyLine  s    
zPSCanvas.polyLinec              
   C   sR  g }|j }d}|D ] }|d }t|dd  }|tkr|rZd}|dt|d d   n|dt|d d   |dt|dd    q|tkrd}|d d \}	}
}}}}|| |	|
|||| q|tkr(|rd}|dt|d d   n|dt|d d   |dt|dd    qtd| q|rD|d	 | | d S )
Nr.   r   r   r)   r   r   z
%s curvetozunknown figure operator: r   )	r   rx   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 |r| j| |r|d kr>| j}|sF|rP| d | | j  | |tkrldnd |sz|r| d |r|r| d | | j | d |r| d |r| d | d d S )Nrk   r   r   rn   r   clipr   )r9   r8   r5   extendrG   r6   r   r   )rH   r5   r   r   r   fillModer#   r#   r$   r     s.    

 
 
 

 

zPSCanvas._fillAndStrokec                 C   s   |  dt||  d S )Nz%s translater   r   r#   r#   r$   	translate,  s    zPSCanvas.translatec                 C   s   |  dt||  d S )Nz%s scaler   r   r#   r#   r$   scale/  s    zPSCanvas.scalec              
   C   s    |  dt||||||  d S )Nz[%s] concatr   )rH   r   br"   dr   rh   r#   r#   r$   	transform2  s    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r|jn|j }
| |
}t|}|	d}|dkr| 
| |	d}q| 
d | 
d d S )Nr   RGBrk   %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 datarn   )convertrI   r5   r   rd   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  s8    









zPSCanvas._drawImageLevel1c                 C   s.   t  }t|D ]}|dt|  q| S )zHelper function used by imagesz%02x)r   r   r`   r   getvalue)rH   inputoutputcharr#   r#   r$   r   w  s    zPSCanvas._AsciiHexEncodec                 C   sr  |j dkrd}d}|}n0|j dkr6|d}d}|}n|d}d}d}|j\}	}
|sZ|	}|sb|
}| jdd||f d	||f g |dkr| d
 n|dkr| d | d|	|
|f  |dkr| d |dkr| d | jd|	|
 |
f dddg t|dr|jn|j }| 	|}t
|}|d}|dkrZ| | |d}q8| d | d dS )z"At present we're handling only PILLr   r.   1r   r   rk   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 datarn   N)moder   rI   r5   r   r6   rd   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)   )NN)N)NN)N)r   )r   )r   r   r   )r   r   )r   r   )r   )r.   r.   )r   r   )r   r   r   )r   r.   r.   )NN)r   )r   r.   r.   N)NN)NN)3__name__
__module____qualname__rJ   rM   rT   rX   r_   rj   rm   ro   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   s`   

	

	










+

	
$

>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s2| j   t|}| j	| | 
|i  | | | j }t|trv|js| j   | j d|  || j _| D ]&\}}|| jkrt| j | j| | qdS )zEThis is the recursive method called for each node
        in the treezbegin node %rzend node %rN)_canvasrM   r?   rt   Path
isClipPathrm   r   _trackerpushapplyStateChangesZdrawNodeDispatcherr2   ro   items	_restoressetattr)rH   noder   ZdeltasZrDeltaskrr   r#   r#   r$   drawNode  s     




z_PSRenderer.drawNoder8   r:   r=   r>   r9   r;   r<   )r-   strokeWidthstrokeLineCapstrokeLineJoin	fillColorr+   r,   c                 C   sv   |j |j  krdkrDn n(| j|j|j|j|j |j|j  n.| 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 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  s    z_PSRenderer.drawCirclec              	   C   s   |  \}}}|dks|d kr|dks.|d kr|js|j}|j}|j}|j}|j}	|| }
| jj||	 || ||	 || ||
dd n(|	 }t
|tr| | n
| | d S )Nr   r.   )r   )Z
_xtraRadiiZannularstartangledegreesendangledegreescenterxcenteryradiusr  r   Z	asPolygonrt   r  drawPathdrawPolygon)rH   ZwedgeZyradiusZradius1Zyradius1r-  r.  r/  r0  r1  r   r  r#   r#   r$   	drawWedge  s"    &  
z_PSRenderer.drawWedgec                 C   s   | j jr| j t|j 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  r5  r6  r#   r#   r$   r3  /  s    z_PSRenderer.drawPolygonc              	   C   s   t |dd}| jjs|r| j }|d |j|j|jf\}}}}|dkr|d |d  }}	t|||	}
|dkrx||
8 }nH|dkr||
d	 8 }n2|d
kr|t	|||
||	dd8 }nt
dt| | jj||||d 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   rp   r,   r   r#   r#   r$   r   2  s    

z_PSRenderer.drawStringNc                    s:  ddl m  | jjjjjftdd} fdd}d krXtdjj	d k	}j
d k	}j}fdd	}fd
d	}	fdd	}
|dkr|  ||||d n~|dkr|r|dd ||||d n|s|r|  ||d|d n:|r|ddr|  n |s"|r6|  ||d|d d S )Nr   )_renderPath	autocloser   c                     s    f| 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   r>  r"   r   r#   r$   <lambda>P      z&_PSRenderer.drawPath.<locals>.<lambda>c                      s    j g ddS )Nr   )r   r   rC  r#   rD  r#   r$   rE  Q  rF  c                      s    j g ddS )Nr   )r   rC  r#   )r"   r#   r$   rE  R  rF  svg)r   r   r   ZpdfT)Z
forceClose)Z	countOnly)reportlab.graphics.shapesr<  r  r   r   r   r   r:  rG   r9   r8   r  )rH   rA  r   r=  rB  r   r   r   ZfasZpathFillZ
pathStroker#   )r<  r"   r@  r   rA  r$   r2  D  s8    


z_PSRenderer.drawPathc              
   C   sd  |  D ]T\}}|dkrJ| j|d |d |d |d |d |d  q|dkr`| j| q|d	krv| j| q|d
kr| j| q|dkr| j| q|dkr|rt|tt	frt
|dkrt|d t	tfr|d }|d }nd}| j|| n
| j  q|dkr(| j| q|dk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   rt   rx   rw   r   r~   r   getr;   r<   rA   )rH   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)
rg   rM  rA  r  rT   Z_imager   r   r/   r0   )rH   rQ   rM  Zimr#   r#   r$   rT     s    
z_PSRenderer.drawImage)N)r  r  r  __doc__r%  r!  r*  r+  r,  r4  r7  r8  r3  r   r2  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  rj   )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  }dddddg|jd d < zdd l}|j| s^||  g }t	|D ]>}|dd	 d
krjt
||}| }	t
|dd}
||	|
f qjd}|D ]H\}}
| |j d|  }t|| |s|dkrtdt|  |d7 }qW 5 ||jd d < X d S )Nr   )
testshapes)verbosez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osrA  isdirmkdirdirr:  r   seprP  printr   )ZoutDirshoutrS  rT  ZOLDFONTSrU  Zdrawingsfuncnamefuncr  Z	docstringr   r   filenamer#   r#   r$   test  s.    


 r_  __main__r.   T)r[  )rR  F)0__version__rN  r   ior   r   Zreportlab.pdfbase.pdfmetricsr   r   r   rg   r   r   r	   r
   r   Zreportlab.lib.rl_accelr   Zreportlab.graphics.renderbaser   r   r   rH  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>   sN   /    i D

