static int dt_circle_events_mouse_scrolled(struct dt_iop_module_t *module, float pzx, float pzy, int up, uint32_t state, dt_masks_form_t *form, int parentid, dt_masks_form_gui_t *gui, int index) { if (gui->form_selected) { //we register the current position if (gui->scrollx == 0.0f && gui->scrolly == 0.0f) { gui->scrollx = pzx; gui->scrolly = pzy; } if ((state&GDK_CONTROL_MASK) == GDK_CONTROL_MASK) { //we try to change the opacity dt_masks_form_change_opacity(form,parentid,up); } else { dt_masks_point_circle_t *circle = (dt_masks_point_circle_t *) (g_list_first(form->points)->data); if (gui->border_selected) { if(up && circle->border > 0.002f) circle->border *= 0.97f; else if(circle->border < 1.0f ) circle->border *= 1.0f/0.97f; dt_masks_write_form(form,darktable.develop); dt_masks_gui_form_remove(form,gui,index); dt_masks_gui_form_create(form,gui,index); if (form->type & DT_MASKS_CLONE) dt_conf_set_float("plugins/darkroom/spots/circle_border", circle->border); else dt_conf_set_float("plugins/darkroom/masks/circle/border", circle->border); } else if (gui->edit_mode == DT_MASKS_EDIT_FULL) { if(up && circle->radius > 0.002f) circle->radius *= 0.97f; else if(circle->radius < 1.0f ) circle->radius *= 1.0f/0.97f; dt_masks_write_form(form,darktable.develop); dt_masks_gui_form_remove(form,gui,index); dt_masks_gui_form_create(form,gui,index); if (form->type & DT_MASKS_CLONE) dt_conf_set_float("plugins/darkroom/spots/circle_size", circle->radius); else dt_conf_set_float("plugins/darkroom/masks/circle/size", circle->radius); } else { return 0; } dt_masks_update_image(darktable.develop); } return 1; } return 0; }
static int dt_gradient_events_mouse_scrolled(struct dt_iop_module_t *module, float pzx, float pzy, int up, uint32_t state, dt_masks_form_t *form, int parentid, dt_masks_form_gui_t *gui, int index) { if (gui->form_selected) { //we register the current position if (gui->scrollx == 0.0f && gui->scrolly == 0.0f) { gui->scrollx = pzx; gui->scrolly = pzy; } if ((state&GDK_CONTROL_MASK) == GDK_CONTROL_MASK) { //we try to change the opacity dt_masks_form_change_opacity(form,parentid,up); } else if(gui->edit_mode == DT_MASKS_EDIT_FULL) { dt_masks_point_gradient_t *gradient = (dt_masks_point_gradient_t *) (g_list_first(form->points)->data); if(up) gradient->compression = fmaxf(gradient->compression, 0.001f) * 0.8f; else gradient->compression = fminf(fmaxf(gradient->compression, 0.001f) * 1.0f/0.8f, 1.0f); dt_masks_write_form(form,darktable.develop); dt_masks_gui_form_remove(form,gui,index); dt_masks_gui_form_create(form,gui,index); dt_conf_set_float("plugins/darkroom/masks/gradient/compression", gradient->compression); dt_masks_update_image(darktable.develop); } 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) { dt_masks_init_formgui(darktable.develop); //we hide the form if (!(darktable.develop->form_visible->type & DT_MASKS_GROUP)) darktable.develop->form_visible = NULL; else if (g_list_length(darktable.develop->form_visible->points) < 2) darktable.develop->form_visible = NULL; else { 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); break; } forms = g_list_next(forms); } } //we remove the shape dt_masks_form_remove(module,dt_masks_get_from_id(darktable.develop,parentid),form); dt_dev_masks_list_remove(darktable.develop,form->formid,parentid); 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); 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) { dt_masks_point_circle_t *circle = (dt_masks_point_circle_t *) (g_list_first(form->points)->data); form->source[0] = circle->center[0] + circle->radius; form->source[1] = circle->center[1] - circle->radius; gui->scrollx = gui->scrolly = 0.0; } 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); return 1; } return 0; }
static int dt_ellipse_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 ellipse dt_masks_point_ellipse_t *ellipse = (dt_masks_point_ellipse_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); ellipse->center[0] = pts[0] / darktable.develop->preview_pipe->iwidth; ellipse->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); return 1; } else if(gui->border_toggling) { // we get the ellipse dt_masks_point_ellipse_t *ellipse = (dt_masks_point_ellipse_t *)(g_list_first(form->points)->data); // we end the border toggling gui->border_toggling = FALSE; // toggle feathering type of border and adjust border radius accordingly if(ellipse->flags & DT_MASKS_ELLIPSE_PROPORTIONAL) { const float min_radius = fmin(ellipse->radius[0], ellipse->radius[1]); ellipse->border = ellipse->border * min_radius; ellipse->border = CLAMP(ellipse->border, 0.001f, 1.0f); ellipse->flags &= ~DT_MASKS_ELLIPSE_PROPORTIONAL; } else { const float min_radius = fmin(ellipse->radius[0], ellipse->radius[1]); ellipse->border = ellipse->border/min_radius; ellipse->border = CLAMP(ellipse->border, 0.001f/min_radius, 1.0f/min_radius); ellipse->flags |= DT_MASKS_ELLIPSE_PROPORTIONAL; } if(form->type & DT_MASKS_CLONE) { dt_conf_set_int("plugins/darkroom/spots/ellipse_flags", ellipse->flags); dt_conf_set_float("plugins/darkroom/spots/ellipse_border", ellipse->border); } else { dt_conf_set_int("plugins/darkroom/masks/ellipse/flags", ellipse->flags); dt_conf_set_float("plugins/darkroom/masks/ellipse/border", ellipse->border); } 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 new parameters dt_masks_update_image(darktable.develop); return 1; } else if(gui->form_rotating && gui->edit_mode == DT_MASKS_EDIT_FULL) { // we get the ellipse dt_masks_point_ellipse_t *ellipse = (dt_masks_point_ellipse_t *)(g_list_first(form->points)->data); // we end the form rotating gui->form_rotating = FALSE; float wd = darktable.develop->preview_pipe->backbuf_width; float ht = darktable.develop->preview_pipe->backbuf_height; float x = pzx * wd; float y = pzy * ht; // we need the reference point dt_masks_form_gui_points_t *gpt = (dt_masks_form_gui_points_t *)g_list_nth_data(gui->points, index); if(!gpt) return 0; float xref = gpt->points[0]; float yref = gpt->points[1]; float dv = atan2(y - yref, x - xref) - atan2(-gui->dy, -gui->dx); ellipse->rotation += dv / M_PI * 180.0f; ellipse->rotation = fmodf(ellipse->rotation, 360.0f); if(form->type & DT_MASKS_CLONE) dt_conf_set_float("plugins/darkroom/spots/ellipse_rotation", ellipse->rotation); else dt_conf_set_float("plugins/darkroom/masks/ellipse/rotation", ellipse->rotation); 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 rotation dt_masks_update_image(darktable.develop); return 1; } else if(gui->point_dragging >= 1 && gui->edit_mode == DT_MASKS_EDIT_FULL) { // we get the ellipse dt_masks_point_ellipse_t *ellipse = (dt_masks_point_ellipse_t *)(g_list_first(form->points)->data); const int k = gui->point_dragging; // we end the point dragging gui->point_dragging = -1; // we need the reference points dt_masks_form_gui_points_t *gpt = (dt_masks_form_gui_points_t *)g_list_nth_data(gui->points, index); if(!gpt) return 0; const float xref = gpt->points[0]; const float yref = gpt->points[1]; const float rx = gpt->points[k * 2] - xref; const float ry = gpt->points[k * 2 + 1] - yref; const float deltax = gui->posx + gui->dx - xref; const float deltay = gui->posy + gui->dy - yref; const float r = sqrtf(rx * rx + ry * ry); const float d = (rx * deltax + ry * deltay) / r; const float s = fmaxf(r > 0.0f ? (r + d) / r : 0.0f, 0.0f); // make sure we adjust the right radius: anchor points and 1 and 2 correspond to the ellipse's longer axis if(((k == 1 || k == 2) && ellipse->radius[0] > ellipse->radius[1]) || ((k == 3 || k == 4) && ellipse->radius[0] <= ellipse->radius[1])) { ellipse->radius[0] = MAX(0.002f, ellipse->radius[0] * s); if(form->type & DT_MASKS_CLONE) dt_conf_set_float("plugins/darkroom/spots/ellipse_radius_a", ellipse->radius[0]); else dt_conf_set_float("plugins/darkroom/masks/ellipse/radius_a", ellipse->radius[0]); } else { ellipse->radius[1] = MAX(0.002f, ellipse->radius[1] * s); if(form->type & DT_MASKS_CLONE) dt_conf_set_float("plugins/darkroom/spots/ellipse_radius_b", ellipse->radius[1]); else dt_conf_set_float("plugins/darkroom/masks/ellipse/radius_b", ellipse->radius[1]); } 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 rotation dt_masks_update_image(darktable.develop); 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) { dt_masks_point_ellipse_t *ellipse = (dt_masks_point_ellipse_t *)(g_list_first(form->points)->data); form->source[0] = ellipse->center[0] + ellipse->radius[0]; form->source[1] = ellipse->center[1] - ellipse->radius[1]; gui->scrollx = gui->scrolly = 0.0; } 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); return 1; } return 0; }
static int dt_ellipse_events_mouse_scrolled(struct dt_iop_module_t *module, float pzx, float pzy, int up, uint32_t state, dt_masks_form_t *form, int parentid, dt_masks_form_gui_t *gui, int index) { if(gui->form_selected) { // we register the current position if(gui->scrollx == 0.0f && gui->scrolly == 0.0f) { gui->scrollx = pzx; gui->scrolly = pzy; } if((state & GDK_CONTROL_MASK) == GDK_CONTROL_MASK) { // we try to change the opacity dt_masks_form_change_opacity(form, parentid, up); } else { dt_masks_point_ellipse_t *ellipse = (dt_masks_point_ellipse_t *)(g_list_first(form->points)->data); if(gui->border_selected) { const float reference = (ellipse->flags & DT_MASKS_ELLIPSE_PROPORTIONAL ? 1.0f/fmin(ellipse->radius[0], ellipse->radius[1]) : 1.0f); if(up && ellipse->border > 0.001f * reference) ellipse->border *= 0.97f; else if(!up && ellipse->border < 1.0f * reference) ellipse->border *= 1.0f/0.97f; else return 1; ellipse->border = CLAMP(ellipse->border, 0.001f * reference, reference); dt_masks_write_form(form, darktable.develop); dt_masks_gui_form_remove(form, gui, index); dt_masks_gui_form_create(form, gui, index); if(form->type & DT_MASKS_CLONE) dt_conf_set_float("plugins/darkroom/spots/ellipse_border", ellipse->border); else dt_conf_set_float("plugins/darkroom/masks/ellipse/border", ellipse->border); } else if(gui->edit_mode == DT_MASKS_EDIT_FULL) { const float oldradius = ellipse->radius[0]; if(up && ellipse->radius[0] > 0.001f) ellipse->radius[0] *= 0.97f; else if(!up && ellipse->radius[0] < 1.0f) ellipse->radius[0] *= 1.0f / 0.97f; else return 1; ellipse->radius[0] = CLAMP(ellipse->radius[0], 0.001f, 1.0f); const float factor = ellipse->radius[0] / oldradius; ellipse->radius[1] *= factor; dt_masks_write_form(form, darktable.develop); dt_masks_gui_form_remove(form, gui, index); dt_masks_gui_form_create(form, gui, index); if(form->type & DT_MASKS_CLONE) { dt_conf_set_float("plugins/darkroom/spots/ellipse_radius_a", ellipse->radius[0]); dt_conf_set_float("plugins/darkroom/spots/ellipse_radius_b", ellipse->radius[1]); } else { dt_conf_set_float("plugins/darkroom/masks/ellipse/radius_a", ellipse->radius[0]); dt_conf_set_float("plugins/darkroom/masks/ellipse/radius_b", ellipse->radius[1]); } } else { return 0; } dt_masks_update_image(darktable.develop); } return 1; } return 0; }
static int dt_gradient_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) { dt_masks_clear_form_gui(darktable.develop); //we hide the form if (!(darktable.develop->form_visible->type & DT_MASKS_GROUP)) darktable.develop->form_visible = NULL; else if (g_list_length(darktable.develop->form_visible->points) < 2) darktable.develop->form_visible = NULL; else { 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); break; } forms = g_list_next(forms); } } //we remove the shape dt_masks_form_remove(module,dt_masks_get_from_id(darktable.develop,parentid),form); dt_dev_masks_list_remove(darktable.develop,form->formid,parentid); return 1; } if(gui->form_dragging && gui->edit_mode == DT_MASKS_EDIT_FULL) { //we get the gradient dt_masks_point_gradient_t *gradient = (dt_masks_point_gradient_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); gradient->anchor[0] = pts[0]/darktable.develop->preview_pipe->iwidth; gradient->anchor[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); return 1; } else if(gui->form_rotating && gui->edit_mode == DT_MASKS_EDIT_FULL) { //we get the gradient dt_masks_point_gradient_t *gradient = (dt_masks_point_gradient_t *) (g_list_first(form->points)->data); //we end the form rotating gui->form_rotating = FALSE; float wd = darktable.develop->preview_pipe->backbuf_width; float ht = darktable.develop->preview_pipe->backbuf_height; float x = pzx*wd; float y = pzy*ht; //we need the reference point dt_masks_form_gui_points_t *gpt = (dt_masks_form_gui_points_t *) g_list_nth_data(gui->points,index); if (!gpt) return 0; float xref = gpt->points[0]; float yref = gpt->points[1]; float dv = atan2(y - yref, x - xref) - atan2(-gui->dy, -gui->dx); gradient->rotation -= dv/M_PI*180.0f; 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 rotation dt_masks_update_image(darktable.develop); return 1; } return 0; }
static int dt_circle_events_mouse_scrolled(struct dt_iop_module_t *module, float pzx, float pzy, int up, uint32_t state, dt_masks_form_t *form, int parentid, dt_masks_form_gui_t *gui, int index) { // add a preview when creating a circle if(gui->creation) { if((state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK) { float masks_border; if(form->type & (DT_MASKS_CLONE | DT_MASKS_NON_CLONE)) masks_border = dt_conf_get_float("plugins/darkroom/spots/circle_border"); else masks_border = dt_conf_get_float("plugins/darkroom/masks/circle/border"); if(up && masks_border > 0.0005f) masks_border *= 0.97f; else if(!up && masks_border < 1.0f) masks_border *= 1.0f / 0.97f; if(form->type & (DT_MASKS_CLONE | DT_MASKS_NON_CLONE)) dt_conf_set_float("plugins/darkroom/spots/circle_border", masks_border); else dt_conf_set_float("plugins/darkroom/masks/circle/border", masks_border); } else if(state == 0) { float masks_size; if(form->type & (DT_MASKS_CLONE | DT_MASKS_NON_CLONE)) masks_size = dt_conf_get_float("plugins/darkroom/spots/circle_size"); else masks_size = dt_conf_get_float("plugins/darkroom/masks/circle/size"); if(up && masks_size > 0.001f) masks_size *= 0.97f; else if(!up && masks_size < 1.0f) masks_size *= 1.0f / 0.97f; if(form->type & (DT_MASKS_CLONE | DT_MASKS_NON_CLONE)) dt_conf_set_float("plugins/darkroom/spots/circle_size", masks_size); else dt_conf_set_float("plugins/darkroom/masks/circle/size", masks_size); } return 1; } if(gui->form_selected) { // we register the current position if(gui->scrollx == 0.0f && gui->scrolly == 0.0f) { gui->scrollx = pzx; gui->scrolly = pzy; } if((state & GDK_CONTROL_MASK) == GDK_CONTROL_MASK) { // we try to change the opacity dt_masks_form_change_opacity(form, parentid, up); } else { dt_masks_point_circle_t *circle = (dt_masks_point_circle_t *)(g_list_first(form->points)->data); // resize don't care where the mouse is inside a shape if((state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK) { if(up && circle->border > 0.0005f) circle->border *= 0.97f; else if(!up && circle->border < 1.0f) circle->border *= 1.0f / 0.97f; else return 1; dt_masks_write_form(form, darktable.develop); dt_masks_gui_form_remove(form, gui, index); dt_masks_gui_form_create(form, gui, index); if(form->type & (DT_MASKS_CLONE|DT_MASKS_NON_CLONE)) dt_conf_set_float("plugins/darkroom/spots/circle_border", circle->border); else dt_conf_set_float("plugins/darkroom/masks/circle/border", circle->border); } else if(gui->edit_mode == DT_MASKS_EDIT_FULL) { if(up && circle->radius > 0.001f) circle->radius *= 0.97f; else if(!up && circle->radius < 1.0f) circle->radius *= 1.0f / 0.97f; else return 1; dt_masks_write_form(form, darktable.develop); dt_masks_gui_form_remove(form, gui, index); dt_masks_gui_form_create(form, gui, index); if(form->type & (DT_MASKS_CLONE|DT_MASKS_NON_CLONE)) dt_conf_set_float("plugins/darkroom/spots/circle_size", circle->radius); else dt_conf_set_float("plugins/darkroom/masks/circle/size", circle->radius); } else { return 0; } dt_masks_update_image(darktable.develop); } return 1; } return 0; }