static int dt_circle_events_button_pressed(struct dt_iop_module_t *module, float pzx, float pzy, double pressure, int which, int type, uint32_t state, dt_masks_form_t *form, int parentid, dt_masks_form_gui_t *gui, int index) { if(!gui) return 0; if(gui->source_selected && !gui->creation && gui->edit_mode == DT_MASKS_EDIT_FULL) { dt_masks_form_gui_points_t *gpt = (dt_masks_form_gui_points_t *)g_list_nth_data(gui->points, index); if(!gpt) return 0; // we start the form dragging gui->source_dragging = TRUE; gui->dx = gpt->source[0] - gui->posx; gui->dy = gpt->source[1] - gui->posy; return 1; } else if(gui->form_selected && !gui->creation && gui->edit_mode == DT_MASKS_EDIT_FULL) { dt_masks_form_gui_points_t *gpt = (dt_masks_form_gui_points_t *)g_list_nth_data(gui->points, index); if(!gpt) return 0; // we start the form dragging gui->form_dragging = TRUE; gui->dx = gpt->points[0] - gui->posx; gui->dy = gpt->points[1] - gui->posy; return 1; } else if(gui->creation && (which == 3)) { gui->creation_continuous = FALSE; gui->creation_continuous_module = NULL; dt_masks_set_edit_mode(module, DT_MASKS_EDIT_FULL); dt_masks_iop_update(module); dt_control_queue_redraw_center(); return 1; } else if(gui->creation && which == 1 && (((state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK)) == (GDK_CONTROL_MASK | GDK_SHIFT_MASK)) || ((state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK))) { // set some absolute or relative position for the source of the clone mask if(form->type & DT_MASKS_CLONE) dt_masks_set_source_pos_initial_state(gui, state, pzx, pzy); return 1; } else if(gui->creation) { dt_iop_module_t *crea_module = gui->creation_module; // we create the circle dt_masks_point_circle_t *circle = (dt_masks_point_circle_t *)(malloc(sizeof(dt_masks_point_circle_t))); // we change the center value float wd = darktable.develop->preview_pipe->backbuf_width; float ht = darktable.develop->preview_pipe->backbuf_height; float pts[2] = { pzx * wd, pzy * ht }; dt_dev_distort_backtransform(darktable.develop, pts, 1); circle->center[0] = pts[0] / darktable.develop->preview_pipe->iwidth; circle->center[1] = pts[1] / darktable.develop->preview_pipe->iheight; if(form->type & (DT_MASKS_CLONE|DT_MASKS_NON_CLONE)) { circle->radius = dt_conf_get_sanitize_set("plugins/darkroom/spots/circle_size", 0.001f, 0.5f); circle->border = dt_conf_get_sanitize_set("plugins/darkroom/spots/circle_border", 0.0005f, 0.5f); // calculate the source position if(form->type & DT_MASKS_CLONE) { dt_masks_set_source_pos_initial_value(gui, DT_MASKS_CIRCLE, form, pzx, pzy); } else { // not used by regular masks form->source[0] = form->source[1] = 0.0f; } } else { circle->radius = dt_conf_get_sanitize_set("plugins/darkroom/masks/circle/size", 0.001f, 0.5f); circle->border = dt_conf_get_sanitize_set("plugins/darkroom/masks/circle/border", 0.0005f, 0.5f); // not used for masks form->source[0] = form->source[1] = 0.0f; } form->points = g_list_append(form->points, circle); dt_masks_gui_form_save_creation(darktable.develop, crea_module, form, gui); if(crea_module) { // we save the move dt_dev_add_history_item(darktable.develop, crea_module, TRUE); // and we switch in edit mode to show all the forms if(gui->creation_continuous) dt_masks_set_edit_mode_single_form(crea_module, form->formid, DT_MASKS_EDIT_FULL); else dt_masks_set_edit_mode(crea_module, DT_MASKS_EDIT_FULL); dt_masks_iop_update(crea_module); gui->creation_module = NULL; } else { // we select the new form dt_dev_masks_selection_change(darktable.develop, form->formid, TRUE); } // if we draw a clone circle, we start now the source dragging if(form->type & (DT_MASKS_CLONE|DT_MASKS_NON_CLONE)) { dt_masks_form_t *grp = darktable.develop->form_visible; if(!grp || !(grp->type & DT_MASKS_GROUP)) return 1; int pos3 = 0, pos2 = -1; GList *fs = g_list_first(grp->points); while(fs) { dt_masks_point_group_t *pt = (dt_masks_point_group_t *)fs->data; if(pt->formid == form->formid) { pos2 = pos3; break; } pos3++; fs = g_list_next(fs); } if(pos2 < 0) return 1; dt_masks_form_gui_t *gui2 = darktable.develop->form_gui; if(!gui2) return 1; if(form->type & DT_MASKS_CLONE) gui2->source_dragging = TRUE; else gui2->form_dragging = TRUE; gui2->group_edited = gui2->group_selected = pos2; gui2->posx = pzx * darktable.develop->preview_pipe->backbuf_width; gui2->posy = pzy * darktable.develop->preview_pipe->backbuf_height; gui2->dx = 0.0; gui2->dy = 0.0; gui2->scrollx = pzx; gui2->scrolly = pzy; gui2->form_selected = TRUE; // we also want to be selected after button released dt_masks_select_form(module, dt_masks_get_from_id(darktable.develop, form->formid)); } return 1; } return 0; }
static int dt_circle_events_button_released(struct dt_iop_module_t *module, float pzx, float pzy, int which, uint32_t state, dt_masks_form_t *form, int parentid, dt_masks_form_gui_t *gui, int index) { if(which == 3 && parentid > 0 && gui->edit_mode == DT_MASKS_EDIT_FULL) { // we hide the form if(!(darktable.develop->form_visible->type & DT_MASKS_GROUP)) dt_masks_change_form_gui(NULL); else if(g_list_length(darktable.develop->form_visible->points) < 2) dt_masks_change_form_gui(NULL); else { dt_masks_clear_form_gui(darktable.develop); GList *forms = g_list_first(darktable.develop->form_visible->points); while(forms) { dt_masks_point_group_t *gpt = (dt_masks_point_group_t *)forms->data; if(gpt->formid == form->formid) { darktable.develop->form_visible->points = g_list_remove(darktable.develop->form_visible->points, gpt); free(gpt); break; } forms = g_list_next(forms); } gui->edit_mode = DT_MASKS_EDIT_FULL; } // we remove the shape dt_dev_masks_list_remove(darktable.develop, form->formid, parentid); dt_masks_form_remove(module, dt_masks_get_from_id(darktable.develop, parentid), form); return 1; } if(gui->form_dragging) { // we get the circle dt_masks_point_circle_t *circle = (dt_masks_point_circle_t *)(g_list_first(form->points)->data); // we end the form dragging gui->form_dragging = FALSE; // we change the center value float wd = darktable.develop->preview_pipe->backbuf_width; float ht = darktable.develop->preview_pipe->backbuf_height; float pts[2] = { pzx * wd + gui->dx, pzy * ht + gui->dy }; dt_dev_distort_backtransform(darktable.develop, pts, 1); circle->center[0] = pts[0] / darktable.develop->preview_pipe->iwidth; circle->center[1] = pts[1] / darktable.develop->preview_pipe->iheight; dt_masks_write_form(form, darktable.develop); // we recreate the form points dt_masks_gui_form_remove(form, gui, index); dt_masks_gui_form_create(form, gui, index); // we save the move dt_masks_update_image(darktable.develop); if(gui->creation_continuous) { dt_masks_form_t *form_new = dt_masks_create(form->type); dt_masks_change_form_gui(form_new); darktable.develop->form_gui->creation = TRUE; darktable.develop->form_gui->creation_module = gui->creation_continuous_module; } return 1; } else if(gui->source_dragging) { // we end the form dragging gui->source_dragging = FALSE; if(gui->scrollx != 0.0 || gui->scrolly != 0.0) { // if there's no dragging the source is calculated in dt_circle_events_button_pressed() } else { // we change the center value float wd = darktable.develop->preview_pipe->backbuf_width; float ht = darktable.develop->preview_pipe->backbuf_height; float pts[2] = { pzx * wd + gui->dx, pzy * ht + gui->dy }; dt_dev_distort_backtransform(darktable.develop, pts, 1); form->source[0] = pts[0] / darktable.develop->preview_pipe->iwidth; form->source[1] = pts[1] / darktable.develop->preview_pipe->iheight; } dt_masks_write_form(form, darktable.develop); // we recreate the form points dt_masks_gui_form_remove(form, gui, index); dt_masks_gui_form_create(form, gui, index); // we save the move dt_masks_update_image(darktable.develop); if(gui->creation_continuous) { dt_masks_form_t *form_new = dt_masks_create(form->type); dt_masks_change_form_gui(form_new); darktable.develop->form_gui->creation = TRUE; darktable.develop->form_gui->creation_module = gui->creation_continuous_module; } return 1; } return 0; }
static int dt_circle_events_button_pressed(struct dt_iop_module_t *module, float pzx, float pzy, double pressure, int which, int type, uint32_t state, dt_masks_form_t *form, int parentid, dt_masks_form_gui_t *gui, int index) { if(!gui) return 0; if(gui->source_selected && !gui->creation && gui->edit_mode == DT_MASKS_EDIT_FULL) { dt_masks_form_gui_points_t *gpt = (dt_masks_form_gui_points_t *)g_list_nth_data(gui->points, index); if(!gpt) return 0; // we start the form dragging gui->source_dragging = TRUE; gui->posx = pzx * darktable.develop->preview_pipe->backbuf_width; gui->posy = pzy * darktable.develop->preview_pipe->backbuf_height; gui->dx = gpt->source[0] - gui->posx; gui->dy = gpt->source[1] - gui->posy; return 1; } else if(gui->form_selected && !gui->creation && gui->edit_mode == DT_MASKS_EDIT_FULL) { dt_masks_form_gui_points_t *gpt = (dt_masks_form_gui_points_t *)g_list_nth_data(gui->points, index); if(!gpt) return 0; // we start the form dragging gui->form_dragging = TRUE; gui->posx = pzx * darktable.develop->preview_pipe->backbuf_width; gui->posy = pzy * darktable.develop->preview_pipe->backbuf_height; gui->dx = gpt->points[0] - gui->posx; gui->dy = gpt->points[1] - gui->posy; return 1; } else if(gui->creation && (which == 3)) { dt_masks_set_edit_mode(module, DT_MASKS_EDIT_FULL); dt_masks_iop_update(module); dt_control_queue_redraw_center(); return 1; } else if(gui->creation) { dt_iop_module_t *crea_module = gui->creation_module; // we create the circle dt_masks_point_circle_t *circle = (dt_masks_point_circle_t *)(malloc(sizeof(dt_masks_point_circle_t))); // we change the center value float wd = darktable.develop->preview_pipe->backbuf_width; float ht = darktable.develop->preview_pipe->backbuf_height; float pts[2] = { pzx * wd, pzy * ht }; dt_dev_distort_backtransform(darktable.develop, pts, 1); circle->center[0] = pts[0] / darktable.develop->preview_pipe->iwidth; circle->center[1] = pts[1] / darktable.develop->preview_pipe->iheight; if(form->type & DT_MASKS_CLONE) { const float spots_size = MIN(0.5f, dt_conf_get_float("plugins/darkroom/spots/circle_size")); const float spots_border = MIN(0.5f, dt_conf_get_float("plugins/darkroom/spots/circle_border")); circle->radius = MAX(0.001f, spots_size); circle->border = MAX(0.0005f, spots_border); form->source[0] = circle->center[0] + 0.02f; form->source[1] = circle->center[1] + 0.02f; } else { const float circle_size = MIN(0.5f, dt_conf_get_float("plugins/darkroom/masks/circle/size")); const float circle_border = MIN(0.5f, dt_conf_get_float("plugins/darkroom/masks/circle/border")); circle->radius = MAX(0.01f, circle_size); circle->border = MAX(0.005f, circle_border); // not used for masks form->source[0] = form->source[1] = 0.0f; } form->points = g_list_append(form->points, circle); dt_masks_gui_form_save_creation(crea_module, form, gui); if(crea_module) { // we save the move dt_dev_add_history_item(darktable.develop, crea_module, TRUE); // and we switch in edit mode to show all the forms dt_masks_set_edit_mode(crea_module, DT_MASKS_EDIT_FULL); dt_masks_iop_update(crea_module); gui->creation_module = NULL; } else { // we select the new form dt_dev_masks_selection_change(darktable.develop, form->formid, TRUE); } // if we draw a clone circle, we start now the source dragging if(form->type & DT_MASKS_CLONE) { dt_masks_form_t *grp = darktable.develop->form_visible; if(!grp || !(grp->type & DT_MASKS_GROUP)) return 1; int pos3 = 0, pos2 = -1; GList *fs = g_list_first(grp->points); while(fs) { dt_masks_point_group_t *pt = (dt_masks_point_group_t *)fs->data; if(pt->formid == form->formid) { pos2 = pos3; break; } pos3++; fs = g_list_next(fs); } if(pos2 < 0) return 1; dt_masks_form_gui_t *gui2 = darktable.develop->form_gui; if(!gui2) return 1; gui2->source_dragging = TRUE; gui2->group_edited = gui2->group_selected = pos2; gui2->posx = pzx * darktable.develop->preview_pipe->backbuf_width; gui2->posy = pzy * darktable.develop->preview_pipe->backbuf_height; gui2->dx = 0.0; gui2->dy = 0.0; gui2->scrollx = pzx; gui2->scrolly = pzy; } return 1; } return 0; }