o
    hP&                     @   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   s   |    d S N)_zeroself r   p/var/www/html/construction_image-detection-poc/venv/lib/python3.10/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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   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;   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   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).0rA   p1r   r   r   	<genexpr>   s
    
z/StatisticsControlPen._update.<locals>.<genexpr>r      c                 s       | ]	}|j |j  V  qd S r   )rD   rF   pr   r   r   rH          c                 s   rJ   r   )rE   rK   r   r   r   rH      rM   c                 s   s    | ]	}|j |j V  qd S r   rC   rK   r   r   r   rH      rM   r   )r1   lensumzipr   rD   r   rE   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&   r0   r   r7   r9   r<   r>   r*   rB   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.   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)fontTools.pens.transformPenrU   fontTools.misc.transformrV   r	   r   drawr   r   widthr   printgetattrrN   r   r   )r(   upemglyphsquietrT   rU   rV   wght_sumwght_sum_perceptualwdth_sumslnt_sumslnt_sum_perceptual
glyph_nameglyphpentransformerr   rZ   itemr   slant_perceptualr   r   r   _test   sP   




rk   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helpr^   z
glyph-namezGlyph names.*)rn   ro   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.)actionro   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.)rn   defaultro   =)TTFont)
fontNumber)locationhead)r_   rT   )sysargvargparseArgumentParseradd_argument
parse_argsr^   yint
variationssplitstripfontTools.ttLibrw   rm   getGlyphOrderrk   getGlyphSet
unitsPerEmr_   rT   )argsr{   r}   parseroptionsr^   rx   ry   tag_vfieldstagvrw   rm   r   r   r   main   sd   
	



r   __main__Nr   )F)r0   mathr   r   r   fontTools.pens.basePenr   r   fontTools.pens.momentsPenr   __all__r
   r   r	   rk   r   r$   r{   r|   r   r   r   r   <module>   s    ,&UBA