
    <`A                        d dl mZmZ d dlmZ d dlmZ d dlm	Z	m
Z
mZmZ d dlmZ d dlmZ d Z G d d	e          Zed
dZeej        _        d Zeej        _         G d de          Zdd e            fdZeej        _        d Z e ej        _!        d Z"d Z#d Z$e$ej%        _&        e$ej'        _&        d Z(d Z)e)ej%        _*        e)ej'        _*         G d de          Z+ G d de,          Z-d Z.e.ej        _/        d!dZ0e1dk    rXd dl2Z2 e3e2j4                  d k    r e2j5         e0                       d dl6Z6 e2j5         e6j7                    j8                   dS dS )"    )noRoundotRound)otTables)supportScalar)buildVarRegionListbuildVarStorebuildVarRegionbuildVarData)partial)defaultdictc                 d    t          t          |                                 d                     S )Nc                     | d         S Nr    )kvs    9lib/python3.11/site-packages/fontTools/varLib/varStore.py<lambda>z!_getLocationKey.<locals>.<lambda>   s
    A     key)tuplesorteditems)locs    r   _getLocationKeyr   
   s)    fSYY[[&6&6777888r   c                   @    e Zd Zd Zd Zd ZddZd Zd Ze	dd	Z
d
S )OnlineVarStoreBuilderc                     || _         i | _        t          g |          | _        t	          | j        g           | _        d | _        d | _        d | _        i | _	        i | _
        i | _        d S N)	_axisTags
_regionMapr   _regionListr   _store_data_model	_supports_varDataIndices_varDataCaches_cache)selfaxisTagss     r   __init__zOnlineVarStoreBuilder.__init__   sf    $.$/'H55$d.33$+$*$+$.$$$+++r   c                 H    |                      |j                   || _        d S r   )setSupportssupportsr%   )r*   models     r   setModelzOnlineVarStoreBuilder.setModel   s#    5>"""$+++r   c                     d | _         t          |          | _        | j        d         s| j        d= i | _        d | _        d S r   )r%   listr&   r)   r$   )r*   r/   s     r   r.   z!OnlineVarStoreBuilder.setSupports    sA    $+>>$.		 ~a$+$***r   Tc                    t          | j        j                  | j        _        t          | j        j                  | j        _        | j        j        D ]1}t          |j                  |_        |	                    |           2| j        S )Noptimize)
lenr"   RegionRegionCountr#   VarDataVarDataCountItem	ItemCountcalculateNumShorts)r*   r6   datas      r   finishzOnlineVarStoreBuilder.finish(   sw    !$T%5%<!=!=$ !455$+k! . .d	NN4>H----	r   c                 Z   | j         }| j        }| j        }g }|D ]}t          |          }|                    |          }|Ht          || j                  }t          |j                  x}||<   |j        	                    |           |	                    |           t          |          }| j                            |          }	|	O|	| _        | j        j        |	         | _        | j        |         | _        t          | j        j                  dk    rd }	|	t'          |g d          | _        t          | j        j                  | _        | j        j        	                    | j                   | j        | j        |<   || j        vr
i | j        |<   | j        |         | _        d S d S )N  Fr5   )r!   r"   r&   r   getr	   r    r7   r8   appendr   r'   _outerr#   r:   r$   r(   r)   r<   r
   )
r*   	regionMap
regionListregionsregionIndicesregionr   idx	varRegion
varDataIdxs
             r   _add_VarDataz"OnlineVarStoreBuilder._add_VarData0   s   o)*N'-  f		 	 3	s		3	kvt~66Iz0111C)C.Y''' 	m##'',,*4;#J/4:$S)4;	$*/f$$J]B???4:T[())4;;dj)))#{4	$$$!D$S)4;;; r   c                     | j                             |t                    }|                    d          }||                     |t
                    fS )Nroundr   )r%   	getDeltasrQ   popstoreDeltasr   )r*   master_valuesdeltasbases       r   storeMastersz"OnlineVarStoreBuilder.storeMastersT   sI    ;  e <<&	A$	tg66	66r   rP   c                   fd|D             }t          |          t          | j                  dz   k    rt          |dd                    }n6t          |          t          | j                  k    sJ t          |          }| j                            |          }||S | j        s|                                  t          | j        j                  }|dk    r)|                                  |                     |          S | j        	                    |t                     | j        dz  |z   }|| j        |<   |S )Nc                 &    g | ]} |          S r   r   .0drQ   s     r   
<listcomp>z5OnlineVarStoreBuilder.storeDeltas.<locals>.<listcomp>Z   s!    %%%EE!HH%%%r      rB   rP      )r7   r&   r   r)   rC   r$   rN   r<   rT   addItemr   rE   )r*   rV   rQ   varIdxinners     `  r   rT   z!OnlineVarStoreBuilder.storeDeltasY   s6   %%%%f%%%&[[C''!+++&*66
f++T^,,
,
,
,
,&MM6;??6""&
=	 
djo

%
f__


6
"
""*V7+++K2&&$+f	-r   N)T)__name__
__module____qualname__r,   r1   r.   r@   rN   rX   rQ   rT   r   r   r   r   r      s        
 
 
       !* !* !*H7 7 7
 ).       r   r   rP   c                T   fd|D             }| j         }t          |          }|dz   |k    rt          |dd                    }n!||k    sJ ||f            t          |          }| j                            t          |                     t          | j                  | _        d S )Nc                 &    g | ]} |          S r   r   r[   s     r   r^   z#VarData_addItem.<locals>.<listcomp>s   s!    
$
$
$5588
$
$
$r   r_   )VarRegionCountr7   r   r<   rD   r3   r=   )r*   rV   rQ   countUs	countThems     `  r   VarData_addItemrl   r   s    
$
$
$
$V
$
$
$[[aK9&&	I			3			==&$v,,di..r   c                 D    fdt          | j                  D             S )Nc                 l    i | ]0\  }}|j         d k    |         j        |j        |j         |j        f1S )r   )	PeakCoordaxisTag
StartCoordEndCoord)r\   ireg	fvar_axess      r   
<dictcomp>z)VarRegion_get_support.<locals>.<dictcomp>   sJ     	 	 	a]a A,clCr   )	enumerateVarRegionAxis)r*   ru   s    `r   VarRegion_get_supportry      s9    	 	 	 	$,--	 	 	 r   c                   L    e Zd Zi fdZd Zd Zd Zed             Zd Z	d Z
dS )	VarStoreInstancerc                     || _         ||j        dk    sJ |r|j        ng | _        |r|j        j        ng | _        |                     |           d S Nr_   )ru   Formatr:   _varDataVarRegionListr8   _regionssetLocation)r*   varstoreru   locations       r   r,   zVarStoreInstancer.__init__   sf    $.		X_1111&.6(""B$-3;C((//$-8r   c                 V    t          |          | _        |                                  d S r   )dictr   _clearCaches)r*   r   s     r   r   zVarStoreInstancer.setLocation   s'    x..$-r   c                     i | _         d S r   )_scalarsr*   s    r   r   zVarStoreInstancer._clearCaches   s    $---r   c                     | j                             |          }|D| j        |                             | j                  }t          | j        |          }|| j         |<   |S r   )r   rC   r   get_supportru   r   r   )r*   	regionIdxscalarsupports       r   
_getScalarzVarStoreInstancer._getScalar   sZ    =Y''&^]9%11$.AA7$-116$4=	-r   c                 L    d}t          | |          D ]\  }}|s|||z  z  }|S )Ng        )zip)rV   scalarsdeltar]   ss        r   interpolateFromDeltasAndScalarsz1VarStoreInstancer.interpolateFromDeltasAndScalars   s@    
%!!  ca
XAE>55	,r   c                      |dz	  |dz  }} j         } fd||         j        D             }||         j        |         }                     ||          S )Nr`   rB   c                 :    g | ]}                     |          S r   r   r\   rir*   s     r   r^   z1VarStoreInstancer.__getitem__.<locals>.<listcomp>   s%    IIIRT__R  IIIr   )r   VarRegionIndexr<   r   )r*   varidxmajorminorvarDatar   rV   s   `      r   __getitem__zVarStoreInstancer.__getitem__   sb    2v%M'IIII75>+HIII'5>u%&		-	-fg	>	>>r   c                 p      j         } fd||         j        D             }                     ||          S )Nc                 :    g | ]}                     |          S r   r   r   s     r   r^   z;VarStoreInstancer.interpolateFromDeltas.<locals>.<listcomp>   s1     + + +RT__R   + + +r   )r   r   r   )r*   varDataIndexrV   r   r   s   `    r   interpolateFromDeltasz'VarStoreInstancer.interpolateFromDeltas   sP    M'+ + + +\)+ + +'		-	-fg	>	>>r   N)rd   re   rf   r,   r   r   r   staticmethodr   r   r   r   r   r   r{   r{      s        24             ,? ? ?? ? ? ? ?r   r{   TFc           	         i }|D ]K}|dz	  }|dz  }|                     |          }	|	t                      x}	||<   |	                    |           L~| j        }
g }i }t	          |
          D ]^\  }}|                     |          }|t          |          }|                    |           |j        }g }|dk    r_|r]t          t          |                    D ]?}|                    ||v r||         ndgt          ||                   z             |||<   @nx|dk    r#t          |          t          ||z
            z   }nt          |          }|D ]=}t          |          }|                    ||                    |dz  |z   ||dz  |z   <   >||_        t          |j                  |_
        |                    |           `|| _        t          | j                  | _        |                                  |S )Nr`   rB   r   r5   )rC   setaddr:   rw   r7   rD   r<   ranger   r=   r>   r;   prune_regions)r*   varIdxesr6   retainFirstMapadvIdxesusedrb   r   r   r]   r   
newVarData
varDataMapr?   
usedMinorsnewMajorr   newItemsminorsnewMinors                       r   VarStore_subset_varidxesr      s1    	  V
B,%
6/%
hhuoo!YUU1tE{%%,,,, <W%% - -ZU4xx*__(D
)%(
aZZNZc%jj!!  uOOEZ$7$7E%LLaS3uU|CTCT=TUUUJu qjjHzH'< = ==FFJF < <u8}}HOOE%L!!!%-r\8$;Jr	5 !!$)ty>>$.8,,,,&&r   c                    t                      }| j        D ]}|                    |j                   | j        }|j        }g }i t          |          D ]/}t          |          |<   |                    ||                    0||_        t          |j                  |_	        | j        D ]}fd|j        D             |_        dS )zRemove unused VarRegions.c                      g | ]
}|         S r   r   )r\   rs   rF   s     r   r^   z*VarStore_prune_regions.<locals>.<listcomp>  s    CCC!1CCCr   N)
r   r:   updater   r   r8   r   r7   rD   r9   )r*   usedRegionsr?   rG   rH   
newRegionsrs   rF   s          @r   VarStore_prune_regionsr      s     uu\ * *TT()))) 


    QZ)A,GAJj/00\ D DTCCCCt/BCCC$D Dr   c                    t          |           t          j        k    r ||            dS t          | t                    r| D ]}t          ||           dS t          | d          rQt          | d          sA|                                 D ]*}t          | |j	        d          }|t          ||           +dS t          | t          j
                  r,| j                                        D ]}t          ||           dS dS )znRecurse 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
isinstancer3   _visithasattrr   getattrnameValueRecord__dict__values)r*   functhatconvs       r   r   r     s4    	JJ")$t*****t   d	$  dO$$ WT:-F-F   ""  d
$	4
(
(4

4 
 r~&& m""$$  d	$  r   c                 j    | j         dk    r'|                    | j        dz  | j        z              dS dS )z6Add VarIdx in this Device table (if any) to the set s.   r`   N)DeltaFormatr   	StartSizeEndSize)r*   r   s     r   _Device_recordVarIdxr   '  s>    %%	T\)***** r   c                 R    t          t          |          }t          | |           d S )N)r   )r   r   r   )r*   varidxesadders      r   Object_collect_device_varidxesr   ,  s+    	%	2	2	2er   c                     t          |           |v rdS |                    t          |                      | j        dk    r.|| j        dz  | j        z            }|dz	  | _        |dz  | _        dS dS )z9Map VarIdx in this Device table (if any) through mapping.Nr   r`   rB   )idr   r   r   r   )r*   mappingdonerb   s       r   _Device_mapVarIdxr   3  sx    tHH&"T((DNB&45&R<$.&$,,, r   c                 l    t          t          |t                                }t          | |           d S )N)r   r   )r   r   r   r   )r*   varidxes_mapmappers      r   Object_remap_device_varidxesr   =  s1    
#\
F
F
Ffr   c                       e Zd Zd Zd Zd Zd Z ee          Zed             Z	d Z
d Zd Zd	 Zed
             Zed             Zd ZdS )	_Encodingc                     || _         |                     |          | _        |                     |          | _        t                      | _        d S r   )chars	_popcountwidth_characteristic_overheadoverheadr   r   r*   r   s     r   r,   z_Encoding.__init__G  s@    $*~~e$$$*//66$-uu$***r   c                 :    | j                             |           d S r   )r   r   )r*   rows     r   rD   z_Encoding.appendM  s    *..r   c                 :    | j                             |           d S r   )r   r   )r*   lsts     r   extendz_Encoding.extendP  s    *Cr   c                 p    t          | j                  }t          d| j        dz
  |z  | j        z
            S )zxMaximum number of bytes that can be added to characteristic
		while still being beneficial to merge it into another one.r   r_   r7   r   maxr   r   r*   counts     r   get_roomz_Encoding.get_roomS  s4     dj//%	Q"u,tz9	:	::r   c                 p    t          | j                  }t          d| j        || j        dz   z  z
            S )zKMaximum possible byte gain from merging this into another
		characteristic.r   r_   r   r   s     r   gainz_Encoding.gainZ  s3     dj//%	Qa 88	9	99r   c                     | j         | j        fS r   )r   r   r   s    r   sort_keyz_Encoding.sort_keya  s    	TZ	r   c                 *    t          | j                  S r   )r7   r   r   s    r   __len__z_Encoding.__len__d  s    	TZr   c                     || j          z   S r   )r   r   s     r   
can_encodez_Encoding.can_encodeg  s    tzk!	""r   c                 H    |                      | j        |j         z            S r   )r   r   )r*   others     r   __sub__z_Encoding.__sub__j  s    	
ek\1	2	22r   c                 F    t          |                               d          S )N1)binr   )ns    r   r   z_Encoding._popcountm  s     
Qc		r   c                 0    d}| r| dz  r|dz  }| dz  } | |S )zIReturns overhead in bytes of encoding this characteristic
		as a VarData.            r   )r   cs     r   r   z"_Encoding._characteristic_overheads  s@     ! fn FAQ;5 	  
(r   c                     d | _         t          | j        dz   | j        | j        z   dz             D ]2}||         D ]}|                    | j                  r nd }|| _         3d S r}   )best_new_encodingr   r   roomr   r   )r*   done_by_width	new_widthnew_encodings       r    _find_yourself_best_new_encodingz*_Encoding._find_yourself_best_new_encoding~  s    $Atz$)';A'=>> ) )i$Y/  |tz** 
U L(4) )r   N)rd   re   rf   r,   rD   r   r   propertyr  r   r   r   r   r   r   r   r   r  r   r   r   r   r   E  s              ; ; ;
 	
: : (:       # # #3 3 3   ,
   ,) ) ) ) )r   r   c                   0    e Zd Zd Zd Zed             ZdS )_EncodingDictc                 .    t          |          x}| |<   |S r   )r   )r*   r   rs      r   __missing__z_EncodingDict.__missing__  s    e$$$!d5k	
(r   c                 f    |                      |          }| |                             |           d S r   )_row_characteristicsrD   )r*   r   r   s      r   add_rowz_EncodingDict.add_row  s3    

#
#C
(
(%u+Sr   c                     d}d}d}| D ]8}|r||z  }d|cxk    rdk    s
n ||dz  z  }d|cxk    rdk    sn d	} n|d
z  }9|r/d}d}| D ](}|r||dz  z  }d|cxk    rdk    s
n ||dz  z  }|d
z  })|S )z+Returns encoding characteristics for a row.Fr   r_   i   r  i i  Tr	        r   )r   	longWordsr   rs   vs        r   r  z"_EncodingDict._row_characteristics  s    )
%!  a 	QJE1	QZEQ%I	E711 	51  q 
a&jUa    5    
a&jU!GAA	,r   N)rd   re   rf   r  r  r   r  r   r   r   r  r    sM               ,  r   r  c                 @
   t          | j        j                  }dg|z  }i }t                      }t	          | j                  D ]\  }}|j        }t	          |j                  D ]i\  }}	t          |          }
t          ||	          D ]\  }}|
|xx         |z  cc<   t          |
          }
|                    |
           |
||dz  |z   <   jt          |                                t          j        d          }t!          t                    }g }|D ]?}|j        s!||j                                     |           *|                    |           @|                    t          j                   |D ]}|                    |           |r|                                }d}d}t	          |          D ]\  }}|j        |j        z  }t                              |          }t                              |          }|j        
 |j        z   |z
  ||j        z
  t          |          z  z
  ||j        z
  t          |          z  z
  }|j        dn,|j        
 |j        j        |j        z
  t          |          z  z
  }|j        dn,|j        
 |j        j        |j        z
  t          |          z  z
  }||z   }||k    r|}||z
  }|!||j                                     |           n||         }|j        |j        z  }t          |          }|                    |j                   |                    |j                   |                    |           ||= |                    |           |i }t?          |                                g           }|                    t          j                    g | _        t	          |          D ]\  }}tC          j                    }| j                            |           tE          |          |_        t          |j                  |_#        t          |j                  |_        t	          |j                  D ]\  }}	|dz  |z   ||	<   i }|                                D ]\  }}||         ||<   | $                                 t          | j        j                  | j        _%        t          | j                  | _&        | j        D ]/}t          |j                  |_'        |(                                 0|S )z@Optimize storage. Returns mapping from old VarIdxes to new ones.r   r`   T)r   reverser   N))r7   r   r8   r  rw   r:   r   r<   r3   r   r   r  r   r   r   r   r   r   r   rD   sortr   r  rS   r   r   r   r   r  r   r   sumr   r   r   ri   r   r9   r;   r=   r6   )r*   r  zeroesfront_mapping	encodingsr   r?   rI   r   itemr   r   r   r  todoencodingbest_idx	best_gainrs   other_encodingcombined_charscombined_widthcombined_overheadcombined_gain	this_gain
other_gainseparate_gaincombined_encodingback_mapping
varidx_mapks                                  r   VarStore_optimizer9    sf    			"###'__ T\** * *ZU4%-di(( * *jeD	f3-..  {y	NNNaNNNN	s3S&)=%)U"##* I$$&&I,=tLLLT""
  X	  ''1111;;x y!""" ; ;X
++M::::  ("XXZZ(()#D// . .a"(8>9>''77> 99.II 	'3x==89 	--^1D1DD	E  .6qq		#	)HN	:c(mmKL  $5=		)	/.2F	F#nJ]J]]^  z)=m##H-I ''1111N>"(8>9> 00HN+++N011155mDDDH~;; !!!Q  ("V %%'',,
I&''' ++ * *^U8	$,da$D/00$X^$$$)di(( * *jeDE)<* !! " "SQqq/*Q--  #&d&8&?"@"@&&\  Tty>>$.--////r   Nc                 z   ddl m} ddlm} ddlm} ddlm}  |dt          j	                  }|
                    d           |
                    d	d
           |                    |           } |d           |j        }|j        } ||          }	|	d         }
|
j        j        } |            }|                    ||	           t#          |                                          }t'          d|z             |                                }|
j                            |           d|	v r |	d         j                            |            |            }|                    ||	           t#          |                                          }t'          d|z             ||	                    |           dS dS )z&Optimize a font's GDEF variation storer   )ArgumentParser)configLogger)TTFont)OTTableWriterzvarLib.varStore)progdescriptionfontfileoutfile?)nargsINFO)levelGDEFzBefore: %7d bytesGPOSzAfter:  %7d bytesN)argparser;  	fontToolsr<  fontTools.ttLibr=  fontTools.ttLib.tables.otBaser>  main__doc__add_argument
parse_argsrA  rB  tableVarStorecompiler7   
getAllDataprintr6   remap_device_varidxessave)argsr;  r<  r=  r>  parseroptionsrA  rB  fontgdefstorewritersizer7  s                  r   rM  rM  /  s   $$$$$$############888888
./dl
K
K
KZ   Yc***T"" F?xV		
-//vtF  T!"""nn!!*---
dNNv,**:666
-//vtF  T!"""))G r   __main__r_   r   )9fontTools.misc.roundToolsr   r   fontTools.ttLib.tablesr   r   fontTools.varLib.modelsr   fontTools.varLib.builderr   r   r	   r
   	functoolsr   collectionsr   r   objectr   rQ   rl   r:   ra   ry   	VarRegionr   r{   r   r   rR  subset_varidxesr   r   r   r   r   rG  collect_device_varidxesrH  r   r   rV  r   r   r  r9  r6   rM  rd   sysr7   argvexitdoctesttestmodfailedr   r   r   <module>rq     s(   6 6 6 6 6 6 6 6 1 1 1 1 1 1 1 1 1 1 1 1( ( ( ( ( ( ( ( ( ( ( (       # # # # # #9 9 9b b b b bF b b bH ,1 ! ! ! ! ! %
    1 +? +? +? +? +? +? +? +?h 7;5[^[^[`[` 5 5 5 5n 7 D D D0 3   *+ + +
   #A "@ ! ! !   !=  < A) A) A) A) A) A) A) A)H& & & & &D & & &Rx x xt ) ' ' ' 'T zCMMA
#(4466	/'/


"##### r   