)EjP*UdZddlZddlmZddlmZmZmZmZm Z ddddd Z ee e fe d <Gd d e Z d%dede de de ee e ffdZdede de de de de ee e ff dZdee defdZde de defdZde de e e ffdZde de de fdZdee de de defdZde de de fd ZGd!d"ZGd#d$ZdS)&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)DictIterableOptionalSetTuple  _BF_MAX_HEIGHTceZdZdS)SparseBitSetDecodeErrorN)__name__ __module__ __qualname__PC:\PYTHON\MyICR_Suite\python\Lib\site-packages\fontTools/misc/iftSparseBitSet.pyrrsDrrdatabiasmaxValuereturnc|stdt|d\}}t|}||krtd|d|d|t|||||S)aMDecode 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 datarzHeight z exceeds max z for branch factor )r _decodeHeaderr _decodeImpl)rrr branchFactorheight maxHeights rdecoder&s 4%l333(a11L&|,I % Wf W W9 W W W W    t\64 B BBrr#r$c`|dkrtdfSt||}t}t}|d|r?|\}} |} | t d| dkrg|| z dz} || z} ||z} | |kr^t||| zdz |z}| dkrd} | |kr&|t| |dz|| z } || z} t| d}|dkrnq| |kr?||z|z}||kr| nH|dkr| |n"||z}|||z| dzf| d|zz} |?|| fS)Nr)rr(zUnexpected end of dataTr)set_InputBitStreamrappendpopleftnextrminupdaterange_trailingZerosclearadd bytesConsumed)rr#r$rr bitStreamresultqueuestartdepthbitsexpnodeSize fillStartfillEnd nextNodeSizebitIndexval startDeltas rr"r"1s{{qzl33IuuF%*GGE LL &%}} u~~ <)*BCC C 1995.1$C#S(H I8##(EH$4q$84$?@@G1}} G## eIw{;;<<< un#S(  %%dB//H2~~h&->>KKMMM!88JJsOOO% 4  ej0%!)<=== a8m$ $D %1 &%P I++-- ..rvaluescttt|}|stddS|d}t|}d}dD]Y}t||}|t|kr$t |||}| t |t |kr|}Z|td||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. rrNr zCannot encode max value )sortedr) _encodeHeader _treeHeightr _encodeWithBflen ValueError)rC valuesSortedrvalueSetbestr#r$encodeds rencoderPjs#f++&&L #Q"""BH<  H D% \844 N<0 0 0 ,?? <3w<<#d))33D |>H>>??? KrcHddddd}t|dz||zgS)Nrr(rr )bytes)r#r$branchFactorToIds rrGrGs4qa00 6Q;"2<"@@A B BBr headerBytec>|dz}ddddd}|dz dz}|||fS)NrRrrrr)rr(rrRr r)rUididToBranchFactorr$s rr!r!s< d BqR00Ao %F B  ''rc:d}|}||kr||z}|dz }||k|S)z FH h  L !  h   MrrMc|dkrt|dSig}|D]:}||z}||z}||dvr d|d|<|d|xxd|zzcc<;td|D]a}|d}i} |D]+\}} ||z} ||z}| | vrd| | <| | xxd|zzcc<,|| bt |dt dt dt ffd } t |} ||z}tddd|dz fg}|r|\}}}}|dz |z }d|cxkrt|krnn|| |dnd} ||dz kr,| ||||z dzkr| d| | | dkrg||dz kr^||z dz|z}| }|rOt|d}||z|z}|||zz}||zdz }|||dz||f|d|zz}|O|t||| zS) Nrr(rElohircZtj|tj|z SN)bisect bisect_right bisect_left)r\r]rLs r rangeCountz!_encodeWithBf..rangeCounts1"<44v7I "8 8   rr)rGr0itemsr+rFint_OutputBitStreamrr,rJgetwriter1toBytes)rMr#r$layersv nodeIndexbitPos_ prevLayernewLayerbitmask parentIndexrcstream subtreeSizer7r9 rangeStartrangeEndlayerIdx childSizer:r@ childIndex childStartchildEndrLs @rrIrIsQ {{\1---%'4F ,,% \! F1I % %#$F1Ii q )V + 1f     2J #%"+//"3"3 1 1 Iw#|3K-F(**()% [ ! ! !Q&[ 0 ! ! ! ! h(##L s        l + +F&K.3aA{Q5O4P.Q.QE )16. 5*hA:%34x2M2M2M2M#f++2M2M2M2M2MF8  A . . .ST  FQJ   :x00Hz4IA4MMM LLOOO  W a<> % 1A5 j%!)ZJKKK!x-((  )/ )> v . .1A1A AArrAmaxBitscR|dkr|Sd}|dzdkr|dz}|dz }|dzdk|SNrr(r)rAr|counts rr1r1sJ axx E 7q..     7q.. LrcFeZdZdZdedefdZdeefdZdefdZ dS) r*zBReads bit nodes from a byte array, starting after the header byte.rr#c>||_||_d|_d|_dS)Nr(r)rr# byteIndexsubIndex)selfrr#s r__init__z_InputBitStream.__init__s# ( rrc|jdvr|jt|jkrdSd|jzdz }|j|j|jz |z}|xj|jz c_|jdkrd|_|xjdz c_|S|jdkrC|jt|jkrdS|j|j}|xjdz c_|S|jdkrw|jdzt|jkrdS|j}|j}||||dzdzz||dzdzz||dzd zz}|xjd z c_|SdS) Nrrr(rrrrRrr r)r#rrJrr)rmaskrAbis rr-z_InputBitStream.nextsn   & &~TY//t**a/D9T^, =EC MMT. .MM}!! ! !#J  ! # #~TY//t)DN+C NNa NNJ  " $ $~!S^^33t AAA$!AE(a-(Aa!eHN;qQx2~NC NNa NNJtrc0|j|jdkrdndzSr~)rrrs rr4z_InputBitStream.bytesConsumeds~dma&7&7Q??rN) rrr__doc__rSrerrr-r4rrrr*r*s}LLU# hsm6@s@@@@@@rr*c:eZdZdZdefdZdeddfdZdefdZdS) rfz#Writes bit nodes into a byte array.r#cH||_t|_d|_dS)Nr)r# bytearrayrr)rr#s rrz_OutputBitStream.__init__s (KK  rvaluerNc~|jdvrd|jzdz }||z}|jdkr|jd|jdxx||jzzcc<|xj|jz c_|jdkr d|_dSdS|jdkr|j|dzdS|jdkr|j|dz|j|dz dz|j|dz dz|j|d z dzdSdS) Nrr(rrErrr r)r#rrr+)rrrs rrhz_OutputBitStream.write$sa   & &**a/D TME}!!   ### IbMMMUdm3 3MMM MMT. .MM}!! ! "!  ! # # I  UT\ * * * * *  " $ $ I  UT\ * * * I  eqjD0 1 1 1 I  erkT1 2 2 2 I  erkT1 2 2 2 2 2 % $rc*t|jSr_)rSrrs rriz_OutputBitStream.toBytes6sTYr) rrrrrerrhrSrirrrrfrfsr--S 33343333$       rrf)rr)rr` collectionsrtypingrrrrrrre__annotations__ ExceptionrrSr&r"rPrGr!rHrIr1r*rfrrrrs 77777777777777&(B21!=!=S#X===     i   1;CC CC*-C 3s8S=CCCC66/ 6/"6/,/6/7:6/FI6/ 3s8S=6/6/6/6/r8C=U@CCSCUCCCC (c(eCHo((((cSSGBCHGBCGBGBGBGBGBGBTcc%@%@%@%@%@%@%@%@P          r