o
    à’Oj1”  ã                   @   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rØddl,Z,e-e,j.ƒd(krÎe,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$   úa/var/www/html/pharmsmart-cdr-gen/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ÚwbéÿÿÿÿrX   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r€t
|jjƒ}|d|t|ƒf ƒ ||	vr~|	 |¡ |}|  ||||¡ || | |j¡|¡7 }q]||kr¦d | _|  |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 )
z³Draw 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ÚnewpathéZ   é´   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 )zÿDraw 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 ÚtobyteséN   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  z±This 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
ú