a
    w=ice  ã                   @   s¶   d Z ddlmZ ddlmZ ddlmZ ddlmZ G dd„ de	ƒZ
eddfd	d
„Zdd„ Zdd„ Zdd„ Zddd„Zedkr²ddlZeejƒdkr¬ddlZe e ¡ j¡ eƒ  dS )aF  T2CharString 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                   @   s   e Zd Zdd„ Zdd„ ZdS )Úmissingdictc                 C   s
   || _ d S ©N©Úmissing_func)Úselfr	   © r   úg/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/fontTools/cffLib/width.pyÚ__init__   s    zmissingdict.__init__c                 C   s
   |   |¡S r   r   )r
   Úvr   r   r   Ú__missing__   s    zmissingdict.__missing__N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r      s   r   Fc           
         s¢   t |  ¡ ƒ}|d |d  ‰‰ t||  ¡ ˆƒ‰|rT‡ ‡‡fdd„}tˆ ˆd dƒ}n‡‡‡fdd„}tˆˆ d ƒ}t|ƒ}ˆ}|D ]}	||| |	 ƒ}|||	< q‚|S )Nr   éÿÿÿÿc                    s   | ˆ krˆS ˆS r   r   ©Úx)ÚmaxxÚstartÚtotalr   r   Ú<lambda>   ó    zcumSum.<locals>.<lambda>é   c                    s   | ˆ k rˆS ˆS r   r   r   )Úminxr   r   r   r   r   !   r   )ÚsortedÚkeysr   ÚvaluesÚranger   )
ÚfÚopr   Ú
decreasingr   ÚmissingÚdomainÚoutr   r   r   )r   r   r   r   r   ÚcumSum   s    
r'   c                 C   s”   t | dƒs0ttƒ}| D ]}||  d7  < q|} d}|  ¡ D ]R\}}||krNq<t|| ƒ}|dkrl||7 }q<|dkr‚||d 7 }q<||d 7 }q<|S )NÚitemsr   r   ék   ik  é   é   )Úhasattrr   Úintr(   Úabs)ÚwidthsÚdefaultÚnominalÚdÚwÚcostÚfreqÚdiffr   r   r   ÚbyteCost-   s    


r7   c                    sÎ   t tƒ}ˆ D ]}||  d7  < qdt| ¡ ƒ }tˆ ƒtˆ ƒ }}tt||d ƒƒ}t‡ fdd„|D ƒƒ}tˆ ƒd d }|D ]D}	tˆ d|	ƒ|| kršq€|D ]$}
tˆ |
|	ƒ}||k rž|}|
}|	}qžq€||fS )zSBruteforce version.  Veeeeeeeeeeeeeeeeery slow.  Only works for smallests of fonts.r   r+   c                 3   s   | ]}t ˆ d |ƒV  qd S r   ©r7   )Ú.0r1   ©r/   r   r   Ú	<genexpr>O   r   z+optimizeWidthsBruteforce.<locals>.<genexpr>N)	r   r-   Úmaxr   ÚminÚlistr    Úlenr7   )r/   r2   r3   ZmaxDefaultAdvantageÚminwÚmaxwr%   ZbestCostWithoutDefaultÚbestCostr1   r0   r4   ZbestDefaultZbestNominalr   r:   r   ÚoptimizeWidthsBruteforceB   s$    rC   c                    s  t ˆdƒs0ttƒ}ˆD ]}||  d7  < q|‰tˆ ¡ ƒ}|d |d  }}tt||d ƒƒ}tˆtd‰tˆt	d‰tˆtdd‰tˆt	dd‰t
‡fdd	„ƒ‰t
‡fd
d	„ƒ‰
t
‡
‡‡fdd	„ƒ‰	t
‡fdd	„ƒ‰t
‡fdd	„ƒ‰t
‡‡fdd	„ƒ‰t
‡‡	fdd	„ƒ‰ t|‡ fdd	„d‰ˆ ˆ }ˆ	ˆ ˆ ˆ  }g }	|ˆˆ kr ˆˆd ˆd g}
|
D ]<}ˆ| rˆ| ˆ|d  kr|d8 }qd|	 |¡ q`nTˆˆd ˆd g}
|
D ]<}ˆ| ræˆ| ˆ|d  kræ|d7 }qº|	 |¡ q¶t|	‡‡fdd	„d}|ˆfS )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(   r   r   r   )r"   T)r"   r#   c                    s$   ˆ |  ˆ | d   ˆ | d  d  S ©Nél   él  é   r   r   )ÚcumFrqUr   r   r   v   r   z optimizeWidths.<locals>.<lambda>c                    s$   ˆ |  ˆ | d   ˆ | d  d  S rD   r   r   )ÚcumFrqDr   r   r   w   r   c                    s   ˆ|  ˆ |   ˆ|   S r   r   r   )Ú	nomnCostDÚ	nomnCostUr/   r   r   r   x   r   c                    s(   t ˆ |  ˆ | d  d ˆ | d  d ƒS ©NrE   r*   rF   r+   ©r<   r   )ÚcumMaxUr   r   r   {   r   c                    s(   t ˆ |  ˆ | d  d ˆ | d  d ƒS rL   rM   r   )ÚcumMaxDr   r   r   |   r   c                    s   t ˆ|  ˆ |  ƒS r   rM   r   )Ú	dfltCostDÚ	dfltCostUr   r   r   }   r   c                    s   ˆ|  ˆ |   S r   r   r   )ÚdfltCostÚnomnCostr   r   r   €   r   c                    s   ˆ |  S r   r   r   )rB   r   r   r   ƒ   r   )ÚkeyrE   rF   c                    s   t ˆ| ˆ ƒS r   r8   )r0   )r1   r/   r   r   r   •   r   )r,   r   r-   r   r   r>   r    r'   r   r<   r   r=   Úappend)r/   r2   r3   r   r@   rA   r%   ZbestCZdfltCZendsZstartsr   r0   r   )rB   rI   rH   rO   rN   rR   rP   rQ   r1   rS   rJ   rK   r/   r   ÚoptimizeWidths_   sH    
  rV   Nc           	   
   C   s¾   ddl }|jdtjd}|jddtddd	 |jd
ddddd | | ¡} | jD ]h}t|ƒ}|d }dd„ |j	 
¡ D ƒ}| jrŒt|ƒ\}}nt|ƒ\}}tdt|ƒ||t|||ƒf ƒ qPdS )z4Calculate optimum defaultWidthX/nominalWidthX valuesr   Nzfonttools cffLib.width)ÚdescriptionÚinputsÚFILEú+zInput TTF files)ÚmetavarÚtypeÚnargsÚhelpz-bz--brute-forceÚbruteÚ
store_truez$Use brute-force approach (VERY slow))ÚdestÚactionr^   Úhmtxc                 S   s   g | ]}|d  ‘qS )r   r   )r9   Úmr   r   r   Ú
<listcomp>«   r   zmain.<locals>.<listcomp>z+glyphs=%d default=%d nominal=%d byteCost=%d)ÚargparseÚArgumentParserÚmainÚ__doc__Úadd_argumentÚstrÚ
parse_argsrX   r   Zmetricsr   r_   rC   rV   Úprintr?   r7   )	Úargsrf   ÚparserZfontfileZfontrc   r/   r0   r1   r   r   r   rh   ™   s(    þÿÿ

rh   Ú__main__r   )N)ri   ZfontTools.ttLibr   Úcollectionsr   Úoperatorr   Ú	functoolsr   Údictr   r'   r7   rC   rV   rh   r   Úsysr?   ÚargvÚdoctestÚexitÚtestmodÚfailedr   r   r   r   Ú<module>   s    :
