§
    ¢”jº  ã                   ó&  — 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     úe/var/www/finuniver-perm.ru/html/portfolio/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¨¢X X˜E˜E°5€ 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œ(€J€Dˆ$å�2�q—x’x‘z”z 5Ñ)Ô)€Eàð 'Ø8Ð8Ð8Ð8Ð8Ð8ˆÝ�t˜T A™X rÑ*Ô*ˆˆà8Ð8Ð8Ð8Ð8Ð8ˆÝ�t˜T A™XÑ&Ô&ˆå
�gÑ
Ô
€Cà€AØð ð ˆØˆBˆq�!�A”$‰KŒKˆØˆˆ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Ë   € Ý�6˜7Ñ#Ô#ð Ý�ÑÔˆØð 	ð 	ˆAØˆaˆDˆDŒD�A‰IˆDˆD‰DˆDØˆà€DØ—<’<‘>”>ð 	ð 	‰ˆˆ4Ø�Š<ˆ<ØÝ�1�w‘;ÑÔˆØ�3Š;ˆ;Ø�D‰LˆDˆDØ�TŠ\ˆ\Ø�D˜1‘HÑˆDˆDà�D˜1‘HÑˆDˆDØ€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Ð WÀW¥¨&°$¸Ñ!@Ô!@Ð 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 !§(¢(¡*¤*™oœoÑ-Ðå�V‘”�c &™kœkˆ$€DÝ•%˜˜d Q™hÑ'Ô'Ñ(Ô(€Få Ð WÐ WÐ WÐ WÐPVÐ WÑ WÔ WÑWÔWÐå�6‰{Œ{˜Q‰ Ñ"€HØð &ð &ˆÝ�F˜D 'Ñ*Ô*¨XÐ8KÑ-KÒKÐKØØð 	&ð 	&ˆGÝ˜F G¨WÑ5Ô5ˆDØ�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 )zÓGiven 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 ©Nél   él  é   r   )r   ÚcumFrqUs    €r   r!   z optimizeWidths.<locals>.<lambda>|   ó,   ø€ �'˜!”*˜w q¨3¡wÔ/Ñ/°'¸!¸d¹(Ô2CÀaÑ2GÑ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   ø€  Y¨q¤\°I¸a´LÑ%@À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   ø€ •#�g˜a”j '¨!¨c©'Ô"2°QÑ"6¸ÀÀDÁÔ8IÈAÑ8MÑ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   ø€  X¨a¤[°8¸A´;Ñ%>€ 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   ø€ ­H°V¸WÀgÑ,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  øøøøøøøøøøøøø€ õ �6˜7Ñ#Ô#ð Ý�ÑÔˆØð 	ð 	ˆAØˆaˆDˆDŒD�A‰IˆDˆD‰DˆDØˆå�&—+’+‘-”-Ñ Ô €DØ�a”˜$˜rœ(ˆ$€DÝ•%˜˜d Q™hÑ'Ô'Ñ(Ô(€Fõ �V¥Ð$Ñ$Ô$€GÝ�V¥Ð$Ñ$Ô$€GÝ�V¥°Ð5Ñ5Ô5€GÝ�V¥°Ð5Ñ5Ô5€Gõ ØGÐGÐGÐGñô €Iõ ØGÐGÐGÐGñô €Iõ ÐLÐLÐLÐLÐLÐLÑMÔM€Hõ ØNÐNÐNÐNñô €Iõ ØNÐNÐNÐNñô €Iõ ÐDÐDÐDÐDÐDÑEÔE€Hõ Ð>Ð>Ð>Ð>Ð>Ñ?Ô?€Hõ �&Ð3Ð3Ð3Ð3Ð4Ñ4Ô4€Gð �WÔ€EØ�WÔ ¨Ô 1Ñ1€EØ€DØ�	˜'Ô"Ò"Ð"Ø˜7 S™=¨'°D©.Ð9ˆØð 	ð 	ˆEØ˜%”.ð  W¨U¤^°w¸uÀq¹yÔ7IÒ%IÐ%IØ˜‘
�ð ˜%”.ð  W¨U¤^°w¸uÀq¹yÔ7IÒ%IÐ%Ià�KŠK˜ÑÔÐÐð	ð
 ˜7 S™=¨'°D©.Ð9ˆØð 	ð 	ˆEØ˜%”.ð  W¨U¤^°w¸uÀq¹yÔ7IÒ%IÐ%IØ˜‘
�ð ˜%”.ð  W¨U¤^°w¸uÀq¹yÔ7IÒ%IÐ%Ià�KŠK˜ÑÔÐÐÝ�$ÐNÐNÐNÐNÐNÐOÑOÔO€Gà�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Ð6˜1�!�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]  € ð €O€O€Oà×$Ò$Ø Ý”Lð %ñ ô €Fð ×ÒØ˜&¥s°#Ð<Mð ñ ô ð ð ×ÒØØØØØ3ð ñ ô ð ð ×Ò˜TÑ"Ô"€Dà”Kð 
ð 
ˆÝ�hÑÔˆØ�FŒ|ˆØ6Ð6 ¤× 3Ò 3Ñ 5Ô 5Ð6Ñ6Ô6ˆØŒ:ð 	6Ý7¸Ñ?Ô?ÑˆG�W�Wå-¨fÑ5Ô5ÑˆG�WÝØ9Ý�6‰{Œ{˜G W­h°v¸wÈÑ.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ÒÐØ€J€J€Jà
€sˆ3Œ8�}„}˜ÒÐØˆˆˆàˆŒ��”Ñ"Ô"Ô)Ñ*Ô*Ð*Ø€D�F„F€F€F€Fð Ðr   