jboolean select_dispman_cursor(LensNativePort *lensPort) {
    if (load_bcm_symbols() != 0) {
        //this indicates an error on loading bcm libraries, thus we cannot use the dispman cursor impl
        return JNI_FALSE;
    }

    lensPort->platformName = platformName;
    lensPort->setNativeCursor = fbDispmanSetNativeCursor;
    lensPort->cursorInitialize = fbDispmanCursorInitialize;
    lensPort->cursorSetPosition = fbDispmanCursorSetPosition;
    lensPort->cursorClose = _fbDispmanCursorClose;
    lensPort->createNativeCursor = fbDispmanCreateNativeCursor;
    lensPort->releaseNativeCursor = fbDispmanReleaseNativeCursor;
    lensPort->setVisible = fbDispmanSetVisible;
    lensPort->robotScreenCapture = fbDispmanRobotScreenCapture;
    lensPort->cursorTranslucency = JNI_TRUE;

    return JNI_TRUE;
}
Exemplo n.º 2
0
int load_wrapped_gles_symbols() {

    if (done_loading_symbols)  {
        return 0;
    }
    done_loading_symbols = 1;

    //Note that there is an order depenacy here - The PI wants GLES first.
    // Other platfroms needs the RTLD_GLOBAL to resolve symbols correctly.

    libglesv2 = dlopen("libGLESv2.so", RTLD_LAZY | RTLD_GLOBAL);
    if (!libglesv2) {
        fprintf(stderr, "Did not find libGLESv2.so %s\n", dlerror());
        return 0;
    }

    libegl = dlopen("libEGL.so", RTLD_LAZY | RTLD_GLOBAL);
    if (!libegl) {
        fprintf(stderr, "Did not find libEGL.so %s\n", dlerror());
        return 0;
    }

    void *libbcm = dlopen("libbcm_host.so", RTLD_LAZY);

    int error = 0;

    if (load_bcm_symbols() == 0) {
        // useDispman
    } else if (access("/dev/mxc_vpu", F_OK) == 0) {
        useVivanteFB = 1;
        error += load_vivante_symbols(libegl);
    }

    error += load_egl_symbols(libegl);

    return error;
}
JNIEXPORT jlong JNICALL Java_com_sun_glass_ui_monocle_dispman_DispmanAcceleratedScreen__1platformGetNativeWindow
    (JNIEnv *env, jobject obj, jint displayID, jint layerID) {

#ifdef USE_DISPMAN

    EGL_DISPMANX_WINDOW_T *dispmanWindow;
    DISPMANX_DISPLAY_HANDLE_T display = 0;
    DISPMANX_ELEMENT_HANDLE_T element;
    DISPMANX_UPDATE_HANDLE_T update;
    VC_RECT_T dst = { 0, 0, 0, 0 };
    VC_RECT_T src = { 0, 0, 0, 0 };

    load_bcm_symbols();

    (*wr_bcm_host_init)();

    dispmanWindow = (EGL_DISPMANX_WINDOW_T *)calloc(sizeof(EGL_DISPMANX_WINDOW_T), 1);

    display = (*wr_vc_dispmanx_display_open)(displayID);
    if (display == 0) {
        fprintf(stderr, "Dispman: Cannot open display\n");
        return 0;
    }
    int fbFileHandle;
    struct fb_var_screeninfo screenInfo;
    fbFileHandle = open("/dev/fb0", O_RDONLY);
    if (fbFileHandle < 0) {
        fprintf(stderr, "Cannot open framebuffer\n");
        return 0;
    }
    if (ioctl(fbFileHandle, FBIOGET_VSCREENINFO, &screenInfo)) {
        fprintf(stderr, "Cannot get screen info\n");
        return 0;
    }
    close(fbFileHandle);

    dst.width = screenInfo.xres;
    dst.height = screenInfo.yres;
    src.width = screenInfo.xres << 16;
    src.height = screenInfo.yres << 16;

    VC_DISPMANX_ALPHA_T alpha;
    alpha.flags = DISPMANX_FLAGS_ALPHA_FROM_SOURCE;
    alpha.opacity = 0xff;
    alpha.mask = (DISPMANX_RESOURCE_HANDLE_T) 0;
    update = (*wr_vc_dispmanx_update_start)(0);
    element = (*wr_vc_dispmanx_element_add)(
                  update,
                  display,
                  layerID,
                  &dst,
                  0 /*src*/,
                  &src,
                  DISPMANX_PROTECTION_NONE,
                  &alpha,
                  0 /*clamp*/,
                  0 /*transform*/);

    dispmanWindow->element = element;
    dispmanWindow->width = screenInfo.xres;
    dispmanWindow->height = screenInfo.yres;
    (*wr_vc_dispmanx_update_submit_sync)(update);

    return asJLong((NativeWindowType)dispmanWindow);
#else
    return 0l;
#endif /* USE_DISPMAN */
}