
    'jzM                        d dl mZ d dlmZ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mZ eeeef         ZddZddZdZ G d de          Z G d d          Z G d d          ZdS )    )annotations)IterableAnySequenceUnionoverloadOptional)arrayN)	unhexlifyhexlify)decodedataIterable[str]returnbytesc                    t          d          }| D ]$}|                    t          |                     %|                                S )z-Returns multiple hex strings `data` as bytes.B)r
   extendr   tobytes)r   
byte_arrayhexstrs      P/DATA/AppData/hermes/venv/lib/python3.11/site-packages/ezdxf/tools/binarydata.pyhex_strings_to_bytesr      sM    sJ - -)F++,,,,    strc                h    t          |                                                                           S )z)Returns `data` bytes as plain hex string.)r   upperr   )r   s    r   bytes_to_hexstrr      s&    4==  '')))r   s     c                      e Zd ZdS )EndOfBufferErrorN)__name__
__module____qualname__ r   r   r    r       s        Dr   r    c                  v    e Zd ZdZdddZedd
            ZddZd dZd!dZ	d"dZ
d"dZd#dZd$d%dZd&dZdS )'
ByteStreamznProcess little endian binary data organized as bytes, data is padded to
    4 byte boundaries by default.
       bufferBytesalignintc                J    t          |          | _        d| _        || _        d S Nr   )
memoryviewr(   index_align)selfr(   r*   s      r   __init__zByteStream.__init__'   s#     ((
 r   r   boolc                <    | j         t          | j                  k     S N)r/   lenr(   r1   s    r   has_datazByteStream.has_data,   s    zC,,,,r   r/   c                8    || j         z  }|r|| j         z   |z
  n|S r5   )r0   )r1   r/   modulos      r   r*   zByteStream.align0   s*    $/5@ut{"V++5@r   fmtr   r   c                    | j         st          d          t          j        || j        | j                  }|                     | j        t          j        |          z             | _        |S )zRead data defined by a struct format string. Insert little endian
        format character '<' as first character, if machine has native big
        endian byte order.
        Unexpected end of buffer.)offset)r8   r    structunpack_fromr(   r/   r*   calcsize)r1   r;   results      r   read_structzByteStream.read_struct4   sb    
 } 	@"#>???#CTZHHHZZ
V_S-A-A ABB
r   floatc                8    |                      d          d         S )N<dr   rC   r7   s    r   
read_floatzByteStream.read_float@       %%a((r   c                8    |                      d          d         S )Nz<Lr   rG   r7   s    r   	read_longzByteStream.read_longC   rI   r   c                8    |                      d          d         S )Nz<lr   rG   r7   s    r   read_signed_longzByteStream.read_signed_longF   rI   r   Sequence[float]c                ,    |                      d          S )Nz<3drG   r7   s    r   read_vertexzByteStream.read_vertexI   s    &&&r   utf_8encodingc                   | j         }t          | j        t          |                    D ]M}||         dk    r?| j        }|                     |dz             | _        t          |||         |          c S Nt          d          )u   PS: Padded String. This is a string, terminated with a zero byte.
        The file’s text encoding (code page) is used to encode/decode the bytes
        into a string.
        r      rR   z?Unexpected end of buffer, did not detect terminating zero byte.)r(   ranger/   r6   r*   r   r    )r1   rR   r(   	end_indexstart_indexs        r   read_padded_stringzByteStream.read_padded_stringL   s    
 tz3v;;77 	P 	PIi A%%"j!ZZ	A66
f[%:;hOOOOOO	 &
 M
 
 	
r   c                $   | j         }t          | j        t          |          d          D ]W}|||dz            t          k    r?| j        }|                     |dz             | _        t          |||         d          c S Xt          d          )zPUS: Padded Unicode String. The bytes are encoded using Unicode
        encoding. The bytes consist of byte pairs and the string is terminated
        by 2 zero bytes.
           	utf_16_lerU   z@Unexpected end of buffer, did not detect terminating zero bytes.)r(   rV   r/   r6   	NULL_NULLr*   r   r    )r1   r(   rW   rX   s       r   read_padded_unicode_stringz%ByteStream.read_padded_unicode_string\   s    
 tz3v;;:: 	 	Ii)a-/0I=="j!ZZ	A66
;y01K     	 > N
 
 	
r   N)r'   )r(   r)   r*   r+   r   r3   )r/   r+   r   r+   )r;   r   r   r   r   rD   r   r+   r   rN   )rQ   )rR   r   r   r   r   r   )r!   r"   r#   __doc__r2   propertyr8   r*   rC   rH   rK   rM   rP   rY   r^   r$   r   r   r&   r&   !   s         
! ! ! ! !
 - - - X-A A A A
 
 
 
) ) ) )) ) ) )) ) ) )' ' ' '
 
 
 
 
 
 
 
 
 
 
r   r&   c                  b   e Zd ZdZ	 	 dKdLd	ZedMd            ZdNdZdNdZdOdZ	dOdZ
dOdZdOdZdPdZdOdZdOdZdOdZdOdZdQdZdOdZedOd            ZedPd             ZdRdSd#ZedOd$            ZedPd%            ZdRdSd&ZdOd'ZedQd(            ZedTd*            ZdRdUd,ZedQd-            ZedTd.            ZdRdUd/ZedQd0            ZedTd1            ZedVd3            Z	 dWdXd5ZdOd6ZdOd7ZdOd8ZdYd9ZdZdQd:ZdOd;Z d[d<Z!d[d=Z"d[d>Z#d\d@Z$d]dBZ%dOdCZ&d^d_dFZ'd^d`dGZ(dadIZ)dJS )b	BitStreamz:Process little endian binary data organized as bit stream.AC1015cp1252r(   r)   
dxfversionr   rR   c                X    t          |          | _        d| _        || _        || _        d S r-   )r.   r(   	bit_indexrj   rR   )r1   r(   rj   rR   s       r   r2   zBitStream.__init__s   s,     !(($ r   r   r3   c                B    | j         dz	  t          | j                  k     S )N   )rl   r6   r(   r7   s    r   r8   zBitStream.has_data~   s    ~"S%5%555r   countr+   Nonec                |    | j         dz	  t          | j         dz            z   }||z  }|r|||z
  z  }|dz  | _         dS )zAlign to byte border.rn      N)rl   r3   )r1   ro   
byte_indexr:   s       r   r*   zBitStream.align   sQ    n)T$.12D-E-EE
e# 	)%&.(J#qr   c                &    | xj         |z  c_         dS )zSkip `count` bits.N)rl   r1   ro   s     r   skipzBitStream.skip   s    %r   c                    | j         }| xj         dz  c_         	 | j        |dz	           d|dz  z	  z  rdndS # t          $ r t          d          w xY w)zRead one bit from buffer.rT   rn      rr   r   r=   )rl   r(   
IndexErrorr    )r1   r/   s     r   read_bitzBitStream.read_bit   su    !	@EQJ/4EAI3FGN11QN 	@ 	@ 	@"#>???	@s	   6 Ac                (   | j         }| j        }||z   }|dz
  dz	  t          |          k    rt          d          || _         d|dz  z	  }|dz	  }d}||         }|dk    r2|dz  }||z  r|dz  }|dz  }|dz  }|s|rd}|dz  }||         }|dk    2|S )zRead `count` bits from buffer.rT   rn   r=   rx   rr   r   )rl   r(   r6   r    )	r1   ro   r/   r(   next_bit_indextest_bittest_byte_indexvalue	test_bytes	            r   	read_bitszBitStream.read_bits   s    Q1$s6{{22"#>???'EAI&1*?+	aiiaKE8# 
QJENH 4 41$"?3	 aii r   c                ,    |                      d          S )z*Read an unsigned byte (8 bit) from buffer.   r   r7   s    r   read_unsigned_bytezBitStream.read_unsigned_byte   s    ~~a   r   c                N    |                      d          }|dz  r
| dz  dz    S |S )z'Read a signed byte (8 bit) from buffer.r   rx      rT   r   r1   r   s     r   read_signed_bytezBitStream.read_signed_byte   s8    q!!4< 	ftmq())Lr   Sequence[int]c                    | j         }| j        dz	  }||z   }|t          |          k    r| xj        |dz  z  c_        |||         S t          d          )Nrn   r=   )r(   rl   r6   r    )r1   ro   r(   rX   rW   s        r   read_aligned_byteszBitStream.read_aligned_bytes   sc    n)%'	F##NNeqj(NN+i/00"#>???r   c                    | j         dz  r+|                     d          }|                     d          }n|                     d          \  }}|dz  |z   S )z,Read an unsigned short (16 bit) from buffer.rr   r   r[   rl   r   r   )r1   s1s2s      r   read_unsigned_shortzBitStream.read_unsigned_short   sZ    >A 	0""B""BB,,Q//FBa2~r   c                L    |                                  }|dz  r
| dz  dz    S |S )z)Read a signed short (16 bit) from buffer.   i  rT   r   r   s     r   read_signed_shortzBitStream.read_signed_short   s8    ((**6> 	fvo*++Lr   c                    | j         dz  r4| j        } |d          } |d          } |d          } |d          }n|                     d          \  }}}}|dz  |dz  z   |dz  z   |z   S )z+Read an unsigned long (32 bit) from buffer.rr   r   r'         r   )r1   r   l1l2l3l4s         r   read_unsigned_longzBitStream.read_unsigned_long   s    >A 	8I1B1B1B1BB!44Q77NBBbR2X&"'2R77r   c                L    |                                  }|dz  r
| dz  dz    S |S )z(Read a signed long (32 bit) from buffer.l        l    rT   )r   r   s     r   rM   zBitStream.read_signed_long   s:    '')): 	fz)Q.//Lr   rD   c                    | j         dz  r0| j        t          fdt          d          D                       }n"t          |                     d                    }t          j        d|          d         S )Nrr   c              3  .   K   | ]} d           V  dS )r   Nr$   ).0_r   s     r   	<genexpr>z'BitStream.read_float.<locals>.<genexpr>   s+      88!1888888r   r   rF   r   )rl   r   r   rV   r   r?   unpack)r1   r   r   s     @r   rH   zBitStream.read_float   su    >A 	5I8888uQxx88888DD003344D}T4((++r   c                    |                                  }|r2|                                  }|r|                                  }|rdS dS dS dS )Nrr      r[   r   )rz   )r1   bits     r   read_3_bitszBitStream.read_3_bits   sU    mmoo 
	--//C mmoo 1111r   c                    d S r5   r$   r7   s    r   read_bit_shortzBitStream.read_bit_short      r   c                    d S r5   r$   ru   s     r   r   zBitStream.read_bit_short  r   r   rT   Union[int, Sequence[int]]c                      fd|dk    r
             S t          fdt          |          D                       S )Nc                                          d          } | dk    r                                S | dk    r                                S | dk    rdS dS Nr[   r   rT      )r   r   r   bitsr1   s    r   _readz'BitStream.read_bit_short.<locals>._read  s]    >>!$$Dqyy--///..000qsr   rT   c              3  ,   K   | ]}             V  d S r5   r$   r   r   r   s     r   r   z+BitStream.read_bit_short.<locals>.<genexpr>  )      77Q777777r   tuplerV   r1   ro   r   s   ` @r   r   zBitStream.read_bit_short  \    		 		 		 		 		 A::577N7777%,,777777r   c                    d S r5   r$   r7   s    r   read_bit_longzBitStream.read_bit_long   r   r   c                    d S r5   r$   ru   s     r   r   zBitStream.read_bit_long$  r   r   c                      fd|dk    r
             S t          fdt          |          D                       S )Nc                                          d          } | dk    r                                S | dk    r                                S | dk    rdS dS r   )r   rM   r   r   s    r   r   z&BitStream.read_bit_long.<locals>._read)  s]    >>!$$Dqyy,,.....000qsr   rT   c              3  ,   K   | ]}             V  d S r5   r$   r   s     r   r   z*BitStream.read_bit_long.<locals>.<genexpr>7  r   r   r   r   s   ` @r   r   zBitStream.read_bit_long(  r   r   c                    d}d}|                      d          }|dk    r*||                                 |z  z  }|dz  }|dz  }|dk    *|S )Nr   rn   rT   r   )r   r   )r1   r   shiftinglengths       r   read_bit_long_longzBitStream.read_bit_long_long?  se    ""qjjT,,..(::EaKFMH qjj r   c                    d S r5   r$   r7   s    r   read_raw_doublezBitStream.read_raw_doubleI  r   r   rN   c                    d S r5   r$   ru   s     r   r   zBitStream.read_raw_doubleM  r   r   Union[float, Sequence[float]]c                     |dk    r                                  S t           fdt          |          D                       S )NrT   c              3  @   K   | ]}                                 V  d S r5   )rH   r   r   r1   s     r   r   z,BitStream.read_raw_double.<locals>.<genexpr>U  s-      AAq**AAAAAAr   )rH   r   rV   ru   s   ` r   r   zBitStream.read_raw_doubleQ  sE    A::??$$$AAAAE%LLAAAAAAr   c                    d S r5   r$   r7   s    r   read_bit_doublezBitStream.read_bit_doubleW  r   r   c                    d S r5   r$   ru   s     r   r   zBitStream.read_bit_double[  r   r   c                      fd|dk    r
             S t          fdt          |          D                       S )Nc                                          d          } | dk    r                                S | dk    rdS | dk    rdS dS )Nr[   r   rT         ?        )r   rH   r   s    r   r   z(BitStream.read_bit_double.<locals>._read`  sN    >>!$$Dqyy(((sssr   rT   c              3  ,   K   | ]}             V  d S r5   r$   r   s     r   r   z,BitStream.read_bit_double.<locals>.<genexpr>n  r   r   r   r   s   ` @r   r   zBitStream.read_bit_double_  r   r   c                    d S r5   r$   r7   s    r   read_bit_double_defaultz!BitStream.read_bit_double_defaultp  r   r   c                    d S r5   r$   ru   s     r   r   z!BitStream.read_bit_double_defaultt  r   r   defaultc                    d S r5   r$   )r1   ro   r   s      r   r   z!BitStream.read_bit_double_defaultx  s	     	r   r   c                     t          j        d           fd|dk    r
             S t          fdt          |          D                       S )NrF   c                                         d          } | dk    rS | dk    rNt          fdt          d          D                       dd          z   }t          j        d|          d         S | dk    rt                    }                                |d<                                   |d<                                   |d<                                   |d<                                   |d<                                   |d<   t          j        d|          d         S                                 S )	Nr[   r   rT   c              3  @   K   | ]}                                 V  d S r5   r   r   s     r   r   zCBitStream.read_bit_double_default.<locals>._read.<locals>.<genexpr>  s/      FF$1133FFFFFFr   r'   rF      rn   )r   r   rV   r?   r   	bytearrayr   rH   )r   _datar   r   r1   s     r   r   z0BitStream.read_bit_double_default.<locals>._read  s8   >>!$$DqyyFFFFU1XXFFFFF122h  }T511!44!$2244a2244a2244a2244a2244a2244a}T511!44(((r   rT   c              3  ,   K   | ]}             V  d S r5   r$   r   s     r   r   z4BitStream.read_bit_double_default.<locals>.<genexpr>  r   r   )r?   packr   rV   )r1   ro   r   r   r   s   ` `@@r   r   z!BitStream.read_bit_double_default~  s{     {4))	) 	) 	) 	) 	) 	) 	), A::577N7777%,,777777r   c                    d}d}	 |                                  }|dz  r||dz  |z  z  }|dz  }n||dz  |z  z  }|dz  r| n|S @)a  Modular characters are a method of storing compressed integer
        values. They consist of a stream of bytes, terminating when the high
        bit (8) of the byte is 0 else another byte follows. Negative numbers
        are indicated by bit 7 set in the last byte.

        r   Trx      rr   ?   @   r   r1   r   r   chars       r   read_signed_modular_charsz#BitStream.read_signed_modular_chars  s}     
	8**,,Dd{ 8$+(22A $+(22!%7vv%7
	8r   c                d    d}d}	 |                                  }||dz  |z  z  }|dz  }|dz  s|S ,)zModular characters are a method of storing compressed integer
        values. They consist of a stream of bytes, terminating when the high
        bit (8) of the byte is 0 else another byte follows.

        r   Tr   rr   rx   r   r   s       r   read_unsigned_modular_charsz%BitStream.read_unsigned_modular_chars  sV     	**,,DdTkh..EMH4K 	r   c                r    |                                  }|dz  r|                                  dz  |dz  z  S |S )zModular shorts are a method of storing compressed unsigned integer
        values. Only 1 or 2 shorts in practical usage (1GB), if the high
        bit (16) of the first short is set another short follows.

        r      i  r   )r1   shorts     r   read_modular_shortszBitStream.read_modular_shorts  sF     ((**6> 	,,.."4HHLr   c                X    |                                  rdS |                     d          S )N)r   r   r   rn   rz   r   r7   s    r   read_bit_extrusionzBitStream.read_bit_extrusion  s+    ==?? 	+ =''***r   c                b    |dk    r|                                  rdS |                                 S )Nrh   r   r   )r1   rj   s     r   read_bit_thicknesszBitStream.read_bit_thickness  s4    !!}} s##%%%r   c                *    |                                  S r5   )r   r7   s    r   read_cm_colorzBitStream.read_cm_color  s    ""$$$r   c                                                       }t           fdt          |          D                       }|                     j                  S )Nc              3  @   K   | ]}                                 V  d S r5   r   r   s     r   r   z&BitStream.read_text.<locals>.<genexpr>  s/      FF1T,,..FFFFFFr   rU   )r   r   rV   r   rR   r1   r   r   s   `  r   	read_textzBitStream.read_text  sR    $$&&FFFFfFFFFF{{DM{222r   c                                                       }t           fdt          |dz            D                       }|                    d          S )Nc              3  @   K   | ]}                                 V  d S r5   r   r   s     r   r   z.BitStream.read_text_unicode.<locals>.<genexpr>  s/      JJ1T,,..JJJJJJr   r[   utf16rU   )r   r   rV   r   r   s   `  r   read_text_unicodezBitStream.read_text_unicode  sX     $$&&JJJJfqj8I8IJJJJJ{{G{,,,r   c                h    | j         dk     r|                                 S |                                 S )NAC1018)rj   r   r   r7   s    r   read_text_variablezBitStream.read_text_variable  s1    ?X%%>>###))+++r   tuple[int, str, str]c                    |                                  }d}d}|                                 }|                                 }|dz  r|                                 }|dz  r|                                 }|||fS )z+Returns tuple (rgb, color_name, book_name). rT   r[   )r   r   r   r  )r1   r   
color_name	book_namergbrcs         r   read_cm_color_cmszBitStream.read_cm_color_cms  s    !!
	  ""$$&&6 	30022J6 	2//11IJ	))r   #Union[int, Sequence[Optional[int]]]c                   |                                  }|dz	  }|dz  }|rfd}d}d}d}|dz  r|                                  dz  }|dz  r|                                 }|dz  r|                                 }|dz	  }|dz  }||||fS |S )	zjReturns color index as int or tuple (rgb, color_handle,
        transparency_type, transparency).
        r   r   Nrx   i r       r   )r   read_handler   )	r1   flags_and_indexflagsr/   r  color_handletransparency_typetransparencyr   s	            r   read_cm_color_enczBitStream.read_cm_color_enc  s     --//1$$& 	CL $Lt| 9))++j8t| 2#//11t| +))++$(BJ!#d{&7EELr   c                    |                      d          }|dk    r|                                 S |dk    r|                                 dz   S |                                 S )Nr[   r   rT   i  )r   r   r   )r1   r   s     r   read_object_typezBitStream.read_object_type  s`    ~~a  199**,,,QYY**,,u44++---r   r   	referencec                h   |                      d          }|                      d          }|dk    r|dz   S |dk    r|dz
  S t          d          }t          |          D ]}|                                 ||<   t	          j        d|          d         }|dk     r|S |dk    r||z   S |d	k    r||z
  S dS )
z Returns handle as integer value.r'   r   rT   r   s           z<Qr   
      )r   r   rV   r   r?   r   )r1   r  coder   r   r/   r>   s          r   r  zBitStream.read_handle  s    ~~a  ""199q= 199q= <==6]] 	4 	4E1133DKKtT**1-!88Mrzz 6))rzz 6))qr   c                2    d|                      |          z  S )zReturns handle as hex string.z%X)r  )r1   r  s     r   read_hex_handlezBitStream.read_hex_handle5  s    d&&y1111r   r  c                l   |dk    r|                                  S |dk    r|                                 S |dk    r|                                 S |dk    r|                                 S |dk    r|                                 S |dk    r|                                 S |dk    r|                                 S |dk    r|                     d	          S |d
k    r|                                 S |dk    r|                     d	          S |dk    r|                     d          S |dk    r|                                 S |dk    r| 	                                S |dk    r| 
                                S |dk    r|                                 S |dk    r|                                 S t          d|           )zWRead data from bit stream by data codes defined in the
        ODA reference.

        r   RCRSBSRLBLRD2RDr[   BD2BD3BDrn   TTVHBLLCMCzUnknown code: )rz   r   r   r   rM   r   r   r   r   r  r  r   r   
ValueError)r1   r  s     r   	read_codezBitStream.read_code9  s   
 3;;==??"T\\**,,,T\\))+++T\\&&(((T\\((***T\\%%'''T\\'')))U]]''***T\\'')))U]]''***U]]''***S[[>>###T\\**,,,S[['')))U]]**,,,U]]%%'''0$00111r   N)rh   ri   )r(   r)   rj   r   rR   r   r_   )ro   r+   r   rp   ra   )ro   r+   r   r   r`   )rT   )ro   r+   r   r   )ro   r+   r   rN   )ro   r+   r   r   )ro   r+   r   rD   r   rN   )rT   r   )ro   r+   r   rD   r   r   rb   )rh   rc   )r   r  )r   r
  )r   )r  r+   r   r+   )r  r+   r   r   )r  r   )*r!   r"   r#   rd   r2   re   r8   r*   rv   rz   r   r   r   r   r   r   r   rM   rH   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r	  r  r  r  r  r.  r$   r   r   rg   rg   o   s       DD # 		! 	! 	! 	! 	! 6 6 6 X6) ) ) )       @ @ @ @   8! ! ! !   @ @ @ @      
8 
8 
8 
8   , , , ,       X    X8 8 8 8 8"    X    X8 8 8 8 8.       X    XB B B B B    X    X8 8 8 8 8"    X    X    X 038 8 8 8 8@8 8 8 8*    
 
 
 
+ + + +& & & & &% % % %3 3 3 3
- - - -, , , ,* * * *   0. . . .    .2 2 2 2 2%2 %2 %2 %2 %2 %2r   rg   )r   r   r   r   )r   r   r   r   )
__future__r   typingr   r   r   r   r   r	   r
   r?   binasciir   r   codecsr   r   r   r.   r)   r   r   r]   EOFErrorr    r&   rg   r$   r   r   <module>r4     se   # " " " " " E E E E E E E E E E E E E E E E        ' ' ' ' ' ' ' '      eY
*+       * * * *
 		 	 	 	 	x 	 	 	K
 K
 K
 K
 K
 K
 K
 K
\o2 o2 o2 o2 o2 o2 o2 o2 o2 o2r   