JNIEXPORT jobject JNICALL Java_net_sourceforge_zbar_Image_getData (JNIEnv *env, jobject obj) { jobject data = (*env)->GetObjectField(env, obj, Image_data); if(data) return(data); zbar_image_t *zimg = GET_PEER(Image, obj); data = zbar_image_get_userdata(zimg); if(data) return(data); unsigned long rawlen = zbar_image_get_data_length(zimg); const void *raw = zbar_image_get_data(zimg); if(!rawlen || !raw) return(NULL); data = (*env)->NewByteArray(env, rawlen); if(!data) return(NULL); (*env)->SetByteArrayRegion(env, data, 0, rawlen, raw); (*env)->SetObjectField(env, obj, Image_data, data); return(data); }
void process_handler (zbar_image_t *zimg, const void *userdata) { zbarProcessor *self = (zbarProcessor*)userdata; assert(self); assert(self->handler); assert(self->closure); zbarImage *img = zbar_image_get_userdata(zimg); if(!img || img->zimg != zimg) { img = zbarImage_FromImage(zimg); if(!img) { PyErr_NoMemory(); return; } } else Py_INCREF(img); PyObject *args = PyTuple_New(3); Py_INCREF(self); Py_INCREF(self->closure); PyTuple_SET_ITEM(args, 0, (PyObject*)self); PyTuple_SET_ITEM(args, 1, (PyObject*)img); PyTuple_SET_ITEM(args, 2, self->closure); PyObject *junk = PyObject_Call(self->handler, args, NULL); Py_XDECREF(junk); Py_DECREF(args); }
void zbar_gtk_release_pixbuf (zbar_image_t *img) { GdkPixbuf *pixbuf = zbar_image_get_userdata(img); g_assert(GDK_IS_PIXBUF(pixbuf)); /* remove reference */ zbar_image_set_userdata(img, NULL); /* release reference to associated pixbuf and it's data */ g_object_unref(pixbuf); }
void image_cleanup (zbar_image_t *zimg) { PyObject *data = zbar_image_get_userdata(zimg); zbar_image_set_userdata(zimg, NULL); if(!data) return; /* FIXME internal error */ if(PyObject_TypeCheck(data, &zbarImage_Type)) { zbarImage *self = (zbarImage*)data; assert(self->zimg == zimg); Py_CLEAR(self->data); } else Py_DECREF(data); }
static int image_clear (zbarImage *self) { zbar_image_t *zimg = self->zimg; self->zimg = NULL; if(zimg) { assert(zbar_image_get_userdata(zimg) == self); if(self->data) { /* attach data directly to zbar image */ zbar_image_set_userdata(zimg, self->data); self->data = NULL; } else zbar_image_set_userdata(zimg, NULL); zbar_image_destroy(zimg); } return(0); }
static void Image_cleanupIntArray (zbar_image_t *zimg) { jobject data = zbar_image_get_userdata(zimg); assert(data); JNIEnv *env = NULL; if((*jvm)->AttachCurrentThread(jvm, (void**)&env, NULL)) return; assert(env); if(env && data) { void *raw = (void*)zbar_image_get_data(zimg); assert(raw); /* const image data is unchanged - abort copy back */ (*env)->ReleaseIntArrayElements(env, data, raw, JNI_ABORT); (*env)->DeleteGlobalRef(env, data); zbar_image_set_userdata(zimg, NULL); } }
void process_handler (zbar_image_t *zimg, const void *userdata) { PyGILState_STATE gstate; gstate = PyGILState_Ensure(); zbarProcessor *self = (zbarProcessor*)userdata; assert(self); assert(self->handler); assert(self->closure); zbarImage *img = zbar_image_get_userdata(zimg); if(!img || img->zimg != zimg) { img = zbarImage_FromImage(zimg); if(!img) { PyErr_NoMemory(); goto done; } } else Py_INCREF(img); PyObject *args = PyTuple_New(3); Py_INCREF(self); Py_INCREF(self->closure); PyTuple_SET_ITEM(args, 0, (PyObject*)self); PyTuple_SET_ITEM(args, 1, (PyObject*)img); PyTuple_SET_ITEM(args, 2, self->closure); PyObject *junk = PyObject_Call(self->handler, args, NULL); if(junk) Py_DECREF(junk); else { PySys_WriteStderr("in ZBar Processor data_handler:\n"); assert(PyErr_Occurred()); PyErr_Print(); } Py_DECREF(args); done: PyGILState_Release(gstate); }
static PyObject* image_get_data (zbarImage *self, void *closure) { assert(zbar_image_get_userdata(self->zimg) == self); if(self->data) { Py_INCREF(self->data); return(self->data); } const char *data = zbar_image_get_data(self->zimg); unsigned long datalen = zbar_image_get_data_length(self->zimg); if(!data || !datalen) { Py_INCREF(Py_None); return(Py_None); } self->data = PyBuffer_FromMemory((void*)data, datalen); Py_INCREF(self->data); return(self->data); }