a
    —Æàgº  ã                   @   s¾   d Z ddlmZ ddlmZ ddlmZ ddlmZ ddg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)ÚreduceÚoptimizeWidthsÚmainc                   @   s   e Zd Zdd„ Zdd„ ZdS )Úmissingdictc                 C   s
   || _ d S ©N©Úmissing_func)Úselfr   © r   úO/var/www/sistema_ama/venv/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   ÚbyteCost2   s     

r9   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	   ©r9   )Ú.0r3   ©r1   r   r   Ú	<genexpr>T   r   z+optimizeWidthsBruteforce.<locals>.<genexpr>N)	r   r/   Úmaxr!   ÚminÚlistr"   Úlenr9   )r1   r4   r5   ZmaxDefaultAdvantageÚminwÚmaxwr'   ZbestCostWithoutDefaultÚbestCostr3   r2   r6   ZbestDefaultZbestNominalr   r<   r   ÚoptimizeWidthsBruteforceG   s$    rE   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   |   r   z optimizeWidths.<locals>.<lambda>c                    s$   ˆ |  ˆ | d   ˆ | d  d  S rF   r   r   )ÚcumFrqDr   r   r      r   c                    s   ˆ|  ˆ |   ˆ|   S r	   r   r   )Ú	nomnCostDÚ	nomnCostUr1   r   r   r   �   r   c                    s(   t ˆ |  ˆ | d  d ˆ | d  d ƒS ©NrG   r,   rH   r-   ©r>   r   )ÚcumMaxUr   r   r   …   r   c                    s(   t ˆ |  ˆ | d  d ˆ | d  d ƒS rN   rO   r   )ÚcumMaxDr   r   r   ˆ   r   c                    s   t ˆ|  ˆ |  ƒS r	   rO   r   )Ú	dfltCostDÚ	dfltCostUr   r   r   Š   r   c                    s   ˆ|  ˆ |   S r	   r   r   )ÚdfltCostÚnomnCostr   r   r   �   r   c                    s   ˆ |  S r	   r   r   )rD   r   r   r   �   r   )ÚkeyrG   rH   c                    s   t ˆ| ˆ ƒS r	   r:   )r2   )r3   r1   r   r   r   ¢   r   )r.   r   r/   r   r    r@   r"   r)   r   r>   r   r?   Úappend)r1   r4   r5   r    rB   rC   r'   ZbestCZdfltCZendsZstartsr   r2   r   )rD   rK   rJ   rQ   rP   rT   rR   rS   r3   rU   rL   rM   r1   r   r   d   sX    

ÿ
ÿ
ÿ
ÿ  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   )r;   Úmr   r   r   Ú
<listcomp>À   r   zmain.<locals>.<listcomp>z+glyphs=%d default=%d nominal=%d byteCost=%d)ÚargparseÚArgumentParserr   Ú__doc__Úadd_argumentÚstrÚ
parse_argsrY   r   Zmetricsr!   r`   rE   r   ÚprintrA   r9   )	Úargsrg   ÚparserZfontfileÚfontrd   r1   r2   r3   r   r   r   r   §   s8    þ
ÿû

ÿÿÚ__main__r   )N)ri   ZfontTools.ttLibr   Úcollectionsr   Úoperatorr   Ú	functoolsr   Ú__all__Údictr   r)   r9   rE   r   r   r   ÚsysrA   ÚargvÚdoctestÚexitÚtestmodÚfailedr   r   r   r   Ú<module>   s"   C
$