a
    èÝEbe  ã                   @   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   úV/home/ja/django-apps/lartica_env/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   ék  é   é   )Úhasattrr   Úintr(   Úabs)ÚwidthsÚdefaultÚnominalÚdÚwÚcostÚfreqÚdiffr   r   r   ÚbyteCost-   s    


r8   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   ©r8   )Ú.0r2   ©r0   r   r   Ú	<genexpr>O   r   z+optimizeWidthsBruteforce.<locals>.<genexpr>N)	r   r.   Úmaxr   ÚminÚlistr    Úlenr8   )r0   r3   r4   ZmaxDefaultAdvantageÚminwÚmaxwr%   ZbestCostWithoutDefaultÚbestCostr2   r1   r5   ZbestDefaultZbestNominalr   r;   r   ÚoptimizeWidthsBruteforceB   s$    rD   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 rE   r   r   )ÚcumFrqDr   r   r   w   r   c                    s   ˆ|  ˆ |   ˆ|   S r   r   r   )Ú	nomnCostDÚ	nomnCostUr0   r   r   r   x   r   c                    s(   t ˆ |  ˆ | d  d ˆ | d  d ƒS ©NrF   r+   rG   r,   ©r=   r   )ÚcumMaxUr   r   r   {   r   c                    s(   t ˆ |  ˆ | d  d ˆ | d  d ƒS rM   rN   r   )ÚcumMaxDr   r   r   |   r   c                    s   t ˆ|  ˆ |  ƒS r   rN   r   )Ú	dfltCostDÚ	dfltCostUr   r   r   }   r   c                    s   ˆ|  ˆ |   S r   r   r   )ÚdfltCostÚnomnCostr   r   r   €   r   c                    s   ˆ |  S r   r   r   )rC   r   r   r   ƒ   r   )ÚkeyrF   r*   c                    s   t ˆ| ˆ ƒS r   r9   )r1   )r2   r0   r   r   r   •   r   )r-   r   r.   r   r   r?   r    r'   r   r=   r   r>   Úappend)r0   r3   r4   r   rA   rB   r%   ZbestCZdfltCZendsZstartsr   r1   r   )rC   rJ   rI   rP   rO   rS   rQ   rR   r2   rT   rK   rL   r0   r   ÚoptimizeWidths_   sH    
  rW   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ÚArgumentParserÚmainÚ__doc__Úadd_argumentÚstrÚ
parse_argsrY   r   Zmetricsr   r`   rD   rW   Úprintr@   r8   )	Úargsrg   ÚparserZfontfileÚfontrd   r0   r1   r2   r   r   r   ri   ™   s(    þÿÿ

ri   Ú__main__r   )N)rj   ZfontTools.ttLibr   Úcollectionsr   Úoperatorr   Ú	functoolsr   Údictr   r'   r8   rD   rW   ri   r   Úsysr@   ÚargvÚdoctestÚexitÚtestmodÚfailedr   r   r   r   Ú<module>   s    :
