static int dt_circle_events_button_pressed(struct dt_iop_module_t *module,float pzx, float pzy, int which, int type, uint32_t state, dt_masks_form_t *form, int parentid, dt_masks_form_gui_t *gui, int index) { if (which != 1) return 0; 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) { 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.01f, spots_size); circle->border = MAX(0.005f, 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, TRUE); 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; }
static int dt_gradient_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->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 rotating or dragging if(gui->pivot_selected) gui->form_rotating = TRUE; else 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)) { darktable.develop->form_visible = NULL; dt_masks_clear_form_gui(darktable.develop); 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_gradient_t *gradient = (dt_masks_point_gradient_t *) (malloc(sizeof(dt_masks_point_gradient_t))); //we change the offset 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); gradient->anchor[0] = pts[0]/darktable.develop->preview_pipe->iwidth; gradient->anchor[1] = pts[1]/darktable.develop->preview_pipe->iheight; const float compression = MIN(1.0f,dt_conf_get_float("plugins/darkroom/masks/gradient/compression")); const float steepness = 0.0f; //MIN(1.0f,dt_conf_get_float("plugins/darkroom/masks/gradient/steepness")); // currently not used const float rotation = dt_conf_get_float("plugins/darkroom/masks/gradient/rotation"); gradient->rotation = rotation; gradient->compression = MAX(0.0f, compression); gradient->steepness = MAX(0.0f, steepness); // not used for masks form->source[0] = form->source[1] = 0.0f; form->points = g_list_append(form->points,gradient); 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); } return 1; } return 0; }
static int dt_ellipse_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 source 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->point_selected >= 1 && !gui->creation && gui->edit_mode == DT_MASKS_EDIT_FULL && !((state & GDK_CONTROL_MASK) == GDK_CONTROL_MASK)) { dt_masks_form_gui_points_t *gpt = (dt_masks_form_gui_points_t *)g_list_nth_data(gui->points, index); if(!gpt) return 0; gui->point_dragging = gui->point_selected; 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->form_selected && !gui->creation && gui->edit_mode == DT_MASKS_EDIT_FULL && !((state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK)) { 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 or rotating if((state & GDK_CONTROL_MASK) == GDK_CONTROL_MASK) gui->form_rotating = TRUE; else 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->form_selected && !gui->creation && ((state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK)) { dt_masks_form_gui_points_t *gpt = (dt_masks_form_gui_points_t *)g_list_nth_data(gui->points, index); if(!gpt) return 0; gui->border_toggling = TRUE; 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 ellipse dt_masks_point_ellipse_t *ellipse = (dt_masks_point_ellipse_t *)(malloc(sizeof(dt_masks_point_ellipse_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); ellipse->center[0] = pts[0] / darktable.develop->preview_pipe->iwidth; ellipse->center[1] = pts[1] / darktable.develop->preview_pipe->iheight; if(form->type & DT_MASKS_CLONE) { const float a = dt_conf_get_float("plugins/darkroom/spots/ellipse_radius_a"); const float b = dt_conf_get_float("plugins/darkroom/spots/ellipse_radius_b"); const float ellipse_border = dt_conf_get_float("plugins/darkroom/spots/ellipse_border"); const float rotation = dt_conf_get_float("plugins/darkroom/spots/ellipse_rotation"); const int flags = dt_conf_get_int("plugins/darkroom/spots/ellipse_flags"); ellipse->radius[0] = MAX(0.01f, MIN(0.5f, a)); ellipse->radius[1] = MAX(0.01f, MIN(0.5f, b)); ellipse->flags = flags; ellipse->rotation = rotation; const float min_radius = fmin(ellipse->radius[0], ellipse->radius[1]); const float reference = (ellipse->flags & DT_MASKS_ELLIPSE_PROPORTIONAL ? 1.0f/min_radius : 1.0f); ellipse->border = MAX(0.005f * reference, MIN(0.5f * reference, ellipse_border)); form->source[0] = ellipse->center[0] + 0.02f; form->source[1] = ellipse->center[1] + 0.02f; } else { const float a = dt_conf_get_float("plugins/darkroom/masks/ellipse/radius_a"); const float b = dt_conf_get_float("plugins/darkroom/masks/ellipse/radius_b"); const float ellipse_border = dt_conf_get_float("plugins/darkroom/masks/ellipse/border"); const float rotation = dt_conf_get_float("plugins/darkroom/masks/ellipse/rotation"); const int flags = dt_conf_get_int("plugins/darkroom/masks/ellipse/flags"); ellipse->radius[0] = MAX(0.01f, MIN(0.5f, a)); ellipse->radius[1] = MAX(0.01f, MIN(0.5f, b)); ellipse->flags = flags; ellipse->rotation = rotation; const float min_radius = fmin(ellipse->radius[0], ellipse->radius[1]); const float reference = (ellipse->flags & DT_MASKS_ELLIPSE_PROPORTIONAL ? 1.0f/min_radius : 1.0f); ellipse->border = MAX(0.005f * reference, MIN(0.5f * reference, ellipse_border)); // not used for masks form->source[0] = form->source[1] = 0.0f; } form->points = g_list_append(form->points, ellipse); 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 ellipse, 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; }
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; }