U
    :vhc                     @   s>  d dl Z d dlZd dlZd dlZd dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlZzRd dlmZmZ d dlmZ zd d	lmZ ejZW n ek
r   ejZY nX W n ek
r   dZY nX d
dlmZ d
dlmZmZmZ d
dlmZ eG dd dZ e!e"Z#dZ$e  Z%d dddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dddddddddddddddddd
ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd ddddddddd	d
ddddg Z&dZ'dZ(dZ)d@Z*d3edddZ+dd Z,dd Z-dd Z.dd Z/dd Z0d4dd Z1G d!d" d"Z2d#d$ Z3d%d& Z4d5d'd(Z5d)d* Z6d+d, Z7d-d. Z8d6d/d0Z9d1d2 Z:dS (7      N)	dataclass)BytesIO)ceil)urlopen)Path)ImageTiffImagePlugin)ImageCms)
Resampling   )FPDFException)
ImageCacheRasterImageInfoVectorImageInfo)	SVGObjectc                   @   s   e Zd ZU dZeed< dS )ImageSettingscompression_levelN)__name__
__module____qualname__r   int__annotations__ r   r   6/tmp/pip-unpacked-wheel-dvf6lv8i/fpdf/image_parsing.pyr      s   
r   )AUTOFlateDecode	DCTDecode	JPXDecode	LZWDecode   @             `            P      0      p            H      (      h            X      8      x            D      $      d            T      4      t            L      ,      l            \      <      |            B      "      b            R      2      r      
      J      *      j            Z      :      z            F      &      f            V      6      v            N      .      n            ^      >      ~         A      !      a            Q      1      q      	      I      )      i            Y      9      y            E      %      e            U      5      u            M      -      m            ]      =      }            C      #      c            S      3      s            K      +      k            [      ;      {            G      '      g            W      7      w            O      /      o            _      ?               i  image_cachec           
   
   C   s,  t |drZzt|tt || dW S  tk
rX } ztd| |W 5 d}~X Y nX t|trt|	 rt|t
|| dS t|t
jrt| 	 rtd|| dS t|t rd}nt|tj r| }tjddd}|| | | }}njt|tt
jfrXt|t
jr$| n|}|	 }tjddd}|| | | }}nt || }}| j|}|r|d	  d
7  < nt||| j|}t| jd
 |d< d
|d	< d|d< |d}|rtd| || jkr| j| |d< nt| j}	|	| j|< |	|d< d|d< || j|< |||fS )ab  
    Read an image and load it into memory.

    For raster images: following this call, the image is inserted in `image_cache.images`,
    and following calls to `FPDF.image()` will re-use the same cached values, without re-reading the image.

    For vector images: the data is loaded and the metadata extracted.

    Args:
        image_cache: an `ImageCache` instance, usually the `.image_cache` attribute of a `FPDF` instance.
        name: either a string representing a file path to an image, an URL to an image,
            an io.BytesIO, or a instance of `PIL.Image.Image`.
        dims (Tuple[float]): optional dimensions as a tuple (width, height) to resize the image
            (raster only) before storing it in the PDF.

    Returns: A tuple, consisting of 3 values: the name, the image data,
        and an instance of a subclass of `ImageInfo`.
    z.svgr  zCould not parse file: NZvector_imagemd5F)Zusedforsecurityusagesr   iiccp_iiccpzHICC profile found for image %s - It will be inserted in the PDF document)strendswithget_svg_info
load_image	Exception
ValueError
isinstancebytes_is_svgstripior   getvaluer   tobyteshashlibnewupdate	hexdigestZimagesgetget_img_infoimage_filterlenLOGGERdebugZicc_profiles)
r   namedimserrorimgbytes_Zimg_hashinfor%  r$  r   r   r   preload_imageK   sX    "






rC  c                 C   s   |  dp|  dS )Ns   <?xml s   <svg )
startswith)rA  r   r   r   r.     s    r.  c              
   C   s   t | tr| S t | tr t| } | drTt| }t| W  5 Q R  S Q R X n| drft| S t| d}t| W  5 Q R  S Q R X dS )z
    This method is used to load external resources, such as images.
    It is automatically called when resource added to document by `fpdf.FPDF.image()`.
    It always return a BytesIO buffer.
    )zhttp://zhttps://zdata:rbN)	r,  r   r   r&  rD  r   read_decode_base64_imageopen)filenameZurl_file
local_filer   r   r   r)     s    



 
r)  c                 C   s8   |  d}t|dkrtd|d }t|}t|S )z7Decode the base 64 image string into an io byte stream.zbase64,r_   z!Unsupported non-base64 image datar   )splitr:  NotImplementedErrorbase64	b64decoder   )Zbase64ImageZfragsZ	imageDataZdecodedDatar   r   r   rG     s    

rG  c                 C   sb   zt t| }W n$ t jk
r6   td| Y dS X |jj }|dkr^td|| dS dS )z%Checks the validity of an ICC profilezInvalid ICC Profile in file %sF)ZGRAYRGBzEUnsupported color space %s in ICC Profile of file %s - cf. issue #711T)	r	   ZgetOpenProfiler   Z
PyCMSErrorr;  rB  profileZxcolor_spacer/  )r%  rI  rP  Zcolor_spacer   r   r   is_iccp_valid   s    rQ  c                 C   s^   t | |d}|jr&|j\}}}}nd }}|jr:|j}|jrF|j}t|||d}| ||fS )Nr  g        )datawh)r   r1  viewboxwidthheightr   )rI  r@  r   svg_rS  rT  rB  r   r   r   r(     s    r(  r   c                 C   sB  t dkrtdd}d}d}d}|r2t|ttfrJt| }t |}d}n:t|t j st|t}t|trrt|n|}t |}d}d}|r|j	|t
d}d}|dkr|jdkrd}n |jd	krtt jd
rd}nd}|jdkr|dkr|d}|jdkr|d}d}|jdkr.|dkr.|d}n |jdkrN|dkrN|d}|j\}	}
t }d}d|jkrt|jd | r|jd }|dk	r|s|jdkrJ|dkrJ|jdkrd\}}}nD|jdkrd\}}}d}n(|jdkrd\}}}ntd|j |d || |	|
||||||d| d|	 d
 |S |jd kr|dkr|jd! d"krt|jtj d#krt|jtj d#kr|jtj }d}|dkrd}n|d#krtd$| t|\}}|| ||}|jtj }|dksb|d#krnJ|d%krTt!|}t"|D ]\}}t#| ||< q2t|}ntd&| d'\}}}|||	|
d|||||d(t| $  d|	 d)|
 d*
 |S d}|jd	krd'\}}}t%|||d+< n |jdkr d\}}}t%|||d+< n|jdkr`d\}}}t&d#dd%}t%|||d,|d+< t'||r|d-krt%|||d.|d/< nx|jd0krd1\}}}t%|||d+< |j(j(|d2< |jd3ddk	r|d-krt%|d|t&d4dd5d.|d/< n|jd6kr<d1\}}}|j(j(|d2< t&d#dd%}t%|||d,|d+< t'||r|d-krt%|||d.|d/< n|jdkrbd\}}}t%|||d+< nv|jdkrd\}}}t%|||d+< nPd\}}}t&d4dd5}t%|||d,|d+< t'||r|d-krt%|||d.|d/< d| d|	 }|jd	krd7|	 d)|
 }|s |rd|_)n|*  ||	|
|||||||d8	 |S )9z
    Args:
        filename: in a format that can be passed to load_image
        img: optional `bytes`, `BytesIO` or `PIL.Image.Image` instance
        image_filter (str): one of the SUPPORTED_IMAGE_FILTERS
    Nz1Pillow not available - fpdf2 cannot insert imagesTF)Zresampler   JPEGr   1Zlibtiff_support_custom_tagsCCITTFaxDecoder   )PPARGBA)r[  LLArO  r_  r]  r^  CMYK)r]  r_  r   rO  ra  r`  Zicc_profile)rO  r_  )r   r/   Z	DeviceRGBrb  )r?   r/   Z
DeviceCMYK)r   r/   
DeviceGrayzUnsupported image mode: r   z/Predictor 15 /Colors z
 /Columns )
rR  rS  rT  csr%  dpnbpcfinverteddpTIFFcompressiongroup4r   z4unsupported photometric interpretation for g4 tiff: r_   zunsupported FillOrder: )r   r   rc  z
/BlackIs1 z /K -1 /Rows )
rR  rS  rT  r%  re  rd  rf  rg  rh  ri  rR  )remove_slice)r   r   )select_sliceZsmaskr]  )r   r/   ZIndexedZpalZtransparencyr   r?   r^  z/BlackIs1 true /Columns )	rS  rT  rd  r%  rf  re  rg  rh  ri  )+r   EnvironmentErrorr,  r   r&  r)  rH  r   r-  resizeRESAMPLEformatmodehasattrcoreconvertsizer   rB  rQ  r+  seekr5  rF  r:  tag_v2r   STRIPOFFSETSSTRIPBYTECOUNTSZPHOTOMETRIC_INTERPRETATIONccitt_payload_location_from_pilr7  Z	FILLORDER	bytearray	enumerateTIFFBitRevTablelower_to_dataslice
_has_alphaZpalettefpclose)rI  r@  r9  r>  Z
is_pil_imgZkeep_bytes_io_openZjpeg_invertedZimg_raw_dataZimg_alteredrS  rT  rB  r%  re  rf  ZcolspaceZphotorh  offsetlengthZccittrawdataZ	fillorderr#  nalpha_channelri  r   r   r   r8     sV   





















  




r8  c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )		temp_attrzM
    temporary change the attribute of an object using a context manager
    c                 C   s   || _ || _|| _d S N)objfieldvalue)selfr  r  r  r   r   r   __init__  s    ztemp_attr.__init__c                 C   s@   d| _ t| j| jr*d| _ t| j| j| _t| j| j| j d S )NFT)existsrt  r  r  getattr	old_valuesetattrr  )r  r   r   r   	__enter__  s
    ztemp_attr.__enter__c                 C   s,   | j rt| j| j| j nt| j| j d S r  )r  r  r  r  r  delattr)r  exctypeexcinstexctbr   r   r   __exit__  s    ztemp_attr.__exit__N)r   r   r   __doc__r  r  r  r   r   r   r   r    s   r  c                 C   sN   | j tj }| j tj }t|dks0t|dkr8td|| \}\}||fS )z[
    returns the byte offset and length of the CCITT payload in the original TIFF data
    r   z;Transcoding multiple strips not supported by the PDF format)ry  r   rz  r{  r:  rL  )r@  Zstrip_offsetsZstrip_bytesr  r  r   r   r   r|    s    r|  c              	      s   t  }t j j  } jd d d  jd  ttdrlttd |j	|ddd W 5 Q R X nBtj
j fd	d
}ttj
d| |j	|ddd W 5 Q R X |d t|}t|\}}|| ||S )zN
    Convert the open PIL.Image imgdata to compressed CCITT Group4 data.

    r   r   r/   r   Z
STRIP_SIZErj  rl  )rr  rk  c                    s2   t j jd t jgt jdgi}||| |S )Nr   r   )r   ZROWSPERSTRIPrw  r{  rz  r7  )r  tagZ	overridesr@  Zpillow__getitem__Ztmp_strip_sizer   r   __getitem__  s       z)transcode_monochrome.<locals>.__getitem__r  )r   r   Z	frombytesrs  rw  r2  rt  r   r  saveZImageFileDirectory_v2r  rx  rH  r|  rF  )r@  ZnewimgioZimg2r  Znewimgr  r  r   r  r   transcode_monochrome  s&    
  


r  c                 C   s  t |  }|r||= |r"|| }| jdkr@t| jd d }n*t|| jd | jd   }| jd | }t  }tdt||D ]$}|d |||||   q|}tg}t	 \}	}
}}d}|D ]}|t
|g }||	kr|}q||	|  |
dt> d kr@|
|	|< |
d7 }
|
|krX|tk rX|d7 }d|> d }n|t t	 \}	}
}}t
|g}q|rx||	|  |t t|S )Nr[  r   r/   r           )r}  r2  rs  r   rw  r:  rangeextendLZW_CLEAR_TABLE_MARKERclear_tabler-  appendLZW_MAX_BITS_PER_CODELZW_EOD_MARKERpack_codes_into_bytes)r@  rm  rn  rR  row_sizechannels_countdata_with_paddingr#  Zresult_codestable	next_codebits_per_codemax_code_valueZcurrent_sequencebyteZnext_sequencer   r   r   _to_lzwdata  sF    



r  c           	      C   s   t  \}}}}d}d}t }| D ]}||> |B }||7 }|dkr\|d8 }|||? d@  q8|tkrtt  \}}}}q |tkr |d7 }||kr |tk r |d7 }d|> d }q |dkr||d| > d@  t|S )z
    Convert the list of result codes into a continuous byte stream, with codes packed as per the code bit-width.
    The bit-width starts at 9 bits and expands as needed.

    r   r/   r  r   )r  r}  r  r  r  r  r-  )	codesrY  r  r  r  bufferZbits_in_bufferoutputcoder   r   r   r  X  s2    r  c                  C   s6   dd t dD } td }t}d|> d }| |||fS )zK
    Reset the encoding table and coding state to initial conditions.

    c                 S   s   i | ]}t |g|qS r   )r-  ).0r#  r   r   r   
<dictcomp>  s      zclear_table.<locals>.<dictcomp>r  r   )r  r  LZW_INITIAL_BITS_PER_CODE)r  r  r  r  r   r   r   r    s
    r  c                 K   s   |dkrt | f|S |dkr$t| S |dkr8t| f|S | jdkrL| d} | jdkr`| d} |dkrt }| j|d	d
 | S |dkrt }| j|dd
 | S td| dd S )Nr   r\  r   ra  r`  r_  rO  r   rZ  )rr  r   ZJPEG2000zUnsupported image filter: "")		_to_zdatar  r  rs  rv  r   r  r1  r   )r@  r9  kwargsZcompressed_bytesr   r   r   r    s&    



r  c                 C   s   t |  }|r||= |r"|| }| jdkr@t| jd d }n*t|| jd | jd   }| jd | }t  }tdt||D ]$}|d |||||   qtj	|t
jdS )Nr[  r   r/   r   r  )level)r}  r2  rs  r   rw  r:  r  r  zlibcompressSETTINGSr   )r@  rm  rn  rR  r  r  r  r#  r   r   r   r    s    

r  c                 C   s"   t |  | }tdd |D S )Nc                 s   s   | ]}|d kV  qdS )r  Nr   )r  cr   r   r   	<genexpr>  s     z_has_alpha.<locals>.<genexpr>)r}  r2  any)r@  r  alphar   r   r   r    s    r  )N)Nr   N)NN)NN);rM  r3  r0  r  dataclassesr   r   mathr   urllib.requestr   pathlibr   loggingZPILr   r   r	   Z	PIL.Imager
   ZLANCZOSrq  ImportErrorZ	ANTIALIASerrorsr   Zimage_datastructuresr   r   r   rX  r   r   	getLoggerr   r;  ZSUPPORTED_IMAGE_FILTERSr  r  r  r  r  r  rC  r.  r)  rG  rQ  r(  r8  r  r|  r  r  r  r  r  r  r  r   r   r   r   <module>   s\   


                                                                                                                                                                                                                                      G
 a5<'