Warning: session_start(): Session cannot be started after headers have already been sent in /home/tvrreohg/public_html/manga.php on line 13
3 2je@sdZddlmZddlmZddlmZddlmZGddde Z eddfd d Z d d Z d dZ ddZdddZedkrddlZeejdkrddlZejejjedS)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)reducec@seZdZddZddZdS) missingdictcCs ||_dS)N) missing_func)selfrr ;/tmp/pip-build-_d5lkt3n/fonttools/fontTools/cffLib/width.py__init__szmissingdict.__init__cCs |j|S)N)r)rvr r r __missing__szmissingdict.__missing__N)__name__ __module__ __qualname__r r r r r r rsrFc st|j}|d|dt||j|rTfdd}tdd}nfdd}td}t|}}x"|D]} |||| }||| <qW|S)Nrcs|kr SS)Nr )x)maxxstarttotalr r szcumSum..cs|kr SS)Nr )r)minxrrr r r!sr)sortedkeysrvaluesranger) fopr decreasingrmissingdomainoutr rr )rrrrr cumSums   r#cCst|ds4tt}x|D]}||d7<qW|}d}x^|jD]R\}}||krTqBt||}|dkrr||7}qB|dkr||d7}qB||d7}qBW|S)Nitemsrrkik)hasattrrintr$abs)widthsdefaultnominaldwcostfreqZdiffr r r byteCost-s     r2cstt}xD]}||d7<qWdt|j}tt}}tt||d}tfdd|D}tdd}xP|D]H} td| ||krqx,|D]$} t| | } | |kr| }| } | } qWqW| | fS)zSBruteforce version. Veeeeeeeeeeeeeeeeery slow. Only works for smallests of fonts.rr'c3s|]}td|VqdS)N)r2).0r-)r+r r Osz+optimizeWidthsBruteforce..N) rr)maxrminlistrlenr2)r+r.r/ZmaxDefaultAdvantageminwmaxwr!ZbestCostWithoutDefaultbestCostr-r,r0Z bestDefaultZ bestNominalr )r+r optimizeWidthsBruteforceBs$     r<c s&t ds4tt}x D]}||d7<qW| t j}|d|d}}tt||d}t tdt t dt tddt t ddt fdd t fd d t fd d t fd dt fd dt fd dt  fddt |fddd} }g} |krddg} x| D]@} x.| r| | dkr| d8} qlW| j | qfWn\ddg} xH| D]@} x.| r| | dkr| d7} qW| j | qWt |  fddd} | 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.r$rr)rT)rrcs$||d|ddS)Nlilr )r)cumFrqUr r rvsz optimizeWidths..cs$||d|ddS)Nr=ilr>r )r)cumFrqDr r rwscs|||S)Nr )r) nomnCostD nomnCostUr+r r rxscs(t||dd|ddS)Nr=r&ilr')r5)r)cumMaxUr r r{scs(t||dd|ddS)Nr=r&ilr')r5)r)cumMaxDr r r|scst||S)N)r5)r) dfltCostD dfltCostUr r r}scs||S)Nr )r)dfltCostnomnCostr r rscs|S)Nr )r)r;r r rs)keyr=ikcs t|S)N)r2)r,)r-r+r r rsr) r(rr)rrr7rr#rr5rr6append) r+r.r/rr9r:r!ZbestCZdfltCZendsZstartsrr,r ) r;r@r?rDrCrGrErFr-rHrArBr+r optimizeWidths_sH      " "rKNc Csddl}|jdtjd}|jddtddd |jd d d d dd|j|}xr|jD]h}t|}|d}dd|j j D}|j rt |\}}n t |\}}tdt|||t|||fqRWdS)z4Calculate optimum defaultWidthX/nominalWidthX valuesrNzfonttools cffLib.width) descriptioninputsFILE+zInput TTF files)metavartypenargshelpz-bz --brute-forcebrute store_truez$Use brute-force approach (VERY slow))destactionrShmtxcSsg|] }|dqS)rr )r3mr r r szmain..z+glyphs=%d default=%d nominal=%d byteCost=%d)argparseArgumentParsermain__doc__ add_argumentstr parse_argsrMrZmetricsrrTr<rKprintr8r2) argsr[parserZfontfilefontrXr+r,r-r r r r]s"      r]__main__r)N)r^ZfontTools.ttLibr collectionsroperatorr functoolsrdictrr#r2r<rKr]rsysr8argvdoctestexittestmodfailedr r r r s     :