o
    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d?d$d%Zed?d&d'Zed?d(d)ZedAd+d,Zed-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 ZdBd9d:Zd;d< Zd=d> ZdS )CTupleVariationc                 C   s   |  | _t|| _d S N)copyaxeslistcoordinates)selfr   r    r   y/var/www/html/construction_image-detection-poc/venv/lib/python3.10/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 }|r|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       z+TupleVariation.hasImpact.<locals>.<genexpr>)anyr   r   r   r   r   	hasImpact=   s   zTupleVariation.hasImpactc                 C   s  | d |  |D ]P}| j|}|d ur[|\}}}t|d}t|d}||kr:||kr:|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 ]O\}}t
|tkrt|dkr|jd||d |d d |  d}
qct
|tkr|jd||d |  d}
qc|d urtd |d|  |  d}
qc|
s|d |  |d |  d S )Ntuple        coord   )axisr   r6   minr   maxF   deltar      )ptxyT)cvtr   zbad delta formatzbad delta #%dz	no deltas)begintagnewliner   getr7   r8   	simpletagfl2strr(   r   typer2   lenintlogerrorcommentendtag)r   writeraxisTagsr6   r   minValuemaxValuedefaultMinValuedefaultMaxValueattrswrote_any_deltasr%   r:   r   r   r   toXMLE   sN   






zTupleVariation.toXMLc                 C   s  |dkr5|d }t |d d}t|d}t|d}t |d|d}t |d|d}	|||	f| j|< d S |dkrd	|v rXt|d	 }
t|d
 }t|d }||f| j|
< d S d|v rot|d }t|d }|| j|< d S tdd	t
|   d S d S )Nr4   r6   r   r5   r3   r7   r8   r:   r<   r=   r>   r?   zbad delta format: %sz, )str2flr7   r8   rB   r   r   r   rH   warningr   r    keys)r   r   rR   _contentr6   r   rP   rQ   rN   rO   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 r,|  }|d u r'dS | |}| |}||}	|	d u rAt}	|| | 	|}
|
d urS|	t
O }	||
 |r^|	tO }	|| || j|d d|}|dtdt||	 d||fS )NzUnknown axis tag found.)    r]   r[   r]   r   >HH)setr   rW   r*   compilePointscompileCoordrB   EMBEDDED_PEAK_TUPLEappendcompileIntermediateCoordINTERMEDIATE_REGIONPRIVATE_POINT_NUMBERScompileDeltasr   insertstructpackrF   )r   rM   sharedCoordIndices	pointDatar\   	tupleDataauxData
usedPointsr4   flagsintermediateCoordr   r   r   compile   s8   







zTupleVariation.compilec              	   C   sX   g }| j }|D ]}||}|d u r|d q|tdt|d d qd|S )Ns     >hr;   r5   r]   )r   rB   rc   ri   rj   fl2fir   )r   rM   resultr   r6   tripler   r   r   ra      s   

zTupleVariation.compileCoordc              	   C   s   d}|D ]"}| j |d\}}}t|d}t|d}||ks"||kr&d} nq|s+d S g }	g }
|D ]$}| j |d\}}}|	tdt|d |
tdt|d q1d|	|
 S )NFr3   r3   r3   r3   Trs   r5   r]   )	r   rB   r7   r8   rc   ri   rj   rt   r   )r   rM   neededr6   rN   r   rO   rP   rQ   	minCoords	maxCoordsr   r   r   rd      s$   

z'TupleVariation.compileIntermediateCoordc              	   C   sH   i }|}| D ]}t td|||d  d d||< |d7 }q||fS )Nrs   r9   r   r5   )fi2flri   unpack)rM   dataoffsetr4   posr6   r   r   r   decompileCoord_   s   &
zTupleVariation.decompileCoord_c                 C   s\  | sdS t | } |   t| }t }|dk r|| n||d? dB  ||d@  d}d}d}||k rd}t|}|d d }||k r||kr| | }	|	| }
|d u rdd|
  koadkn  }|ro|
dksn|
dk ron(|rw||
 n||
d?  ||
d@  |	}|d7 }|d7 }||k r||ksL|r|d ||< n|d tB ||< ||k s7|S )N    r
         r   r   r;   )r   sortrF   	bytearrayrc   POINTS_ARE_WORDS)points	numPointsru   MAX_RUN_LENGTHr   	lastValue	runLength	headerPosuseByteEncodingcurValuer:   r   r   r   r`      sL   
zTupleVariation.compilePointsc                    st  |dv sJ |}|| }|d7 }|t @ dkr$|t@ d> || B }|d7 }|dkr.t |fS g }t||k r|| }|d7 }|t@ d }d}	|t @ dkrVtd}
|d }ntd}
|}|
||||   tjdkrq|
  t|
|ksyJ ||7 }|	|
 t||k s6g }d}|D ]}||7 }|
| q|}~ fd	d
|D }|rtddt||f  ||fS )zJ(numPoints, data, offset, tableTag) --> ([point1, point2, ...], newOffset)cvargvarr;   r   r   Hr9   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   )r   POINT_RUN_COUNT_MASKrangerF   array	frombytessys	byteorderbyteswapextendrc   rH   rV   r   r    )r   r}   r~   tableTagr   numPointsInDataru   	runHeadernumPointsInRunrY   r   
pointsSizeabsolutecurrentr:   	badPointsr   r   r   decompilePoints_  sT   




zTupleVariation.decompilePoints_c                 C   s   g }g }|   dkr$| jD ]}|d u rq||d  ||d  qn| jD ]}|d u r.q'|| q't }| j|||d | j|||d |S )Nr9   r   r;   r[   )getCoordWidthr   rc   r   compileDeltaValues_)r   r\   deltaXdeltaYr,   bytearrr   r   r   rg   G  s"   

zTupleVariation.compileDeltasc                C   s~  |du rt  }d}t| }|rW||k rV| | }|dkr#t| ||}n/d|  kr-dkr7n nt| ||}nd|  krAdkrKn nt| ||}nt| ||}||k sn\t| t| }}|d  krj|krtn nt| ||}n?d|  kr|  krdkrn n
tj| ||dd}n$d|  kr|  krdkrn 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      Fr[   )	r   rF   r   encodeDeltaRunAsZeroes_encodeDeltaRunAsBytes_encodeDeltaRunAsWords_encodeDeltaRunAsLongs_r7   r8   )deltasr   r\   r   	numDeltasr   minValmaxValr   r   r   r   Z  s@   ""z"TupleVariation.compileDeltaValues_c                 C   s   |}t | }||k r| | dkr|d7 }||k r| | dks|| }|dkr5|tdB  |d8 }|dks&|r@|t|d B  |S )Nr   r;   r   r   )rF   rc   DELTAS_ARE_ZERO)r   r~   r   r   r   r   r   r   r   r     s   z&TupleVariation.encodeDeltaRunAsZeroes_c              	   C   s   |}t | }||k r7| | }d|  krdksn n|r/|dkr/|d |k r/| |d  dkr/n|d7 }||k s
|| }|dkr_|d |td| ||d   |d7 }|d8 }|dks?|ru||d  |td| ||  |S )Nr   r   r   r;   r   r   b)rF   rc   r   r   )r   r~   r   r\   r   r   r   r   r   r   r   r     s2   

z%TupleVariation.encodeDeltaRunAsBytes_c           	      C   sP  |}t | }||k rN| | }|r|dkrn9|r:d|  kr!dkr:n n|d |k r:d| |d    kr7dkr:n nnd|  krDdksFn n|d7 }||k s
|| }|dkr|tdB  td	| ||d  }tjd
krr|  || |d7 }|d8 }|dksV|r|t|d B  td	| || }tjd
kr|  || |S )Nr   r   r   r;   r   r   r   r   hr   )rF   rc   DELTAS_ARE_WORDSr   r   r   r   r   	r   r~   r   r\   r   r   r   r   ar   r   r   r     sB   		 



z%TupleVariation.encodeDeltaRunAsWords_c           	      C   s   |}t | }||k r%| | }|rd|  krdkrn nn|d7 }||k s
|| }|dkrZ|tdB  td| ||d  }tjdkrI|  || |d7 }|d8 }|dks-|r}|t|d B  td| || }tjdkrx|  || |S )Nr   r   r;   r   r   r%   r   )rF   rc   DELTAS_ARE_LONGSr   r   r   r   r   r   r   r   r   r     s2   



z%TupleVariation.encodeDeltaRunAsLongs_r   c           	      C   sJ  g }|}| durt || k rn|t |k r|| }|d7 }|t@ d }|t@ tkr2|dg|  nR|t@ tkrBtd}|d }n|t@ tkrRtd}|d }ntd}|}|||||   t	j
d	krm|  t ||ks{J t ||f||7 }|| | durt || k sn|t |k s| du st || ksJ ||fS )
z>(numDeltas, data, offset) --> ([delta, delta, ...], newOffset)Nr;   r   r%      r   r9   r   r   )rF   DELTA_RUN_COUNT_MASKDELTAS_SIZE_MASKr   r   r   r   r   r   r   r   r   )	r   r}   r~   ru   r   r   numDeltasInRunr   
deltasSizer   r   r   decompileDeltas_  s2   "






"zTupleVariation.decompileDeltas_c                 C   s8   d}| t @ dkr||d 7 }| t@ dkr||d 7 }|S )Nr   r   r9   )rb   re   )rp   	axisCountsizer   r   r   getTupleSize_.  s   zTupleVariation.getTupleSize_c                 C   s^   t dd | jD d}|du rdS t|ttfv rdS t|tu r)t|dkr)dS td| )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-   ;  s    z/TupleVariation.getCoordWidth.<locals>.<genexpr>Nr   r;   r9   zSinvalid type of delta; expected (int or float) number, or Tuple[number, number]: %r)nextr   rE   rG   floatr2   rF   	TypeError)r   
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 | ]}|d u r
d n dkr| n|d  |d  fqS Nr;   r   r   r   d
coordWidthscalarr   r   r   K      &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 | ]}|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  r   z.TupleVariation.roundDeltas.<locals>.<listcomp>r   r0   r   r   r   roundDeltasT  s   
zTupleVariation.roundDeltasc                 C   sn   ddl m} |  dkrtdd | jv r5t| jt|kr+tdt| jt|f || j||| _d S d S )Nr   )	iup_deltar;   z3Only 'gvar' TupleVariation can have inferred deltasz(Expected len(origCoords) == %d; found %d)fontTools.varLib.iupr   r   r   r   rF   
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 rf|r1tdd |D r1dgd gt|d   }t| j|}t| j }| 	|\}	}
t|	t|
 }|	|\}	}
t|	t|
 }||k rh|j| _d S d S 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   allrF   r   r   r    rW   rr   )r   r   r   r   isCompositer   deltaOptvarOptrM   rm   rn   unoptimizedLength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rtd|  dkrRtt||D ]'\}}|| }z|d |d  |d |d  f||< W q( t	yO   tdw | S tt||D ]#\}}|| }|d urp|d urp|| ||< qY|d u r||d ur||||< qY| S )Nz7cannot sum TupleVariation deltas with different lengthsr9   r   r;   z+cannot sum gvar deltas with inferred points)

isinstancer   NotImplementedr   rF   r   r   zipr   r   )r   r#   deltas1lengthdeltas2r%   d2d1r   r   r   __iadd__  s0   
	(
zTupleVariation.__iadd__Tr   r   )r   F) __name__
__module____qualname__r   r"   r$   r*   r1   rT   rZ   rr   ra   rd   staticmethodr   r`   r   rg   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   r   rc   )rM   sharedTupleCountr}   r~   ru   _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>  s    z%compileSharedTuples.<locals>.<lambda>keyc                 S   s    g | ]}|d  d kr|d qS )r;   r   r   r+   r   r   r   r     s     z'compileSharedTuples.<locals>.<listcomp>)r   ra   r    most_common)rM   
variationsMAX_NUM_SHARED_COORDS
coordCountvarr4   sharedCoordsr   r   r   compileSharedTuples  s   
r  Tr[   c                   sX  ~g }g }d t t}| D ]}	|	 }
|
d u rq||
  d7  < ||	 ||
 q|} ~| s2dS t| d jtfdd| D sHJ ddd |D  t| }g }g }|rt fd	d
}t| |dd |   |t	O } fdd|D }t
| |D ]\}	}|	j||||d\}}|| || qd|}d|}|||fS )Nr;   )r   r]   r]   r   c                 3   s    | ]
}t |j kV  qd S r   )rF   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;   )rF   )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>)rl   r\   r]   )r	   rG   r*   rc   rF   r   r   r8   r!   TUPLES_SHARE_POINT_NUMBERSr   rr   r   )r  
pointCountrM   sharedTupleIndicesuseSharedPointsr\   newVariations
pointDataspointSetCountr  r   tupleVariationCounttuplesr}   r   r&   	thisTuplethisDatar   )r  r	  r  r   compileTupleVariationStore  sZ   







r  c                 C   s   t |}g }	|t@ dkrt|||| \}
}ng }
t|t@ D ];}td|||d  \}}t||}||||  }||||  }|		t
|||
| ||| ||7 }||7 }q|	S )Nr   r^   r   )rF   r  r   r   r   TUPLE_COUNT_MASKri   r|   r   rc   decompileTupleVariation_)r   rM   r  r  sharedTuplesr}   r   dataPosnumAxesru   r  r   dataSizerp   	tupleSizerm   pointDeltaDatar   r   r   decompileTupleVariationStore  s4   


r$  c                 C   s  |dv sJ |t d|dd d }d}|t@ dkr#||t@  }	n	t|||\}	}|t@ dkrEt|||\}
}t|||\}}nt|	\}
}i }|D ]}|
| |	| || f}|dkrd|||< qOd}|t@ dkrxt	| |||\}}n|}d g|  }|dkrt
t|||\}}t||D ]\}}d|  kr| k rn q|||< qn8|dkrt
t|||\}}t
t|||\}}t|||D ]\}}}d|  kr| k rn q||f||< qt||S )	Nr   z>Hr9   r   r   rw   r   r   )ri   r|   rb   TUPLE_INDEX_MASKr   r   re   inferRegion_rf   r   r   rF   r   )r  r  r  r   rM   r}   rm   rp   r   peakstartendr   r6   regionr   r   
deltas_cvtr&   r:   deltas_xdeltas_yr=   r>   r   r   r   r  7  sL   


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.
    r3   )r!   r7   r8   )r'  r(  r)  r6   r   r   r   r   r&  e  s
   
r&  r   ),fontTools.misc.fixedToolsr   r{   r   rt   r   rD   r   rU   r   fontTools.misc.textToolsr   r   collectionsr   r	   iologgingri   r   rb   re   rf   r   r   r   r   r   r   r   r  r  r%  	getLoggerr   rH   objectr   r   r  r  r$  r  r&  r   r   r   r   <module>   sL    
     	
K'.