o
    h                     @   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rZd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)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   j/var/www/html/construction_image-detection-poc/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   ik        )hasattrr   intr+   abs)widthsdefaultnominaldwcostfreqdiffr   r   r   byteCost2   s    

r:   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	   r:   ).0r4   r2   r   r   	<genexpr>T   s    z+optimizeWidthsBruteforce.<locals>.<genexpr>N)	r   r0   maxr"   minlistr#   lenr:   )r2   r5   r6   maxDefaultAdvantageminwmaxwr(   bestCostWithoutDefaultbestCostr4   r3   r7   bestDefaultbestNominalr   r=   r   optimizeWidthsBruteforceG   s(   rJ   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   |      $ z optimizeWidths.<locals>.<lambda>c                    s$    |   | d    | d  d  S rK   r   r   )cumFrqDr   r   r      rP   c                    s   |   |   |   S r	   r   r   )	nomnCostD	nomnCostUr2   r   r   r      s    c                    s(   t  |   | d  d  | d  d S NrL   r-   rM   r.   r?   r   )cumMaxUr   r   r         ( c                    s(   t  |   | d  d  | d  d S rT   rU   r   )cumMaxDr   r   r      rW   c                    s   t |   |  S r	   rU   r   )	dfltCostD	dfltCostUr   r   r      s    c                    s   |   |   S r	   r   r   )dfltCostnomnCostr   r   r      r   c                    s    |  S r	   r   r   )rG   r   r   r      s    )keyrL   rM   c                    s   t |  S r	   r;   )r3   )r4   r2   r   r   r      s    )r/   r   r0   r    r!   rA   r#   r*   r   r?   r   r@   append)r2   r5   r6   r!   rD   rE   r(   bestCdfltCendsstartsr   r3   r   )rG   rQ   rO   rX   rV   r[   rY   rZ   r4   r\   rR   rS   r2   r   r   d   s^   




 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ArgumentParserr   __doc__add_argumentstr
parse_argsrd   r   metricsr"   rk   rJ   r   printrB   r:   )	argsrr   parserfontfilefontro   r2   r3   r4   r   r   r   r      s:   


__main__r   r	   )rt   fontTools.ttLibr   collectionsr   operatorr   	functoolsr   __all__dictr   r*   r:   rJ   r   r   r   sysrB   argvdoctestexittestmodfailedr   r   r   r   <module>   s&   
C$
