Что делает AWT.GetDrawingSurface?

Я нахожусь на проекте, где мне нужно использовать vtk с Java и JavaFX. И чтобы дать VTK правильный холст, где он может рисовать, мне было интересно, что делает функция GetDrawingSurface () в приведенном ниже коде. awt — это объект JAWT, описанный в jawt.h из библиотеки jawt.

Это для того, чтобы переписать класс Java, чтобы дать C ++ правильный холст.

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));

/* 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)
temp0->Finalize();
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->SetWindowId(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;
}

0

Решение

Ну, я сам понял, что он возвращает информацию об использовании оконного менеджера в системе.

Он использует getPeer Функция Java, чтобы получить правильную информацию и передать ее на C-код. Поэтому невозможно указать, где я хочу нарисовать, потому что Javadoc четко говорит, что это компьютер и не может быть переписан.

Надеемся, что последняя версия VTK (6.1.0) дает новую возможность иметь VTK в JavaFX с помощью vtkJoGLPanelComponent, Это должно быть легким, я думаю, потому что другой вариант, vtkJoGLCanvasComponent не работает вообще.

0

Другие решения


По вопросам рекламы [email protected]