)Ej&dZddlmZddlmZddlmZddlmZddgZ Gdd e Z edd fd Z d Z d ZdZddZedkrJddlZeejdkr&ddlZejejjedSdS)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)reduceoptimizeWidthsmainceZdZdZdZdS) missingdictc||_dSN missing_func)selfrs HC:\PYTHON\MyICR_Suite\python\Lib\site-packages\fontTools/cffLib/width.py__init__zmissingdict.__init__s(c,||Sr r )rvs r __missing__zmissingdict.__missing__s  ###rN)__name__ __module__ __qualname__rrrrr r s2)))$$$$$rr Fc t|}|d|dc t|| |r  fd}t dz d}n  fd}t dz}t |}}|D]} |||| }||| <|S)Nrc|krnSr r)xmaxxstarttotals rzcumSum.."QXXEE5rc|krnSr r)rminxrr s rr!zcumSum..%r"r)sortedkeysrvaluesranger ) fopr decreasingr'missingdomainoutrrrr%r s ` @@@rcumSumr0s !&&((  Da$r(JD$ 2qxxzz5 ) )E'888888tTAXr**888888tTAX&& g  C A  Bq!A$KKA Jrc,t|ds+tt}|D]}||xxdz cc<|}d}|D]A\}}||kr t ||z }|dkr||z }*|dkr ||dzz }9||dzz }B|S)Nitemsr#rkik)hasattrrintr2abs)widthsdefaultnominaldwcostfreqdiffs rbyteCostrA2s 67 # #     A aDDDAIDDDD D<<>>  4 << 1w; 3;; DLDD T\\ D1H DD D1H DD Krctt}D]}||xxdz cc<dt|z}t t}}t t ||dz}t fd|D}tdzdz}|D]=} td| ||zkr|D]} t| | } | |kr| }| } | } >| | fS)zSBruteforce version. Veeeeeeeeeeeeeeeeery slow. Only works for smallests of fonts.r#r5c3:K|]}td|VdSr rA).0r;r9s r z+optimizeWidthsBruteforce..Ts/ W WW&$!@!@ W W W W W WrN) rr7maxr(minlistr)lenrA)r9r<r=maxDefaultAdvantageminwmaxwr.bestCostWithoutDefaultbestCostr;r:r> bestDefault bestNominals` roptimizeWidthsBruteforcerRGs5 CA  ! c!((**oo-Vc&kk$D %dQh'' ( (F W W W WPV W W WWW6{{Q"H&& FD' * *X8K-K K K  & &GFGW55Dh% %  &  ##rc& tds+tt}D]}||xxdz cc<|t}|d|d}}t t ||dz}ttttttdttdtfdtfd tfd tfd tfd tfd tfd t| fd } z }g} |kredz dz g} | D]V} | r7| | dz kr"| dz} | r| | dz k"| | Wnddzdzg} | D]V} | r7| | dzkr"| dz } | r| | dzk"| | Wt| 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,cJ||dz z|dz dzzSNllr)rcumFrqUs rr!z optimizeWidths..|,'!*wq3w//'!d(2Ca2GGrcJ||dzz|dzdzzSrUr)rcumFrqDs rr!z optimizeWidths..rZrc8||z|z Sr r)r nomnCostD nomnCostUr9s rr!z optimizeWidths..sYq\IaL%@6!9%Lrcbt||dz dz|dz dzSNrVr4rWr5rG)rcumMaxUs rr!z optimizeWidths..3#gaj'!c'"2Q"6D8IA8MNNrcbt||dzdz|dzdzSrarb)rcumMaxDs rr!z optimizeWidths..rdrc<t||Sr rb)r dfltCostD dfltCostUs rr!z optimizeWidths..sS1y|%D%Drc&||z Sr r)rdfltCostnomnCosts rr!z optimizeWidths..sXa[8A;%>rc|Sr r)rrOs rr!z optimizeWidths..s  r)keyrVrWc&t|Sr rD)r:r;r9s rr!z optimizeWidths..sHVWg,N,Nr) r6rr7r&r'rIr)r0rrGr rHappend)r9r<r=r'rLrMr.bestCdfltCendsstartsrr:rOr\rYrfrcrkrhrir;rlr^r_s` @@@@@@@@@@@@rrrdsK 67 # #     A aDDDAIDDDD &++-- Da$r($D %dQh'' ( (FV$$$GV$$$GV555GV555GGGGGIGGGGILLLLLLMMHNNNNINNNNIDDDDDEEH>>>>>??H&3333444G W E W  1 1E D '"""7S='D.9  E%. WU^wuqy7I%I%I %. WU^wuqy7I%I%I KK      7S='D.9  E%. WU^wuqy7I%I%I %. WU^wuqy7I%I%I KK    $NNNNNOOOG G rNc 0ddl}|dtj}|ddt dd |d d d d d||}|jD]}t|}|d}d|j D}|j rt|\}}nt|\}}tdt|||t!|||fzdS)z4Calculate optimum defaultWidthX/nominalWidthX valuesrNzfonttools cffLib.width) descriptioninputsFILE+zInput TTF files)metavartypenargshelpz-bz --brute-forcebrute store_truez$Use brute-force approach (VERY slow))destactionr}hmtxcg|] }|d S)rr)rEms r zmain..s6661!A$666rz+glyphs=%d default=%d nominal=%d byteCost=%d)argparseArgumentParserr__doc__ add_argumentstr parse_argsrwrmetricsr(r~rRrprintrJrA) argsrparserfontfilefontrr9r:r;s rrrs]OOO  $ $ L%F &s#rs^AA#"""""###### V $$$$$$$$$$A%.*$$$:@@@F! ! ! ! H zJJJ s38}}"")***DFFFFFr