a
    ZXhP&                     @   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   a/var/www/viveiro_mudafortebrasil/venv/lib/python3.9/site-packages/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_startPointr   ptr   r   r   _moveTok   s    zStatisticsControlPen._moveToc                 C   s   | j t|  d S r   r1   r2   r3   r5   r   r   r   _lineToo   s    zStatisticsControlPen._lineToc                 C   s"   ||fD ]}| j t|  qd S r   r8   )r   pt1pt2r6   r   r   r   _qCurveToOner   s    z!StatisticsControlPen._qCurveToOnec                 C   s$   |||fD ]}| j t|  q
d S r   r8   )r   r:   r;   Zpt3r6   r   r   r   _curveToOnev   s    z StatisticsControlPen._curveToOnec                 C   s*   |   }|| jkr| | j |   d S r   )_getCurrentPointr4   r9   r#   r   p0r   r   r   r*   z   s    
zStatisticsControlPen._closePathc                 C   s&   |   }|| jkrtd|   d S )Nz.Glyph statistics not defined on open contours.)r>   r4   r   r#   r?   r   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   )rC   rE   pr   r   r   rG          c                 s   s   | ]}|j |j  V  qd S r   )rD   rI   r   r   r   rG      rK   c                 s   s   | ]}|j |j V  qd S r   rB   rI   r   r   r   rG      rK   r   )r1   lensumzipr   rC   r   rD   r   r   r   r   r
   r#   )	r   nodesnZsumNodesr   r   r   r   r   r   r   r   r#      s>    






zStatisticsControlPen._update)N)r$   r%   r&   r0   r   r7   r9   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 ]}| | }|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.transformPenrR   ZfontTools.misc.transformrS   r	   r   Zdrawr   r   widthr   printgetattrrL   r   r   )r(   ZupemglyphsquietrQ   rR   rS   Zwght_sumZwght_sum_perceptualZwdth_sumZslnt_sumZslnt_sum_perceptualZ
glyph_nameZglyphZpenZtransformerr   rT   itemr   Zslant_perceptualr   r   r   _test   sN    




rZ   c                 C   sR  | 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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helprW   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)rX   rQ   )sysargvargparseArgumentParseradd_argument
parse_argsrW   yintZ
variationssplitstripZfontTools.ttLibrf   r\   ZgetGlyphOrderrZ   ZgetGlyphSetZ
unitsPerEmrX   rQ   )argsrj   rl   parseroptionsrW   rg   rh   Ztag_vfieldstagvrf   r\   r   r   r   main   sd    	



rz   __main__Nr   )F)r0   mathr   r   r   ZfontTools.pens.basePenr   r   ZfontTools.pens.momentsPenr   __all__r
   r   r	   rZ   rz   r$   rj   rk   r   r   r   r   <module>   s   ,&UBA