
    +g^                        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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    q/home/viktor/gitlab-persoonlijk/factuur-applicatie/venv/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                   ^    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y)OnlineVarStoreBuilderc                     || _         i | _        t        g |      | _        t	        | j                  g       | _        d | _        d | _        d | _        i | _	        i | _
        d | _        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                  r| j                  d   s| j                  d= d | _        d | _        y r   )r)   listr*   r-   r(   )r.   r3   s     r   r2   z!OnlineVarStoreBuilder.setSupports)   s@    h>>$.."3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$                        |z   dkD  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.   	num_items	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::??#i/&8!
%mR%HDJdkk112DKKK&&tzz2(,D  %$---+-##C(--c2DK r   roundc                    | j                   j                  ||      }|j                  d      }|| j                  |t              fS NrT   r   )r)   	getDeltaspopstoreDeltasr   )r.   master_valuesrU   deltasbases        r   storeMastersz"OnlineVarStoreBuilder.storeMasters\   sC    &&}E&Bzz!}T%%fG%<<<r   c                    |D cg c]  }| j                   j                  ||      ! }}|D cg c]  }|j                  d       }}|| j                  |t              fS c c}w c c}w rW   )r)   rX   rY   storeDeltasManyr   )r.   master_values_listrU   r[   deltas_listr\   	base_lists          r   storeMastersManyz&OnlineVarStoreBuilder.storeMastersManya   sw     "4
 KK!!-u!=
 
 2==vVZZ]=	=$..{'.JJJ
 >s
   $A"A'c                   |D cg c]
  } ||       }}t        |      t        | j                        dz   k(  rt        |dd        }n.t        |      t        | j                        k(  sJ t        |      }| j                  s| j	                          | j
                  j                  |      }||S t        | j                  j                        }|dk(  r'| j	                          | j                  |t              S | j                  j                  |t               | j                  dz  |z   }|| j
                  |<   |S c c}w )N   rF   rT      )r;   r*   r   r(   rS   r-   rG   r@   rZ   r   addItemrI   )r.   r\   rU   dvarIdxinners         r   rZ   z!OnlineVarStoreBuilder.storeDeltasi   s   $*+q%(++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          
         |D cg c]  }|D cg c]
  } ||       c} }}}t        d |D              }| j                  s| j                  t        |             | j                  j                  |      }||S t        | j                  j                        }|t        |      z   dkD  r1| j                  t        |             | j                  |t              S t        |      D ]J  \  }}| j                  j                  |t               | j                  dz  |z   |z   }|| j                  |<   L | j                  dz  |z   }|| j                  |<   |S c c}w c c}}w )Nc              3   2   K   | ]  }t        |        y wr#   )r   ).0r\   s     r   	<genexpr>z8OnlineVarStoreBuilder.storeDeltasMany.<locals>.<genexpr>   s     DfE&MDs   rF   rT   rg   )r   r(   rS   r;   r-   rG   r@   r`   r   	enumeraterh   rI   )r.   rb   rU   r\   ri   rj   rk   is           r   r`   z%OnlineVarStoreBuilder.storeDeltasMany   s=   @KLf&1Qa1LLDDDzzc+./-MDJJOO$3{##f,c+./''7'CC";/ 	)IAvJJvW5kkR'5014F"(DKK		) ++#u,#)K 1 2Ls   	EEEEN)T)rf   )__name__
__module____qualname__r0   r5   r2   rD   rS   rU   r^   rd   rZ   r`   r   r   r   r!   r!      sF    
!3F 49 =
 =B K ,1 4 5: r   r!   rT   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 Nrf   )VarRegionCountr;   r7   r@   rH   rA   )r.   r\   rU   ri   countUs	countThems         r   VarData_addItemrz      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   )rp   VarRegionAxis	PeakCoordaxisTag
StartCoordEndCoord)r.   	fvar_axesrq   regs       r   VarRegion_get_supportr      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 rv   )r   Formatr>   _varDataVarRegionListr<   _regionssetLocation)r.   varstorer   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#   )_scalarsr   s    r   r   zVarStoreInstancer._clearCaches   s	    r   c                     | j                   j                  |      }|M| j                  |   j                  | j                        }t        | j                  |      }|| j                   |<   |S r#   )r   rG   r   get_supportr   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)r\   scalarsdeltari   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 )Nrg   rF   r   )NO_VARIATION_INDEXr   VarRegionIndexr   r@   r   )r.   varidxmajorminorvarDatarir   r\   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.   varDataIndexr\   r   r   r   s         r   interpolateFromDeltasz'VarStoreInstancer.interpolateFromDeltas   sK    --181F1U1UV24??2&VV33FGDD Ws   A
N)rr   rs   rt   r0   r   r   r   staticmethodr   r   r   r   r   r   r   r      s9    57 #  EEr   r   TFr>   )r>   c          	         t        t              }|D ]*  }|t        k(  r|dz	  }|dz  }	||   j                  |	       , ~t	        | |      }
g }t        t        i}t        |
      D ]0  \  }}|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                        |_        |dk(  s|j                  |       3 t        | ||       t        | |dz   t        |             | j                          |S )Nrg   rF   r   r>   r9   Count)r   setr   addgetattrrp   rG   r;   rH   r@   ranger   rA   rB   setattrprune_regions)r.   varIdxesr:   retainFirstMapadvIdxesr>   usedrj   r   r   r   
newVarData
varDataMaprC   
usedMinorsnewMajorr   newItemsminorsnewMinors                       r   VarStore_subset_varidxesr      s    sD ''"U 	 dG$GJ$&89J ) 7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i##X#6;7> D':&D'G#S_5r   r   )r>   r   c                   t               }t        | |      D ]  }|j                  |j                          t        | |      }|j                  }g }i }t        |      D ]$  }	t        |      ||	<   |j                  ||	          & ||_        t        |j                        |_        t        | |      D ]$  }|j                  D 	cg c]  }	||	   	 c}	|_        & yc c}	w )zRemove unused VarRegions.N)	r   r   updater   r<   r   r;   rH   r=   )
r.   r>   r   usedRegionsrC   rL   rM   
newRegionsrK   rq   s
             r   VarStore_prune_regionsr   <  s     %Kg& 04../0 }-JGJIK  &:	!'!*%& #J !2!23Jg& 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   r   nameValueRecord__dict__values)r.   functhatconvs       r   r   r   X  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.   rg   N)DeltaFormatr   	StartSizeEndSize)r.   r   s     r   _Device_recordVarIdxr   n  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   t  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   rg   rF   )idr   r   r   r   )r.   mappingdonerj   s       r   _Device_mapVarIdxr   }  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                   J    e Zd Zd Zd 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__  sD    
u%
}}U+55dllCU
r   c                 :    | j                   j                  |       y r#   )r   r   )r.   rows     r   rH   z_Encoding.append  s    

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

#r   c                 2    | j                   | j                  fS r#   )r   r   r   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   rf         r   )r   colsrq   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)rr   rs   rt   r0   rH   r   r   r   r   r   r  r   r   r   r   r     sC    &    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   rf   i   r   i i  Tr        r   )r   	longWordsr   rq   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)rr   rs   rt   r  r  r   r  r   r   r   r  r    s        r   r  rf   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         j"                         g | _        |D ]  }t        |j0                        }|st        | j
                        }t7        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                        |_         |jC                          . | jE                          |S c c}w )z@Optimize storage. Returns mapping from old VarIdxes to new ones.r   rf   Nrg   r   )NNrF   )#r;   r   r<   r  rp   r>   r   r@   r7   r   rU   r   anyr  r   r   r   r   r   r  r   r   r   r   r   rH   sortr   rw   r   r=   r?   rA   r:   r   )r.   use_NO_VARIATION_INDEXquantizationnzeroesfront_mapping	encodingsr   rC   rN   r   itemr   r   r  todoheaprq   encodingjr  combining_gain_r  combined_encodingkencback_mappingr   
varidx_maps                                 r   VarStore_optimizer0    s   X 	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 )""$)*B*BCD 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--quantizationrf   )r   defaultfontfileoutfile?)nargsINFO)levelGDEFzBefore: %7d bytes)r  zAfter:  %7d bytesNGPOS)argparser2  	fontToolsr3  fontTools.ttLibr4  fontTools.ttLib.tables.otBaser5  main__doc__add_argumentint
parse_argsr  r9  r:  tableVarStorecompiler;   
getAllDataprintr:   remap_device_varidxessave)argsr2  r3  r4  r5  parseroptionsr  r9  r:  fontgdefstorewritersizer/  s                   r   rE  rE    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__)Trf   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!   rU   rz   r>   rh   r   	VarRegionr   r   __bool__r   r   r   subset_varidxesr   r   r   r   r   r?  collect_device_varidxesr@  r   r   rO  r   r   r  r0  r:   rE  rr   sysr;   argvexitdoctesttestmodfailedr   r   r   <module>rm     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CHH_W__%%& r   