static void dwt(GwyContainer *data, GwyRunType run) { GtkWidget *dialog; GwyDataField *dfield; GwyDataLine *wtcoefs; DWTArgs args; gboolean ok; gint xsize, ysize, newsize, newid, oldid, i; g_return_if_fail(run & DWT_RUN_MODES); gwy_app_data_browser_get_current(GWY_APP_DATA_FIELD, &dfield, GWY_APP_DATA_FIELD_ID, &oldid, 0); g_return_if_fail(dfield); xsize = gwy_data_field_get_xres(dfield); ysize = gwy_data_field_get_yres(dfield); if (xsize != ysize) { dialog = gtk_message_dialog_new (gwy_app_find_window_for_channel(data, oldid), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("%s: Data must be square."), "DWT"); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); return; } for (newsize = 1, i = xsize-1; i; i >>= 1, newsize <<= 1) ; dwt_load_args(gwy_app_settings_get(), &args); if (run == GWY_RUN_INTERACTIVE) { ok = dwt_dialog(&args, xsize, newsize); dwt_save_args(gwy_app_settings_get(), &args); if (!ok) return; } dfield = gwy_data_field_new_resampled(dfield, newsize, newsize, args.interp); gwy_data_field_add(dfield, -gwy_data_field_get_avg(dfield)); wtcoefs = GWY_DATA_LINE(gwy_data_line_new(10, 10, TRUE)); wtcoefs = gwy_dwt_set_coefficients(wtcoefs, args.wavelet); gwy_data_field_dwt(dfield, wtcoefs, 1, 4); newid = gwy_app_data_browser_add_data_field(dfield, data, TRUE); g_object_unref(dfield); gwy_app_set_data_field_title(data, newid, _("DWT")); gwy_app_sync_data_items(data, data, oldid, newid, FALSE, GWY_DATA_ITEM_PALETTE, 0); g_object_unref(wtcoefs); }
static void unrotate(GwyContainer *data, GwyRunType run) { enum { nder = 4800 }; GwyDataField *dfield, *mfield, *sfield; UnrotateArgs args; gdouble correction[GWY_SYMMETRY_LAST]; GwyPlaneSymmetry symm; GwyDataLine *derdist; GQuark dquark, mquark, squark; gdouble phi; gboolean ok = TRUE; gint id; g_return_if_fail(run & UNROTATE_RUN_MODES); gwy_app_data_browser_get_current(GWY_APP_DATA_FIELD_KEY, &dquark, GWY_APP_DATA_FIELD, &dfield, GWY_APP_DATA_FIELD_ID, &id, GWY_APP_MASK_FIELD_KEY, &mquark, GWY_APP_MASK_FIELD, &mfield, GWY_APP_SHOW_FIELD_KEY, &squark, GWY_APP_SHOW_FIELD, &sfield, 0); g_return_if_fail(dfield && dquark && mquark && squark); load_args(gwy_app_settings_get(), &args); derdist = GWY_DATA_LINE(gwy_data_line_new(nder, 2*G_PI, FALSE)); gwy_data_field_slope_distribution(dfield, derdist, 5); symm = gwy_data_field_unrotate_find_corrections(derdist, correction); g_object_unref(derdist); if (run == GWY_RUN_INTERACTIVE) { ok = unrotate_dialog(&args, data, dfield, id, correction, symm); save_args(gwy_app_settings_get(), &args); if (!ok) return; } if (args.symmetry) symm = args.symmetry; phi = correction[symm]; if (!mfield) mquark = 0; if (!sfield) squark = 0; if (!mfield && sfield) GWY_SWAP(GQuark, mquark, squark); gwy_app_undo_qcheckpoint(data, dquark, mquark, squark, 0); gwy_data_field_rotate(dfield, phi, args.interp); gwy_data_field_data_changed(dfield); if (mfield) { gwy_data_field_rotate(mfield, phi, GWY_INTERPOLATION_ROUND); gwy_data_field_data_changed(mfield); } if (sfield) { gwy_data_field_rotate(sfield, phi, args.interp); gwy_data_field_data_changed(sfield); } gwy_app_channel_log_add_proc(data, id, id); }