L i(dZddlmZddlmZddlmZddlmZddgZ Gdd e Z edd fd Z d Z d ZdZddZedk(rPddlZeej(dk(r/ddlZej,ej.j0eyy)aFT2CharString glyph width optimizer. CFF glyphs whose width equals the CFF Private dictionary's ``defaultWidthX`` value do not need to specify their width in their charstring, saving bytes. This module determines the optimum ``defaultWidthX`` and ``nominalWidthX`` values for a font, when provided with a list of glyph widths.)TTFont) defaultdict)add)reduceoptimizeWidthsmainceZdZdZdZy) missingdictc||_yN missing_func)selfrs \/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/fontTools/cffLib/width.py__init__zmissingdict.__init__s (c$|j|Sr r )rvs r __missing__zmissingdict.__missing__s  ##rN)__name__ __module__ __qualname__rrrrr r s )$rr Fc6 t|j}|d|dc t||j |r  fd}t dz d}n  fd}t dz}t |}}|D]} |||| }||| <|S)Nrc|kDrSSr r)xmaxxstarttotals rzcumSum.."QXE5rc|krSSr r)rminxrr s rr!zcumSum..%r"r)sortedkeysrvaluesranger ) fopr decreasingr'missingdomainoutrrrr%r s ` @@@rcumSumr0s !&&( Da$r(JD$ 2qxxz5 )E8tTAXr*8tTAX& g C A  q!A$KA Jrct|ds%tt}|D]}||xxdz cc<|}d}|jD]:\}}||k(r t ||z }|dkr||z }%|dkr ||dzz }3||dzz }<|S)Nitemsr#rkik)hasattrrintr2abs)widthsdefaultnominaldwcostfreqdiffs rbyteCostrA2s 67 #   A aDAID  D<<> 4 < 1w; 3; DLD T\ D1H D D1H D  Krctt}D]}||xxdz cc<dt|jz}t t}}t t ||dz}t fd|D}tdzdz}|D]6} td| ||zkDr|D]} t| | } | |ks| }| } | } 8  fS)zSBruteforce version. Veeeeeeeeeeeeeeeeery slow. Only works for smallests of fonts.r#r5c38K|]}td|ywr rA).0r;r9s r z+optimizeWidthsBruteforce..Ts WW&$!@ WsN) rr7maxr(minlistr)lenrA)r9r<r=maxDefaultAdvantageminwmaxwr.bestCostWithoutDefaultbestCostr;r:r> bestDefault bestNominals` roptimizeWidthsBruteforcerRGs CA  ! c!((*o-Vc&k$D %dQh' (F WPV WW6{Q"H& FD' *X8K-K K  &GFGW5Dh% %  &&  ##rc tds%tt}D]}||xxdz cc<|tj }|d|d}}t t ||dz}ttttttdttdtfdtfd tfd tfd tfd tfd tfd t| fd } z }g} |k(rPdz dz g} | D]?} | r'| | dz k(r| dz} | r| | dz k(r| j| AnOdzdzg} | D]?} | r'| | dzk(r| dz } | r| | dzk(r| j| At| fd} | fS)zGiven a list of glyph widths, or dictionary mapping glyph width to number of glyphs having that, returns a tuple of best CFF default and nominal glyph widths. This algorithm is linear in UPEM+numGlyphs.r2r#rr)r+T)r+r,c8||dz z|dz dzzSNllr)rcumFrqUs rr!z optimizeWidths..|,'!*wq3w//'!d(2Ca2GGrc8||dzz|dzdzzSrUr)rcumFrqDs rr!z optimizeWidths..rZrc&||z|z Sr r)r nomnCostD nomnCostUr9s rr!z optimizeWidths..sYq\IaL%@6!9%LrcHt||dz dz|dz dzSNrVr4rWr5rG)rcumMaxUs rr!z optimizeWidths..0#gaj'!c'"2Q"6D8IA8MNrcHt||dzdz|dzdzSrarb)rcumMaxDs rr!z optimizeWidths..rdrc(t||Sr rb)r dfltCostD dfltCostUs rr!z optimizeWidths..sS1y|%Drc||z Sr r)rdfltCostnomnCosts rr!z optimizeWidths..sXa[8A;%>rc|Sr r)rrOs rr!z optimizeWidths..s  r)keyrVrWct|Sr rD)r:r;r9s rr!z optimizeWidths..sHVWg,Nr) r6rr7r&r'rIr)r0rrGr rHappend)r9r<r=r'rLrMr.bestCdfltCendsstartsrr:rOr\rYrfrcrkrhrir;rlr^r_s` @@@@@@@@@@@@rrrdsG 67 #   A aDAID  &++- Da$r($D %dQh' (FV$GV$GV5GV5GGIGILMHNINIDEH>?H&34G W E W  1 1E D '""7S='D.9 E%.WU^wuqy7I%I %.WU^wuqy7I%I KK   7S='D.9 E%.WU^wuqy7I%I %.WU^wuqy7I%I KK  $NOG G rNc ddl}|jdtj}|j ddt dd |j d d d d d|j |}|jD]}t|}|d}|jjDcgc]}|d }}|jrt|\}} nt|\}} tdt||| t!||| fzycc}w)z4Calculate optimum defaultWidthX/nominalWidthX valuesrNzfonttools cffLib.width) descriptioninputsFILE+zInput TTF files)metavartypenargshelpz-bz --brute-forcebrute store_truez$Use brute-force approach (VERY slow))destactionr}hmtxz+glyphs=%d default=%d nominal=%d byteCost=%d)argparseArgumentParserr__doc__ add_argumentstr parse_argsrwrmetricsr(r~rRrprintrJrA) argsrparserfontfilefontrmr9r:r;s rrrs  $ $ LL%F &s#rsA## V $$$$A%.*$:@F! H z 388}"))*Fr