
    ]Mh                     &   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	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)reduceoptimizeWidthsmainc                       e Zd Zd Zd ZdS )missingdictc                     || _         d S Nmissing_func)selfr   s     V/var/www/html/test/jupyter/venv/lib/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      ###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>"       QXXEE5 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   cumSumr0      s    !&&((Da$r(JD$2qxxzz5))E '888888tTAXr**888888tTAX&&
g

CA  Bq!A$KKAJr   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   ik        )hasattrr   intr2   abs)widthsdefaultnominaldwcostfreqdiffs           r   byteCostrA   2   s    67##  	 	AaDDDAIDDDDD<<>> 	 	4<<1w;3;;DLDDT\\D1HDDD1HDDKr   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#   r5   c              3   :   K   | ]}t          d |          V  d S r   rA   ).0r;   r9   s     r   	<genexpr>z+optimizeWidthsBruteforce.<locals>.<genexpr>T   s/       W WW&$!@!@ W W W W W Wr   N)	r   r7   maxr(   minlistr)   lenrA   )r9   r<   r=   maxDefaultAdvantageminwmaxwr.   bestCostWithoutDefaultbestCostr;   r:   r>   bestDefaultbestNominals   `             r   optimizeWidthsBruteforcerR   G   s5    	CA  	!	 c!((**oo-Vc&kk$D%dQh''((F  W W W WPV W W WWW6{{Q"H & &FD'**X8K-KKK 	& 	&GFGW55Dh%%	& ##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.r2   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>|   ,    '!*wq3w//'!d(2Ca2GG r   c                 J    |          | dz            z   | dz            dz  z   S rU   r   )r   cumFrqDs    r   r!   z optimizeWidths.<locals>.<lambda>   rZ   r   c                 8    |          |          z   |          z
  S r   r   )r   	nomnCostD	nomnCostUr9   s    r   r!   z optimizeWidths.<locals>.<lambda>   s    Yq\IaL%@6!9%L r   c                 b    t          |          | dz
           dz  | dz
           dz            S NrV   r4   rW   r5   rG   )r   cumMaxUs    r   r!   z optimizeWidths.<locals>.<lambda>   3    #gaj'!c'"2Q"6D8IA8MNN r   c                 b    t          |          | dz            dz  | dz            dz            S ra   rb   )r   cumMaxDs    r   r!   z optimizeWidths.<locals>.<lambda>   rd   r   c                 <    t          |          |                    S r   rb   )r   	dfltCostD	dfltCostUs    r   r!   z optimizeWidths.<locals>.<lambda>   s    S1y|%D%D r   c                 &    |          |          z
  S r   r   )r   dfltCostnomnCosts    r   r!   z optimizeWidths.<locals>.<lambda>   s    Xa[8A;%> r   c                     |          S r   r   )r   rO   s    r   r!   z optimizeWidths.<locals>.<lambda>   s     r   )keyrV   rW   c                 &    t          |           S r   rD   )r:   r;   r9   s    r   r!   z optimizeWidths.<locals>.<lambda>   s    HVWg,N,N r   )r6   r   r7   r&   r'   rI   r)   r0   r   rG   r
   rH   append)r9   r<   r=   r'   rL   rM   r.   bestCdfltCendsstartsr   r:   rO   r\   rY   rf   rc   rk   rh   ri   r;   rl   r^   r_   s   `            @@@@@@@@@@@@r   r   r   d   sK    67##  	 	AaDDDAIDDDD&++--  Da$r($D%dQh''((F V$$$GV$$$GV555GV555G GGGG I GGGG I LLLLLLMMH NNNN I NNNN I DDDDDEEH >>>>>??H &3333444G WEW 11ED	'"""7S='D.9 	 	E%. WU^wuqy7I%I%I
 %. WU^wuqy7I%I%IKK	
 7S='D.9 	 	E%. WU^wuqy7I%I%I
 %. WU^wuqy7I%I%IKK$NNNNNOOOGG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   )rE   ms     r   
<listcomp>zmain.<locals>.<listcomp>   s    6661!A$666r   z+glyphs=%d default=%d nominal=%d byteCost=%d)argparseArgumentParserr   __doc__add_argumentstr
parse_argsrw   r   metricsr(   r~   rR   r   printrJ   rA   )	argsr   parserfontfilefontr   r9   r:   r;   s	            r   r   r      s]    OOO$$ L %  F &s#<M     3     T""DK 
 
hF|66 3 3 5 5666: 	67??GWW-f55GW96{{GWhvw.P.PQR	
 	
 	
 	

 
r   __main__r#   r   )r   fontTools.ttLibr   collectionsr   operatorr   	functoolsr   __all__dictr
   r0   rA   rR   r   r   r   sysrJ   argvdoctestexittestmodfailedr   r   r   <module>r      s^  A A # " " " " " # # # # # #             V
$$ $ $ $ $$ $ $ $ A%    .  *$ $ $:@ @ @F!
 !
 !
 !
H zJJJ
s38}}"")***DFFFFF r   