[gimp/blend-tool-fun: 137/163] app: add gimp_display_shell_scale_to_rectangle()
- From: Michael Henning <mhenning src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp/blend-tool-fun: 137/163] app: add gimp_display_shell_scale_to_rectangle()
- Date: Mon, 26 Oct 2015 02:29:45 +0000 (UTC)
commit af32114dd9ad755eb69679edf45284e70688c474
Author: Michael Natterer <mitch gimp org>
Date: Sun Oct 18 14:59:30 2015 +0200
app: add gimp_display_shell_scale_to_rectangle()
and move the magnify tool's rectangle zoom logic to the new function.
app/display/gimpdisplayshell-scale.c | 127 ++++++++++++++++++++++++++++++++++
app/display/gimpdisplayshell-scale.h | 7 ++
app/tools/gimpmagnifytool.c | 116 +++----------------------------
3 files changed, 143 insertions(+), 107 deletions(-)
---
diff --git a/app/display/gimpdisplayshell-scale.c b/app/display/gimpdisplayshell-scale.c
index 2a0d767..506bfe8 100644
--- a/app/display/gimpdisplayshell-scale.c
+++ b/app/display/gimpdisplayshell-scale.c
@@ -497,6 +497,133 @@ gimp_display_shell_scale (GimpDisplayShell *shell,
}
/**
+ * gimp_display_shell_scale_to_rectangle:
+ * @shell: the #GimpDisplayShell
+ * @zoom_type: whether to zoom in or out
+ * @x: retangle's x in image coordinates
+ * @y: retangle's y in image coordinates
+ * @width: retangle's width in image coordinates
+ * @height: retangle's height in image coordinates
+ * @resize_window: whether the display window should be resized
+ *
+ * Scales and scrolls to a specific image rectangle
+ **/
+void
+gimp_display_shell_scale_to_rectangle (GimpDisplayShell *shell,
+ GimpZoomType zoom_type,
+ gdouble x,
+ gdouble y,
+ gdouble width,
+ gdouble height,
+ gboolean resize_window)
+{
+ gdouble current_scale;
+ gdouble new_scale;
+ gdouble display_width;
+ gdouble display_height;
+ gdouble factor = 1.0;
+
+ g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
+
+ width = MAX (1.0, width);
+ height = MAX (1.0, height);
+
+ current_scale = gimp_zoom_model_get_factor (shell->zoom);
+
+ display_width = FUNSCALEX (shell, shell->disp_width);
+ display_height = FUNSCALEY (shell, shell->disp_height);
+
+ switch (zoom_type)
+ {
+ case GIMP_ZOOM_IN:
+ factor = MIN ((display_width / width),
+ (display_height / height));
+ break;
+
+ case GIMP_ZOOM_OUT:
+ factor = MAX ((width / display_width),
+ (height / display_height));
+ break;
+
+ default:
+ g_return_if_reached ();
+ break;
+ }
+
+ new_scale = current_scale * factor;
+
+ if (new_scale != current_scale)
+ {
+ GimpImage *image = gimp_display_get_image (shell->display);
+ gint offset_x = 0;
+ gint offset_y = 0;
+ gdouble xres;
+ gdouble yres;
+ gdouble screen_xres;
+ gdouble screen_yres;
+
+ gimp_image_get_resolution (image, &xres, &yres);
+ gimp_display_shell_get_screen_resolution (shell,
+ &screen_xres, &screen_yres);
+
+ switch (zoom_type)
+ {
+ case GIMP_ZOOM_IN:
+ /* move the center of the rectangle to the center of the
+ * viewport:
+ *
+ * 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 * (x + width / 2.0) *
+ screen_xres / xres -
+ (shell->disp_width / 2.0));
+
+ offset_y = RINT (new_scale * (y + height / 2.0) *
+ screen_yres / yres -
+ (shell->disp_height / 2.0));
+ break;
+
+ case GIMP_ZOOM_OUT:
+ /* 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 / xres -
+ (SCALEX (shell, x + width / 2.0) -
+ shell->offset_x));
+
+ offset_y = RINT (new_scale * UNSCALEY (shell,
+ shell->offset_y +
+ shell->disp_height / 2.0) *
+ screen_yres / yres -
+ (SCALEY (shell, y + height / 2.0) -
+ shell->offset_y));
+ break;
+
+ default:
+ break;
+ }
+
+ gimp_display_shell_scale_by_values (shell,
+ new_scale,
+ offset_x, offset_y,
+ resize_window);
+ }
+}
+
+/**
* gimp_display_shell_scale_fit_in:
* @shell: the #GimpDisplayShell
*
diff --git a/app/display/gimpdisplayshell-scale.h b/app/display/gimpdisplayshell-scale.h
index 6458428..f3d7532 100644
--- a/app/display/gimpdisplayshell-scale.h
+++ b/app/display/gimpdisplayshell-scale.h
@@ -43,6 +43,13 @@ void gimp_display_shell_scale (GimpDisplayShell *sh
GimpZoomType zoom_type,
gdouble scale,
GimpZoomFocus zoom_focus);
+void gimp_display_shell_scale_to_rectangle (GimpDisplayShell *shell,
+ GimpZoomType zoom_type,
+ gdouble x,
+ gdouble y,
+ gdouble width,
+ gdouble height,
+ gboolean resize_window);
void gimp_display_shell_scale_fit_in (GimpDisplayShell *shell);
gboolean gimp_display_shell_scale_image_is_within_viewport (GimpDisplayShell *shell,
gboolean *horizontally,
diff --git a/app/tools/gimpmagnifytool.c b/app/tools/gimpmagnifytool.c
index 3972232..48b3dbb 100644
--- a/app/tools/gimpmagnifytool.c
+++ b/app/tools/gimpmagnifytool.c
@@ -183,116 +183,18 @@ gimp_magnify_tool_button_release (GimpTool *tool,
case GIMP_BUTTON_RELEASE_NORMAL:
{
- gdouble x1, y1, x2, y2;
+ gdouble x, y;
gdouble width, height;
- gdouble current_scale;
- gdouble new_scale;
- gdouble display_width;
- gdouble display_height;
- gdouble factor = 1.0;
-
- x1 = (magnify->w < 0) ? magnify->x + magnify->w : magnify->x;
- y1 = (magnify->h < 0) ? magnify->y + magnify->h : magnify->y;
+
+ x = (magnify->w < 0) ? magnify->x + magnify->w : magnify->x;
+ y = (magnify->h < 0) ? magnify->y + magnify->h : magnify->y;
width = (magnify->w < 0) ? -magnify->w : magnify->w;
height = (magnify->h < 0) ? -magnify->h : magnify->h;
- x2 = x1 + width;
- y2 = y1 + height;
-
- width = MAX (1.0, width);
- height = MAX (1.0, height);
-
- current_scale = gimp_zoom_model_get_factor (shell->zoom);
-
- display_width = FUNSCALEX (shell, shell->disp_width);
- display_height = FUNSCALEY (shell, shell->disp_height);
-
- switch (options->zoom_type)
- {
- case GIMP_ZOOM_IN:
- factor = MIN ((display_width / width),
- (display_height / height));
- break;
-
- case GIMP_ZOOM_OUT:
- factor = MAX ((width / display_width),
- (height / display_height));
- break;
-
- default:
- break;
- }
-
- new_scale = current_scale * factor;
-
- if (new_scale != current_scale)
- {
- gint offset_x = 0;
- gint offset_y = 0;
- gdouble xres;
- gdouble yres;
- gdouble screen_xres;
- gdouble screen_yres;
-
- gimp_image_get_resolution (gimp_display_get_image (display),
- &xres, &yres);
- gimp_display_shell_get_screen_resolution (shell,
- &screen_xres, &screen_yres);
-
- switch (options->zoom_type)
- {
- case GIMP_ZOOM_IN:
- /* move the center of the rectangle to the center of the
- * viewport:
- *
- * 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 / xres -
- (shell->disp_width / 2.0));
-
- offset_y = RINT (new_scale * ((y1 + y2) / 2.0) *
- screen_yres / yres -
- (shell->disp_height / 2.0));
- break;
-
- case GIMP_ZOOM_OUT:
- /* 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 / 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 / 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_to_rectangle (shell,
+ options->zoom_type,
+ x, y, width, height,
+ options->auto_resize);
}
break;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]