U
    Q»{jë}  ã                   @   sò   d dl mZmZmZmZm	Z	 d dl
mZ d dlZd dlmZmZ d dlZd dlZd dlZd dlZdZdZdZdZd	Zd
Zd
ZdZdZdZdZdZdZ e !e"¡Z#G dd„ de$ƒZ%dd„ Z&e d fdd„Z'dddœdd„Z(dd„ Z)dd„ Z*dd„ Z+dS ) é    )ÚfixedToFloatÚfloatToFixedÚfloatToFixedToStrÚstrToFixedToFloatÚotRound)ÚsafeEvalN)ÚCounterÚdefaultdicti €  i @  i    é€   é@   éÀ   é?   é   iÿ  c                   @   s4  e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	i dfddœdd„Z
dd„ Zdd„ Zedd„ ƒZedd„ ƒZedd„ ƒZd?dd„Zed@ddœd d!„ƒZed"d#„ ƒZedAd$d%„ƒZedBd&d'„ƒZedCd(d)„ƒZedDd+d,„ƒZed-d.„ ƒZd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ ZdEd9d:„Zd;d<„ Zd=d>„ ZdS )FÚTupleVariationc                 C   s   |  ¡ | _t|ƒ| _d S ©N)ÚcopyÚaxesÚlistÚcoordinates)Úselfr   r   © r   úd/var/www/html/bwave/python/venv/lib/python3.8/site-packages/fontTools/ttLib/tables/TupleVariation.pyÚ__init__(   s    
zTupleVariation.__init__c                 C   s,   d  tdd„ | j ¡ D ƒƒ¡}d|| jf S )Nú,c                 S   s   g | ]\}}d ||f ‘qS )z%s=%sr   )Ú.0ÚnameÚvaluer   r   r   Ú
<listcomp>.   s     z+TupleVariation.__repr__.<locals>.<listcomp>z<TupleVariation %s %s>)ÚjoinÚsortedr   Úitemsr   )r   r   r   r   r   Ú__repr__,   s    ÿzTupleVariation.__repr__c                 C   s   | j |j ko| j|jkS r   )r   r   )r   Úotherr   r   r   Ú__eq__2   s    zTupleVariation.__eq__c                 C   s4   d | j krtƒ S tdd„ t| j ƒD ƒƒ}|r0|S d S )Nc                 S   s   g | ]\}}|d k	r|‘qS r   r   )r   ÚiÚpr   r   r   r   9   s      z0TupleVariation.getUsedPoints.<locals>.<listcomp>)r   Ú	frozensetÚ	enumerate)r   Úusedr   r   r   ÚgetUsedPoints5   s    
zTupleVariation.getUsedPointsc                 C   s   t dd„ | jD ƒƒS )zÄReturns True if this TupleVariation has any visible impact.

        If the result is False, the TupleVariation can be omitted from the font
        without making any visible difference.
        c                 s   s   | ]}|d k	V  qd S r   r   ©r   Úcr   r   r   Ú	<genexpr>C   s     z+TupleVariation.hasImpact.<locals>.<genexpr>)Úanyr   ©r   r   r   r   Ú	hasImpact=   s    zTupleVariation.hasImpactc                 C   sš  |  d¡ | ¡  |D ] }| j |¡}|d k	r|\}}}t|dƒ}t|dƒ}||krt||krt|jd|t|dƒd� n:d|fdt|dƒfdt|dƒfd	t|dƒfg}	| d|	¡ | ¡  qd
}
t| j	ƒD ]¤\}}t
|ƒtk�rt|ƒdk�r|jd||d |d d� | ¡  d}
qÆt
|ƒtk�r>|jd||d� | ¡  d}
qÆ|d k	rÆt d¡ | d| ¡ | ¡  d}
qÆ|
�s„| d¡ | ¡  | d¡ | ¡  d S )NÚtupleç        Úcoordé   )Úaxisr   r4   Úminr   ÚmaxFé   Údeltar   é   )ÚptÚxÚyT)Úcvtr   zbad delta formatzbad delta #%dz	no deltas)ZbegintagÚnewliner   Úgetr5   r6   Z	simpletagÚfl2strr'   r   Útyper0   ÚlenÚintÚlogÚerrorÚcommentZendtag)r   ÚwriterÚaxisTagsr4   r   ÚminValueÚmaxValueÚdefaultMinValueÚdefaultMaxValueÚattrsZwrote_any_deltasr$   r8   r   r   r   ÚtoXMLE   sJ    



ü



zTupleVariation.toXMLc                 C   sø   |dkrh|d }t |d dƒ}t|dƒ}t|dƒ}t | d|¡dƒ}t | d|¡dƒ}	|||	f| j|< nŒ|dkrôd	|kr¬t|d	 ƒ}
t|d
 ƒ}t|d ƒ}||f| j|
< nHd|krØt|d ƒ}t|d ƒ}|| j|< nt dd 	t
| ¡ ƒ¡ ¡ d S )Nr2   r4   r   r3   r1   r5   r6   r8   r:   r;   r<   r=   zbad delta format: %sz, )Ústr2flr5   r6   r?   r   r   r   rD   Úwarningr   r   Úkeys)r   r   rM   Ú_contentr4   r   rK   rL   rI   rJ   Úpointr;   r<   r=   r   r   r   ÚfromXMLn   s&    

zTupleVariation.fromXMLNT©ÚoptimizeSizec                C   s   t | j ¡ ƒt |ƒks*td| j ¡ |fƒ‚g }g }|d krX|  ¡ }|d krNdS |  |¡}|  |¡}| |¡}	|	d kr‚t}	| 	|¡ |  
|¡}
|
d k	r¦|	tO }	| 	|
¡ |r¼|	tO }	| 	|¡ | 	| j|d�¡ d |¡}| dt dt|ƒ|	¡¡ d |¡|fS )NzUnknown axis tag found.)ó    rW   rU   rW   r   ú>HH)Úsetr   rQ   ÚAssertionErrorr)   ÚcompilePointsÚcompileCoordr?   ÚEMBEDDED_PEAK_TUPLEÚappendÚcompileIntermediateCoordÚINTERMEDIATE_REGIONÚPRIVATE_POINT_NUMBERSÚcompileDeltasr   ÚinsertÚstructÚpackrB   )r   rH   ZsharedCoordIndicesÚ	pointDatarV   Ú	tupleDataÚauxDataZ
usedPointsr2   ÚflagsZintermediateCoordr   r   r   Úcompile„   s8    ý







zTupleVariation.compilec              	   C   sX   g }| j }|D ]>}| |¡}|d kr0| d¡ q| t dt|d dƒ¡¡ qd |¡S )Ns     ú>hr9   r3   rW   )r   r?   r^   rd   re   Úfl2fir   )r   rH   Úresultr   r4   Ztripler   r   r   r\   ¬   s    
zTupleVariation.compileCoordc              	   C   sº   d}|D ]D}| j  |d¡\}}}t|dƒ}t|dƒ}||ksD||krd} qNq|sVd S g }	g }
|D ]H}| j  |d¡\}}}|	 t dt|dƒ¡¡ |
 t dt|dƒ¡¡ qbd |	|
 ¡S )NF©r1   r1   r1   r1   Trk   r3   rW   )	r   r?   r5   r6   r^   rd   re   rl   r   )r   rH   Úneededr4   rI   r   rJ   rK   rL   Z	minCoordsZ	maxCoordsr   r   r   r_   ·   s"    

z'TupleVariation.compileIntermediateCoordc              	   C   sH   i }|}| D ]2}t t d|||d … ¡d dƒ||< |d7 }q||fS )Nrk   r7   r   r3   )Úfi2flrd   Úunpack)rH   ÚdataÚoffsetr2   Úposr4   r   r   r   ÚdecompileCoord_Ê   s    &
zTupleVariation.decompileCoord_c                 C   sR  | sdS t | ƒ} |  ¡  t| ƒ}tƒ }|dk r:| |¡ n | |d? dB ¡ | |d@ ¡ d}d}d}||k �rNd}t|ƒ}| d¡ d }||k �r(||k�r(| | }	|	| }
|d krÎd|
  koÈdkn  }|ræ|
dksâ|
dk ræ�q(|rö| |
¡ n| |
d? ¡ | |
d@ ¡ |	}|d7 }|d7 }qŠ|�r<|d ||< qf|d tB ||< qf|S )Nó    r
   é   éÿ   r   r   r9   )r   ÚsortrB   Ú	bytearrayr^   ÚPOINTS_ARE_WORDS)ÚpointsÚ	numPointsrm   ZMAX_RUN_LENGTHrt   Z	lastValueÚ	runLengthZ	headerPosZuseByteEncodingZcurValuer8   r   r   r   r[   Ó   sH    


zTupleVariation.compilePointsc                    sp  |dkst ‚|}|| }|d7 }|t@ dkrH|t@ d> || B }|d7 }|dkr\tˆ ƒ|fS g }t|ƒ|k �r|| }|d7 }|t@ d }d}	|t@ dkr®t d¡}
|d }nt d¡}
|}|
 |||| … ¡ tjdkrä|
 	¡  t|
ƒ|ksôt ‚||7 }| 
|
¡ q`g }d}|D ]}||7 }| |¡ �q|}~‡ fd	d
„|D ƒ}|�rht dd t|ƒ¡|f ¡ ||fS )zJ(numPoints, data, offset, tableTag) --> ([point1, point2, ...], newOffset)©ÚcvarÚgvarr9   r   rw   ÚHr7   ÚBÚbigc                    s$   h | ]}|d k s|ˆ krt |ƒ’qS )r   )Ústr)r   r%   ©r}   r   r   Ú	<setcomp>?  s       z2TupleVariation.decompilePoints_.<locals>.<setcomp>z#point %s out of range in '%s' tabler   )rZ   r{   ÚPOINT_RUN_COUNT_MASKÚrangerB   ÚarrayÚ	frombytesÚsysÚ	byteorderÚbyteswapÚextendr^   rD   rP   r   r   )r}   rr   rs   ÚtableTagrt   ZnumPointsInDatarm   Ú	runHeaderZnumPointsInRunrS   r|   Z
pointsSizeÚabsoluteÚcurrentr8   Z	badPointsr   r†   r   ÚdecompilePoints_  sR    



ÿÿzTupleVariation.decompilePoints_c                 C   s’   g }g }|   ¡ dkrH| jD ]*}|d kr(q| |d ¡ | |d ¡ qn | jD ]}|d kr\qN| |¡ qNtƒ }| j|||d� | j|||d� |S )Nr7   r   r9   rU   )ÚgetCoordWidthr   r^   rz   ÚcompileDeltaValues_)r   rV   ZdeltaXZdeltaYr+   Úbytearrr   r   r   rb   G  s     

zTupleVariation.compileDeltasc                C   s†  |dkrt ƒ }d}t| ƒ}|r¨||k r¦| | }|dkrFt | ||¡}qd|  krZdkrnn nt | ||¡}qd|  kr‚dkr–n nt | ||¡}qt | ||¡}qnÄt| ƒt| ƒ }}|d  krÎ|krân nt | ||¡}nŠd|  k�r|  k�rdk�rn ntj| ||dd�}nNd|  k�rB|  k�rBdk�rZn ntj| ||dd�}ntj| ||dd�}||k�s‚t	||fƒ‚|S )	aê  [value1, value2, value3, ...] --> bytearray

        Emits a sequence of runs. Each run starts with a
        byte-sized header whose 6 least significant bits
        (header & 0x3F) indicate how many values are encoded
        in this run. The stored length is the actual length
        minus one; run lengths are thus in the range [1..64].
        If the header byte has its most significant bit (0x80)
        set, all values in this run are zero, and no data
        follows. Otherwise, the header byte is followed by
        ((header & 0x3F) + 1) signed values.  If (header &
        0x40) is clear, the delta values are stored as signed
        bytes; if (header & 0x40) is set, the delta values are
        signed 16-bit integers.
        Nr   é€ÿÿÿr   é €ÿÿéÿ  FrU   )
rz   rB   r   ÚencodeDeltaRunAsZeroes_ÚencodeDeltaRunAsBytes_ÚencodeDeltaRunAsWords_ÚencodeDeltaRunAsLongs_r5   r6   rZ   )Údeltasr—   rV   rt   Ú	numDeltasr   ZminValZmaxValr   r   r   r–   Z  sN    (   ÿ(   ÿ   ÿz"TupleVariation.compileDeltaValues_c                 C   sl   |}t | ƒ}||k r*| | dkr*|d7 }q|| }|dkrR| tdB ¡ |d8 }q2|rh| t|d B ¡ |S )Nr   r9   r   r   )rB   r^   ÚDELTAS_ARE_ZERO)rŸ   rs   r—   rt   r    r~   r   r   r   r›   ‘  s    

z&TupleVariation.encodeDeltaRunAsZeroes_c              	   C   sâ   |}t | ƒ}||k rh| | }d|  kr0dks4qh qh|r^|dkr^|d |k r^| |d  dkr^qh|d7 }q|| }|dkr²| d¡ | t d| ||d … ¡¡ |d7 }|d8 }qp|rÞ| |d ¡ | t d| ||… ¡¡ |S )Nr˜   r   r   r9   r   r   Úb)rB   r^   r�   rŠ   )rŸ   rs   r—   rV   rt   r    r   r~   r   r   r   rœ   Ÿ  s4    
ÿþ
ýü


z%TupleVariation.encodeDeltaRunAsBytes_c           	      C   sH  |}t | ƒ}||k r–| | }|r*|dkr*q–|rtd|  krBdkrtn n.|d |k rtd| |d    krndkrtq– nq–d|  krˆdksŒq– q–|d7 }q|| }|dkrú| tdB ¡ t d	| ||d … ¡}tjd
krÞ| ¡  | |¡ |d7 }|d8 }qž|�rD| t|d B ¡ t d	| ||… ¡}tjd
k�r:| ¡  | |¡ |S )Nr   r˜   r   r9   r™   rš   r   r   Úhr„   )rB   r^   ÚDELTAS_ARE_WORDSrŠ   rŒ   r�   rŽ   r�   ©	rŸ   rs   r—   rV   rt   r    r   r~   Úar   r   r   r�   Â  sP    		ÿ þþ

ý 
üü





z%TupleVariation.encodeDeltaRunAsWords_c           	      C   sò   |}t | ƒ}||k rD| | }|r:d|  kr4dkr:qD nqD|d7 }q|| }|dkr¨| tdB ¡ t d| ||d … ¡}tjdkrŒ| ¡  | |¡ |d7 }|d8 }qL|rî| t|d B ¡ t d| ||… ¡}tjdkrä| ¡  | |¡ |S )Nr™   rš   r9   r   r   r$   r„   )rB   r^   ÚDELTAS_ARE_LONGSrŠ   rŒ   r�   rŽ   r�   r¥   r   r   r   rž   ö  s.    





z%TupleVariation.encodeDeltaRunAsLongs_r   c           	      C   s2  g }|}| dk	r t |ƒ| k �rn|t |ƒk �r|| }|d7 }|t@ d }|t@ tkrh| dg| ¡ q|t@ tkrˆt d¡}|d }n.|t@ tkr¨t d¡}|d }nt d¡}|}| |||| … ¡ t	j
d	krÞ| ¡  t |ƒ|ksútt |ƒ|fƒ‚||7 }| |¡ q| dk�s*t |ƒ| k�s*t‚||fS )
z>(numDeltas, data, offset) --> ([delta, delta, ...], newOffset)Nr9   r   r$   é   r£   r7   r¢   r„   )rB   ÚDELTA_RUN_COUNT_MASKÚDELTAS_SIZE_MASKr¡   r�   r§   rŠ   r¤   r‹   rŒ   r�   rŽ   rZ   )	r    rr   rs   rm   rt   r‘   ZnumDeltasInRunrŸ   Z
deltasSizer   r   r   ÚdecompileDeltas_  s0    &





zTupleVariation.decompileDeltas_c                 C   s8   d}| t @ dkr||d 7 }| t@ dkr4||d 7 }|S )Nr¨   r   r7   )r]   r`   )ri   Z	axisCountÚsizer   r   r   ÚgetTupleSize_.  s    zTupleVariation.getTupleSize_c                 C   sb   t dd„ | jD ƒdƒ}|dkr"dS t|ƒttfkr6dS t|ƒtkrRt|ƒdkrRdS td| ƒ‚dS )zmReturn 2 if coordinates are (x, y) as in gvar, 1 if single values
        as in cvar, or 0 if empty.
        c                 s   s   | ]}|d k	r|V  qd S r   r   r*   r   r   r   r,   ;  s      z/TupleVariation.getCoordWidth.<locals>.<genexpr>Nr   r9   r7   zSinvalid type of delta; expected (int or float) number, or Tuple[number, number]: %r)Únextr   rA   rC   Úfloatr0   rB   Ú	TypeError)r   Z
firstDeltar   r   r   r•   7  s    ÿÿzTupleVariation.getCoordWidthc                    s0   ˆdkrd S |   ¡ ‰ ‡ ‡fdd„| jD ƒ| _d S )Ng      ð?c                    s@   g | ]8}|d krd n&ˆ dkr$|ˆ n|d ˆ |d ˆ f‘qS ©Nr9   r   r   ©r   Úd©Ú
coordWidthÚscalarr   r   r   K  s   ýÿz.TupleVariation.scaleDeltas.<locals>.<listcomp>©r•   r   ©r   r¶   r   r´   r   ÚscaleDeltasG  s    úzTupleVariation.scaleDeltasc                    s"   |   ¡ ‰ ‡ fdd„| jD ƒ| _d S )Nc                    s@   g | ]8}|d krd n&ˆ dkr$t |ƒnt |d ƒt |d ƒf‘qS r±   )r   r²   ©rµ   r   r   r   V  s   ýÿz.TupleVariation.roundDeltas.<locals>.<listcomp>r·   r.   r   rº   r   ÚroundDeltasT  s    
úzTupleVariation.roundDeltasc                 C   sj   ddl m} |  ¡ dkr tdƒ‚d | jkrft| jƒt|ƒkrVtdt| jƒt|ƒf ƒ‚|| j||ƒ| _d S )Nr   )Ú	iup_deltar9   z3Only 'gvar' TupleVariation can have inferred deltasz(Expected len(origCoords) == %d; found %d)ÚfontTools.varLib.iupr¼   r•   r°   r   rB   Ú
ValueError)r   Ú
origCoordsÚendPtsr¼   r   r   r   ÚcalcInferredDeltas_  s    
ÿÿz!TupleVariation.calcInferredDeltasç      à?Fc                 C   sÌ   ddl m} d | jkrd S || j|||d�}d |krÈ|rbtdd„ |D ƒƒrbdgd gt|ƒd   }t| j|ƒ}t| j ¡ ƒ}|  	|¡\}	}
t|	ƒt|
ƒ }| 	|¡\}	}
t|	ƒt|
ƒ }||k rÈ|j| _d S )Nr   )Úiup_delta_optimize)Ú	tolerancec                 s   s   | ]}|d kV  qd S r   r   r²   r   r   r   r,   v  s     z*TupleVariation.optimize.<locals>.<genexpr>)r   r   r9   )
r½   rÃ   r   ÚallrB   r   r   r   rQ   rj   )r   r¿   rÀ   rÄ   ZisCompositerÃ   ZdeltaOptZvarOptrH   rg   rh   ZunoptimizedLengthZoptimizedLengthr   r   r   Úoptimizel  s(    
   ÿzTupleVariation.optimizec                 C   s   |   |¡ | S r   )r¹   r¸   r   r   r   Ú__imul__‡  s    
zTupleVariation.__imul__c              	   C   s  t |tƒstS | j}t|ƒ}|j}t|ƒ|kr6tdƒ‚|  ¡ dkrªtt|ƒ|ƒD ]V\}}|| }z(|d |d  |d |d  f||< W qP t	k
r¤   tdƒ‚Y qPX qPnVtt|ƒ|ƒD ]F\}}|| }|d k	ræ|d k	ræ|| ||< q¸|d kr¸|d k	r¸|||< q¸| S )Nz7cannot sum TupleVariation deltas with different lengthsr7   r   r9   z+cannot sum gvar deltas with inferred points)
Ú
isinstancer   ÚNotImplementedr   rB   r¾   r•   Úzipr‰   r°   )r   r"   Zdeltas1ÚlengthZdeltas2r$   Zd2Zd1r   r   r   Ú__iadd__‹  s*    
	(
zTupleVariation.__iadd__)T)N)T)T)T)r   )rÂ   F) Ú__name__Ú
__module__Ú__qualname__r   r!   r#   r)   r/   rN   rT   rj   r\   r_   Ústaticmethodru   r[   r”   rb   r–   r›   rœ   r�   rž   r«   r­   r•   r¹   r»   rÁ   rÆ   rÇ   rÌ   r   r   r   r   r   '   sT   ) ÿÿ(

@
2
6
"3

r   c                 C   s2   g }t |ƒD ] }t | ||¡\}}| |¡ q|S r   )r‰   r   ru   r^   )rH   ZsharedTupleCountrr   rs   rm   Ú_Útr   r   r   ÚdecompileSharedTuples­  s
    rÓ   r9   c                 C   sN   t ƒ }|D ]}| | ¡}||  d7  < q
t| |¡dd„ d�}dd„ |D ƒS )Nr9   c                 S   s   | d  | d fS r±   r   )Úitemr   r   r   Ú<lambda>À  rW   z%compileSharedTuples.<locals>.<lambda>©Úkeyc                 S   s    g | ]}|d  d kr|d ‘qS )r9   r   r   r*   r   r   r   r   Â  s      z'compileSharedTuples.<locals>.<listcomp>)r   r\   r   Úmost_common)rH   Ú
variationsZMAX_NUM_SHARED_COORDSZ
coordCountÚvarr2   ZsharedCoordsr   r   r   ÚcompileSharedTuplesµ  s    
þrÛ   TrU   c                   sZ  ~g }g }d ‰t tƒ}| D ]:}	|	 ¡ }
|
d kr0q||
  d7  < | |	¡ | |
¡ q|} ~| sddS t| d jƒ‰t‡fdd„| D ƒƒs�tdƒ‚dd„ |D ƒ‰ t| ƒ}g }g }|rè‡ fd	d
„}t| 	¡ |d�d ‰| ˆ ˆ ¡ |t
O }‡ ‡fdd„|D ƒ}t| |ƒD ]4\}	}|	j||||d�\}}| |¡ | |¡ �qd |¡}d |¡}|||fS )Nr9   )r   rW   rW   r   c                 3   s   | ]}t |jƒˆ kV  qd S r   )rB   r   )r   Úv)Únr   r   r,   å  s    z-compileTupleVariationStore.<locals>.<genexpr>z#Variation sets have different sizesc                 S   s   i | ]}|t  |¡“qS r   )r   r[   )r   ÚpointSetr   r   r   Ú
<dictcomp>é  s     z.compileTupleVariationStore.<locals>.<dictcomp>c                    s$   | d }| d }t ˆ | ƒ|d  S )Nr   r9   )rB   )ZpnrÞ   Úcount)ÚcompiledPointsr   r   r×   ó  s    z'compileTupleVariationStore.<locals>.keyrÖ   c                    s    g | ]}|ˆkrˆ | nd ‘qS )rW   r   )r   r|   )rá   ÚsharedPointsr   r   r   þ  s   ÿz.compileTupleVariationStore.<locals>.<listcomp>)rf   rV   rW   )r	   rC   r)   r^   rB   r   rÅ   rZ   r6   r    ÚTUPLES_SHARE_POINT_NUMBERSrÊ   rj   r   )rÙ   Ú
pointCountrH   ZsharedTupleIndicesZuseSharedPointsrV   ZnewVariationsZ
pointDatasZpointSetCountrÜ   r|   ÚtupleVariationCountZtuplesrr   r×   r%   Z	thisTupleZthisDatar   )rá   rÝ   râ   r   ÚcompileTupleVariationStoreÅ  s`    

ÿ
þÿþ   ÿ



ræ   c                 C   sº   t |ƒ}g }	|t@ dkr.t |||| ¡\}
}ng }
t|t@ ƒD ]v}t d|||d … ¡\}}t ||¡}|||| … }|||| … }|	 	t
|||
| |||ƒ¡ ||7 }||7 }q>|	S )Nr   rX   r¨   )rB   rã   r   r”   r‰   ÚTUPLE_COUNT_MASKrd   rq   r­   r^   ÚdecompileTupleVariation_)r�   rH   rå   rä   ÚsharedTuplesrr   rt   ZdataPosZnumAxesrm   râ   rÑ   ZdataSizeri   Z	tupleSizerg   ZpointDeltaDatar   r   r   ÚdecompileTupleVariationStore  s:    
   ÿ
ùÿ
rê   c                 C   sÜ  |dkst |ƒ‚t d|dd… ¡d }d}|t@ dkrF||t@  }	nt |||¡\}	}|t@ dkrŠt |||¡\}
}t |||¡\}}nt|	ƒ\}
}i }|D ]*}|
| |	| || f}|dkrž|||< qžd}|t	@ dkrðt 
| |||¡\}}n|}d g|  }|dk�rZt t|ƒ||¡\}}t||ƒD ].\}}d|  k�rH| k �r(n n|||< �q(nx|dk�rÒt t|ƒ||¡\}}t t|ƒ||¡\}}t|||ƒD ]4\}}}d|  k�r¾| k �rœn n||f||< �qœt||ƒS )	Nr   z>Hr7   r¨   r   rn   r€   r�   )rZ   rd   rq   r]   ÚTUPLE_INDEX_MASKr   ru   r`   ÚinferRegion_ra   r”   r«   rB   rÊ   )rä   ré   râ   r�   rH   rr   rg   ri   rt   ÚpeakÚstartÚendr   r4   Úregionr|   rŸ   Z
deltas_cvtr%   r8   Zdeltas_xZdeltas_yr;   r<   r   r   r   rè   7  sJ    
   ÿ



rè   c                 C   s@   i i  }}|   ¡ D ]$\}}t|dƒ||< t|dƒ||< q||fS )aî  Infer start and end for a (non-intermediate) region

    This helper function computes the applicability region for
    variation tuples whose INTERMEDIATE_REGION flag is not set in the
    TupleVariationHeader structure.  Variation tuples apply only to
    certain regions of the variation space; outside that region, the
    tuple has no effect.  To make the binary encoding more compact,
    TupleVariationHeaders can omit the intermediateStartTuple and
    intermediateEndTuple fields.
    r1   )r    r5   r6   )rí   rî   rï   r4   r   r   r   r   rì   e  s
    
rì   )T),ZfontTools.misc.fixedToolsr   rp   r   rl   r   r@   r   rO   r   ZfontTools.misc.textToolsr   rŠ   Úcollectionsr   r	   ÚioÚloggingrd   rŒ   r]   r`   ra   r¡   r¤   r§   rª   r©   r{   rˆ   rã   rç   rë   Ú	getLoggerrÍ   rD   Úobjectr   rÓ   rÛ   ræ   rê   rè   rì   r   r   r   r   Ú<module>   sJ   
     	ÿ
 ûùK'.