/** * gimp_display_shell_scale_resize: * @shell: the #GimpDisplayShell * @resize_window: whether the display window should be resized * @grow_only: whether shrinking of the window is allowed or not * * Function commonly called after a change in display scale to make the changes * visible to the user. If @resize_window is %TRUE then the display window is * resized to accommodate the display image as per * gimp_display_shell_shrink_wrap(). **/ void gimp_display_shell_scale_resize (GimpDisplayShell *shell, gboolean resize_window, gboolean grow_only) { g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell)); /* freeze the active tool */ gimp_display_shell_pause (shell); if (resize_window) { GimpImageWindow *window = gimp_display_shell_get_window (shell); if (window && gimp_image_window_get_active_shell (window) == shell) { gimp_image_window_shrink_wrap (window, grow_only); } } gimp_display_shell_scroll_clamp_and_update (shell); gimp_display_shell_scaled (shell); gimp_display_shell_expose_full (shell); /* re-enable the active tool */ gimp_display_shell_resume (shell); }
/** * gimp_display_shell_scroll_set_offsets: * @shell: * @offset_x: * @offset_y: * * This function scrolls the image in the shell's viewport. It redraws * the entire canvas. * * Use it for setting the scroll offset on freshly scaled images or * when the window is resized. For panning, use * gimp_display_shell_scroll(). **/ void gimp_display_shell_scroll_set_offset (GimpDisplayShell *shell, gint offset_x, gint offset_y) { g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell)); if (shell->offset_x == offset_x && shell->offset_y == offset_y) return; gimp_display_shell_scale_save_revert_values (shell); /* freeze the active tool */ gimp_display_shell_pause (shell); shell->offset_x = offset_x; shell->offset_y = offset_y; gimp_display_shell_scroll_clamp_and_update (shell); gimp_display_shell_scrolled (shell); gimp_display_shell_expose_full (shell); /* re-enable the active tool */ gimp_display_shell_resume (shell); }
/** * gimp_display_shell_scale_by_values: * @shell: the #GimpDisplayShell * @scale: the new scale * @offset_x: the new X offset * @offset_y: the new Y offset * @resize_window: whether the display window should be resized * * Directly sets the image scale and image offsets used by the display. If * @resize_window is %TRUE then the display window is resized to better * accommodate the image, see gimp_display_shell_shrink_wrap(). **/ void gimp_display_shell_scale_by_values (GimpDisplayShell *shell, gdouble scale, gint offset_x, gint offset_y, gboolean resize_window) { g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell)); /* Abort early if the values are all setup already. We don't * want to inadvertently resize the window (bug #164281). */ if (SCALE_EQUALS (gimp_zoom_model_get_factor (shell->zoom), scale) && shell->offset_x == offset_x && shell->offset_y == offset_y) return; gimp_display_shell_scale_save_revert_values (shell); /* freeze the active tool */ gimp_display_shell_pause (shell); gimp_zoom_model_zoom (shell->zoom, GIMP_ZOOM_TO, scale); shell->offset_x = offset_x; shell->offset_y = offset_y; gimp_display_shell_scale_resize (shell, resize_window, FALSE); /* re-enable the active tool */ gimp_display_shell_resume (shell); }
/** * gimp_display_shell_scale_set_dot_for_dot: * @shell: the #GimpDisplayShell * @dot_for_dot: whether "Dot for Dot" should be enabled * * If @dot_for_dot is set to %TRUE then the "Dot for Dot" mode (where image and * screen pixels are of the same size) is activated. Dually, the mode is * disabled if @dot_for_dot is %FALSE. **/ void gimp_display_shell_scale_set_dot_for_dot (GimpDisplayShell *shell, gboolean dot_for_dot) { g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell)); if (dot_for_dot != shell->dot_for_dot) { GimpDisplayConfig *config = shell->display->config; gboolean resize_window; /* Resize windows only in multi-window mode */ resize_window = (config->resize_windows_on_zoom && ! GIMP_GUI_CONFIG (config)->single_window_mode); /* freeze the active tool */ gimp_display_shell_pause (shell); shell->dot_for_dot = dot_for_dot; gimp_display_shell_scale_update (shell); gimp_display_shell_scale_resize (shell, resize_window, FALSE); /* re-enable the active tool */ gimp_display_shell_resume (shell); } }
void gimp_display_shell_scroll (GimpDisplayShell *shell, gint x_offset, gint y_offset) { gint old_x; gint old_y; g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell)); if (x_offset == 0 && y_offset == 0) return; old_x = shell->offset_x; old_y = shell->offset_y; shell->offset_x += x_offset; shell->offset_y += y_offset; gimp_display_shell_scroll_clamp_offsets (shell); /* the actual changes in offset */ x_offset = (shell->offset_x - old_x); y_offset = (shell->offset_y - old_y); if (x_offset || y_offset) { /* reset the old values so that the tool can accurately redraw */ shell->offset_x = old_x; shell->offset_y = old_y; gimp_display_shell_pause (shell); /* set the offsets back to the new values */ shell->offset_x += x_offset; shell->offset_y += y_offset; gimp_display_shell_rotate_update_transform (shell); gimp_overlay_box_scroll (GIMP_OVERLAY_BOX (shell->canvas), -x_offset, -y_offset); /* Update scrollbars and rulers */ gimp_display_shell_scale_update_scrollbars (shell); gimp_display_shell_scale_update_rulers (shell); gimp_display_shell_resume (shell); gimp_display_shell_scrolled (shell); } }
/** * gimp_display_shell_scale_to: * @shell: * @scale: * @viewport_x: * @viewport_y: * * Zooms. The display offsets are adjusted so that the point specified * by @x and @y doesn't change it's position on screen. **/ static void gimp_display_shell_scale_to (GimpDisplayShell *shell, gdouble scale, gdouble viewport_x, gdouble viewport_y) { gdouble image_x, image_y; gdouble new_viewport_x, new_viewport_y; g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell)); if (! shell->display) return; /* freeze the active tool */ gimp_display_shell_pause (shell); gimp_display_shell_untransform_xy_f (shell, viewport_x, viewport_y, &image_x, &image_y); /* Note that we never come here if we need to resize_windows_on_zoom */ gimp_display_shell_scale_by_values (shell, scale, shell->offset_x, shell->offset_y, FALSE); gimp_display_shell_transform_xy_f (shell, image_x, image_y, &new_viewport_x, &new_viewport_y); gimp_display_shell_scroll (shell, new_viewport_x - viewport_x, new_viewport_y - viewport_y); /* re-enable the active tool */ gimp_display_shell_resume (shell); }
/** * gimp_display_shell_scroll: * @shell: * @x_offset: * @y_offset: * * This function scrolls the image in the shell's viewport. It does * actual scrolling of the pixels, so only the newly scrolled-in parts * are freshly redrawn. * * Use it for incremental actual panning. **/ void gimp_display_shell_scroll (GimpDisplayShell *shell, gint x_offset, gint y_offset) { gint old_x; gint old_y; g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell)); if (x_offset == 0 && y_offset == 0) return; old_x = shell->offset_x; old_y = shell->offset_y; /* freeze the active tool */ gimp_display_shell_pause (shell); shell->offset_x += x_offset; shell->offset_y += y_offset; gimp_display_shell_scroll_clamp_and_update (shell); /* the actual changes in offset */ x_offset = (shell->offset_x - old_x); y_offset = (shell->offset_y - old_y); if (x_offset || y_offset) { gimp_display_shell_scrolled (shell); gimp_overlay_box_scroll (GIMP_OVERLAY_BOX (shell->canvas), -x_offset, -y_offset); } /* re-enable the active tool */ gimp_display_shell_resume (shell); }
/** * gimp_display_shell_scale_set_dot_for_dot: * @shell: the #GimpDisplayShell * @dot_for_dot: whether "Dot for Dot" should be enabled * * If @dot_for_dot is set to %TRUE then the "Dot for Dot" mode (where image and * screen pixels are of the same size) is activated. Dually, the mode is * disabled if @dot_for_dot is %FALSE. **/ void gimp_display_shell_scale_set_dot_for_dot (GimpDisplayShell *shell, gboolean dot_for_dot) { g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell)); if (dot_for_dot != shell->dot_for_dot) { /* freeze the active tool */ gimp_display_shell_pause (shell); shell->dot_for_dot = dot_for_dot; gimp_display_shell_scale_changed (shell); gimp_display_shell_scale_resize (shell, shell->display->config->resize_windows_on_zoom, FALSE); /* re-enable the active tool */ gimp_display_shell_resume (shell); } }