)Ej'dZddlmZmZmZddlmZmZddlm Z ddgZ GddZ Gd de e Z Gd de eZ dd d d ZdZedkrddlZeejdddSdS)z~Pen calculating area, center of mass, variance and standard-deviation, covariance and correlation, and slant, of glyph shapes.)sqrtdegreesatan)BasePenOpenContourError) MomentsPen StatisticsPenStatisticsControlPenc eZdZdZdZdZdS)StatisticsBasec.|dSN)_zeroselfs NC:\PYTHON\MyICR_Suite\python\Lib\site-packages\fontTools/pens/statisticsPen.py__init__zStatisticsBase.__init__ s cd|_d|_d|_d|_d|_d|_d|_d|_d|_d|_ dS)Nr) areameanXmeanY varianceX varianceYstddevXstddevY covariance correlationslantrs rrzStatisticsBase._zerosM      rc t|j|_t|j|_t|jx|_}t|jx|_}||zdkrt d}n+|j||zz }tdtd|}t|dkr|nd|_ |jdkr|j|jz nt d}t|dkr|nd|_ dS)NrNaNgMbP?) absrrrrrfloatrmaxminrr)rrrrrs r_updatezStatisticsBase._updatesT^,,T^,,!%dn!5!55 w!%dn!5!55 w W  ! !,,KK /Ww->?Kb#a"5"566K*-k*:*:T*A*A;;q15!0C0CDOdn , ,u "%jj4//UUQ rN)__name__ __module__ __qualname__rrr(rrr r sA   77777rr c&eZdZdZddZdZdZdS)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.Ncftj||t|dS)Nglyphset)rrr rr0s rrzStatisticsPen.__init__@s2D84444%%%%%rcVtj||dSr)r _closePathr(rs rr3zStatisticsPen._closePathDs$d### rc:|j}|s|dS|j|z x|_}|j|z x|_}|j|z ||zz |_|j|z ||zz |_ |j |z ||zz |_ t |dSr)rrmomentXrmomentYrmomentXXrmomentYYrmomentXYrr r()rrrrs rr(zStatisticsPen._updateHsy  JJLLL F"\D00 U!\D00 U- =- =-$.>t$$$$$rr)r)r*r+__doc__rr3r(r,rrr r 7sP55&&&&%%%%%rcDeZdZdZd dZdZdZdZdZdZ d Z d Z dS) r aZPen 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.Ncrtj||t|g|_dSr)rrr _nodesr1s rrzStatisticsControlPen.__init__fs4x(((%%% rcV|jt|||_dSr)r=appendcomplex _startPointrpts r_moveTozStatisticsControlPen._moveToks* 7B<(((rcH|jt|dSrr=r?r@rBs r_lineTozStatisticsControlPen._lineToos" 7B<(((((rcV||fD]#}|jt|$dSrrF)rpt1pt2rCs r _qCurveToOnez!StatisticsControlPen._qCurveToOners<* - -B K  w| , , , , - -rcX|||fD]#}|jt|$dSrrF)rrIrJpt3rCs r _curveToOnez StatisticsControlPen._curveToOnevs>S/ - -B K  w| , , , , - -rc|}||jkr||j|dSr)_getCurrentPointrArGr(rp0s rr3zStatisticsControlPen._closePathzsG  " " $ $ ! ! ! LL) * * * rc|}||jkrtd|dS)Nz.Glyph statistics not defined on open contours.)rPrArr(rQs r_endPathzStatisticsControlPen._endPathsA  " " $ $ ! ! !"#STT T rc |j}t|}tdt||dd|ddzDdz |_t|}|j|z x|_}|j|z x|_}|dkrtd|D|j|jz|z z |dz z x|_ }td|D|j|jz|z z |dz z x|_ }td|D|j|jz|z z |dz z x|_ }ndx|_ }dx|_ }dx|_ }t |dS)Nc3ZK|]&\}}|j|jz|j|jzz V'dSrrealimag).0rRp1s r z/StatisticsControlPen._update..sQB27"RWrw%66rr#c34K|]}|j|jzVdSr)rXrZps rr\z/StatisticsControlPen._update..*33AFQVO333333rc34K|]}|j|jzVdSr)rYr_s rr\z/StatisticsControlPen._update..rarc34K|]}|j|jzVdSrrWr_s rr\z/StatisticsControlPen._update..rarr)r=lensumziprrXrrYrrrrr r() rnodesnsumNodesrrrrrs rr(zStatisticsControlPen._updates  JJ !%qrrU2A2Y)>??     u::%]Q.. U%]Q.. U q5533U33333=8=0A56Q* DNY 33U33333=8=0A56Q* DNY33U33333=8=0A56Q, DOjj *+ *DNY)* *DNY+, ,DOjt$$$$$rr) r)r*r+r:rrDrGrKrNr3rTr(r,rrr r ]s55 )))------  )%)%)%)%)%rF)controlc ddlm}ddlm}d}d}d} d} d} |D]} || } |rt |}nt |}|||d|z }| |t|j}| j }||z }||j|zz }| |z } | |j z } | |j |zz } |rttd| dD]$}td|t||fz%|sttd td ||z| z ztd || z ztd | |z t|z z| t|z }td |ztdtt| z| | z }td|ztdtt| zdS)Nr) TransformPen)Scaler/g?zglyph:)rr5r6r7r8r9rrrrrrrrrz%s: %gzfont:z weight: %gzweight (perceptual): %gz width: %gz slant: %gzslant angle: %gzslant (perceptual): %gzslant (perceptual) angle: %g)fontTools.pens.transformPenrlfontTools.misc.transformrmr r drawr$rwidthrprintgetattrrdrr)r0upemglyphsquietrjrlrmwght_sumwght_sum_perceptualwdth_sumslnt_sumslnt_sum_perceptual glyph_nameglyphpen transformerrrqitemrslant_perceptuals r_testrsz888888......HHH(9(9 $  3&999CC222C"l3cDj(9(9::  ;38}} Dsx%//ECIsy500     h ###  9 9D" (dGC$6$677 8 8 8 8# 9&   g ,(T/H4 5666 #':X'E FGGG ,(T/CKK7 8999 s6{{ "E ,  U 4 44 4555*X5 #&6 6777 )WT:J5K5K-L-L,L LMMMMMrc|ddl}|jdd}ddl}|dd}|ddd |d d d d |ddd |dddd|dddd|dddd||}|j}|jt|jnd}i}|j D]K}| d} | d } t| d} | || <Ldd l m } | |j|!} |s| }t!| |"| d#j||j|j$dS)%z.Report font glyph shape geometricsl statisticsNrr#zfonttools pens.statisticsPen) descriptionfontzfont.ttfz Font file.)metavarhelpruz glyph-namez Glyph names.*)rrnargsz-yzz1Face index into a collection to open. Zero based.z-cz --control store_truez4Use the control-box pen instead of the Green therem.)actionrz-qz--quietz!Only report font-wide statistics.z --variationszAXIS=LOCzList 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.)rdefaultr=)TTFont) fontNumber)locationhead)rvrj)sysargvargparseArgumentParser add_argument parse_argsruyint variationssplitstripfontTools.ttLibrr getGlyphOrderr getGlyphSet unitsPerEmrvrj)argsrrparseroptionsrurrtag_vfieldstagvrrs rmainrsO | x|OOO  $ $&D%F  FFF ,^SVWWW   @    C    i 3V L %%G ^F#*9#8WYaJH#))++S!!Qioo q NN &&&&&& 6',: 6 6 6D &##%%  (++ V m r__main__Nr#)F)r:mathrrrfontTools.pens.basePenrrfontTools.pens.momentsPenr__all__r r r rrr)rrr,rrrsd;;%$$$$$$$$$<<<<<<<<000000 2 3)7)7)7)7)7)7)7)7X#%#%#%#%#%NJ#%#%#%LR%R%R%R%R%>7R%R%R%j?N%?N?N?N?N?ND>>>B zJJJD!""r