o
    Pj)                     @   sl  U d Z ddlZddlmZ ddlmZmZmZmZm	Z	 ddddd	Z
eeef ed
< G dd deZ	d-dededede	ee ef fddZdededededede	ee ef fddZdee defddZdededefddZdede	eef fddZdededefd d!Zd"ee dededefd#d$Zd%ed&edefd'd(ZG d)d* d*ZG d+d, d,ZdS ).zSparse Bit Set encoding/decoding for IFT (Incremental Font Transfer).

Implements the sparse bit set format defined in the W3C IFT specification:
https://w3c.github.io/IFT/Overview.html#sparse-bit-set-decoding
    N)deque)DictIterableOptionalSetTuple                         _BF_MAX_HEIGHTc                   @   s   e Zd ZdS )SparseBitSetDecodeErrorN)__name__
__module____qualname__ r   r   S/home/thesage/.local/lib/python3.10/site-packages/fontTools/misc/iftSparseBitSet.pyr      s    r       databiasmaxValuereturnc                 C   sV   | st dt| d \}}t| }||kr#t d| d| d| t| ||||S )aM  Decode a sparse bit set from binary data.

    Args:
        data: bytes-like object containing the sparse bit set encoding.
        bias: integer added to each decoded value.

    Returns:
        A tuple (values, bytesConsumed) where values is a set of integers
        and bytesConsumed is the number of bytes read from data.
    z
Empty datar   zHeight z exceeds max z for branch factor )r   _decodeHeaderr   _decodeImpl)r   r   r   branchFactorheight	maxHeightr   r   r   decode   s   r"   r   r    c                 C   sf  |dkr	t  dfS t| |}t  }t }|d |r| \}}	| }
|
d u r-td|
dkrd||	 d }|| }|| }||krDqt||| d | }|dk rUd}||krc|t	||d  q||	 }|| }	 t
|
d}|dkrwn4|	|kr|| | }||kr|  n!|dkr|| n|| }||| |	d f |
d|>  M }
qm|s|| fS )Nr      )r   r#   zUnexpected end of dataTr   )set_InputBitStreamr   appendpopleftnextr   minupdaterange_trailingZerosclearaddbytesConsumed)r   r   r    r   r   	bitStreamresultqueuestartdepthbitsexpnodeSize	fillStartfillEndnextNodeSizebitIndexval
startDeltar   r   r   r   1   sV   




(r   valuesc                 C   s   t t| }|stddS |d }t|}d}dD ]"}t||}|t| kr'qt|||}|du s9t|t|k r;|}q|du rGtd| |S )zEncode a set of integers as a sparse bit set.

    Tries all branching factors and returns the shortest encoding.

    Args:
        values: iterable of non-negative integers.

    Returns:
        bytes containing the sparse bit set encoding.
    r   r   Nr   zCannot encode max value )sortedr$   _encodeHeader_treeHeightr   _encodeWithBflen
ValueError)r>   valuesSortedr   valueSetbestr   r    encodedr   r   r   encodej   s"   

rJ   c                 C   s$   ddddd}t |d> ||  B gS )Nr   r#   r      r   )bytes)r   r    branchFactorToIdr   r   r   rA      s   rA   
headerBytec                 C   s.   | d@ }ddddd}| d? d@ }|| |fS )NrK   r   r   r   r   )r   r#   r   rK   r   r   )rN   ididToBranchFactorr    r   r   r   r      s   r   c                 C   s,   d}| }||kr|| 9 }|d7 }||ks|S )z<Return the minimum tree height needed to represent maxValue.r#   r   )r   r   r    capacityr   r   r   rB      s   rB   rG   c                    s>  |dkr	t |dS i g}| D ]"}|| }|| }||d vr$d|d |< |d |  d|> O  < qtd|D ]0}|d }i }	| D ]\}}
|| }|| }||	vrVd|	|< |	|  d|> O  < qB||	 q6t|  dtdtdtf fdd}t|}|| }tddd|d fg}|r| \}}}}|d | }d|  krt	|k rn n|| 
|dnd}
||d k r||||| d kr|d q||
 |
dkr||d k r|| d | }|
}|rt|d	}|| | }|||  }|| d }|||d ||f |d|>  M }|s|st |||  S )
Nr   r#   r?   lohir   c                    s   t  |t  |  S N)bisectbisect_rightbisect_left)rR   rS   rF   r   r   
rangeCount   s   z!_encodeWithBf.<locals>.rangeCountr   )rA   r+   itemsr&   r@   int_OutputBitStreamr   r'   rD   getwriter,   toBytes)rG   r   r    layersv	nodeIndexbitPos_	prevLayernewLayerbitmaskparentIndexrY   streamsubtreeSizer2   r4   
rangeStartrangeEndlayerIdx	childSizer5   r;   
childIndex
childStartchildEndr   rX   r   rC      s^   
.


rC   r<   maxBitsc                 C   s<   | dkr|S d}| d@ dkr| dL } |d7 }| d@ dks|S Nr   r#   r   )r<   rr   countr   r   r   r,      s   r,   c                   @   sB   e Zd ZdZdedefddZdee fddZdefd	d
Z	dS )r%   zBReads bit nodes from a byte array, starting after the header byte.r   r   c                 C   s   || _ || _d| _d| _d S )Nr#   r   )r   r   	byteIndexsubIndex)selfr   r   r   r   r   __init__   s   
z_InputBitStream.__init__r   c                 C   s,  | j dv r:| jt| jkrd S d| j > d }| j| j | j? |@ }|  j| j 7  _| jdkr8d| _|  jd7  _|S | j dkrX| jt| jkrId S | j| j }|  jd7  _|S | j dkr| jd t| jkrid S | j}| j}|| ||d  d> B ||d  d> B ||d  d	> B }|  jd
7  _|S d S )Nr   r   r#   r   r   r   rK   r   r	      r   )r   ru   rD   r   rv   )rw   maskr<   bir   r   r   r(      s2   



8z_InputBitStream.nextc                 C   s   | j | jdkr
d S d S rs   )ru   rv   rw   r   r   r   r/     s   z_InputBitStream.bytesConsumedN)
r   r   r   __doc__rL   r[   rx   r   r(   r/   r   r   r   r   r%      s
    r%   c                   @   s>   e Zd ZdZdefddZdeddfdd	Zdefd
dZdS )r\   z#Writes bit nodes into a byte array.r   c                 C   s   || _ t | _d| _d S )Nr   )r   	bytearrayr   rv   )rw   r   r   r   r   rx     s   
z_OutputBitStream.__init__valuer   Nc                 C   s   | j dv r;d| j > d }||M }| jdkr| jd | jd  || j> O  < |  j| j 7  _| jdkr9d| _d S d S | j dkrJ| j|d@  d S | j dkrw| j|d@  | j|d? d@  | j|d? d@  | j|d	? d@  d S d S )
Nry   r#   r   r?   r      r   r	   rz   )r   rv   r   r&   )rw   r   r{   r   r   r   r^   $  s$   





z_OutputBitStream.writec                 C   s
   t | jS rT   )rL   r   r~   r   r   r   r_   6  s   
z_OutputBitStream.toBytes)	r   r   r   r   r[   rx   r^   rL   r_   r   r   r   r   r\     s
    r\   )r   r   )r   rU   collectionsr   typingr   r   r   r   r   r   r[   __annotations__	Exceptionr   rL   r"   r   rJ   rA   r   rB   rC   r,   r%   r\   r   r   r   r   <module>   sJ    	

9 
J
(