o
    l^Uf%                     @   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rVddlZeejdd  dS 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      |    d S N)_zeroself r   <lib/python3.10/site-packages/fontTools/pens/statisticsPen.py__init__      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r'td}n| j||  }tdt	d|}t |dkr>|nd| _
| jdkrL| j| j ntd}t |dkr[|| _d S d| _d S )Nr   Z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._updater   )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      | j t|  d S r   r2   appendcomplexr   ptr   r   r   _moveTok      zStatisticsControlPen._moveToc                 C   r3   r   r4   r7   r   r   r   _lineTon   r:   zStatisticsControlPen._lineToc                 C   s"   ||fD ]
}| j t|  qd S r   r4   )r   pt1pt2r8   r   r   r   _qCurveToOneq   s   z!StatisticsControlPen._qCurveToOnec                 C   s$   |||fD ]
}| j t|  qd S r   r4   )r   r<   r=   Zpt3r8   r   r   r   _curveToOneu   s   z StatisticsControlPen._curveToOnec                 C   r   r   )r$   r   r   r   r   r+   y   r   zStatisticsControlPen._closePathc                 C   s   |   }|| jkrtdd S )Nz.Glyph statistics not defined on open contours.)Z_getCurrentPointZ_startPointr   )r   p0r   r   r   _endPath|   s   
zStatisticsControlPen._endPathc           	      C   s.  | j }t|}tdd t||dd  |d d  D d | _t|}|j|  | _}|j|  | _}|dkrt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@   Zp1r   r   r   	<genexpr>   s
    
z/StatisticsControlPen._update.<locals>.<genexpr>r      c                 s       | ]	}|j |j  V  qd S r   )rC   rE   pr   r   r   rF          c                 s   rH   r   )rD   rI   r   r   r   rF      rK   c                 s   s    | ]	}|j |j V  qd S r   rB   rI   r   r   r   rF      rK   r   )r2   lensumzipr   rC   r   rD   r   r   r   r   r
   r$   )	r   ZnodesnZsumNodesr   r   r   r   r   r   r   r   r$      s>   





zStatisticsControlPen._updater   )r%   r&   r'   r1   r   r9   r;   r>   r?   r+   rA   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 ]_}| | }|r&t| d}nt| d}|||d| }|| t|j}|j	}||7 }||j| 7 }|	|7 }	|
|j
7 }
||j
| 7 }|r_qt  td| dD ]}td|t||f  qiq|st  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/   r0   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.transformPenrQ   ZfontTools.misc.transformrR   r	   r   Zdrawr    r   widthr   printgetattrrL   r   r   )r)   ZupemglyphsquietrP   rQ   rR   Zwght_sumZwght_sum_perceptualZwdth_sumZslnt_sumZslnt_sum_perceptualZ
glyph_nameZglyphZpenZtransformerr   rS   itemr   Zslant_perceptualr   r   r   _test   sP   




rY   c                 C   sP  | du 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ur`t|jnd}i }|j	
 D ]}|
d}	|	d  }
t|	d }|||
< qid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helprV   z
glyph-namezGlyph names.*)r\   r]   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.)actionr]   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.)r\   defaultr]   =)TTFont)
fontNumber)locationhead)rW   rP   )sysargvargparseArgumentParseradd_argument
parse_argsrV   yintZ
variationssplitstripZfontTools.ttLibre   r[   ZgetGlyphOrderrY   ZgetGlyphSetZ
unitsPerEmrW   rP   )argsri   rk   parseroptionsrV   rf   rg   Ztag_vZfieldstagvre   r[   r   r   r   main   sd   
	



rx   __main__Nr   )F)r1   Zmathr   r   r   ZfontTools.pens.basePenr   r   ZfontTools.pens.momentsPenr   __all__r
   r   r	   rY   rx   r%   ri   rj   r   r   r   r   <module>   s    ,&PBA