static Bool make_layer(ModeInfo * mi, layer * l, int nblobs) { int i; int blob_min, blob_max; XGCValues gcv; int width = MI_WIDTH(mi), height = MI_HEIGHT(mi); l->nblobs = nblobs; if ((l->blobs = (blob *) calloc(l->nblobs, sizeof (blob))) == NULL) return False; blob_max = (width < height ? width : height) / 2; blob_min = (blob_max * 2) / 3; for (i = 0; i < l->nblobs; i++) if (!make_blob(&(l->blobs[i]), width, height, (int) (LRAND() % (blob_max - blob_min + 1)) + blob_min)) return False; if ((l->pixmap = XCreatePixmap(MI_DISPLAY(mi), MI_WINDOW(mi), width, height, 1)) == None) return False; if ((l->gc = XCreateGC(MI_DISPLAY(mi), l->pixmap, 0, &gcv)) == None) return False; return True; }
static ERL_NIF_TERM send_new_blob(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { ErlNifPid to; ERL_NIF_TERM msg, copy; ErlNifEnv* msg_env; int res; if (!enif_get_local_pid(env, argv[0], &to)) { return enif_make_badarg(env); } msg_env = enif_alloc_env(); msg = make_blob(env,msg_env, argv[1]); copy = make_blob(env,env, argv[1]); res = enif_send(env, &to, msg_env, msg); enif_free_env(msg_env); return enif_make_tuple3(env, atom_ok, enif_make_int(env,res), copy); }