/** * 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, gint viewport_x, gint viewport_y) { gdouble scale_x, scale_y; gdouble image_focus_x, image_focus_y; gint target_offset_x, target_offset_y; g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell)); if (! shell->display) return; gimp_display_shell_untransform_xy_f (shell, viewport_x, viewport_y, &image_focus_x, &image_focus_y); gimp_display_shell_calculate_scale_x_and_y (shell, scale, &scale_x, &scale_y); target_offset_x = scale_x * image_focus_x - viewport_x; target_offset_y = scale_y * image_focus_y - viewport_y; /* Note that we never come here if we need to * resize_windows_on_zoom */ gimp_display_shell_scale_by_values (shell, scale, target_offset_x, target_offset_y, FALSE); }
/** * gimp_display_shell_scale_get_image_size_for_scale: * @shell: * @scale: * @w: * @h: * **/ static void gimp_display_shell_scale_get_image_size_for_scale (GimpDisplayShell *shell, gdouble scale, gint *w, gint *h) { GimpImage *image = gimp_display_get_image (shell->display); gdouble scale_x; gdouble scale_y; gimp_display_shell_calculate_scale_x_and_y (shell, scale, &scale_x, &scale_y); if (w) *w = scale_x * gimp_image_get_width (image); if (h) *h = scale_y * gimp_image_get_height (image); }
/* We used to calculate the scale factor in the SCALEFACTOR_X() and * SCALEFACTOR_Y() macros. But since these are rather frequently * called and the values rarely change, we now store them in the * shell and call this function whenever they need to be recalculated. */ void gimp_display_shell_scale_update (GimpDisplayShell *shell) { GimpImage *image; g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell)); image = gimp_display_get_image (shell->display); if (image) { gimp_display_shell_calculate_scale_x_and_y (shell, gimp_zoom_model_get_factor (shell->zoom), &shell->scale_x, &shell->scale_y); } else { shell->scale_x = 1.0; shell->scale_y = 1.0; } }