o
    vh1                     @   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RaRnc r$   Y/var/www/html/hyperkenya/venv/lib/python3.10/site-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sizerG   	xtraStater$   r$   r%   __init__[   s2   




zPSCanvas.__init__c                 C   s   | j r| d|  d S d S )N%)r5   r7   )rI   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)rG   _drawImageLevel1_drawImageLevel2
ValueError)rI   imagex1y1r0   r1   r$   r$   r%   	drawImaget   s
   

zPSCanvas.drawImagec                 C      |  d d S )Nshowpager7   rI   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 )NWinAnsiEncodingzWinAnsiEncoding /%s /%s REr   r/   )
rA   r   _dynamicFontencNamer   insertPS_WinAnsiEncodingr6   r8   r   )rI   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wbrX   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
)markfilenameXPR3EPSF)creatorcodefiletype)hasattropenr6   r[   r`   r0   r1   rd   re   r	   r8   r   closereportlab.lib.utilsrh   )rI   f_frh   r$   r$   r%   save   s   


	zPSCanvas.savec                 C   s   |  | jf | d d S )Ngsave)r2   _fontCodeLocr7   rZ   r$   r$   r%   	saveState   s   zPSCanvas.saveStatec                 C   s   |  d |  \| _d S )Ngrestore)r7   r4   ru   rZ   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   )rI   r   fontr-   r$   r$   r%   r      s   

zPSCanvas.stringWidthc                 C   &   | j |kr|| _ | d|  d S d S )Nz%d setlinecap)r>   r7   rI   vr$   r$   r%   rD         
zPSCanvas.setLineCapc                 C   rz   )Nz%d setlinejoin)r?   r7   r{   r$   r$   r%   rE      r}   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 phasesetdashz[%s %s] 0 %sr   zphase is a length in user space z
[%s] %s %sN)	
isinstancefloatintr7   tuplelistr   mapstr)rI   arrayphasepsoperation	textarrayr$   r$   r%   setDash   s   zPSCanvas.setDashc                 C      || _ | | d S N)r9   setColorrI   colorr$   r$   r%   rC         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@   rm   r7   r   r   magentayellowblackredgreenbluer   r$   r$   r%   r      s   

$ zPSCanvas.setColorc                 C   r   r   )r:   r   r   r$   r$   r%   setFillColor   r   zPSCanvas.setFillColorc                 C   s
   || _ d S r   )rH   r{   r$   r$   r%   setFillMode   s   
zPSCanvas.setFillModec                 C   s&   || j kr|| _ | d|  d S d S )Nz%s setlinewidth)r;   r7   )rI   r0   r$   r$   r%   rF      r}   zPSCanvas.setLineWidthc                 C   s>   | j |ks
| j|krt| j| _|| _ || _| d d S d S )Nr   )r<   r=   r   r6   ru   r7   )rI   ry   r-   leadingr$   r$   r%   rB      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)r9   r   r7   r   rI   rT   rU   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&   rR   ascii)rI   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   r:   r7   r9   )
rI   xyr   textRenderModexyfillstroke	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)r7   r=   rA   r   r   decodeUnicodeDecodeErrorargsr   substitutionFontsr
   facenamer   r   r   r   r_   r<   rB   )rI   rc   r   r   r   r   fcr7   r-   	fontsUsedescapeeijrq   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   rw   )r   r<   r=   numericXShiftr   r6   ru   r
   r   r   r   rA   r   r7   r@   r^   r   r   r   )rI   r   r   r   angletext_anchorr   needFill
needStroketextLenrc   r   oldColorr$   r$   r%   
drawString+  s:   



zPSCanvas.drawStringr   c                 C      | j |||||d d S N)r   r   r   )rI   r   r   textr   r   r$   r$   r%   drawCentredStringI     zPSCanvas.drawCentredStringr   c                 C   r   r   r   )rI   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   r:   r   r7   r9   )rI   rT   rU   r   r   x3y3x4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)rI   rT   rU   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)
rI   rT   rU   r   r   rxry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   )rI   xc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/   rt   eofillrw   r   r   )
_genArcCodemathpir:   r   r7   r9   lineTocossin)rI   rT   rU   r   r   startAngextent
fromcentercxcyr   r   r   startAngleRadiansextentRadiansendAngleRadianscodelineAppendedstartx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   arcarcn)abs)rI   rT   rU   r   r   r   r   xScale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   )	rI   pr   r   r   startpolyr   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/   )r9   	_setColorr7   r   )rI   lineListr   r0   r   r   r$   r$   r%   lines  s   
$zPSCanvas.linesc                 C      |  dt||  d S )Nr  r7   r   rI   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  )rI   rT   rU   r   r   r   r   r$   r$   r%   curveTo      zPSCanvas.curveToc                 C   rW   )Nr   rY   rZ   r$   r$   r%   	closePath  r\   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   r9   r   r  r   r7   )rI   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   
figureLiner   	figureArcr   figureCurve	TypeErrorr   )rI   partListr   
figureCoder   firstpartr   r   rT   rU   r   r   
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 )Nrt   r   r   rw   r   clipr   )r:   r9   r6   extendrH   r7   r   r   )rI   r6   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  )rI   r   br#   dr   rq   r$   r$   r%   	transform2  r  zPSCanvas.transformc                 C   s   ||| _ | _dS )z1if this is used we're probably in the wrong worldN)r0   r1   )rI   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   RGBrt   %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 datarw   )convertrJ   r6   r*  rm   r7  tostring_AsciiHexEncoder   readr7   )rI   rS   rT   rU   r0   r1   component_depthmyimageimgwidth	imgheightrawimagehex_encoded	outstreamdataliner$   r$   r%   rP   9  s:   










zPSCanvas._drawImageLevel1c                 C   s.   t  }t|D ]}|dt|  q| S )zHelper function used by imagesz%02x)r   r   re   r   getvalue)rI   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/   1r4  r   rt   r5  r6  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 dictionaryrS   r7  r8  r   z> % end of image datarw   N)moder9  rJ   r6   r*  r7   rm   r7  r:  r;  r   r<  )rI   rS   rT   rU   r0   r1   imBitsPerComponentimNumComponentsr>  imwidthimheightrA  rB  rC  rD  r$   r$   r%   rQ   ~  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__rL   rO   rV   r[   rd   rs   rv   rx   r   rD   rE   r   rC   r   r   r   rF   rB   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-  r0  r3  rP   r;  rQ   r$   r$   r$   r%   r'   Z   sb    

	

	










+


	
$
>r'   )*c                 C   s"   t  }|jt| ||||d dS )z
As it saysshowBoundaryN)_PSRendererdrawr   )drawingcanvasr   r   rU  r    r$   r$   r%   rW    s   rW  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   )rI  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 )$rV  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)_canvasrO   r@   r   Path
isClipPathrv   r   _trackerpushapplyStateChangesdrawNodeDispatcherr3   rx   items	_restoressetattr)rI   noder   deltasrDeltaskr|   r$   r$   r%   drawNode  s$   




z_PSRenderer.drawNoder9   r;   r>   r?   r:   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   r0   r1   r   )rI   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]  r9   r   rT   rU   r   r   )rI   r   r$   r$   r%   drawLine
  s   z_PSRenderer.drawLinec                 C   s   | j |j|j|j d S r   )r]  r   r   r  r   )rI   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   )
_xtraRadiiannularstartangledegreesendangledegreescenterxcenteryradiusr]  r   	asPolygonr   r^  drawPathdrawPolygon)rI   wedgeyradiusradius1yradius1rv  rw  rx  ry  rz  r   r[  r$   r$   r%   	drawWedge  s   &

z_PSRenderer.drawWedgec                 C   s"   | j jr| j t|j d S d S r   )r]  r9   r  r\  pointsrI   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   )rI   r   rT   r   rU   r   r$   r$   r%   drawEllipse'  s
   z_PSRenderer.drawEllipsec                 C   s   | j jt|jdd d S )Nr/   )r   )r]  r   r\  r  r  r$   r$   r%   r}  /  rs  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   
textAnchor)r  	inheritedr,   r-   r   r   r*   r   winansi)encodingzbad value for text_anchor r   )getattrr]  r:   r`  getStater   r   r   r   r   rR   r   r   )rI   	stringObjr   Sr   r   r   r   ry   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   r  r#   r+  r$   r%   <lambda>P  s    z&_PSRenderer.drawPath.<locals>.<lambda>c                      s    j g ddS )Nr   )r   r+  r  r$   r  r$   r%   r  Q  s    c                      s    j g ddS )Nr   )r   r  r$   )r#   r$   r%   r  R  s    svg)r   r   r)  pdfT)
forceClose)	countOnly)reportlab.graphics.shapesr  r]  r  r   r  r  r  rH   r:   r9   r_  )rI   r  r+  r  r  r   r   r)  faspathFill
pathStroker$   )r  r#   r  r+  r  r%   r|  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 propertiesr0  r   r/   r*   r   r   r   r.   rl  rm  rn  strokeDashArrayro  )r-   r,   r,   r-   N)rd  r]  r0  rC   rF   rD   rE   r   r   r   r   r   r   getr<   r=   rB   )rI   deltanewStatekeyvaluer   fontnamefontsizer$   r$   r%   rb  d  s:   ,
z_PSRenderer.applyStateChangesc                 C   s8   ddl m} ||j}| j|j|j|j|j|j	 d S )Nr   )ImageReader)
rp   r  r  r]  rV   _imager   r   r0   r1   )rI   rS   r  imr$   r$   r%   rV     s   
"z_PSRenderer.drawImager   )rP  rQ  rR  __doc__rk  re  rp  rq  rr  r  r  r  r}  r   r|  rb  rV   r$   r$   r$   r%   rV    s$    
 /rV  c                 K   s8   t | } t| j| jf}t| |dd|d || d S )Nr   rT  )r   r'   r0   r1   rW  rs   )r/  fnrU  kwdr#   r$   r$   r%   
drawToFile  s   r  c                 C   s   t  }t| ||d | S )z=Returns a PS as a string in memory, without touching the diskrT  )r   r  rE  )r/  rU  r   r$   r$   r%   drawToString  s   r  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-BoldItalicCourierr   
getDrawingr  r   zrenderPS_%d.epsr*   zrenderPS test saved %sr/   )reportlab.graphicsr  reportlab.rl_configr  _FONTSosr  isdirmkdirdirr  r   sepr  printr   )outDirshoutr  r  OLDFONTSr  drawingsfuncnamefuncrX  	docstringr   r/  filenamer$   r$   r%   test  s0   



"r  __main__r/   T)r  )r  F)0__version__r  r   ior   r   reportlab.pdfbase.pdfmetricsr   r   r   rp   r   r   r	   r
   r   reportlab.lib.rl_accelr   reportlab.graphics.renderbaser   r   r   r  r   	reportlabr   reportlab.pdfgen.canvasr   r   rZ  r#   ordchrr&   ra   r'   rU  rW  r\  rV  r  r  r  rP  sysr   argvoutdirr$   r$   r$   r%   <module>   sT   /    e D
