a
    w=ic_                     @   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ee Z!G dd de"Z#dd Z$ed fddZ%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                   @   s  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Z
dd Zdd Zedd Zedd Zedd Zdd Zed:ddZed d! Zed"d# Zed$d% Zed&d' Zed(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd;d4d5Zd6d7 Zd8d9 ZdS )<TupleVariationc                 C   s   |  | _t|| _d S N)copyaxeslistcoordinates)selfr   r    r   v/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/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__/   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   6   r   z0TupleVariation.getUsedPoints.<locals>.<listcomp>)r   	frozenset	enumerate)r   usedr   r   r   getUsedPoints2   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>@   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   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   toXMLB   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 )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   fromXMLk   s*    

zTupleVariation.fromXMLNc           
      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 }|| ||   d|}|dtdt|| d||fS )NzUnknown axis tag found.)r   r   r   r   >HH)setr   rQ   r)   compilePointscompileCoordr?   EMBEDDED_PEAK_TUPLEappendcompileIntermediateCoordINTERMEDIATE_REGIONPRIVATE_POINT_NUMBERScompileDeltasr   insertstructpackrB   )
r   rH   ZsharedCoordIndices	pointData	tupleDataauxDataZ
usedPointsr2   flagsZintermediateCoordr   r   r   compile   s0    *







zTupleVariation.compilec              	   C   sX   t  }| j}|D ]>}||}|d u r2|d q|tdt|d d qt|S )Ns     >hr9   r3   )	bytearrayr   r?   extendr`   ra   fl2fibytes)r   rH   resultr   r4   tripler   r   r   rX      s    
zTupleVariation.compileCoordc              	   C   s   d}|D ]D}| j |d\}}}t|d}t|d}||ksD||krd} qNq|sVd S t }	t }
|D ]H}| j |d\}}}|	tdt|d |
tdt|d qf|	|
 S )NFr1   r1   r1   r1   Trg   r3   )	r   r?   r5   r6   rh   ri   r`   ra   rj   )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 )Nrg   r7   r   r3   )fi2flr`   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 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   r9   )r   sortrB   rh   rZ   POINTS_ARE_WORDS)points	numPointsrl   ZMAX_RUN_LENGTHrt   Z	lastValue	runLengthZ	headerPosZuseByteEncodingZcurValuer8   r   r   r   rW      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gvarr9   r   rw   Hr7   Bbigc                    s$   h | ]}|d k s| krt |qS )r   )str)r   r%   r|   r   r   	<setcomp>6  r   z2TupleVariation.decompilePoints_.<locals>.<setcomp>z#point %s out of range in '%s' tabler   )rz   POINT_RUN_COUNT_MASKrangerB   array	frombytessys	byteorderbyteswapri   rZ   rD   rP   r   r   )r|   rr   rs   tableTagrt   ZnumPointsInDatarl   	runHeaderZnumPointsInRunrS   r{   Z
pointsSizeabsolutecurrentr8   Z	badPointsr   r   r   decompilePoints_  sL    


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 }| || | || |S )Nr7   r   r9   )getCoordWidthr   rZ   rh   compileDeltaValues_)r   ZdeltaXZdeltaYr+   bytearrr   r   r   r^   <  s     

zTupleVariation.compileDeltasc                 C   s~   |du rt  }d}t| }||k rz| | }|dkrBt| ||}qd|  krVdkrjn nt| ||}qt| ||}q|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   )rh   rB   r   encodeDeltaRunAsZeroes_encodeDeltaRunAsBytes_encodeDeltaRunAsWords_)deltasr   rt   	numDeltasr   r   r   r   r   O  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   r9   r   r   )rB   rZ   DELTAS_ARE_ZERO)r   rs   r   rt   r   r}   r   r   r   r   n  s    

z&TupleVariation.encodeDeltaRunAsZeroes_c              	   C   s   |}t | }||k rd| | }d|  kr0dks4qd qd|dkrZ|d |k rZ| |d  dkrZqd|d7 }q|| }|dkr|d |td| ||d   |d7 }|d8 }ql|r||d  |td| ||  |S )Nr   r   r   r9   r   r   b)rB   rZ   ri   r   )r   rs   r   rt   r   r   r}   r   r   r   r   |  s&    	$


z%TupleVariation.encodeDeltaRunAsBytes_c                 C   s(  |}t | }||k rv| | }|dkr&qvd|  kr:dkrln n.|d |k rld| |d    krfdkrlqv nqv|d7 }q|| }|dkr|tdB  td| ||d  }tjdkr|  || |d7 }|d8 }q~|r$|t|d B  td| || }tjdkr|  || |S )	Nr   r   r   r9   r   r   hr   )rB   rZ   DELTAS_ARE_WORDSr   r   r   r   ri   )r   rs   r   rt   r   r   r}   ar   r   r   r     s.    D



z%TupleVariation.encodeDeltaRunAsWords_c           	      C   s   g }|}t || k r|| }|d7 }|t@ d }|t@ dkrN|dg|  q|t@ dkrntd}|d }ntd}|}|||||   tjdkr|	  t ||ksJ ||7 }|| qt || ksJ ||fS )z>(numDeltas, data, offset) --> ([delta, delta, ...], newOffset)r9   r   r   r7   r   r   )
rB   DELTA_RUN_COUNT_MASKr   ri   r   r   r   r   r   r   )	r   rr   rs   rl   rt   r   ZnumDeltasInRunr   Z
deltasSizer   r   r   decompileDeltas_  s(    


zTupleVariation.decompileDeltas_c                 C   s8   d}| t @ dkr||d 7 }| t@ dkr4||d 7 }|S )N   r   r7   )rY   r\   )re   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 )zb Return 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   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     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 Nr9   r   r   r   d
coordWidthscalarr   r   r     s   
z.TupleVariation.scaleDeltas.<locals>.<listcomp>r   r   r   r   r   r   r   scaleDeltas  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     s   
z.TupleVariation.roundDeltas.<locals>.<listcomp>r   r.   r   r   r   roundDeltas  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_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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,   &  r   z*TupleVariation.optimize.<locals>.<genexpr>)r   r   r9   )
r   r   r   allrB   r   r   r   rQ   rf   )r   r   r   r   ZisCompositer   ZdeltaOptZvarOptrH   rc   rd   ZunoptimizedLengthZoptimizedLengthr   r   r   optimize  s"    

zTupleVariation.optimizec                 C   s   |  | | S r   )r   r   r   r   r   __imul__7  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 lengthsr7   r   r9   z+cannot sum gvar deltas with inferred points)

isinstancer   NotImplementedr   rB   r   r   zipr   r   )r   r"   Zdeltas1lengthZdeltas2r$   d2d1r   r   r   __iadd__;  s2    
(
zTupleVariation.__iadd__)N)r   F)__name__
__module____qualname__r   r!   r#   r)   r/   rN   rT   rf   rX   r[   staticmethodru   rW   r   r^   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   %   sH   )"

@
/


'


r   c                 C   s2   g }t |D ] }t| ||\}}|| q|S r   )r   r   ru   rZ   )rH   ZsharedTupleCountrr   rs   rl   _tr   r   r   decompileSharedTuplesa  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>s  r   z%compileSharedTuples.<locals>.<lambda>keyc                 S   s    g | ]}|d  d kr|d qS )r9   r   r   r*   r   r   r   r   u  r   z'compileSharedTuples.<locals>.<listcomp>)r   rX   r   most_common)rH   
variationsZMAX_NUM_SHARED_COORDSZ
coordCountvarr2   ZsharedCoordsr   r   r   compileSharedTuplesi  s    
r   Tc                    sV  g }g }d t t}| D ]:}| }	|	d u r.q||	  d7  < || ||	 q|} ~| sbd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 ]2\}}|j|||d\}}|| || qd|}d|}|
||fS )Nr9   )r   r   r   r   c                 3   s   | ]}t |j kV  qd S r   )rB   r   )r   v)nr   r   r,     r   z-compileTupleVariationStore.<locals>.<genexpr>z#Variation sets have different sizesc                 S   s   i | ]}|t |qS r   )r   rW   )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 )r   r   )r   r{   )r   sharedPointsr   r   r     s   z.compileTupleVariationStore.<locals>.<listcomp>)rb   r   )r	   rC   r)   rZ   rB   r   r   r6   r    TUPLES_SHARE_POINT_NUMBERSr   rf   r   )r   
pointCountrH   ZsharedTupleIndicesZuseSharedPointsZnewVariationsZ
pointDatasZpointSetCountr   r{   tupleVariationCountZtuplesrr   r   r%   Z	thisTupleZthisDatar   )r   r   r   r   compileTupleVariationStorex  sL    



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   rU   r   )rB   r   r   r   r   TUPLE_COUNT_MASKr`   rq   r   rZ   decompileTupleVariation_)r   rH   r   r   sharedTuplesrr   rt   ZdataPosZnumAxesrl   r   r   ZdataSizere   Z	tupleSizerc   ZpointDeltaDatar   r   r   decompileTupleVariationStore  s&    

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>Hr7   r   r   rn   r   r   )r`   rq   rY   TUPLE_INDEX_MASKr   ru   r\   inferRegion_r]   r   r   rB   r   )r   r   r   r   rH   rr   rc   re   rt   peakstartendr   r4   regionr{   r   Z
deltas_cvtr%   r8   Zdeltas_xZdeltas_yr;   r<   r   r   r   r     sP    







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     s
    
r   )T)*ZfontTools.misc.fixedToolsr   rp   r   rj   r   r@   r   rO   r   ZfontTools.misc.textToolsr   r   collectionsr   r	   iologgingr`   r   rY   r\   r]   r   r   r   rz   r   r   r   r   	getLoggerr   rD   objectr   r   r   r   r   r   r   r   r   r   r   <module>   s@   
    @	
 
;/