Store the zoom factor as float, not as a ratio.

2004-01-29  Simon Budig  <simon@gimp.org>

	* app/display/gimpdisplayshell.[ch]: Store the zoom factor as
	float, not as a ratio.

	* app/display/gimpdisplayshell-scale.[ch]: change the API to
	expose the Float instead a weirdly encoded integer. Implement
	functions to get a ratio from the scale factor. Implement a set
	as presets as discussed on the mailinglist. Changed Zoom->Other
	dialog to enable entering a float.

	* app/display/gimpdisplayshell-title.c
	* app/display/gimpnavigationview.c
	* app/gui/image-menu.c
	* app/gui/info-window.c
	* app/tools/gimpmagnifytool.c: changed accordingly.

	* app/core/gimp.[ch]
	* app/display/gimpdisplay.[ch]
	* app/gui/gui-vtable.c
	* app/widgets/widgets-enums.h: Made the various display-creating
	functions accept a float for the scale. Introduce a new
	GimpZoomType: GIMP_ZOOM_TO. Generally adjust the API to use
	floats instead of weird integers.

	* app/core/gimp-edit.c
	* app/core/gimptemplate.c
	* app/display/gimpdisplayshell-callbacks.c
	* app/file/file-open.c
	* app/gui/image-commands.c
	* app/gui/view-commands.[ch]
	* tools/pdbgen/pdb/display.pdb
	* app/widgets/gimpimageview.c
	* app/widgets/gimptoolbox-dnd.c: changed accordingly

	* app/pdb/display_cmds.c: regenerated
This commit is contained in:
Simon Budig 2004-01-29 22:22:29 +00:00 committed by Simon Budig
parent eca5c99e63
commit 645a1ab652
37 changed files with 431 additions and 398 deletions

View File

@ -1,3 +1,40 @@
2004-01-29 Simon Budig <simon@gimp.org>
* app/display/gimpdisplayshell.[ch]: Store the zoom factor as
float, not as a ratio.
* app/display/gimpdisplayshell-scale.[ch]: change the API to
expose the Float instead a weirdly encoded integer. Implement
functions to get a ratio from the scale factor. Implement a set
as presets as discussed on the mailinglist. Changed Zoom->Other
dialog to enable entering a float.
* app/display/gimpdisplayshell-title.c
* app/display/gimpnavigationview.c
* app/gui/image-menu.c
* app/gui/info-window.c
* app/tools/gimpmagnifytool.c: changed accordingly.
* app/core/gimp.[ch]
* app/display/gimpdisplay.[ch]
* app/gui/gui-vtable.c
* app/widgets/widgets-enums.h: Made the various display-creating
functions accept a float for the scale. Introduce a new
GimpZoomType: GIMP_ZOOM_TO. Generally adjust the API to use
floats instead of weird integers.
* app/core/gimp-edit.c
* app/core/gimptemplate.c
* app/display/gimpdisplayshell-callbacks.c
* app/file/file-open.c
* app/gui/image-commands.c
* app/gui/view-commands.[ch]
* tools/pdbgen/pdb/display.pdb
* app/widgets/gimpimageview.c
* app/widgets/gimptoolbox-dnd.c: changed accordingly
* app/pdb/display_cmds.c: regenerated
2004-01-29 Michael Natterer <mitch@gimp.org>
* app/core/gimpcontext.[ch]: removed the last artefact of context

View File

@ -279,7 +279,7 @@ image_duplicate_cmd_callback (GtkWidget *widget,
new_gimage = gimp_image_duplicate (gimage);
gimp_create_display (new_gimage->gimp, new_gimage, 0x0101);
gimp_create_display (new_gimage->gimp, new_gimage, 1.0);
g_object_unref (new_gimage);
}

View File

@ -68,7 +68,8 @@ view_zoom_out_cmd_callback (GtkWidget *widget,
GimpDisplay *gdisp;
return_if_no_display (gdisp, data);
gimp_display_shell_scale (GIMP_DISPLAY_SHELL (gdisp->shell), GIMP_ZOOM_OUT);
gimp_display_shell_scale (GIMP_DISPLAY_SHELL (gdisp->shell),
GIMP_ZOOM_OUT, 0.0);
}
void
@ -78,7 +79,8 @@ view_zoom_in_cmd_callback (GtkWidget *widget,
GimpDisplay *gdisp;
return_if_no_display (gdisp, data);
gimp_display_shell_scale (GIMP_DISPLAY_SHELL (gdisp->shell), GIMP_ZOOM_IN);
gimp_display_shell_scale (GIMP_DISPLAY_SHELL (gdisp->shell),
GIMP_ZOOM_IN, 0.0);
}
void
@ -94,12 +96,10 @@ view_zoom_fit_cmd_callback (GtkWidget *widget,
void
view_zoom_cmd_callback (GtkWidget *widget,
gpointer data,
guint action)
guint scale)
{
GimpDisplay *gdisp;
GimpDisplayShell *shell;
guchar scalesrc;
guchar scaledest;
return_if_no_display (gdisp, data);
if (! GTK_CHECK_MENU_ITEM (widget)->active)
@ -107,11 +107,8 @@ view_zoom_cmd_callback (GtkWidget *widget,
shell = GIMP_DISPLAY_SHELL (gdisp->shell);
scalesrc = CLAMP (action % 100, 1, 0xFF);
scaledest = CLAMP (action / 100, 1, 0xFF);
if (scalesrc != SCALESRC (shell) || scaledest != SCALEDEST (shell))
gimp_display_shell_scale (shell, action);
if (fabs (scale - shell->scale) > 0.0001)
gimp_display_shell_scale (shell, GIMP_ZOOM_TO, (gdouble) scale / 10000);
}
void

View File

@ -28,7 +28,7 @@ void view_zoom_fit_cmd_callback (GtkWidget *widget,
gpointer data);
void view_zoom_cmd_callback (GtkWidget *widget,
gpointer data,
guint action);
guint scale);
void view_zoom_other_cmd_callback (GtkWidget *widget,
gpointer data);
void view_dot_for_dot_cmd_callback (GtkWidget *widget,

View File

@ -237,7 +237,7 @@ gimp_edit_paste_as_new (Gimp *gimp,
gimp_image_undo_enable (gimage);
gimp_create_display (gimp, gimage, 0x0101);
gimp_create_display (gimp, gimage, 1.0);
g_object_unref (gimage);
return gimage;

View File

@ -1217,8 +1217,8 @@ gimp_create_image (Gimp *gimp,
GimpObject *
gimp_create_display (Gimp *gimp,
GimpImage *gimage,
guint scale)
GimpImage *gimage,
gdouble scale)
{
GimpObject *display = NULL;

View File

@ -26,7 +26,7 @@
typedef void (* GimpThreadEnterFunc) (Gimp *gimp);
typedef void (* GimpThreadLeaveFunc) (Gimp *gimp);
typedef GimpObject * (* GimpCreateDisplayFunc) (GimpImage *gimage,
guint scale);
gdouble scale);
typedef void (* GimpSetBusyFunc) (Gimp *gimp);
typedef void (* GimpUnsetBusyFunc) (Gimp *gimp);
typedef void (* GimpMessageFunc) (Gimp *gimp,
@ -280,8 +280,8 @@ GimpImage * gimp_create_image (Gimp *gimp,
gboolean attach_comment);
GimpObject * gimp_create_display (Gimp *gimp,
GimpImage *gimage,
guint scale);
GimpImage *gimage,
gdouble scale);
GimpContext * gimp_get_standard_context (Gimp *gimp);

View File

@ -201,7 +201,7 @@ gimp_display_get_property (GObject *object,
GimpDisplay *
gimp_display_new (GimpImage *gimage,
guint scale,
gdouble scale,
GimpMenuFactory *menu_factory,
GimpItemFactory *popup_factory)
{

View File

@ -74,7 +74,7 @@ struct _GimpDisplayClass
GType gimp_display_get_type (void) G_GNUC_CONST;
GimpDisplay * gimp_display_new (GimpImage *gimage,
guint scale,
gdouble scale,
GimpMenuFactory *menu_factory,
GimpItemFactory *popup_factory);
void gimp_display_delete (GimpDisplay *gdisp);

View File

@ -442,7 +442,7 @@ gimp_template_create_image (Gimp *gimp,
gimp_image_undo_enable (gimage);
gimp_image_clean_all (gimage);
gimp_create_display (gimp, gimage, 0x0101);
gimp_create_display (gimp, gimage, 1.0);
g_object_unref (gimage);

View File

@ -521,8 +521,7 @@ info_window_update (GimpDisplay *gdisp)
res_unit == GIMP_UNIT_INCH ? _("dpi") : format_buf);
/* user zoom ratio */
g_snprintf (iwd->scale_str, MAX_BUF, "%d:%d",
SCALEDEST (shell), SCALESRC (shell));
g_snprintf (iwd->scale_str, MAX_BUF, "%.2f", shell->scale * 100);
/* number of layers */
g_snprintf (iwd->num_layers_str, MAX_BUF, "%d",

View File

@ -201,7 +201,7 @@ gimp_display_get_property (GObject *object,
GimpDisplay *
gimp_display_new (GimpImage *gimage,
guint scale,
gdouble scale,
GimpMenuFactory *menu_factory,
GimpItemFactory *popup_factory)
{

View File

@ -74,7 +74,7 @@ struct _GimpDisplayClass
GType gimp_display_get_type (void) G_GNUC_CONST;
GimpDisplay * gimp_display_new (GimpImage *gimage,
guint scale,
gdouble scale,
GimpMenuFactory *menu_factory,
GimpItemFactory *popup_factory);
void gimp_display_delete (GimpDisplay *gdisp);

View File

@ -823,11 +823,11 @@ gimp_display_shell_canvas_tool_events (GtkWidget *canvas,
switch (direction)
{
case GDK_SCROLL_UP:
gimp_display_shell_scale (shell, GIMP_ZOOM_IN);
gimp_display_shell_scale (shell, GIMP_ZOOM_IN, 0.0);
break;
case GDK_SCROLL_DOWN:
gimp_display_shell_scale (shell, GIMP_ZOOM_OUT);
gimp_display_shell_scale (shell, GIMP_ZOOM_OUT, 0.0);
break;
default:

View File

@ -210,8 +210,8 @@ gimp_display_shell_init (GimpDisplayShell *shell)
shell->popup_factory = NULL;
shell->qmask_factory = NULL;
shell->scale = 0x101;
shell->other_scale = 0;
shell->scale = 1.0;
shell->other_scale = 0.0;
shell->dot_for_dot = TRUE;
shell->offset_x = 0;
@ -486,7 +486,7 @@ gimp_display_shell_real_scaled (GimpDisplayShell *shell)
GtkWidget *
gimp_display_shell_new (GimpDisplay *gdisp,
guint scale,
gdouble scale,
GimpMenuFactory *menu_factory,
GimpItemFactory *popup_factory)
{
@ -504,7 +504,7 @@ gimp_display_shell_new (GimpDisplay *gdisp,
gint image_width, image_height;
gint n_width, n_height;
gint s_width, s_height;
gint scalesrc, scaledest;
gdouble new_scale;
g_return_val_if_fail (GIMP_IS_DISPLAY (gdisp), NULL);
g_return_val_if_fail (GIMP_IS_MENU_FACTORY (menu_factory), NULL);
@ -548,33 +548,31 @@ gimp_display_shell_new (GimpDisplay *gdisp,
s_width = gdk_screen_get_width (screen) * 0.75;
s_height = gdk_screen_get_height (screen) * 0.75;
scalesrc = SCALESRC (shell);
scaledest = SCALEDEST (shell);
n_width = SCALEX (shell, image_width);
n_height = SCALEX (shell, image_height);
n_height = SCALEY (shell, image_height);
if (config->initial_zoom_to_fit)
{
/* Limit to the size of the screen... */
while (n_width > s_width || n_height > s_height)
if (n_width > s_width || n_height > s_height)
{
if (scaledest > 1)
scaledest--;
else
if (scalesrc < 0xFF)
scalesrc++;
new_scale = shell->scale * MIN (((gdouble) s_height) / n_height,
((gdouble) s_width) / n_width);
new_scale = gimp_display_shell_scale_zoom_step (GIMP_ZOOM_OUT,
new_scale);
n_width = (image_width *
(scaledest * SCREEN_XRES (shell)) /
(scalesrc * gdisp->gimage->xresolution));
/* since zooming out might skip a zoom step we zoom in again
* and test if we are small enough. */
shell->scale = gimp_display_shell_scale_zoom_step (GIMP_ZOOM_IN,
new_scale);
n_height = (image_height *
(scaledest * SCREEN_XRES (shell)) /
(scalesrc * gdisp->gimage->xresolution));
if (SCALEX (shell, image_width) > s_width ||
SCALEY (shell, image_height) > s_height)
shell->scale = new_scale;
if (scaledest == 1 && scalesrc == 0xFF)
break;
n_width = SCALEX (shell, image_width);
n_height = SCALEY (shell, image_height);
}
}
else
@ -589,7 +587,6 @@ gimp_display_shell_new (GimpDisplay *gdisp,
n_height = s_height;
}
shell->scale = (scaledest << 8) + scalesrc;
shell->menubar_factory = gimp_menu_factory_menu_new (menu_factory,
"<Image>",

View File

@ -33,15 +33,11 @@
#define SCREEN_YRES(s) (s->dot_for_dot ? \
s->gdisp->gimage->yresolution : s->monitor_yres)
/* unpacking the user scale level (char) */
#define SCALESRC(s) (s->scale & 0x00ff)
#define SCALEDEST(s) (s->scale >> 8)
/* calculate scale factors (double) */
#define SCALEFACTOR_X(s) ((SCALEDEST(s) * SCREEN_XRES(s)) / \
(SCALESRC(s) * s->gdisp->gimage->xresolution))
#define SCALEFACTOR_Y(s) ((SCALEDEST(s) * SCREEN_YRES(s)) / \
(SCALESRC(s) * s->gdisp->gimage->yresolution))
#define SCALEFACTOR_X(s) (s->scale * SCREEN_XRES(s) / \
s->gdisp->gimage->xresolution)
#define SCALEFACTOR_Y(s) (s->scale * SCREEN_YRES(s) / \
s->gdisp->gimage->yresolution)
/* scale values */
#define SCALEX(s,x) ((gint) (x * SCALEFACTOR_X(s)))
@ -78,8 +74,8 @@ struct _GimpDisplayShell
gdouble monitor_xres;
gdouble monitor_yres;
gint scale; /* scale factor from original raw image */
gint other_scale; /* scale factor entered in Zoom->Other */
gdouble scale; /* scale factor from original raw image */
gdouble other_scale; /* scale factor entered in Zoom->Other */
gboolean dot_for_dot; /* is monitor resolution being ignored? */
gint offset_x; /* offset of display image into raw image */
@ -174,7 +170,7 @@ struct _GimpDisplayShellClass
GType gimp_display_shell_get_type (void) G_GNUC_CONST;
GtkWidget * gimp_display_shell_new (GimpDisplay *gdisp,
guint scale,
gdouble scale,
GimpMenuFactory *menu_factory,
GimpItemFactory *popup_factory);

View File

@ -50,8 +50,9 @@ typedef struct _ScaleDialogData ScaleDialogData;
struct _ScaleDialogData
{
GimpDisplayShell *shell;
GtkObject *src_adj;
GtkObject *dest_adj;
GtkObject *scale_adj;
GtkObject *num_adj;
GtkObject *denom_adj;
};
@ -60,6 +61,8 @@ struct _ScaleDialogData
static void gimp_display_shell_scale_dialog_response (GtkWidget *widget,
gint response_id,
ScaleDialogData *dialog);
static void update_zoom_values (GtkAdjustment *adj,
ScaleDialogData *dialog);
static gdouble img2real (GimpDisplayShell *shell,
gboolean xdir,
gdouble a);
@ -67,51 +70,82 @@ static gdouble img2real (GimpDisplayShell *shell,
/* public functions */
void
gimp_display_shell_scale_zoom_fraction (GimpZoomType zoom_type,
gint *scalesrc,
gint *scaledest)
gdouble
gimp_display_shell_scale_zoom_step (GimpZoomType zoom_type,
gdouble scale)
{
gdouble ratio;
gint i, n_presets;
gdouble new_scale;
g_return_if_fail (scalesrc != NULL);
g_return_if_fail (scaledest != NULL);
/* This table is constructed to have fractions, that approximate
* sqrt(2)^k. This gives a smooth feeling regardless of the starting
* zoom level.
*
* Zooming in/out always jumps to a zoom step from the list above.
* However, we try to guarantee a certain size of the step, to
* avoid silly jumps from 101% to 100%.
* The factor 1.1 is chosen a bit arbitrary, but feels better
* than the geometric median of the zoom steps (2^(1/4)).
*/
ratio = (double) *scaledest/ *scalesrc;
#define ZOOM_MIN_STEP 1.1
gdouble presets[] = {
1.0 / 256, 1.0 / 180, 1.0 / 128, 1.0 / 90,
1.0 / 64, 1.0 / 45, 1.0 / 32, 1.0 / 23,
1.0 / 16, 1.0 / 11, 1.0 / 8, 2.0 / 11,
1.0 / 4, 1.0 / 3, 1.0 / 2, 2.0 / 3,
1.0,
3.0 / 2, 2.0, 3.0,
4.0, 11.0 / 2, 8.0, 11.0,
16.0, 23.0, 32.0, 45.0,
64.0, 90.0, 128.0, 180.0,
256.0,
};
n_presets = G_N_ELEMENTS (presets);
switch (zoom_type)
{
case GIMP_ZOOM_IN:
ratio *= G_SQRT2;
scale *= ZOOM_MIN_STEP;
new_scale = presets[n_presets-1];
for (i = n_presets - 1; i >= 0 && presets[i] > scale; i--)
new_scale = presets[i];
break;
case GIMP_ZOOM_OUT:
ratio /= G_SQRT2;
scale /= ZOOM_MIN_STEP;
new_scale = presets[0];
for (i = 0; i < n_presets && presets[i] < scale; i++)
new_scale = presets[i];
break;
default:
*scalesrc = CLAMP (zoom_type % 100, 1, 0xFF);
*scaledest = CLAMP (zoom_type / 100, 1, 0xFF);
return;
case GIMP_ZOOM_TO:
new_scale = scale;
break;
}
/* set scalesrc and scaledest to a fraction close to ratio */
gimp_display_shell_scale_calc_fraction (ratio, scalesrc, scaledest);
return CLAMP (new_scale, 1.0/256.0, 256.0);
}
void
gimp_display_shell_scale_calc_fraction (gdouble zoom_factor,
gint *scalesrc,
gint *scaledest)
gimp_display_shell_scale_get_fraction (gdouble zoom_factor,
gint *numerator,
gint *denominator)
{
gint p0, p1, p2;
gint q0, q1, q2;
gdouble remainder, next_cf;
gboolean swapped = FALSE;
g_return_if_fail (scalesrc != NULL);
g_return_if_fail (scaledest != NULL);
g_return_if_fail (numerator != NULL && denominator != NULL);
/* make sure that zooming behaves symmetrically */
if (zoom_factor < 1.0)
@ -139,9 +173,9 @@ gimp_display_shell_scale_calc_fraction (gdouble zoom_factor,
p2 = next_cf * p1 + p0;
q2 = next_cf * q1 + q0;
/* Numerator and Denominator are limited by 255 */
/* Numerator and Denominator are limited by 256 */
/* also absurd ratios like 170:171 are excluded */
if (p2 > 255 || q2 > 255 || (p2 > 1 && q2 > 1 && p2 * q2 > 200))
if (p2 > 256 || q2 > 256 || (p2 > 1 && q2 > 1 && p2 * q2 > 200))
break;
/* remember the last two fractions */
@ -157,26 +191,26 @@ gimp_display_shell_scale_calc_fraction (gdouble zoom_factor,
/* hard upper and lower bounds for zoom ratio */
if (zoom_factor > 255.0)
if (zoom_factor > 256.0)
{
p1 = 255;
p1 = 256;
q1 = 1;
}
else if (zoom_factor < 1.0 / 255.0)
else if (zoom_factor < 1.0 / 256.0)
{
p1 = 1;
q1 = 255;
q1 = 256;
}
if (swapped)
{
*scalesrc = p1;
*scaledest = q1;
*numerator = q1;
*denominator = p1;
}
else
{
*scalesrc = q1;
*scaledest = p1;
*numerator = p1;
*denominator = q1;
}
}
@ -319,35 +353,36 @@ gimp_display_shell_scale_set_dot_for_dot (GimpDisplayShell *shell,
void
gimp_display_shell_scale (GimpDisplayShell *shell,
GimpZoomType zoom_type)
GimpZoomType zoom_type,
gdouble new_scale)
{
GimpDisplayConfig *config;
gint scalesrc, scaledest;
gdouble offset_x, offset_y;
gdouble scale;
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
/* user zoom control, so resolution versions not needed -- austin */
scalesrc = SCALESRC (shell);
scaledest = SCALEDEST (shell);
offset_x = shell->offset_x + (shell->disp_width / 2.0);
offset_y = shell->offset_y + (shell->disp_height / 2.0);
offset_x *= ((gdouble) scalesrc / (gdouble) scaledest);
offset_y *= ((gdouble) scalesrc / (gdouble) scaledest);
scale = shell->scale;
gimp_display_shell_scale_zoom_fraction (zoom_type, &scalesrc, &scaledest);
offset_x /= scale;
offset_y /= scale;
offset_x *= ((gdouble) scaledest / (gdouble) scalesrc);
offset_y *= ((gdouble) scaledest / (gdouble) scalesrc);
if (zoom_type == GIMP_ZOOM_TO)
scale = new_scale;
else
scale = gimp_display_shell_scale_zoom_step (zoom_type, scale);
offset_x *= scale;
offset_y *= scale;
config = GIMP_DISPLAY_CONFIG (shell->gdisp->gimage->gimp->config);
gimp_display_shell_scale_by_values (shell,
(scaledest << 8) + scalesrc,
(offset_x - (shell->disp_width / 2)),
(offset_y - (shell->disp_height / 2)),
gimp_display_shell_scale_by_values (shell, scale,
offset_x - (shell->disp_width / 2),
offset_y - (shell->disp_height / 2),
config->resize_windows_on_zoom);
}
@ -358,9 +393,6 @@ gimp_display_shell_scale_fit (GimpDisplayShell *shell)
gint image_width;
gint image_height;
gdouble zoom_factor;
gint scalesrc;
gint scaledest;
gint a, b, gcd;
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
@ -380,42 +412,12 @@ gimp_display_shell_scale_fit (GimpDisplayShell *shell)
zoom_factor = MIN ((gdouble) shell->disp_width / (gdouble) image_width,
(gdouble) shell->disp_height / (gdouble) image_height);
/* choosing 240 because it has a lot of nice divisors and the
* chance of a nice fraction is bigger */
scalesrc = scaledest = 240;
if (zoom_factor > 1.0)
scalesrc = CLAMP (ceil (1.0 / zoom_factor * 240.0), 1, 240);
else
scaledest = CLAMP (floor (zoom_factor * 240.0), 1, 240);
/* determine gcd to shorten the fraction */
a = MAX (scalesrc, scaledest);
b = MIN (scalesrc, scaledest);
gcd = b;
while (a % b != 0)
{
gcd = a % b;
a = b;
b = gcd;
}
scalesrc /= gcd;
scaledest /= gcd;
gimp_display_shell_scale_by_values (shell,
(scaledest << 8) + scalesrc,
0,
0,
FALSE);
gimp_display_shell_scale (shell, GIMP_ZOOM_TO, zoom_factor);
}
void
gimp_display_shell_scale_by_values (GimpDisplayShell *shell,
gint scale,
gdouble scale,
gint offset_x,
gint offset_y,
gboolean resize_window)
@ -480,8 +482,10 @@ gimp_display_shell_scale_dialog (GimpDisplayShell *shell)
{
ScaleDialogData *data;
GtkWidget *hbox;
GtkWidget *table;
GtkWidget *spin;
GtkWidget *label;
gint num, denom, row;
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
@ -521,21 +525,29 @@ gimp_display_shell_scale_dialog (GimpDisplayShell *shell)
G_CALLBACK (gimp_display_shell_scale_dialog_response),
data);
table = gtk_table_new (2, 2, FALSE);
gtk_table_set_col_spacings (GTK_TABLE (table), 2);
gtk_table_set_row_spacings (GTK_TABLE (table), 4);
gtk_container_add (GTK_CONTAINER (GTK_DIALOG (shell->scale_dialog)->vbox),
table);
gtk_widget_show (table);
row = 0;
hbox = gtk_hbox_new (FALSE, 4);
gtk_container_set_border_width (GTK_CONTAINER (hbox), 6);
gtk_container_add (GTK_CONTAINER (GTK_DIALOG (shell->scale_dialog)->vbox),
hbox);
gtk_widget_show (hbox);
gimp_table_attach_aligned (GTK_TABLE (table), 0, row++,
_("Zoom Ratio:"), 1.0, 0.5,
hbox, 1, FALSE);
label = gtk_label_new (_("Zoom Ratio:"));
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
gtk_widget_show (label);
if (fabs (shell->other_scale) <= 0.0001)
shell->other_scale = shell->scale; /* other_scale not yet initialized */
if ((shell->other_scale & 0xFFFF) == 0)
shell->other_scale = shell->scale;
gimp_display_shell_scale_get_fraction (fabs (shell->other_scale),
&num, &denom);
spin = gimp_spin_button_new (&data->dest_adj,
(shell->other_scale & 0xFF00) >> 8, 1, 0xFF,
spin = gimp_spin_button_new (&data->num_adj,
num, 1, 256,
1, 8, 1, 1, 0);
gtk_box_pack_start (GTK_BOX (hbox), spin, TRUE, TRUE, 0);
gtk_widget_show (spin);
@ -544,12 +556,27 @@ gimp_display_shell_scale_dialog (GimpDisplayShell *shell)
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
gtk_widget_show (label);
spin = gimp_spin_button_new (&data->src_adj,
(shell->other_scale & 0xFF), 1, 0xFF,
spin = gimp_spin_button_new (&data->denom_adj,
denom, 1, 256,
1, 8, 1, 1, 0);
gtk_box_pack_start (GTK_BOX (hbox), spin, TRUE, TRUE, 0);
gtk_widget_show (spin);
spin = gimp_spin_button_new (&data->scale_adj,
fabs (shell->other_scale) * 100,
100.0 / 256.0, 25600.0,
10, 50, 0, 1, 2);
gimp_table_attach_aligned (GTK_TABLE (table), 0, row++,
_("Zoom:"), 1.0, 0.5,
spin, 1, FALSE);
g_signal_connect (data->scale_adj, "value-changed",
G_CALLBACK (update_zoom_values), data);
g_signal_connect (data->num_adj, "value-changed",
G_CALLBACK (update_zoom_values), data);
g_signal_connect (data->denom_adj, "value-changed",
G_CALLBACK (update_zoom_values), data);
gtk_widget_show (shell->scale_dialog);
}
@ -563,13 +590,11 @@ gimp_display_shell_scale_dialog_response (GtkWidget *widget,
{
if (response_id == GTK_RESPONSE_OK)
{
gint scale_src;
gint scale_dest;
gdouble scale;
scale_src = gtk_adjustment_get_value (GTK_ADJUSTMENT (dialog->src_adj));
scale_dest = gtk_adjustment_get_value (GTK_ADJUSTMENT (dialog->dest_adj));
scale = gtk_adjustment_get_value (GTK_ADJUSTMENT (dialog->scale_adj));
gimp_display_shell_scale (dialog->shell, scale_dest * 100 + scale_src);
gimp_display_shell_scale (dialog->shell, GIMP_ZOOM_TO, scale / 100.0);
}
else
{
@ -577,12 +602,61 @@ gimp_display_shell_scale_dialog_response (GtkWidget *widget,
gimp_display_shell_scaled (dialog->shell);
}
dialog->shell->other_scale |= (1 << 30);
dialog->shell->other_scale = - fabs (dialog->shell->other_scale);
gtk_widget_destroy (dialog->shell->scale_dialog);
}
static void
update_zoom_values (GtkAdjustment *adj,
ScaleDialogData *dialog)
{
gint num, denom;
gdouble scale;
g_signal_handlers_block_by_func (GTK_ADJUSTMENT (dialog->scale_adj),
G_CALLBACK (update_zoom_values),
dialog);
g_signal_handlers_block_by_func (GTK_ADJUSTMENT (dialog->num_adj),
G_CALLBACK (update_zoom_values),
dialog);
g_signal_handlers_block_by_func (GTK_ADJUSTMENT (dialog->denom_adj),
G_CALLBACK (update_zoom_values),
dialog);
if (GTK_OBJECT (adj) == dialog->scale_adj)
{
scale = gtk_adjustment_get_value (GTK_ADJUSTMENT (dialog->scale_adj));
gimp_display_shell_scale_get_fraction (scale / 100.0, &num, &denom);
gtk_adjustment_set_value (GTK_ADJUSTMENT (dialog->num_adj), num);
gtk_adjustment_set_value (GTK_ADJUSTMENT (dialog->denom_adj), denom);
}
else /* fraction adjustments */
{
scale = (gtk_adjustment_get_value (GTK_ADJUSTMENT (dialog->num_adj)) /
gtk_adjustment_get_value (GTK_ADJUSTMENT (dialog->denom_adj)));
gtk_adjustment_set_value (GTK_ADJUSTMENT (dialog->scale_adj),
scale * 100);
}
g_signal_handlers_unblock_by_func (GTK_ADJUSTMENT (dialog->scale_adj),
G_CALLBACK (update_zoom_values),
dialog);
g_signal_handlers_unblock_by_func (GTK_ADJUSTMENT (dialog->num_adj),
G_CALLBACK (update_zoom_values),
dialog);
g_signal_handlers_unblock_by_func (GTK_ADJUSTMENT (dialog->denom_adj),
G_CALLBACK (update_zoom_values),
dialog);
}
/* scale image coord to realworld units (cm, inches, pixels)
*
* 27/Feb/1999 I tried inlining this, but the result was slightly

View File

@ -20,12 +20,11 @@
#define __GIMP_DISPLAY_SHELL_SCALE_H__
void gimp_display_shell_scale_zoom_fraction (GimpZoomType zoom_type,
gint *scalesrc,
gint *scaledest);
void gimp_display_shell_scale_calc_fraction (gdouble zoom_factor,
gint *scalesrc,
gint *scaledest);
gdouble gimp_display_shell_scale_zoom_step (GimpZoomType zoom_type,
gdouble scale);
void gimp_display_shell_scale_get_fraction (gdouble zoom_factor,
gint *numerator,
gint *denominator);
void gimp_display_shell_scale_setup (GimpDisplayShell *shell);
@ -33,10 +32,11 @@ void gimp_display_shell_scale_set_dot_for_dot (GimpDisplayShell *gdisp,
gboolean dot_for_dot);
void gimp_display_shell_scale (GimpDisplayShell *gdisp,
GimpZoomType zoom_type);
GimpZoomType zoom_type,
gdouble new_scale);
void gimp_display_shell_scale_fit (GimpDisplayShell *gdisp);
void gimp_display_shell_scale_by_values (GimpDisplayShell *gdisp,
gint scale,
gdouble scale,
gint offset_x,
gint offset_y,
gboolean resize_window);

View File

@ -45,6 +45,7 @@
#include "gimpdisplay.h"
#include "gimpdisplayshell.h"
#include "gimpdisplayshell-scale.h"
#include "gimpdisplayshell-title.h"
#include "gimpstatusbar.h"
@ -148,12 +149,15 @@ gimp_display_shell_format_title (GimpDisplayShell *shell,
const gchar *format)
{
GimpImage *gimage;
gint num, denom;
gint i = 0;
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
gimage = shell->gdisp->gimage;
gimp_display_shell_scale_get_fraction (shell->scale, &num, &denom);
while (i < title_len && *format)
{
switch (*format)
@ -230,16 +234,17 @@ gimp_display_shell_format_title (GimpDisplayShell *shell,
break;
case 's': /* user source zoom factor */
i += print (title, title_len, i, "%d", SCALESRC (shell));
i += print (title, title_len, i, "%d", denom);
break;
case 'd': /* user destination zoom factor */
i += print (title, title_len, i, "%d", SCALEDEST (shell));
i += print (title, title_len, i, "%d", num);
break;
case 'z': /* user zoom factor (percentage) */
i += print (title, title_len, i, "%d",
100 * SCALEDEST (shell) / SCALESRC (shell));
i += print (title, title_len, i,
shell->scale >= 0.15 ? "%.0f" : "%.2f",
100 * shell->scale);
break;
case 'D': /* dirty flag */

View File

@ -210,8 +210,8 @@ gimp_display_shell_init (GimpDisplayShell *shell)
shell->popup_factory = NULL;
shell->qmask_factory = NULL;
shell->scale = 0x101;
shell->other_scale = 0;
shell->scale = 1.0;
shell->other_scale = 0.0;
shell->dot_for_dot = TRUE;
shell->offset_x = 0;
@ -486,7 +486,7 @@ gimp_display_shell_real_scaled (GimpDisplayShell *shell)
GtkWidget *
gimp_display_shell_new (GimpDisplay *gdisp,
guint scale,
gdouble scale,
GimpMenuFactory *menu_factory,
GimpItemFactory *popup_factory)
{
@ -504,7 +504,7 @@ gimp_display_shell_new (GimpDisplay *gdisp,
gint image_width, image_height;
gint n_width, n_height;
gint s_width, s_height;
gint scalesrc, scaledest;
gdouble new_scale;
g_return_val_if_fail (GIMP_IS_DISPLAY (gdisp), NULL);
g_return_val_if_fail (GIMP_IS_MENU_FACTORY (menu_factory), NULL);
@ -548,33 +548,31 @@ gimp_display_shell_new (GimpDisplay *gdisp,
s_width = gdk_screen_get_width (screen) * 0.75;
s_height = gdk_screen_get_height (screen) * 0.75;
scalesrc = SCALESRC (shell);
scaledest = SCALEDEST (shell);
n_width = SCALEX (shell, image_width);
n_height = SCALEX (shell, image_height);
n_height = SCALEY (shell, image_height);
if (config->initial_zoom_to_fit)
{
/* Limit to the size of the screen... */
while (n_width > s_width || n_height > s_height)
if (n_width > s_width || n_height > s_height)
{
if (scaledest > 1)
scaledest--;
else
if (scalesrc < 0xFF)
scalesrc++;
new_scale = shell->scale * MIN (((gdouble) s_height) / n_height,
((gdouble) s_width) / n_width);
new_scale = gimp_display_shell_scale_zoom_step (GIMP_ZOOM_OUT,
new_scale);
n_width = (image_width *
(scaledest * SCREEN_XRES (shell)) /
(scalesrc * gdisp->gimage->xresolution));
/* since zooming out might skip a zoom step we zoom in again
* and test if we are small enough. */
shell->scale = gimp_display_shell_scale_zoom_step (GIMP_ZOOM_IN,
new_scale);
n_height = (image_height *
(scaledest * SCREEN_XRES (shell)) /
(scalesrc * gdisp->gimage->xresolution));
if (SCALEX (shell, image_width) > s_width ||
SCALEY (shell, image_height) > s_height)
shell->scale = new_scale;
if (scaledest == 1 && scalesrc == 0xFF)
break;
n_width = SCALEX (shell, image_width);
n_height = SCALEY (shell, image_height);
}
}
else
@ -589,7 +587,6 @@ gimp_display_shell_new (GimpDisplay *gdisp,
n_height = s_height;
}
shell->scale = (scaledest << 8) + scalesrc;
shell->menubar_factory = gimp_menu_factory_menu_new (menu_factory,
"<Image>",

View File

@ -33,15 +33,11 @@
#define SCREEN_YRES(s) (s->dot_for_dot ? \
s->gdisp->gimage->yresolution : s->monitor_yres)
/* unpacking the user scale level (char) */
#define SCALESRC(s) (s->scale & 0x00ff)
#define SCALEDEST(s) (s->scale >> 8)
/* calculate scale factors (double) */
#define SCALEFACTOR_X(s) ((SCALEDEST(s) * SCREEN_XRES(s)) / \
(SCALESRC(s) * s->gdisp->gimage->xresolution))
#define SCALEFACTOR_Y(s) ((SCALEDEST(s) * SCREEN_YRES(s)) / \
(SCALESRC(s) * s->gdisp->gimage->yresolution))
#define SCALEFACTOR_X(s) (s->scale * SCREEN_XRES(s) / \
s->gdisp->gimage->xresolution)
#define SCALEFACTOR_Y(s) (s->scale * SCREEN_YRES(s) / \
s->gdisp->gimage->yresolution)
/* scale values */
#define SCALEX(s,x) ((gint) (x * SCALEFACTOR_X(s)))
@ -78,8 +74,8 @@ struct _GimpDisplayShell
gdouble monitor_xres;
gdouble monitor_yres;
gint scale; /* scale factor from original raw image */
gint other_scale; /* scale factor entered in Zoom->Other */
gdouble scale; /* scale factor from original raw image */
gdouble other_scale; /* scale factor entered in Zoom->Other */
gboolean dot_for_dot; /* is monitor resolution being ignored? */
gint offset_x; /* offset of display image into raw image */
@ -174,7 +170,7 @@ struct _GimpDisplayShellClass
GType gimp_display_shell_get_type (void) G_GNUC_CONST;
GtkWidget * gimp_display_shell_new (GimpDisplay *gdisp,
guint scale,
gdouble scale,
GimpMenuFactory *menu_factory,
GimpItemFactory *popup_factory);

View File

@ -487,7 +487,7 @@ gimp_navigation_view_new_private (GimpDisplayShell *shell,
/* the zoom scale */
view->zoom_adjustment =
GTK_ADJUSTMENT (gtk_adjustment_new (0.0, -15.0, 15.0, 1.0, 1.0, 0.0));
GTK_ADJUSTMENT (gtk_adjustment_new (0.0, -8.0, 8.0, 0.5, 1.0, 0.0));
g_signal_connect (view->zoom_adjustment, "value_changed",
G_CALLBACK (gimp_navigation_view_zoom_adj_changed),
@ -496,13 +496,13 @@ gimp_navigation_view_new_private (GimpDisplayShell *shell,
hscale = gtk_hscale_new (GTK_ADJUSTMENT (view->zoom_adjustment));
gtk_range_set_update_policy (GTK_RANGE (hscale), GTK_UPDATE_DELAYED);
gtk_scale_set_draw_value (GTK_SCALE (hscale), FALSE);
gtk_scale_set_digits (GTK_SCALE (hscale), 0);
gtk_scale_set_digits (GTK_SCALE (hscale), 2);
gtk_box_pack_end (GTK_BOX (view), hscale, FALSE, FALSE, 0);
gtk_widget_show (hscale);
/* the zoom label */
view->zoom_label = gtk_label_new ("1:1");
view->zoom_label = gtk_label_new ("100%");
gtk_box_pack_end (GTK_BOX (view), view->zoom_label, FALSE, FALSE, 0);
gtk_widget_show (view->zoom_label);
@ -567,9 +567,11 @@ gimp_navigation_view_zoom (GimpNavigationPreview *preview,
GimpZoomType direction,
GimpNavigationView *view)
{
g_return_if_fail (direction != GIMP_ZOOM_TO);
if (view->shell)
{
gimp_display_shell_scale (view->shell, direction);
gimp_display_shell_scale (view->shell, direction, 0.0);
}
}
@ -623,27 +625,8 @@ static void
gimp_navigation_view_zoom_adj_changed (GtkAdjustment *adj,
GimpNavigationView *view)
{
gint value;
gint scalesrc;
gint scaledest;
value = RINT (adj->value);
if (value < 0)
{
scalesrc = - value + 1;
scaledest = 1;
}
else
{
scalesrc = 1;
scaledest = value + 1;
}
g_print ("zoom_adj_changed: %d : %d (%f)\n", scaledest, scalesrc,
adj->value);
gimp_display_shell_scale (view->shell, (scaledest * 100) + scalesrc);
gimp_display_shell_scale (view->shell, GIMP_ZOOM_TO,
pow (2.0, adj->value));
}
static void
@ -651,7 +634,7 @@ gimp_navigation_view_zoom_out_clicked (GtkWidget *widget,
GimpNavigationView *view)
{
if (view->shell)
gimp_display_shell_scale (view->shell, GIMP_ZOOM_OUT);
gimp_display_shell_scale (view->shell, GIMP_ZOOM_OUT, 0.0);
}
static void
@ -659,7 +642,7 @@ gimp_navigation_view_zoom_in_clicked (GtkWidget *widget,
GimpNavigationView *view)
{
if (view->shell)
gimp_display_shell_scale (view->shell, GIMP_ZOOM_IN);
gimp_display_shell_scale (view->shell, GIMP_ZOOM_IN, 0.0);
}
static void
@ -667,7 +650,7 @@ gimp_navigation_view_zoom_100_clicked (GtkWidget *widget,
GimpNavigationView *view)
{
if (view->shell)
gimp_display_shell_scale (view->shell, 101);
gimp_display_shell_scale (view->shell, GIMP_ZOOM_TO, 1.0);
}
static void
@ -695,25 +678,18 @@ gimp_navigation_view_shell_scaled (GimpDisplayShell *shell,
gchar scale_str[MAX_SCALE_BUF];
/* Update the zoom scale string */
g_snprintf (scale_str, sizeof (scale_str), "%d:%d",
SCALEDEST (view->shell),
SCALESRC (view->shell));
g_snprintf (scale_str, sizeof (scale_str),
shell->scale >= 0.15 ? "%.0f%%" : "%.2f%%",
view->shell->scale * 100);
gtk_label_set_text (GTK_LABEL (view->zoom_label), scale_str);
}
if (view->zoom_adjustment)
{
gdouble f;
gint val;
f = (((gdouble) SCALEDEST (view->shell)) /
((gdouble) SCALESRC (view->shell)));
gdouble val;
if (f < 1.0)
val = - RINT (1.0 / f) + 1;
else
val = RINT (f) - 1;
val = log (CLAMP (view->shell->scale, 1.0 / 256, 256.0) ) / G_LN2;
g_signal_handlers_block_by_func (view->zoom_adjustment,
gimp_navigation_view_zoom_adj_changed,

View File

@ -487,7 +487,7 @@ gimp_navigation_view_new_private (GimpDisplayShell *shell,
/* the zoom scale */
view->zoom_adjustment =
GTK_ADJUSTMENT (gtk_adjustment_new (0.0, -15.0, 15.0, 1.0, 1.0, 0.0));
GTK_ADJUSTMENT (gtk_adjustment_new (0.0, -8.0, 8.0, 0.5, 1.0, 0.0));
g_signal_connect (view->zoom_adjustment, "value_changed",
G_CALLBACK (gimp_navigation_view_zoom_adj_changed),
@ -496,13 +496,13 @@ gimp_navigation_view_new_private (GimpDisplayShell *shell,
hscale = gtk_hscale_new (GTK_ADJUSTMENT (view->zoom_adjustment));
gtk_range_set_update_policy (GTK_RANGE (hscale), GTK_UPDATE_DELAYED);
gtk_scale_set_draw_value (GTK_SCALE (hscale), FALSE);
gtk_scale_set_digits (GTK_SCALE (hscale), 0);
gtk_scale_set_digits (GTK_SCALE (hscale), 2);
gtk_box_pack_end (GTK_BOX (view), hscale, FALSE, FALSE, 0);
gtk_widget_show (hscale);
/* the zoom label */
view->zoom_label = gtk_label_new ("1:1");
view->zoom_label = gtk_label_new ("100%");
gtk_box_pack_end (GTK_BOX (view), view->zoom_label, FALSE, FALSE, 0);
gtk_widget_show (view->zoom_label);
@ -567,9 +567,11 @@ gimp_navigation_view_zoom (GimpNavigationPreview *preview,
GimpZoomType direction,
GimpNavigationView *view)
{
g_return_if_fail (direction != GIMP_ZOOM_TO);
if (view->shell)
{
gimp_display_shell_scale (view->shell, direction);
gimp_display_shell_scale (view->shell, direction, 0.0);
}
}
@ -623,27 +625,8 @@ static void
gimp_navigation_view_zoom_adj_changed (GtkAdjustment *adj,
GimpNavigationView *view)
{
gint value;
gint scalesrc;
gint scaledest;
value = RINT (adj->value);
if (value < 0)
{
scalesrc = - value + 1;
scaledest = 1;
}
else
{
scalesrc = 1;
scaledest = value + 1;
}
g_print ("zoom_adj_changed: %d : %d (%f)\n", scaledest, scalesrc,
adj->value);
gimp_display_shell_scale (view->shell, (scaledest * 100) + scalesrc);
gimp_display_shell_scale (view->shell, GIMP_ZOOM_TO,
pow (2.0, adj->value));
}
static void
@ -651,7 +634,7 @@ gimp_navigation_view_zoom_out_clicked (GtkWidget *widget,
GimpNavigationView *view)
{
if (view->shell)
gimp_display_shell_scale (view->shell, GIMP_ZOOM_OUT);
gimp_display_shell_scale (view->shell, GIMP_ZOOM_OUT, 0.0);
}
static void
@ -659,7 +642,7 @@ gimp_navigation_view_zoom_in_clicked (GtkWidget *widget,
GimpNavigationView *view)
{
if (view->shell)
gimp_display_shell_scale (view->shell, GIMP_ZOOM_IN);
gimp_display_shell_scale (view->shell, GIMP_ZOOM_IN, 0.0);
}
static void
@ -667,7 +650,7 @@ gimp_navigation_view_zoom_100_clicked (GtkWidget *widget,
GimpNavigationView *view)
{
if (view->shell)
gimp_display_shell_scale (view->shell, 101);
gimp_display_shell_scale (view->shell, GIMP_ZOOM_TO, 1.0);
}
static void
@ -695,25 +678,18 @@ gimp_navigation_view_shell_scaled (GimpDisplayShell *shell,
gchar scale_str[MAX_SCALE_BUF];
/* Update the zoom scale string */
g_snprintf (scale_str, sizeof (scale_str), "%d:%d",
SCALEDEST (view->shell),
SCALESRC (view->shell));
g_snprintf (scale_str, sizeof (scale_str),
shell->scale >= 0.15 ? "%.0f%%" : "%.2f%%",
view->shell->scale * 100);
gtk_label_set_text (GTK_LABEL (view->zoom_label), scale_str);
}
if (view->zoom_adjustment)
{
gdouble f;
gint val;
f = (((gdouble) SCALEDEST (view->shell)) /
((gdouble) SCALESRC (view->shell)));
gdouble val;
if (f < 1.0)
val = - RINT (1.0 / f) + 1;
else
val = RINT (f) - 1;
val = log (CLAMP (view->shell->scale, 1.0 / 256, 256.0) ) / G_LN2;
g_signal_handlers_block_by_func (view->zoom_adjustment,
gimp_navigation_view_zoom_adj_changed,

View File

@ -208,7 +208,7 @@ file_open_with_proc_and_display (Gimp *gimp,
/* set the image to clean */
gimp_image_clean_all (gimage);
gimp_create_display (gimage->gimp, gimage, 0x0101);
gimp_create_display (gimage->gimp, gimage, 1.0);
g_object_unref (gimage);

View File

@ -61,7 +61,7 @@ static void gui_message (Gimp *gimp,
const gchar *domain,
const gchar *message);
static GimpObject * gui_display_new (GimpImage *gimage,
guint scale);
gdouble scale);
static void gui_menus_init (Gimp *gimp,
GSList *plug_in_defs,
const gchar *plugins_domain);
@ -185,7 +185,7 @@ gui_message (Gimp *gimp,
static GimpObject *
gui_display_new (GimpImage *gimage,
guint scale)
gdouble scale)
{
GimpDisplayShell *shell;
GimpDisplay *gdisp;

View File

@ -279,7 +279,7 @@ image_duplicate_cmd_callback (GtkWidget *widget,
new_gimage = gimp_image_duplicate (gimage);
gimp_create_display (new_gimage->gimp, new_gimage, 0x0101);
gimp_create_display (new_gimage->gimp, new_gimage, 1.0);
g_object_unref (new_gimage);
}

View File

@ -368,39 +368,39 @@ GimpItemFactoryEntry image_menu_entries[] =
MENU_SEPARATOR ("/View/Zoom/---"),
{ { N_("/View/Zoom/16:1"), NULL,
view_zoom_cmd_callback, 1601, "<RadioItem>" },
view_zoom_cmd_callback, 160000, "<RadioItem>" },
NULL,
GIMP_HELP_VIEW_ZOOM_IN, NULL },
{ { N_("/View/Zoom/8:1"), NULL,
view_zoom_cmd_callback, 801, "/View/Zoom/16:1" },
view_zoom_cmd_callback, 80000, "/View/Zoom/16:1" },
NULL,
GIMP_HELP_VIEW_ZOOM_IN, NULL },
{ { N_("/View/Zoom/4:1"), NULL,
view_zoom_cmd_callback, 401, "/View/Zoom/16:1" },
view_zoom_cmd_callback, 40000, "/View/Zoom/16:1" },
NULL,
GIMP_HELP_VIEW_ZOOM_IN, NULL },
{ { N_("/View/Zoom/2:1"), NULL,
view_zoom_cmd_callback, 201, "/View/Zoom/16:1" },
view_zoom_cmd_callback, 20000, "/View/Zoom/16:1" },
NULL,
GIMP_HELP_VIEW_ZOOM_IN, NULL },
{ { N_("/View/Zoom/1:1"), "1",
view_zoom_cmd_callback, 101, "/View/Zoom/16:1" },
view_zoom_cmd_callback, 10000, "/View/Zoom/16:1" },
NULL,
GIMP_HELP_VIEW_ZOOM_100, NULL },
{ { N_("/View/Zoom/1:2"), NULL,
view_zoom_cmd_callback, 102, "/View/Zoom/16:1" },
view_zoom_cmd_callback, 5000, "/View/Zoom/16:1" },
NULL,
GIMP_HELP_VIEW_ZOOM_OUT, NULL },
{ { N_("/View/Zoom/1:4"), NULL,
view_zoom_cmd_callback, 104, "/View/Zoom/16:1" },
view_zoom_cmd_callback, 2500, "/View/Zoom/16:1" },
NULL,
GIMP_HELP_VIEW_ZOOM_OUT, NULL },
{ { N_("/View/Zoom/1:8"), NULL,
view_zoom_cmd_callback, 108, "/View/Zoom/16:1" },
view_zoom_cmd_callback, 1250, "/View/Zoom/16:1" },
NULL,
GIMP_HELP_VIEW_ZOOM_OUT, NULL },
{ { N_("/View/Zoom/1:16"), NULL,
view_zoom_cmd_callback, 116, "/View/Zoom/16:1" },
view_zoom_cmd_callback, 625, "/View/Zoom/16:1" },
NULL,
GIMP_HELP_VIEW_ZOOM_OUT, NULL },
@ -1655,40 +1655,33 @@ image_menu_set_zoom (GtkItemFactory *item_factory,
GimpDisplayShell *shell)
{
const gchar *menu = NULL;
guint scalesrc;
guint scaledest;
guint scale;
gchar *label;
scalesrc = SCALESRC (shell);
scaledest = SCALEDEST (shell);
scale = ROUND (shell->scale * 1000);
if (scaledest == 1)
switch (scale)
{
switch (scalesrc)
{
case 1: menu = "/View/Zoom/1:1"; break;
case 2: menu = "/View/Zoom/1:2"; break;
case 4: menu = "/View/Zoom/1:4"; break;
case 8: menu = "/View/Zoom/1:8"; break;
case 16: menu = "/View/Zoom/1:16"; break;
}
}
else if (scalesrc == 1)
{
switch (scaledest)
{
case 2: menu = "/View/Zoom/2:1"; break;
case 4: menu = "/View/Zoom/4:1"; break;
case 8: menu = "/View/Zoom/8:1"; break;
case 16: menu = "/View/Zoom/16:1"; break;
}
case 16000: menu = "/View/Zoom/16:1"; break;
case 8000: menu = "/View/Zoom/8:1"; break;
case 4000: menu = "/View/Zoom/4:1"; break;
case 2000: menu = "/View/Zoom/2:1"; break;
case 1000: menu = "/View/Zoom/1:1"; break;
case 500: menu = "/View/Zoom/1:2"; break;
case 250: menu = "/View/Zoom/1:4"; break;
case 125: menu = "/View/Zoom/1:8"; break;
case 63:
case 62: menu = "/View/Zoom/1:16"; break;
}
if (!menu)
{
menu = "/View/Zoom/Other...";
label = g_strdup_printf (_("Other (%d:%d) ..."), scaledest, scalesrc);
label = g_strdup_printf (shell->scale >= 0.15 ?
_("Other (%.0f%%) ..."):
_("Other (%.2f%%) ..."),
shell->scale * 100.0);
gimp_item_factory_set_label (item_factory, menu, label);
g_free (label);
@ -1697,10 +1690,13 @@ image_menu_set_zoom (GtkItemFactory *item_factory,
gimp_item_factory_set_active (item_factory, menu, TRUE);
label = g_strdup_printf (_("_Zoom (%d:%d)"), scaledest, scalesrc);
label = g_strdup_printf (shell->scale >= 0.15 ?
_("_Zoom (%.0f%%)") :
_("_Zoom (%.2f%%)"),
shell->scale * 100.0);
gimp_item_factory_set_label (item_factory, "/View/Zoom", label);
g_free (label);
/* flag as dirty */
shell->other_scale |= (1 << 30);
/* flag as dirty */
shell->other_scale = - fabs (shell->other_scale);
}

View File

@ -521,8 +521,7 @@ info_window_update (GimpDisplay *gdisp)
res_unit == GIMP_UNIT_INCH ? _("dpi") : format_buf);
/* user zoom ratio */
g_snprintf (iwd->scale_str, MAX_BUF, "%d:%d",
SCALEDEST (shell), SCALESRC (shell));
g_snprintf (iwd->scale_str, MAX_BUF, "%.2f", shell->scale * 100);
/* number of layers */
g_snprintf (iwd->num_layers_str, MAX_BUF, "%d",

View File

@ -68,7 +68,8 @@ view_zoom_out_cmd_callback (GtkWidget *widget,
GimpDisplay *gdisp;
return_if_no_display (gdisp, data);
gimp_display_shell_scale (GIMP_DISPLAY_SHELL (gdisp->shell), GIMP_ZOOM_OUT);
gimp_display_shell_scale (GIMP_DISPLAY_SHELL (gdisp->shell),
GIMP_ZOOM_OUT, 0.0);
}
void
@ -78,7 +79,8 @@ view_zoom_in_cmd_callback (GtkWidget *widget,
GimpDisplay *gdisp;
return_if_no_display (gdisp, data);
gimp_display_shell_scale (GIMP_DISPLAY_SHELL (gdisp->shell), GIMP_ZOOM_IN);
gimp_display_shell_scale (GIMP_DISPLAY_SHELL (gdisp->shell),
GIMP_ZOOM_IN, 0.0);
}
void
@ -94,12 +96,10 @@ view_zoom_fit_cmd_callback (GtkWidget *widget,
void
view_zoom_cmd_callback (GtkWidget *widget,
gpointer data,
guint action)
guint scale)
{
GimpDisplay *gdisp;
GimpDisplayShell *shell;
guchar scalesrc;
guchar scaledest;
return_if_no_display (gdisp, data);
if (! GTK_CHECK_MENU_ITEM (widget)->active)
@ -107,11 +107,8 @@ view_zoom_cmd_callback (GtkWidget *widget,
shell = GIMP_DISPLAY_SHELL (gdisp->shell);
scalesrc = CLAMP (action % 100, 1, 0xFF);
scaledest = CLAMP (action / 100, 1, 0xFF);
if (scalesrc != SCALESRC (shell) || scaledest != SCALEDEST (shell))
gimp_display_shell_scale (shell, action);
if (fabs (scale - shell->scale) > 0.0001)
gimp_display_shell_scale (shell, GIMP_ZOOM_TO, (gdouble) scale / 10000);
}
void

View File

@ -28,7 +28,7 @@ void view_zoom_fit_cmd_callback (GtkWidget *widget,
gpointer data);
void view_zoom_cmd_callback (GtkWidget *widget,
gpointer data,
guint action);
guint scale);
void view_zoom_other_cmd_callback (GtkWidget *widget,
gpointer data);
void view_dot_for_dot_cmd_callback (GtkWidget *widget,

View File

@ -368,39 +368,39 @@ GimpItemFactoryEntry image_menu_entries[] =
MENU_SEPARATOR ("/View/Zoom/---"),
{ { N_("/View/Zoom/16:1"), NULL,
view_zoom_cmd_callback, 1601, "<RadioItem>" },
view_zoom_cmd_callback, 160000, "<RadioItem>" },
NULL,
GIMP_HELP_VIEW_ZOOM_IN, NULL },
{ { N_("/View/Zoom/8:1"), NULL,
view_zoom_cmd_callback, 801, "/View/Zoom/16:1" },
view_zoom_cmd_callback, 80000, "/View/Zoom/16:1" },
NULL,
GIMP_HELP_VIEW_ZOOM_IN, NULL },
{ { N_("/View/Zoom/4:1"), NULL,
view_zoom_cmd_callback, 401, "/View/Zoom/16:1" },
view_zoom_cmd_callback, 40000, "/View/Zoom/16:1" },
NULL,
GIMP_HELP_VIEW_ZOOM_IN, NULL },
{ { N_("/View/Zoom/2:1"), NULL,
view_zoom_cmd_callback, 201, "/View/Zoom/16:1" },
view_zoom_cmd_callback, 20000, "/View/Zoom/16:1" },
NULL,
GIMP_HELP_VIEW_ZOOM_IN, NULL },
{ { N_("/View/Zoom/1:1"), "1",
view_zoom_cmd_callback, 101, "/View/Zoom/16:1" },
view_zoom_cmd_callback, 10000, "/View/Zoom/16:1" },
NULL,
GIMP_HELP_VIEW_ZOOM_100, NULL },
{ { N_("/View/Zoom/1:2"), NULL,
view_zoom_cmd_callback, 102, "/View/Zoom/16:1" },
view_zoom_cmd_callback, 5000, "/View/Zoom/16:1" },
NULL,
GIMP_HELP_VIEW_ZOOM_OUT, NULL },
{ { N_("/View/Zoom/1:4"), NULL,
view_zoom_cmd_callback, 104, "/View/Zoom/16:1" },
view_zoom_cmd_callback, 2500, "/View/Zoom/16:1" },
NULL,
GIMP_HELP_VIEW_ZOOM_OUT, NULL },
{ { N_("/View/Zoom/1:8"), NULL,
view_zoom_cmd_callback, 108, "/View/Zoom/16:1" },
view_zoom_cmd_callback, 1250, "/View/Zoom/16:1" },
NULL,
GIMP_HELP_VIEW_ZOOM_OUT, NULL },
{ { N_("/View/Zoom/1:16"), NULL,
view_zoom_cmd_callback, 116, "/View/Zoom/16:1" },
view_zoom_cmd_callback, 625, "/View/Zoom/16:1" },
NULL,
GIMP_HELP_VIEW_ZOOM_OUT, NULL },
@ -1655,40 +1655,33 @@ image_menu_set_zoom (GtkItemFactory *item_factory,
GimpDisplayShell *shell)
{
const gchar *menu = NULL;
guint scalesrc;
guint scaledest;
guint scale;
gchar *label;
scalesrc = SCALESRC (shell);
scaledest = SCALEDEST (shell);
scale = ROUND (shell->scale * 1000);
if (scaledest == 1)
switch (scale)
{
switch (scalesrc)
{
case 1: menu = "/View/Zoom/1:1"; break;
case 2: menu = "/View/Zoom/1:2"; break;
case 4: menu = "/View/Zoom/1:4"; break;
case 8: menu = "/View/Zoom/1:8"; break;
case 16: menu = "/View/Zoom/1:16"; break;
}
}
else if (scalesrc == 1)
{
switch (scaledest)
{
case 2: menu = "/View/Zoom/2:1"; break;
case 4: menu = "/View/Zoom/4:1"; break;
case 8: menu = "/View/Zoom/8:1"; break;
case 16: menu = "/View/Zoom/16:1"; break;
}
case 16000: menu = "/View/Zoom/16:1"; break;
case 8000: menu = "/View/Zoom/8:1"; break;
case 4000: menu = "/View/Zoom/4:1"; break;
case 2000: menu = "/View/Zoom/2:1"; break;
case 1000: menu = "/View/Zoom/1:1"; break;
case 500: menu = "/View/Zoom/1:2"; break;
case 250: menu = "/View/Zoom/1:4"; break;
case 125: menu = "/View/Zoom/1:8"; break;
case 63:
case 62: menu = "/View/Zoom/1:16"; break;
}
if (!menu)
{
menu = "/View/Zoom/Other...";
label = g_strdup_printf (_("Other (%d:%d) ..."), scaledest, scalesrc);
label = g_strdup_printf (shell->scale >= 0.15 ?
_("Other (%.0f%%) ..."):
_("Other (%.2f%%) ..."),
shell->scale * 100.0);
gimp_item_factory_set_label (item_factory, menu, label);
g_free (label);
@ -1697,10 +1690,13 @@ image_menu_set_zoom (GtkItemFactory *item_factory,
gimp_item_factory_set_active (item_factory, menu, TRUE);
label = g_strdup_printf (_("_Zoom (%d:%d)"), scaledest, scalesrc);
label = g_strdup_printf (shell->scale >= 0.15 ?
_("_Zoom (%.0f%%)") :
_("_Zoom (%.2f%%)"),
shell->scale * 100.0);
gimp_item_factory_set_label (item_factory, "/View/Zoom", label);
g_free (label);
/* flag as dirty */
shell->other_scale |= (1 << 30);
/* flag as dirty */
shell->other_scale = - fabs (shell->other_scale);
}

View File

@ -64,7 +64,7 @@ display_new_invoker (Gimp *gimp,
if (success)
{
display = (GimpDisplay *) gimp_create_display (gimp, gimage, 0x0101);
display = (GimpDisplay *) gimp_create_display (gimp, gimage, 1.0);
success = (display != NULL);

View File

@ -228,9 +228,9 @@ gimp_magnify_tool_button_release (GimpTool *tool,
if (! (state & GDK_BUTTON3_MASK))
{
gint x1, y1, x2, y2, w, h;
gint scalesrc, scaledest;
gint win_width, win_height;
gint offset_x, offset_y;
gdouble new_scale;
x1 = (magnify->w < 0) ? magnify->x + magnify->w : magnify->x;
y1 = (magnify->h < 0) ? magnify->y + magnify->h : magnify->y;
@ -239,12 +239,6 @@ gimp_magnify_tool_button_release (GimpTool *tool,
x2 = x1 + w;
y2 = y1 + h;
/* these change the user zoom level, so should not be changed to
* the resolution-aware scale macros -- austin
*/
scalesrc = SCALESRC (shell);
scaledest = SCALEDEST (shell);
win_width = shell->disp_width;
win_height = shell->disp_height;
@ -252,8 +246,8 @@ gimp_magnify_tool_button_release (GimpTool *tool,
if ((SCALEX (shell, w) < options->threshold) ||
(SCALEY (shell, h) < options->threshold))
{
gimp_display_shell_scale_zoom_fraction (options->zoom_type,
&scalesrc, &scaledest);
new_scale = gimp_display_shell_scale_zoom_step (options->zoom_type,
shell->scale);
}
else
{
@ -274,19 +268,19 @@ gimp_magnify_tool_button_release (GimpTool *tool,
scale = MIN (((gdouble) w / (gdouble) width),
((gdouble) h / (gdouble) height));
break;
case GIMP_ZOOM_TO:
break;
}
scale = scale * (gdouble) scaledest / (gdouble) scalesrc;
gimp_display_shell_scale_calc_fraction (scale,
&scalesrc, &scaledest);
new_scale = shell->scale * scale;
}
offset_x = (scaledest * ((x1 + x2) / 2)) / scalesrc - (win_width / 2);
offset_y = (scaledest * ((y1 + y2) / 2)) / scalesrc - (win_height / 2);
offset_x = (new_scale * (x1 + x2) / 2) - (win_width / 2);
offset_y = (new_scale * (y1 + y2) / 2) - (win_height / 2);
gimp_display_shell_scale_by_values (shell,
(scaledest << 8) + scalesrc,
new_scale,
offset_x, offset_y,
options->allow_resize);
}

View File

@ -206,7 +206,7 @@ gimp_image_view_new_clicked (GtkWidget *widget,
if (image && gimp_container_have (editor->view->container,
GIMP_OBJECT (image)))
{
gimp_create_display (image->gimp, image, 0x0101);
gimp_create_display (image->gimp, image, 1.0);
}
}

View File

@ -144,7 +144,7 @@ gimp_toolbox_drop_drawable (GtkWidget *widget,
gimp_image_undo_enable (new_image);
gimp_create_display (gimage->gimp, new_image, 0x0101);
gimp_create_display (gimage->gimp, new_image, 1.0);
g_object_unref (new_image);
}

View File

@ -117,7 +117,8 @@ GType gimp_zoom_type_get_type (void) G_GNUC_CONST;
typedef enum
{
GIMP_ZOOM_IN, /*< desc="Zoom in" >*/
GIMP_ZOOM_OUT /*< desc="Zoom out" >*/
GIMP_ZOOM_OUT, /*< desc="Zoom out" >*/
GIMP_ZOOM_TO /*< skip >*/
} GimpZoomType;

View File

@ -42,7 +42,7 @@ HELP
%invoke = (
code => <<'CODE'
{
display = (GimpDisplay *) gimp_create_display (gimp, gimage, 0x0101);
display = (GimpDisplay *) gimp_create_display (gimp, gimage, 1.0);
success = (display != NULL);