Ë
    £ehº  ã                   ó(  — 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(  rPddlZ eej(                  «      dk(  r/ddlZ ej,                   ej.                  «       j0                  «        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                   ó   — e Zd Zd„ Zd„ Zy)Úmissingdictc                 ó   — || _         y ©N©Úmissing_func)Úselfr   s     úT/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/fontTools/cffLib/width.pyÚ__init__zmissingdict.__init__   s
   € Ø(ˆÕó    c                 ó$   — | j                  |«      S r   r   )r   Úvs     r   Ú__missing__zmissingdict.__missing__   s   € Ø× Ñ  Ó#Ð#r   N)Ú__name__Ú
__module__Ú__qualname__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   ÚcumSumr0      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   Úintr2   Úabs)ÚwidthsÚdefaultÚnominalÚdÚwÚcostÚfreqÚdiffs           r   ÚbyteCostrA   2   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#   r5   c              3   ó8   •K  — | ]  }t        ‰d |«      –— Œ y ­wr   ©rA   )Ú.0r;   r9   s     €r   ú	<genexpr>z+optimizeWidthsBruteforce.<locals>.<genexpr>T   s   øè ø€ Ò WÀW¤¨&°$¸×!@Ñ Wùs   ƒN)	r   r7   Úmaxr(   ÚminÚlistr)   ÚlenrA   )r9   r<   r=   ÚmaxDefaultAdvantageÚminwÚmaxwr.   ÚbestCostWithoutDefaultÚbestCostr;   r:   r>   ÚbestDefaultÚbestNominals   `             r   ÚoptimizeWidthsBruteforcerR   G   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.r2   r#   r   r   )r+   T)r+   r,   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 rU   r   )r   ÚcumFrqDs    €r   r!   z optimizeWidths.<locals>.<lambda>   rZ   r   c                 ó&   •— ‰|    ‰|    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                 óH   •— t        ‰|    ‰| dz
     dz  ‰| dz
     dz  «      S ©NrV   r4   rW   r5   ©rG   )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 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€ 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€ 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   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        |«      }|d   }|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}   Úhmtxz+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‚   Úmr9   r:   r;   s
             r   r   r   §   s  € ó à×$Ñ$Ø Ü—L‘Lð %ó €Fð ×ÑØ˜&¤s°#Ð<Mð ô ð ×ÑØØØØØ3ð ô ð ×Ñ˜TÓ"€Dà—K‘Kò 
ˆÜ�hÓˆØ�F‰|ˆØ $§¡× 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__Údictr
   r0   rA   rR   r   r   r   ÚsysrJ   ÚargvÚdoctestÚexitÚtestmodÚfailedr   r   r   ú<module>r�      s�   ðñAõ #Ý #Ý Ý ð ˜VÐ
$€ô$�$ô $ð ˜A¨%ó ò.ò*$ò:@óF!
ðH ˆzÒÛá
ˆ3�8‰8ƒ}˜ÒÛàˆ�‰��—‘Ó"×)Ñ)Ô*Ù…Fð r   