
    ]Mh^                     :   d dl mZmZ d dl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 dlmZmZ ej        Zeej        _        d	 Z G d
 de          ZeddZeej        _        d Zeej         _!        d Z"e"ej        _#         G d de          Z$dd e%            fdddZ&e&ej        _'        ddddZ(e(ej        _)        d Z*d Z+d Z,e,ej-        _.        e,ej/        _.        d Z0d Z1e1ej-        _2        e1ej/        _2         G d d e          Z3 G d! d"e4          Z5d(d$Z6e6ej        _7        d)d&Z8e9d'k    rXd d%l:Z: e;e:j<                  d#k    r e:j=         e8                       d d%l>Z> e:j=         e>j?                    j@                   d%S d%S )*    )noRoundotRound	bit_count)otTables)supportScalar)buildVarRegionListbuildVarStorebuildVarRegionbuildVarData)partial)defaultdict)heappushheappopc                 d    t          t          |                                 d                     S )Nc                     | d         S Nr    )kvs    Y/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/fontTools/varLib/varStore.py<lambda>z!_getLocationKey.<locals>.<lambda>   s
    BqE     key)tuplesorteditems)locs    r   _getLocationKeyr      s)    		)9)9:::;;;r   c                   `    e Zd Zd Zd Zd ZddZddZedd	Z	edd
Z
eddZeddZdS )OnlineVarStoreBuilderc                     || _         i | _        t          g |          | _        t	          | j        g           | _        d | _        d | _        d | _        i | _	        i | _
        d | _        d S N)	_axisTags
_regionMapr	   _regionListr
   _store_data_model	_supports_varDataIndices_varDataCaches_cache)selfaxisTagss     r   __init__zOnlineVarStoreBuilder.__init__   sf    !-b(;;#D$4b99
! r   c                 H    |                      |j                   || _        d S r#   )setSupportssupportsr)   )r.   models     r   setModelzOnlineVarStoreBuilder.setModel%   s#    (((r   c                     d | _         t          |          | _        | j        r| j        d         s| j        d= d | _        d | _        d S r   )r)   listr*   r-   r(   )r.   r3   s     r   r2   z!OnlineVarStoreBuilder.setSupports)   sJ    h> 	"$."3 	"q!


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.   r:   datas      r   finishzOnlineVarStoreBuilder.finish1   sw    '*4+;+B'C'C$#&t{':#;#; K' 	7 	7D ^^DN##X#6666{r      c                 `   | j         }| j        }| j        }g }|D ]}t          |          }|                    |          }|Ht          || j                  }	t          |j                  x}||<   |j        	                    |	           |	                    |           t          |          }| j                            |          }
|
R|
| _        | j        j        |
         | _        | j        |         | _        t          | j        j                  |z   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  Fr9   )r%   r&   r*   r   getr   r$   r;   r<   appendr   r+   _outerr'   r>   r(   r,   r-   r@   r   )r.   	num_items	regionMap
regionListregionsregionIndicesregionr   idx	varRegion
varDataIdxs              r   _add_VarDataz"OnlineVarStoreBuilder._add_VarData9   s   O	%
. 	& 	&F!&))C--$$C{*64>BB	'*:+<'='==in!((333  %%%% M"")--c22
!$DK,Z8DJ-c2DK4:?##i/&88!
%mR%HHHDJdk122DKK&&tz222(,D %$---+-#C(-c2DKKK r   roundc                    | j                             ||          }|                    d          }||                     |t                    fS )NrU   r   )r)   	getDeltaspopstoreDeltasr   )r.   master_valuesrV   deltasbases        r   storeMastersz"OnlineVarStoreBuilder.storeMasters\   sI    &&}E&BBzz!}}T%%fG%<<<<r   c                x      fd|D             }d |D             }|                      |t                    fS )Nc                 H    g | ]}j                             |           S )rU   )r)   rX   ).0r[   rV   r.   s     r   
<listcomp>z:OnlineVarStoreBuilder.storeMastersMany.<locals>.<listcomp>b   s>     
 
 
 K!!-u!==
 
 
r   c                 8    g | ]}|                     d           S r   )rY   ra   r\   s     r   rb   z:OnlineVarStoreBuilder.storeMastersMany.<locals>.<listcomp>f   s"    ===vVZZ]]===r   rU   )storeDeltasManyr   )r.   master_values_listrV   deltas_list	base_lists   ` `  r   storeMastersManyz&OnlineVarStoreBuilder.storeMastersManya   sd    
 
 
 
 
!3
 
 
 >====	$..{'.JJJJr   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    r0|                                  |                     |t                    S | j        
                    |t                     | j        dz  |z   }|| j        |<   |S )Nc                 &    g | ]} |          S r   r   ra   drV   s     r   rb   z5OnlineVarStoreBuilder.storeDeltas.<locals>.<listcomp>j   s!    +++q%%((+++r   rE   rG   rU      )r;   r*   r   r(   rT   r-   rH   r@   rZ   r   addItemrJ   )r.   r\   rV   varIdxinners     `  r   rZ   z!OnlineVarStoreBuilder.storeDeltasi   s;   ++++F+++v;;#dn--1116!"":&&FFv;;#dn"5"555556]]Fz 	 ((MDJO$$F??##F'#:::
6111+#u,$Fr   c                   fd|D             }t          d |D                       }| j        s"|                     t          |                     | j                            |          }||S t          | j        j                  }|t          |          z   dk    r>|                     t          |                     |                     |t                    S t          |          D ]@\  }}| j        
                    |t                     | j        dz  |z   |z   }|| j        |<   A| j        dz  |z   }|| j        |<   |S )Nc                 ,    g | ]}fd |D             S )c                 &    g | ]} |          S r   r   rm   s     r   rb   zDOnlineVarStoreBuilder.storeDeltasMany.<locals>.<listcomp>.<listcomp>   s!    111Qa111r   r   )ra   r\   rV   s     r   rb   z9OnlineVarStoreBuilder.storeDeltasMany.<locals>.<listcomp>   s.    LLLf1111&111LLLr   c              3   4   K   | ]}t          |          V  d S r#   )r   re   s     r   	<genexpr>z8OnlineVarStoreBuilder.storeDeltasMany.<locals>.<genexpr>   s(      DDfE&MMDDDDDDr   rG   rU   ro   )r   r(   rT   r;   r-   rH   r@   rf   r   	enumeraterp   rJ   )r.   rh   rV   rq   rr   ir\   s     `    r   rf   z%OnlineVarStoreBuilder.storeDeltasMany   sW   LLLLLLLDDDDDDDz 	0c+..///--MDJO$$3{###f,,c+..///''7'CCC";// 	) 	)IAvJvW555kR'5014F"(DK+#u,#)K r   N)T)rE   )__name__
__module____qualname__r0   r5   r2   rD   rT   rV   r^   rj   rZ   rf   r   r   r   r!   r!      s        
 
 
       !3 !3 !3 !3F 49 = = = = =
 =B K K K K K ,1     4 5:       r   r!   rU   c                :   fd|D             }| j         }t          |          }|dz   |k    rt          |dd                    }n!||k    sJ ||f            t          |          }| j                            |           t          | j                  | _        d S )Nc                 &    g | ]} |          S r   r   rm   s     r   rb   z#VarData_addItem.<locals>.<listcomp>   s!    '''1eeAhh'''r   rE   )VarRegionCountr;   r7   r@   rI   rA   )r.   r\   rV   countUs	countThems     `  r   VarData_addItemr      s    '''''''F!GFI{ifQRRj!!)###gy%9###fIV^^DNNNr   c                 D    fdt          | j                  D             S )Nc                 l    i | ]0\  }}|j         d k    |         j        |j        |j         |j        f1S rd   )	PeakCoordaxisTag
StartCoordEndCoord)ra   ry   reg	fvar_axess      r   
<dictcomp>z)VarRegion_get_support.<locals>.<dictcomp>   sJ       As=A 	!s~s}clKr   )rx   VarRegionAxis)r.   r   s    `r   VarRegion_get_supportr      s9        233   r   c                 *    t          | j                  S r#   )boolr>   r.   s    r   VarStore___bool__r      s    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 )NrE   )r   Formatr>   _varDataVarRegionListr<   _regionssetLocation)r.   varstorer   locations       r   r0   zVarStoreInstancer.__init__   sf    "8?a#7#7#7#7,4<(("9AI.55r"""""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#   )_scalarsr   s    r   r   zVarStoreInstancer._clearCaches   s    r   c                     | j                             |          }|D| j        |                             | j                  }t          | j        |          }|| j         |<   |S r#   )r   rH   r   get_supportr   r   r   )r.   	regionIdxscalarsupports       r   
_getScalarzVarStoreInstancer._getScalar   sZ    ""9-->mI.::4>JJG"4='::F'-DM)$r   c                 L    d}t          | |          D ]\  }}|s|||z  z  }|S )N        )zip)r\   scalarsdeltarn   ss        r   interpolateFromDeltasAndScalarsz1VarStoreInstancer.interpolateFromDeltasAndScalars   sC    (( 	 	DAq QUNEEr   c                      |dz	  |dz  }}|t           k    rdS  j        } fd||         j        D             }||         j        |         }                     ||          S )Nro   rG   r   c                 :    g | ]}                     |          S r   r   ra   rir.   s     r   rb   z1VarStoreInstancer.__getitem__.<locals>.<listcomp>   s%    OOO24??2&&OOOr   )NO_VARIATION_INDEXr   VarRegionIndexr@   r   )r.   varidxmajorminorvarDatar   r\   s   `      r   __getitem__zVarStoreInstancer.__getitem__   ss    |Vf_u'''3-OOOO1NOOO$U+33FGDDDr   c                 p      j         } fd||         j        D             }                     ||          S )Nc                 :    g | ]}                     |          S r   r   r   s     r   rb   z;VarStoreInstancer.interpolateFromDeltas.<locals>.<listcomp>   s%    VVV24??2&&VVVr   )r   r   r   )r.   varDataIndexr\   r   r   s   `    r   interpolateFromDeltasz'VarStoreInstancer.interpolateFromDeltas   sA    -VVVV1F1UVVV33FGDDDr   N)rz   r{   r|   r0   r   r   r   staticmethodr   r   r   r   r   r   r   r      s        57 # # # #         \E E EE E E E Er   r   TFr>   )r>   c          	      R   t          t                    }|D ]3}|t          k    r|dz	  }|dz  }	||                             |	           4~t	          | |          }
g }t          t          i}t          |
          D ]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	                  |_        |dk    r|                    |           ft          | ||           t          | |dz   t          |                     |                                  |S )Nro   rG   r   r>   r9   Count)r   setr   addgetattrrx   rH   r;   rI   r@   ranger   rA   rB   setattrprune_regions)r.   varIdxesr:   retainFirstMapadvIdxesr>   usedrq   r   r   r   
newVarData
varDataMaprC   
usedMinorsnewMajorr   newItemsminorsnewMinors                       r   VarStore_subset_varidxesr      sb    sD  '''"U dG$$GJ$&89J )) 7 7tXXe__
z??$	A::.:s5zz** * *$)Z$7$7E%LLaS3uU|CTCT=T   %*
5!!	* zz))F:3H,I,II
++ P Px==e---5=^x4O
ERK5011	TYi##X#666D':&&&D'G#S__555r   r   )r>   r   c                  	 t                      }t          | |          D ]}|                    |j                   t          | |          }|j        }g }i 	t          |          D ]/}t          |          	|<   |                    ||                    0||_        t          |j                  |_        t          | |          D ]}	fd|j        D             |_        dS )zRemove unused VarRegions.c                      g | ]
}|         S r   r   )ra   ry   rL   s     r   rb   z*VarStore_prune_regions.<locals>.<listcomp>R  s    IIIy|IIIr   N)	r   r   updater   r<   r   r;   rI   r=   )
r.   r>   r   usedRegionsrC   rM   rN   
newRegionsry   rL   s
            @r   VarStore_prune_regionsr   <  s    %%Kg&& 0 04.////}--JGJIK   & &:	!'!*%%%%"J !233Jg&& J JIIIIT5HIIIJ J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 )zqRecurse 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
isinstancer7   _visithasattrr   r   nameValueRecord__dict__values)r.   functhatconvs       r   r   r   X  s4    DzzRYT




	D$		  	 	D4	 	 
	'	' j0I0I &&(( 	# 	#D4D11DtT"""	# 	#
 
D".	)	) M((** 	 	D4 	 	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.   ro   N)DeltaFormatr   	StartSizeEndSize)r.   r   s     r   _Device_recordVarIdxr   n  s>    6!!	t~#t|344444 "!r   c                 R    t          t          |          }t          | |           d S )N)r   )r   r   r   )r.   varidxesadders      r   Object_collect_device_varidxesr   t  s+    (H555E
4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   ro   rG   )idr   r   r   r   )r.   mappingdonerq   s       r   _Device_mapVarIdxr   }  sx    	$xx4HHRXX6!!$.B.$,>?2 "!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    &355IIIF
4r   c                   X    e Zd Zd Zd Zd Zd Zed             Zed             Z	d Z
dS )		_Encodingc                     || _         t          |          | _        |                     |          | _        |                     | j                  | _        t                      | _        d S r#   )	charsr   width_columnscolumns_characteristic_overheadoverheadr   r   )r.   r   s     r   r0   z_Encoding.__init__  sQ    
u%%
}}U++55dlCCUU


r   c                 :    | j                             |           d S r#   )r   r   )r.   rows     r   rI   z_Encoding.append  s    
sr   c                 :    | j                             |           d S r#   )r   r   )r.   lsts     r   extendz_Encoding.extend  s    
#r   c                     | j         | j        fS r#   )r   r   r   s    r   width_sort_keyz_Encoding.width_sort_key  s    z4:%%r   c                 4    d}|t          |           dz  z  }|S )zOReturns overhead in bytes of encoding this characteristic
        as a VarData.
      r   )r  cs     r   r  z"_Encoding._characteristic_overhead  s%     	Yw!##r   c                 >    d}d}| r| dz  r||z  }| dz  } |dz  }| |S )Nr   rE         r   )r   colsry   s      r   r  z_Encoding._columns  sL     	v~ 	aKE!GA	  	
 r   c                 :   |j         | j         z  }t          |          }| j        |j        z  }t                              |          }| j        
 |j        z   |z
  || j        z
  t          | j                  z  z
  ||j        z
  t          |j                  z  z
  }|S r#   )	r   r   r  r   r  r  r   r;   r   )r.   other_encodingcombined_charscombined_widthcombined_columnscombined_overheadcombined_gains          r   gain_from_mergingz_Encoding.gain_from_merging  s    '-
:">22<.*@@%>>?OPP]N%&  
*c$*oo=>  44N<P8Q8QQ	R 	 r   N)rz   r{   r|   r0   rI   r	  r  r   r  r  r  r   r   r   r   r     s              & & &   \   \    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***DKr   c                 f    |                      |          }| |                             |           d S r#   )_row_characteristicsrI   )r.   r  r   s      r   add_rowz_EncodingDict.add_row  s3    ))#..U3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   rE   i   r  i i  Tr        r   )r  	longWordsr   ry   vs        r   r"  z"_EncodingDict._row_characteristics  s    	 	 	A 
A$$$$$$$$V#a((((5(((( 	!GAA 		EA   (QZ'E!,,,,u,,,,QZ'Ear   N)rz   r{   r|   r   r#  r   r"  r   r   r   r  r    sM                  \  r   r  rE   c           
      t	   t          | j        j                  }dg|z  }i }t                      }t	          | j                  D ]\  }}|j        }	t	          |j                  D ]\  }
}t          |          }|dk    r't          |	|          D ]\  }}||xx         |z  cc<   n9t          |	|          D ](\  }}||xx         t          ||z            |z  z  cc<   )t          |          }|rt          |          sd||dz  |
z   <   |                    |           |||dz  |
z   <   ǌt          |                                t           j                  }~g }t	          |          D ]_\  }}t%          |dz   t          |                    D ]9}||         }|                    |          }|dk    rt)          || ||f           :`|r(t+          |          \  }}}||         ||         '||         ||         }}d\  ||<   ||<   |j        |j        z  }t!          |          }|                    |j                   |                    |j                   t	          |          D ]o\  }}||j        |k    r |                    |j                   d||<   3|                    |          }|dk    r!t)          || |t          |          f           p|                    |           |(d |D             }i }|                    t           j                   g | _        |D ]}t          |j                  }|rt          | j                  }t7          j                    }| j                            |           t%          |          |_        t          |j                  |_        |dd         |dd         c|_        }t	          |j                  D ]\  }
}|dz  |
z   ||<   |t:          t:          i}|                                D ]\  }}|||         nt:          ||<   t          | j        j                  | j        _        t          | j                  | _        | j        D ]/}t          |j                  |_         |!                                 0| "                                 |S )	z@Optimize storage. Returns mapping from old VarIdxes to new ones.r   rE   Nro   r   )NNc                     g | ]}||S r#   r   )ra   encodings     r   rb   z%VarStore_optimize.<locals>.<listcomp>  s    GGGh(2F2F2F2Fr   rG   )#r;   r   r<   r  rx   r>   r   r@   r7   r   rV   r   anyr#  r   r   r   r  r   r  r   r   r   r	  r   rI   sortr   r   r   r=   r?   rA   r:   r   )r.   use_NO_VARIATION_INDEXquantizationnzeroesfront_mapping	encodingsr   rC   rO   r   itemr  r   r)  todoheapry   r,  jr  combining_gain_r  combined_encodingkencback_mappingr   
varidx_maps                                 r   VarStore_optimizer@    s@   X 	D%&&AS1WFMI !.. 7 7t+$TY// 	7 	7KE4v,,Cq  $'t$<$< ( (LIq	NNNa'NNNN( %(t$<$<  LIq	NNNa,.//,>NNNN **C% c#hh 7;u{e34c"""36M5B;%/00'	7, )""$$)*BCCCD D  8 88q1uc$ii(( 	8 	8A!!WN%77GGN!!A6777		8  '$--1a7?d1go#'7DG.%Qa (->%n55  000  !5666oo 	@ 	@FAs{ yN**!((333Q.@@EEN!!CII>???%&&&;  '> HG$GGGI LNNy/N000DL ; ;x~&& 	;%%E:<<DL%%%"'((D"%d&9":":D  %WfW~uVWW~DIu(33 ; ;t&+rkU%:T""  	; %&89J##%% Q Q1+,=Q>P
1 &));)B%C%CD"DL))D  TY 	r   Nc                    ddl m} ddlm} ddlm} ddlm}  |dt          j	                  }|
                    dt          d	
           |
                    d           |
                    dd           |                    |           } |d           |j        }|j        }|j        }	 ||          }
|
d         }|j        j        } |            }|                    ||
           t'          |                                          }t+          d|z             |                    |          } |            }|                    ||
           t'          |                                          }t+          d|z             |	U|j                            |           d|
v r |
d         j                            |           |
                    |	           dS dS )z&Optimize a font's GDEF variation storer   )ArgumentParser)configLogger)TTFont)OTTableWriterzvarLib.varStore)progdescriptionz--quantizationrE   )r   defaultfontfileoutfile?)nargsINFO)levelGDEFzBefore: %7d bytes)r0  zAfter:  %7d bytesNGPOS)argparserB  	fontToolsrC  fontTools.ttLibrD  fontTools.ttLib.tables.otBaserE  main__doc__add_argumentint
parse_argsr0  rI  rJ  tableVarStorecompiler;   
getAllDataprintr:   remap_device_varidxessave)argsrB  rC  rD  rE  parseroptionsr0  rI  rJ  fontgdefstorewritersizer?  s                   r   rU  rU    s   ''''''&&&&&&&&&&&&;;;;;;^!2MMMF
(sA>>>

###
	---%%G Lv'LHoG6(D<DJE]__F	MM&$v  ""##D	

$%%%\::J]__F	MM&$v  ""##D	

$%%%
((444T>>L44Z@@@		' r   __main__)TrE   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   r[  r   objectr!   rV   r   r>   rp   r   	VarRegionr   r   __bool__r   r   r   subset_varidxesr   r   r   r   r   rO  collect_device_varidxesrP  r   r   r_  r   r   r  r@  r:   rU  rz   sysr;   argvexitdoctesttestmodfailedr   r   r   <module>r}     s   6 6 6 6 6 6 6 6 - - - - - - 1 1 1 1 1 1 1 1 1 1 1 1                  # # # # # # # # # # # # # # * !3 < < <D D D D DF D D DN ,1 $ $ $ $ $ %
    1    ) ,E ,E ,E ,E ,E ,E ,E ,Er SUU> > > > > >B 7  -6_ J J J J J2 3   ,5 5 5  
 #A "@ ' ' '  
 !=  < 0 0 0 0 0 0 0 0f% % % % %D % % %P~ ~ ~ ~B ) ) ) ) )X zJJJ
s38}}qNNNCH_W_%&&&&& r   