U
    ڲgc                     @  sd   d dl mZ ddlmZ G dd dZG dd dZG dd	 d	ZG d
d dZG dd deZdS )    )annotations   )Imagec                   @  s.   e Zd ZdZdddddZdddd	Zd
S )HDCz
    Wraps an HDC integer. The resulting object can be passed to the
    :py:meth:`~PIL.ImageWin.Dib.draw` and :py:meth:`~PIL.ImageWin.Dib.expose`
    methods.
    intNone)dcreturnc                 C  s
   || _ d S Nr   )selfr    r   0/tmp/pip-unpacked-wheel-xela2va7/PIL/ImageWin.py__init__   s    zHDC.__init__r	   c                 C  s   | j S r
   r   r   r   r   r   __int__"   s    zHDC.__int__N__name__
__module____qualname____doc__r   r   r   r   r   r   r      s   r   c                   @  s.   e Zd ZdZdddddZdddd	Zd
S )HWNDz
    Wraps an HWND integer. The resulting object can be passed to the
    :py:meth:`~PIL.ImageWin.Dib.draw` and :py:meth:`~PIL.ImageWin.Dib.expose`
    methods, instead of a DC.
    r   r   )wndr	   c                 C  s
   || _ d S r
   r   )r   r   r   r   r   r   -   s    zHWND.__init__r   c                 C  s   | j S r
   r   r   r   r   r   r   0   s    zHWND.__int__Nr   r   r   r   r   r   &   s   r   c                   @  sp   e Zd ZdZdddddddZd	d
 ZdddZdd ZdddddddZdddddZ	ddddZ
dS )Diba&  
    A Windows bitmap with the given mode and size.  The mode can be one of "1",
    "L", "P", or "RGB".

    If the display requires a palette, this constructor creates a suitable
    palette and associates it with the image. For an "L" image, 128 graylevels
    are allocated. For an "RGB" image, a 6x6x6 colour cube is used, together
    with 20 graylevels.

    To make sure that palettes work properly under Windows, you must call the
    ``palette`` method upon certain events from Windows.

    :param image: Either a PIL image, or a mode string. If a mode string is
                  used, a size must also be given.  The mode can be one of "1",
                  "L", "P", or "RGB".
    :param size: If the first argument is a mode string, this
                 defines the size of the image.
    NzImage.Image | strz"tuple[int, int] | list[int] | Noner   )imagesizer	   c                 C  sn   t |tr|}d}n|j}|j}|dkr2t|}tj||| _|| _|| _|rjt |tr`t	| 
| d S )N )1LPZRGB)
isinstancestrmoder   r   ZgetmodebasecoreZdisplayr   AssertionErrorpaste)r   r   r   r$   r   r   r   r   H   s    

zDib.__init__c              
   C  sJ   t |tr:| j|}z| j|}W 5 | j|| X n| j|}|S )a   
        Copy the bitmap contents to a device context.

        :param handle: Device context (HDC), cast to a Python integer, or an
                       HDC or HWND instance.  In PythonWin, you can use
                       ``CDC.GetHandleAttrib()`` to get a suitable handle.
        )r"   r   r   getdc	releasedcexpose)r   handler   resultr   r   r   r*   Z   s    
z
Dib.exposec              
   C  s`   |sd| j  }t|trL| j|}z| j|||}W 5 | j|| X n| j|||}|S )am  
        Same as expose, but allows you to specify where to draw the image, and
        what part of it to draw.

        The destination and source areas are given as 4-tuple rectangles. If
        the source is omitted, the entire image is copied. If the source and
        the destination have different sizes, the image is resized as
        necessary.
        )r   r   )r   r"   r   r   r(   r)   draw)r   r+   dstsrcr   r,   r   r   r   r-   l   s    


zDib.drawc              
   C  sJ   t |tr:| j|}z| j|}W 5 | j|| X n| j|}|S )ae  
        Installs the palette associated with the image in the given device
        context.

        This method should be called upon **QUERYNEWPALETTE** and
        **PALETTECHANGED** events from Windows. If this method returns a
        non-zero value, one or more display palette entries were changed, and
        the image should be redrawn.

        :param handle: Device context (HDC), cast to a Python integer, or an
                       HDC or HWND instance.
        :return: A true value if one or more entries were changed (this
                 indicates that the image should be redrawn).
        )r"   r   r   r(   r)   query_palette)r   r+   r,   r   r   r   r0      s    
zDib.query_palettezImage.Imagez tuple[int, int, int, int] | None)imboxr	   c                 C  sH   |   | j|jkr || j}|r6| j|j| n| j|j dS )a  
        Paste a PIL image into the bitmap image.

        :param im: A PIL image.  The size must match the target region.
                   If the mode does not match, the image is converted to the
                   mode of the bitmap image.
        :param box: A 4-tuple defining the left, upper, right, and
                    lower pixel coordinate.  See :ref:`coordinate-system`. If
                    None is given instead of a tuple, all of the image is
                    assumed.
        N)loadr$   convertr   r'   r1   )r   r1   r2   r   r   r   r'      s    z	Dib.pastebytes)bufferr	   c                 C  s   | j | dS )z
        Load display memory contents from byte data.

        :param buffer: A buffer containing display data (usually
                       data returned from :py:func:`~PIL.ImageWin.Dib.tobytes`)
        N)r   	frombytes)r   r6   r   r   r   r7      s    zDib.frombytesr   c                 C  s
   | j  S )zy
        Copy display memory contents to bytes object.

        :return: A bytes object containing display data.
        )r   tobytesr   r   r   r   r8      s    zDib.tobytes)N)N)N)r   r   r   r   r   r*   r-   r0   r'   r7   r8   r   r   r   r   r   4   s    
 	r   c                   @  sj   e Zd ZdZdddddddd	Zd
d Zdd Zdd ZddddZdd Z	dd Z
ddddZdS )Windowz*Create a Window with the given title size.PILNr#   z
int | Noner   )titlewidthheightr	   c                 C  s"   t j|| j|pd|pd| _d S )Nr   )r   r%   Zcreatewindow_Window__dispatcherZhwnd)r   r;   r<   r=   r   r   r   r      s       zWindow.__init__c                 G  s   t | d| | S )NZ
ui_handle_)getattr)r   actionargsr   r   r   Z__dispatcher   s    zWindow.__dispatcherc                 C  s   d S r
   r   r   r   x0y0x1y1r   r   r   ui_handle_clear   s    zWindow.ui_handle_clearc                 C  s   d S r
   r   )r   rC   rD   rE   rF   r   r   r   ui_handle_damage   s    zWindow.ui_handle_damager   c                 C  s   d S r
   r   r   r   r   r   ui_handle_destroy   s    zWindow.ui_handle_destroyc                 C  s   d S r
   r   rB   r   r   r   ui_handle_repair   s    zWindow.ui_handle_repairc                 C  s   d S r
   r   )r   r<   r=   r   r   r   ui_handle_resize   s    zWindow.ui_handle_resizec                 C  s   t j  d S r
   )r   r%   Z	eventloopr   r   r   r   mainloop   s    zWindow.mainloop)r:   NN)r   r   r   r   r   r>   rG   rH   rI   rJ   rK   rL   r   r   r   r   r9      s        r9   c                      s*   e Zd ZdZd fdd	Zdd Z  ZS )ImageWindowz6Create an image window which displays the given image.r:   c                   s8   t |tst|}|| _|j\}}t j|||d d S )N)r<   r=   )r"   r   r   r   superr   )r   r   r;   r<   r=   	__class__r   r   r      s
    

zImageWindow.__init__c                 C  s   | j |||||f d S r
   )r   r-   rB   r   r   r   rJ      s    zImageWindow.ui_handle_repair)r:   )r   r   r   r   r   rJ   __classcell__r   r   rO   r   rM      s   rM   N)	
__future__r   r   r   r   r   r   r9   rM   r   r   r   r   <module>   s     