#include <stdlib.h>
#include <jni.h>
#include <jawt.h>
#include <jawt_md.h>
#include "classpath_jawt.h"
static jint (JNICALL _Jv_Lock) (JAWT_DrawingSurface* surface);
static void (JNICALL _Jv_Unlock) (JAWT_DrawingSurface* surface);
static JAWT_DrawingSurfaceInfo* (JNICALL _Jv_GetDrawingSurfaceInfo)
(JAWT_DrawingSurface* surface);
static void (JNICALL _Jv_FreeDrawingSurfaceInfo)
(JAWT_DrawingSurfaceInfo* surface_info);
static JAWT_DrawingSurface* (JNICALL _Jv_GetDrawingSurface) (JNIEnv* env,
jobject canvas);
static void (JNICALL _Jv_FreeDrawingSurface) (JAWT_DrawingSurface* surface);
static void (JNICALL _Jv_AWTLock) (JNIEnv*);
static void (JNICALL _Jv_AWTUnlock) (JNIEnv*);
JNIEXPORT jboolean JNICALL
JAWT_GetAWT (JNIEnv* env, JAWT* awt)
{
jint retrieved_version;
retrieved_version = classpath_jawt_get_awt_version ();
if (awt->version > retrieved_version)
return JNI_FALSE;
awt->GetDrawingSurface = _Jv_GetDrawingSurface;
awt->FreeDrawingSurface = _Jv_FreeDrawingSurface;
awt->Lock = _Jv_AWTLock;
awt->Unlock = _Jv_AWTUnlock;
return JNI_TRUE;
}
static jint
(JNICALL _Jv_Lock) (JAWT_DrawingSurface* surface)
{
return classpath_jawt_object_lock (surface->lock);
}
static void
(JNICALL _Jv_Unlock) (JAWT_DrawingSurface* surface)
{
classpath_jawt_object_unlock (surface->lock);
}
static JAWT_DrawingSurfaceInfo*
(JNICALL _Jv_GetDrawingSurfaceInfo) (JAWT_DrawingSurface* surface)
{
if (surface == NULL)
return NULL;
return surface->surface_info;
}
static void
(JNICALL _Jv_FreeDrawingSurfaceInfo) (JAWT_DrawingSurfaceInfo* surface_info)
{
JAWT_X11DrawingSurfaceInfo* surface_info_x11;
if (surface_info == NULL)
return;
surface_info_x11 = (JAWT_X11DrawingSurfaceInfo*) surface_info->platformInfo;
surface_info_x11->display = NULL;
surface_info_x11->drawable = 0;
surface_info_x11->visualID = 0;
free (surface_info->platformInfo);
free (surface_info);
surface_info = NULL;
}
static JAWT_DrawingSurface*
(JNICALL _Jv_GetDrawingSurface) (JNIEnv* env, jobject canvas)
{
JAWT_DrawingSurface* surface;
JAWT_X11DrawingSurfaceInfo* surface_info_x11;
surface = (JAWT_DrawingSurface*) malloc (sizeof (JAWT_DrawingSurface));
if (surface == NULL)
return NULL;
surface->GetDrawingSurfaceInfo = _Jv_GetDrawingSurfaceInfo;
surface->FreeDrawingSurfaceInfo = _Jv_FreeDrawingSurfaceInfo;
surface->Lock = _Jv_Lock;
surface->Unlock = _Jv_Unlock;
surface->surface_info = (JAWT_DrawingSurfaceInfo*) malloc (sizeof (JAWT_DrawingSurfaceInfo));
surface->lock = classpath_jawt_create_lock ();
if (surface->surface_info == NULL)
return NULL;
surface->surface_info->platformInfo = malloc (sizeof (JAWT_X11DrawingSurfaceInfo));
if (surface->surface_info->platformInfo == NULL)
return NULL;
surface_info_x11 = (JAWT_X11DrawingSurfaceInfo*) surface->surface_info->platformInfo;
surface_info_x11->display = classpath_jawt_get_default_display (env, canvas);
surface_info_x11->drawable = classpath_jawt_get_drawable (env, canvas);
surface_info_x11->visualID = classpath_jawt_get_visualID (env, canvas);
return surface;
}
static void
(JNICALL _Jv_FreeDrawingSurface) (JAWT_DrawingSurface* surface)
{
classpath_jawt_destroy_lock (surface->lock);
free (surface);
}
static void
(JNICALL _Jv_AWTLock) (JNIEnv* env)
{
classpath_jawt_lock ();
}
static void
(JNICALL _Jv_AWTUnlock) (JNIEnv* env)
{
classpath_jawt_unlock ();
}