o
    e%                     @   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   K/var/www/myenv/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   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   6   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   g   s   

zStatisticsControlPen.__init__c                 C      | j t|  d S r   r3   appendcomplexr   ptr   r   r   _moveTol      zStatisticsControlPen._moveToc                 C   r4   r   r5   r8   r   r   r   _lineToo   r;   zStatisticsControlPen._lineToc                 C   s"   ||fD ]
}| j t|  qd S r   r5   )r   pt1pt2r9   r   r   r   _qCurveToOner   s   z!StatisticsControlPen._qCurveToOnec                 C   s$   |||fD ]
}| j t|  qd S r   r5   )r   r=   r>   pt3r9   r   r   r   _curveToOnev   s   z StatisticsControlPen._curveToOnec                 C   r   r   )r%   r   r   r   r   r,   z   r   zStatisticsControlPen._closePathc                 C   s   |   }|| jkrtdd S )Nz.Glyph statistics not defined on open contours.)_getCurrentPoint!_StatisticsControlPen__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).0rD   p1r   r   r   	<genexpr>   s
    
z/StatisticsControlPen._update.<locals>.<genexpr>r       c                 s       | ]	}|j |j  V  qd S r   )rG   rI   pr   r   r   rK          c                 s   rM   r   )rH   rN   r   r   r   rK      rP   c                 s   s    | ]	}|j |j V  qd S r   rF   rN   r   r   r   rK      rP   r   )r3   lensumzipr   rG   r   rH   r   r   r   r   r
   r%   )	r   nodesnsumNodesr   r   r   r   r   r   r   r   r%      s>   





zStatisticsControlPen._updater   )r&   r'   r(   r2   r   r:   r<   r?   rA   r,   rE   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/   r0   r1   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)fontTools.pens.transformPenrX   fontTools.misc.transformrY   r	   r   drawr!   r   widthr   printgetattrrQ   r   r   )r*   upemglyphsquietrW   rX   rY   wght_sumwght_sum_perceptualwdth_sumslnt_sumslnt_sum_perceptual
glyph_nameglyphpentransformerr   r]   itemr   slant_perceptualr   r   r   _test   sP   




rn   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helpra   z
glyph-namezGlyph names.*)rq   rr   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.)actionrr   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.)rq   defaultrr   =)TTFont)
fontNumber)locationhead)rb   rW   )sysargvargparseArgumentParseradd_argument
parse_argsra   yint
variationssplitstripfontTools.ttLibrz   rp   getGlyphOrderrn   getGlyphSet
unitsPerEmrb   rW   )argsr~   r   parseroptionsra   r{   r|   tag_vfieldstagvrz   rp   r   r   r   main   sd   
	



r   __main__Nr    )F)r2   mathr   r   r   fontTools.pens.basePenr   r   fontTools.pens.momentsPenr   __all__r
   r   r	   rn   r   r&   r~   r   r   r   r   r   <module>   s    ,'QBA