U
    9g06                     @   s   d Z ddl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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stringWidth)	ShapedStr)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-w2r18j3o/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    
r0   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endswithr0   _rl_renderPMr1   r   face
findT1FileencodingZvectorr   )gsr*   r+   er1   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	rlPyCairorA   rB   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                       sp   e Zd Z j jB  jB Zdd Z fddZdd Z	dd Z
d	d
 Zdd ZdddZddedfddZdS )z)__makeTextPathsCode__.<locals>.FTTextPathc                 S   s
   i | _ d S rF   )faces)selfr   r   r   __init__F   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)
rJ   r   r2   _dynamicFontr6   Z	_ttf_dataBytesIOr(   r7   ZFace)rK   r*   fontZpath_or_streamr6   rA   ior   r   r   I   s    


z1__makeTextPathsCode__.<locals>.FTTextPath.setFontc                 S   s4   | j r| d | d| |j| |jf d S )N	closePathmoveTo)PP_appendxptxyptyrK   actxr   r   r   move_to\   s     
z1__makeTextPathsCode__.<locals>.FTTextPath.move_toc                 S   s$   |  d| |j| |jf d S )NlineTorV   rW   rX   rY   rZ   r[   r   r   r   line_to`   s    z1__makeTextPathsCode__.<locals>.FTTextPath.line_toc           
   	   S   s   | j r| j 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      )rU   rX   rZ   rW   rY   rV   )
rK   r\   br]   Zx0Zy0x1y1x2y2r   r   r   conic_toc   s    (z2__makeTextPathsCode__.<locals>.FTTextPath.conic_toc                 S   sL   |  d| |j| |j| |j| |j| |j| |jf d S )Nrd   r`   )rK   r\   rf   cr]   r   r   r   cubic_tol   s    z2__makeTextPathsCode__.<locals>.FTTextPath.cubic_toNc                 S   s   | j d d S )NrR   )rU   append)rK   r]   r   r   r   
close_patho   s    z4__makeTextPathsCode__.<locals>.FTTextPath.close_pathr     c                    s  |  |\}}||j |  | g | _| jj| _|dd}	|	rj fdd| _fdd| _n  fdd| _fdd| _|d  }
| j}t	|t
r|j}|jd	 }|jj}nd }t|D ]\}}|d
krd |
8 q|r2|| }|j| }|j| } |7  |7 ||t| | n||| |jjj| | j| j| j| jd |rt |8  |8  |r|j| n|jjj7  q| jr| d | jS )Ntruncater   c                    s   t |    S rF   r   rX   __dx__scaler   r   <lambda>{       zF__makeTextPathsCode__.<locals>.FTTextPath._text2Path.<locals>.<lambda>c                    s   t |    S rF   rr   rZ   __dy__rv   r   r   rw   |   rx   c                    s   |    S rF   r   rs   rt   r   r   rw   ~   rx   c                    s   |    S rF   r   ry   rz   r   r   rw      rx   g333333?rp   
)r^   ra   rk   rm   rR   )r   Zunits_per_EMrU   rn   rV   poprW   rY   ftLFlags
isinstancer   Z__shapeData__r6   ZcharToGlyph	enumerateZx_offsetZy_offsetZ
load_glyphordZ	load_charZglyphoutlineZ	decomposer^   ra   rk   rm   Z	x_advanceZmetricsZhoriAdvance)rK   textrX   rZ   r*   r+   kwdsr6   rO   rq   Z
lineHeightr~   ZsdataZdscaleZfontC2Girl   sdZ
sdx_offsetZ
sdy_offsetr   )ru   r{   rv   r   
_text2Pathr   sP    






   
z4__makeTextPathsCode__.<locals>.FTTextPath._text2Path)N)r   r   r   ZFT_LOAD_DEFAULTZFT_LOAD_NO_SCALEZFT_LOAD_NO_BITMAPr~   rL   r   r^   ra   rk   rm   ro   r   r   r   rP   r   r   
FTTextPathD   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)rX   rZ   r*   r+   rq   pathReverseutf8r      %s
%s-->%s<--%s
   r   r   )r   
_multiByterM   r2   extendr
   r   r   decodeUnicodeDecodeErrorr3   maxr	   substitutionFontslenr   r   bytesencNamer*   __self__)r   rX   rZ   r*   r+   anchorrq   r   r9   rO   P_extendtextLenr:   r   jFTnm1r;   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   r_   )moveToClosedr   ))r   )rT   r   r   r   r   rT   rS   )rn   r   reverseinsertr   r   r   r   r   indextupler   r   )Grq   r   OrU   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   rM   r2   r   r
   r5   r   r   Z_stringPathr   r   r   r3   r   r	   r   r   r   r*   r   r   )r   rX   rZ   r*   r+   r   rq   r   r9   rO   r   r   r   r   r:   r   r   Zfcr   r   r;   r   )r   r   r   r      sF    


b

)r   r   r   c                     s   t d d S )NzThis installation of reportLab has neither PYCAIRO or RENDERPM extras installed.
It cannot create paths from text.
Could not create text2PathDescription for using backends from )RuntimeError)r3   r   )TPr   r   r.     s    z __makeTextPathsCode__.<locals>._)r   r   r   r   )r   r   )Zreportlab.rl_configrC   rD   r2   r   rA   ImportErrorrQ   r   r)   r5   r   )rH   Z_TPrC   rD   r   r5   r.   r   )r   r   rA   rQ   r   rH   r   __makeTextPathsCode__3   sN     
[   #

   *r   rp   r   c	                 K   s.   |	 dt}
t|
| ||||||||d	f|	S )Nr   )rX   rZ   r*   r+   r   rq   r   r9   )r}   r   r   )r   rX   rZ   r*   r+   r   rq   r   r9   r   Zt2pdr   r   r   r     s        r   )Nr@   )__all__Zreportlab.pdfbase.pdfmetricsr   r	   r
   Zreportlab.pdfbase.ttfontsr   Zreportlab.lib.utilsr   r   r   Zshapesr   r   r   r   sysr   	Exceptionr   r0   r   r   r   globalsupdater   r   r   r   r   <module>   s$   
 f   