a
    V$c/u                     @   sr  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m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mZmZm Z m!Z!m"Z" da#dd	 Z$d
d Z%dd Z&dd Z'G dd dej(j)Z*G dd de(Z+G dd deZ,G dd dej-j.e,Z/e0 Z1e0 Z2e0 Z3e0 Z4e0 Z5eddfddZ6dd Z7dd Z8e6de9d  e6d!e9d" e6d#ed e6d$e d e6d%eefd e6d&eefd e6d'eeeefd e6d(ed e6d)ed e6d*e9d  e6d+e:d, e6d-ed e6d.eefd e6d/e!d e6d0e!d e6d1e;e;fd e6d2e"d3dd4 e6d5ed e6d6ed e6d7ed e6d8e9d e6d9e:d, e6d:eddd4 e6d;e:d3 e6d<e:d3 e6d=e9d" e6d>e9d  e6d?edd@d4 e6dAed  e6dBe9d  e6dCe d e6dDedd@d4 e6dEed e6dFe;dG e6dHe9d" e6dIe9d  e6dJedd@d4 e6dKed  e6dLe9d  e6dMe d e6dNedd@d4 e6dOed e6dPe;dG e6dQe9d" e6dRe9d  e6dSe:d3 e8dT e8dU e8dV e8dW e8dX e8dY e8dZ e8d[ e8d\ e9e9fe9e9feefe9eefe;e;feefe9e;e;fe9eeefeefe9ed]Z<ej-j=>e< e<D ]Z?e@e,e?e+e? qVdS )^    )divisionabsolute_importwith_statementprint_functionunicode_literals)PY2
basestringbchrbordchropenpystrrangeroundstrtobytesunicode)AnyN)	Containertransform_render)position
any_objectbool_or_nonefloat_or_nonematrixmeshc                   C   s"   t d u rtjj a t tjj_ t S N)nullrenpydisplaylayoutNullmotion r$   r$   renpy/display\transform.pyget_null)   s    
r&   c                 C   sL   | | }|| }t ||}t || t j d }|dk rD|d7 }||fS )z>
    Converts cartesian coordinates to polar coordinates.
       r   ih  )mathhypotatan2pi)xyxaroundyarounddxdyradiusangler$   r$   r%   cartesian_to_polar5   s    r4   c                 C   sT   | t j d } |t |  }| t |  }t||| }t||| }||fS )z?
    Converts polart coordinates to cartesian coordinates.
    r'   )r(   r+   sincostype)r3   r2   r.   r/   r0   r1   r,   r-   r$   r$   r%   polar_to_cartesianF   s    r8   c                  G   s"   | D ]}|dur|  S q| d S )z`
    Returns the first argument that is not None, or the last argument if
    all are None.
    Nr$   )argsir$   r$   r%   first_not_noneV   s    
r<   c                   @   s  e Zd ZdZdZdd Zdd Zdd ZdDd
dZdd Z	dd Z
ee	e
Zdd Zdd ZeeeZdd Zdd Zdd ZeeeZeeeZdd Zdd Zdd Zd d! ZeeeZeeeZd"d# Zd$d% ZeeeZd&d' Zd(d) ZeeeZ d*d+ Z!d,d- Z"ee!e"Z#d.d/ Z$d0d1 Z%ee$e%Z&d2d3 Z'd4d5 Z(ee'e(Z)d6d7 Z*ee'e*Z+d8d9 Z,d:d; Z-d<d= Z.d>d? Z/ee-e,Z0ee/e.Z1d@dA Z2dBdC Z3ee2e3Z4dS )ETransformStateNTc                 C   s"   d | _ d | _d | _d | _d | _d S r   )inherited_xposinherited_yposinherited_xanchorinherited_yanchor
last_angleselfr$   r$   r%   __init__h   s
    
zTransformState.__init__c                 C   s   | j }tD ]}t||||< q
|j| _|j| _| jd u rPd | _d | _d | _d | _	|
 \| _| _| _| _}}}|j| _|j| _|j| _d S r   )__dict__all_propertiesgetattrrB   last_eventsperspectivexposyposxanchoryanchorget_placementr>   r?   r@   rA   xoffsetyoffsetsubpixel)rD   tsdk_r$   r$   r%   
take_statez   s*    

zTransformState.take_statec                 C   s   i }t D ],}t||}t| |}||kr||f||< qtD ]X}t||}t| |}|d u rht|d| }|d u r~t| d| }||kr:||f||< q:|S )N
inherited_)diff2_propertiesrH   diff4_properties)rD   newtsrvpropnewoldr$   r$   r%   diff   s     



zTransformState.diffr   c                 C   sd   | j d urdddd||dfS t| j| jt| j| jt| j| jt| j| j	| j
| | j| | jfS )Nr   F)rJ   r<   rK   r>   rL   r?   rM   r@   rN   rA   rP   rQ   rR   )rD   cxoffsetcyoffsetr$   r$   r%   rO      s"    
zTransformState.get_placementc                 C   s   | j S r   rK   rC   r$   r$   r%   
get_xalign   s    zTransformState.get_xalignc                 C   s   || _ || _d S r   rK   rM   rD   vr$   r$   r%   
set_xalign   s    zTransformState.set_xalignc                 C   s   | j S r   rL   rC   r$   r$   r%   
get_yalign   s    zTransformState.get_yalignc                 C   s   || _ || _d S r   rL   rN   rf   r$   r$   r%   
set_yalign   s    zTransformState.set_yalignc                 C   s   | j | jfS r   )r.   r/   rC   r$   r$   r%   
get_around   s    zTransformState.get_aroundc                 C   s   |\| _ | _d\| _| _d S N)NNr.   r/   xanchoraroundyanchoraroundrD   valuer$   r$   r%   
set_around   s    zTransformState.set_aroundc                 C   s   |\| _ | _|\| _| _d S r   ro   rr   r$   r$   r%   set_alignaround   s    zTransformState.set_alignaroundc                 C   s:   t | j| jd}t | j| jd}t||| j| j\}}|S Nr   r<   rK   r>   rL   r?   r4   r.   r/   )rD   rK   rL   r3   _radiusr$   r$   r%   	get_angle   s    zTransformState.get_anglec                 C   s:   t | j| jd}t | j| jd}t||| j| j\}}|S rv   rw   )rD   rK   rL   _angler2   r$   r$   r%   
get_radius   s    zTransformState.get_radiusc                 C   sx   t | j| jd}t | j| jd}t||| j| j\}}|}t||| j| j\| _| _| j	rtt||| j| j\| _
| _d S rv   r<   rK   r>   rL   r?   r4   r.   r/   r8   rp   rM   rN   )rD   rs   rK   rL   rz   r2   r3   r$   r$   r%   	set_angle   s    zTransformState.set_anglec                 C   sx   t | j| jd}t | j| jd}t||| j| j\}}|}t||| j| j\| _| _| j	rtt||| j| j\| _
| _d S rv   r|   )rD   rs   rK   rL   r3   rx   r2   r$   r$   r%   
set_radius  s    zTransformState.set_radiusc                 C   s   | j | jfS r   rK   rL   rC   r$   r$   r%   get_pos  s    zTransformState.get_posc                 C   s   |\| _ | _d S r   r   rr   r$   r$   r%   set_pos  s    zTransformState.set_posc                 C   s   | j | jfS r   rM   rN   rC   r$   r$   r%   
get_anchor  s    zTransformState.get_anchorc                 C   s   |\| _ | _d S r   r   rr   r$   r$   r%   
set_anchor  s    zTransformState.set_anchorc                 C   s   | j | jfS r   r   rC   r$   r$   r%   	get_align   s    zTransformState.get_alignc                 C   s   |\| _ | _|\| _| _d S r   )rM   rN   rK   rL   rr   r$   r$   r%   	set_align#  s    zTransformState.set_alignc                 C   s   | j | jfS r   rP   rQ   rC   r$   r$   r%   
get_offset)  s    zTransformState.get_offsetc                 C   s   |\| _ | _d S r   r   rr   r$   r$   r%   
set_offset,  s    zTransformState.set_offsetc                 C   s   | j | jfS r   xsizeysizerC   r$   r$   r%   
get_xysize1  s    zTransformState.get_xysizec                 C   s   |d u rd}|\| _ | _d S rn   r   rr   r$   r$   r%   
set_xysize4  s    zTransformState.set_xysizec                 C   s(   |d u rd | _ ntdd |D | _ d S )Nc                 s   s$   | ]}t |trt|n|V  qd S r   )
isinstancefloatint).0r,   r$   r$   r%   	<genexpr>?      z*TransformState.set_size.<locals>.<genexpr>)xysizetuplerr   r$   r$   r%   set_size;  s    zTransformState.set_sizec                 C   s   || _ d| _d S Ng      ?re   rr   r$   r$   r%   set_xcenterC  s    zTransformState.set_xcenterc                 C   s   | j S r   rc   rC   r$   r$   r%   get_xcenterG  s    zTransformState.get_xcenterc                 C   s   || _ d| _d S r   rk   rr   r$   r$   r%   set_ycenterJ  s    zTransformState.set_ycenterc                 C   s   | j S r   ri   rC   r$   r$   r%   get_ycenterN  s    zTransformState.get_ycenterc                 C   s   | j | jfS r   xcenterycenterrC   r$   r$   r%   get_xycenterT  s    zTransformState.get_xycenterc                 C   s   |d u rd}|\| _ | _d S rn   r   rr   r$   r$   r%   set_xycenterW  s    zTransformState.set_xycenter)r   r   )5__name__
__module____qualname__rB   rI   rE   rW   r`   rO   rd   rh   propertyxalignrj   rl   yalignrm   rt   ru   aroundalignaroundry   r{   r}   r~   r3   r2   r   r   posr   r   anchorr   r   alignr   r   offsetr   r   r   r   sizer   r   r   r   r   r   r   r   xycenterr$   r$   r$   r%   r=   c   sb   !
















r=   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	ProxyzE
    This class proxies a field from the transform to its state.
    c                 C   s
   || _ d S r   name)rD   r   r$   r$   r%   rE   d  s    zProxy.__init__c                 C   s   t |j| jS r   )rH   stater   )rD   instanceownerr$   r$   r%   __get__g  s    zProxy.__get__c                 C   s   t |j| j|S r   )setattrr   r   )rD   r   rs   r$   r$   r%   __set__j  s    zProxy.__set__N)r   r   r   __doc__rE   r   r   r$   r$   r$   r%   r   _  s   r   c                
       s  e Zd ZdZdZdZdd Zi i i i i i i i i d	ZdZg Z	eZ
dZd5 fdd	Zdd Zdd Z fddZdd Zdd Zdd Zdd Zdd Zdd Zd6dd Zd!d" Zd#d$ Zd%d& Zd7d'd(Zd)d* Zd+d, Zd-d. ZdZd/d0 Zd1d2 Z d3d4 Z!  Z"S )8	TransformzB
    Documented in sphinx, because we can't scan this object.
       Tc                 C   s   |dk rd| _ t | _| jpd| j_| jp,d| j_| jp:d| j_| jpHd| j_| j| j_| j| j_| j	| j_	| j
| j_
| j| j_d| _d| _|dk rd| _d| _|dk rd| _d| _d| _|dk rd| _|d	k rd| _d| _d S )
N   Fr   T         	transformr   )activer=   r   rK   rL   rM   rN   alpharotatezoomxzoomyzoomhide_requesthide_responsestat	st_offset	at_offsetchild_st_base	style_argreplaced_requestreplaced_response)rD   versionr$   r$   r%   after_upgradev  s4    




zTransform.after_upgrade)	selected_activateselected_hoverselected_idleselected_insensitiveactivatehoveridleinsensitive Fr   r   Ndefaultc                    s  || _ || _tt| j|||||d || _tj|}|d urJ| 	| t
 | _|r$i | _| D ]\}	}
d}|	}|tjjv r|r|tjv r|| jvri | j|< |
| j| |< qf|d\}}}|std|	 |r|d | }qv|}qvqfd| jv r*| jd  D ]\}	}
t| j|	|
 qnd | _d | _d | _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _ d| _!d S )	N)stylefocusr   _argsaltr   rV   zUnknown transform property: %rFTr   r   )"kwargsr   superr   rE   functionr   easydisplayable_or_noneaddr=   r   	argumentsitemsatl
PROPERTIESDEFAULT_ARGUMENTS	partition	Exceptionr   forwardreverser   r   r   r   r   r   r   r   r   r   
child_sizerender_size)rD   childr   r   r   r   r   r   r   rU   rg   prefixr]   
new_prefixrV   	__class__r$   r%   rE     sT    


zTransform.__init__c                 C   s   | j d u rg S | j gS d S r   )r   rC   r$   r$   r%   visit  s    
zTransform.visitc                 C   s   | j d u rd S | jjd}g }|rB|d| |d\}}}q |dd |D ]:}| j |d }|d u rnqR| D ]\}	}
t||	|
 qvqRd S )NrV   r   r   )	r   r   r   stripinsertr   getr   r   )rD   r   r   r   r   prefixesrV   r;   rT   rU   rg   r$   r$   r%   default_function  s    
zTransform.default_functionc                    s0   | j d ur| j | || _tt| | d S r   )r   set_transform_eventlast_child_transform_eventr   r   rD   eventr   r$   r%   r   )  s    
zTransform.set_transform_eventc                 C   sz   | |u rdS t |tsdS | j|j t | jtrNt |jtrN| j|j | jdu rv|jdurv| |j |j| _dS )zP
        Takes the transformation state from object t into this object.
        N)r   r   r   rW   r   r   r   rD   tr$   r$   r%   rW   0  s    
zTransform.take_statec                 C   s   | |u rdS t |tsdS |j| _|j| _|jj| j_|jj| j_|jj| j_|jj| j_|j	| _	t | j
trt |j
tr| j
|j
 dS )z
        Takes the execution state from object t into this object. This is
        overridden by renpy.atl.TransformBase.
        N)r   r   r   r   r   rK   rL   rM   rN   r   r   take_execution_stater  r$   r$   r%   r  G  s    
zTransform.take_execution_statec                 C   s4   |  }i |_ ||  ||  | j|_| j|_|S )z1
        Makes a copy of this transform.
        )r   rW   r  r   r   )rD   rT   r$   r$   r%   copy`  s    

zTransform.copyc                 C   s(   |   }| jd ur$|| j| |S r   )r  r   	set_child_change_transform_childrD   r   r\   r$   r$   r%   r  n  s    
z!Transform._change_transform_childc                 C   s:   |dkr| j sdS | jd ur dS | jr6| j|r6dS dS )NreplacedTF)r   r   r   _handles_eventr   r$   r$   r%   r
  v  s    
zTransform._handles_eventc                 C   sr  || j  | jkr| j| | _ || j | jkr8| j| | _|| j   | _}|| j  | _}| jsf|   | jspd S | js| js| 	 }n| }| j |_ | j|_t
| tr| jd ur| jn| j |_|dkrd|_nd|_d|_d|_|jd ur|||| nt
|tr|||| |j|| j  || j  |}|d urJ||_d|_d|_|jrZ|jsntjj|d |S d S )NhideTFr   )r   r   r   r   r   update_stater   r   r   r  r   ATLTransformatl_st_offsetr   r   r   execute_hider   r    renderredraw)rD   r   r   kindrT   	new_childr$   r$   r%   r    sF    



zTransform._hidec                 C   s`   t j|}|r0|jr0|| j}| js0|  || _|g| _| j	| _
|  t jj|  d S r   )r   r   displayable_duplicatable
_duplicater   _uniquer   childrenr   r   per_interactr    r  
invalidate)rD   r   	duplicater$   r$   r%   r    s    
zTransform.set_childc                 C   s   d| _ d| _| jdur(| | | j| j | jdur\| | | j| j}|dur\tjj	
| | d| _| jj| jjkr| jjrtjjd | jj| j_dS zE
        This updates the state to that at self.st, self.at.
        TNr   )r   r   r   r   r   r   r   r   r    r  r  r   r   rI   eventsgame	interfacetimeoutrD   frr$   r$   r%   r    s    

zTransform.update_statec                 C   s   t | ||||S r   r   )rD   widthheightr   r   r$   r$   r%   r    s    zTransform.renderc                 C   s   | j r
d S | jjsd S | j}| j}|s*d S tt| jd ddD ]Z}|| }|| \}	}
||	 }||
 }| j||\}}|	||||}|d ur@|  S q@d S )Nr   r9   )
r   r   r  r  offsetsr   lenr   r   r  )rD   evr,   r-   r   r  r&  r;   rT   xoyocxcyr\   r$   r$   r%   r    s$    
zTransform.eventc                 C   sP   |d u r| j }t|ddr$||}tf || j| j|d| j}||  |S )Nr  F)r   r   r   r   )r   rH   r  r   r   r   r   rW   )rD   r   rW   r   r\   r$   r$   r%   __call__  s    

zTransform.__call__c                 C   s$   | j r | jd ur| j  d| _ d S )NF)r  r   r  rC   r$   r$   r%   r    s    

zTransform._uniquec                 C   s  | j s|   | jd ur| j \}}}}}}}| j}tjjr|d urL||_|d urZ||_	|d urh||_
|d urv||_| j|O  _nd}d}|pd}|pd}| j||}	| jjr|	\}
}}}}}}|d ur|d ur| j\}}| j\}}|jtu r||9 }|jtu r||9 }||d 8 }||d 8 }| j||\}}||d 7 }||d 7 }tjj|}tjj|}|
||||||f}	|	S )Nr   g       @)r   r  r   rO   r   r   configtransform_uses_child_positionr>   r@   r?   rA   rR   transform_anchorr   r   r   r   r   r   r    coreabsolute)rD   cxposcyposcxanchorcyanchorra   rb   	csubpixelr   r\   rK   rL   rM   rN   rP   rQ   rR   cwchrwrhr$   r$   r%   rO   '  sL    



zTransform.get_placementc                 C   s   t jj|  dS )z
        This should be called when a transform property field is updated outside
        of the callback method, to ensure that the change takes effect.
        N)r   r    r  r  rC   r$   r$   r%   updated  s    zTransform.updatec                 C   s4   |r|j r|  | js| S | |d}||  |S )N)r   )r:   
extraneousr  r  )rD   r:   r\   r$   r$   r%   r  n  s    


zTransform._duplicatec                 C   sH   | j d u r| S | j  }|| j u r&| S |  }||  ||_ |  |S r   )r   _in_current_storer  r  r  r$   r$   r%   r>  {  s    



zTransform._in_current_storec                 C   s
   t | jS r   )reprr   rC   r$   r$   r%   
_repr_info  s    zTransform._repr_info)NNr   NFNN)T)NTN)#r   r   r   r   __version__transform_event_responderr   r   r   r  r   r   rE   r   r   r   rW   r  r  r  r
  r  r  r  r  r  r-  r  rO   r<  r  r  r>  r@  __classcell__r$   r$   r   r%   r   n  s^   $       [7

=r   c                   @   s,   e Zd Zdi dfddZdd Zdd ZdS )r  Nc                 K   s6   t jj| ||| tj| fd|i| | j| _d S )Nr   )r   r   ATLTransformBaserE   r   r   	raw_child)rD   r   r   context
parameters
propertiesr$   r$   r%   rE     s    zATLTransform.__init__c                 C   sr   d| _ d| _| | | j| j}|dur6tjj| | d| _	| j
j| j
jkrn| j
jrbtjjd | j
j| j
_dS r  )r   r   r  r   r   r   r    r  r  r   r   rI   r  r  r   r!  r"  r$   r$   r%   r    s    zATLTransform.update_statec                 C   s   t | j| jjfS r   )r?  r   r   locrC   r$   r$   r%   r@    s    zATLTransform._repr_info)r   r   r   rE   r  r@  r$   r$   r$   r%   r    s   r  r   c                 C   sh   | t v rdS t |  tt| | tt| t|  |tjj| < |dkrRt	|  n|dkrdt
|  dS )z
    Adds an ATL property.
    Nr   r   )rG   r   r   r=   r   r   r   r   r   rY   rZ   )r   r   r   r`   r$   r$   r%   add_property  s    
rJ  c                 C   s:   |  dsdS | tjjjv r dS t| dd t|  dS )z:
    Adds a uniform with `name` to Transform and ATL.
    u_Nr   r`   )
startswithr   gl2gl2drawstandard_uniformsrJ  uniformsr   r   r$   r$   r%   add_uniform  s    
rR  c                 C   s   t | dd t|  dS )z>
    Adds a GL property with `name` to Transform and ATL.
    NrL  )rJ  gl_propertiesr   r   r$   r$   r%   add_gl_property  s    rT  additiveg        r   g      ?blendblurcorner1corner2cropcrop_relativedebugdelayr  Tfitmatrixanchormatrixcolormatrixtransformmaxsizer   FrL  mesh_padnearestrJ   r   
rotate_padshaderrR   r0  r   rp   rM   r   r.   rP   xpanrK   r   xtiler   r   rq   rN   r/   rQ   ypanrL   r   ytiler   zposzzoomgl_anisotropicgl_blend_funcgl_color_maskgl_depthgl_drawable_resolution	gl_mipmapgl_pixel_perfectgl_texture_scalinggl_texture_wrap)r   r   r   r3   r   r   r   r2   r   r   r   r   r   r   r   )A
__future__r   r   r   r   r   renpy.compatr   r   r	   r
   r   r   r   r   r   r   r   r   typingr   r(   typesr   renpy.display.layoutr   renpy.display.acceleratorr   	renpy.atlr   r   r   r   r   r   r   r&   r4   r8   r<   objectObjectr=   r   r   r   rD  r  setrG   rY   rZ   rQ  rS  rJ  rR  rT  r   boolr   ALIASESr   r<  r   r   r$   r$   r$   r%   <module>   s   8  }    $$
