Common/vtkJavaAwt.h
Go to the documentation of this file.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 }