a
    VŸ$c  ã                   @   sÂ   d dl mZmZ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mZmZmZmZ d dlZd dlZd dlZd dlmZ eƒ ZG dd„ dejjjƒZG dd„ dejjjƒZG d	d
„ d
ej j!ƒZ"dS )é    )ÚdivisionÚabsolute_importÚwith_statementÚprint_functionÚunicode_literals)ÚPY2Ú
basestringÚbchrÚbordÚchrÚopenÚpystrÚrangeÚroundÚstrÚtobytesÚunicodeN)Úrenderc                       s0   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚImageMapCropzD
    This handles the cropping of uncached imagemap components.
    c                    s   t t| ƒ ¡  || _|| _d S ©N)Úsuperr   Ú__init__ÚchildÚrect)Úselfr   r   ©Ú	__class__© úrenpy/display\imagemap.pyr   ,   s    zImageMapCrop.__init__c                 C   s   | j gS r   )r   ©r   r   r   r   Úvisit2   s    zImageMapCrop.visitc                 C   s   t | j||||ƒ}| | j¡S r   )r   r   Ú
subsurfacer   )r   ÚwidthÚheightÚstÚatÚcrr   r   r   r   5   s    zImageMapCrop.render©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r    r   Ú__classcell__r   r   r   r   r   '   s   r   c                       s0   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚImageCacheCropz=
    This handles the cropping of an imagemap component.
    c                    s   t t| ƒ ¡  || _|| _d S r   )r   r-   r   ÚcacheÚindex)r   r.   r/   r   r   r   r   ?   s    zImageCacheCrop.__init__c                 C   s   | j  | j¡S r   )r.   r    r/   r   r   r   r   r    H   s    zImageCacheCrop.visitc                 C   s   | j  | j||||¡S r   )r.   r   r/   )r   r"   r#   r$   r%   r   r   r   r   K   s    zImageCacheCrop.renderr'   r   r   r   r   r-   :   s   	r-   c                   @   sL   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dS )ÚImageMapCachec                 C   sB   t  ¡ | _g | _i | _g | _d | _d | _d | _d | _d}|| _	d S )NF)
ÚhashlibÚmd5Ú	imagerectÚhotspotsÚareasr.   Ú
cache_rectÚcache_widthÚcache_heightÚenable)r   r9   r   r   r   r   Q   s    
zImageMapCache.__init__c                 C   s&   | j d ur| j gS | j| d gS d S )Nr   )r.   r3   )r   r/   r   r   r   r    n   s    
zImageMapCache.visitc                 C   sÈ   t |tjjjƒrtjjr| js(t||ƒS ||f}| j	 
|d ¡}|d urJ|S | j t|jƒ d¡¡ | j t|ƒ d¡¡ t| jƒ}t| |ƒ}| j |¡ || j	|< | j |d d |d d |f¡ |S )Nzutf-8é   é   )Ú
isinstanceÚrenpyÚdisplayÚimÚ	ImageBaseÚconfigÚimagemap_cacher9   r   r4   Úgetr2   ÚupdateÚreprÚidentityÚencodeÚlenr3   r-   Úappendr5   )r   Údr   ÚkeyÚrvr/   r   r   r   Úcropt   s$    ÿþ



"zImageMapCache.cropc                 C   s¸   | j  ¡  | j  ¡  d gt| j ƒ | _| j d d }d}d}d}| j D ]\\}}}|| |krl||7 }d}d}|d |d |d |d f| j|< ||7 }||k rF|}qF|| _|| | _d S )Nr   é   r:   )r5   ÚsortÚreverserH   r6   r7   r8   )r   r"   ÚxÚyÚline_heightÚwÚhÚir   r   r   Úlayout‹   s$    

"zImageMapCache.layoutc                 C   s´   |t v rd S t  |¡ tj |¡r&d S tj |¡}t | j| j	ftj
d¡}t| jƒD ]D\}\}}| j| \}}}	}
tjjj |¡ |¡}| |||f¡ qTtj |tj |¡¡ d S )Né    )ÚcachedÚaddr=   ÚloaderÚloadableÚget_pathÚpygameÚSurfacer7   r8   ÚSRCALPHAÚ	enumerater3   r6   r>   r?   r.   rC   r!   ÚblitÚimageÚsaveÚexportsÚfsencode)r   ÚfilenameÚfnr.   rV   rJ   r   rQ   rR   Ú_wÚ_hÚsurfr   r   r   Úwrite_cache§   s    
zImageMapCache.write_cachec                 C   s(   d}| j D ]}||d  ¡ 7 }q
|d@ S )zU
        Returns a hash of the contents of the image files. (As an integer.)
        r   iÿÿÿ)r3   Úget_hash)r   rL   rV   r   r   r   Úimage_file_hash½   s    
zImageMapCache.image_file_hashc                 C   sœ   | j s
d S d| j ¡ |  ¡ f }tjjjr<tjjjd | }d| }d | _|  ¡  tj	j
r|z|  |¡ W n tyz   Y n0 tj |¡r˜tjj |¡| _d S )Nzim-%s-%x.pngú-zcache/)r5   r2   Ú	hexdigestrn   r=   ÚgameÚpreferencesÚlanguagerW   rA   Ú	developerrl   Ú	Exceptionr[   r\   r>   r?   ÚImager.   )r   rg   r   r   r   ÚfinishÉ   s    
zImageMapCache.finishc                 C   sL   | j d u r.| j| \}}t|||||ƒ |¡S t| j ||||ƒ | j| ¡S r   )r.   r3   r   r!   r6   )r   r/   r"   r#   r$   r%   rJ   r   r   r   r   r   á   s    
zImageMapCache.renderN)r(   r)   r*   r   r    rM   rW   rl   rn   rw   r   r   r   r   r   r0   O   s   r0   )#Ú
__future__r   r   r   r   r   Úrenpy.compatr   r   r	   r
   r   r   r   r   r   r   r   r   r1   Úpygame_sdl2r^   r=   Úrenpy.display.renderr   ÚsetrY   r>   ÚcoreÚDisplayabler   r-   ÚobjectÚObjectr0   r   r   r   r   Ú<module>   s   8