Bug 556603 – Zoom region always zooms in center of image

* app/tools/gimpmagnifytool.c (gimp_magnify_tool_button_release):
When zooming with a click, use gimp_display_shell_scale() instead
of local zoom logic.

svn path=/trunk/; revision=27452
This commit is contained in:
Martin Nordholts
2008-10-28 18:12:20 +00:00
parent 807a12b10e
commit cf660f3e94
2 changed files with 70 additions and 60 deletions

View File

@ -14,6 +14,14 @@
* app/widgets/gimpfilleditor.c: pass FALSE if we are editing the * app/widgets/gimpfilleditor.c: pass FALSE if we are editing the
context's "foreground" and "pattern" properties. context's "foreground" and "pattern" properties.
2008-10-28 Martin Nordholts <martinn@svn.gnome.org>
Bug 556603 Zoom region always zooms in center of image
* app/tools/gimpmagnifytool.c (gimp_magnify_tool_button_release):
When zooming with a click, use gimp_display_shell_scale() instead
of local zoom logic.
2008-10-28 Martin Nordholts <martinn@svn.gnome.org> 2008-10-28 Martin Nordholts <martinn@svn.gnome.org>
* app/gegl/gimpoperationpointlayermode.c * app/gegl/gimpoperationpointlayermode.c

View File

@ -190,8 +190,10 @@ gimp_magnify_tool_button_release (GimpTool *tool,
if (release_type == GIMP_BUTTON_RELEASE_CLICK || if (release_type == GIMP_BUTTON_RELEASE_CLICK ||
release_type == GIMP_BUTTON_RELEASE_NO_MOTION) release_type == GIMP_BUTTON_RELEASE_NO_MOTION)
{ {
new_scale = gimp_zoom_model_zoom_step (options->zoom_type, gimp_display_shell_scale (shell,
current_scale); options->zoom_type,
0.0,
GIMP_ZOOM_FOCUS_BEST_GUESS);
} }
else else
{ {
@ -219,71 +221,71 @@ gimp_magnify_tool_button_release (GimpTool *tool,
} }
new_scale = current_scale * factor; new_scale = current_scale * factor;
}
if (new_scale != current_scale) if (new_scale != current_scale)
{
gdouble xres;
gdouble yres;
gint offset_x = 0;
gint offset_y = 0;
gimp_image_get_resolution (display->image, &xres, &yres);
switch (options->zoom_type)
{ {
case GIMP_ZOOM_IN: gdouble xres;
/* move the center of the rectangle to the center of the gdouble yres;
* viewport: gint offset_x = 0;
* gint offset_y = 0;
* new_offset = center of rectangle in new scale screen coords
* including offset
* -
* center of viewport in screen coords without
* offset
*/
offset_x = RINT (new_scale * ((x1 + x2) / 2.0) *
SCREEN_XRES (shell) / xres -
(shell->disp_width / 2.0));
offset_y = RINT (new_scale * ((y1 + y2) / 2.0) * gimp_image_get_resolution (display->image, &xres, &yres);
SCREEN_YRES (shell) / yres -
(shell->disp_height / 2.0));
break;
case GIMP_ZOOM_OUT: switch (options->zoom_type)
/* move the center of the viewport to the center of the {
* rectangle: case GIMP_ZOOM_IN:
* /* move the center of the rectangle to the center of the
* new_offset = center of viewport in new scale screen coords * viewport:
* including offset *
* - * new_offset = center of rectangle in new scale screen coords
* center of rectangle in screen coords without * including offset
* offset * -
*/ * center of viewport in screen coords without
offset_x = RINT (new_scale * UNSCALEX (shell, * offset
shell->offset_x + */
shell->disp_width / 2.0) * offset_x = RINT (new_scale * ((x1 + x2) / 2.0) *
SCREEN_XRES (shell) / xres - SCREEN_XRES (shell) / xres -
(SCALEX (shell, (x1 + x2) / 2.0) - (shell->disp_width / 2.0));
shell->offset_x));
offset_y = RINT (new_scale * UNSCALEY (shell, offset_y = RINT (new_scale * ((y1 + y2) / 2.0) *
shell->offset_y + SCREEN_YRES (shell) / yres -
shell->disp_height / 2.0) * (shell->disp_height / 2.0));
SCREEN_YRES (shell) / yres - break;
(SCALEY (shell, (y1 + y2) / 2.0) -
shell->offset_y));
break;
default: case GIMP_ZOOM_OUT:
break; /* move the center of the viewport to the center of the
* rectangle:
*
* new_offset = center of viewport in new scale screen coords
* including offset
* -
* center of rectangle in screen coords without
* offset
*/
offset_x = RINT (new_scale * UNSCALEX (shell,
shell->offset_x +
shell->disp_width / 2.0) *
SCREEN_XRES (shell) / xres -
(SCALEX (shell, (x1 + x2) / 2.0) -
shell->offset_x));
offset_y = RINT (new_scale * UNSCALEY (shell,
shell->offset_y +
shell->disp_height / 2.0) *
SCREEN_YRES (shell) / yres -
(SCALEY (shell, (y1 + y2) / 2.0) -
shell->offset_y));
break;
default:
break;
}
gimp_display_shell_scale_by_values (shell,
new_scale,
offset_x, offset_y,
options->auto_resize);
} }
gimp_display_shell_scale_by_values (shell,
new_scale,
offset_x, offset_y,
options->auto_resize);
} }
} }
} }