Warning: session_start(): Session cannot be started after headers have already been sent in /home/tvrreohg/public_html/manga.php on line 13
3 2øªjeã@s¶dZddlmZddlmZddlmZddlmZGdd„de ƒZ eddfd d „Z d d „Z d d„Z dd„Zddd„Zedkr²ddlZeejƒdkr¬ddlZejejƒjƒeƒdS)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@seZdZdd„Zdd„ZdS)Ú missingdictcCs ||_dS)N)Ú missing_func)Úselfr©r ú;/tmp/pip-build-_d5lkt3n/fonttools/fontTools/cffLib/width.pyÚ__init__szmissingdict.__init__cCs |j|ƒS)N)r)rÚvr r r Ú __missing__szmissingdict.__missing__N)Ú__name__Ú __module__Ú __qualname__r r r r r r rsrFc s¦t|jƒƒ}|d|d‰‰t||jƒˆƒ‰|rT‡‡‡fdd„}tˆˆddƒ}n‡‡‡fdd„}tˆˆdƒ}t|ƒ}ˆ}x"|D]} |||| ƒ}||| <q„W|S)Nrécs|ˆkr ˆSˆS)Nr )Úx)ÚmaxxÚstartÚtotalr r ÚszcumSum..cs|ˆkr ˆSˆS)Nr )r)Úminxrrr r r!séÿÿÿÿr)ÚsortedÚkeysrÚvaluesÚranger) ÚfÚoprÚ decreasingrÚmissingÚdomainÚoutr rr )rrrrr ÚcumSums   r#cCsœt|dƒs4ttƒ}x|D]}||d7<qW|}d}x^|jƒD]R\}}||krTqBt||ƒ}|dkrr||7}qB|dkrˆ||d7}qB||d7}qBW|S)NÚitemsrrékikéé)ÚhasattrrÚintr$Úabs)ÚwidthsÚdefaultÚnominalÚdÚwÚcostÚfreqZdiffr r r ÚbyteCost-s     r2csÚttƒ}xˆD]}||d7<qWdt|jƒƒ}tˆƒtˆƒ}}tt||dƒƒ}t‡fdd„|Dƒƒ}tˆƒdd}xP|D]H} tˆd| ƒ||kr q†x,|D]$} tˆ| | ƒ} | |kr¦| }| } | } q¦Wq†W| | fS)zSBruteforce version. Veeeeeeeeeeeeeeeeery slow. Only works for smallests of fonts.rr'c3s|]}tˆd|ƒVqdS)N)r2)Ú.0r-)r+r r ú Osz+optimizeWidthsBruteforce..N) rr)ÚmaxrÚminÚlistrÚlenr2)r+r.r/ZmaxDefaultAdvantageÚminwÚmaxwr!ZbestCostWithoutDefaultÚbestCostr-r,r0Z bestDefaultZ bestNominalr )r+r ÚoptimizeWidthsBruteforceBs$     r<c s&tˆ dƒs4ttƒ}xˆ D]}||d7<qW|‰ tˆ jƒƒ}|d|d}}tt||dƒƒ}tˆ td�‰tˆ t d�‰tˆ tdd�‰tˆ t dd�‰t ‡fdd„ƒ‰ t ‡fd d„ƒ‰ t ‡ ‡ ‡ fd d„ƒ‰ t ‡fd d„ƒ‰t ‡fd d„ƒ‰t ‡‡fd d„ƒ‰t ‡‡ fdd„ƒ‰t |‡fdd„d�‰ˆˆ}ˆ ˆˆˆ}g} |ˆˆk�r¬ˆˆdˆdg} x¦| D]@} x.ˆ| �r˜ˆ| ˆ| dk�r˜| d8} �qlW| j | ƒ�qfWn\ˆˆdˆdg} xH| D]@} x.ˆ| �röˆ| ˆ| dk�rö| d7} �qÊW| j | ƒ�qÄWt | ‡‡ fdd„d�} | ˆfS)zÍGiven 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)Nélilér )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ˆ|ddƒS)Nr=r&ilr')r5)r)ÚcumMaxUr r r{scs(tˆ|ˆ|ddˆ|ddƒS)Nr=r&ilr')r5)r)ÚcumMaxDr r r|scstˆ|ˆ|ƒS)N)r5)r)Ú dfltCostDÚ dfltCostUr r r}scsˆ|ˆ|S)Nr )r)ÚdfltCostÚnomnCostr r r€scsˆ|S)Nr )r)r;r r rƒs)Úkeyr=ikcs tˆ|ˆƒS)N)r2)r,)r-r+r r r•sr) r(rr)rrr7rr#rr5rr6Úappend) r+r.r/rr9r:r!ZbestCZdfltCZendsZstartsrr,r ) r;r@r?rDrCrGrErFr-rHrArBr+r ÚoptimizeWidths_sH      " "rKNc CsÂddl}|jdtjd�}|jddtddd �|jd d d d dd�|j|ƒ}xr|jD]h}t|ƒ}|d}dd„|j j ƒDƒ}|j rŽt |ƒ\}}n t |ƒ\}}tdt|ƒ||t|||ƒfƒqRWdS)z4Calculate optimum defaultWidthX/nominalWidthX valuesrNzfonttools cffLib.width)Ú descriptionÚinputsÚFILEú+zInput TTF files)ÚmetavarÚtypeÚnargsÚhelpz-bz --brute-forceÚbruteÚ store_truez$Use brute-force approach (VERY slow))ÚdestÚactionrSÚhmtxcSsg|] }|d‘qS)rr )r3Úmr r r ú «szmain..z+glyphs=%d default=%d nominal=%d byteCost=%d)ÚargparseÚArgumentParserÚmainÚ__doc__Ú add_argumentÚstrÚ parse_argsrMrZmetricsrrTr<rKÚprintr8r2) Úargsr[ÚparserZfontfileÚfontrXr+r,r-r r r r]™s"      r]Ú__main__r)N)r^ZfontTools.ttLibrÚ collectionsrÚoperatorrÚ functoolsrÚdictrr#r2r<rKr]rÚsysr8ÚargvÚdoctestÚexitÚtestmodÚfailedr r r r Ús     :