o
    °e,  ã                   @   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"   ú>D:\Projects\ConvertPro\env\Lib\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   ó    TéÿÿÿÿF)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r›d}n	|dkr¢d}nd}|D ]}||7 }| 	|¡ q¦t|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