a
    ¥Q•hë}  ã                   @   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   ú^/var/www/sistema_ama/venv/lib/python3.9/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>.   ó    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 vrtƒ S tdd„ t| j ƒD ƒƒ}|r0|S d S )Nc                 S   s   g | ]\}}|d ur|‘qS r   r   )r   ÚiÚpr   r   r   r   9   r   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 uV  qd S r   r   ©r   Úcr   r   r   Ú	<genexpr>C   r   z+TupleVariation.hasImpact.<locals>.<genexpr>)Úanyr   ©r   r   r   r   Ú	hasImpact=   s    zTupleVariation.hasImpactc                 C   sš  |  d¡ | ¡  |D ] }| j |¡}|d u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 urÆt d¡ | d| ¡ | ¡  d}
qÆ|
�s„| d¡ | ¡  | d¡ | ¡  d S )NÚtupleç        Úcoordé   )Úaxisr   r5   Úminr   ÚmaxFé   Údeltar   é   )ÚptÚxÚyT)Úcvtr   zbad delta formatzbad delta #%dz	no deltas)ÚbegintagÚnewliner   Úgetr6   r7   Ú	simpletagÚfl2strr(   r   Útyper1   ÚlenÚintÚlogÚerrorÚcommentÚendtag)r   ÚwriterÚaxisTagsr5   r   ÚminValueÚmaxValueÚdefaultMinValueÚdefaultMaxValueÚattrsZwrote_any_deltasr%   r9   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	|v r¬t|d	 ƒ}
t|d
 ƒ}t|d ƒ}||f| j|
< nHd|v rØt|d ƒ}t|d ƒ}|| j|< nt dd 	t
| ¡ ƒ¡ ¡ d S )Nr3   r5   r   r4   r2   r6   r7   r9   r;   r<   r=   r>   zbad delta format: %sz, )Ústr2flr6   r7   rA   r   r   r   rG   Úwarningr   r    Úkeys)r   r   rQ   Ú_contentr5   r   rO   rP   rM   rN   Úpointr<   r=   r>   r   r   r   ÚfromXMLn   s&    

zTupleVariation.fromXMLNT©ÚoptimizeSizec                C   s   t | j ¡ ƒt |ƒks*J d| j ¡ |fƒ‚g }g }|d u rX|  ¡ }|d u rNdS |  |¡}|  |¡}| |¡}	|	d u r‚t}	| |¡ |  	|¡}
|
d ur¦|	t
O }	| |
¡ |r¼|	tO }	| |¡ | | j|d�¡ d |¡}| dt dt|ƒ|	¡¡ d |¡|fS )NzUnknown axis tag found.)r   r   rY   r   r   ú>HH)Úsetr   rU   r*   ÚcompilePointsÚcompileCoordrA   ÚEMBEDDED_PEAK_TUPLEÚappendÚcompileIntermediateCoordÚINTERMEDIATE_REGIONÚPRIVATE_POINT_NUMBERSÚcompileDeltasr   ÚinsertÚstructÚpackrE   )r   rL   ZsharedCoordIndicesÚ	pointDatarZ   Ú	tupleDataÚauxDataZ
usedPointsr3   ÚflagsZintermediateCoordr   r   r   Úcompile„   s8    ý







zTupleVariation.compilec              	   C   sX   g }| j }|D ]>}| |¡}|d u r0| d¡ q| t dt|d dƒ¡¡ qd |¡S )Ns     ú>hr:   r4   r   )r   rA   r`   rf   rg   Úfl2fir   )r   rL   Úresultr   r5   Ú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©r2   r2   r2   r2   Trm   r4   r   )	r   rA   r6   r7   r`   rf   rg   rn   r   )r   rL   Úneededr5   rM   r   rN   rO   rP   Z	minCoordsZ	maxCoordsr   r   r   ra   ·   s"    

z'TupleVariation.compileIntermediateCoordc              	   C   sH   i }|}| D ]2}t t d|||d … ¡d dƒ||< |d7 }q||fS )Nrm   r8   r   r4   )Úfi2flrf   Úunpack)rL   ÚdataÚoffsetr3   Úposr5   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 u 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   r:   )r   ÚsortrE   Ú	bytearrayr`   ÚPOINTS_ARE_WORDS)ÚpointsÚ	numPointsro   ZMAX_RUN_LENGTHrw   Z	lastValueÚ	runLengthZ	headerPosZuseByteEncodingZcurValuer9   r   r   r   r]   Ó   sH    


zTupleVariation.compilePointsc                    sp  |dv sJ ‚|}|| }|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ôJ ‚||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Úgvarr:   r   rz   ÚHr8   ÚBÚbigc                    s$   h | ]}|d k s|ˆ krt |ƒ’qS )r   )Ústr)r   r&   ©r€   r   r   Ú	<setcomp>?  r   z2TupleVariation.decompilePoints_.<locals>.<setcomp>z#point %s out of range in '%s' tabler   )r~   ÚPOINT_RUN_COUNT_MASKÚrangerE   ÚarrayÚ	frombytesÚsysÚ	byteorderÚbyteswapÚextendr`   rG   rT   r   r    )r€   ru   rv   ÚtableTagrw   ZnumPointsInDataro   Ú	runHeaderZnumPointsInRunrW   r   Z
pointsSizeÚabsoluteÚcurrentr9   Z	badPointsr   r‰   r   ÚdecompilePoints_  sR    



ÿÿzTupleVariation.decompilePoints_c                 C   s’   g }g }|   ¡ dkrH| jD ]*}|d u r(q| |d ¡ | |d ¡ qn | jD ]}|d u r\qN| |¡ qNtƒ }| j|||d� | j|||d� |S )Nr8   r   r:   rY   )ÚgetCoordWidthr   r`   r}   ÚcompileDeltaValues_)r   rZ   ZdeltaXZdeltaYr,   Úbytearrr   r   r   rd   G  s     

zTupleVariation.compileDeltasc                C   s†  |du 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‚J ||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   é €ÿÿéÿ  FrY   )	r}   rE   r   ÚencodeDeltaRunAsZeroes_ÚencodeDeltaRunAsBytes_ÚencodeDeltaRunAsWords_ÚencodeDeltaRunAsLongs_r6   r7   )Údeltasrš   rZ   rw   Ú	numDeltasr   ZminValZmaxValr   r   r   r™   Z  s<    (ÿ(ÿÿ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   r:   r   r   )rE   r`   ÚDELTAS_ARE_ZERO)r¢   rv   rš   rw   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   r:   r   r   Úb)rE   r`   r’   r�   )r¢   rv   rš   rZ   rw   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   r:   rœ   r�   r   r   Úhr‡   )rE   r`   ÚDELTAS_ARE_WORDSr�   r�   r�   r‘   r’   ©	r¢   rv   rš   rZ   rw   r£   r   r�   Úar   r   r   r    Â  sL    		ÿþþ

ýüü





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�   r:   r   r   r%   r‡   )rE   r`   ÚDELTAS_ARE_LONGSr�   r�   r�   r‘   r’   r¨   r   r   r   r¡   ö  s.    





z%TupleVariation.encodeDeltaRunAsLongs_r   c           	      C   s2  g }|}| du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úJ t |ƒ|fƒ‚||7 }| |¡ q| du �s*t |ƒ| k�s*J ‚||fS )
z>(numDeltas, data, offset) --> ([delta, delta, ...], newOffset)Nr:   r   r%   é   r¦   r8   r¥   r‡   )rE   ÚDELTA_RUN_COUNT_MASKÚDELTAS_SIZE_MASKr¤   r’   rª   r�   r§   rŽ   r�   r�   r‘   )	r£   ru   rv   ro   rw   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   r8   )r_   rb   )rk   Z	axisCountÚsizer   r   r   ÚgetTupleSize_.  s    zTupleVariation.getTupleSize_c                 C   sb   t dd„ | jD ƒdƒ}|du r"dS t|ƒttfv r6dS t|ƒtu 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 ur|V  qd S r   r   r+   r   r   r   r-   ;  r   z/TupleVariation.getCoordWidth.<locals>.<genexpr>Nr   r:   r8   zSinvalid type of delta; expected (int or float) number, or Tuple[number, number]: %r)Únextr   rD   rF   Úfloatr1   rE   Ú	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 u rd n&ˆ dkr$|ˆ n|d ˆ |d ˆ f‘qS ©Nr:   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 u 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v rft| jƒt|ƒkrVtdt| jƒt|ƒf ƒ‚|| j||ƒ| _d S )Nr   )Ú	iup_deltar:   z3Only 'gvar' TupleVariation can have inferred deltasz(Expected len(origCoords) == %d; found %d)ÚfontTools.varLib.iupr¿   r˜   r³   r   rE   Ú
ValueError)r   Ú
origCoordsÚendPtsr¿   r   r   r   ÚcalcInferredDeltas_  s    
ÿÿz!TupleVariation.calcInferredDeltasç      à?Fc                 C   sÌ   ddl m} d | jv rd S || j|||d�}d |v 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 u V  qd S r   r   rµ   r   r   r   r-   v  r   z*TupleVariation.optimize.<locals>.<genexpr>)r   r   r:   )
rÀ   rÆ   r   ÚallrE   r   r   r    rU   rl   )r   rÂ   rÃ   rÇ   ÚisCompositerÆ   ZdeltaOptZvarOptrL   ri   rj   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 ]T\}}|| }z(|d |d  |d |d  f||< W qP t	y¢   tdƒ‚Y qP0 qPnVtt|ƒ|ƒD ]F\}}|| }|d urä|d urä|| ||< q¶|d u r¶|d ur¶|||< q¶| S )Nz7cannot sum TupleVariation deltas with different lengthsr8   r   r:   z+cannot sum gvar deltas with inferred points)
Ú
isinstancer   ÚNotImplementedr   rE   rÁ   r˜   ÚziprŒ   r³   )r   r#   Zdeltas1ÚlengthZdeltas2r%   Zd2Úd1r   r   r   Ú__iadd__‹  s*    
	(
zTupleVariation.__iadd__)T)N)T)T)T)r   )rÅ   F) Ú__name__Ú
__module__Ú__qualname__r   r"   r$   r*   r0   rR   rX   rl   r^   ra   Ústaticmethodrx   r]   r—   rd   r™   rž   rŸ   r    r¡   r®   r°   r˜   r¼   r¾   rÄ   rÊ   rË   rÑ   r   r   r   r   r   '   sR   )ÿÿ(

@
2
6
"3

r   c                 C   s2   g }t |ƒD ] }t | ||¡\}}| |¡ q|S r   )rŒ   r   rx   r`   )rL   ZsharedTupleCountru   rv   ro   Ú_Útr   r   r   ÚdecompileSharedTuples­  s
    rØ   r:   c                 C   sN   t ƒ }|D ]}| | ¡}||  d7  < q
t| |¡dd„ d�}dd„ |D ƒS )Nr:   c                 S   s   | d  | d fS r´   r   )Úitemr   r   r   Ú<lambda>À  r   z%compileSharedTuples.<locals>.<lambda>©Úkeyc                 S   s    g | ]}|d  d kr|d ‘qS )r:   r   r   r+   r   r   r   r   Â  r   z'compileSharedTuples.<locals>.<listcomp>)r   r^   r    Úmost_common)rL   Ú
variationsZMAX_NUM_SHARED_COORDSZ
coordCountÚvarr3   ZsharedCoordsr   r   r   ÚcompileSharedTuplesµ  s    
þrà   TrY   c                   sZ  ~g }g }d ‰t tƒ}| D ]:}	|	 ¡ }
|
d u r0q||
  d7  < | |	¡ | |
¡ q|} ~| sddS t| d jƒ‰t‡fdd„| D ƒƒs�J 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 )Nr:   )r   r   r   r   c                 3   s   | ]}t |jƒˆ kV  qd S r   )rE   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   r:   )rE   )Úpnrã   Úcount)ÚcompiledPointsr   r   rÜ   ó  s    z'compileTupleVariationStore.<locals>.keyrÛ   c                    s    g | ]}|ˆkrˆ | nd ‘qS )r   r   )r   r   )rç   ÚsharedPointsr   r   r   þ  s   ÿz.compileTupleVariationStore.<locals>.<listcomp>)rh   rZ   r   )r	   rF   r*   r`   rE   r   rÈ   r7   r!   ÚTUPLES_SHARE_POINT_NUMBERSrÎ   rl   r   )rÞ   Ú
pointCountrL   ZsharedTupleIndicesZuseSharedPointsrZ   ZnewVariationsZ
pointDatasZpointSetCountrá   r   ÚtupleVariationCountZtuplesru   rÜ   r&   Z	thisTupleZthisDatar   )rç   râ   rè   r   ÚcompileTupleVariationStoreÅ  sZ    

ÿ
þÿþÿ



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   r[   r«   )rE   ré   r   r—   rŒ   ÚTUPLE_COUNT_MASKrf   rt   r°   r`   ÚdecompileTupleVariation_)r“   rL   rë   rê   ÚsharedTuplesru   rw   ZdataPosÚnumAxesro   rè   rÖ   ZdataSizerk   Z	tupleSizeri   ZpointDeltaDatar   r   r   ÚdecompileTupleVariationStore  s4    
ÿ
ùÿ
rñ   c                 C   sÜ  |dv sJ |ƒ‚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>Hr8   r«   r   rq   rƒ   r„   )rf   rt   r_   ÚTUPLE_INDEX_MASKr   rx   rb   ÚinferRegion_rc   r—   r®   rE   rÎ   )rê   rï   rè   r“   rL   ru   ri   rk   rw   ÚpeakÚstartÚendr   r5   Zregionr   r¢   Z
deltas_cvtr&   r9   Zdeltas_xZdeltas_yr<   r=   r   r   r   rî   7  sD    
ÿ



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.
    r2   )r!   r6   r7   )rô   rõ   rö   r5   r   r   r   r   ró   e  s
    
ró   )T),ÚfontTools.misc.fixedToolsr   rs   r   rn   r   rC   r   rS   r   ÚfontTools.misc.textToolsr   r�   Úcollectionsr   r	   ÚioÚloggingrf   r�   r_   rb   rc   r¤   r§   rª   r­   r¬   r~   r‹   ré   rí   rò   Ú	getLoggerrÒ   rG   Úobjectr   rØ   rà   rì   rñ   rî   ró   r   r   r   r   Ú<module>   sJ   
     	ÿ
 ûùK'.