static void crop_result(GwyDataField *result, GwyDataField *dfield1, GwyDataField *dfield2, GwyOrientation orientation, gint px1, gint py1, gint px2, gint py2) { if (orientation == GWY_ORIENTATION_HORIZONTAL) { gint top = MAX(MAX(py1, py2), 0); gint bot = MIN(MIN(dfield1->yres + py1, dfield2->yres + py2), result->yres); gdouble yreal = (bot - top)*gwy_data_field_get_ymeasure(result); g_return_if_fail(bot > top); gwy_data_field_resize(result, 0, top, result->xres, bot); gwy_data_field_set_yreal(result, yreal); } else { gint left = MAX(MAX(px1, px2), 0); gint right = MIN(MIN(dfield1->xres + px1, dfield2->xres + px2), result->xres); gdouble xreal = (right - left)*gwy_data_field_get_xmeasure(result); g_return_if_fail(right > left); gwy_data_field_resize(result, left, 0, right, result->yres); gwy_data_field_set_xreal(result, xreal); } }
static void apply(GwyUnitoolState *state) { static const gchar *field_names[] = { "/0/data", "/0/mask", "/0/show" }; GtkWidget *data_window; GwyDataView *data_view; GwyContainer *data; GwyDataField *dfield; gint ximin, yimin, ximax, yimax; gdouble sel[4]; gsize i; if (!gwy_vector_layer_get_selection(state->layer, sel)) return; data_view = GWY_DATA_VIEW(GWY_DATA_VIEW_LAYER(state->layer)->parent); data = gwy_data_view_get_data(data_view); data = GWY_CONTAINER(gwy_serializable_duplicate(G_OBJECT(data))); gwy_app_clean_up_data(data); for (i = 0; i < G_N_ELEMENTS(field_names); i++) { if (!gwy_container_gis_object_by_name(data, field_names[i], (GObject**)&dfield)) continue; ximin = gwy_data_field_rtoj(dfield, sel[0]); yimin = gwy_data_field_rtoi(dfield, sel[1]); ximax = gwy_data_field_rtoj(dfield, sel[2]) + 1; yimax = gwy_data_field_rtoi(dfield, sel[3]) + 1; gwy_data_field_set_xreal(dfield, (ximax - ximin) *gwy_data_field_get_xreal(dfield) /gwy_data_field_get_xres(dfield)); gwy_data_field_set_yreal(dfield, (yimax - yimin) *gwy_data_field_get_yreal(dfield) /gwy_data_field_get_yres(dfield)); gwy_data_field_resize(dfield, ximin, yimin, ximax, yimax); } data_window = gwy_app_data_window_create(data); gwy_app_data_window_set_untitled(GWY_DATA_WINDOW(data_window), NULL); gwy_vector_layer_unselect(state->layer); gwy_data_view_update(data_view); gwy_debug("%d %d", gwy_data_field_get_xres(dfield), gwy_data_field_get_yres(dfield)); }