o
    
zi,                     @   s^  d dl Z d dlZd dlmZ d dlmZmZmZ d dlm	Z	m
Z
mZ d dl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B f Z%e$e!ee&e B e&e B f Z'e$e!eeB e"B e%B e'B f Z(G d$d% d%Z)G d&d' d'Z*dS )(    N)Iterable)calcsizepackunpack)BinaryIOClassVarcast)PDFValueError))>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   M/home/air/biblejyuku/back/venv/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   s0   t dD ]}t|| r|| @ |?   S qtdN   zInvalid mask or valueranger!   r	   r%   r   r   r   r   r    masked_value0   s
   
r+   c                 C   s4   t dD ]}t|| r|| |? @ |>   S qtdr&   r(   r*   r   r   r    
mask_value8   s
   
r,   formatbufferc                 C   s&   | dv sJ t tt t| |\}|S )N>   r   >Ir
   )r   tupleintr   )r-   r.   resultr   r   r    
unpack_int@   s   r3   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#   r5   selfr5   r   r   r    __init__Q      
zJBIG2StreamReader.__init__c           	      C   s   g }|   sOi }tD ]6\}}t|}| j|}t||k r$d|d<  nt||}t| d| d }t|r<||||}|||< q
|	dsK|
| |   r|S )NT_errorparse_)is_eof
SEG_STRUCTr   r5   readlenr3   getattrcallablegetappend)	r9   segmentssegmentfield_formatname	field_lenfieldr   parserr   r   r    get_segmentsT   s$   



zJBIG2StreamReader.get_segmentsc                 C   s(   | j ddkr
dS | j dtj dS )Nr       TF)r5   r@   seekosSEEK_CUR)r9   r   r   r    r>   h   s   zJBIG2StreamReader.is_eofrG   r   rK   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)r9   rG   r   rK   r   r   r    parse_flagso   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
|d d }t|D ]}	td| jd}
tdD ]
}|t||
 qKq<|d }t|tsbJ |d	krid}n	|d
krpd}nd}t|}t|D ]}| j|}t||}|| qz|||dS )N      r
   r      r   r   r         r/   )	ref_countretain_segmentsref_segments)r+   REF_COUNT_SHORT_MASKREF_COUNT_LONGr)   rE   r!   r5   r@   r3   REF_COUNT_LONG_MASKmathceil
isinstancer1   r   )r9   rG   r   rK   r_   r`   ra   r   ret_bytes_count_ret_byte_indexret_byteseg_num
ref_formatref_size
_ref_indexref_datarefr   r   r    parse_retention_flags{   s@   



z'JBIG2StreamReader.parse_retention_flagspagec                 C   s0   t t|d d r|| jd7 }td|}|S )Nr   rT   r[   r
   )r   JBIG2SegmentFlagsr5   r@   r3   )r9   rG   rr   rK   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   rU   z:Working with unknown segment length is not implemented yetraw_data)r   rs   SEG_TYPE_IMMEDIATE_GEN_REGIONDATA_LEN_UNKNOWNNotImplementedErrorr5   r@   )r9   rG   ru   rK   r   r   r    parse_data_length   s   z#JBIG2StreamReader.parse_data_length)__name__
__module____qualname____doc__r   r:   listJBIG2SegmentrM   r   r>   r1   bytesrs   rY   JBIG2RetentionFlagsrq   rt   rz   r   r   r   r    r4   N   sB    

-r4   c                   @   s  e Zd ZU dZdeee g eee g dZe	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_   ra   r`   EMPTY_RETENTION_FLAGSr5   r   Nc                 C   r6   r#   r7   r8   r   r   r    r:      r;   zJBIG2StreamWriter.__init__TrF   fix_last_pagec           	      C   s   d}d }d }|D ]8}|  |}| j| |t|7 }ttd B |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   rU   r   )
encode_segmentr5   writerA   r   r1   rD   rs   SEG_TYPE_END_OF_PAGEget_eop_segment)	r9   rF   r   data_lencurrent_pagerk   rG   data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*|r8dnd}	| 	||	 }
| 
|
}| j| |t|7 }|S )Nr   r
   r   r   r      )FILE_HEADER_IDFILE_HEAD_FLAG_SEQUENTIALr   r5   r   rA   r   r   r1   get_eof_segmentr   )r9   rF   r   headerheader_flagsnumber_of_pagesr   rk   rG   seg_num_offseteof_segmentr   r   r   r    
write_file   s"   

zJBIG2StreamWriter.write_filerG   c                 C   sX   d}t D ]%\}}||}t| d| d }t|r |||}nt||}||7 }q|S )NrN   encode_)r?   rD   rB   rC   r   )r9   rG   r   rH   rI   r   encoderrK   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   rS   rT   rr      rU   r   )rD   rV   rW   r   r1   r,   rX   r   )r9   r   rG   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_   r`      r   r\   r
   B   r   ra   r   r]   r^   IL)rg   r1   r   r   r   rD   r,   rb   	enumeraterE   re   rf   rc   r)   r   )r9   r   rG   r   flags_formatr_   r`   
flags_byte	ref_index
ref_retainbytes_countflags_dword
byte_indexrj   ret_partr   ret_segra   rk   rl   rp   r   r   r    encode_retention_flags-  sB   

z(JBIG2StreamWriter.encode_retention_flagsc                 C   s    t d|}|tt|d 7 }|S )Nr
   rv   )r   r   r   )r9   r   rG   r   r   r   r    encode_data_length\  s   
z$JBIG2StreamWriter.encode_data_length
seg_numberpage_numberc                 C   s   ddt d||dtjdS Nr   F)rS   rU   rN   )r   r   r   r   rv   r   )r   r   r   )r9   r   r   r   r   r    r   a     z!JBIG2StreamWriter.get_eop_segmentc                 C   s   ddt d|ddtjdS r   )SEG_TYPE_END_OF_FILEr   r   )r9   r   r   r   r    r   k  r   z!JBIG2StreamWriter.get_eof_segment)T)r{   r|   r}   r~   r   r   r1   r   r   r   r   __annotations__r   r:   r   r   r   r   r   r   rs   r   r   r   r   r   r   r   r   r    r      sF   
 
&

/
r   )+re   rQ   collections.abcr   structr   r   r   typingr   r   r   pdfminer.pdfexceptionsr	   r?   rV   rW   rX   rb   rd   rc   rx   rw   r   r   r   r   r1   r   r!   r$   r+   r,   strr   r3   dictrs   r   r   r   r4   r   r   r   r   r    <module>   sB    	t