U
    '1e1                     @   s   d 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 ddlmZ G dd deZd	d
 Zdd Zdd ZdddZe e  dde	dddddfddZdS ))setFontpathNumTruncprocessGlyphtext2PathDescription	text2PathRenderPMError    )getFont
unicode2T1)open_and_readisBytesrl_exec   )_baseGFontName_PATH_OP_ARG_COUNT_PATH_OP_NAMES
definePath)exc_infoc                   @   s   e Zd ZdS )r   N)__name__
__module____qualname__ r   r   </tmp/pip-unpacked-wheel-109iniqw/reportlab/graphics/utils.pyr      s   r   c                 C   s   t ttt d d \}}ddlm} |jdkrdd l}|j	|j
|jd}td|||f  dD ]}td|tt||f  qldt| t|||f }|d	7 }t|ttd
 d S )N   r   )	rl_configZfontsz!!!!! %s: %s)ZT1SearchPathZTTFSearchPathz!!!!! rl_config.%s = %szWraise RenderPMError("Error in setFont(%s,%s) missing the T1 files?\nOriginally %s: %s")z
 from None)r   )listmapstrr   Z	reportlabr   verboseospathjoindirname__file__printlistdirreprgetattrr   dictr   )fontNamefontSizes1s2r   r   _coder   r   r   
_errorDump   s    
r.   c              
   C   s   z|  || W n tk
r } zr|jd ds<t|| ddlm} z$t|}|||j	 |j
jt W n   t|| Y nX |  || W 5 d }~X Y nX d S )Nr   zCan't find font!)
makeT1Font)r   
ValueErrorargsendswithr.   _rl_renderPMr/   r   face
findT1FileencodingZvectorr
   )gsr(   r)   er/   fr   r   r   r      s    
r   c                 C   s   t | | krt | S t| dS )N   )intround)nr   r   r   r   -   s     r   Nfreetype	_renderPMc              	      sx  ddl m}m} d k	r}|dkr6|dkr0dndn||krD|ntd|dftfd	d
|D  D ]dkrzdd lW n tk
r   Y qtY nX dd lG fddd ddtddddd f fdd	}t	| d  S dkrtzdd l
}W n tk
r   Y qtY nX dddddtddddd ffdd	}t	|td  S qtfdd}t	||||dS )Nr   )	textPathsrenderPMBackendbackendZ	rlPyCairor?   r@   z
textPaths=z7 should be one of 'backend', 'freetype' or '_renderPM')c                 3   s   | ]}| kr|V  qd S Nr   ).0r,   )tpr   r   	<genexpr>;   s      z(__makeTextPathsCode__.<locals>.<genexpr>c                       sF   e Zd Z j jB  jB Zdd Z fddZdde	dfddZ
d	S )
z)__makeTextPathsCode__.<locals>.FTTextPathc                 S   s
   i | _ d S rD   )faces)selfr   r   r   __init__E   s    z2__makeTextPathsCode__.<locals>.FTTextPath.__init__c                    s~   || j krtt|}|s&td|d|jr@|jj}|}nt|jdd }|s\|j } 	|}||f| j |< | j | S )Nzfont z has not been registeredZpfbFileName)
rH   r   r0   _dynamicFontr4   Z	_ttf_dataBytesIOr&   r5   ZFace)rI   r(   fontZpath_or_streamr4   r?   ior   r   r   H   s    


z1__makeTextPathsCode__.<locals>.FTTextPath.setFontr     c                    s:  |  |\}}||j | | g  g }	 j|dd}
|
rdfddfddnfddfdd fdd	}fd
d} fdd}fdd}|d  }| j}|D ]L}|dkrd|8 q||| |jjj| ||||d |jj	j
 qڈ r6d  S )Ntruncater   c                    s   t |    S rD   r   x__dx__scaler   r   <lambda>e       zF__makeTextPathsCode__.<locals>.FTTextPath._text2Path.<locals>.<lambda>c                    s   t |    S rD   rR   y__dy__rW   r   r   rX   f   rY   c                    s   |    S rD   r   rS   rU   r   r   rX   h   rY   c                    s   |    S rD   r   rZ   r\   r   r   rX   i   rY   c                    s*    rd d| j | jf d S )N	closePathmoveTorT   r[   actxPP_appendxptyptr   r   move_tok   s     zE__makeTextPathsCode__.<locals>.FTTextPath._text2Path.<locals>.move_toc                    s    d| j | jf d S )NlineTora   rb   rg   rh   ri   r   r   line_too   s    zE__makeTextPathsCode__.<locals>.FTTextPath._text2Path.<locals>.line_toc           	         s    r d dd n
| j | jf\}}| j }| j}|j }|j}d||| d d  ||| d d  ||| d  ||| d  ||f dS )zusing the cubic equivalentNcurveTor      ra   )	rc   brd   Zx0Zy0x1y1Zx2y2re   r   r   conic_tor   s    $



zF__makeTextPathsCode__.<locals>.FTTextPath._text2Path.<locals>.conic_toc              	      s>    d| j | j|j |j|j |jf d S )Nrp   ra   )rc   rr   crd   rl   r   r   cubic_to{   s    zF__makeTextPathsCode__.<locals>.FTTextPath._text2Path.<locals>.cubic_tog333333?
)rj   rm   rv   rx   r^   )r   Zunits_per_EMappendpopftLFlagsZ	load_charZglyphoutlineZ	decomposeZmetricsZhoriAdvance)rI   textrT   r[   r(   r)   kwdsr4   rM   SrQ   rj   rm   rv   rx   Z
lineHeightr|   rw   r   )rf   rg   rV   r]   rW   rh   ri   r   
_text2Path[   s<    
	 z4__makeTextPathsCode__.<locals>.FTTextPath._text2PathN)r   r   r   ZFT_LOAD_DEFAULTZFT_LOAD_NO_SCALEZFT_LOAD_NO_BITMAPr|   rJ   r   r   r   r   rN   r   r   
FTTextPathC   s   r   rP   startr   c	                    s  t |}	|	jr |	js td| g j}
|dks`t| ||}|dkrL|| }n|dkr`||d  }|dkrn  }|	jr|
|j| ||||||d n&t| r4z| d} W n t	k
r2 } zf|j
d	d
 \}}t	|j
dd
 d|j
d
 | t|d d| | || | ||d  f f  W 5 d}~X Y nX t| |	g|	j }t|d }t|D ]^\}\}}t|tr~||j}|
|j||||j|||d ||krZ||||7 }qZ|
jS )zfreetype text2PathDescription(text, x=0, y=0, fontName='fontname',
                                    fontSize=1000, font = 'fontName',
                                    anchor='start', truncate=1, pathReverse=0, gs=None)
                =text2PathDescription doesn't support multi byte fonts like %rr   endmiddle       @N)rT   r[   r(   r)   rQ   pathReverseutf8r      %s
%s-->%s<--%s
   r   r   )r   
_multiByterK   r0   extendstringWidthr   r   decodeUnicodeDecodeErrorr1   maxr	   substitutionFontslen	enumerate
isinstancebytesencNamer(   __self__)r~   rT   r[   r(   r)   anchorrQ   r   r7   rM   P_extendtextLenr8   ijFTnm1r9   t)r   r   r   r      s:    
 
b 
z3__makeTextPathsCode__.<locals>.text2PathDescription)r   r   c                 S   s\  g }g }g j }| rHt| dkrH| d d dkrHd| d dd   f|  } | pNdd D  ]}|d }|r8|dkr8|d dkr|d= |r|dd d	 |dd d	  |dd d	< |dd d	< |  |  |dd
 | d d}|rttt|}|D ]4}	|tt	|	  }
||	ft
|||
   |
}qg }g }| | ||dd   qT|jS )Nr   r   rk   )moveToClosedr   ))r   )r`   r   r   r   r   r`   r_   )rz   r   reverseinsertr   r   r   r   r   indextupler   r   )GrQ   r   Orf   ZR_appendgopr   or   r   r   r   r      s8     2
 
z+__makeTextPathsCode__.<locals>.processGlyphc	                    s   t |}	|	jr |	js td| g j}
|dks`t| ||}|dkrL|| }n|dkr`||d  }|dkr~ddlm} |d	d	}t||| |	jr|	| ||D ]}|
 |||d
 qn@t
| rZz| d} W n tk
rX } zf|jdd \}}t|jdd d|jd | t|d d| | || | ||d  f f  W 5 d}~X Y nX |	}t| |	g|	j }t|d	 }t|D ]t\}\}}||krt||j| |}|	|||D ]}|
 |||d
 q||kr||||j|7 }q|
jS )z_renderPM text2PathDescription(text, x=0, y=0, fontName='fontname',
                                    fontSize=1000, font = 'fontName',
                                    anchor='start', truncate=1, pathReverse=0, gs=None)
                r   r   r   r   r   Nr   )gstater   )rQ   r   r   r   r   r   r   )r   r   rK   r0   r   r   r3   r   r   Z_stringPathr   r   r   r1   r   r	   r   r   r   r(   r   r   )r~   rT   r[   r(   r)   r   rQ   r   r7   rM   r   r   r   r   r8   r   r   Zfcr   r   r9   r   )r   r   r   r      sF    


b

)r   r   r   c                     s   t d d S )NzThis installation of reportLab has neither RLPYCAIRO or RLRENDERPM extras installed.
It cannot create paths from text.
Could not create text2PathDescription for using backends from )RuntimeError)r1   r   )TPr   r   r,      s    z __makeTextPathsCode__.<locals>._)r   r   r   r   )r   r   )Zreportlab.rl_configrA   rB   r0   r   r?   ImportErrorrO   r   r'   r3   r   )rF   Z_TPrA   rB   r   r3   r,   r   )r   r   r?   rO   r   rF   r   __makeTextPathsCode__2   sN     
H   #

   *r   rP   r   c	                 K   s.   |	 dt}
t|
| ||||||||d	f|	S )Nr   )rT   r[   r(   r)   r   rQ   r   r7   )r{   r   r   )r~   rT   r[   r(   r)   r   rQ   r   r7   r   Zt2pdr   r   r   r     s        r   )Nr>   )__all__Zreportlab.pdfbase.pdfmetricsr   r	   Zreportlab.lib.utilsr
   r   r   Zshapesr   r   r   r   sysr   	Exceptionr   r.   r   r   r   globalsupdater   r   r   r   r   <module>   s"   
 S   