o
    tBhe                     @   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rVddlZee j e  dS 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   m/var/www/html/riverr-enterprise-integrations-main/venv/lib/python3.10/site-packages/fontTools/cffLib/width.py__init__      
zmissingdict.__init__c                 C   s
   |  |S r   r   )r
   vr   r   r   __missing__   r   zmissingdict.__missing__N)__name__
__module____qualname__r   r   r   r   r   r   r      s    r   Fc           
         s   t |  }|d |d  t||  |r* fdd}t d d}nfdd}t d }t|}}|D ]}	||| |	 }|||	< qA|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stt}| D ]
}||  d7  < q|} d}|  D ])\}}||kr'qt|| }|dkr6||7 }q|dkrA||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   


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 ]"}	t d|	|| krMq@|D ]}
t |
|	}||k ra|}|
}|	}qOq@||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>O   s    z+optimizeWidthsBruteforce.<locals>.<genexpr>N)	r   r/   maxr    minlistr!   lenr9   )r1   r4   r5   maxDefaultAdvantageminwmaxwr&   bestCostWithoutDefaultbestCostr3   r2   r6   bestDefaultbestNominalr   r<   r   optimizeWidthsBruteforceB   s(   rI   c                    s:  t dst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 }| rш| |d  ks|	| qn6d d g}
|
D ]*}| r| |d  kr|d7 }| r| |d  ks|	| qt|	fdd	d}|fS )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)   r   r   r   )r#   T)r#   r$   c                    s$    |   | d    | d  d  S Nl   l     r   r   )cumFrqUr   r   r   v      $ z optimizeWidths.<locals>.<lambda>c                    s$    |   | d    | d  d  S rJ   r   r   )cumFrqDr   r   r   w   rO   c                    s   |   |   |   S r   r   r   )	nomnCostD	nomnCostUr1   r   r   r   x   s    c                    s(   t  |   | d  d  | d  d S NrK   r,   rL   r-   r>   r   )cumMaxUr   r   r   {      ( c                    s(   t  |   | d  d  | d  d S rS   rT   r   )cumMaxDr   r   r   |   rV   c                    s   t |   |  S r   rT   r   )	dfltCostD	dfltCostUr   r   r   }   s    c                    s   |   |   S r   r   r   )dfltCostnomnCostr   r   r      r   c                    s    |  S r   r   r   )rF   r   r   r      s    )keyrK   r+   c                    s   t |  S r   r:   )r2   )r3   r1   r   r   r      s    )r.   r   r/   r   r   r@   r!   r(   r   r>   r   r?   append)r1   r4   r5   r   rC   rD   r&   bestCdfltCendsstartsr   r2   r   )rF   rP   rN   rW   rU   rZ   rX   rY   r3   r[   rQ   rR   r1   r   optimizeWidths_   sN   
 rb   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 ]4}t|}|d }dd |j	
 D }| jrFt|\}}nt|\}}tdt|||t|||f  q(d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actionrj   hmtxc                 S   s   g | ]}|d  qS )r   r   )r;   mr   r   r   
<listcomp>   s    zmain.<locals>.<listcomp>z+glyphs=%d default=%d nominal=%d byteCost=%d)argparseArgumentParsermain__doc__add_argumentstr
parse_argsrd   r   metricsr    rk   rI   rb   printrA   r9   )	argsrr   parserfontfilefontro   r1   r2   r3   r   r   r   rt      s*   

"rt   __main__r   r   )ru   fontTools.ttLibr   collectionsr   operatorr   	functoolsr   dictr   r(   r9   rI   rb   rt   r   sysrA   argvdoctestexittestmodfailedr   r   r   r   <module>   s$   
:
