
    <`e                        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e	          Z
eddfd	Zd
 Zd Zd ZddZedk    rJddlZ eej                  dk    r&ddlZ ej         ej                    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                       e Zd Zd Zd ZdS )missingdictc                     || _         d S Nmissing_func)selfr   s     6lib/python3.11/site-packages/fontTools/cffLib/width.py__init__zmissingdict.__init__   s    "$    c                 ,    |                      |          S r
   r   )r   vs     r   __missing__zmissingdict.__missing__   s    			1		r   N)__name__
__module____qualname__r   r    r   r   r   r      s2        # # #    r   r   Fc                   
 t          |                                           }|d         |d         c
t          ||                                           |r
fd}t	          
dz
  d          }nfd}t	          
dz             }t          |          }}|D ]}	 ||| |	                   }|||	<   |S )Nr   c                     | k    rnS r
   r   )xmaxxstarttotals    r   <lambda>zcumSum.<locals>.<lambda>       q4xxeeU r      c                     | k     rnS r
   r   )r   minxr   r   s    r   r   zcumSum.<locals>.<lambda>!   r    r   )sortedkeysr   valuesranger   )fopr   
decreasingr%   missingdomainoutr   r   r   r#   r   s     `       @@@r   cumSumr.      s    qvvxx1gtBxt	AHHJJ	&	& !222222'tax$$&&222222'tax  &7

  QbAaDkk!#a&&r   c                 ,   t          | d          s+t          t                    }| D ]}||xx         dz  cc<   |} d}|                                 D ]A\  }}||k    rt	          ||z
            }|dk    r||z  }*|dk    r	||dz  z  }9||dz  z  }B|S )Nitemsr!   r   k   k        )hasattrr   intr0   abs)widthsdefaultnominaldwcostfreqdiffs           r   byteCostr@   -   s       #!  aQ444194444&	||~~  VQt'\\8	Q[		$	S[[4<44t||4!8444!844r   c                     t          t                    } D ]}||xx         dz  cc<   dt          |                                          z  }t	                     t                     }}t          t          ||dz                       }t	           fd|D                       }t                     dz  dz   }|D ]=}	t           d|	          ||z   k    r|D ]}
t           |
|	          }||k     r|}|
}|	} >||fS )zSBruteforce version.  Veeeeeeeeeeeeeeeeery slow.  Only works for smallests of fonts.r!   r4   c              3   :   K   | ]}t          d |          V  d S r
   r@   ).0r:   r8   s     r   	<genexpr>z+optimizeWidthsBruteforce.<locals>.<genexpr>O   s/      TT'hvtW==TTTTTTr   N)	r   r6   maxr&   minlistr'   lenr@   )r8   r;   r<   maxDefaultAdvantageminwmaxwr,   bestCostWithoutDefaultbestCostr:   r9   r=   bestDefaultbestNominals   `             r   optimizeWidthsBruteforcerQ   B   s4    
  QA$$$!)$$$$ 3qxxzz??*&kk3v;;t
uT46""
#
#TTTTVTTTTTKK!Oa  WfdG$$x2E'EEE  g
67G
,
,4
XooHKK 	[  r   c                 &    t           d          s+t          t                    } D ]}||xx         dz  cc<   | t                                                     }|d         |d         }}t          t          ||dz                       }t           t                    t           t                    t           t          d          t           t          d          t          fd          t          fd	          t           fd
          t          fd          t          fd          t          fd          t          fd          t          |fd                   }                  z
  }g }	|         k    redz
  dz
  g}
|
D ]V}|         r7|         |dz
           k    r"|dz  }|         r|         |dz
           k    "|	                    |           Wnddz   dz   g}
|
D ]V}|         r7|         |dz            k    r"|dz  }|         r|         |dz            k    "|	                    |           Wt          |	 f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.r0   r!   r   r   )r)   T)r)   r*   c                 J    |          | dz
           z   | dz
           dz  z   S Nl   l     r   )r   cumFrqUs    r   r   z optimizeWidths.<locals>.<lambda>v   +    71:##>4QRAR#R r   c                 J    |          | dz            z   | dz            dz  z   S rT   r   )r   cumFrqDs    r   r   z optimizeWidths.<locals>.<lambda>w   rY   r   c                 8    |          |          z   |          z
  S r
   r   )r   	nomnCostD	nomnCostUr8   s    r   r   z optimizeWidths.<locals>.<lambda>x   s    9Q<)A,#>#J r   c                 b    t          |          | dz
           dz  | dz
           dz            S NrU   r3   rV   r4   rF   )r   cumMaxUs    r   r   z optimizeWidths.<locals>.<lambda>{   2    3wqz71S5>!3CWQtV_UVEV#W#W r   c                 b    t          |          | dz            dz  | dz            dz            S r`   ra   )r   cumMaxDs    r   r   z optimizeWidths.<locals>.<lambda>|   rc   r   c                 <    t          |          |                    S r
   ra   )r   	dfltCostD	dfltCostUs    r   r   z optimizeWidths.<locals>.<lambda>}   s    3y|Yq\#B#B r   c                 &    |          |          z
  S r
   r   )r   dfltCostnomnCosts    r   r   z optimizeWidths.<locals>.<lambda>   s    8A;!#< r   c                     |          S r
   r   )r   rN   s    r   r   z optimizeWidths.<locals>.<lambda>   s    Xa[ r   )keyrU   r2   c                 &    t          |           S r
   rC   )r9   r:   r8   s    r   r   z optimizeWidths.<locals>.<lambda>   s    &'7)K)K r   )r5   r   r6   r$   r%   rH   r'   r.   r   rF   r   rG   append)r8   r;   r<   r%   rK   rL   r,   bestCdfltCendsstartsr   r9   rN   r[   rX   re   rb   rj   rg   rh   r:   rk   r]   r^   s   `            @@@@@@@@@@@@r   optimizeWidthsrt   _   s3    	   #!  aQ444194444&v{{}}1gtBxt
uT46""
#
# &S!!!&S!!!&ST222&ST222 RRRRSSRRRRSSJJJJJJKK WWWWXXWWWWXXBBBBBCC <<<<<== v0000111 
'		'	Xg.	.
	YwWS['$,/&  e	 GENgeAg.>>>	QJE 
 GENgeAg.>>>;;u
 WS['$,/&  e	 GENgeAg.>>>	QJE 
 GENgeAg.>>>;;utKKKKKLLLr   Nc                 0   ddl }|                    dt          j                  }|                    ddt
          dd	           |                    d
dddd           |                    |           } | j        D ]}t          |          }|d         }d |j	        
                                D             }| j        rt          |          \  }}nt          |          \  }}t          dt          |          ||t!          |||          fz             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actionr}   hmtxc                     g | ]
}|d          S )r   r   )rD   ms     r   
<listcomp>zmain.<locals>.<listcomp>   s    000QAaD000r   z+glyphs=%d default=%d nominal=%d byteCost=%d)argparseArgumentParsermain__doc__add_argumentstr
parse_argsrw   r   metricsr&   r~   rQ   rt   printrI   r@   )	argsr   parserfontfilefontr   r8   r9   r:   s	            r   r   r      sR    

!
!l "   XvCs    T?-  / / / 	$ } }X			$	f$00$,--//000&	Z -.v667GG$V,,7G5VgwX`agipryXzXz8{{||||} }r   __main__r!   r
   )r   fontTools.ttLibr   collectionsr   operatorr   	functoolsr   dictr   r.   r@   rQ   rt   r   r   sysrI   argvdoctestexittestmodfailedr   r   r   <module>r      sR  A A # " " " " " # # # # # #                $    A%    .  *! ! !:8 8 8t} } } }2 zCMMQ...
#(?7?#$$$ r   