
    h                     0   S r SSKJr  SSKJr  SSKJr  SSKJr  SS/r	 " S S	\
5      r\SS
4S jrS rS rS rSS jr\S:X  aQ  SSKr\" \R(                  5      S:X  a/  SSKr\R,                  " \R.                  " 5       R0                  5        \" 5         gg)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                        \ rS rSrS rS rSrg)missingdict   c                     Xl         g Nmissing_func)selfr   s     H/var/www/html/env/lib/python3.13/site-packages/fontTools/cffLib/width.py__init__missingdict.__init__   s    (    c                 $    U R                  U5      $ r   r   )r   vs     r   __missing__missingdict.__missing__   s      ##r   r   N)__name__
__module____qualname____firstlineno__r   r   __static_attributes__ r   r   r
   r
      s    )$r   r
   Fc                 B  ^^
^^ [        U R                  5       5      nUS   US   smm
[        XR                  5       T5      mU(       a  U
UU4S jn[	        T
TS-
  S5      nOUUU4S jn[	        TT
S-   5      n[        U5      nTnU H  n	U" XU	   5      nXU	'   M     U$ )Nr   c                    > U T:  a  T$ T$ r   r   )xmaxxstarttotals    r   <lambda>cumSum.<locals>.<lambda>"       QXE858r      c                    > U T:  a  T$ T$ r   r   )r"   minxr$   r%   s    r   r&   r'   %   r(   r   )sortedkeysr   valuesranger
   )fopr$   
decreasingr-   missingdomainoutr   r"   r#   r+   r%   s     `       @@@r   cumSumr6      s    !&&(Da$r(JD$2xxz5)E8tTAXr*8tTAX&
g
CAqA$KA  Jr   c                    [        U S5      (       d&  [        [        5      nU  H  nX4==   S-  ss'   M     Un SnU R                  5        H;  u  pFXA:X  a  M  [	        XB-
  5      nUS::  a  XV-  nM%  US::  a	  XVS-  -  nM4  XVS-  -  nM=     U$ )Nitemsr)   r   k   ik        )hasattrr   intr8   abs)widthsdefaultnominaldwcostfreqdiffs           r   byteCostrG   2   s    67##ADAID D<<><1;3;LDT\1HD1HD " Kr   c                   ^  [        [        5      nT  H  nX==   S-  ss'   M     S[        UR                  5       5      -  n[	        T 5      [        T 5      pT[        [        XES-   5      5      n[	        U 4S jU 5       5      n[        T 5      S-  S-   nU H:  n	[        T SU	5      X-   :  a  M  U H  n
[        T X5      nX:  d  M  UnU
nU	nM     M<     WW4$ )zSBruteforce version.  Veeeeeeeeeeeeeeeeery slow.  Only works for smallests of fonts.r)   r;   c              3   >   >#    U  H  n[        TS U5      v   M     g 7fr   rG   ).0rA   r?   s     r   	<genexpr>+optimizeWidthsBruteforce.<locals>.<genexpr>T   s      WPVW&$!@!@PVs   N)	r   r=   maxr.   minlistr/   lenrG   )r?   rB   rC   maxDefaultAdvantageminwmaxwr4   bestCostWithoutDefaultbestCostrA   r@   rD   bestDefaultbestNominals   `             r   optimizeWidthsBruteforcerY   G   s     	CA		  c!((*o-Vc&k$%Qh'(F  WPV WW6{Q"HFD'*X-KKGFG5D%%   ##r   c                 <  ^ ^^^^^^^^^^^^ [        T S5      (       d&  [        [        5      nT  H  nX==   S-  ss'   M     Um [        T R	                  5       5      nUS   US   pT[        [        XES-   5      5      n[        T [        S9m[        T [        S9m[        T [        SS9m[        T [        SS9m[        U4S j5      m[        U4S	 j5      m[        UUU 4S
 j5      m[        U4S j5      m[        U4S j5      m[        UU4S j5      m[        UU4S j5      m[        UU4S jS9mTT   nTT   TT   -
  n/ n	UTT   :X  a_  TTS-
  TS-
  /n
U
 HM  nTU   (       a/  TU   TUS-
     :X  a   US-  nTU   (       a  TU   TUS-
     :X  a  M   U	R                  U5        MO     O^TTS-   TS-   /n
U
 HM  nTU   (       a/  TU   TUS-      :X  a   US-  nTU   (       a  TU   TUS-      :X  a  M   U	R                  U5        MO     [        U	UU 4S jS9nUT4$ )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.r8   r)   r   r    )r1   T)r1   r2   c                 8   > TU    TU S-
     -   TU S-
     S-  -   $ Nl   l     r   )r"   cumFrqUs    r   r&    optimizeWidths.<locals>.<lambda>|   *    '!*wq3w//'!d(2Ca2GGr   c                 8   > TU    TU S-      -   TU S-      S-  -   $ r\   r   )r"   cumFrqDs    r   r&   ra      rb   r   c                 &   > TU    TU    -   TU    -
  $ r   r   )r"   	nomnCostD	nomnCostUr?   s    r   r&   ra      s    Yq\IaL%@6!9%Lr   c                 H   > [        TU    TU S-
     S-  TU S-
     S-  5      $ Nr]   r:   r^   r;   rN   )r"   cumMaxUs    r   r&   ra      .    #gaj'!c'"2Q"6D8IA8MNr   c                 H   > [        TU    TU S-      S-  TU S-      S-  5      $ ri   rj   )r"   cumMaxDs    r   r&   ra      rl   r   c                 (   > [        TU    TU    5      $ r   rj   )r"   	dfltCostD	dfltCostUs    r   r&   ra      s    S1y|%Dr   c                    > TU    TU    -
  $ r   r   )r"   dfltCostnomnCosts    r   r&   ra      s    Xa[8A;%>r   c                    > TU    $ r   r   )r"   rV   s    r   r&   ra      s	    r   )keyr]   r^   c                    > [        TU T5      $ r   rJ   )r@   rA   r?   s    r   r&   ra      s    HVWg,Nr   )r<   r   r=   r,   r-   rP   r/   r6   r   rN   r
   rO   append)r?   rB   rC   r-   rS   rT   r4   bestCdfltCendsstartsr$   r@   rV   rd   r`   rn   rk   rs   rp   rq   rA   rt   rf   rg   s   `            @@@@@@@@@@@@r   r   r   d   s5    67##ADAID &++- Da$r($%Qh'(F V$GV$GV5GV5G GI GI LMH NI NI DEH >?H &34G WEW 11ED	'""7S='D.9E%.WU^wuqy7I%I
 %.WU^wuqy7I%IKK 
 7S='D.9E%.WU^wuqy7I%I
 %.WU^wuqy7I%IKK  $NOGGr   Nc                    SSK nUR                  S[        R                  S9nUR	                  SS[
        SSS	9  UR	                  S
SSSSS9  UR                  U 5      n U R                   H  n[        U5      nUS   nUR                  R                  5        Vs/ s H  ofS   PM	     nnU R                  (       a  [        U5      u  pO[        U5      u  p[        S[        U5      X[!        XxU	5      4-  5        M     gs  snf )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   hmtxz+glyphs=%d default=%d nominal=%d byteCost=%d)argparseArgumentParserr   __doc__add_argumentstr
parse_argsr   r   metricsr.   r   rY   r   printrQ   rG   )
argsr   parserfontfilefontr   mr?   r@   rA   s
             r   r   r      s    $$ LL % F &s#<M   3   T"DKKhF| $ 3 3 56 51A$ 56::7?GW-f5G96{Ghv.PQR	
   7s   C>__main__r)   r   )r   fontTools.ttLibr   collectionsr   operatorr   	functoolsr   __all__dictr
   r6   rG   rY   r   r   r   sysrQ   argvdoctestexittestmodfailedr   r   r   <module>r      s   A # #   V
$$$ $ A% .*$:@F!
H z
388}"))*F r   