o
    ۩Zh,                     @   s^  d dl Z d dlZd dlmZmZmZ d dlmZmZm	Z	m
Z
mZmZmZmZ g dZdZdZdZdZd	Zd
ZdZdZdZdZdZdZdededefddZdededefddZdededefddZ dededefddZ!de"de#defd d!Z$ee"eeef f Z%ee"eee
e e
e f f Z&ee"eeee#e%e&f f Z'G d"d# d#Z(G d$d% d%Z)dS )&    N)packunpackcalcsize)BinaryIODictIterableListOptionalTupleUnioncast))>Lnumber)>Bflags)r   retention_flags)r   
page_assoc)r   data_length   @   ?      i   l    &   1   3   s   JB2

   bit_posvaluereturnc                 C   s   t || ? d@ S )Nr   bool)r   r    r"   E/var/www/html/lang_env/lib/python3.10/site-packages/pdfminer/jbig2.pybit_set%   s   r$   flagc                 C   s   t | |@ S Nr    )r%   r   r"   r"   r#   
check_flag)   s   r'   maskc                 C   s2   t ddD ]}t|| r|| @ |?   S qtdNr      zInvalid mask or valueranger$   	Exceptionr(   r   r   r"   r"   r#   masked_value-   s
   
r/   c                 C   s6   t ddD ]}t|| r|| |? @ |>   S qtdr)   r+   r.   r"   r"   r#   
mask_value5   s
   
r0   formatbufferc                 C   s&   | dv sJ t tt t| |\}|S )N>   r   >Ir   )r   r
   intr   )r1   r2   resultr"   r"   r#   
unpack_int=   s   r6   c                   @   s   e Zd ZdZdeddfddZdee fddZde	fd	d
Z
dedededefddZdedededefddZdedededefddZdedededefddZdS )JBIG2StreamReaderz&Read segments from a JBIG2 byte streamstreamr   Nc                 C   
   || _ d S r&   r8   selfr8   r"   r"   r#   __init__M      
zJBIG2StreamReader.__init__c           	      C   s   g }|   sNi }tD ]5\}}t|}| j|}t||k r$d|d<  nt||}t| d| d }t|r;||||}|||< q
|	dsJ|
| |   r|S )NT_errorzparse_%s)is_eof
SEG_STRUCTr   r8   readlenr6   getattrcallablegetappend)	r<   segmentssegmentfield_formatnameZ	field_lenfieldr   parserr"   r"   r#   get_segmentsP   s$   



zJBIG2StreamReader.get_segmentsc                 C   s(   | j ddkr
dS | j dtj dS )Nr       TF)r8   rB   seekosSEEK_CUR)r<   r"   r"   r#   r@   d   s   zJBIG2StreamReader.is_eofrI   r   rL   c                 C   s   t t|t t|tt|dS )N)deferredpage_assoc_longtype)r'   HEADER_FLAG_DEFERREDHEADER_FLAG_PAGE_ASSOC_LONGr/   SEG_TYPE_MASK)r<   rI   r   rL   r"   r"   r#   parse_flagsk   s   zJBIG2StreamReader.parse_flagsc                 C   s*  t t|}g }g }|tk rtdD ]
}|t|| qn<|| jd7 }td|}t t	|}t
t|d d }t|D ]}	td| jd}
tdD ]
}|t||
 qMq>|d }t|t
sdJ |d	krkd}n	|d
krrd}nd}t|}t|D ]}| j|}t||}|| q||||dS )N      r   r      r   r   r         r3   )	ref_countretain_segmentsref_segments)r/   REF_COUNT_SHORT_MASKREF_COUNT_LONGr,   rG   r$   r8   rB   r6   REF_COUNT_LONG_MASKr4   mathceil
isinstancer   )r<   rI   r   rL   r`   ra   rb   r   Zret_bytes_countZret_byte_indexret_byteseg_num
ref_formatZref_size	ref_indexZref_datarefr"   r"   r#   parse_retention_flagst   s@   



z'JBIG2StreamReader.parse_retention_flagspagec                 C   s0   t t|d d r|| jd7 }td|}|S )Nr   rU   r\   r   )r   JBIG2SegmentFlagsr8   rB   r6   )r<   rI   ro   rL   r"   r"   r#   parse_page_assoc   s   
z"JBIG2StreamReader.parse_page_assoclengthc                 C   s>   |rt t|d d tkr|tkrtd| j||d< |S )Nr   rV   z:Working with unknown segment length is not implemented yetraw_data)r   rp   SEG_TYPE_IMMEDIATE_GEN_REGIONDATA_LEN_UNKNOWNNotImplementedErrorr8   rB   )r<   rI   rr   rL   r"   r"   r#   parse_data_length   s   z#JBIG2StreamReader.parse_data_length)__name__
__module____qualname____doc__r   r=   r   JBIG2SegmentrN   r!   r@   r4   bytesrp   rZ   JBIG2RetentionFlagsrn   rq   rw   r"   r"   r"   r#   r7   J   sB    
	
*r7   c                   @   s  e Zd ZU dZdeee g eee g dZe	e
d< deddfdd	Z	
d!dee dedefddZ	
d!dee dedefddZdedefddZdededefddZde	dedefddZdededefddZdededefddZdedefdd ZdS )"JBIG2StreamWriterz.Write JBIG2 segments to a file in JBIG2 formatr   )r`   rb   ra   EMPTY_RETENTION_FLAGSr8   r   Nc                 C   r9   r&   r:   r;   r"   r"   r#   r=      r>   zJBIG2StreamWriter.__init__TrH   fix_last_pagec           	      C   s   d}d }d }|D ]8}|  |}| j| |t|7 }ttt |d }|r@tt|d}tt|d d t	kr<d }q|r@|}q|rb|rb|d urb| 
|d |}|  |}| j| |t|7 }|S )Nr   r   r   r   rV   r   )encode_segmentr8   writerC   r   r	   r4   rF   rp   SEG_TYPE_END_OF_PAGEget_eop_segment)	r<   rH   r   data_lenZcurrent_pagerj   rI   dataZseg_pager"   r"   r#   write_segments   s.   

z JBIG2StreamWriter.write_segmentsc                 C   s   t }t}|td|7 }tdd}||7 }| j| t|}|| ||7 }d}|D ]	}tt|d }q*|r9d}	nd}	| 	||	 }
| 
|
}| j| |t|7 }|S )Nr   r   r   r   r      )FILE_HEADER_IDFILE_HEAD_FLAG_SEQUENTIALr   r8   r   rC   r   r   r4   get_eof_segmentr   )r<   rH   r   headerZheader_flagsZnumber_of_pagesr   rj   rI   Zseg_num_offsetZeof_segmentr   r"   r"   r#   
write_file   s&   

zJBIG2StreamWriter.write_filerI   c                 C   sV   d}t D ]$\}}||}t| d| d }t|r|||}nt||}||7 }q|S )NrO   z	encode_%s)rA   rF   rD   rE   r   )r<   rI   r   rJ   rK   r   encoderrL   r"   r"   r#   r     s   


z JBIG2StreamWriter.encode_segmentr   c                 C   sr   d}| dr|tO }d|v r||d rtn|O }n|tt| dddkr(tn|O }|tt|d O }td|S )Nr   rT   rU   ro      rV   r   )rF   rW   rX   r   r4   r0   rY   r   )r<   r   rI   r   r"   r"   r#   encode_flags  s   

zJBIG2StreamWriter.encode_flagsc                 C   st  g }d}|d }t |tsJ ttt |dg }|dkr:tt|}t|D ]\}}	|	r3|d|> O }q'|	| nHt
|d d }
dd|
  }tttd	> }|	| t|
D ](}d
}||d |d d  }t|D ]\}}||rxd|> n|O }qm|	| qYttt |dg }tt|d }|dkrd}n	|dkrd}nd}|D ]}||7 }|	| qt|g|R  S )Nr   r`   ra      r   r]   r   B   r   rb   r   r^   r_   IL)rh   r4   r   r   r!   rF   r0   rc   	enumeraterG   rf   rg   rd   r,   r   )r<   r   rI   r   Zflags_formatr`   ra   Z
flags_byterl   Z
ref_retainZbytes_countZflags_dwordZ
byte_indexri   Zret_partr   Zret_segrb   rj   rk   rm   r"   r"   r#   encode_retention_flags   sB   

z(JBIG2StreamWriter.encode_retention_flagsc                 C   s    t d|}|tt|d 7 }|S )Nr   rs   )r   r   r}   )r<   r   rI   r   r"   r"   r#   encode_data_lengthM  s   
z$JBIG2StreamWriter.encode_data_length
seg_numberpage_numberc                 C   s   ddt d||dtjdS Nr   F)rT   rV   rO   )r   r   r   r   rs   r   )r   r   r   )r<   r   r   r"   r"   r#   r   R     z!JBIG2StreamWriter.get_eop_segmentc                 C   s   ddt d|ddtjdS r   )SEG_TYPE_END_OF_FILEr   r   )r<   r   r"   r"   r#   r   \  r   z!JBIG2StreamWriter.get_eof_segment)T)rx   ry   rz   r{   r   r   r4   r!   r   r~   __annotations__r   r=   r   r|   r   r   r}   r   rp   r   r   r   r   r   r"   r"   r"   r#   r      sF   
 
"

-
r   )*rf   rR   structr   r   r   typingr   r   r   r   r	   r
   r   r   rA   rW   rX   rY   rc   re   rd   ru   rt   r   r   r   r   r4   r!   r$   r'   r/   r0   strr}   r6   rp   r~   r|   r7   r   r"   r"   r"   r#   <module>   s:    (	l