L iP&dZddlmZmZmZddlmZmZddlm Z ddgZ GddZ Gd de e Z Gd de eZ dd d d ZdZedk(rddlZeej$ddyy)z~Pen calculating area, center of mass, variance and standard-deviation, covariance and correlation, and slant, of glyph shapes.)sqrtdegreesatan)BasePenOpenContourError) MomentsPen StatisticsPenStatisticsControlPenceZdZdZdZdZy)StatisticsBasec$|jyN)_zeroselfs b/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/fontTools/pens/statisticsPen.py__init__zStatisticsBase.__init__ s  cd|_d|_d|_d|_d|_d|_d|_d|_d|_d|_ y)Nr) areameanXmeanY varianceX varianceYstddevXstddevY covariance correlationslantrs rrzStatisticsBase._zerosI      rc"t|j|_t|j|_t|jx|_}t|jx|_}||zdk(r t d}n(|j||zz }tdtd|}t|dkDr|nd|_ |jdk7r|j|jz n t d}t|dkDr||_ yd|_ y)NrNaNgMbP?) absrrrrrfloatrmaxminrr)rrrrrs r_updatezStatisticsBase._updatesT^^,T^^,!%dnn!55 w!%dnn!55 w W  !,K //Ww->?Kb#a"56K*-k*:T*A;q15!0CDOOdnn ,u "%j4/U Q rN)__name__ __module__ __qualname__rrr(rrr r s 7rr c$eZdZdZddZdZdZy)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\tj||tj|y)Nglyphset)rrr rr0s rrzStatisticsPen.__init__@s D84%rcNtj||jyr)r _closePathr(rs rr3zStatisticsPen._closePathDsd# rc`|j}|s|jy|j|z x|_}|j|z x|_}|j |z ||zz |_|j|z ||zz |_ |j|z ||zz |_ tj|yr)rrmomentXrmomentYrmomentXXrmomentYYrmomentXYrr r()rrrrs rr(zStatisticsPen._updateHsyy JJL "\\D00 U!\\D00 U- =- =--$.>t$rr)r)r*r+__doc__rr3r(r,rrr r 7s5&%rcBeZdZdZd dZdZdZdZdZdZ d Z d Z y) 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.Nchtj||tj|g|_yr)rrr _nodesr1s rrzStatisticsControlPen.__init__fs'x(% rcT|jjt|||_yr)r=appendcomplex _startPointrpts r_moveTozStatisticsControlPen._moveToks  7B<(rcF|jjt|yrr=r?r@rBs r_lineTozStatisticsControlPen._lineToos 7B<(rcX||fD]#}|jjt|%yrrF)rpt1pt2rCs r _qCurveToOnez!StatisticsControlPen._qCurveToOners+* -B KK  w| , -rcZ|||fD]#}|jjt|%yrrF)rrIrJpt3rCs r _curveToOnez StatisticsControlPen._curveToOnevs-S/ -B KK  w| , -rc|j}||jk7r|j|j|jyr)_getCurrentPointrArGr(rp0s rr3zStatisticsControlPen._closePathzs9  " " $ !! ! LL)) * rcx|j}||jk7r td|jy)Nz.Glyph statistics not defined on open contours.)rPrArr(rQs r_endPathzStatisticsControlPen._endPaths3  " " $ !! !"#ST T rc |j}t|}tdt||dd|ddzDdz |_t|}|j |z x|_}|j|z x|_}|dkDrtd|D|j |j z|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|_ }tj|y)Nc3K|]:\}}|j|jz|j|jzz <ywrrealimag).0rRp1s r z/StatisticsControlPen._update..s;B277"RWWrww%66sAAr#c3NK|]}|j|jzywr)rXrZps rr\z/StatisticsControlPen._update..3AFFQVVO3#%c3NK|]}|j|jzywr)rYr_s rr\z/StatisticsControlPen._update..rarbc3NK|]}|j|jzywrrWr_s rr\z/StatisticsControlPen._update..rarbr)r=lensumziprrXrrYrrrrr r() rnodesnsumNodesrrrrrs rr(zStatisticsControlPen._updates  J !%qrU2AY)>?    u:%]]Q.. U%]]Q.. U q53U33==8==0A56Q* DNY 3U33==8==0A56Q* DNY3U33==8==0A56Q, DOj *+ *DNY)* *DNY+, ,DOjt$rr) r)r*r+r:rrDrGrKrNr3rTr(r,rrr r ]s/5 )--  )%rF)controlc ddlm}ddlm}d}d}d} d} d} |D]} || } |r t |}n t |}|||d|z }| j |t|j}| j}||z }||j|zz }| |z } | |jz } | |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| zy)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.transformPenrmfontTools.misc.transformrnr r drawr$rwidthrprintgetattrrerr)r0upemglyphsquietrkrmrnwght_sumwght_sum_perceptualwdth_sumslnt_sumslnt_sum_perceptual glyph_nameglyphpen transformerrrritemrslant_perceptuals r_testrs8.HHH(9 $ &9C2C"3cDj(9:  ;388} Dsxx%//ECIIsyy500    h #  9D" (dGC$677 8# 9/(9T   g ,(T/H4 56 #':X'E FG ,(T/CK7 89 s6{ "E ,  U 44 45*X5 #&6 67 )WT:J5K-L,L LMrc^|ddl}|jdd}ddl}|jdd}|j ddd |j d d d d |j ddd |j dddd|j dddd|j dddd|j |}|j }|jt|jnd}i}|jjD]9}|jd} | dj} t| d} | || <;dd l m } | |j|!} |s| j}t!| j#|"| d#j$||j&|j($y)%z.Report font glyph shape geometricsl statisticsNrr#zfonttools pens.statisticsPen) descriptionfontzfont.ttfz Font file.)metavarhelprvz 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)rwrk)sysargvargparseArgumentParser add_argument parse_argsrvyint variationssplitstripfontTools.ttLibrr getGlyphOrderr getGlyphSet unitsPerEmrwrk)argsrrparseroptionsrvrrtag_vfieldstagvrrs rmainrs |xx|  $ $&D%F  F ,^SVW   @    C    i 3V L %G ^^F#*99#8WYYaJH##))+S!Qioo q N  ' ',,: 6D ##%  (+ V mm r__main__Nr#)F)r:mathrrrfontTools.pens.basePenrrfontTools.pens.momentsPenr__all__r r r rrr)rrr,rrrs;%$<0 2 3)7)7X#%NJ#%LR%>7R%j?N%?ND>B z!"r