Ë
    ^ã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	d„ Z
 G d	„ d
e«      Zeddfd„Zd„ Zd„ Zd„ Zdd„Zedk(  rPddlZ eej*                  «      dk(  r/ddlZ ej.                   ej0                  «       j2                  «        e«        yy)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                 ó   — d| v r| d   S | d   S )NÚHMTXÚhmtx© )Úfonts    úX/var/www/html/metafoliadorv2/venv/lib/python3.12/site-packages/fontTools/cffLib/width.pyÚ	_get_hmtxr      s   € Ø! T™>ˆ4�‰<Ð;¨t°F©|Ð;ó    c                   ó   — e Zd Zd„ Zd„ Zy)Úmissingdictc                 ó   — || _         y ©N©Úmissing_func)Úselfr   s     r   Ú__init__zmissingdict.__init__   s
   € Ø(ˆÕr   c                 ó$   — | j                  |«      S r   r   )r   Úvs     r   Ú__missing__zmissingdict.__missing__   s   € Ø× Ñ  Ó#Ð#r   N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r      s   „ ò)ó$r   r   Fc                 ó6  ‡‡
‡‡— t        | j                  «       «      }|d   |d   cŠŠ
t        || j                  «       ‰«      Š|rˆ
ˆˆfd„}t	        ‰
‰dz
  d«      }nˆˆˆfd„}t	        ‰‰
dz   «      }t        |«      }‰}|D ]  }	 ||| |	   «      }|||	<   Œ |S )Nr   éÿÿÿÿc                 ó   •— | ‰kD  r‰S ‰S r   r   )ÚxÚmaxxÚstartÚtotals    €€€r   ú<lambda>zcumSum.<locals>.<lambda>%   ó   ø€  Q¨¢X˜E€ °5€ r   é   c                 ó   •— | ‰k  r‰S ‰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   ÚcumSumr5      s¦   û€ Ü�!—&‘&“(Ó€DØ�a‘˜$˜r™(€J€Dˆ$ä�2�q—x‘x“z 5Ó)€EáÝ8ˆÜ�t˜T A™X rÓ*‰å8ˆÜ�t˜T A™XÓ&ˆä
�gÓ
€Cà€AØò ˆÙˆq�!�A‘$‹KˆØˆˆAŠðð €Jr   c                 ó  — t        | d«      s%t        t        «      }| D ]  }||xx   dz  cc<   Œ |} d}| j                  «       D ]:  \  }}||k(  rŒt	        ||z
  «      }|dk  r||z  }Œ%|dk  r	||dz  z  }Œ3||dz  z  }Œ< |S )NÚitemsr(   r   ék   ik  é   é   )Úhasattrr   Úintr7   Úabs)ÚwidthsÚdefaultÚnominalÚdÚwÚcostÚfreqÚdiffs           r   ÚbyteCostrF   5   s§   € Ü�6˜7Ô#ÜœÓˆØò 	ˆAØˆa‹D�A‰IŒDð	àˆà€DØ—<‘<“>ò 	‰ˆˆ4Ø�Š<ØÜ�1�w‘;ÓˆØ�3Š;Ø�D‰L‰DØ�TŠ\Ø�D˜1‘HÑ‰Dà�D˜1‘HÑ‰Dð	ð €Kr   c                 ó¦  ‡ — t        t        «      }‰ D ]  }||xx   dz  cc<   Œ dt        |j                  «       «      z  }t	        ‰ «      t        ‰ «      }}t        t        ||dz   «      «      }t	        ˆ fd„|D «       «      }t        ‰ «      dz  dz   }|D ]6  }	t        ‰ d|	«      ||z   kD  rŒ|D ]  }
t        ‰ |
|	«      }||k  sŒ|}|
}|	}Œ Œ8 fS )zSBruteforce version.  Veeeeeeeeeeeeeeeeery slow.  Only works for smallests of fonts.r(   r:   c              3   ó8   •K  — | ]  }t        ‰d |«      –— Œ y ­wr   ©rF   )Ú.0r@   r>   s     €r   ú	<genexpr>z+optimizeWidthsBruteforce.<locals>.<genexpr>W   s   øè ø€ Ò WÀW¤¨&°$¸×!@Ñ Wùs   ƒN)	r   r<   Úmaxr-   ÚminÚlistr.   ÚlenrF   )r>   rA   rB   ÚmaxDefaultAdvantageÚminwÚmaxwr3   ÚbestCostWithoutDefaultÚbestCostr@   r?   rC   ÚbestDefaultÚbestNominals   `             r   ÚoptimizeWidthsBruteforcerW   J   sõ   ø€ ô 	”CÓ€AØò ˆØ	ˆ!‹�‰	Œðð œc !§(¡(£*›oÑ-Ðä�V“œc &›kˆ$€DÜ”%˜˜d Q™hÓ'Ó(€Fä Ó WÐPVÔ WÓWÐä�6‹{˜Q‰ Ñ"€HØò &ˆÜ�F˜D 'Ó*¨XÐ8KÑ-KÒKØØò 	&ˆGÜ˜F G¨WÓ5ˆDØ�h‹Ø�Ø%�Ø%‘ñ	&ð&ð ˜Ð#Ð#r   c                 ó  ‡ ‡‡‡‡‡‡‡‡‡‡‡‡— t        ‰ d«      s%t        t        «      }‰ D ]  }||xx   dz  cc<   Œ |Š t        ‰ j	                  «       «      }|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(  rP‰‰dz
  ‰dz
  g}
|
D ]?  }‰|   r'‰|   ‰|dz
     k(  r|dz  }‰|   r‰|   ‰|dz
     k(  rŒ|	j                  |«       ŒA nO‰‰dz   ‰dz   g}
|
D ]?  }‰|   r'‰|   ‰|dz      k(  r|dz  }‰|   r‰|   ‰|dz      k(  rŒ|	j                  |«       ŒA t        |	ˆˆ 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.r7   r(   r   r    )r0   T)r0   r1   c                 ó8   •— ‰|    ‰| 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                 ó8   •— ‰|    ‰| dz      z   ‰| dz      dz  z   S rZ   r   )r"   ÚcumFrqDs    €r   r&   z optimizeWidths.<locals>.<lambda>‚   r_   r   c                 ó&   •— ‰|    ‰|    z   ‰|    z
  S r   r   )r"   Ú	nomnCostDÚ	nomnCostUr>   s    €€€r   r&   z optimizeWidths.<locals>.<lambda>„   s   ø€  Y¨q¡\°I¸a±LÑ%@À6È!Á9Ñ%L€ r   c                 óH   •— t        ‰|    ‰| dz
     dz  ‰| dz
     dz  «      S ©Nr[   r9   r\   r:   ©rL   )r"   ÚcumMaxUs    €r   r&   z optimizeWidths.<locals>.<lambda>ˆ   ó0   ø€ ”#�g˜a‘j '¨!¨c©'Ñ"2°QÑ"6¸ÀÀDÁÑ8IÈAÑ8MÓN€ r   c                 óH   •— t        ‰|    ‰| dz      dz  ‰| dz      dz  «      S rf   rg   )r"   ÚcumMaxDs    €r   r&   z optimizeWidths.<locals>.<lambda>‹   ri   r   c                 ó(   •— t        ‰|    ‰|    «      S r   rg   )r"   Ú	dfltCostDÚ	dfltCostUs    €€r   r&   z optimizeWidths.<locals>.<lambda>�   s   ø€ ¤S¨°1©°yÀ±|Ó%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"   rT   s    €r   r&   z optimizeWidths.<locals>.<lambda>“   s   ø€ ¨°©€ r   )Úkeyr[   r\   c                 ó   •— t        ‰| ‰«      S r   rI   )r?   r@   r>   s    €€r   r&   z optimizeWidths.<locals>.<lambda>¥   s   ø€ ¬H°V¸WÀgÓ,N€ r   )r;   r   r<   r+   r,   rN   r.   r5   r   rL   r   rM   Úappend)r>   rA   rB   r,   rQ   rR   r3   ÚbestCÚdfltCÚendsÚstartsr$   r?   rT   ra   r^   rk   rh   rp   rm   rn   r@   rq   rc   rd   s   `            @@@@@@@@@@@@r   r   r   g   sG  ÿü€ ô �6˜7Ô#ÜœÓˆØò 	ˆAØˆa‹D�A‰IŒDð	àˆä�&—+‘+“-Ó €DØ�a‘˜$˜r™(ˆ$€DÜ”%˜˜d Q™hÓ'Ó(€Fô �V¤Ô$€GÜ�V¤Ô$€GÜ�V¤°Ô5€GÜ�V¤°Ô5€Gô ÛGó€Iô ÛGó€Iô ÕLÓM€Hô ÛNó€Iô ÛNó€Iô ÔDÓE€Hô Ô>Ó?€Hô �&Ó3Ô4€Gð �WÑ€EØ�WÑ ¨Ñ 1Ñ1€EØ€DØ�	˜'Ñ"Ò"Ø˜7 S™=¨'°D©.Ð9ˆØò 	ˆEØ˜%’. W¨U¡^°w¸uÀq¹yÑ7IÒ%IØ˜‘
�ð ˜%’. W¨U¡^°w¸uÀq¹yÑ7IÓ%Ià�K‰K˜Õñ	ð
 ˜7 S™=¨'°D©.Ð9ˆØò 	ˆEØ˜%’. W¨U¡^°w¸uÀq¹yÑ7IÒ%IØ˜‘
�ð ˜%’. W¨U¡^°w¸uÀq¹yÑ7IÓ%Ià�K‰K˜Õð	ô �$ÔNÔO€Gà�GÐÐr   Nc                 ó  — ddl }|j                  dt        j                  ¬«      }|j	                  ddt
        dd¬	«       |j	                  d
dddd¬«       |j                  | «      } | j                  D ]‘  }t        |«      }t        |«      }|j                  j                  «       D �cg c]  }|d   ‘Œ	 }}| j                  rt        |«      \  }}	nt        |«      \  }}	t        dt!        |«      ||	t#        |||	«      fz  «       Œ“ yc c}w )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‚   z+glyphs=%d default=%d nominal=%d byteCost=%d)ÚargparseÚArgumentParserr   Ú__doc__Úadd_argumentÚstrÚ
parse_argsr|   r   r   Úmetricsr-   rƒ   rW   r   ÚprintrO   rF   )
Úargsr‡   ÚparserÚfontfiler   r   Úmr>   r?   r@   s
             r   r   r   ª   s  € ó à×$Ñ$Ø Ü—L‘Lð %ó €Fð ×ÑØ˜&¤s°#Ð<Mð ô ð ×ÑØØØØØ3ð ô ð ×Ñ˜TÓ"€Dà—K‘Kò 
ˆÜ�hÓˆÜ˜‹ˆØ $§¡× 3Ñ 3Ó 5Ö6˜1�!�A“$Ð6ˆÐ6Ø�:Š:Ü7¸Ó?ÑˆG‘Wä-¨fÓ5ÑˆG�WÜØ9Ü�6‹{˜G W¬h°v¸wÈÓ.PÐQñRõ	
ñ
ùò 7s   Â(DÚ__main__r(   r   )r‰   ÚfontTools.ttLibr   Úcollectionsr   Úoperatorr   Ú	functoolsr   Ú__all__r   Údictr   r5   rF   rW   r   r   r   ÚsysrO   ÚargvÚdoctestÚexitÚtestmodÚfailedr   r   r   ú<module>r       s    ðñAõ #Ý #Ý Ý à˜VÐ
$€ò<ô$�$ô $ð ˜A¨%ó ò.ò*$ò:@óF!
ðH ˆzÒÛá
ˆ3�8‰8ƒ}˜ÒÛàˆ�‰��—‘Ó"×)Ñ)Ô*Ù…Fð r   