static gboolean filter_target_graphs(GwyContainer *data, gint id, gpointer user_data) { CurvatureControls *controls = (CurvatureControls*)user_data; GwyGraphModel *gmodel = controls->gmodel, *targetgmodel; GQuark quark = gwy_app_get_graph_key_for_id(id); g_return_val_if_fail(gmodel, FALSE); return (gwy_container_gis_object(data, quark, (GObject**)&targetgmodel) && gwy_graph_model_units_are_compatible(gmodel, targetgmodel)); }
static gboolean filter_target_graphs(GwyContainer *data, gint id, gpointer user_data) { GrainCrossControls *controls = (GrainCrossControls*)user_data; GwyGraphModel *gmodel, *targetgmodel; GQuark quark = gwy_app_get_graph_key_for_id(id); gmodel = gwy_graph_get_model(GWY_GRAPH(controls->graph)); g_return_val_if_fail(GWY_IS_GRAPH_MODEL(gmodel), FALSE); return (gwy_container_gis_object(data, quark, (GObject**)&targetgmodel) && gwy_graph_model_units_are_compatible(gmodel, targetgmodel)); }
/** * gwy_app_data_id_verify_spectra: * @id: Numerical identifiers of spectra in data managed by the data browser. * * Checks if numerical spectra identifiers correspond to existing spectra. * * If either the data contained referenced in @id or the spectra does not * exist the structure is cleared to %GWY_APP_DATA_ID_NONE and the function * returns %FALSE. If it represents existing spectra it is kept intact and * the function return %TRUE. * * Returns: Whether @id refers to existing spectra now. * * Since: 2.41 **/ gboolean gwy_app_data_id_verify_spectra(GwyAppDataId *id) { GwyContainer *container; GObject *object; GQuark quark; g_return_val_if_fail(id, FALSE); container = gwy_app_data_browser_get(id->datano); if (!container) return clear_data_id(id); quark = gwy_app_get_spectra_key_for_id(id->id); if (!gwy_container_gis_object(container, quark, &object)) return clear_data_id(id); return GWY_IS_SPECTRA(object); }
static void modify_channel_for_preview(GwyContainer *data, gint id, gboolean plane_level, gboolean row_level) { GwyDataField *field; gdouble a, bx, by; if (!plane_level && !row_level) return; if (!gwy_container_gis_object(data, gwy_app_get_data_key_for_id(id), &field) || !GWY_IS_DATA_FIELD(field)) return; if (plane_level) { gwy_data_field_fit_plane(field, &a, &bx, &by); gwy_data_field_plane_level(field, a, bx, by); } if (row_level) { guint xres = gwy_data_field_get_xres(field); guint yres = gwy_data_field_get_yres(field); gdouble *row = gwy_data_field_get_data(field); gdouble *diffs = g_new(gdouble, xres); guint i, j; for (i = 1; i < yres; i++) { gdouble *prev = row; gdouble median; row += xres; for (j = 0; j < xres; j++) diffs[j] = prev[j] - row[j]; median = gwy_math_median(xres, diffs); for (j = 0; j < xres; j++) row[j] += median; } g_free(diffs); } }
/** * gwy_layer_basic_show_field_connect: * @basic_layer: A basic layer. * * Eventually connects to new data field's "data-changed" signal. **/ static void gwy_layer_basic_show_field_connect(GwyLayerBasic *basic_layer) { GwyDataViewLayer *layer; g_return_if_fail(!basic_layer->show_field); if (!basic_layer->show_key) return; layer = GWY_DATA_VIEW_LAYER(basic_layer); if (!gwy_container_gis_object(layer->data, basic_layer->show_key, &basic_layer->show_field)) return; g_object_ref(basic_layer->show_field); basic_layer->show_id = g_signal_connect_swapped(basic_layer->show_field, "data-changed", G_CALLBACK(gwy_layer_basic_show_changed), layer); }
/** * proc_plugin_proxy_run: * @data: A data container. * @run: Run mode. * @name: Plug-in name (i.e. data processing function) to run. * * The plug-in proxy itself, runs plug-in @name on @data. * * Returns: Whether it succeeded running the plug-in. **/ static void proc_plugin_proxy_run(GwyContainer *data, GwyRunType run, const gchar *name) { ProcPluginInfo *info; GwyContainer *newdata; gchar *filename, *buffer = NULL; GError *err = NULL; gint exit_status, id, newid; gsize size = 0; FILE *fh; gchar *args[] = { NULL, "run", NULL, NULL, NULL }; GQuark dquark, mquark, squark; gboolean ok; gwy_app_data_browser_get_current(GWY_APP_DATA_FIELD_KEY, &dquark, GWY_APP_MASK_FIELD_KEY, &mquark, GWY_APP_DATA_FIELD_ID, &id, 0); gwy_debug("called as %s with run mode %d", name, run); if (!(info = proc_find_plugin(name, run))) return; fh = text_dump_export(data, dquark, mquark, &filename, NULL); g_return_if_fail(fh); args[0] = info->file; args[2] = g_strdup(gwy_enum_to_string(run, run_mode_names, -1)); args[3] = decode_glib_encoded_filename(filename); gwy_debug("%s %s %s %s", args[0], args[1], args[2], args[3]); ok = g_spawn_sync(NULL, args, NULL, 0, NULL, NULL, NULL, NULL, &exit_status, &err); if (!err) ok &= g_file_get_contents(filename, &buffer, &size, &err); g_unlink(filename); fclose(fh); gwy_debug("ok = %d, exit_status = %d, err = %p", ok, exit_status, err); ok &= !exit_status; if (ok && (newdata = text_dump_import(buffer, size, NULL))) { GwyDataField *dfield; /* Merge data */ if (gwy_container_gis_object_by_name(newdata, "/0/data", &dfield)) g_object_ref(dfield); else { dfield = gwy_container_get_object(data, dquark); dfield = gwy_data_field_duplicate(dfield); } newid = gwy_app_data_browser_add_data_field(dfield, data, TRUE); /* Merge mask */ if (gwy_container_gis_object_by_name(newdata, "/0/mask", &dfield)) g_object_ref(dfield); else if (gwy_container_gis_object(data, mquark, &dfield)) dfield = gwy_data_field_duplicate(dfield); else dfield = NULL; if (dfield) { mquark = gwy_app_get_mask_key_for_id(newid); gwy_container_set_object(data, mquark, dfield); g_object_unref(dfield); } /* Merge presentation */ if (gwy_container_gis_object_by_name(newdata, "/0/show", &dfield)) { squark = gwy_app_get_show_key_for_id(newid); gwy_container_set_object(data, squark, dfield); } /* Merge stuff. XXX: This is brutal and incomplete. */ gwy_app_sync_data_items(data, data, id, newid, FALSE, GWY_DATA_ITEM_GRADIENT, GWY_DATA_ITEM_RANGE_TYPE, GWY_DATA_ITEM_MASK_COLOR, GWY_DATA_ITEM_REAL_SQUARE, 0); gwy_app_sync_data_items(newdata, data, 0, newid, FALSE, GWY_DATA_ITEM_GRADIENT, GWY_DATA_ITEM_RANGE_TYPE, 0); g_object_unref(newdata); } else { g_warning("Cannot run plug-in %s: %s", info->file, err ? err->message : "it returned garbage."); } g_free(args[3]); g_free(args[2]); g_clear_error(&err); g_free(buffer); g_free(filename); }