o
    _hk                     @   sn   d dl mZ d dlmZ d dlmZ ddlmZ ddlmZ d dl	Z	dZ
G d	d
 d
ejZG dd deZdS )    )sstruct)floatToFixedToStr)safeEval   )DefaultTable)grUtilsNz
    >
    version:    16.16F
c                   @   s:   e Zd ZdZdddZdd Zdd Zd	d
 Zdd ZdS )table_F__e_a_ta  Feature table

    The ``Feat`` table is used exclusively by the Graphite shaping engine
    to store features and possible settings specified in GDL. Graphite features
    determine what rules are applied to transform a glyph stream.

    Not to be confused with ``feat``, or the OpenType Layout tables
    ``GSUB``/``GPOS``.

    See also https://graphite.sil.org/graphite_techAbout#graphite-font-tables
    Nc                 C   s   t j | | i | _d S N)r   __init__features)selftag r   S/var/www/html/myenv/lib/python3.10/site-packages/fontTools/ttLib/tables/F__e_a_t.pyr
      s   
ztable_F__e_a_t.__init__c              	   C   s  t t|| \}}tt| jdd| _td|d d \}|dd  }g }d}t|D ]\}| jdkrVtd|d| d|d	   \}}	}}
}}t	|
d
 d|  d }
n!td|d
| d
|d	   \}}	}
}}t	|
d
 d
|  d }
|
||	|
||f t||
|	 }q,|d| d  }g }t|D ]%}t|d|d	  krtd|d| d|d	   \}}|
||f qt|D ]J\}}|\}}	}
}}t }||_||_|| jt|< i |_d |_||_t|
|
|	 D ]}|t|krq|| \}}||j|< |jd u r
||_qqd S )N   )precisionBitsz>H      r          @>LHHLHHr         >HHLHH>HH)r   unpack2Feat_hdr_formatfloatr   versionstructunpackrangeintappendmaxlen	enumerateFeatureflagslabelr   r   num2tagsettingsdefaultindex)r   datattFont_numFeatsallfeats
maxsettingifidnumsoffsetr'   lidallsettingsvalffobjvidvlidr   r   r   	decompile   sX   
$
ztable_F__e_a_t.decompilec           
         sN  d}d}d}t | j dd dD ]~\} t|}| jdkr@|tdt|t j	d|d d	 d
t| j   j
 j7 }n-|dkrNd| _| |  S |tdt|t j	|d d	 d	t| j   j
 j7 }t  j	  fdddD ]\}}|td||7 }qz|t j	7 }qtt| }	|	tdt| jdd | | S )N    r   c                 S   
   | d j S Nr   r,   xr   r   r   <lambda>N      
 z(table_F__e_a_t.compile.<locals>.<lambda>keyr   r   r   r   r   i  r   c                    s   | d  j krd| d fS | S )Nr   r   )r+   rC   vr   r   rE   g   s    r   z>HHL)sortedr   itemsr   tag2numr   r   packr$   r*   r'   r(   compiler   r   )
r   r.   fdatvdatr6   r:   fnumslhdrr   rJ   r   rP   J   sB   

	"ztable_F__e_a_t.compilec                 C   s   |j d| jd |  t| j dd dD ];\}}|jd||j|j|j	r)|j	ndd |  t|j
 D ]\}}|j d	||d
 |  q8|d |  qd S )Nr   )r   c                 S   r@   rA   rB   rC   r   r   r   rE   q   rF   z&table_F__e_a_t.toXML.<locals>.<lambda>rG   featurer   )r4   r(   r'   r+   setting)valuer(   )	simpletagr   newlinerL   r   rM   begintagr(   r'   r+   r*   endtag)r   writerr.   r:   rK   rT   rU   r   r   r   toXMLn   s"   


ztable_F__e_a_t.toXMLc                 C   s   |dkrt t|d | _d S |dkrj|d }t }tt|d |_tt|d |_tt|dd|_t	| j
|_|| j
|< i |_|D ]$}t|tsOqG|\}}	}
|dkritt|	d |jtt|	d	 < qGd S d S )
Nr   rW   r4   r'   r(   r+   0rX   rY   )r   r   r   r&   r!   r'   r(   getr+   r$   r   r,   r*   
isinstancetuple)r   nameattrscontentr.   r4   r;   elementr   acr   r   r   fromXML   s(   


"	ztable_F__e_a_t.fromXMLr	   )	__name__
__module____qualname____doc__r
   r>   rP   r_   rj   r   r   r   r   r      s    
+$r   c                   @   s   e Zd ZdS )r&   N)rk   rl   rm   r   r   r   r   r&      s    r&   )fontTools.miscr   fontTools.misc.fixedToolsr   fontTools.misc.textToolsr    r   r   r   r   r   objectr&   r   r   r   r   <module>   s     