Cloned library of VTK-5.0.0 with extra build files for internal package management.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

252 lines
6.0 KiB

/*=========================================================================
Program: Visualization Toolkit
Module: $RCSfile: vtkJavaAwt.h,v $
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
// for use with JAWT
#include "jawt_md.h"
#define VTK_JAVA_DEBUG
#if defined(_WIN32) || defined(WIN32)
#define WIN32_JAWT_LOCK_HACK
#endif
#if defined(WIN32_JAWT_LOCK_HACK)
#define WJLH_MAX_COUNT (32)
#define WJLH_HASH_FUNC(E,C,H) {\
jclass cls = E->GetObjectClass(C);\
jmethodID mid = E->GetMethodID(cls, "hashCode", "()I");\
H = E->CallIntMethod(C, mid); }
# include "vtkWindows.h"
int WJLH_init_check = 0;
# include <vtkstd/map>
vtkstd::map<int,int> WJLH_lock_map;
#endif
extern "C" JNIEXPORT jint JNICALL
Java_vtk_vtkPanel_RenderCreate(JNIEnv *env, jobject canvas, jobject id0)
{
#if defined(WIN32_JAWT_LOCK_HACK)
int hash;
WJLH_HASH_FUNC(env, canvas, hash);
WJLH_lock_map[hash] = 0;
#endif
JAWT awt;
JAWT_DrawingSurface* ds;
JAWT_DrawingSurfaceInfo* dsi;
jint lock;
// get the render window pointer
vtkRenderWindow *temp0;
temp0 = (vtkRenderWindow *)(vtkJavaGetPointerFromObject(env,id0,(char *) "vtkRenderWindow"));
/* Get the AWT */
awt.version = JAWT_VERSION_1_3;
if (JAWT_GetAWT(env, &awt) == JNI_FALSE)
{
#ifndef VTK_JAVA_DEBUG
printf("AWT Not found\n");
#endif
return 1;
}
/* Get the drawing surface */
ds = awt.GetDrawingSurface(env, canvas);
if (ds == NULL)
{
#ifndef VTK_JAVA_DEBUG
printf("NULL drawing surface\n");
#endif
return 1;
}
/* Lock the drawing surface */
lock = ds->Lock(ds);
if((lock & JAWT_LOCK_ERROR) != 0)
{
#ifndef VTK_JAVA_DEBUG
printf("Error locking surface\n");
#endif
awt.FreeDrawingSurface(ds);
return 1;
}
/* Get the drawing surface info */
dsi = ds->GetDrawingSurfaceInfo(ds);
if (dsi == NULL)
{
printf("Error getting surface info\n");
ds->Unlock(ds);
awt.FreeDrawingSurface(ds);
return 1;
}
// Here is the win32 drawing code
#if defined(_WIN32) || defined(WIN32)
JAWT_Win32DrawingSurfaceInfo* dsi_win;
dsi_win = (JAWT_Win32DrawingSurfaceInfo*)dsi->platformInfo;
temp0->SetWindowId((void *)dsi_win->hwnd);
temp0->SetDisplayId((void *)dsi_win->hdc);
// also set parent id to avoid border sizes being added
temp0->SetParentId((void *)dsi_win->hdc);
// use mac code
#elif defined(__APPLE__)
JAWT_MacOSXDrawingSurfaceInfo* dsi_mac;
dsi_mac = (JAWT_MacOSXDrawingSurfaceInfo*)dsi->platformInfo;
temp0->SetDisplayId(dsi_mac->cocoaViewRef);
// otherwise use X11 code
#else
JAWT_X11DrawingSurfaceInfo* dsi_x11;
dsi_x11 = (JAWT_X11DrawingSurfaceInfo*)dsi->platformInfo;
temp0->SetDisplayId((void *)dsi_x11->display);
temp0->SetWindowId((void *)dsi_x11->drawable);
temp0->SetParentId((void *)dsi_x11->display);
#endif
/* Free the drawing surface info */
ds->FreeDrawingSurfaceInfo(dsi);
/* Unlock the drawing surface */
ds->Unlock(ds);
/* Free the drawing surface */
awt.FreeDrawingSurface(ds);
#if defined(WIN32_JAWT_LOCK_HACK)
if (WJLH_init_check == 0)
{
WJLH_init_check = 1;
}
WJLH_lock_map[hash] = 1;
#endif
return 0;
}
// Lock must be called prior to render or anything which might
// cause vtkRenderWindow to make an XLib call or to call Render().
// The Lock() and UnLock() functions are necessary for drawing in
// JAWT, but they also provide a form of mutex locking so that multiple
// java threads are prevented from accessing X at the same time. The only
// requirement JAWT has is that all operations on a JAWT_DrawingSurface
// MUST be performed from the same thread as the call to GetDrawingSurface.
extern "C" JNIEXPORT jint JNICALL
Java_vtk_vtkPanel_Lock(JNIEnv *env,
jobject canvas)
{
JAWT awt;
JAWT_DrawingSurface* ds;
jint lock;
/* Get the AWT */
awt.version = JAWT_VERSION_1_3;
if (JAWT_GetAWT(env, &awt) == JNI_FALSE)
{
#ifndef VTK_JAVA_DEBUG
printf("AWT Not found\n");
#endif
return 1;
}
/* Get the drawing surface */
ds = awt.GetDrawingSurface(env, canvas);
if (ds == NULL)
{
#ifndef VTK_JAVA_DEBUG
printf("NULL drawing surface\n");
#endif
return 1;
}
#if defined(WIN32_JAWT_LOCK_HACK)
int hash;
WJLH_HASH_FUNC(env, canvas, hash);
if (WJLH_init_check && WJLH_lock_map[hash] > WJLH_MAX_COUNT)
{
env->MonitorEnter(canvas);
}
else
{
#endif
/* Lock the drawing surface */
lock = ds->Lock(ds);
if((lock & JAWT_LOCK_ERROR) != 0)
{
#ifndef VTK_JAVA_DEBUG
printf("Error locking surface\n");
#endif
awt.FreeDrawingSurface(ds);
return 1;
}
#if defined(WIN32_JAWT_LOCK_HACK)
}
#endif
return 0;
}
// UnLock() must be called after a Lock() and execution of a
// function which might change the drawing surface. See Lock().
extern "C" JNIEXPORT jint JNICALL
Java_vtk_vtkPanel_UnLock(JNIEnv *env,
jobject canvas)
{
JAWT awt;
JAWT_DrawingSurface* ds;
/* Get the AWT */
awt.version = JAWT_VERSION_1_3;
if (JAWT_GetAWT(env, &awt) == JNI_FALSE)
{
#ifndef VTK_JAVA_DEBUG
printf("AWT Not found\n");
#endif
return 1;
}
/* Get the drawing surface */
ds = awt.GetDrawingSurface(env, canvas);
if (ds == NULL)
{
#ifndef VTK_JAVA_DEBUG
printf("NULL drawing surface\n");
#endif
return 1;
}
#if defined(WIN32_JAWT_LOCK_HACK)
int hash;
WJLH_HASH_FUNC(env, canvas, hash);
if (WJLH_init_check && WJLH_lock_map[hash] > WJLH_MAX_COUNT)
{
env->MonitorExit(canvas);
}
else
{
if (WJLH_init_check) WJLH_lock_map[hash]++;
#endif
/* Unlock the drawing surface */
ds->Unlock(ds);
#if defined(WIN32_JAWT_LOCK_HACK)
}
#endif
/* Free the drawing surface */
awt.FreeDrawingSurface(ds);
return 0;
}