00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
#include "jawt_md.h"
00017
00018 #define VTK_JAVA_DEBUG
00019
00020
00021
#if defined(_WIN32) || defined(WIN32)
00022
#define WIN32_JAWT_LOCK_HACK
00023
#endif
00024
00025
#if defined(WIN32_JAWT_LOCK_HACK)
00026
#define WJLH_MAX_COUNT (32)
00027
#define WJLH_HASH_FUNC(E,C,H) {\
00028
jclass cls = E->GetObjectClass(C);\
00029
jmethodID mid = E->GetMethodID(cls, "hashCode", "()I");\
00030
H = E->CallIntMethod(C, mid); }
00031
#include <windows.h>
00032
int WJLH_init_check = 0;
00033
#include "vtkstd/map"
00034 vtkstd::map<int,int> WJLH_lock_map;
00035
#endif
00036
00037
extern "C" JNIEXPORT jint JNICALL
00038 Java_vtk_vtkPanel_RenderCreate(JNIEnv *env, jobject canvas, jobject id0)
00039 {
00040
#if defined(WIN32_JAWT_LOCK_HACK)
00041
int hash;
00042 WJLH_HASH_FUNC(env, canvas, hash);
00043 WJLH_lock_map[hash] = 0;
00044
#endif
00045
00046 JAWT awt;
00047 JAWT_DrawingSurface* ds;
00048 JAWT_DrawingSurfaceInfo* dsi;
00049 jint lock;
00050
00051
00052
vtkRenderWindow *temp0;
00053 temp0 = (
vtkRenderWindow *)(vtkJavaGetPointerFromObject(env,id0,(
char *)
"vtkRenderWindow"));
00054
00055
00056 awt.version = JAWT_VERSION_1_3;
00057
if (JAWT_GetAWT(env, &awt) == JNI_FALSE)
00058 {
00059
#ifndef VTK_JAVA_DEBUG
00060
printf(
"AWT Not found\n");
00061
#endif
00062
return 1;
00063 }
00064
00065
00066 ds = awt.GetDrawingSurface(env, canvas);
00067
if (ds == NULL)
00068 {
00069
#ifndef VTK_JAVA_DEBUG
00070
printf(
"NULL drawing surface\n");
00071
#endif
00072
return 1;
00073 }
00074
00075
00076 lock = ds->Lock(ds);
00077
if((lock & JAWT_LOCK_ERROR) != 0)
00078 {
00079
#ifndef VTK_JAVA_DEBUG
00080
printf(
"Error locking surface\n");
00081
#endif
00082
awt.FreeDrawingSurface(ds);
00083
return 1;
00084 }
00085
00086
00087 dsi = ds->GetDrawingSurfaceInfo(ds);
00088
if (dsi == NULL)
00089 {
00090 printf(
"Error getting surface info\n");
00091 ds->Unlock(ds);
00092 awt.FreeDrawingSurface(ds);
00093
return 1;
00094 }
00095
00096
00097
#if defined(_WIN32) || defined(WIN32)
00098
JAWT_Win32DrawingSurfaceInfo* dsi_win;
00099 dsi_win = (JAWT_Win32DrawingSurfaceInfo*)dsi->platformInfo;
00100 temp0->
SetWindowId((
void *)dsi_win->hwnd);
00101 temp0->
SetDisplayId((
void *)dsi_win->hdc);
00102
00103 temp0->
SetParentId((
void *)dsi_win->hdc);
00104
00105
#elif defined(VTK_USE_CARBON) || defined(VTK_USE_COCOA)
00106
JAWT_MacDrawingSurfaceInfo* dsi_mac;
00107 dsi_mac = (JAWT_MacDrawingSurfaceInfo*)dsi->platformInfo;
00108 temp0->
SetWindowId((
void *)dsi_mac->fQDWindow);
00109
00110
#else
00111
JAWT_X11DrawingSurfaceInfo* dsi_x11;
00112 dsi_x11 = (JAWT_X11DrawingSurfaceInfo*)dsi->platformInfo;
00113 temp0->
SetDisplayId((
void *)dsi_x11->display);
00114 temp0->
SetWindowId((
void *)dsi_x11->drawable);
00115 temp0->
SetParentId((
void *)dsi_x11->display);
00116
#endif
00117
00118
00119 ds->FreeDrawingSurfaceInfo(dsi);
00120
00121
00122 ds->Unlock(ds);
00123
00124
00125 awt.FreeDrawingSurface(ds);
00126
00127
#if defined(WIN32_JAWT_LOCK_HACK)
00128
if (WJLH_init_check == 0)
00129 {
00130 WJLH_init_check = 1;
00131 }
00132 WJLH_lock_map[hash] = 1;
00133
#endif
00134
return 0;
00135
00136 }
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
extern "C" JNIEXPORT jint JNICALL
00147 Java_vtk_vtkPanel_Lock(JNIEnv *env,
00148 jobject canvas)
00149 {
00150 JAWT awt;
00151 JAWT_DrawingSurface* ds;
00152 jint lock;
00153
00154
00155 awt.version = JAWT_VERSION_1_3;
00156
if (JAWT_GetAWT(env, &awt) == JNI_FALSE)
00157 {
00158
#ifndef VTK_JAVA_DEBUG
00159
printf(
"AWT Not found\n");
00160
#endif
00161
return 1;
00162 }
00163
00164
00165 ds = awt.GetDrawingSurface(env, canvas);
00166
if (ds == NULL)
00167 {
00168
#ifndef VTK_JAVA_DEBUG
00169
printf(
"NULL drawing surface\n");
00170
#endif
00171
return 1;
00172 }
00173
00174
#if defined(WIN32_JAWT_LOCK_HACK)
00175
int hash;
00176 WJLH_HASH_FUNC(env, canvas, hash);
00177
if (WJLH_init_check && WJLH_lock_map[hash] > WJLH_MAX_COUNT)
00178 {
00179 env->MonitorEnter(canvas);
00180 }
00181
else
00182 {
00183
#endif
00184
00185 lock = ds->Lock(ds);
00186
if((lock & JAWT_LOCK_ERROR) != 0)
00187 {
00188
#ifndef VTK_JAVA_DEBUG
00189
printf(
"Error locking surface\n");
00190
#endif
00191
awt.FreeDrawingSurface(ds);
00192
return 1;
00193 }
00194
#if defined(WIN32_JAWT_LOCK_HACK)
00195
}
00196
#endif
00197
00198
return 0;
00199
00200 }
00201
00202
00203
00204
extern "C" JNIEXPORT jint JNICALL
00205 Java_vtk_vtkPanel_UnLock(JNIEnv *env,
00206 jobject canvas)
00207 {
00208 JAWT awt;
00209 JAWT_DrawingSurface* ds;
00210
00211
00212 awt.version = JAWT_VERSION_1_3;
00213
if (JAWT_GetAWT(env, &awt) == JNI_FALSE)
00214 {
00215
#ifndef VTK_JAVA_DEBUG
00216
printf(
"AWT Not found\n");
00217
#endif
00218
return 1;
00219 }
00220
00221
00222 ds = awt.GetDrawingSurface(env, canvas);
00223
if (ds == NULL)
00224 {
00225
#ifndef VTK_JAVA_DEBUG
00226
printf(
"NULL drawing surface\n");
00227
#endif
00228
return 1;
00229 }
00230
00231
#if defined(WIN32_JAWT_LOCK_HACK)
00232
int hash;
00233 WJLH_HASH_FUNC(env, canvas, hash);
00234
if (WJLH_init_check && WJLH_lock_map[hash] > WJLH_MAX_COUNT)
00235 {
00236 env->MonitorExit(canvas);
00237 }
00238
else
00239 {
00240
if (WJLH_init_check) WJLH_lock_map[hash]++;
00241
#endif
00242
00243 ds->Unlock(ds);
00244
#if defined(WIN32_JAWT_LOCK_HACK)
00245
}
00246
#endif
00247
00248
00249 awt.FreeDrawingSurface(ds);
00250
00251
return 0;
00252 }