a
    ij?                     @   s   d Z ddlZddlmZ ddlmZ ddlZddlZddlm	Z	 ddlm
Z
mZ eeZG dd deZG d	d
 d
eZeffddZG dd deZG dd deZG dd deZdS )z(Base class for platform implementations
    N)ctypesloader)as_8_bit)_configflags)logsMODULE_ANNOTATIONSc                   @   s   e Zd Zdd Zdd ZdS )lazy_propertyc                 C   s
   || _ d S N)fget)selffunction r   Z/home/ghrups/robot-bench/.venv/lib/python3.9/site-packages/OpenGL/platform/baseplatform.py__init__   s    zlazy_property.__init__c                 C   s   |  |}t|| j j| |S r   )r	   setattr__name__)r
   objclsvaluer   r   r   __get__   s    
zlazy_property.__get__N)r   
__module____qualname__r   r   r   r   r   r   r      s   r   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )_CheckContextc                 C   s   || _ || _d S r   func	ccisvalid)r
   r   r   r   r   r   r      s    z_CheckContext.__init__c                 C   s$   |dvrt | j||S || j|< d S )Nr   )r   r   __dict__)r
   keyr   r   r   r   __setattr__   s    z_CheckContext.__setattr__c                 C   s$   t | jdd r| jjS t| jS d S )N__doc__)getattrr   r   reprr
   r   r   r   __repr__#   s    z_CheckContext.__repr__c                 C   s    |dkrt | j|S t|d S )Nr   )r   r   AttributeError)r
   r   r   r   r   __getattr__)   s    z_CheckContext.__getattr__c                 O   s6   |   s&ddlm} || jj||| j|i |S Nr   error)r   OpenGLr'   Z	NoContextr   r   r
   argsnamedr'   r   r   r   __call__.   s    z_CheckContext.__call__N)r   r   r   r   r   r"   r$   r,   r   r   r   r   r      s
   r   c                 C   sJ   t  }|rFd|jv rF| r4|jd | vr>|jd S n
|jd S |j}qd S )Nr   )sys	_getframe	f_globalsf_back)excludeframer   r   r   _find_module6   s    
r3   c                	   @   s   e Zd ZdZg dZdZdZdZdd Zdd Z	d$d	d
Z
dd Zdd Zdd Zejddddddddf	ddZejdddddddfddZdd ZeZdd Zejddddddddf	ddZdd Zdd Zed d! Zed"d# ZdS )%BasePlatforma  Base class for per-platform implementations

    Attributes of note:

        EXPORTED_NAMES -- set of names exported via the platform
            module's namespace...

        GL, GLU, GLUT, GLE, GLES1, GLES2, GLES3 -- ctypes libraries

        DEFAULT_FUNCTION_TYPE -- used as the default function
            type for functions unless overridden on a per-DLL
            basis with a "FunctionType" member

        GLUT_GUARD_CALLBACKS -- if True, the GLUT wrappers
            will provide guarding wrappers to prevent GLUT
            errors with uninitialised GLUT.

        EXTENSIONS_USE_BASE_FUNCTIONS -- if True, uses regular
            dll attribute-based lookup to retrieve extension
            function pointers.
    )GetCurrentContextCurrentContextIsValidcreateBaseFunctioncreateExtensionFunctioncopyBaseFunctiongetGLUTFontPointernullFunctionGLUT_GUARD_CALLBACKSNFc                 C   s(   | j D ]}t| |d||< q| |d< | S )z7Install this platform instance into the platform moduleNPLATFORM)EXPORTED_NAMESr   )r
   	namespacenamer   r   r   installi   s    
zBasePlatform.installc                 C   s   t |dr|jS | jS dS )z3Given a DLL, determine appropriate function type...FunctionTypeN)hasattrrB   DEFAULT_FUNCTION_TYPE)r
   dllr   r   r   functionTypeForp   s    
zBasePlatform.functionTypeForc                 C   s"   ddl m} |rtjr|j|_|S )z1Add error checking to the function if appropriater   r&   )r(   r'   r   ZERROR_CHECKINGZglCheckErrorerrcheck)r
   r   rE   error_checkerr'   r   r   r   errorCheckingw   s    
zBasePlatform.errorCheckingc                 C   s6   t jr2|| ju r2|jdvr2|jds2t|| jS |S )z2Wrap function with context-checking if appropriate)ZglGetStringZglGetStringiZglGetIntegervZglX)r   ZCONTEXT_CHECKINGGLr   
startswithr   r6   )r
   r   rE   r   r   r   wrapContextCheck   s    	
zBasePlatform.wrapContextCheckc                 C   s   t |t dS )z4Wrap function with logging operations if appropriatezOpenGL.errors)r   Z	logOnFailZgetLog)r
   r   r   r   r   wrapLogging   s    zBasePlatform.wrapLoggingc                 C   s2   |t dkr*t|dds*ddlm} |S |S dS )z"Retrieve a final type for arg-typeNfinalFr   )ArrayDatatype)ctypesZPOINTERr   ZOpenGL.arraysrO   )r
   typrO   r   r   r   finalArgType   s    zBasePlatform.finalArgTyper   c              	      s  | p| dd dk}|s. |s.td fdd|D }|
sN|s js t|}|r| ||g|R  |}qtd||f n t ||g|R  ||}||_	t
|pd|_||_||_||_||_   j|||d	|}tr|	s
t }	|	r|	|_|S )
zzCore operation to create a new base ctypes function

        raises AttributeError if can't find the procedure...
        _   VERSIONzExtension not availablec                    s   g | ]}  |qS r   )rR   ).0tr!   r   r   
<listcomp>       z2BasePlatform.constructFunction.<locals>.<listcomp>z6Extension %r available, but no pointer for function %rr   )rH   )splitcheckExtensionr#   EXTENSIONS_USE_BASE_FUNCTIONSZgetExtensionProcedurer   rF   r   ZbuildFunctionr   listargNamesr   DLL	extension
deprecatedrM   rL   rI   r   r3   r   )r
   functionNamerE   
resultTypeargTypesdocr^   r`   ra   moduleforce_extensionrH   Zis_coreZpointerr   r   r!   r   constructFunction   sP    zBasePlatform.constructFunctionc                 C   s   ddl m} d}zPtjrD|| ju rD|rD| j|||||||||
d	}n| j||||||||
d}W n> ty } z&| j||||||||
d}W Y d}~n
d}~0 0 tr|	st	 }	|	r|	|_
|S )a   Create a base function for given name

        Normally you can just use the dll.name hook to get the object,
        but we want to be able to create different bindings for the
        same function, so we do the work manually here to produce a
        base function from a DLL.
        r   )wrapperN)rE   rc   rd   re   r^   r`   ra   rH   )rc   rd   re   r^   r`   rH   )rE   rc   rd   re   r^   r`   rH   )r(   ri   r   ZFORWARD_COMPATIBLE_ONLYrJ   r;   rh   r#   r   r3   r   )r
   rb   rE   rc   rd   re   r^   r`   ra   rf   rH   ri   resulterrr   r   r   r7      sT    


zBasePlatform.createBaseFunctionc                 C   s   |sdS |   }|rddlm} |jd|d}|du rLi }|jd||dd ||}|du rdd	lm} |j|}|||< |S |S dd	lm} |j|S dS )
zACheck whether the given extension is supported by current contextTr   )contextdata
extensions)contextNF)rn   Zweak)rm   )	r5   r(   rl   ZgetValueZsetValuegetrm   ZExtensionQuerierZhasExtension)r
   r@   rn   rl   setcurrentrm   rj   r   r   r   r[     s$    
zBasePlatform.checkExtensionc                 C   s   ddl m}m} t|trH| j|j|j|j|j	|j
|j|j|j|jd	S t|drX|j}| j|j|j|j|j	|j
|j|j|j|jd	S )zCreate a new base function based on an already-created function

        This is normally used to provide type-specific convenience versions of
        a definition created by the automated generator.
        r   )ri   r'   )rc   rd   re   r^   r`   ra   rH   originalFunction)r(   ri   r'   
isinstance_NullFunctionPointerr;   r   r_   restypeargtypesr   r^   r`   ra   rH   rC   rr   r7   rG   )r
   originalri   r'   r   r   r   r9   <  s4    

zBasePlatform.copyBaseFunctionc                 C   sT   |r
t }nt}t||f||d}tr:|	s0t }	|	r:|	|_|||||||||
|d	S )z#Construct a "null" function pointer)r   ra   )r`   re   rH   rg   )_DeprecatedFunctionPointerrt   typer   r3   r   )r
   rb   rE   rc   rd   re   r^   r`   ra   rf   rH   rg   baser   r   r   r   r;   ^  s4    zBasePlatform.nullFunctionc                 C   s   t ddS )z/Retrieve opaque pointer for the current contextz5Platform does not define a GetCurrentContext functionNNotImplementedErrorr!   r   r   r   r5     s    zBasePlatform.GetCurrentContextc                 C   s   t ddS )z.Retrieve a GLUT font pointer for this platformz7Platform does not define a GLUT font retrieval functionNr{   )r
   Zconstantr   r   r   r:     s    zBasePlatform.getGLUTFontPointerc                 C   s   | j S r   )r5   r!   r   r   r   r6     s    z"BasePlatform.CurrentContextIsValidc                 C   s   | j S r   )rJ   r!   r   r   r   r(     s    zBasePlatform.OpenGL)N)r   r   r   r   r>   rD   r<   r\   rA   rF   rI   rL   rM   rR   rP   Zc_intrh   r7   r[   r8   r9   r;   r5   r:   r   r6   r(   r   r   r   r   r4   C   sb   

@
A&
,
r4   c                   @   s:   e Zd ZdZdddZdZdd ZeZdd	 Zd
d Z	dS )rt   z4Function-pointer-like object for undefined functionsNFc                 C   sR   ddl m} || _|| _|| _|| _d | _|| _|| _|| _	|| _
|	| _|
| _d S r%   )r(   r'   r   r_   r^   rv   rG   ru   r`   re   ra   rH   rg   )r
   r@   rE   rc   rd   r^   r`   re   ra   rH   rg   r'   r   r   r   r     s    z_NullFunctionPointer.__init__c                 C   s    | j s| js| jr|   | j S )z"Make this object appear to be NULL)resolvedr`   rg   loadr!   r   r   r   __nonzero__  s    z _NullFunctionPointer.__nonzero__c                 C   s   zddl m} W n" ty2   tr,td Y dS 0 z4|jj| j| j| j	| j
| j| j| j| j| jd	}W n& ty } zW Y d}~dS d}~0 0 t|j| j_d| _|S dS )zGAttempt to load the function again, presumably with a context this timer   )platformz/Platform import failed (likely during shutdown)N)rc   rd   re   r^   r`   rH   rg   T)r(   r   ImportErrorloginfor=   rh   r   r_   ru   rv   re   r^   r`   rH   rg   r#   staticmethodr,   	__class__r}   )r
   r   r   rk   r   r   r   r~     s0    

z_NullFunctionPointer.loadc              
   O   sf   |   r| |i |S zddlm} W n$ tyJ } zW Y d }~n d }~0 0 |d| j| jf d S )Nr   r&   zKAttempt to call an undefined function %s, check for bool(%s) before calling)r~   r(   r'   r   NullFunctionErrorr   )r
   r*   r+   r'   rk   r   r   r   r,     s    z_NullFunctionPointer.__call__)NNFNN)
r   r   r   r   r   r}   r   __bool__r~   r,   r   r   r   r   rt     s   	     
rt   c                   @   s   e Zd ZdZdd ZdS )rx   Tc                 O   s"   ddl m} |d| jf d S )Nr   r&   zAttempt to call a deprecated function %s while OpenGL in FORWARD_COMPATIBLE_ONLY mode.  Set OpenGL.FORWARD_COMPATIBLE_ONLY to False to use legacy entry points)r(   r'   r   r   r)   r   r   r   r,     s    z#_DeprecatedFunctionPointer.__call__N)r   r   r   ra   r,   r   r   r   r   rx     s   rx   )r   rP   ZOpenGL.platformr   ZOpenGL._bytesr   r-   loggingr(   r   r   r   	getLoggerr   r   objectr   r   r3   r4   rt   rx   r   r   r   r   <module>   s   

  _X