
    #Vf\                        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Z&e&ej.                  _'        d Z(e(ej.                  _)        d Z*d Z+d Z,e,ejZ                  _.        e,ej^                  _.        d Z0d Z1e1ejZ                  _2        e1ej^                  _2         G d de      Z3 G d de4      Z5d$d Z6e6ej.                  _7        d%d"Z8e9d#k(  r`d d!l:Z: e;e:jx                        dkD  r e:jz                   e8              d d!l>Z> e:jz                   e>j~                         j                         y!y!)&    )noRoundotRound	bit_count)otTables)supportScalar)buildVarRegionListbuildVarStorebuildVarRegionbuildVarData)partial)defaultdict)heappushheappopc                 L    t        t        | j                         d             S )Nc                     | d   S Nr    )kvs    b/var/www/html/software/conda/envs/catlas/lib/python3.12/site-packages/fontTools/varLib/varStore.py<lambda>z!_getLocationKey.<locals>.<lambda>   s
    BqE     key)tuplesorteditems)locs    r   _getLocationKeyr      s    		)9:;;r   c                   D    e Zd Zd Zd Zd Zd
dZd ZeddZ	eddZ
y	)OnlineVarStoreBuilderc                     || _         i | _        t        g |      | _        t	        | j                  g       | _        d | _        d | _        d | _        i | _	        i | _
        i | _        y N)	_axisTags
_regionMapr	   _regionListr
   _store_data_model	_supports_varDataIndices_varDataCaches_cache)selfaxisTagss     r   __init__zOnlineVarStoreBuilder.__init__   s_    !-b(;#D$4$4b9
! r   c                 H    | j                  |j                         || _        y r#   )setSupportssupportsr)   )r.   models     r   setModelzOnlineVarStoreBuilder.setModel%   s    (r   c                     d | _         t        |      | _        | j                  d   s| j                  d= i | _        d | _        y r   )r)   listr*   r-   r(   )r.   r3   s     r   r2   z!OnlineVarStoreBuilder.setSupports)   s:    h~~a q!
r   c                 `   t        | j                  j                        | j                  _        t        | j                  j
                        | j                  _        | j                  j
                  D ].  }t        |j                        |_        |j                  |       0 | j                  S )Noptimize)
lenr&   RegionRegionCountr'   VarDataVarDataCountItem	ItemCountcalculateNumShorts)r.   r:   datas      r   finishzOnlineVarStoreBuilder.finish1   s    '*4+;+;+B+B'C$#&t{{':':#; KK'' 	7D ^DN##X#6	7 {{r   c                    | j                   }| j                  }| j                  }g }|D ]|  }t        |      }|j	                  |      }|Kt        || j                        }t        |j                        x}||<   |j                  j                  |       |j                  |       ~ t        |      }| j                  j	                  |      }	|	]|	| _        | j                  j                  |	   | _        | j                   |   | _        t        | j                  j$                        dk(  rd }	|	t'        |g d      | _        t        | j                  j                        | _        | j                  j                  j                  | j                         | j                  | j                  |<   || j                   vri | j                   |<   | j                   |   | _        y y )N  Fr9   )r%   r&   r*   r   getr   r$   r;   r<   appendr   r+   _outerr'   r>   r(   r,   r-   r@   r   )
r.   	regionMap
regionListregionsregionIndicesregionr   idx	varRegion
varDataIdxs
             r   _add_VarDataz"OnlineVarStoreBuilder._add_VarData9   s   OO	%%
.. 	&F!&)C--$C{*64>>B	'*:+<+<'==in!!((3  %	& M"))--c2
!$DK,,Z8DJ--c2DK4::??#v-!
%mR%HDJdkk112DKKK&&tzz2(,D  %$---+-##C(--c2DK r   roundc                    | j                   j                  ||      }|j                  d      }|| j                  |t              fS )NrS   r   )r)   	getDeltaspopstoreDeltasr   )r.   master_valuesrT   deltasbases        r   storeMastersz"OnlineVarStoreBuilder.storeMasters\   sC    &&}E&Bzz!}T%%fG%<<<r   c                   |D cg c]
  } ||       }}t        |      t        | j                        dz   k(  rt        |dd        }n.t        |      t        | j                        k(  sJ t        |      }| j                  j	                  |      }||S | j
                  s| j                          t        | j
                  j                        }|dk(  r!| j                          | j                  |      S | j
                  j                  |t               | j                  dz  |z   }|| j                  |<   |S c c}w )N   rF   rS      )r;   r*   r   r-   rG   r(   rR   r@   rX   addItemr   rI   )r.   rZ   rT   dvarIdxinners         r   rX   z!OnlineVarStoreBuilder.storeDeltasa   s   $*+q%(++v;#dnn-116!":&Fv;#dnn"55556]F(MzzDJJOO$F?##F++

61++#u,$F- ,s   D;N)T)__name__
__module____qualname__r0   r5   r2   rD   rR   rT   r\   rX   r   r   r   r!   r!      s0    
!3F 49 =
 ,1 r   r!   rS   c                0   |D cg c]
  } ||       }}| j                   }t        |      }|dz   |k(  rt        |dd        }n||k(  s	J ||f       t        |      }| j                  j	                  |       t        | j                        | _        y c c}w Nr^   )VarRegionCountr;   r7   r@   rH   rA   )r.   rZ   rT   ra   countUs	countThems         r   VarData_addItemrl   {   s     &'1eAh'F'!!GFI{ifQRj!)#9gy%99#fIIV^DN (s   Bc                     t        | j                        D ci c]E  \  }}|j                  dk7  r1||   j                  |j                  |j                  |j
                  fG c}}S c c}}w r   )	enumerateVarRegionAxis	PeakCoordaxisTag
StartCoordEndCoord)r.   	fvar_axesiregs       r   VarRegion_get_supportrw      sa       2 23As==A 	!s~~s}}cllKK  s   A
A'c                 ,    t        | j                        S r#   )boolr>   r.   s    r   VarStore___bool__r{      s    r   c                   D    e Zd Zi fdZd Zd Zd Zed        Zd Z	d Z
y)	VarStoreInstancerc                     || _         ||j                  dk(  sJ |r|j                  ng | _        |r|j                  j
                  ng | _        | j                  |       y rh   )rt   Formatr>   _varDataVarRegionListr<   _regionssetLocation)r.   varstorert   locations       r   r0   zVarStoreInstancer.__init__   sV    "8??a#777,4(("9A..55r"r   c                 D    t        |      | _        | j                          y r#   )dictr   _clearCaches)r.   r   s     r   r   zVarStoreInstancer.setLocation   s    Xr   c                     i | _         y r#   )_scalarsrz   s    r   r   zVarStoreInstancer._clearCaches   s	    r   c                     | j                   j                  |      }|M| j                  |   j                  | j                        }t        | j                  |      }|| j                   |<   |S r#   )r   rG   r   get_supportrt   r   r   )r.   	regionIdxscalarsupports       r   
_getScalarzVarStoreInstancer._getScalar   s[    ""9->mmI.::4>>JG"4==':F'-DMM)$r   c                 H    d}t        | |      D ]  \  }}|s	|||z  z  } |S )N        )zip)rZ   scalarsdeltara   ss        r   interpolateFromDeltasAndScalarsz1VarStoreInstancer.interpolateFromDeltasAndScalars   s;    ( 	DAqQUNE	 r   c                     |dz	  |dz  }}|t         k(  ry| j                  }||   j                  D cg c]  }| j                  |       }}||   j                  |   }| j                  ||      S c c}w )Nr_   rF   r   )NO_VARIATION_INDEXr   VarRegionIndexr   r@   r   )r.   varidxmajorminorvarDatarir   rZ   s           r   __getitem__zVarStoreInstancer.__getitem__   s{    |Vf_u''--181N1NO24??2&OO$$U+33FGDD Ps   A0c                     | j                   }||   j                  D cg c]  }| j                  |       }}| j                  ||      S c c}w r#   )r   r   r   r   )r.   varDataIndexrZ   r   r   r   s         r   interpolateFromDeltasz'VarStoreInstancer.interpolateFromDeltas   sK    --181F1U1UV24??2&VV33FGDD Ws   A
N)rd   re   rf   r0   r   r   r   staticmethodr   r   r   r   r   r   r}   r}      s9    57 #  EEr   r}   TFc           	         i }|D ]I  }|t         k(  r|dz	  }|dz  }|j                  |      }	|	t               x}	||<   |	j                  |       K ~| j                  }
g }t         t         i}t        |
      D ])  \  }}|j                  |      }|t        |      }|j                  |       |j                  }g }|dk(  rK|rIt        t        |            D ]1  }|j                  ||v r||   ndgt        ||         z         |||<   3 nb|dk(  rt        |      t        ||z
        z   }nt        |      }|D ]2  }t        |      }|j                  ||          |dz  |z   ||dz  |z   <   4 ||_        t        |j                        |_        |j                  |       , || _        t        | j                        | _        | j                          |S )Nr_   rF   r   r9   )r   rG   setaddr>   rn   r;   rH   r@   ranger   rA   rB   r?   prune_regions)r.   varIdxesr:   retainFirstMapadvIdxesusedrb   r   r   ra   r   
newVarData
varDataMaprC   
usedMinorsnewMajorr   newItemsminorsnewMinors                       r   VarStore_subset_varidxesr      s    D ''"HHUO9!e#AU	e 	 llGJ$&89J ) 3tXXe_
z?$		A:.s5z* *$)Z$7E%LaS3uU|CT=T %*
5!	* z)F:3H,II
+ Px=e-5=^x4O
ERK501P
 	TYY293< DLDLL)Dr   c                    t               }| j                  D ]  }|j                  |j                          | j                  }|j
                  }g }i }t        |      D ]$  }t        |      ||<   |j                  ||          & ||_        t        |j
                        |_	        | j                  D ]$  }|j                  D cg c]  }||   	 c}|_        & yc c}w )zRemove unused VarRegions.N)
r   r>   updater   r   r<   r   r;   rH   r=   )r.   usedRegionsrC   rK   rL   
newRegionsrJ   ru   s           r   VarStore_prune_regionsr     s     %K 04../0 ##JGJIK  &:	!'!*%& #J !2!23J J595H5HIy|IJIs   Cc                    t        |       t        j                  k(  r	 ||        yt        | t              r| D ]  }t        ||        yt        | d      rHt        | d      s<| j                         D ](  }t        | |j                  d      }|t        ||       * yt        | t        j                        r,| j                  j                         D ]  }t        ||        yy)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   getattrnameValueRecord__dict__values)r.   functhatconvs       r   r   r   0  s     DzRYYT
	D$	 	D4	 
	'j0I&&( 	#D4D1DtT"	#
 
D"..	)MM((* 	D4	 
*r   c                 z    | j                   dk(  r,|j                  | j                  dz  | j                  z          yy)z6Add VarIdx in this Device table (if any) to the set s.   r_   N)DeltaFormatr   	StartSizeEndSize)r.   r   s     r   _Device_recordVarIdxr   F  s3    6!	t~~#t||34 "r   c                 >    t        t        |      }t        | |       y )N)r   )r   r   r   )r.   varidxesadders      r   Object_collect_device_varidxesr   L  s    (H5E
4r   c                     t        |       |v ry|j                  t        |              | j                  dk(  r4|| j                  dz  | j                  z      }|dz	  | _        |dz  | _        yy)z9Map VarIdx in this Device table (if any) through mapping.Nr   r_   rF   )idr   r   r   r   )r.   mappingdonerb   s       r   _Device_mapVarIdxr   U  sf    	$x4HHRX6!$..B.$,,>?2 "r   c                 P    t        t        |t                     }t        | |       y )N)r   r   )r   r   r   r   )r.   varidxes_mapmappers      r   Object_remap_device_varidxesr   `  s    &35IF
4r   c                   |    e Zd Zd Zd Zd Zd Z ee      Zd Z	 ee	      Z
d Zd Zed        Zed	        Zd
 Zy)	_Encodingc                     || _         t        |      | _        | j                  |      | _        | j                  | j                        | _        t               | _        y r#   )	charsr   width_columnscolumns_characteristic_overheadoverheadr   r   )r.   r   s     r   r0   z_Encoding.__init__j  sD    
u%
}}U+55dllCU
r   c                 :    | j                   j                  |       y r#   )r   r   )r.   rows     r   rH   z_Encoding.appendq  s    

sr   c                 :    | j                   j                  |       y r#   )r   r   )r.   lsts     r   extendz_Encoding.extendt  s    

#r   c                 ~    t        | j                        }t        d| j                  dz
  |z  | j                  z
        S )z~Maximum number of bytes that can be added to characteristic
        while still being beneficial to merge it into another one.r   r^   )r;   r   maxr   r   r.   counts     r   get_roomz_Encoding.get_roomw  s5     DJJ1t}}q(U2TZZ?@@r   c                 ^    t        | j                        }t        d| j                  |z
        S )zQMaximum possible byte gain from merging this into another
        characteristic.r   )r;   r   r   r   r   s     r   get_gainz_Encoding.get_gain  s'     DJJ1dmme+,,r   c                 2    | j                   | j                  fS r#   )gainr   rz   s    r   gain_sort_keyz_Encoding.gain_sort_key  s    yy$**$$r   c                 2    | j                   | j                  fS r#   )r   r   rz   s    r   width_sort_keyz_Encoding.width_sort_key  s    zz4::%%r   c                 ,    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  }| r|S )Nr   r^         r   )r   colsru   s      r   r   z_Encoding._columns  s=    v~	aKE!GA	 
 r   c                 |   |j                   | j                   z  }t        |      }| j                  |j                  z  }t        j	                  |      }| 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<<.*@*@@%>>?OP]]N%%&  

*c$**o=>  4 44N<P<P8QQ	R 	 r   N)rd   re   rf   r0   rH   r   r   propertyroomr   r   r   r   r   r   r   r  r   r   r   r   r   i  sk    A HD- HD%&    r   r   c                   (    e Zd Zd Zd Zed        Zy)_EncodingDictc                 &    t        |      x}| |<   |S r#   )r   )r.   r   rs      r   __missing__z_EncodingDict.__missing__  s    #E**DKr   c                 N    | j                  |      }| |   j                  |       y r#   )_row_characteristicsrH   )r.   r   r   s      r   add_rowz_EncodingDict.add_row  s$    ))#.U3r   c                     d}d}d}| D ]4  }|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  }6 |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   ru   vs        r   r  z"_EncodingDict._row_characteristics  s     	 	A
A$$V#a(5( 	!GA	 EA QZ'E!,u,QZ'Ea r   N)rd   re   rf   r  r  r   r  r   r   r   r  r    s        r   r  r^   c           
      	   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<    n0t        |	|      D ]!  \  }}||xx   t        ||z        |z  z  cc<   # t        |      }|rt        |      sd||dz  |
z   <   |j                  |       |||dz  |
z   <     t        |j                         t         j"                        }~g }t	        |      D ]N  \  }}t%        |dz   t        |            D ].  }||   }|j'                  |      }|dkD  st)        || ||f       0 P |rt+        |      \  }}}||   ||   ||   ||   }}d\  ||<   ||<   |j,                  |j,                  z  }t!        |      }|j/                  |j0                         |j/                  |j0                         t	        |      D ]h  \  }}|	|j,                  |k(  r!|j/                  |j0                         d||<   9|j'                  |      }|dkD  sPt)        || |t        |      f       j |j3                  |       |r|D cg c]  }||	 }}i }|j5                  t         j6                         g | _        |D ]  }t        |j0                        }|st        | j
                        }t9        j
                         }| j
                  j3                  |       t%        |      |_        t        |j                        |_        |dd |dd c|_        }t	        |j                        D ]  \  }
}|dz  |
z   ||<    |r t<        t<        i}|j1                         D ]  \  }}|||   nt<        ||<    t        | j                  j                        | j                  _        t        | j
                        | _         | j
                  D ],  }t        |j                        |_!        |jE                          . | jG                          |S c c}w )z@Optimize storage. Returns mapping from old VarIdxes to new ones.r   r^   Nr_   r   )NNrF   )$r;   r   r<   r  rn   r>   r   r@   r7   r   rT   r   anyr  r   r   r   r   r   r  r   r   r   r   r   rH   sortr   r   ri   r   r=   r?   rA   r:   r   )r.   use_NO_VARIATION_INDEXquantizationnzeroesfront_mapping	encodingsr   rC   rM   r   itemr   r   r  todoheapru   encodingjr  combining_gain_r  combined_encodingkencback_mappingr   
varidx_maps                                 r   VarStore_optimizer.    s   j 	D%%&AS1WFMI !. 7t++$TYY/ 	7KE4v,Cq $'t$< (LIq	Na'N( %(t$< LIq	Na,./,>N
 *C%c#h7;u{e34c"36M5B;%/0'	772 )""$)*A*ABD D  88q1uc$i( 	8A!!WN%77GN!A67		88 $-1a7?d1go#'7DG.%Qa (-->%n5  0  !5!56o 	@FAs{ yyN*!((3Q.@@EN!CI>?	@ 	%&; > +/Gh(2FGIG LNNy//N0DL ;x~~&%E::<DLL%"'(D"%d&9&9":D  %Wf~uVW~DIu(3 ;t&+rkU%:T"; ;" %&89J##% Q1+,=Q>P
1Q &)););)B)B%CD"DLL)D TYY
 	K Hs   =RRNc                 d   ddl m} ddlm} ddlm} ddlm}  |dt        j                        }|j                  dt        d	
       |j                  d       |j                  dd       |j                  |       } |d       |j                  }|j                  }|j                  }	 ||      }
|
d   }|j                   j"                  } |       }|j%                  ||
       t'        |j)                               }t+        d|z         |j-                  |      } |       }|j%                  ||
       t'        |j)                               }t+        d|z         |	O|j                   j/                  |       d|
v r|
d   j                   j/                  |       |
j1                  |	       yy)z&Optimize a font's GDEF variation storer   )ArgumentParser)configLogger)TTFont)OTTableWriterzvarLib.varStore)progdescriptionz--quantizationr^   )r   defaultfontfileoutfile?)nargsINFO)levelGDEFzBefore: %7d bytes)r  zAfter:  %7d bytesNGPOS)argparser0  	fontToolsr1  fontTools.ttLibr2  fontTools.ttLib.tables.otBaser3  main__doc__add_argumentint
parse_argsr  r7  r8  tableVarStorecompiler;   
getAllDataprintr:   remap_device_varidxessave)argsr0  r1  r2  r3  parseroptionsr  r7  r8  fontgdefstorewritersizer-  s                   r   rC  rC    su   '&&;!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__)Tr^   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   rI  r   objectr!   rT   rl   r>   r`   rw   	VarRegionr   r{   __bool__r}   r   r   subset_varidxesr   r   r   r   r   r=  collect_device_varidxesr>  r   r   rM  r   r   r  r.  r:   rC  rd   sysr;   argvexitdoctesttestmodfailedr   r   r   <module>rk     s   6 - 1 1   # # ** !3 <`F `F ,1 $ %

  1  ) ,E ,En "%#%:z 7 J2 3 ,5
 #A "@ '
 !=  < C CL%D %PGT ) )X z
388}qCHH_W__%%& r   