static void gimp_flip_tool_modifier_key (GimpTool *tool, GdkModifierType key, gboolean press, GdkModifierType state, GimpDisplay *display) { GimpFlipOptions *options = GIMP_FLIP_TOOL_GET_OPTIONS (tool); if (key == gimp_get_toggle_behavior_mask ()) { switch (options->flip_type) { case GIMP_ORIENTATION_HORIZONTAL: g_object_set (options, "flip-type", GIMP_ORIENTATION_VERTICAL, NULL); break; case GIMP_ORIENTATION_VERTICAL: g_object_set (options, "flip-type", GIMP_ORIENTATION_HORIZONTAL, NULL); break; default: break; } } }
static void gimp_flip_tool_oper_update (GimpTool *tool, const GimpCoords *coords, GdkModifierType state, gboolean proximity, GimpDisplay *display) { GimpFlipTool *flip = GIMP_FLIP_TOOL (tool); GimpDrawTool *draw_tool = GIMP_DRAW_TOOL (tool); GimpFlipOptions *options = GIMP_FLIP_TOOL_GET_OPTIONS (tool); GimpDisplayShell *shell = gimp_display_get_shell (display); GimpImage *image = gimp_display_get_image (display); GimpGuide *guide = NULL; if (gimp_display_shell_get_show_guides (shell) && proximity) { gint snap_distance = display->config->snap_distance; guide = gimp_image_pick_guide (image, coords->x, coords->y, FUNSCALEX (shell, snap_distance), FUNSCALEY (shell, snap_distance)); } if (flip->guide != guide || (guide && ! gimp_draw_tool_is_active (draw_tool))) { gimp_draw_tool_pause (draw_tool); if (gimp_draw_tool_is_active (draw_tool) && draw_tool->display != display) gimp_draw_tool_stop (draw_tool); flip->guide = guide; if (! gimp_draw_tool_is_active (draw_tool)) gimp_draw_tool_start (draw_tool, display); gimp_draw_tool_resume (draw_tool); } gtk_widget_set_sensitive (options->direction_frame, guide == NULL); GIMP_TOOL_CLASS (parent_class)->oper_update (tool, coords, state, proximity, display); }
static GimpOrientationType gimp_flip_tool_get_flip_type (GimpFlipTool *flip) { GimpFlipOptions *options = GIMP_FLIP_TOOL_GET_OPTIONS (flip); if (flip->guide) { switch (gimp_guide_get_orientation (flip->guide)) { case GIMP_ORIENTATION_HORIZONTAL: return GIMP_ORIENTATION_VERTICAL; case GIMP_ORIENTATION_VERTICAL: return GIMP_ORIENTATION_HORIZONTAL; default: return gimp_guide_get_orientation (flip->guide); } } else { return options->flip_type; } }
static void gimp_flip_tool_cursor_update (GimpTool *tool, GimpCoords *coords, GdkModifierType state, GimpDisplay *display) { GimpFlipOptions *options = GIMP_FLIP_TOOL_GET_OPTIONS (tool); GimpCursorModifier modifier = GIMP_CURSOR_MODIFIER_BAD; if (gimp_image_coords_in_active_pickable (display->image, coords, FALSE, TRUE)) { modifier = GIMP_CURSOR_MODIFIER_NONE; } gimp_tool_control_set_cursor_modifier (tool->control, modifier); gimp_tool_control_set_toggle_cursor_modifier (tool->control, modifier); gimp_tool_control_set_toggled (tool->control, options->flip_type == GIMP_ORIENTATION_VERTICAL); GIMP_TOOL_CLASS (parent_class)->cursor_update (tool, coords, state, display); }
static GeglBuffer * gimp_flip_tool_transform (GimpTransformTool *tr_tool, GimpItem *active_item, GeglBuffer *orig_buffer, gint orig_offset_x, gint orig_offset_y, GimpColorProfile **buffer_profile, gint *new_offset_x, gint *new_offset_y) { GimpFlipTool *flip = GIMP_FLIP_TOOL (tr_tool); GimpFlipOptions *options = GIMP_FLIP_TOOL_GET_OPTIONS (tr_tool); GimpTransformOptions *tr_options = GIMP_TRANSFORM_TOOL_GET_OPTIONS (tr_tool); GimpContext *context = GIMP_CONTEXT (options); GimpOrientationType flip_type = GIMP_ORIENTATION_UNKNOWN; gdouble axis = 0.0; gboolean clip_result = FALSE; GeglBuffer *ret = NULL; flip_type = gimp_flip_tool_get_flip_type (flip); if (flip->guide) { axis = gimp_guide_get_position (flip->guide); } else { switch (flip_type) { case GIMP_ORIENTATION_HORIZONTAL: axis = ((gdouble) tr_tool->x1 + (gdouble) (tr_tool->x2 - tr_tool->x1) / 2.0); break; case GIMP_ORIENTATION_VERTICAL: axis = ((gdouble) tr_tool->y1 + (gdouble) (tr_tool->y2 - tr_tool->y1) / 2.0); break; default: break; } } switch (tr_options->clip) { case GIMP_TRANSFORM_RESIZE_ADJUST: clip_result = FALSE; break; case GIMP_TRANSFORM_RESIZE_CLIP: clip_result = TRUE; break; default: g_return_val_if_reached (NULL); } if (orig_buffer) { /* this happens when transforming a selection cut out of a * normal drawable, or the selection */ /* always clip the selection and unfloated channels * so they keep their size */ if (GIMP_IS_CHANNEL (active_item) && ! babl_format_has_alpha (gegl_buffer_get_format (orig_buffer))) clip_result = TRUE; ret = gimp_drawable_transform_buffer_flip (GIMP_DRAWABLE (active_item), context, orig_buffer, orig_offset_x, orig_offset_y, flip_type, axis, clip_result, buffer_profile, new_offset_x, new_offset_y); } else { /* this happens for entire drawables, paths and layer groups */ /* always clip layer masks so they keep their size */ if (GIMP_IS_CHANNEL (active_item)) clip_result = TRUE; if (gimp_item_get_linked (active_item)) { gimp_item_linked_flip (active_item, context, flip_type, axis, clip_result); } else { gimp_item_flip (active_item, context, flip_type, axis, clip_result); } } return ret; }
static TileManager * gimp_flip_tool_transform (GimpTransformTool *trans_tool, GimpItem *active_item, gboolean mask_empty, GimpDisplay *display) { GimpFlipOptions *options = GIMP_FLIP_TOOL_GET_OPTIONS (trans_tool); GimpTransformOptions *tr_options = GIMP_TRANSFORM_OPTIONS (options); GimpContext *context = GIMP_CONTEXT (options); gdouble axis = 0.0; TileManager *ret = NULL; switch (options->flip_type) { case GIMP_ORIENTATION_HORIZONTAL: axis = ((gdouble) trans_tool->x1 + (gdouble) (trans_tool->x2 - trans_tool->x1) / 2.0); break; case GIMP_ORIENTATION_VERTICAL: axis = ((gdouble) trans_tool->y1 + (gdouble) (trans_tool->y2 - trans_tool->y1) / 2.0); break; default: break; } if (gimp_item_get_linked (active_item)) gimp_item_linked_flip (active_item, context, options->flip_type, axis, FALSE); if (GIMP_IS_LAYER (active_item) && gimp_layer_get_mask (GIMP_LAYER (active_item)) && mask_empty) { GimpLayerMask *mask = gimp_layer_get_mask (GIMP_LAYER (active_item)); gimp_item_flip (GIMP_ITEM (mask), context, options->flip_type, axis, FALSE); } switch (tr_options->type) { case GIMP_TRANSFORM_TYPE_LAYER: case GIMP_TRANSFORM_TYPE_SELECTION: if (trans_tool->original) ret = gimp_drawable_transform_tiles_flip (GIMP_DRAWABLE (active_item), context, trans_tool->original, options->flip_type, axis, FALSE); break; case GIMP_TRANSFORM_TYPE_PATH: gimp_item_flip (active_item, context, options->flip_type, axis, FALSE); break; } return ret; }