static void mask_extract(GwyContainer *data, GwyRunType run) { GwyDataField *dfield; GwySIUnit *siunit; gint oldid, newid; g_return_if_fail(run & MASKOPS_RUN_MODES); gwy_app_data_browser_get_current(GWY_APP_MASK_FIELD, &dfield, GWY_APP_DATA_FIELD_ID, &oldid, 0); g_return_if_fail(dfield); dfield = gwy_data_field_duplicate(dfield); gwy_data_field_clamp(dfield, 0.0, 1.0); /* Other functions should set the units correctly, but do not trust them */ siunit = gwy_si_unit_new(""); gwy_data_field_set_si_unit_z(dfield, siunit); g_object_unref(siunit); newid = gwy_app_data_browser_add_data_field(dfield, data, TRUE); g_object_unref(dfield); gwy_app_set_data_field_title(data, newid, _("Mask")); gwy_app_channel_log_add_proc(data, oldid, newid); }
static void selection_finished_cb(GwyUnitoolState *state) { GwyContainer *data; GObject *dfield; GwyDataField *mask = NULL; GwyDataViewLayer *layer; ToolControls *controls; GwySIUnit *siunit; gint isel[4]; controls = (ToolControls*)state->user_data; layer = GWY_DATA_VIEW_LAYER(state->layer); data = gwy_data_view_get_data(GWY_DATA_VIEW(layer->parent)); dfield = gwy_container_get_object_by_name(data, "/0/data"); gwy_container_gis_object_by_name(data, "/0/mask", (GObject**)&mask); gwy_unitool_rect_info_table_fill(state, &controls->labels, NULL, isel); switch (controls->mode) { case MASK_EDIT_SET: gwy_app_undo_checkpoint(data, "/0/mask", NULL); if (!mask) { mask = GWY_DATA_FIELD(gwy_serializable_duplicate(dfield)); siunit = GWY_SI_UNIT(gwy_si_unit_new("")); gwy_data_field_set_si_unit_z(mask, siunit); g_object_unref(siunit); gwy_container_set_object_by_name(data, "/0/mask", (GObject*)mask); g_object_unref(mask); } gwy_data_field_fill(mask, 0.0); gwy_data_field_area_fill(mask, isel[0], isel[1], isel[2], isel[3], 1.0); break; case MASK_EDIT_ADD: gwy_app_undo_checkpoint(data, "/0/mask", NULL); if (!mask) { mask = GWY_DATA_FIELD(gwy_serializable_duplicate(dfield)); siunit = GWY_SI_UNIT(gwy_si_unit_new("")); gwy_data_field_set_si_unit_z(mask, siunit); g_object_unref(siunit); gwy_container_set_object_by_name(data, "/0/mask", (GObject*)mask); g_object_unref(mask); gwy_data_field_fill(mask, 0.0); } gwy_data_field_area_fill(mask, isel[0], isel[1], isel[2], isel[3], 1.0); break; case MASK_EDIT_REMOVE: if (mask) { gwy_app_undo_checkpoint(data, "/0/mask", NULL); gwy_data_field_area_fill(mask, isel[0], isel[1], isel[2], isel[3], 0.0); } break; case MASK_EDIT_INTERSECT: if (mask) { gwy_app_undo_checkpoint(data, "/0/mask", NULL); gwy_data_field_clamp(mask, 0.0, 1.0); gwy_data_field_area_add(mask, isel[0], isel[1], isel[2], isel[3], 1.0); gwy_data_field_add(mask, -1.0); gwy_data_field_clamp(mask, 0.0, 1.0); } break; default: break; } gwy_vector_layer_unselect(GWY_VECTOR_LAYER(layer)); gwy_app_data_view_update(layer->parent); }