a
    ZXh}                     @   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   j/var/www/viveiro_mudafortebrasil/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 )zReturns 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}
qt
|tkr>|jd||d |  d}
q|d urt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)Zbegintagnewliner   getr6   r7   Z	simpletagfl2strr(   r   typer1   lenintlogerrorcommentZ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rd	|v rt|d	 }
t|d
 }t|d }||f| j|
< nHd|v rt|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   r@   r   r   r   rE   warningr   r    keys)r   r   rN   _contentr5   r   rL   rM   rJ   rK   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 rt}	|| | 	|}
|
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   rV   r   r   >HH)setr   rR   r*   compilePointscompileCoordr@   EMBEDDED_PEAK_TUPLEappendcompileIntermediateCoordINTERMEDIATE_REGIONPRIVATE_POINT_NUMBERScompileDeltasr   insertstructpackrC   )r   rI   ZsharedCoordIndices	pointDatarW   	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   r@   r]   rc   rd   fl2fir   )r   rI   resultr   r5   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r2   r2   r2   r2   Trj   r4   r   )	r   r@   r6   r7   r]   rc   rd   rk   r   )r   rI   neededr5   rJ   r   rK   rL   rM   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 )Nrj   r8   r   r4   )fi2flrc   unpack)rI   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 rd|
  kod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   sortrC   	bytearrayr]   POINTS_ARE_WORDS)points	numPointsrl   ZMAX_RUN_LENGTHrs   Z	lastValue	runLengthZ	headerPosZuseByteEncodingZcurValuer9   r   r   r   rZ      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rtd}
|d }ntd}
|}|
||||   tjdkr|
  t|
|ksJ ||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   rv   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   )rz   POINT_RUN_COUNT_MASKrangerC   array	frombytessys	byteorderbyteswapextendr]   rE   rQ   r   r    )r|   rq   rr   tableTagrs   ZnumPointsInDatarl   	runHeaderZnumPointsInRunrT   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:   rV   )getCoordWidthr   r]   ry   compileDeltaValues_)r   rW   ZdeltaXZdeltaYr,   bytearrr   r   r   ra   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rdkrn nt| ||}qt| ||}qnt| t|  }}|d  kr|krn nt| ||}nd|  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sJ ||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      FrV   )	ry   rC   r   encodeDeltaRunAsZeroes_encodeDeltaRunAsBytes_encodeDeltaRunAsWords_encodeDeltaRunAsLongs_r6   r7   )deltasr   rW   rs   	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   )rC   r]   DELTAS_ARE_ZERO)r   rr   r   rs   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)rC   r]   r   r   )r   rr   r   rW   rs   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qd|  krdksq 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   )rC   r]   DELTAS_ARE_WORDSr   r   r   r   r   	r   rr   r   rW   rs   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   )rC   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rtd}|d }n.|t@ tkrtd}|d }ntd}|}|||||   t	j
d	kr|  t ||ksJ 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   )rC   DELTA_RUN_COUNT_MASKDELTAS_SIZE_MASKr   r   r   r   r   r   r   r   r   )	r   rq   rr   rl   rs   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\   r_   )rh   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   rB   rD   floatr1   rC   	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   rC   
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   allrC   r   r   r    rR   ri   )r   r   r   r   ZisCompositer   ZdeltaOptZvarOptrI   rf   rg   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rt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   rC   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   rO   rU   ri   r[   r^   staticmethodrt   rZ   r   ra   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   rt   r]   )rI   ZsharedTupleCountrq   rr   rl   _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)rI   
variationsZMAX_NUM_SHARED_COORDSZ
coordCountvarr3   ZsharedCoordsr   r   r   compileSharedTuples  s    
r   TrV   c                   sZ  ~g }g }d t t}| D ]:}	|	 }
|
d u r0q||
  d7  < ||	 ||
 q|} ~| sddS t| d jtfdd| D sJ 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   )rC   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   rZ   )r   pointSetr   r   r   
<dictcomp>  s   z.compileTupleVariationStore.<locals>.<dictcomp>c                    s$   | d }| d }t  | |d  S )Nr   r:   )rC   )Z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>)re   rW   r   )r	   rD   r*   r]   rC   r   r   r7   r!   TUPLES_SHARE_POINT_NUMBERSr   ri   r   )r   
pointCountrI   ZsharedTupleIndicesZuseSharedPointsrW   ZnewVariationsZ
pointDatasZpointSetCountr   r{   tupleVariationCountZtuplesrq   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   rX   r   )rC   r   r   r   r   TUPLE_COUNT_MASKrc   rp   r   r]   decompileTupleVariation_)r   rI   r   r   sharedTuplesrq   rs   ZdataPosZnumAxesrl   r   r   ZdataSizerh   Z	tupleSizerf   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rt|||\}
}t|||\}}nt|	\}
}i }|D ]*}|
| |	| || f}|dkr|||< qd}|t@ dkrt	| |||\}}n|}d g|  }|dkrZt
t|||\}}t||D ].\}}d|  krH| k r(n n|||< q(nx|dkrt
t|||\}}t
t|||\}}t|||D ]4\}}}d|  kr| k rn n||f||< qt||S )	Nr~   z>Hr8   r   r   rm   r   r   )rc   rp   r\   TUPLE_INDEX_MASKr   rt   r_   inferRegion_r`   r   r   rC   r   )r   r   r   r   rI   rq   rf   rh   rs   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),ZfontTools.misc.fixedToolsr   ro   r   rk   r   rA   r   rP   r   ZfontTools.misc.textToolsr   r   collectionsr   r	   iologgingrc   r   r\   r_   r`   r   r   r   r   r   rz   r   r   r   r   	getLoggerr   rE   objectr   r   r   r   r   r   r   r   r   r   r   <module>   sJ   
     	
 K'.