U
    Dvf%                     @   s   d Z ddlmZmZmZ ddlmZmZ ddlm	Z	 ddgZ
G dd dZG d	d dee	ZG d
d deeZdddddZdd ZedkrddlZeejdd  dS )z~Pen calculating area, center of mass, variance and standard-deviation,
covariance and correlation, and slant, of glyph shapes.    )sqrtdegreesatan)BasePenOpenContourError)
MomentsPenStatisticsPenStatisticsControlPenc                   @   s$   e Zd Zdd Zdd Zdd ZdS )StatisticsBasec                 C   s   |    d S N)_zeroself r   @/tmp/pip-unpacked-wheel-qlge9rch/fontTools/pens/statisticsPen.py__init__   s    zStatisticsBase.__init__c                 C   s@   d| _ d| _d| _d| _d| _d| _d| _d| _d| _d| _	d S )Nr   )
areameanXmeanY	varianceX	varianceYstddevXstddevY
covariancecorrelationslantr   r   r   r   r      s    zStatisticsBase._zeroc                 C   s   t | j| _t | j| _t| j | _}t| j | _}|| dkrNtd}n| j||  }tdt	d|}t |dkr||nd| _
| jdkr| j| j ntd}t |dkr|nd| _d S )Nr   NaN   gMbP?)absr   r   r   r   r   floatr   maxminr   r   )r   r   r   r   r   r   r   r   _update   s    
zStatisticsBase._updateN)__name__
__module____qualname__r   r   r#   r   r   r   r   r
      s   r
   c                   @   s*   e Zd ZdZd	ddZdd Zdd ZdS )
r   a:  Pen calculating area, center of mass, variance and
    standard-deviation, covariance and correlation, and slant,
    of glyph shapes.

    Note that if the glyph shape is self-intersecting, the values
    are not correct (but well-defined). Moreover, area will be
    negative if contour directions are clockwise.Nc                 C   s   t j| |d t|  d S )Nglyphset)r   r   r
   r   r(   r   r   r   r   @   s    zStatisticsPen.__init__c                 C   s   t |  |   d S r   )r   
_closePathr#   r   r   r   r   r*   D   s    
zStatisticsPen._closePathc                 C   s   | j }|s|   d S | j|  | _}| j|  | _}| j| ||  | _| j| ||  | _	| j
| ||  | _t|  d S r   )r   r   momentXr   momentYr   momentXXr   momentYYr   momentXYr   r
   r#   )r   r   r   r   r   r   r   r#   H   s    zStatisticsPen._update)N)r$   r%   r&   __doc__r   r*   r#   r   r   r   r   r   7   s   
c                   @   sR   e Zd Z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d ZdS )r	   aZ  Pen calculating area, center of mass, variance and
    standard-deviation, covariance and correlation, and slant,
    of glyph shapes, using the control polygon only.

    Note that if the glyph shape is self-intersecting, the values
    are not correct (but well-defined). Moreover, area will be
    negative if contour directions are clockwise.Nc                 C   s    t | | t|  g | _d S r   )r   r   r
   _nodesr)   r   r   r   r   f   s    
zStatisticsControlPen.__init__c                 C   s   | j t|  d S r   r1   appendcomplexr   ptr   r   r   _moveTok   s    zStatisticsControlPen._moveToc                 C   s   | j t|  d S r   r2   r5   r   r   r   _lineTon   s    zStatisticsControlPen._lineToc                 C   s"   ||fD ]}| j t|  qd S r   r2   )r   pt1pt2r6   r   r   r   _qCurveToOneq   s    z!StatisticsControlPen._qCurveToOnec                 C   s$   |||fD ]}| j t|  q
d S r   r2   )r   r9   r:   Zpt3r6   r   r   r   _curveToOneu   s    z StatisticsControlPen._curveToOnec                 C   s   |    d S r   )r#   r   r   r   r   r*   y   s    zStatisticsControlPen._closePathc                 C   s   |   }|| jkrtdd S )Nz.Glyph statistics not defined on open contours.)Z_getCurrentPointZ!_StatisticsControlPen__startPointr   )r   p0r   r   r   _endPath|   s    
zStatisticsControlPen._endPathc           	      C   s0  | j }t|}tdd t||dd  |d d  D d | _t|}|j|  | _}|j|  | _}|dkrtdd |D |j|j |  |d   | _	}tdd |D |j|j |  |d   | _
}tdd |D |j|j |  |d   | _}nd | _	}d | _
}d | _}t|  d S )	Nc                 s   s*   | ]"\}}|j |j |j |j  V  qd S r   realimag).0r=   p1r   r   r   	<genexpr>   s   z/StatisticsControlPen._update.<locals>.<genexpr>r      c                 s   s   | ]}|j |j  V  qd S r   )r@   rB   pr   r   r   rD      s     c                 s   s   | ]}|j |j  V  qd S r   )rA   rF   r   r   r   rD      s     c                 s   s   | ]}|j |j V  qd S r   r?   rF   r   r   r   rD      s     r   )r1   lensumzipr   r@   r   rA   r   r   r   r   r
   r#   )	r   ZnodesnZsumNodesr   r   r   r   r   r   r   r   r#      s>    






zStatisticsControlPen._update)N)r$   r%   r&   r0   r   r7   r8   r;   r<   r*   r>   r#   r   r   r   r   r	   ]   s   
F)controlc                C   s  ddl m} ddlm} d}d}d}	d}
d}|D ]}| | }|rLt| d}n
t| d}|||d| }|| t|j}|j	}||7 }||j| 7 }|	|7 }	|
|j
7 }
||j
| 7 }|rq0t  td| dD ]}td|t||f  qq0|st  td	 td
|| |	   td||	   td|	| t|   |
t| }td|  tdtt|   ||	 }td|  tdtt|   d S )Nr   )TransformPen)Scaler'   g      ?zglyph:)r   r+   r,   r-   r.   r/   r   r   r   r   r   r   r   r   r   z%s: %gzfont:z
weight: %gzweight (perceptual): %gz
width:  %gz
slant:  %gzslant angle:  %gzslant (perceptual):  %gzslant (perceptual) angle:  %g)ZfontTools.pens.transformPenrM   ZfontTools.misc.transformrN   r	   r   Zdrawr   r   widthr   printgetattrrH   r   r   )r(   ZupemglyphsquietrL   rM   rN   Zwght_sumZwght_sum_perceptualZwdth_sumZslnt_sumZslnt_sum_perceptualZ
glyph_nameZglyphZpenZtransformerr   rO   itemr   Zslant_perceptualr   r   r   _test   sN    




rU   c                 C   sR  | dkrddl }|jdd } ddl}|jdd d}|jdddd	 |jd
dddd |jdddd	 |jddddd |jddddd |jddddd || }|j}|jdk	rt|jnd}i }|j	
 D ].}|
d}	|	d  }
t|	d }|||
< qdd lm} ||j|d!}|s*| }t|j|d"|d# j||j|jd$ dS )%z.Report font glyph shape geometricsl statisticsNr   r   zfonttools pens.statisticsPen)descriptionfontzfont.ttfz
Font file.)metavarhelprR   z
glyph-namezGlyph names.*)rX   rY   nargsz-yz<number>z1Face index into a collection to open. Zero based.z-cz	--control
store_truez4Use the control-box pen instead of the Green therem.)actionrY   z-qz--quietz!Only report font-wide statistics.z--variationszAXIS=LOC zList of space separated locations. A location consist in the name of a variation axis, followed by '=' and a number. E.g.: wght=700 wdth=80. The default is the location of the base master.)rX   defaultrY   =)TTFont)
fontNumber)locationhead)rS   rL   )sysargvargparseArgumentParseradd_argument
parse_argsrR   yintZ
variationssplitstripZfontTools.ttLibra   rW   ZgetGlyphOrderrU   ZgetGlyphSetZ
unitsPerEmrS   rL   )argsre   rg   parseroptionsrR   rb   rc   Ztag_vfieldstagvra   rW   r   r   r   main   sj       	



ru   __main__Nr   )F)r0   mathr   r   r   ZfontTools.pens.basePenr   r   ZfontTools.pens.momentsPenr   __all__r
   r   r	   rU   ru   r$   re   rf   r   r   r   r   <module>   s   ,&PBA