
    OgzM                        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y)    )annotations)IterableAnySequenceUnionoverloadOptional)arrayN)	unhexlifyhexlify)decodec                z    t        d      }| D ]  }|j                  t        |              |j                         S )z-Returns multiple hex strings `data` as bytes.B)r
   extendr   tobytes)data
byte_arrayhexstrs      [/var/www/html/public_html/myphp/venv/lib/python3.12/site-packages/ezdxf/tools/binarydata.pyhex_strings_to_bytesr      s<    sJ -)F+,-    c                P    t        |       j                         j                         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y)EndOfBufferErrorN)__name__
__module____qualname__ r   r   r   r      s    r   r   c                  n    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y)
ByteStreamznProcess little endian binary data organized as bytes, data is padded to
    4 byte boundaries by default.
    c                @    t        |      | _        d| _        || _        y Nr   )
memoryviewbufferindex_align)selfr&   aligns      r   __init__zByteStream.__init__'   s     (
 r   c                F    | j                   t        | j                        k  S N)r'   lenr&   r)   s    r   has_datazByteStream.has_data,   s    zzC,,,r   c                L    || j                   z  }|r|| j                   z   |z
  S |S r-   )r(   )r)   r'   modulos      r   r*   zByteStream.align0   s+    $/5ut{{"V+@5@r   c                    | j                   st        d      t        j                  || 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)r0   r   structunpack_fromr&   r'   r*   calcsize)r)   fmtresults      r   read_structzByteStream.read_struct4   sZ    
 }}"#>??##CTZZHZZ

V__S-A AB
r   c                *    | j                  d      d   S )N<dr   r;   r/   s    r   
read_floatzByteStream.read_float@       %a((r   c                *    | j                  d      d   S )Nz<Lr   r>   r/   s    r   	read_longzByteStream.read_longC   r@   r   c                *    | j                  d      d   S )Nz<lr   r>   r/   s    r   read_signed_longzByteStream.read_signed_longF   r@   r   c                $    | j                  d      S )Nz<3dr>   r/   s    r   read_vertexzByteStream.read_vertexI   s    &&r   c                    | j                   }t        | j                  t        |            D ]A  }||   dk(  s| j                  }| j	                  |dz         | _        t        ||| |      c S  t        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      encodingz?Unexpected end of buffer, did not detect terminating zero byte.)r&   ranger'   r.   r*   r   r   )r)   rJ   r&   	end_indexstart_indexs        r   read_padded_stringzByteStream.read_padded_stringL   s}    
 tzz3v;7 	PIi A%"jj!ZZ	A6
f[;hOO	P M
 	
r   c                   | j                   }t        | j                  t        |      d      D ]H  }|||dz    t        k(  s| j                  }| j                  |dz         | _        t        ||| d      c S  t        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_lerI   z@Unexpected end of buffer, did not detect terminating zero bytes.)r&   rK   r'   r.   	NULL_NULLr*   r   r   )r)   r&   rL   rM   s       r   read_padded_unicode_stringz%ByteStream.read_padded_unicode_string\   s    
 tzz3v;: 	Ii)a-0I="jj!ZZ	A6
;y1K 	 N
 	
r   N)   )r&   Bytesr*   intreturnbool)r'   rV   rX   rV   )r9   strrX   r   rX   floatrX   rV   rX   Sequence[float])utf_8)rJ   rZ   rX   rZ   rX   rZ   )r   r   r   __doc__r+   propertyr0   r*   r;   r?   rB   rD   rF   rN   rS   r    r   r   r"   r"   !   sI    
!
 - -A
)))'
 
r   r"   c                  8   e Zd ZdZ	 	 d2	 	 	 	 	 d3dZed4d       Zd5dZd5dZd6dZ	d6dZ
d6dZd6d	Zd7d
Zd6dZd6dZd6dZd6dZd8dZd6dZed6d       Zed7d       Zd9d:dZed6d       Zed7d       Zd9d:dZd6dZed8d       Zed;d       Zd9d<dZed8d       Zed;d       Zd9d<dZed8d       Zed;d       Ze	 	 	 	 	 	 d=d        Z	 d>	 	 	 	 	 d?d!Zd6d"Zd6d#Zd6d$Zd@d%ZdAd8d&Zd6d'Z dBd(Z!dBd)Z"dBd*Z#dCd+Z$dDd,Z%d6d-Z&dEdFd.Z'dEdGd/Z(dHd0Z)y1)I	BitStreamz:Process little endian binary data organized as bit stream.c                N    t        |      | _        d| _        || _        || _        y r$   )r%   r&   	bit_index
dxfversionrJ   )r)   r&   rh   rJ   s       r   r+   zBitStream.__init__s   s%     !($ r   c                L    | j                   dz	  t        | j                        k  S )N   )rg   r.   r&   r/   s    r   r0   zBitStream.has_data~   s    ~~"S%555r   c                    | j                   dz	  t        | j                   dz        z   }||z  }|r|||z
  z  }|dz  | _         y)zAlign to byte border.rj      N)rg   rY   )r)   count
byte_indexr2   s       r   r*   zBitStream.align   sI    nn)T$..12D-EE
e#%&.(J#qr   c                .    | xj                   |z  c_         y)zSkip `count` bits.N)rg   r)   rm   s     r   skipzBitStream.skip   s    %r   c                    | j                   }| xj                   dz  c_         	 | j                  |dz	     d|dz  z	  z  rdS dS # t        $ r t        d      w xY w)zRead one bit from buffer.rH   rj      rl   r   r4   )rg   r&   
IndexErrorr   )r)   r'   s     r   read_bitzBitStream.read_bit   sd    !	@EQJ/4EAI3FG1NQN 	@"#>??	@s   A  A Ac                   | j                   }| j                  }||z   }|dz
  dz	  t        |      kD  rt        d      || _         d|dz  z	  }|dz	  }d}||   }|dkD  r/|dz  }||z  r|dz  }|dz  }|dz  }|s|rd}|dz  }||   }|dkD  r/|S )zRead `count` bits from buffer.rH   rj   r4   rs   rl   r   )rg   r&   r.   r   )	r)   rm   r'   r&   next_bit_indextest_bittest_byte_indexvalue	test_bytes	            r   	read_bitszBitStream.read_bits   s    Q1$s6{2"#>??'EAI&1*?+	aiaKE8#
QJENH1$"?3	 ai r   c                $    | j                  d      S )z*Read an unsigned byte (8 bit) from buffer.   r|   r/   s    r   read_unsigned_bytezBitStream.read_unsigned_byte   s    ~~a  r   c                F    | j                  d      }|dz  r
| dz  dz    S |S )z'Read a signed byte (8 bit) from buffer.r~   rs      rH   r   r)   rz   s     r   read_signed_bytezBitStream.read_signed_byte   s0    q!4<ftmq())Lr   c                    | j                   }| j                  dz	  }||z   }|t        |      k  r| xj                  |dz  z  c_        ||| S t        d      )Nrj   r4   )r&   rg   r.   r   )r)   rm   r&   rM   rL   s        r   read_aligned_byteszBitStream.read_aligned_bytes   sZ    nn)%'	F#NNeqj(N+i00"#>??r   c                    | j                   dz  r#| j                  d      }| j                  d      }n| j                  d      \  }}|dz  |z   S )z,Read an unsigned short (16 bit) from buffer.rl   r~   rP   rg   r|   r   )r)   s1s2s      r   read_unsigned_shortzBitStream.read_unsigned_short   sL    >>A"B"B,,Q/FBa2~r   c                D    | j                         }|dz  r
| dz  dz    S |S )z)Read a signed short (16 bit) from buffer.   i  rH   r   r   s     r   read_signed_shortzBitStream.read_signed_short   s0    ((*6>fvo*++Lr   c                    | j                   dz  r-| j                  } |d      } |d      } |d      } |d      }n| j                  d      \  }}}}|dz  |dz  z   |dz  z   |z   S )z+Read an unsigned long (32 bit) from buffer.rl   r~   rT         r   )r)   r|   l1l2l3l4s         r   read_unsigned_longzBitStream.read_unsigned_long   st    >>AI1B1B1B1B!44Q7NBBbR2X&"'2R77r   c                D    | j                         }|dz  r
| dz  dz    S |S )z(Read a signed long (32 bit) from buffer.l        l    rH   )r   r   s     r   rD   zBitStream.read_signed_long   s2    ''):fz)Q.//Lr   c                    | j                   dz  r*| j                  t        fdt        d      D              }nt        | j	                  d            }t        j                  d|      d   S )Nrl   c              3  .   K   | ]  } d         yw)r~   Nr    ).0_r|   s     r   	<genexpr>z'BitStream.read_float.<locals>.<genexpr>   s     8!18s   r~   r=   r   )rg   r|   bytesrK   r   r6   unpack)r)   r   r|   s     @r   r?   zBitStream.read_float   sW    >>AI8uQx88D0034D}}T4(++r   c                v    | j                         }|r'| j                         }|r| j                         }|ryyyy)Nrl      rP   r   )ru   )r)   bits     r   read_3_bitszBitStream.read_3_bits   s8    mmo--/Cmmor   c                     y r-   r    r/   s    r   read_bit_shortzBitStream.read_bit_short      r   c                     y r-   r    rp   s     r   r   zBitStream.read_bit_short  r   r   c                b      fd|dk(  r        S t        fdt        |      D              S )Nc                     j                  d      } | dk(  rj                         S | dk(  rj                         S | dk(  ryyNrP   r   rH      )r|   r   r   bitsr)   s    r   _readz'BitStream.read_bit_short.<locals>._read  sJ    >>!$Dqy--//..00r   rH   c              3  ,   K   | ]  }          y wr-   r    r   r   r   s     r   r   z+BitStream.read_bit_short.<locals>.<genexpr>       7Q7   tuplerK   r)   rm   r   s   ` @r   r   zBitStream.read_bit_short  -    		 A:7N7%,777r   c                     y r-   r    r/   s    r   read_bit_longzBitStream.read_bit_long   r   r   c                     y r-   r    rp   s     r   r   zBitStream.read_bit_long$  r   r   c                b      fd|dk(  r        S t        fdt        |      D              S )Nc                     j                  d      } | dk(  rj                         S | dk(  rj                         S | dk(  ryyr   )r|   rD   r   r   s    r   r   z&BitStream.read_bit_long.<locals>._read)  sJ    >>!$Dqy,,....00r   rH   c              3  ,   K   | ]  }          y wr-   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}| j                  d      }|dkD  r&|| j                         |z  z  }|dz  }|dz  }|dkD  r&|S )Nr   rj   rH   r~   )r|   r   )r)   rz   shiftinglengths       r   read_bit_long_longzBitStream.read_bit_long_long?  s[    "qjT,,.(::EaKFMH qj r   c                     y r-   r    r/   s    r   read_raw_doublezBitStream.read_raw_doubleI  r   r   c                     y r-   r    rp   s     r   r   zBitStream.read_raw_doubleM  r   r   c                h     |dk(  r j                         S t         fdt        |      D              S )NrH   c              3  >   K   | ]  }j                           y wr-   )r?   r   r   r)   s     r   r   z,BitStream.read_raw_double.<locals>.<genexpr>U  s     Aq*A   )r?   r   rK   rp   s   ` r   r   zBitStream.read_raw_doubleQ  s,    A:??$$AE%LAAAr   c                     y r-   r    r/   s    r   read_bit_doublezBitStream.read_bit_doubleW  r   r   c                     y r-   r    rp   s     r   r   zBitStream.read_bit_double[  r   r   c                b      fd|dk(  r        S t        fdt        |      D              S )Nc                 j    j                  d      } | dk(  rj                         S | dk(  ry| dk(  ryy)NrP   r   rH         ?        )r|   r?   r   s    r   r   z(BitStream.read_bit_double.<locals>._read`  s<    >>!$Dqy((r   rH   c              3  ,   K   | ]  }          y wr-   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                     y r-   r    r/   s    r   read_bit_double_defaultz!BitStream.read_bit_double_defaultp  r   r   c                     y r-   r    rp   s     r   r   z!BitStream.read_bit_double_defaultt  r   r   c                     y r-   r    )r)   rm   defaults      r   r   z!BitStream.read_bit_double_defaultx  s     	r   c                     t        j                  d       fd|dk(  r        S t        fdt        |      D              S )Nr=   c                    j                  d      } | dk(  rS | dk(  r<t        fdt        d      D              dd  z   }t        j                  d|      d   S | dk(  rt              }j                         |d<   j                         |d<   j                         |d<   j                         |d<   j                         |d<   j                         |d<   t        j                  d|      d   S j                         S )	NrP   r   rH   c              3  >   K   | ]  }j                           y wr-   r   r   s     r   r   zCBitStream.read_bit_double_default.<locals>._read.<locals>.<genexpr>  s     F$113Fr   rT   r=      rj   )r|   r   rK   r6   r   	bytearrayr   r?   )r   _datar   r   r)   s     r   r   z0BitStream.read_bit_double_default.<locals>._read  s    >>!$DqyFU1XFF12h  }}T51!44!$224a224a224a224a224a224a}}T51!44((r   rH   c              3  ,   K   | ]  }          y wr-   r    r   s     r   r   z4BitStream.read_bit_double_default.<locals>.<genexpr>  r   r   )r6   packr   rK   )r)   rm   r   r   r   s   ` `@@r   r   z!BitStream.read_bit_double_default~  s?     {{4)	), A:7N7%,777r   c                    d}d}	 | j                         }|dz  r||dz  |z  z  }|dz  }n||dz  |z  z  }|dz  r| S |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   rs      rl   ?   @   r   r)   r   rz   chars       r   read_signed_modular_charsz#BitStream.read_signed_modular_chars  so     **,Dd{$+(22A $+(22!%v7%7 r   c                \    d}d}	 | j                         }||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   r   rl   rs   r   r   s       r   read_unsigned_modular_charsz%BitStream.read_unsigned_modular_chars  sL     **,DdTkh..EMH4K r   c                b    | j                         }|dz  r| j                         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   )r)   shorts     r   read_modular_shortszBitStream.read_modular_shorts  s;     ((*6>,,."4HHLr   c                F    | j                         ry| j                  d      S )N)r   r   r   rj   ru   r   r/   s    r   read_bit_extrusionzBitStream.read_bit_extrusion  s    ==? ''**r   c                N    |dk\  r| j                         ry| j                         S )NAC1015r   r   )r)   rh   s     r   read_bit_thicknesszBitStream.read_bit_thickness  s%    !}}##%%r   c                "    | j                         S r-   )r   r/   s    r   read_cm_colorzBitStream.read_cm_color  s    ""$$r   c                      j                         }t         fdt        |      D              }|j                   j                        S )Nc              3  >   K   | ]  }j                           y wr-   r   r   s     r   r   z&BitStream.read_text.<locals>.<genexpr>  s     F1T,,.Fr   rI   )r   r   rK   r   rJ   r)   r   r   s   `  r   	read_textzBitStream.read_text  s:    $$&FfFF{{DMM{22r   c                      j                         }t         fdt        |dz        D              }|j                  d      S )Nc              3  >   K   | ]  }j                           y wr-   r   r   s     r   r   z.BitStream.read_text_unicode.<locals>.<genexpr>  s     J1T,,.Jr   rP   utf16rI   )r   r   rK   r   r   s   `  r   read_text_unicodezBitStream.read_text_unicode  s=     $$&Jfqj8IJJ{{G{,,r   c                `    | j                   dk  r| j                         S | j                         S )NAC1018)rh   r   r   r/   s    r   read_text_variablezBitStream.read_text_variable  s*    ??X%>>##))++r   c                    | j                         }d}d}| j                         }| j                         }|dz  r| j                         }|dz  r| j                         }|||fS )z+Returns tuple (rgb, color_name, book_name). rH   rP   )r   r   r   r   )r)   r   
color_name	book_namergbrcs         r   read_cm_color_cmszBitStream.read_cm_color_cms  sm    !
	  "$$&6002J6//1IJ	))r   c                    | j                         }|dz	  }|dz  }|rZd}d}d}d}|dz  r| j                         dz  }|dz  r| j                         }|dz  r| j                         }|dz	  }|dz  }||||fS |S )	zjReturns color index as int or tuple (rgb, color_handle,
        transparency_type, transparency).
        r~   r   Nrs   i r       r   )r   read_handler   )	r)   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|))+j8t|#//1t|))+$(BJ!#d{&7EELr   c                    | j                  d      }|dk(  r| j                         S |dk(  r| j                         dz   S | j                         S )NrP   r   rH   i  )r|   r   r   )r)   r   s     r   read_object_typezBitStream.read_object_type  sP    ~~a 19**,,QY**,u44++--r   c                4   | j                  d      }| j                  d      }|dk(  r|dz   S |dk(  r|dz
  S t        d      }t        |      D ]  }| j                         ||<    t	        j
                  d|      d   }|dk  r|S |dk(  r||z   S |d	k(  r||z
  S y)
z Returns handle as integer value.rT   r   rH   r~   s           z<Qr   
      )r|   r   rK   r   r6   r   )r)   	referencecoder   r   r'   r5   s          r   r  zBitStream.read_handle  s    ~~a "19q= 19q= <=6] 	4E113DK	4tT*1-!8Mrz 6))rz 6))r   c                *    d| j                  |      z  S )zReturns handle as hex string.z%X)r  )r)   r  s     r   read_hex_handlezBitStream.read_hex_handle5  s    d&&y111r   c                   |dk(  r| j                         S |dk(  r| j                         S |dk(  r| j                         S |dk(  r| j                         S |dk(  r| j	                         S |dk(  r| j                         S |dk(  r| j                         S |dk(  r| j                  d	      S |d
k(  r| j                         S |dk(  r| j                  d	      S |dk(  r| j                  d      S |dk(  r| j                         S |dk(  r| j                         S |dk(  r| j                         S |dk(  r| j                         S |dk(  r| j                         S t        d|       )zWRead data from bit stream by data codes defined in the
        ODA reference.

        r   RCRSBSRLBLRD2RDrP   BD2BD3BDrj   TTVHBLLCMCzUnknown code: )ru   r   r   r   rD   r   r   r   r   r   r  r   r   
ValueError)r)   r  s     r   	read_codezBitStream.read_code9  sw   
 3;==?"T\**,,T\))++T\&&((T\((**T\%%''T\''))U]''**T\''))U]''**U]''**S[>>##T\**,,S[''))U]**,,U]%%''>$011r   N)r   cp1252)r&   rU   rh   rZ   rJ   rZ   rW   )rm   rV   rX   Noner]   )rm   rV   rX   zSequence[int]r[   )rH   )rm   rV   rX   zUnion[int, Sequence[int]])rm   rV   rX   r_   )rm   rV   rX   Union[float, Sequence[float]])rm   rV   r   r\   rX   r_   )rH   r   )rm   rV   r   r\   rX   r+  r^   )r   ra   )rX   ztuple[int, str, str])rX   z#Union[int, Sequence[Optional[int]]])r   )r  rV   rX   rV   )r  rV   rX   rZ   )r  rZ   )*r   r   r   rb   r+   rc   r0   r*   rq   ru   r|   r   r   r   r   r   r   rD   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   r   re   re   o   s   D # 		!	! 	! 		! 6 6) @8!@
8,    8"    8.    B    8"     #(	  0388',8	&8@8* 
+&%3
-,*0..2%2r   re   )r   zIterable[str]rX   r   )r   r   rX   rZ   )
__future__r   typingr   r   r   r   r   r	   r
   r6   binasciir   r   codecsr   r   r   r%   rU   r   r   rR   EOFErrorr   r"   re   r    r   r   <module>r1     sc    # E E   ' eY
*+ *
 		x 	K
 K
\o2 o2r   