
    jke%                         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      Z G d	 dee	      Z G d
 dee      ZddddZd Zedk(  rddlZ eej$                  dd        yy)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                       e Zd Zd Zd Zd Zy)StatisticsBasec                 $    | j                          y N)_zeroselfs    >/usr/lib/python3/dist-packages/fontTools/pens/statisticsPen.py__init__zStatisticsBase.__init__   s    

    c                     d| _         d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _	        y )Nr   )
areameanXmeanY	varianceX	varianceYstddevXstddevY
covariancecorrelationslantr   s    r   r   zStatisticsBase._zero   sI    	


r   c                 "   t        | j                        | _        t        | j                        | _        t        | j                        x| _        }t        | j                        x| _        }||z  dk(  rt        d      }n(| j                  ||z  z  }t        dt        d|            }t        |      dkD  r|nd| _
        | j                  dk7  r| j                  | j                  z  n
t        d      }t        |      dkD  r|| _        y d| _        y )Nr   NaN   gMbP?)absr   r   r   r   r   floatr   maxminr   r   )r   r   r   r   r   s        r   _updatezStatisticsBase._update   s     T^^,T^^,!%dnn!55w!%dnn!55w W!,K
 //Ww->?Kb#a"56K*-k*:T*A;q 15!0CDOOdnn,u 	 "%j4/U
Q
r   N)__name__
__module____qualname__r   r   r(    r   r   r   r   
   s    
7r   r   c                   $    e Zd ZdZddZd Zd Zy)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                 \    t        j                  | |       t        j                  |        y )Nglyphset)r   r   r   r   r0   s     r   r   zStatisticsPen.__init__@   s     D84%r   c                 N    t        j                  |        | j                          y r   )r   
_closePathr(   r   s    r   r3   zStatisticsPen._closePathD   s    d#r   c                 `   | j                   }|s| j                          y | j                  |z  x| _        }| j                  |z  x| _        }| j                  |z  ||z  z
  | _        | j                  |z  ||z  z
  | _	        | j                  |z  ||z  z
  | _        t        j                  |        y r   )r   r   momentXr   momentYr   momentXXr   momentYYr   momentXYr   r   r(   )r   r   r   r   s       r   r(   zStatisticsPen._updateH   s    yyJJL "\\D00
U!\\D00
U -=-= --$.>t$r   r   )r)   r*   r+   __doc__r   r3   r(   r,   r   r   r	   r	   6   s    5&%r   c                   B    e Zd ZdZddZd Zd Zd Zd Zd Z	d	 Z
d
 Zy)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                 h    t        j                  | |       t        j                  |        g | _        y r   )r   r   r   _nodesr1   s     r   r   zStatisticsControlPen.__init__g   s'    x(%r   c                 F    | j                   j                  t        |        y r   r=   appendcomplexr   pts     r   _moveTozStatisticsControlPen._moveTol       7B<(r   c                 F    | j                   j                  t        |        y r   r?   rB   s     r   _lineTozStatisticsControlPen._lineToo   rE   r   c                 X    ||fD ]#  }| j                   j                  t        |        % y r   r?   )r   pt1pt2rC   s       r   _qCurveToOnez!StatisticsControlPen._qCurveToOner   s+    * 	-BKKw|,	-r   c                 Z    |||fD ]#  }| j                   j                  t        |        % y r   r?   )r   rI   rJ   pt3rC   s        r   _curveToOnez StatisticsControlPen._curveToOnev   s-    S/ 	-BKKw|,	-r   c                 $    | j                          y r   )r(   r   s    r   r3   zStatisticsControlPen._closePathz   s    r   c                 X    | j                         }|| j                  k7  rt        d      y )Nz.Glyph statistics not defined on open contours.)_getCurrentPoint!_StatisticsControlPen__startPointr   )r   p0s     r   _endPathzStatisticsControlPen._endPath}   s/    ""$""""#STT #r   c           
         | j                   }t        |      }t        d t        ||dd  |d d z         D              dz  | _        t        |      }|j
                  |z  x| _        }|j                  |z  x| _        }|dkD  rt        d |D              |j
                  |j
                  z  |z  z
  |dz
  z  x| _	        }t        d |D              |j                  |j                  z  |z  z
  |dz
  z  x| _
        }t        d |D              |j
                  |j                  z  |z  z
  |dz
  z  x| _        }ndx| _	        }dx| _
        }dx| _        }t        j                  |        y )Nc              3      K   | ]:  \  }}|j                   |j                  z  |j                   |j                  z  z
   < y wr   realimag).0rS   p1s      r   	<genexpr>z/StatisticsControlPen._update.<locals>.<genexpr>   s;      B 277"RWWrww%66s   A Ar#      c              3   N   K   | ]  }|j                   |j                   z    y wr   )rX   rZ   ps     r   r\   z/StatisticsControlPen._update.<locals>.<genexpr>        3AFFQVVO3   #%c              3   N   K   | ]  }|j                   |j                   z    y wr   )rY   r_   s     r   r\   z/StatisticsControlPen._update.<locals>.<genexpr>   ra   rb   c              3   N   K   | ]  }|j                   |j                  z    y wr   rW   r_   s     r   r\   z/StatisticsControlPen._update.<locals>.<genexpr>   ra   rb   r   )r=   lensumzipr   rX   r   rY   r   r   r   r   r   r(   )	r   nodesnsumNodesr   r   r   r   r   s	            r   r(   zStatisticsControlPen._update   s   J  !%qrU2AY)>?  	 		 u:%]]Q..
U%]]Q..
Uq5 3U33==8==0A56Q* DNY
 3U33==8==0A56Q* DNY 3U33==8==0A56Q, DOj
 *+*DNY)**DNY+,,DOjt$r   r   )r)   r*   r+   r:   r   rD   rG   rK   rN   r3   rT   r(   r,   r   r   r
   r
   ]   s0    5
))--U
)%r   F)controlc          
         ddl m} ddlm} d}d}d}	d}
d}|D ]  }| |   }|rt	        |       }nt        |       } || |d|z              }|j                  |       t        |j                        }|j                  }||z  }||j                  |z  z  }|	|z  }	|
|j                  z  }
||j                  |z  z  }|rt                t        d|       dD ]  }t        d|t        ||      fz           |st                t        d	       t        d
||z  |	z  z         t        d||	z  z         t        d|	|z  t        |      z  z         |
t        |      z  }t        d|z         t        dt        t        |             z         ||	z  }t        d|z         t        dt        t        |             z         y )Nr   )TransformPen)Scaler/   g      ?zglyph:)r   r5   r6   r7   r8   r9   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.transformPenrm   fontTools.misc.transformrn   r
   r	   drawr$   r   widthr   printgetattrre   r   r   )r0   upemglyphsquietrk   rm   rn   wght_sumwght_sum_perceptualwdth_sumslnt_sumslnt_sum_perceptual
glyph_nameglyphpentransformerr   rr   itemr   slant_perceptuals                        r   _testr      s   8.HHH (9
$&9C2C"3cDj(9:

;388}Dsxx%//ECIIsyy500h
#
 	9D" (dGC$6778#	9/(9T g	,(T/H4
56	
#':X'E
FG	,(T/CK7
89s6{"E	,
	
U 44
45*X5	
#&6
67	
)WT:J5K-L,L
LMr   c                 ^   | ddl }|j                  dd } ddl}|j                  dd       }|j	                  ddd	       |j	                  d
ddd       |j	                  ddd	       |j	                  dddd       |j	                  dddd       |j	                  dddd       |j                  |       }|j                  }|j                  t        |j                        nd}i }|j                  j                         D ]9  }|j                  d      }	|	d   j                         }
t        |	d         }|||
<   ; dd lm}  ||j                  |!      }|s|j                         }t!        |j#                  |"      |d#   j$                  ||j&                  |j(                  $       y)%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   rk   )sysargvargparseArgumentParseradd_argument
parse_argsrv   yint
variationssplitstripfontTools.ttLibr   r   getGlyphOrderr   getGlyphSet
unitsPerEmrw   rk   )argsr   r   parseroptionsrv   r   r   tag_vfieldstagvr   r   s                 r   mainr      s    |xx|$$&D % F 
F
,^SVW
@  
 C	   i3V   L	   %G^^F#*99#8WYYaJH##))+ S!Qiooq	N	 '',,:6D##%	(+Vmmr   __main__Nr#   )F)r:   mathr   r   r   fontTools.pens.basePenr   r   fontTools.pens.momentsPenr   __all__r   r	   r
   r   r   r)   r   r   r,   r   r   <module>r      s   ; $ $ < 02
3)7 )7X$%NJ $%NN%>7 N%b?N% ?ND>B z!" r   