1997-11-25 06:05:25 +08:00
|
|
|
/* The GIMP -- an image manipulation program
|
|
|
|
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
1998-04-13 13:44:11 +08:00
|
|
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
1997-11-25 06:05:25 +08:00
|
|
|
*/
|
2000-12-17 05:37:03 +08:00
|
|
|
|
|
|
|
#include "config.h"
|
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
#include <stdlib.h>
|
2000-01-26 07:06:12 +08:00
|
|
|
|
2000-12-29 23:22:01 +08:00
|
|
|
#include <gtk/gtk.h>
|
2000-12-17 05:37:03 +08:00
|
|
|
|
2001-05-21 21:58:46 +08:00
|
|
|
#include "libgimpbase/gimpbase.h"
|
2003-04-04 16:32:51 +08:00
|
|
|
#include "libgimpwidgets/gimpwidgets.h"
|
2001-05-21 21:58:46 +08:00
|
|
|
|
2001-09-26 07:23:09 +08:00
|
|
|
#include "display-types.h"
|
2000-12-17 05:37:03 +08:00
|
|
|
|
2002-11-19 04:50:31 +08:00
|
|
|
#include "config/gimpdisplayconfig.h"
|
|
|
|
|
|
|
|
#include "core/gimp.h"
|
2001-05-09 10:32:03 +08:00
|
|
|
#include "core/gimpimage.h"
|
|
|
|
|
include the new "paint-funcs/paint-funcs-types.h".
2001-11-28 Michael Natterer <mitch@gimp.org>
* app/base/base-types.h: include the new
"paint-funcs/paint-funcs-types.h".
* app/paint-funcs/Makefile.am
* app/paint-funcs/paint-funcs-types.h: new file. Includes
"base/base-types.h".
* app/paint-funcs/paint-funcs.[ch]: removed the enums here,
include "paint-funcs-types.h".
* app/widgets/widgets-types.h: include "display/display-types.h"
* app/display/display-types.h: include "widgets/widgets-types.h".
* app/tools/tools-types.h: include "display/display-types.h"
* app/gui/gui-types.h: include "tools/tools-types.h".
The order of namespaces/dependencies should be (but is not):
(base, paint-funcs) -> (core, file, xcf, pdb) ->
(widgets, display) -> tools -> gui
* app/path.c: include "tools/tools-types.h".
* app/core/Makefile.am
* app/core/gimpimage-guides.[ch]
* app/core/gimpimage-merge.[ch]
* app/core/gimpimage-resize.[ch]
* app/core/gimpimage-scale.[ch]: new files.
* app/core/gimpimage.[ch]: removed the stuff which is in the new
files. Reordered all functions in both the .h and .c files,
commented the groups of functions.
* app/core/gimpcontainer.c: create the handler_id using a counter,
not the address of a pointer, because the address *may* be the
same twice, added debugging output.
* app/core/gimpviewable.[ch]: added primitive support for getting
a preview GdkPixbuf.
* app/nav_window.c
* app/undo.c
* app/undo_history.c
* app/core/gimpimage-duplicate.c
* app/core/gimpimage-mask.[ch]
* app/display/gimpdisplay.c
* app/display/gimpdisplayshell-callbacks.c
* app/display/gimpdisplayshell-dnd.c
* app/display/gimpdisplayshell-render.c
* app/display/gimpdisplayshell-scale.c
* app/display/gimpdisplayshell-scroll.c
* app/gui/image-commands.c
* app/gui/info-window.c
* app/gui/layers-commands.c
* app/gui/palette-import-dialog.c
* app/tools/gimpbycolorselecttool.c
* app/tools/gimpeditselectiontool.c
* app/tools/gimpmeasuretool.c
* app/tools/gimpmovetool.c
* app/widgets/gimpcontainerview-utils.c
* app/xcf/xcf-load.c: changed accordingly, some cleanup.
* tools/pdbgen/pdb/guides.pdb
* tools/pdbgen/pdb/image.pdb: changed accordingly, reordered functions.
* app/plug_in.c: set the labels of the "Repeat" and "Re-Show" menu
items to the name of the last plug-in (Fixes #50986).
* app/display/gimpdisplayshell.[ch]: set the labels of "Undo" and
"Redo" to the resp. undo names. Much simplified the WM icon stuff
by removing most code and using gimp_viewable_get_new_preview_pixbuf().
* app/widgets/gimpbrushfactoryview.c: forgot to assign the GQuark
returned by gimp_container_add_handler().
* app/pdb/guides_cmds.c
* app/pdb/image_cmds.c
* libgimp/gimpimage_pdb.[ch]: regenerated.
2001-11-29 01:51:06 +08:00
|
|
|
#include "tools/tools-types.h"
|
|
|
|
|
2001-02-21 20:18:09 +08:00
|
|
|
#include "tools/tool_manager.h"
|
|
|
|
|
2003-04-04 16:32:51 +08:00
|
|
|
#include "widgets/gimpviewabledialog.h"
|
|
|
|
|
2001-09-26 07:23:09 +08:00
|
|
|
#include "gimpdisplay.h"
|
2001-11-01 05:20:09 +08:00
|
|
|
#include "gimpdisplayshell.h"
|
2001-11-02 17:31:21 +08:00
|
|
|
#include "gimpdisplayshell-scale.h"
|
|
|
|
#include "gimpdisplayshell-scroll.h"
|
2003-02-26 03:01:10 +08:00
|
|
|
#include "gimpdisplayshell-title.h"
|
2002-02-03 20:10:23 +08:00
|
|
|
#include "gimpstatusbar.h"
|
2001-09-26 07:23:09 +08:00
|
|
|
|
2003-04-04 16:32:51 +08:00
|
|
|
#include "gimp-intl.h"
|
|
|
|
|
2000-12-29 23:22:01 +08:00
|
|
|
|
2003-05-05 23:33:11 +08:00
|
|
|
typedef struct _ScaleDialogData ScaleDialogData;
|
|
|
|
|
|
|
|
struct _ScaleDialogData
|
|
|
|
{
|
|
|
|
GimpDisplayShell *shell;
|
|
|
|
GtkObject *src_adj;
|
|
|
|
GtkObject *dest_adj;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2001-10-13 20:52:30 +08:00
|
|
|
/* local function prototypes */
|
1997-11-25 06:05:25 +08:00
|
|
|
|
2003-05-05 23:33:11 +08:00
|
|
|
static void gimp_display_shell_scale_dialog_ok (GtkWidget *widget,
|
|
|
|
ScaleDialogData *dialog);
|
|
|
|
static void gimp_display_shell_scale_dialog_cancel (GtkWidget *widget,
|
|
|
|
ScaleDialogData *dialog);
|
2003-04-04 16:32:51 +08:00
|
|
|
|
2003-05-05 23:33:11 +08:00
|
|
|
static gdouble img2real (GimpDisplayShell *shell,
|
|
|
|
gboolean xdir,
|
|
|
|
gdouble a);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
|
2001-10-13 20:52:30 +08:00
|
|
|
/* public functions */
|
1997-11-25 06:05:25 +08:00
|
|
|
|
2003-05-05 22:48:15 +08:00
|
|
|
void
|
|
|
|
gimp_display_shell_scale_zoom_fraction (GimpZoomType zoom_type,
|
|
|
|
gint *scalesrc,
|
|
|
|
gint *scaledest)
|
|
|
|
{
|
|
|
|
gint src, dest;
|
|
|
|
|
|
|
|
g_return_if_fail (scalesrc != NULL);
|
|
|
|
g_return_if_fail (scaledest != NULL);
|
|
|
|
|
|
|
|
src = *scalesrc;
|
|
|
|
dest = *scaledest;
|
|
|
|
|
|
|
|
switch (zoom_type)
|
|
|
|
{
|
|
|
|
case GIMP_ZOOM_IN:
|
|
|
|
if (src > 1)
|
|
|
|
src--;
|
|
|
|
else if (dest < 0xFF)
|
|
|
|
dest++;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case GIMP_ZOOM_OUT:
|
|
|
|
if (dest > 1)
|
|
|
|
dest--;
|
|
|
|
else if (src < 0xFF)
|
|
|
|
src++;
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
src = CLAMP (zoom_type % 100, 1, 0xFF);
|
|
|
|
dest = CLAMP (zoom_type / 100, 1, 0xFF);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
*scalesrc = src;
|
|
|
|
*scaledest = dest;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
gimp_display_shell_scale_calc_fraction (gdouble zoom_factor,
|
|
|
|
gint *scalesrc,
|
|
|
|
gint *scaledest)
|
|
|
|
{
|
|
|
|
gdouble zoom_delta;
|
|
|
|
gdouble min_zoom_delta = G_MAXFLOAT;
|
|
|
|
gint best_i = 0xFF;
|
|
|
|
gint i;
|
|
|
|
|
|
|
|
g_return_if_fail (scalesrc != NULL);
|
|
|
|
g_return_if_fail (scaledest != NULL);
|
|
|
|
|
|
|
|
if (zoom_factor < 1.0)
|
|
|
|
{
|
|
|
|
for (i = 0xFF; i > 0; i--)
|
|
|
|
{
|
|
|
|
*scalesrc = i;
|
|
|
|
*scaledest = floor ((gdouble) *scalesrc * zoom_factor);
|
|
|
|
|
|
|
|
if (*scaledest < 0x1)
|
|
|
|
*scaledest = 0x1;
|
|
|
|
|
|
|
|
zoom_delta = ABS ((gdouble) *scaledest / (gdouble) *scalesrc -
|
|
|
|
zoom_factor);
|
|
|
|
|
|
|
|
if (zoom_delta <= min_zoom_delta)
|
|
|
|
{
|
|
|
|
min_zoom_delta = zoom_delta;
|
|
|
|
best_i = i;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
*scalesrc = best_i;
|
|
|
|
*scaledest = floor ((gdouble) *scalesrc * zoom_factor);
|
|
|
|
|
|
|
|
if (*scaledest < 0x1)
|
|
|
|
*scaledest = 0x1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
for (i = 0xFF; i > 0; i--)
|
|
|
|
{
|
|
|
|
*scaledest = i;
|
|
|
|
*scalesrc = ceil ((gdouble) *scaledest / zoom_factor);
|
|
|
|
|
|
|
|
if (*scalesrc < 0x1)
|
|
|
|
*scalesrc = 0x1;
|
|
|
|
|
|
|
|
zoom_delta = ABS ((gdouble) *scaledest / (gdouble) *scalesrc -
|
|
|
|
zoom_factor);
|
|
|
|
|
|
|
|
if (zoom_delta <= min_zoom_delta)
|
|
|
|
{
|
|
|
|
min_zoom_delta = zoom_delta;
|
|
|
|
best_i = i;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
*scaledest = best_i;
|
|
|
|
*scalesrc = ceil ((gdouble) *scaledest / zoom_factor);
|
|
|
|
|
|
|
|
if (*scalesrc < 0x1)
|
|
|
|
*scalesrc = 0x1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
void
|
2001-11-01 05:20:09 +08:00
|
|
|
gimp_display_shell_scale_setup (GimpDisplayShell *shell)
|
|
|
|
{
|
|
|
|
GtkRuler *hruler;
|
|
|
|
GtkRuler *vruler;
|
|
|
|
gfloat sx, sy;
|
|
|
|
gfloat stepx, stepy;
|
|
|
|
gint image_width, image_height;
|
|
|
|
|
|
|
|
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
|
|
|
|
|
|
|
|
image_width = shell->gdisp->gimage->width;
|
|
|
|
image_height = shell->gdisp->gimage->height;
|
|
|
|
|
2002-06-27 06:16:59 +08:00
|
|
|
sx = SCALEX (shell, image_width);
|
|
|
|
sy = SCALEY (shell, image_height);
|
|
|
|
stepx = SCALEFACTOR_X (shell);
|
|
|
|
stepy = SCALEFACTOR_Y (shell);
|
2001-11-01 05:20:09 +08:00
|
|
|
|
2001-11-02 17:31:21 +08:00
|
|
|
shell->hsbdata->value = shell->offset_x;
|
2001-11-01 05:20:09 +08:00
|
|
|
shell->hsbdata->upper = sx;
|
2001-11-02 17:31:21 +08:00
|
|
|
shell->hsbdata->page_size = MIN (sx, shell->disp_width);
|
|
|
|
shell->hsbdata->page_increment = shell->disp_width / 2;
|
2001-11-01 05:20:09 +08:00
|
|
|
shell->hsbdata->step_increment = stepx;
|
|
|
|
|
2001-11-02 17:31:21 +08:00
|
|
|
shell->vsbdata->value = shell->offset_y;
|
2001-11-01 05:20:09 +08:00
|
|
|
shell->vsbdata->upper = sy;
|
2001-11-02 17:31:21 +08:00
|
|
|
shell->vsbdata->page_size = MIN (sy, shell->disp_height);
|
|
|
|
shell->vsbdata->page_increment = shell->disp_height / 2;
|
2001-11-01 05:20:09 +08:00
|
|
|
shell->vsbdata->step_increment = stepy;
|
|
|
|
|
|
|
|
gtk_adjustment_changed (shell->hsbdata);
|
|
|
|
gtk_adjustment_changed (shell->vsbdata);
|
|
|
|
|
|
|
|
hruler = GTK_RULER (shell->hrule);
|
|
|
|
vruler = GTK_RULER (shell->vrule);
|
|
|
|
|
|
|
|
hruler->lower = 0;
|
2002-06-27 06:16:59 +08:00
|
|
|
hruler->upper = img2real (shell, TRUE,
|
|
|
|
FUNSCALEX (shell, shell->disp_width));
|
|
|
|
hruler->max_size = img2real (shell, TRUE,
|
2001-11-01 05:20:09 +08:00
|
|
|
MAX (image_width, image_height));
|
|
|
|
|
|
|
|
vruler->lower = 0;
|
2002-06-27 06:16:59 +08:00
|
|
|
vruler->upper = img2real (shell, FALSE,
|
|
|
|
FUNSCALEY (shell, shell->disp_height));
|
|
|
|
vruler->max_size = img2real (shell, FALSE,
|
2001-11-01 05:20:09 +08:00
|
|
|
MAX (image_width, image_height));
|
|
|
|
|
2001-11-02 17:31:21 +08:00
|
|
|
if (sx < shell->disp_width)
|
2001-11-01 05:20:09 +08:00
|
|
|
{
|
2001-11-02 17:31:21 +08:00
|
|
|
shell->disp_xoffset = (shell->disp_width - sx) / 2;
|
2001-11-01 05:20:09 +08:00
|
|
|
|
2002-06-27 06:16:59 +08:00
|
|
|
hruler->lower -= img2real (shell, TRUE,
|
|
|
|
FUNSCALEX (shell,
|
2001-11-02 17:31:21 +08:00
|
|
|
(gdouble) shell->disp_xoffset));
|
2002-06-27 06:16:59 +08:00
|
|
|
hruler->upper -= img2real (shell, TRUE,
|
|
|
|
FUNSCALEX (shell,
|
2001-11-02 17:31:21 +08:00
|
|
|
(gdouble) shell->disp_xoffset));
|
2001-11-01 05:20:09 +08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2001-11-02 17:31:21 +08:00
|
|
|
shell->disp_xoffset = 0;
|
2001-11-01 05:20:09 +08:00
|
|
|
|
2002-06-27 06:16:59 +08:00
|
|
|
hruler->lower += img2real (shell, TRUE,
|
|
|
|
FUNSCALEX (shell,
|
2001-11-02 17:31:21 +08:00
|
|
|
(gdouble) shell->offset_x));
|
2002-06-27 06:16:59 +08:00
|
|
|
hruler->upper += img2real (shell, TRUE,
|
|
|
|
FUNSCALEX (shell,
|
2001-11-02 17:31:21 +08:00
|
|
|
(gdouble) shell->offset_x));
|
2001-11-01 05:20:09 +08:00
|
|
|
}
|
|
|
|
|
2001-11-02 17:31:21 +08:00
|
|
|
if (sy < shell->disp_height)
|
2001-11-01 05:20:09 +08:00
|
|
|
{
|
2001-11-02 17:31:21 +08:00
|
|
|
shell->disp_yoffset = (shell->disp_height - sy) / 2;
|
2001-11-01 05:20:09 +08:00
|
|
|
|
2002-06-27 06:16:59 +08:00
|
|
|
vruler->lower -= img2real (shell, FALSE,
|
|
|
|
FUNSCALEY (shell,
|
2001-11-02 17:31:21 +08:00
|
|
|
(gdouble) shell->disp_yoffset));
|
2002-06-27 06:16:59 +08:00
|
|
|
vruler->upper -= img2real (shell, FALSE,
|
|
|
|
FUNSCALEY (shell,
|
2001-11-02 17:31:21 +08:00
|
|
|
(gdouble) shell->disp_yoffset));
|
2001-11-01 05:20:09 +08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2001-11-02 17:31:21 +08:00
|
|
|
shell->disp_yoffset = 0;
|
2001-11-01 05:20:09 +08:00
|
|
|
|
2002-06-27 06:16:59 +08:00
|
|
|
vruler->lower += img2real (shell, FALSE,
|
|
|
|
FUNSCALEY (shell,
|
2001-11-02 17:31:21 +08:00
|
|
|
(gdouble) shell->offset_y));
|
2002-06-27 06:16:59 +08:00
|
|
|
vruler->upper += img2real (shell, FALSE,
|
|
|
|
FUNSCALEY (shell,
|
2001-11-02 17:31:21 +08:00
|
|
|
(gdouble) shell->offset_y));
|
2001-11-01 05:20:09 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
gtk_widget_queue_draw (GTK_WIDGET (hruler));
|
|
|
|
gtk_widget_queue_draw (GTK_WIDGET (vruler));
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
g_print ("offset_x: %d\n"
|
|
|
|
"offset_y: %d\n"
|
|
|
|
"disp_width: %d\n"
|
|
|
|
"disp_height: %d\n"
|
|
|
|
"disp_xoffset: %d\n"
|
|
|
|
"disp_yoffset: %d\n\n",
|
2001-11-02 17:31:21 +08:00
|
|
|
shell->offset_x, shell->offset_y,
|
|
|
|
shell->disp_width, shell->disp_height,
|
|
|
|
shell->disp_xoffset, shell->disp_yoffset);
|
2001-11-01 05:20:09 +08:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
gimp_display_shell_scale_set_dot_for_dot (GimpDisplayShell *shell,
|
|
|
|
gboolean dot_for_dot)
|
|
|
|
{
|
|
|
|
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
|
|
|
|
|
2002-06-27 06:16:59 +08:00
|
|
|
if (dot_for_dot != shell->dot_for_dot)
|
2001-11-01 05:20:09 +08:00
|
|
|
{
|
2003-01-11 05:15:41 +08:00
|
|
|
Gimp *gimp = shell->gdisp->gimage->gimp;
|
|
|
|
|
2002-02-17 19:46:39 +08:00
|
|
|
/* freeze the active tool */
|
2003-01-11 05:15:41 +08:00
|
|
|
tool_manager_control_active (gimp, PAUSE, shell->gdisp);
|
2002-02-17 19:46:39 +08:00
|
|
|
|
2002-06-27 06:16:59 +08:00
|
|
|
shell->dot_for_dot = dot_for_dot;
|
2001-11-01 05:20:09 +08:00
|
|
|
|
2002-02-03 20:10:23 +08:00
|
|
|
gimp_statusbar_resize_cursor (GIMP_STATUSBAR (shell->statusbar));
|
|
|
|
|
2001-11-01 05:20:09 +08:00
|
|
|
gimp_display_shell_scale_resize (shell,
|
2003-01-11 05:15:41 +08:00
|
|
|
GIMP_DISPLAY_CONFIG (gimp->config)->resize_windows_on_zoom,
|
2002-11-19 04:50:31 +08:00
|
|
|
TRUE);
|
2002-02-17 19:46:39 +08:00
|
|
|
|
|
|
|
/* re-enable the active tool */
|
2003-01-11 05:15:41 +08:00
|
|
|
tool_manager_control_active (gimp, RESUME, shell->gdisp);
|
2001-11-01 05:20:09 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
gimp_display_shell_scale (GimpDisplayShell *shell,
|
|
|
|
GimpZoomType zoom_type)
|
1997-11-25 06:05:25 +08:00
|
|
|
{
|
2003-01-11 05:15:41 +08:00
|
|
|
GimpDisplayConfig *config;
|
2003-05-05 22:48:15 +08:00
|
|
|
gint scalesrc, scaledest;
|
|
|
|
gdouble offset_x, offset_y;
|
1997-11-25 06:05:25 +08:00
|
|
|
|
2001-11-01 05:20:09 +08:00
|
|
|
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
|
2001-10-13 20:52:30 +08:00
|
|
|
|
1998-12-06 05:48:37 +08:00
|
|
|
/* user zoom control, so resolution versions not needed -- austin */
|
2002-06-27 06:16:59 +08:00
|
|
|
scalesrc = SCALESRC (shell);
|
|
|
|
scaledest = SCALEDEST (shell);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
2003-05-05 23:33:11 +08:00
|
|
|
offset_x = shell->offset_x + (shell->disp_width / 2.0);
|
2001-11-02 17:31:21 +08:00
|
|
|
offset_y = shell->offset_y + (shell->disp_height / 2.0);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
2003-01-11 05:15:41 +08:00
|
|
|
offset_x *= ((gdouble) scalesrc / (gdouble) scaledest);
|
|
|
|
offset_y *= ((gdouble) scalesrc / (gdouble) scaledest);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
2003-05-05 22:48:15 +08:00
|
|
|
gimp_display_shell_scale_zoom_fraction (zoom_type, &scalesrc, &scaledest);
|
2000-01-26 07:06:12 +08:00
|
|
|
|
2003-01-11 05:15:41 +08:00
|
|
|
offset_x *= ((gdouble) scaledest / (gdouble) scalesrc);
|
|
|
|
offset_y *= ((gdouble) scaledest / (gdouble) scalesrc);
|
2003-05-05 22:48:15 +08:00
|
|
|
|
2003-01-11 05:15:41 +08:00
|
|
|
config = GIMP_DISPLAY_CONFIG (shell->gdisp->gimage->gimp->config);
|
2003-05-05 22:48:15 +08:00
|
|
|
|
2003-01-11 05:15:41 +08:00
|
|
|
gimp_display_shell_scale_by_values (shell,
|
|
|
|
(scaledest << 8) + scalesrc,
|
|
|
|
(offset_x - (shell->disp_width / 2)),
|
|
|
|
(offset_y - (shell->disp_height / 2)),
|
|
|
|
config->resize_windows_on_zoom);
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
|
|
|
|
2001-11-02 17:31:21 +08:00
|
|
|
void
|
|
|
|
gimp_display_shell_scale_fit (GimpDisplayShell *shell)
|
|
|
|
{
|
2003-01-11 05:15:41 +08:00
|
|
|
GimpImage *gimage;
|
|
|
|
gint image_width;
|
|
|
|
gint image_height;
|
|
|
|
gdouble zoom_factor;
|
2003-05-05 22:48:15 +08:00
|
|
|
gint scalesrc;
|
|
|
|
gint scaledest;
|
2001-11-02 17:31:21 +08:00
|
|
|
|
|
|
|
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
|
|
|
|
|
2002-11-19 04:50:31 +08:00
|
|
|
gimage = shell->gdisp->gimage;
|
|
|
|
|
|
|
|
image_width = gimage->width;
|
|
|
|
image_height = gimage->height;
|
|
|
|
|
2002-06-27 06:16:59 +08:00
|
|
|
if (! shell->dot_for_dot)
|
2001-11-02 17:31:21 +08:00
|
|
|
{
|
|
|
|
image_width = ROUND (image_width *
|
2003-05-29 00:11:29 +08:00
|
|
|
shell->monitor_xres / gimage->xresolution);
|
2001-11-02 17:31:21 +08:00
|
|
|
image_height = ROUND (image_height *
|
2003-05-29 00:11:29 +08:00
|
|
|
shell->monitor_xres / gimage->yresolution);
|
2001-11-02 17:31:21 +08:00
|
|
|
}
|
|
|
|
|
2003-05-05 23:33:11 +08:00
|
|
|
zoom_factor = MIN ((gdouble) shell->disp_width / (gdouble) image_width,
|
|
|
|
(gdouble) shell->disp_height / (gdouble) image_height);
|
2001-11-02 17:31:21 +08:00
|
|
|
|
2003-05-05 22:48:15 +08:00
|
|
|
gimp_display_shell_scale_calc_fraction (zoom_factor,
|
|
|
|
&scalesrc, &scaledest);
|
2001-11-02 17:31:21 +08:00
|
|
|
|
2002-02-17 19:46:39 +08:00
|
|
|
gimp_display_shell_scale_by_values (shell,
|
|
|
|
(scaledest << 8) + scalesrc,
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
FALSE);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
gimp_display_shell_scale_by_values (GimpDisplayShell *shell,
|
|
|
|
gint scale,
|
|
|
|
gint offset_x,
|
|
|
|
gint offset_y,
|
|
|
|
gboolean resize_window)
|
|
|
|
{
|
2003-01-11 05:15:41 +08:00
|
|
|
Gimp *gimp;
|
|
|
|
|
2002-02-17 19:46:39 +08:00
|
|
|
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
|
|
|
|
|
2003-01-11 05:15:41 +08:00
|
|
|
gimp = shell->gdisp->gimage->gimp;
|
|
|
|
|
2002-02-17 19:46:39 +08:00
|
|
|
/* freeze the active tool */
|
2003-01-11 05:15:41 +08:00
|
|
|
tool_manager_control_active (gimp, PAUSE, shell->gdisp);
|
2002-02-17 19:46:39 +08:00
|
|
|
|
2002-06-27 06:16:59 +08:00
|
|
|
shell->scale = scale;
|
|
|
|
shell->offset_x = offset_x;
|
|
|
|
shell->offset_y = offset_y;
|
2002-02-17 19:46:39 +08:00
|
|
|
|
|
|
|
gimp_display_shell_scale_resize (shell, resize_window, TRUE);
|
|
|
|
|
|
|
|
/* re-enable the active tool */
|
2003-01-11 05:15:41 +08:00
|
|
|
tool_manager_control_active (gimp, RESUME, shell->gdisp);
|
2002-02-17 19:46:39 +08:00
|
|
|
}
|
2001-11-02 17:31:21 +08:00
|
|
|
|
2002-02-17 19:46:39 +08:00
|
|
|
void
|
|
|
|
gimp_display_shell_scale_shrink_wrap (GimpDisplayShell *shell)
|
|
|
|
{
|
|
|
|
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
|
2001-11-02 17:31:21 +08:00
|
|
|
|
2002-02-17 19:46:39 +08:00
|
|
|
gimp_display_shell_scale_resize (shell, TRUE, TRUE);
|
2001-11-02 17:31:21 +08:00
|
|
|
}
|
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
void
|
2001-11-01 05:20:09 +08:00
|
|
|
gimp_display_shell_scale_resize (GimpDisplayShell *shell,
|
|
|
|
gboolean resize_window,
|
|
|
|
gboolean redisplay)
|
1997-11-25 06:05:25 +08:00
|
|
|
{
|
2003-01-11 05:15:41 +08:00
|
|
|
Gimp *gimp;
|
|
|
|
|
2001-11-01 05:20:09 +08:00
|
|
|
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
|
2001-10-13 20:52:30 +08:00
|
|
|
|
2003-01-11 05:15:41 +08:00
|
|
|
gimp = shell->gdisp->gimage->gimp;
|
|
|
|
|
2001-10-13 20:52:30 +08:00
|
|
|
/* freeze the active tool */
|
2003-01-11 05:15:41 +08:00
|
|
|
tool_manager_control_active (gimp, PAUSE, shell->gdisp);
|
2001-10-13 20:52:30 +08:00
|
|
|
|
|
|
|
if (resize_window)
|
2001-11-01 05:20:09 +08:00
|
|
|
gimp_display_shell_shrink_wrap (shell);
|
2001-10-13 20:52:30 +08:00
|
|
|
|
2001-11-01 05:20:09 +08:00
|
|
|
gimp_display_shell_scroll_clamp_offsets (shell);
|
|
|
|
gimp_display_shell_scale_setup (shell);
|
2003-03-22 00:28:06 +08:00
|
|
|
gimp_display_shell_scaled (shell);
|
2001-10-13 20:52:30 +08:00
|
|
|
|
|
|
|
if (resize_window || redisplay)
|
2003-02-26 03:01:10 +08:00
|
|
|
gimp_display_shell_expose_full (shell);
|
2001-10-13 20:52:30 +08:00
|
|
|
|
|
|
|
/* re-enable the active tool */
|
2003-01-11 05:15:41 +08:00
|
|
|
tool_manager_control_active (gimp, RESUME, shell->gdisp);
|
2001-10-13 20:52:30 +08:00
|
|
|
}
|
|
|
|
|
2003-04-04 16:32:51 +08:00
|
|
|
void
|
|
|
|
gimp_display_shell_scale_dialog (GimpDisplayShell *shell)
|
|
|
|
{
|
|
|
|
ScaleDialogData *data;
|
|
|
|
GtkWidget *hbox;
|
|
|
|
GtkWidget *spin;
|
|
|
|
GtkWidget *label;
|
|
|
|
|
|
|
|
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
|
|
|
|
|
|
|
|
if (shell->scale_dialog)
|
|
|
|
{
|
|
|
|
gtk_window_present (GTK_WINDOW (shell->scale_dialog));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
data = g_new (ScaleDialogData, 1);
|
|
|
|
data->shell = shell;
|
|
|
|
|
|
|
|
shell->scale_dialog =
|
|
|
|
gimp_viewable_dialog_new (GIMP_VIEWABLE (shell->gdisp->gimage),
|
|
|
|
_("Zoom Ratio"), "display_scale",
|
|
|
|
GTK_STOCK_ZOOM_100,
|
|
|
|
_("Select Zoom Ratio"),
|
|
|
|
gimp_standard_help_func,
|
|
|
|
"dialogs/display_scale.html",
|
2003-05-05 23:33:11 +08:00
|
|
|
|
|
|
|
GTK_STOCK_CANCEL,
|
|
|
|
gimp_display_shell_scale_dialog_cancel,
|
2003-04-04 16:32:51 +08:00
|
|
|
data, NULL, NULL, FALSE, TRUE,
|
|
|
|
|
2003-05-05 23:33:11 +08:00
|
|
|
GTK_STOCK_OK,
|
|
|
|
gimp_display_shell_scale_dialog_ok,
|
2003-04-04 16:32:51 +08:00
|
|
|
data, NULL, NULL, TRUE, FALSE,
|
|
|
|
|
|
|
|
NULL);
|
|
|
|
|
|
|
|
g_object_weak_ref (G_OBJECT (shell->scale_dialog),
|
|
|
|
(GWeakNotify) g_free, data);
|
|
|
|
g_object_add_weak_pointer (G_OBJECT (shell->scale_dialog),
|
|
|
|
(gpointer *) &shell->scale_dialog);
|
|
|
|
|
|
|
|
gtk_window_set_transient_for (GTK_WINDOW (shell->scale_dialog),
|
|
|
|
GTK_WINDOW (shell));
|
|
|
|
gtk_window_set_destroy_with_parent (GTK_WINDOW (shell->scale_dialog), TRUE);
|
|
|
|
|
|
|
|
hbox = gtk_hbox_new (FALSE, 4);
|
|
|
|
gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
|
|
|
|
gtk_container_add (GTK_CONTAINER (GTK_DIALOG (shell->scale_dialog)->vbox),
|
|
|
|
hbox);
|
|
|
|
gtk_widget_show (hbox);
|
|
|
|
|
|
|
|
label = gtk_label_new (_("Zoom Ratio:"));
|
|
|
|
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
|
|
|
|
gtk_widget_show (label);
|
|
|
|
|
2003-04-12 06:00:09 +08:00
|
|
|
if ((shell->other_scale & 0xFFFF) == 0)
|
2003-04-04 16:32:51 +08:00
|
|
|
shell->other_scale = shell->scale;
|
|
|
|
|
|
|
|
spin = gimp_spin_button_new (&data->dest_adj,
|
|
|
|
(shell->other_scale & 0xFF00) >> 8, 1, 0xFF,
|
|
|
|
1, 8, 1, 1, 0);
|
|
|
|
gtk_box_pack_start (GTK_BOX (hbox), spin, TRUE, TRUE, 0);
|
|
|
|
gtk_widget_show (spin);
|
|
|
|
|
|
|
|
label = gtk_label_new (":");
|
|
|
|
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
|
|
|
|
gtk_widget_show (label);
|
2003-05-05 23:33:11 +08:00
|
|
|
|
2003-04-04 16:32:51 +08:00
|
|
|
spin = gimp_spin_button_new (&data->src_adj,
|
|
|
|
(shell->other_scale & 0xFF), 1, 0xFF,
|
|
|
|
1, 8, 1, 1, 0);
|
|
|
|
gtk_box_pack_start (GTK_BOX (hbox), spin, TRUE, TRUE, 0);
|
|
|
|
gtk_widget_show (spin);
|
|
|
|
|
|
|
|
gtk_widget_show (shell->scale_dialog);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-10-13 20:52:30 +08:00
|
|
|
/* private functions */
|
|
|
|
|
2003-04-04 16:32:51 +08:00
|
|
|
static void
|
2003-05-05 23:33:11 +08:00
|
|
|
gimp_display_shell_scale_dialog_ok (GtkWidget *widget,
|
|
|
|
ScaleDialogData *dialog)
|
2003-04-04 16:32:51 +08:00
|
|
|
{
|
|
|
|
gint scale_src;
|
|
|
|
gint scale_dest;
|
|
|
|
|
|
|
|
scale_src = gtk_adjustment_get_value (GTK_ADJUSTMENT (dialog->src_adj));
|
|
|
|
scale_dest = gtk_adjustment_get_value (GTK_ADJUSTMENT (dialog->dest_adj));
|
|
|
|
|
|
|
|
gimp_display_shell_scale (dialog->shell, scale_dest * 100 + scale_src);
|
|
|
|
dialog->shell->other_scale |= (1 << 30);
|
|
|
|
|
|
|
|
gtk_widget_destroy (dialog->shell->scale_dialog);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2003-05-05 23:33:11 +08:00
|
|
|
gimp_display_shell_scale_dialog_cancel (GtkWidget *widget,
|
|
|
|
ScaleDialogData *dialog)
|
2003-04-04 16:32:51 +08:00
|
|
|
{
|
|
|
|
/* need to emit "scaled" to get the menu updated */
|
|
|
|
gimp_display_shell_scaled (dialog->shell);
|
|
|
|
dialog->shell->other_scale |= (1 << 30);
|
|
|
|
|
|
|
|
gtk_widget_destroy (dialog->shell->scale_dialog);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-10-13 20:52:30 +08:00
|
|
|
/* scale image coord to realworld units (cm, inches, pixels)
|
|
|
|
*
|
|
|
|
* 27/Feb/1999 I tried inlining this, but the result was slightly
|
|
|
|
* slower (poorer cache locality, probably) -- austin
|
|
|
|
*/
|
|
|
|
static gdouble
|
2002-06-27 06:16:59 +08:00
|
|
|
img2real (GimpDisplayShell *shell,
|
|
|
|
gboolean xdir,
|
|
|
|
gdouble a)
|
2001-10-13 20:52:30 +08:00
|
|
|
{
|
2003-01-11 05:15:41 +08:00
|
|
|
GimpImage *gimage;
|
|
|
|
gdouble res;
|
2001-10-13 20:52:30 +08:00
|
|
|
|
2002-06-27 06:16:59 +08:00
|
|
|
if (shell->dot_for_dot)
|
2001-10-13 20:52:30 +08:00
|
|
|
return a;
|
|
|
|
|
2003-01-11 05:15:41 +08:00
|
|
|
gimage = shell->gdisp->gimage;
|
|
|
|
|
2001-10-13 20:52:30 +08:00
|
|
|
if (xdir)
|
2003-01-11 05:15:41 +08:00
|
|
|
res = gimage->xresolution;
|
2001-10-13 20:52:30 +08:00
|
|
|
else
|
2003-01-11 05:15:41 +08:00
|
|
|
res = gimage->yresolution;
|
2001-10-13 20:52:30 +08:00
|
|
|
|
2003-01-11 05:15:41 +08:00
|
|
|
return a * gimp_unit_get_factor (gimage->unit) / res;
|
2001-10-13 20:52:30 +08:00
|
|
|
}
|