B
    Sc                 @   sL  d dl mZ d dlmZ d dlmZ d dlZd dlZdZ	ej
ddd\ZZZej
d	d
dZeej
de	d  ddZeej
de	d  ddZeedd dD  Zeej
de	d  d
dZdgZxFede	d D ]4Zed Zedd eeeD d Zee qW edd eD Z[[edd eeD Zedd eeD Zedd eeD Zdd Z G dd de!Z"G dd deZ#ee#dd Z$ee#ed Z%ee#ed Z&ee#ee d Z'ee#ee d Z(ee#ee d Z)ej*dfd!d"Z+e,d#krHe$ Z-e-.d$ e-/d% e-/d& e-0d'd(d) e-/d* e-1  e2e-j3 dS )+    )BasePen)partial)countN   zt x yT)realcFzx:%d   zy:%dc             c   s(   | ] }t jd td |f ddV  qdS )zp:%d[%s]r   T)r   N)spsymbolsn).0w r   5lib/python3.7/site-packages/fontTools/misc/symfont.py	<genexpr>   s    r   Z01zc:%d)r   r   c             c   s"   | ]}t |d   t |  V  qdS )r   N)last)r   jr   r   r   r      s    )r   c             c   s   | ]}t |d d V  qd S )Nr   )tuple)r   itemr   r   r   r      s    c             #   s,   | ]$\ }t  fd dt|D V  qdS )c             3   s.   | ]&\}}|t |  d t   |   V  qdS )r   N)t)r   ir   )r   r   r   r      s    z<genexpr>.<genexpr>N)r   	enumerate)r   Zcoeffsr   )r   r   r      s   c             #   s,   | ]$\} t  fd dtdD V  qdS )c             3   s(   | ]  t  fd dtD V  qdS )c             3   s"   | ]\}}t |   | V  qd S )N)P)r   r   	bernstein)r   r   r   r      s    z<genexpr>.<genexpr>.<genexpr>N)sumr   )r   )
bernsteins)r   r   r      s   z<genexpr>.<genexpr>   N)r   range)r   r   r   )r   r   r      s   c             c   s(   | ] \}}t d d t|D V  qdS )c             s   s   | ]\}}t | | V  qd S )N)C)r   r   r   r   r   r   r   #   s    z<genexpr>.<genexpr>N)r   r   )r   r   r   r   r   r   r   #   s   c             C   sT   t t | t } | t|d t|d i} t | t |d t tddf} | S )Nr   r   )r	   Z	integrateZsympifyysubsxZdiffr   )fZcurveXYr   r   r   green'   s    "r$   c               @   s   e Zd Zdd Zdd ZdS )_BezierFuncsLazyc             C   s   || _ i | _d S )N)_symfuncZ	_bezfuncs)selfZsymfuncr   r   r   __init__0   s    z_BezierFuncsLazy.__init__c             C   sH   dd t |d D }t| jt| }t|ttd}t	||S )Nc             S   s   g | ]}d | qS )zp%dr   )r   dr   r   r   
<listcomp>5   s    z0_BezierFuncsLazy.__missing__.<locals>.<listcomp>r   r   )
r   r$   r&   BezierCurver	   	gcd_termscollectr   r   Zlambdify)r'   r   argsr#   r   r   r   __missing__4   s    z_BezierFuncsLazy.__missing__N)__name__
__module____qualname__r(   r/   r   r   r   r   r%   .   s   r%   c               @   sV   e Zd Zi Zedd ZdddZdd Zdd	 Zd
d Z	dd Z
dd Zdd ZdS )GreenPenc             C   s*   t |}|| jkr t|| j|< | j| S )N)str_BezierFuncsr%   )ZcelffuncZfuncstrr   r   r   _getGreenBezierFuncs>   s    
zGreenPen._getGreenBezierFuncsNc             C   s"   t | | | || _d| _d S )Nr   )r   r(   r7   _funcsvalue)r'   r6   Zglyphsetr   r   r   r(   E   s    zGreenPen.__init__c             C   s
   || _ d S )N)_GreenPen__startPoint)r'   p0r   r   r   _moveToJ   s    zGreenPen._moveToc             C   s"   |   }|| jkr| | j d S )N)_getCurrentPointr:   _lineTo)r'   r;   r   r   r   
_closePathM   s    
zGreenPen._closePathc             C   s   |   }|| jkrtd S )N)r=   r:   NotImplementedError)r'   r;   r   r   r   _endPathR   s    
zGreenPen._endPathc             C   s&   |   }|  j| jd ||7  _d S )Nr   )r=   r9   r8   )r'   p1r;   r   r   r   r>   X   s    zGreenPen._lineToc             C   s(   |   }|  j| jd |||7  _d S )Nr   )r=   r9   r8   )r'   rB   p2r;   r   r   r   _qCurveToOne\   s    zGreenPen._qCurveToOnec             C   s*   |   }|  j| jd ||||7  _d S )Nr   )r=   r9   r8   )r'   rB   rC   Zp3r;   r   r   r   _curveToOne`   s    zGreenPen._curveToOne)N)r0   r1   r2   r5   classmethodr7   r(   r<   r?   rA   r>   rD   rE   r   r   r   r   r3   :   s   
r3   )r6   c       
         s  |d k	rt d|  t d| | f |d x |D ]\}}t d| |d q.W t dd|d xNdD ]D d	d
 t d D  fdd|D }dd |D }fdd|D }tj|ddd t D d\}}t   x |D ]\}}	t d| |d qW  dkrt d|d n. dkr&t d|d n dkr<t d|d x&|D ]\}}	t d||	f |d qBW t |d x6tdd |D |D ]\}}	t d||	f |d qW q`W t d|  |d x*|D ]"\}}t d|t|f |d qW t d|d d S ) Nz"""%s"""a  from fontTools.pens.basePen import BasePen, OpenContourError
try:
	import cython
except ImportError:
	# if cython not installed, use mock module with no-op decorators and types
	from fontTools.misc import cython

if cython.compiled:
	# Yep, I'm compiled.
	COMPILED = True
else:
	# Just a lowly interpreted script.
	COMPILED = False


__all__ = ["%s"]

class %s(BasePen):

	def __init__(self, glyphset=None):
		BasePen.__init__(self, glyphset)
)filez		self.%s = 0a  
	def _moveTo(self, p0):
		self.__startPoint = p0

	def _closePath(self):
		p0 = self._getCurrentPoint()
		if p0 != self.__startPoint:
			self._lineTo(self.__startPoint)

	def _endPath(self):
		p0 = self._getCurrentPoint()
		if p0 != self.__startPoint:
			# Green theorem is not defined on open contours.
			raise OpenContourError(
							"Green theorem is not defined on open contours."
			)
 )endrG   )r   r   r   c             S   s4   i | ],}t d D ]}ttg| | t| | qqS )r   )r   XYr   )r   r   r   r   r   r   
<dictcomp>   s    z!printGreenPen.<locals>.<dictcomp>r   c                s   g | ]\}}t |t  qS r   )r$   r+   )r   namer#   )r   r   r   r*      s    z!printGreenPen.<locals>.<listcomp>c          	   S   s"   g | ]}t |ttd qS )r   )r	   r,   r-   r   r   )r   r#   r   r   r   r*      s    c                s   g | ]}|  qS r   )r!   )r   r#   )r!   r   r   r*      s    Zbasicc             s   s   | ]}t d | V  qdS )zr%dN)r	   ZSymbol)r   r   r   r   r   r      s    z printGreenPen.<locals>.<genexpr>)Zoptimizationsr
   z!	@cython.locals(%s=cython.double)z	@cython.locals(x0=cython.double, y0=cython.double)
	@cython.locals(x1=cython.double, y1=cython.double)
	def _lineTo(self, p1):
		x0,y0 = self._getCurrentPoint()
		x1,y1 = p1
r   z	@cython.locals(x0=cython.double, y0=cython.double)
	@cython.locals(x1=cython.double, y1=cython.double)
	@cython.locals(x2=cython.double, y2=cython.double)
	def _qCurveToOne(self, p1, p2):
		x0,y0 = self._getCurrentPoint()
		x1,y1 = p1
		x2,y2 = p2
r   a=  	@cython.locals(x0=cython.double, y0=cython.double)
	@cython.locals(x1=cython.double, y1=cython.double)
	@cython.locals(x2=cython.double, y2=cython.double)
	@cython.locals(x3=cython.double, y3=cython.double)
	def _curveToOne(self, p1, p2, p3):
		x0,y0 = self._getCurrentPoint()
		x1,y1 = p1
		x2,y2 = p2
		x3,y3 = p3
z			%s = %sc             S   s   g | ]}|d  qS )r   r   )r   r#   r   r   r   r*      s    z		self.%s += %szj
if __name__ == '__main__':
	from fontTools.misc.symfont import x, y, printGreenPen
	printGreenPen('%s', [z		      ('%s', %s),z			     ]))printr   r	   Zcser   zipr4   )
ZpenNameZfuncsrG   Z	docstringrM   r#   ZgreensZdefsZexprsr9   r   )r   r!   r   printGreenPeno   sL    





rP   __main__)d   rR   )rR      )rS   rS   )rS      )i,  i,  )rT   i^  )rS   rR   )4ZfontTools.pens.basePenr   	functoolsr   	itertoolsr   Zsympyr	   sysr   r
   r   r"   r    r   r   rJ   rK   rO   r   r   ZBinomialCoefficientr   r   r   lenthisappendr   ZBernsteinPolynomialr+   ZBezierCurveCr$   dictr%   r3   ZAreaPenZ
MomentXPenZ
MomentYPenZMomentXXPenZMomentYYPenZMomentXYPenstdoutrP   r0   ZpenZmoveToZlineToZcurveToZ	closePathrN   r9   r   r   r   r   <module>   s\   -l




