B
    |b3                 @   s   d Z ddlZddlZddlZddlmZmZ ddlmZm	Z	m
Z
 ddlmZmZ ddlmZ dZG d	d
 d
eejZG dd deZdS )zc:mod:`wand.sequence` --- Sequences
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. versionadded:: 0.3.0

    N   )	libmagicklibrary)abcbinaryxrange)	BaseImageImageProperty)MAGICK_VERSION_INFO)SequenceSingleImagec                   s   e Zd ZdZ fddZedd Zejdd Zej	dd Z
d	d
 Zdd Zd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  ZS )!r   zThe list-like object that contains every :class:`SingleImage`
    in the :class:`~wand.image.Image` container.  It implements
    :class:`collections.abc.Sequence` protocol.

    .. versionadded:: 0.3.0

    c                s   t t| | g | _d S )N)superr   __init__	instances)selfimage)	__class__ P/home/ankuromar296_gmail_com/.local/lib/python3.7/site-packages/wand/sequence.pyr      s    zSequence.__init__c             C   s   t | jjS )z(:class:`numbers.Integral`) The current index of
        its internal iterator.

        .. note::

           It's only for internal use.

        )r   MagickGetIteratorIndexr   wand)r   r   r   r   current_index    s    
zSequence.current_indexc             C   s   t | jj| d S )N)r   MagickSetIteratorIndexr   r   )r   indexr   r   r   r   ,   s    c             c   s&   |  |}| j}|| _|V  || _dS )zScoped setter of :attr:`current_index`.  Should be
        used for :keyword:`with` statement e.g.::

            with image.sequence.index_context(3):
                print(image.size)

        .. note::

           It's only for internal use.

        N)validate_positionr   )r   r   tmp_idxr   r   r   index_context0   s
    
zSequence.index_contextc             C   s   t | jjS )N)r   ZMagickGetNumberImagesr   r   )r   r   r   r   __len__C   s    zSequence.__len__c             C   sZ   t |tjstdt| t| }||ks6|| k rFtd|||dk rV||7 }|S )Nzindex must be integer, not zout of index: {0} (total: {1})r   )
isinstancenumbersIntegral	TypeErrorreprlen
IndexErrorformat)r   r   lengthr   r   r   r   F   s    zSequence.validate_positionFc             C   s   |j d ks|j dkstdt| }|jd kr4d}n|jdk rJ||j }n|j}t||}|jd krjd}n|jdk r||j }n|j}t||p|}|rt||S t||d S )Nr   z slicing with step is unsupportedr   )step
ValueErrorr#   startminstopr   slice)r   slice_as_ranger&   r)   r+   r   r   r   validate_sliceR   s     




zSequence.validate_slicec                s&  t |tr0 |} fddt|j|jD S  |} j}t|}||k rv|| }|d k	rt	|dd d k	r|S n$|| d }|
dd t|D   jj}t|}t|| t|}	t }
t|	tt||
}t|
 t|}t|}t|| t| j|	}| j|< |S )Nc                s   g | ]} | qS r   r   ).0i)r   r   r   
<listcomp>i   s    z(Sequence.__getitem__.<locals>.<listcomp>
c_resourcer   c             s   s   | ]
}d V  qd S )Nr   )r0   _r   r   r   	<genexpr>t   s    z'Sequence.__getitem__.<locals>.<genexpr>)r   r,   r/   r   r)   r+   r   r   r#   getattrextendr   r   r   r   r   GetImageFromMagickWandr   ZAcquireExceptionInfoZCloneImagesr   strZDestroyExceptionInfoZNewMagickWandFromImageZDestroyImager   )r   r   r-   r   Zinstances_lengthinstanceZnumber_to_extendr   r   r   excZsingle_imageZsingle_wandr   )r   r   __getitem__f   s4    








zSequence.__getitem__c          	   C   s   t |tr8| j}| |}| |= | j||jd || _nt |tsRtdt| | 	|V}t
| jjrt
| jj|j t
| jj n t
| jj t
| jj|j W d Q R X d S )N)offsetz7image must be an instance of wand.image.BaseImage, not )r   r,   r   r/   r7   r)   r   r!   r"   r   r   ZMagickHasNextImager   r   MagickAddImageMagickRemoveImage)r   r   r   r   r-   r   r   r   __setitem__   s    


zSequence.__setitem__c          	   C   sp   t |tr2| j|dd}xRt|D ]
}| |= q"W n:| |*}t| jj |t	| j
k rb| j
|= W d Q R X d S )NT)r.   )r   r,   r/   reversedr   r   r?   r   r   r#   r   )r   r   Zrange_r1   r   r   r   __delitem__   s    
zSequence.__delitem__c          	   C   s2  y|  |}W n tk
r*   t| }Y nX t|tsFtdt| | s^t| j	j
|j
 n|dkr| j}| j	j
}|jd j
}zbtdkrt| t|| n>d| _t|| j	jd j
 d| _t|| d| _t| W d || _X n2| |d  t| j	j
|jd j
 W d Q R X | j|d  d S )Nz7image must be an instance of wand.image.BaseImage, not r   )      rC   r   r   )r   r$   r#   r   r   r!   r"   r   r>   r   r   r   sequencer
   ZMagickSetFirstIteratorr?   r   r   insert)r   r   r   r   Z	self_wandr   r   r   r   rF      s8    


"zSequence.insertc             C   sd   t |tstdt| | jj}| j}z"t| t	||j
d j W d || _X | jd  d S )Nz7image must be an instance of wand.image.BaseImage, not r   )r   r   r!   r"   r   r   r   r   MagickSetLastIteratorr>   rE   r   append)r   r   r   r   r   r   r   rH      s    

zSequence.appendNc       	      C   sJ  | j }| jj}d}z|d kr,t| jj n2|dkrTt|}| dt| |d7 }|d | _ t|t	| rt
||jj t|}ntdkrdnd}xp|D ]h}t|tstdt| qt
||jd j g | _|d krt| jj n|  j |7  _ |d7 }qW W d || _ X d g| }|d kr8|| j|d < n|| j||< d S )Nr   r   )rC   rD   rC   r      zCimages must consist of only instances of wand.image.BaseImage, not )r   r   r   r   rG   iterrF   nextr   typer>   r#   r
   r   r!   r"   rE   r   )	r   Zimagesr=   r   r   r&   deltar   Z	null_listr   r   r   r7      s>    





zSequence.extendc             C   sf   t | jj t | jjd}t }t |t|}|r^|j	r^t
||j	}t |}|S d S d S )Nr   )r   MagickResetIteratorr   r   ZMagickAppendImagesctypesc_size_tZMagickGetImagesBlobbyrefvalue	string_atZMagickRelinquishMemory)r   Z	repr_wandr&   Zblob_pblobr   r   r   
_repr_png_   s    

zSequence._repr_png_)F)N)__name__
__module____qualname____doc__r   propertyr   setter
contextlibcontextmanagerr   r   r   r/   r<   r@   rB   rF   rH   r7   rU   __classcell__r   r   )r   r   r      s   
$
(r   c                   sr   e Zd ZdZdZ fddZedd Zedd Zed	d
 Z	e	j
dd
 Z	dd Z fddZdd Z  ZS )r   aX  Each single image in :class:`~wand.image.Image` container.
    For example, it can be a frame of GIF animation.

    Note that all changes on single images are invisible to their
    containers unless they are altered a ``with ...`` context manager.

        with Image(filename='animation.gif') as container:
            with container.sequence[0] as frame:
                frame.negate()

    .. versionadded:: 0.3.0

    .. versionchanged:: 0.5.1
       Only sync changes of a :class:`SingleImage` when exiting a ``with ...``
       context. Not when parent :class:`~wand.image.Image` closes.
    Nc                s&   t t| | || _|| _d | _d S )N)r   r   r   	containerc_original_resource_delay)r   r   r_   r`   )r   r   r   r     s    zSingleImage.__init__c             C   s   | fS )Nr   )r   r   r   r   rE   #  s    zSingleImage.sequencec             C   s`   | j j}t| t|}d}x$| j|krD|rDt|}|d7 }q"W |sNt| j|ks\t|S )zk(:class:`numbers.Integral`) The index of the single image in
        the :attr:`container` image.

        r   r   )	r_   r   r   rN   r8   r`   r   ZGetNextImageInListAssertionError)r   r   r   r1   r   r   r   r   '  s    


zSingleImage.indexc          	   C   s>   | j dkr8| j}|j| j t|j| _ W dQ R X | j S )z(:class:`numbers.Integral`) The delay to pause before display
        the next image (in the :attr:`~wand.image.BaseImage.sequence` of
        its :attr:`container`).  It's hundredths of a second.

        N)ra   r_   rE   r   r   r   ZMagickGetImageDelayr   )r   r_   r   r   r   delay8  s
    
zSingleImage.delayc          	   C   sf   t |tjstdt| n|dk r.td| j}|j| j	 t
|j| W d Q R X || _d S )Nzdelay must be an integer, not r   zdelay cannot be less than zero)r   r   r    r!   r"   r(   r_   rE   r   r   r   ZMagickSetImageDelayr   ra   )r   rc   r_   r   r   r   rc   E  s    c             C   s   | j r| | jj| j< d| _ dS )zIf instances was flagged as :attr:`dirty` by any manipulation
        methods, then this instance will overwrite :attr:`container` internal
        version at :attr:`index`.

        .. versionadded:: 0.5.1
        FN)Zdirtyr_   rE   r   )r   r   r   r   _sync_container_sequenceP  s    z$SingleImage._sync_container_sequencec                s    |    tt| ||| d S )N)rd   r   r   __exit__)r   type_rR   	traceback)r   r   r   re   [  s    zSingleImage.__exit__c             C   sL   t | }t| dd d kr(d|j|jS d|j|j| jd d | j| jS )Nr3   z<{0}.{1}: (closed)>z<{0}.{1}: {2} ({3}x{4})>rD   )rL   r6   r%   rW   rV   	signaturewidthheight)r   clsr   r   r   __repr___  s    zSingleImage.__repr__)rV   rW   rX   rY   r_   r   rZ   rE   r   rc   r[   rd   re   rl   r^   r   r   )r   r   r     s   r   )rY   r\   rO   r   apir   r   compatr   r   r   r   r   r	   versionr
   __all__MutableSequencer   r   r   r   r   r   <module>   s    v