B
    Jd_                 @   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   W/var/www/html/venv/lib/python3.7/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 )N)r   r   )r   otherr   r   r   __eq__/   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 )Nr   )r   ipr   r   r   r   6   s    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 k	V  qd S )Nr   )r   cr   r   r   	<genexpr>@   s    z+TupleVariation.hasImpact.<locals>.<genexpr>)anyr   )r   r   r   r   	hasImpact:   s    zTupleVariation.hasImpactc             C   s  | d |  x|D ]}| j|}|d k	r|\}}}t|d}t|d}||krv||krv|jd|t|dd n:d|fdt|dfdt|dfd	t|dfg}	|d|	 |  qW d
}
xt| j	D ]\}}t
|tkrt|dkr|jd||d |d d |  d}
qt
|tkrD|jd||d |  d}
q|d k	rtd |d|  |  d}
qW |
s|d |  |d |  d S )Ntupleg        coord   )axisr   r/   minr   maxF   deltar      )ptxyT)cvtr   zbad delta formatzbad delta #%dz	no deltas)Zbegintagnewliner   getr0   r1   Z	simpletagfl2strr%   r   typer,   lenintlogerrorcommentZendtag)r   writeraxisTagsr/   r   minValuemaxValuedefaultMinValuedefaultMaxValueattrsZwrote_any_deltasr"   r3   r   r   r   toXMLB   sH    







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	|krt|d	 }
t|d
 }t|d }||f| j|
< nHd|krt|d }t|d }|| j|< ntdd	t
|   d S )Nr-   r/   r   r.   g        r0   r1   r3   r5   r6   r7   r8   zbad delta format: %sz, )str2flr0   r1   r:   r   r   r   r?   warningr   r   keys)r   r   rH   _contentr/   r   rF   rG   rD   rE   pointr6   r7   r8   r   r   r   fromXMLk   s(    

zTupleVariation.fromXMLNc       
      C   s   t | j t |ks*td| j |fg }g }|d krX|  }|d krNdS | |}| |}||}|d krt}|	| | 
|}	|	d k	r|tO }|	|	 |r|tO }|	| |	|   d|}|dtdt|| d||fS )NzUnknown axis tag found.)    rP   rP   r   z>HH)setr   rL   AssertionErrorr'   compilePointscompileCoordr:   EMBEDDED_PEAK_TUPLEappendcompileIntermediateCoordINTERMEDIATE_REGIONPRIVATE_POINT_NUMBERScompileDeltasr   insertstructpackr=   )
r   rC   ZsharedCoordIndices	pointData	tupleDataauxDataZ
usedPointsr-   flagsZintermediateCoordr   r   r   compile   s0    *







zTupleVariation.compilec          	   C   s\   t  }| j}xF|D ]>}||}|d kr4|d q|tdt|d d qW t|S )Ns     z>hr4   r.   )	bytearrayr   r:   extendr\   r]   fl2fibytes)r   rC   resultr   r/   Ztripler   r   r   rT      s    

 zTupleVariation.compileCoordc          	   C   s   d}xJ|D ]B}| j |d\}}}t|d}t|d}||ksF||kr
d}P q
W |sXd S t }	t }
xP|D ]H}| j |d\}}}|	tdt|d |
tdt|d qjW |	|
 S )NF)g        g        g        g        Tz>hr.   )	r   r:   r0   r1   rc   rd   r\   r]   re   )r   rC   neededr/   rD   r   rE   rF   rG   Z	minCoordsZ	maxCoordsr   r   r   rW      s"    



z'TupleVariation.compileIntermediateCoordc          	   C   sL   i }|}x:| D ]2}t td|||d  d d||< |d7 }qW ||fS )Nz>hr2   r   r.   )fi2flr\   unpack)rC   dataoffsetr-   posr/   r   r   r   decompileCoord_   s    
&zTupleVariation.decompileCoord_c             C   sX  | sdS t | } |   t| }t }|dk r:|| n ||d? dB  ||d@  d}d}d}x||k rRd}t|}|d d }x||k r*||kr*| | }	|	| }
|d krd|
  kodkn  }|r|
dks|
dk rP |r||
 n||
d?  ||
d@  |	}|d7 }|d7 }qW |r@|d ||< qh|d tB ||< qhW |S )N    r
         r   r   r4   )r   sortr=   rc   rV   POINTS_ARE_WORDS)points	numPointsrg   ZMAX_RUN_LENGTHrm   Z	lastValue	runLengthZ	headerPosZuseByteEncodingZcurValuer3   r   r   r   rS      sH    
zTupleVariation.compilePointsc                sx  |dkst |}|| }|d7 }|t@ dkrH|t@ d> || B }|d7 }|dkr\t |fS g }xt||k r
|| }|d7 }|t@ d }d}	|t@ dkrtd}
|d }ntd}
|}|
||||   tjdkr|
	  t|
|kst ||7 }|
|
 qbW g }d}x |D ]}||7 }|| qW |}~ fd	d
|D }|rptddt||f  ||fS )zJ(numPoints, data, offset, tableTag) --> ([point1, point2, ...], newOffset))cvargvarr4   r   rp   Hr2   Bbigc                s$   h | ]}|d k s| krt |qS )r   )str)r   r#   )ru   r   r   	<setcomp>6  s    z2TupleVariation.decompilePoints_.<locals>.<setcomp>z#point %s out of range in '%s' tabler   )rR   rs   POINT_RUN_COUNT_MASKranger=   array	frombytessys	byteorderbyteswaprd   rV   r?   rK   r   r   )ru   rk   rl   tableTagrm   ZnumPointsInDatarg   	runHeaderZnumPointsInRunrN   rt   Z
pointsSizeabsolutecurrentr3   Z	badPointsr   )ru   r   decompilePoints_  sL    



 
zTupleVariation.decompilePoints_c             C   s   g }g }|   dkrLxZ| jD ]*}|d kr*q||d  ||d  qW n$x"| jD ]}|d krbqT|| qTW t }| || | || |S )Nr2   r   r4   )getCoordWidthr   rV   rc   compileDeltaValues_)r   ZdeltaXZdeltaYr(   bytearrr   r   r   rZ   <  s     zTupleVariation.compileDeltasc             C   s   |dkrt  }d}t| }xb||k r|| | }|dkrDt| ||}qd|  krXdkrln nt| ||}qt| ||}qW |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   ir   )rc   r=   r   encodeDeltaRunAsZeroes_encodeDeltaRunAsBytes_encodeDeltaRunAsWords_)deltasr   rm   	numDeltasr   r   r   r   r   O  s    
z"TupleVariation.compileDeltaValues_c             C   st   |}t | }x ||k r,| | dkr,|d7 }qW || }x"|dkrX|tdB  |d8 }q8W |rp|t|d B  |S )Nr   r4   r   r   )r=   rV   DELTAS_ARE_ZERO)r   rl   r   rm   r   rv   r   r   r   r   n  s    
z&TupleVariation.encodeDeltaRunAsZeroes_c          	   C   s   |}t | }xZ||k rf| | }d|  kr2dks6n P |dkr\|d |k r\| |d  dkr\P |d7 }qW || }xD|dkr|d |td| ||d   |d7 }|d8 }qrW |r||d  |td| ||  |S )Nir   r   r4   r   r   b)r=   rV   rd   r   )r   rl   r   rm   r   r   rv   r   r   r   r   |  s&    
	$

z%TupleVariation.encodeDeltaRunAsBytes_c             C   s0  |}t | }xl||k rx| | }|dkr(P d|  kr<dkrnn n.|d |k rnd| |d    krhdkrnn nP |d7 }qW || }x^|dkr|tdB  td| ||d  }tjdkr|  || |d7 }|d8 }qW |r,|t|d B  td| || }tjdkr"|  || |S )	Nr   ir   r4   r   r   hr{   )r=   rV   DELTAS_ARE_WORDSr   r   r   r   rd   )r   rl   r   rm   r   r   rv   ar   r   r   r     s2    
D

 
 
z%TupleVariation.encodeDeltaRunAsWords_c       	      C   s   g }|}xt || k r|| }|d7 }|t@ d }|t@ dkrP|dg|  q
|t@ dkrptd}|d }ntd}|}|||||   tjdkr|	  t ||kst
||7 }|| q
W t || kst
||fS )z>(numDeltas, data, offset) --> ([delta, delta, ...], newOffset)r4   r   r   r2   r   r{   )r=   DELTA_RUN_COUNT_MASKr   rd   r   r   r   r   r   r   rR   )	r   rk   rl   rg   rm   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   r2   )rU   rX   )ra   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 )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 k	r|V  qd S )Nr   )r   r(   r   r   r   r)     s    z/TupleVariation.getCoordWidth.<locals>.<genexpr>Nr   r4   r2   zSinvalid type of delta; expected (int or float) number, or Tuple[number, number]: %r)nextr   r<   r>   floatr,   r=   	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 krd n& dkr$| n|d  |d  fqS )Nr4   r   r   )r   d)
coordWidthscalarr   r   r     s   z.TupleVariation.scaleDeltas.<locals>.<listcomp>)r   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 krd n& dkr$t |nt |d t |d fqS )Nr4   r   )r   )r   r   )r   r   r   r     s   z.TupleVariation.roundDeltas.<locals>.<listcomp>)r   r   )r   r   )r   r   roundDeltas  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_deltar4   z3Only 'gvar' TupleVariation can have inferred deltasz(Expected len(origCoords) == %d; found %d)fontTools.varLib.iupr   r   r   r   r=   
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 )Nr   )r   r   r   r   r   r)   &  s    z*TupleVariation.optimize.<locals>.<genexpr>)r   r   r4   )
r   r   r   allr=   r   r   r   rL   rb   )r   r   r   r   ZisCompositer   ZdeltaOptZvarOptrC   r_   r`   ZunoptimizedLengthZoptimizedLengthr   r   r   optimize  s     
zTupleVariation.optimizec             C   s   |  | | S )N)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rxtt||D ]V\}}|| }y(|d |d  |d |d  f||< W qR t	k
r   tdY qRX qRW nZxXtt||D ]F\}}|| }|d k	r|d k	r|| ||< q|d kr|d k	r|||< qW | S )Nz7cannot sum TupleVariation deltas with different lengthsr2   r   r4   z+cannot sum gvar deltas with inferred points)

isinstancer   NotImplementedr   r=   r   r   zipr   r   )r   r    Zdeltas1lengthZdeltas2r"   Zd2Zd1r   r   r   __iadd__;  s.    

(zTupleVariation.__iadd__)N)r   F)__name__
__module____qualname__r   r   r!   r'   r+   rI   rO   rb   rT   rW   staticmethodrn   rS   r   rZ   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   %   s8   )"	A0(	
r   c             C   s6   g }x,t |D ] }t| ||\}}|| qW |S )N)r   r   rn   rV   )rC   ZsharedTupleCountrk   rl   rg   _tr   r   r   decompileSharedTuplesa  s
    r   r4   c             C   sR   t  }x&|D ]}|| }||  d7  < qW t||dd d}dd |D S )Nr4   c             S   s   | d  | d fS )Nr4   r   r   )itemr   r   r   <lambda>s  rP   z%compileSharedTuples.<locals>.<lambda>)keyc             S   s    g | ]}|d  d kr|d qS )r4   r   r   )r   r(   r   r   r   r   u  s    z'compileSharedTuples.<locals>.<listcomp>)r   rT   r   most_common)rC   
variationsZMAX_NUM_SHARED_COORDSZ
coordCountvarr-   ZsharedCoordsr   r   r   compileSharedTuplesi  s    

r   Tc                s^  g }g }d t t}xB| D ]:}| }	|	d kr0q||	  d7  < || ||	 qW |} ~| sfdS t| d jtfdd| D stddd |D  t| }
g }g }|r fd	d
}t|	 |dd |   |
t
O }
 fdd|D }x@t| |D ]2\}}|j|||d\}}|| || q
W d|}d|}|
||fS )Nr4   )r   rP   rP   r   c             3   s   | ]}t |j kV  qd S )N)r=   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   rS   )r   pointSetr   r   r   
<dictcomp>  s   z.compileTupleVariationStore.<locals>.<dictcomp>c                s$   | d }| d }t  | |d  S )Nr   r4   )r=   )Zpnr   count)compiledPointsr   r   r     s    z'compileTupleVariationStore.<locals>.key)r   c                s    g | ]}|kr | nd qS )rP   r   )r   rt   )r   sharedPointsr   r   r     s   z.compileTupleVariationStore.<locals>.<listcomp>)r^   rP   )r	   r>   r'   rV   r=   r   r   rR   r1   r   TUPLES_SHARE_POINT_NUMBERSr   rb   r   )r   
pointCountrC   ZsharedTupleIndicesZuseSharedPointsZnewVariationsZ
pointDatasZpointSetCountr   rt   tupleVariationCountZtuplesrk   r   r#   Z	thisTupleZthisDatar   )r   r   r   r   compileTupleVariationStorex  sH    




r   c             C   s   t |}g }	|t@ dkr.t|||| \}
}ng }
xt|t@ D ]v}td|||d  \}}t||}||||  }||||  }|		t
|||
| ||| ||7 }||7 }q@W |	S )Nr   z>HHr   )r=   r   r   r   r   TUPLE_COUNT_MASKr\   rj   r   rV   decompileTupleVariation_)r   rC   r   r   sharedTuplesrk   rm   ZdataPosZnumAxesrg   r   r   ZdataSizera   Z	tupleSizer_   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rt|||\}
}t|||\}}nt|	\}
}i }x2|D ]*}|
| |	| || f}|dkr|||< qW d}|t	@ dkrt
| |||\}}n|}d g|  }|dkrbtt|||\}}xt||D ].\}}d|  krN| k r.n n|||< q.W n||dkrtt|||\}}tt|||\}}xDt|||D ]4\}}}d|  kr| k rn n||f||< qW t||S )	N)rw   rx   z>Hr2   r   r   )g        g        g        rw   rx   )rR   r\   rj   rU   TUPLE_INDEX_MASKr   rn   rX   inferRegion_rY   r   r   r=   r   )r   r   r   r   rC   rk   r_   ra   rm   peakstartendr   r/   regionrt   r   Z
deltas_cvtr#   r3   Zdeltas_xZdeltas_yr6   r7   r   r   r   r     sH    



r   c             C   sD   i i  }}x0|   D ]$\}}t|d||< t|d||< qW ||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.
    g        )r   r0   r1   )r   r   r   r/   r   r   r   r   r     s
    
r   )T)*ZfontTools.misc.fixedToolsr   ri   r   re   r   r;   r   rJ   r   ZfontTools.misc.textToolsr   r   collectionsr   r	   iologgingr\   r   rU   rX   rY   r   r   r   rs   r~   r   r   r   	getLoggerr   r?   objectr   r   r   r   r   r   r   r   r   r   r   <module>   s<   
    @	
9/