
    h^                        S SK JrJr  S SKJr  S SKJr  S SKJ	r	  S SK
JrJrJrJr  S SKJr  S SKJr  S SKJrJr  \R,                  r\\R.                  l        S	 r " S
 S\5      r\S.S jr\\R:                  l        S r\\R@                  l!        S r"\"\R.                  l#         " S S\5      r$SS\%" 5       4SS.S jjr&\&\R.                  l'        SSS.S jr(\(\R.                  l)        S r*S r+S r,\,\RZ                  l.        \,\R^                  l.        S r0S r1\1\RZ                  l2        \1\R^                  l2         " S S \5      r3 " S! S"\45      r5S(S$ jr6\6\R.                  l7        S)S& jr8\9S':X  aa  S S%K:r:\;" \:Rx                  5      S#:  a  \:Rz                  " \8" 5       5        S S%K>r>\:Rz                  " \>R~                  " 5       R                  5        g%g%)*    )noRoundotRound	bit_count)otTables)supportScalar)buildVarRegionListbuildVarStorebuildVarRegionbuildVarData)partial)defaultdict)heappushheappopc                 F    [        [        U R                  5       S S95      $ )Nc                     U S   $ Nr    )kvs    K/var/www/html/env/lib/python3.13/site-packages/fontTools/varLib/varStore.py<lambda>!_getLocationKey.<locals>.<lambda>   s    BqE    key)tuplesorteditems)locs    r   _getLocationKeyr       s    		)9:;;r   c                   r    \ rS rSrS rS rS rSS jrSS jr\	S.S jr
\	S.S	 jr\	S.S
 jr\	S.S jrSrg)OnlineVarStoreBuilder   c                     Xl         0 U l        [        / U5      U l        [	        U R                  / 5      U l        S U l        S U l        S U l        0 U l	        0 U l
        S U l        g N)	_axisTags
_regionMapr	   _regionListr
   _store_data_model	_supports_varDataIndices_varDataCaches_cache)selfaxisTagss     r   __init__OnlineVarStoreBuilder.__init__   s]    !-b(;#D$4$4b9
! r   c                 F    U R                  UR                  5        Xl        g r%   )setSupportssupportsr+   )r0   models     r   setModelOnlineVarStoreBuilder.setModel%   s    (r   c                     S U l         [        U5      U l        U R                  (       a!  U R                  S   (       d  U R                  S	 S U l        S U l        g r   )r+   listr,   r/   r*   )r0   r6   s     r   r5   !OnlineVarStoreBuilder.setSupports)   s@    h>>$.."3q!
r   c                 ^   [        U R                  R                  5      U R                  l        [        U R                  R
                  5      U R                  l        U R                  R
                   H,  n[        UR                  5      Ul        UR                  US9  M.     U R                  $ )Noptimize)
lenr(   RegionRegionCountr)   VarDataVarDataCountItem	ItemCountcalculateNumShorts)r0   r?   datas      r   finishOnlineVarStoreBuilder.finish1   s|    '*4+;+;+B+B'C$#&t{{':':#; KK''D ^DN##X#6 ( {{r   c                    U R                   nU R                  nU R                  n/ nU H|  n[        U5      nUR	                  U5      nUcI  [        X`R                  5      n	[        UR                  5      =oU'   UR                  R                  U	5        UR                  U5        M~     [        U5      nU R                  R	                  U5      n
U
b`  Xl        U R                  R                  U
   U l        U R                   U   U l        [        U R                  R$                  5      U-   S:  a  S n
U
c  ['        U/ SS9U l        [        U R                  R                  5      U l        U R                  R                  R                  U R                  5        U R                  U R                  U'   XpR                   ;  a  0 U R                   U'   U R                   U   U l        g g )N  Fr>   )r'   r(   r,   r    getr   r&   r@   rA   appendr   r-   _outerr)   rC   r*   r.   r/   rE   r   )r0   	num_items	regionMap
regionListregionsregionIndicesregionr   idx	varRegion
varDataIdxs              r   _add_VarData"OnlineVarStoreBuilder._add_VarData9   s   OO	%%
..F!&)C--$C{*6>>B	'*:+<+<'==n!!((3  %  M"))--c2
!$K,,Z8DJ--c2DK4::??#i/&8!
%mR%HDJdkk112DKKK&&tzz2(,D  %---+-##C(--c2DK r   roundc                    U R                   R                  XS9nUR                  S5      nX@R                  U[        S94$ Nr[   r   )r+   	getDeltaspopstoreDeltasr   )r0   master_valuesr\   deltasbases        r   storeMasters"OnlineVarStoreBuilder.storeMasters\   s?    &&}&Bzz!}%%fG%<<<r   c                    U Vs/ s H  nU R                   R                  X2S9PM     nnU Vs/ s H  oUR                  S5      PM     nnX`R                  U[        S94$ s  snf s  snf r^   )r+   r_   r`   storeDeltasManyr   )r0   master_values_listr\   rb   deltas_listrc   	base_lists          r   storeMastersMany&OnlineVarStoreBuilder.storeMastersManya   su     "4
!3 KK!!-!=!3 	 
 2==vZZ]	=..{'.JJJ
 >s
   #AA$c                   U Vs/ s H
  o2" U5      PM     nn[        U5      [        U R                  5      S-   :X  a  [        USS  5      nO/[        U5      [        U R                  5      :X  d   e[        U5      nU R                  (       d  U R	                  5         U R
                  R                  U5      nUb  U$ [        U R                  R                  5      nUS:X  a$  U R	                  5         U R                  U[        S9$ U R                  R                  U[        S9  U R                  S-  U-   nX@R
                  U'   U$ s  snf )N   rL   r[      )r@   r,   r   r*   rY   r/   rM   rE   ra   r   addItemrO   )r0   rc   r\   dvarIdxinners         r   ra   !OnlineVarStoreBuilder.storeDeltasi   s   $*+Fq%(F+v;#dnn-116!":&Fv;#dnn"55556]Fzz(MDJJOO$F?##F'#::

61++#u,$F/ ,s   Ec          
         U VVs/ s H  o3 Vs/ s H
  oB" U5      PM     snPM     nnn[        S U 5       5      nU R                  (       d  U R                  [        U5      5        U R                  R                  U5      nUb  U$ [        U R                  R                  5      nU[        U5      -   S:  a.  U R                  [        U5      5        U R                  U[        S9$ [        U5       HF  u  psU R                  R                  U[        S9  U R                  S-  U-   U-   nXPR                  U'   MH     U R                  S-  U-   nXPR                  U'   U$ s  snf s  snnf )Nc              3   8   #    U  H  n[        U5      v   M     g 7fr%   )r   ).0rc   s     r   	<genexpr>8OnlineVarStoreBuilder.storeDeltasMany.<locals>.<genexpr>   s     DfE&MMs   rL   r[   rp   )r   r*   rY   r@   r/   rM   rE   rh   r   	enumeraterq   rO   )r0   rj   r\   rc   rr   rs   rt   is           r   rh   %OnlineVarStoreBuilder.storeDeltasMany   s7   @KLf&1&Qa&1LDDDzzc+./-MDJJOO$3{##f,c+./''7'CC";/IAJJvW5kkR'5014F"(KK	 0 ++#u,#)K 1 2Ls   	E"EE"E")r&   r/   r*   r+   rO   r(   r'   r)   r,   r.   r-   N)T)ro   )__name__
__module____qualname____firstlineno__r2   r8   r5   rI   rY   r\   re   rl   ra   rh   __static_attributes__r   r   r   r"   r"      sK    
!3F 49 =
 =B K ,1 4 5:  r   r"   r[   c                4   U Vs/ s H
  o2" U5      PM     nnU R                   n[        U5      nUS-   U:X  a  [        USS  5      nOXE:X  d   XE45       e[        U5      nU R                  R	                  U5        [        U R                  5      U l        g s  snf Nro   )VarRegionCountr@   r;   rE   rN   rF   )r0   rc   r\   rr   countUs	countThems         r   VarData_addItemr      s     &'1eAhF'!!GFI{ifQRj!#9g%99#fIIV^DN (s   Bc                     [        U R                  5       VVs0 s HG  u  p#UR                  S:w  d  M  X   R                  UR                  UR                  UR
                  4_MI     snn$ s  snnf r   )r{   VarRegionAxis	PeakCoordaxisTag
StartCoordEndCoord)r0   	fvar_axesr|   regs       r   VarRegion_get_supportr      se       2 233FA==A 	L	s~~s}}cllKK3  s
   A+4A+c                 ,    [        U R                  5      $ r%   )boolrC   r0   s    r   VarStore___bool__r      s    r   c                   N    \ rS rSr0 4S jrS rS rS r\S 5       r	S r
S rS	rg
)VarStoreInstancer   c                     X l         Ub  UR                  S:X  d   eU(       a  UR                  O/ U l        U(       a  UR                  R
                  O/ U l        U R                  U5        g r   )r   FormatrC   _varDataVarRegionListrA   _regionssetLocation)r0   varstorer   locations       r   r2   VarStoreInstancer.__init__   sT    "8??a#777,4(("9A..55r"r   c                 D    [        U5      U l        U R                  5         g r%   )dictr   _clearCaches)r0   r   s     r   r   VarStoreInstancer.setLocation   s    Xr   c                     0 U l         g r%   )_scalarsr   s    r   r   VarStoreInstancer._clearCaches   s	    r   c                     U R                   R                  U5      nUcL  U R                  U   R                  U R                  5      n[        U R                  U5      nX R                   U'   U$ r%   )r   rM   r   get_supportr   r   r   )r0   	regionIdxscalarsupports       r   
_getScalarVarStoreInstancer._getScalar   sY    ""9->mmI.::4>>JG"4==':F'-MM)$r   c                 R    Sn[        X5       H  u  p4U(       d  M  X#U-  -  nM     U$ )N        )zip)rc   scalarsdeltarr   ss        r   interpolateFromDeltasAndScalars1VarStoreInstancer.interpolateFromDeltasAndScalars   s0    (DAUNE ) r   c                     US-	  US-  p2U[         :X  a  gU R                  nXB   R                   Vs/ s H  oPR                  U5      PM     nnXB   R                  U   nU R                  Xv5      $ s  snf )Nrp   rL   r   )NO_VARIATION_INDEXr   VarRegionIndexr   rE   r   )r0   varidxmajorminorvarDatarir   rc   s           r   __getitem__VarStoreInstancer.__getitem__   st    |Vf_u''--181N1NO1N2??2&1NO$$U+33FDD Ps   A/c                     U R                   nX1   R                   Vs/ s H  o@R                  U5      PM     nnU R                  X%5      $ s  snf r%   )r   r   r   r   )r0   varDataIndexrc   r   r   r   s         r   interpolateFromDeltas'VarStoreInstancer.interpolateFromDeltas   sH    --181F1U1UV1U2??2&1UV33FDD Ws   A
)r   r   r   r   r   N)r~   r   r   r   r2   r   r   r   staticmethodr   r   r   r   r   r   r   r   r      s9    57 #  EEr   r   TFrC   )rC   c          	         [        [        5      nU H,  nU[        :X  a  M  US-	  nUS-  n	Xh   R                  U	5        M.     A[	        X5      n
/ n[        [        0n[        U
5       GH:  u  pUR                  U5      nUc  M  [        U5      nUR                  U5        UR                  n/ nUS:X  aR  U(       aK  [        [        U5      5       H2  n	UR                  X;   a  UU	   OS/[        UU	   5      -  5        XU	'   M4     OcUS:X  a  [        U5      [        X-
  5      -   nO[        U5      nU H2  n	[        U5      nUR                  UU	   5        US-  U-   XS-  U	-   '   M4     UUl	        [        UR                  5      Ul        US:X  d  GM+  UR                  US9  GM=     [        XU5        [        XS-   [        U5      5        U R                  5         U$ )Nrp   rL   r   rC   r>   Count)r   setr   addgetattrr{   rM   r@   rN   rE   ranger   rF   rG   setattrprune_regions)r0   varIdxesr?   retainFirstMapadvIdxesrC   usedrs   r   r   r   
newVarData
varDataMaprH   
usedMinorsnewMajorr   newItemsminorsnewMinors                       r   VarStore_subset_varidxesr      s    sD''"  	 d$GJ$&89J )XXe_
z?$		A:.s5z*$)$7E%LaS3uU|CT=T %*5!	 + z)F:3H,II
+x=e-5=^x4O
RK501  
 	TYYi##X#6; *> D:&DG#S_5r   r   )rC   r   c                   [        5       n[        X5       H  nUR                  UR                  5        M      [        X5      nUR                  n/ n0 n[        U5       H#  n	[        U5      X'   UR                  Xi   5        M%     Xul        [        UR                  5      Ul        [        X5       H'  nUR                   V	s/ s H  oU	   PM	     sn	Ul        M)     gs  sn	f )zRemove unused VarRegions.N)	r   r   updater   rA   r   r@   rN   rB   )
r0   rC   r   usedRegionsrH   rR   rS   
newRegionsrQ   r|   s
             r   VarStore_prune_regionsr   <  s     %K&4../ ' -JGJIK :	'*% ! # !2!23J&595H5HI5H|5HI 'Is   Cc                    [        U 5      [        R                  :X  a	  U" U 5        g[        U [        5      (       a  U  H  n[        X!5        M     g[        U S5      (       aO  [        U S5      (       d>  U R                  5        H)  n[        XR                  S5      nUc  M  [        X!5        M+     g[        U [        R                  5      (       a-  U R                  R                  5        H  n[        X!5        M     gg)zmRecurse down from self, if type of an object is ot.Device,
call func() on it.  Works on otData-style classes.getConverterspostReadN)typeotDevice
isinstancer;   _visithasattrr   r   nameValueRecord__dict__values)r0   functhatconvs       r   r   r   X  s     DzRYYT
	D$		D4  
	'	'j0I0I&&(D4D1Dt" )
 
D"..	)	)MM((*D4 + 
*r   c                 |    U R                   S:X  a,  UR                  U R                  S-  U R                  -   5        gg)z6Add VarIdx in this Device table (if any) to the set s.   rp   N)DeltaFormatr   	StartSizeEndSize)r0   r   s     r   _Device_recordVarIdxr   n  s3    6!	t~~#t||34 "r   c                 6    [        [        US9n[        X5        g )N)r   )r   r   r   )r0   varidxesadders      r   Object_collect_device_varidxesr   t  s    (H5E
4r   c                     [        U 5      U;   a  gUR                  [        U 5      5        U R                  S:X  a3  XR                  S-  U R                  -      nUS-	  U l        US-  U l        gg)z9Map VarIdx in this Device table (if any) through mapping.Nr   rp   rL   )idr   r   r   r   )r0   mappingdoners   s       r   _Device_mapVarIdxr   }  sd    	$x4HHRX6!..B.$,,>?2 "r   c                 H    [        [        U[        5       S9n[        X5        g )N)r   r   )r   r   r   r   )r0   varidxes_mapmappers      r   Object_remap_device_varidxesr    s    &35IF
4r   c                   R    \ rS rSrS rS rS rS r\S 5       r	\S 5       r
S rS	rg
)	_Encodingi  c                     Xl         [        U5      U l        U R                  U5      U l        U R                  U R                  5      U l        [        5       U l        g r%   )	charsr   width_columnscolumns_characteristic_overheadoverheadr   r   )r0   r  s     r   r2   _Encoding.__init__  sB    
u%
}}U+55dllCU
r   c                 :    U R                   R                  U5        g r%   )r   r   )r0   rows     r   rN   _Encoding.append  s    

sr   c                 :    U R                   R                  U5        g r%   )r   r   )r0   lsts     r   extend_Encoding.extend  s    

#r   c                 2    U R                   U R                  4$ r%   )r  r  r   s    r   width_sort_key_Encoding.width_sort_key  s    zz4::%%r   c                 ,    SnU[        U 5      S-  -  nU$ )zGReturns overhead in bytes of encoding this characteristic
as a VarData.
      r   )r	  cs     r   r
  "_Encoding._characteristic_overhead  s"     	Yw!##r   c                 ^    SnSnU (       a!  U S-  (       a  X-  nU S-  n US-  nU (       a  M!  U$ )Nr   ro         r   )r  colsr|   s      r   r  _Encoding._columns  s=    v~	aKE!GA	 e
 r   c                 x   UR                   U R                   -  n[        U5      nU R                  UR                  -  n[        R	                  U5      nU R
                  7UR
                  -   U-
  X0R                  -
  [        U R                  5      -  -
  X1R                  -
  [        UR                  5      -  -
  nU$ r%   )	r  r   r	  r  r
  r  r  r@   r   )r0   other_encodingcombined_charscombined_widthcombined_columnscombined_overheadcombined_gains          r   gain_from_merging_Encoding.gain_from_merging  s    '--

:">2<<.*@*@@%>>?OP]]N%%&  

*c$**o=>  4 44N<P<P8QQ	R 	 r   )r  r	  r   r  r  N)r~   r   r   r   r2   rN   r  r  r   r
  r  r(  r   r   r   r   r  r    sC    &    r   r  c                   0    \ rS rSrS rS r\S 5       rSrg)_EncodingDicti  c                 $    [        U5      =o U'   U$ r%   )r  )r0   r  rs      r   __missing___EncodingDict.__missing__  s    #E**Kr   c                 L    U R                  U5      nX   R                  U5        g r%   )_row_characteristicsrN   )r0   r  r  s      r   add_row_EncodingDict.add_row  s"    ))#.3r   c                    SnSnSnU  H<  nU(       a  X#-  nSUs=::  a  S::  d	  O  X#S-  -  nSUs=::  a  S::  d  O  S	n  O	US
-  nM>     U(       a6  SnSnU  H,  nU(       a  X#S-  -  nSUs=::  a  S::  d	  O  X#S-  -  nUS
-  nM.     U$ )z+Returns encoding characteristics for a row.Fr   ro   i   r  i i  Tr        r   )r  	longWordsr  r|   vs        r   r1  "_EncodingDict._row_characteristics  s     	A
A$$V#a(5( 	!GA  EAZ'E!,u,Z'Ea  r   r   N)	r~   r   r   r   r.  r2  r   r1  r   r   r   r   r+  r+    s        r   r+  ro   c           
      	   [        U R                  R                  5      nS/U-  n0 n[        5       n[	        U R
                  5       H  u  pxUR                  n	[	        UR                  5       H  u  p[        U5      nUS:X  a!  [        X5       H  u  pX==   U-  ss'   M     O.[        X5       H  u  pX==   [        X-  5      U-  -  ss'   M!     [        U5      nU(       a  [        U5      (       d  SXWS-  U
-   '   M  UR                  U5        XUS-  U
-   '   M     M     [        UR                  5       [         R"                  S9nA/ n[	        U5       HS  u  nn[%        US-   [        U5      5       H1  nUU   nUR'                  U5      nUS:  d  M!  [)        UU* UU45        M3     MU     U(       Ga%  [+        U5      u  nnnUU   b  UU   c  M%  UU   UU   nnSu  UU'   UU'   UR,                  UR,                  -  n[!        U5      nUR/                  UR0                  5        UR/                  UR0                  5        [	        U5       Ho  u  nnUc  M  UR,                  U:X  a"  UR/                  UR0                  5        SUU'   M=  UR'                  U5      nUS:  d  MV  [)        UU* U[        U5      45        Mq     UR3                  U5        U(       a  GM%  U Vs/ s H
  nUc  M  UPM     nn0 nUR5                  [         R"                  S9  / U l        U H  n[        UR0                  5      nU(       d  M!  [        U R
                  5      n[6        R
                  " 5       nU R
                  R3                  U5        [%        U5      Ul        [        UR                  5      Ul        USS USS sUl        n[	        UR                  5       H  u  pUS-  U
-   UU'   M     U(       a  M  M     [:        [:        0nUR1                  5        H  u  nnUb  UU   O[:        UU'   M     [        U R                  R                  5      U R                  l        [        U R
                  5      U l        U R
                   H-  n[        UR                  5      Ul         URC                  5         M/     U RE                  5         U$ s  snf )z@Optimize storage. Returns mapping from old VarIdxes to new ones.r   ro   Nrp   r   )NNrL   )#r@   r   rA   r+  r{   rC   r   rE   r;   r   r\   r   anyr2  r   r   r  r  r   r(  r   r   r  r  r   rN   sortr   r   r   rB   rD   rF   r?   r   )r0   use_NO_VARIATION_INDEXquantizationnzeroesfront_mapping	encodingsr   rH   rT   r   itemr  r   r9  todoheapr|   encodingjr"  combining_gain_r#  combined_encodingkencback_mappingr   
varidx_maps                                 r   VarStore_optimizerP    sI   X 	D%%&AS1WFMI !.++$TYY/KEv,Cq $'$<LINa'N %= %($<LINa./,>N %=
 *C%c#hh7;{e34c"365B;%/0' 0 /2 )""$)*B*BCD D 8q1uc$i(A!!WN%77GN!A67	 ) ' $-1a7?d1go#'7DG.%Qa (-->%n5  0  !5!56oFAs{ yyN*!((3Q.@@EN!CI>? & 	%&; $> +/G$h($IG LNNy//N0DLx~~&e%E::<DLL%"'(D"%d&9&9":D  %Wf~uVW~DIu(3&+rkU%:T"  4 e " %&89J##%1+,=Q>P
1 & &)););)B)B%CD"DLL)DTYY 
 	K Hs   R>*R>Nc                 H   SSK Jn  SSKJn  SSKJn  SSKJn  U" S[        R                  S9nUR                  S[        S	S
9  UR                  S5        UR                  SSS9  UR                  U 5      nU" SS9  UR                  nUR                  nUR                  n	U" U5      n
U
S   nUR                   R"                  nU" 5       nUR%                  X5        ['        UR)                  5       5      n[+        SU-  5        UR-                  US9nU" 5       nUR%                  X5        ['        UR)                  5       5      n[+        SU-  5        U	bQ  UR                   R/                  U5        SU
;   a  U
S   R                   R/                  U5        U
R1                  U	5        gg)z&Optimize a font's GDEF variation storer   )ArgumentParser)configLogger)TTFont)OTTableWriterzvarLib.varStore)progdescriptionz--quantizationro   )r   defaultfontfileoutfile?)nargsINFO)levelGDEFzBefore: %7d bytes)r?  zAfter:  %7d bytesNGPOS)argparserR  	fontToolsrS  fontTools.ttLibrT  fontTools.ttLib.tables.otBaserU  main__doc__add_argumentint
parse_argsr?  rY  rZ  tableVarStorecompiler@   
getAllDataprintr?   remap_device_varidxessave)argsrR  rS  rT  rU  parseroptionsr?  rY  rZ  fontgdefstorewritersizerO  s                   r   re  re    sq   '&&;!2MF
(sA>

#
	-%G v''LHooG(D<DJJE_F	MM&v  "#D	

$%\:J_F	MM&v  "#D	

$%

((4T>L44Z@		' r   __main__)Tro   r%   )AfontTools.misc.roundToolsr   r   fontTools.misc.intToolsr   fontTools.ttLib.tablesr   r   fontTools.varLib.modelsr   fontTools.varLib.builderr	   r
   r   r   	functoolsr   collectionsr   heapqr   r   r   rk  r    objectr"   r\   r   rC   rq   r   	VarRegionr   r   __bool__r   r   r   subset_varidxesr   r   r   r   r   r_  collect_device_varidxesr`  r   r  ro  r  r   r+  rP  r?   re  r~   sysr@   argvexitdoctesttestmodfailedr   r   r   <module>r     s   6 - 1 1   # # ** !3 <DF DN ,1 $ %

  1  ) ,E ,Er U> >B 7  -6_ J2 3 ,5
 #A "@ '
 !=  < 0 0f%D %P~B ) )X z
388}qHHW__%%& r   