diff --git a/bonobo/io-png.c b/bonobo/io-png.c index f5c553ea..6dd7c1c1 100644 --- a/bonobo/io-png.c +++ b/bonobo/io-png.c @@ -33,7 +33,8 @@ png_flush_fn (png_structp png_ptr) } void -image_save (Bonobo_Stream stream, GdkPixbuf *pixbuf, +image_save (Bonobo_Stream stream, + GdkPixbuf *pixbuf, CORBA_Environment *ev) { png_structp png_ptr; diff --git a/libeog/image-view.c b/libeog/image-view.c index 58c03caa..1f849ab8 100644 --- a/libeog/image-view.c +++ b/libeog/image-view.c @@ -61,11 +61,13 @@ struct _ImageViewPrivate { /* Image being displayed */ Image *image; - /* Current zoom factor */ - double zoom; + /* Current zoom factors */ + double zoomx; + double zoomy; /* Previous zoom factor and zoom anchor point stored for size_allocate */ - double old_zoom; + double old_zoomx; + double old_zoomy; double zoom_x_anchor; double zoom_y_anchor; @@ -322,7 +324,7 @@ image_view_init (ImageView *view) GTK_WIDGET_UNSET_FLAGS (view, GTK_NO_WINDOW); GTK_WIDGET_SET_FLAGS (view, GTK_CAN_FOCUS); - priv->zoom = 1.0; + priv->zoomx = priv->zoomy = 1.0; } /* Frees the dirty region uta and removes the idle handler */ @@ -413,15 +415,15 @@ image_view_finalize (GtkObject *object) /* Computes the size in pixels of the scaled image */ static void -compute_scaled_size (ImageView *view, double zoom, int *width, int *height) +compute_scaled_size (ImageView *view, double zoomx, double zoomy, int *width, int *height) { ImageViewPrivate *priv; priv = view->priv; if (priv->image && priv->image->pixbuf) { - *width = floor (gdk_pixbuf_get_width (priv->image->pixbuf) * zoom + 0.5); - *height = floor (gdk_pixbuf_get_height (priv->image->pixbuf) * zoom + 0.5); + *width = floor (gdk_pixbuf_get_width (priv->image->pixbuf) * zoomx + 0.5); + *height = floor (gdk_pixbuf_get_height (priv->image->pixbuf) * zoomy + 0.5); } else *width = *height = 0; } @@ -498,6 +500,14 @@ pack_pixbuf (GdkPixbuf *pixbuf) #endif +#define DOUBLE_EQUAL(a,b) (fabs (a - b) < 1e-6) +static gboolean +unity_zoom (ImageViewPrivate *priv) +{ + return (DOUBLE_EQUAL (priv->zoomx, 1.0) && + DOUBLE_EQUAL (priv->zoomx, 1.0)); +} + /* Paints a rectangle of the dirty region */ static void paint_rectangle (ImageView *view, ArtIRect *rect, GdkInterpType interp_type) @@ -513,7 +523,7 @@ paint_rectangle (ImageView *view, ArtIRect *rect, GdkInterpType interp_type) priv = view->priv; - compute_scaled_size (view, priv->zoom, &scaled_width, &scaled_height); + compute_scaled_size (view, priv->zoomx, priv->zoomy, &scaled_width, &scaled_height); width = GTK_WIDGET (view)->allocation.width; height = GTK_WIDGET (view)->allocation.height; @@ -589,7 +599,8 @@ paint_rectangle (ImageView *view, ArtIRect *rect, GdkInterpType interp_type) /* Short-circuit the fast case to avoid a memcpy() */ - if (priv->zoom == 1.0 + + if (unity_zoom (priv) && gdk_pixbuf_get_colorspace (priv->image->pixbuf) == GDK_COLORSPACE_RGB && !gdk_pixbuf_get_has_alpha (priv->image->pixbuf) && gdk_pixbuf_get_bits_per_sample (priv->image->pixbuf) == 8) { @@ -687,8 +698,8 @@ paint_rectangle (ImageView *view, ArtIRect *rect, GdkInterpType interp_type) 0, 0, d.x1 - d.x0, d.y1 - d.y0, -(d.x0 - xofs), -(d.y0 - yofs), - priv->zoom, priv->zoom, - (priv->zoom == 1.0) ? GDK_INTERP_NEAREST : interp_type, + priv->zoomx, priv->zoomy, + unity_zoom (priv) ? GDK_INTERP_NEAREST : interp_type, 255, d.x0 - xofs, d.y0 - yofs, check_size, @@ -813,7 +824,7 @@ request_paint_area (ImageView *view, GdkRectangle *area, gboolean asynch) * speed. */ - if (!asynch && (priv->interp_type == GDK_INTERP_NEAREST || priv->zoom == 1.0)) { + if (!asynch && (priv->interp_type == GDK_INTERP_NEAREST || unity_zoom (priv))) { paint_rectangle (view, &r, priv->interp_type); return; } @@ -1091,29 +1102,29 @@ compute_center_zoom_offsets (ImageView *view, priv = view->priv; g_assert (priv->need_zoom_change); - compute_scaled_size (view, priv->old_zoom, &old_scaled_width, &old_scaled_height); + compute_scaled_size (view, priv->old_zoomx, priv->old_zoomy, &old_scaled_width, &old_scaled_height); if (old_scaled_width < old_width) - view_cx = (priv->zoom_x_anchor * old_scaled_width) / priv->old_zoom; + view_cx = (priv->zoom_x_anchor * old_scaled_width) / priv->old_zoomx; else - view_cx = (priv->xofs + priv->zoom_x_anchor * old_width) / priv->old_zoom; + view_cx = (priv->xofs + priv->zoom_x_anchor * old_width) / priv->old_zoomx; if (old_scaled_height < old_height) - view_cy = (priv->zoom_y_anchor * old_scaled_height) / priv->old_zoom; + view_cy = (priv->zoom_y_anchor * old_scaled_height) / priv->old_zoomy; else - view_cy = (priv->yofs + priv->zoom_y_anchor * old_height) / priv->old_zoom; + view_cy = (priv->yofs + priv->zoom_y_anchor * old_height) / priv->old_zoomy; - compute_scaled_size (view, priv->zoom, &new_scaled_width, &new_scaled_height); + compute_scaled_size (view, priv->zoomx, priv->zoomy, &new_scaled_width, &new_scaled_height); if (new_scaled_width < new_width) *xofs = 0; else - *xofs = floor (view_cx * priv->zoom - priv->zoom_x_anchor * new_width + 0.5); + *xofs = floor (view_cx * priv->zoomx - priv->zoom_x_anchor * new_width + 0.5); if (new_scaled_height < new_height) *yofs = 0; else - *yofs = floor (view_cy * priv->zoom - priv->zoom_y_anchor * new_height + 0.5); + *yofs = floor (view_cy * priv->zoomy - priv->zoom_y_anchor * new_height + 0.5); } /* Size_allocate handler for the image view */ @@ -1160,7 +1171,7 @@ image_view_size_allocate (GtkWidget *widget, GtkAllocation *allocation) /* Set scroll increments */ - compute_scaled_size (view, priv->zoom, &scaled_width, &scaled_height); + compute_scaled_size (view, priv->zoomx, priv->zoomy, &scaled_width, &scaled_height); priv->hadj->page_size = MIN (scaled_width, allocation->width); priv->hadj->page_increment = allocation->width / 2; @@ -1262,12 +1273,12 @@ image_view_button_press (GtkWidget *widget, GdkEventButton *event) case 4: set_zoom_anchor (view, event->x, event->y); - image_view_set_zoom (view, priv->zoom * 1.05); + image_view_set_zoom (view, priv->zoomx * 1.05, priv->zoomy * 1.05); return TRUE; case 5: set_zoom_anchor (view, event->x, event->y); - image_view_set_zoom (view, priv->zoom / 1.05); + image_view_set_zoom (view, priv->zoomx / 1.05, priv->zoomy / 1.05); return TRUE; default: @@ -1376,7 +1387,7 @@ image_view_key_press (GtkWidget *widget, GdkEventKey *event) ImageView *view; ImageViewPrivate *priv; gboolean do_zoom; - double zoom; + double zoomx, zoomy; gboolean do_scroll; int xofs, yofs; @@ -1386,7 +1397,7 @@ image_view_key_press (GtkWidget *widget, GdkEventKey *event) do_zoom = FALSE; do_scroll = FALSE; xofs = yofs = 0; - zoom = 1.0; + zoomx = zoomy = 1.0; if ((event->state & (GDK_MODIFIER_MASK & ~GDK_LOCK_MASK)) != 0) return FALSE; @@ -1419,18 +1430,20 @@ image_view_key_press (GtkWidget *widget, GdkEventKey *event) case GDK_equal: case GDK_KP_Add: do_zoom = TRUE; - zoom = priv->zoom * 1.05; + zoomx = priv->zoomx * 1.05; + zoomy = priv->zoomy * 1.05; break; case GDK_minus: case GDK_KP_Subtract: do_zoom = TRUE; - zoom = priv->zoom / 1.05; + zoomx = priv->zoomx / 1.05; + zoomy = priv->zoomy / 1.05; break; case GDK_1: do_zoom = TRUE; - zoom = 1.0; + zoomx = zoomy = 1.0; break; case GDK_F: @@ -1453,7 +1466,7 @@ image_view_key_press (GtkWidget *widget, GdkEventKey *event) else set_default_zoom_anchor (view); - image_view_set_zoom (view, zoom); + image_view_set_zoom (view, zoomx, zoomy); } if (do_scroll) { @@ -1650,28 +1663,34 @@ image_view_get_image (ImageView *view) * Sets the zoom factor for an image view. **/ void -image_view_set_zoom (ImageView *view, double zoom) +image_view_set_zoom (ImageView *view, double zoomx, double zoomy) { ImageViewPrivate *priv; g_return_if_fail (view != NULL); g_return_if_fail (IS_IMAGE_VIEW (view)); - g_return_if_fail (zoom > 0.0); + g_return_if_fail (zoomx > 0.0); + g_return_if_fail (zoomy > 0.0); priv = view->priv; - if (zoom > MAX_ZOOM_FACTOR) - zoom = MAX_ZOOM_FACTOR; + if (zoomx > MAX_ZOOM_FACTOR) + zoomx = MAX_ZOOM_FACTOR; + if (zoomy > MAX_ZOOM_FACTOR) + zoomy = MAX_ZOOM_FACTOR; - if (priv->zoom == zoom) + if (DOUBLE_EQUAL (priv->zoomx, zoomx) && + DOUBLE_EQUAL (priv->zoomy, zoomy)) return; if (!priv->need_zoom_change) { - priv->old_zoom = priv->zoom; + priv->old_zoomx = priv->zoomx; + priv->old_zoomy = priv->zoomy; priv->need_zoom_change = TRUE; } - priv->zoom = zoom; + priv->zoomx = zoomx; + priv->zoomy = zoomy; gtk_widget_queue_resize (GTK_WIDGET (view)); } @@ -1693,7 +1712,7 @@ image_view_get_zoom (ImageView *view) g_return_val_if_fail (IS_IMAGE_VIEW (view), -1.0); priv = view->priv; - return priv->zoom; + return (priv->zoomx + priv->zoomy) / 2; } /** diff --git a/libeog/image-view.h b/libeog/image-view.h index 45ef9e4f..ccadaee5 100644 --- a/libeog/image-view.h +++ b/libeog/image-view.h @@ -69,7 +69,7 @@ GtkWidget *image_view_new (void); void image_view_set_image (ImageView *view, Image *image); Image *image_view_get_image (ImageView *view); -void image_view_set_zoom (ImageView *view, double zoom); +void image_view_set_zoom (ImageView *view, double zoomx, double zoomy); double image_view_get_zoom (ImageView *view); void image_view_set_interp_type (ImageView *view, GdkInterpType interp_type); diff --git a/libeog/ui-image.c b/libeog/ui-image.c index 90604ec1..34fc0005 100644 --- a/libeog/ui-image.c +++ b/libeog/ui-image.c @@ -227,7 +227,7 @@ ui_image_zoom_fit (UIImage *ui) image = image_view_get_image (IMAGE_VIEW (priv->view)); if (!image) { - image_view_set_zoom (IMAGE_VIEW (priv->view), 1.0); + image_view_set_zoom (IMAGE_VIEW (priv->view), 1.0, 1.0); return; } @@ -248,5 +248,5 @@ ui_image_zoom_fit (UIImage *ui) iw = ih = 0; zoom = zoom_fit_scale (w - 2 * xthick, h - 2 * ythick, iw, ih, TRUE); - image_view_set_zoom (IMAGE_VIEW (priv->view), zoom); + image_view_set_zoom (IMAGE_VIEW (priv->view), zoom, zoom); } diff --git a/src/ChangeLog b/src/ChangeLog index 8b39f6bd..93e625e8 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,14 @@ +2001-01-12 Michael Meeks + + * image-view.c (image_view_init, compute_scaled_size) upd. + (paint_rectangle): add DOUBLE_COMPARE macro. + (unity_zoom): impl. + (compute_center_zoom_offsets): upd. + (image_view_set_zoom): upd. + (image_view_get_zoom): hack. + + old_zoom ... + 2001-01-03 Jason Leach * preferences-dialog.glade: Added brief descriptions to the diff --git a/src/commands.c b/src/commands.c index b3a28c59..33044775 100644 --- a/src/commands.c +++ b/src/commands.c @@ -42,7 +42,7 @@ set_window_zoom (Window *window, double zoom, gboolean mult) if (mult) zoom *= image_view_get_zoom (view); - image_view_set_zoom (view, zoom); + image_view_set_zoom (view, zoom, zoom); } void @@ -132,11 +132,11 @@ cmd_cb_full_screen (GtkWidget *widget, gpointer data) switch (zoom_type) { case FULL_SCREEN_ZOOM_1: - image_view_set_zoom (view, 1.0); + image_view_set_zoom (view, 1.0, 1.0); break; case FULL_SCREEN_ZOOM_SAME_AS_WINDOW: - image_view_set_zoom (view, zoom); + image_view_set_zoom (view, zoom, zoom); break; case FULL_SCREEN_ZOOM_FIT: diff --git a/src/image-view.c b/src/image-view.c index 58c03caa..1f849ab8 100644 --- a/src/image-view.c +++ b/src/image-view.c @@ -61,11 +61,13 @@ struct _ImageViewPrivate { /* Image being displayed */ Image *image; - /* Current zoom factor */ - double zoom; + /* Current zoom factors */ + double zoomx; + double zoomy; /* Previous zoom factor and zoom anchor point stored for size_allocate */ - double old_zoom; + double old_zoomx; + double old_zoomy; double zoom_x_anchor; double zoom_y_anchor; @@ -322,7 +324,7 @@ image_view_init (ImageView *view) GTK_WIDGET_UNSET_FLAGS (view, GTK_NO_WINDOW); GTK_WIDGET_SET_FLAGS (view, GTK_CAN_FOCUS); - priv->zoom = 1.0; + priv->zoomx = priv->zoomy = 1.0; } /* Frees the dirty region uta and removes the idle handler */ @@ -413,15 +415,15 @@ image_view_finalize (GtkObject *object) /* Computes the size in pixels of the scaled image */ static void -compute_scaled_size (ImageView *view, double zoom, int *width, int *height) +compute_scaled_size (ImageView *view, double zoomx, double zoomy, int *width, int *height) { ImageViewPrivate *priv; priv = view->priv; if (priv->image && priv->image->pixbuf) { - *width = floor (gdk_pixbuf_get_width (priv->image->pixbuf) * zoom + 0.5); - *height = floor (gdk_pixbuf_get_height (priv->image->pixbuf) * zoom + 0.5); + *width = floor (gdk_pixbuf_get_width (priv->image->pixbuf) * zoomx + 0.5); + *height = floor (gdk_pixbuf_get_height (priv->image->pixbuf) * zoomy + 0.5); } else *width = *height = 0; } @@ -498,6 +500,14 @@ pack_pixbuf (GdkPixbuf *pixbuf) #endif +#define DOUBLE_EQUAL(a,b) (fabs (a - b) < 1e-6) +static gboolean +unity_zoom (ImageViewPrivate *priv) +{ + return (DOUBLE_EQUAL (priv->zoomx, 1.0) && + DOUBLE_EQUAL (priv->zoomx, 1.0)); +} + /* Paints a rectangle of the dirty region */ static void paint_rectangle (ImageView *view, ArtIRect *rect, GdkInterpType interp_type) @@ -513,7 +523,7 @@ paint_rectangle (ImageView *view, ArtIRect *rect, GdkInterpType interp_type) priv = view->priv; - compute_scaled_size (view, priv->zoom, &scaled_width, &scaled_height); + compute_scaled_size (view, priv->zoomx, priv->zoomy, &scaled_width, &scaled_height); width = GTK_WIDGET (view)->allocation.width; height = GTK_WIDGET (view)->allocation.height; @@ -589,7 +599,8 @@ paint_rectangle (ImageView *view, ArtIRect *rect, GdkInterpType interp_type) /* Short-circuit the fast case to avoid a memcpy() */ - if (priv->zoom == 1.0 + + if (unity_zoom (priv) && gdk_pixbuf_get_colorspace (priv->image->pixbuf) == GDK_COLORSPACE_RGB && !gdk_pixbuf_get_has_alpha (priv->image->pixbuf) && gdk_pixbuf_get_bits_per_sample (priv->image->pixbuf) == 8) { @@ -687,8 +698,8 @@ paint_rectangle (ImageView *view, ArtIRect *rect, GdkInterpType interp_type) 0, 0, d.x1 - d.x0, d.y1 - d.y0, -(d.x0 - xofs), -(d.y0 - yofs), - priv->zoom, priv->zoom, - (priv->zoom == 1.0) ? GDK_INTERP_NEAREST : interp_type, + priv->zoomx, priv->zoomy, + unity_zoom (priv) ? GDK_INTERP_NEAREST : interp_type, 255, d.x0 - xofs, d.y0 - yofs, check_size, @@ -813,7 +824,7 @@ request_paint_area (ImageView *view, GdkRectangle *area, gboolean asynch) * speed. */ - if (!asynch && (priv->interp_type == GDK_INTERP_NEAREST || priv->zoom == 1.0)) { + if (!asynch && (priv->interp_type == GDK_INTERP_NEAREST || unity_zoom (priv))) { paint_rectangle (view, &r, priv->interp_type); return; } @@ -1091,29 +1102,29 @@ compute_center_zoom_offsets (ImageView *view, priv = view->priv; g_assert (priv->need_zoom_change); - compute_scaled_size (view, priv->old_zoom, &old_scaled_width, &old_scaled_height); + compute_scaled_size (view, priv->old_zoomx, priv->old_zoomy, &old_scaled_width, &old_scaled_height); if (old_scaled_width < old_width) - view_cx = (priv->zoom_x_anchor * old_scaled_width) / priv->old_zoom; + view_cx = (priv->zoom_x_anchor * old_scaled_width) / priv->old_zoomx; else - view_cx = (priv->xofs + priv->zoom_x_anchor * old_width) / priv->old_zoom; + view_cx = (priv->xofs + priv->zoom_x_anchor * old_width) / priv->old_zoomx; if (old_scaled_height < old_height) - view_cy = (priv->zoom_y_anchor * old_scaled_height) / priv->old_zoom; + view_cy = (priv->zoom_y_anchor * old_scaled_height) / priv->old_zoomy; else - view_cy = (priv->yofs + priv->zoom_y_anchor * old_height) / priv->old_zoom; + view_cy = (priv->yofs + priv->zoom_y_anchor * old_height) / priv->old_zoomy; - compute_scaled_size (view, priv->zoom, &new_scaled_width, &new_scaled_height); + compute_scaled_size (view, priv->zoomx, priv->zoomy, &new_scaled_width, &new_scaled_height); if (new_scaled_width < new_width) *xofs = 0; else - *xofs = floor (view_cx * priv->zoom - priv->zoom_x_anchor * new_width + 0.5); + *xofs = floor (view_cx * priv->zoomx - priv->zoom_x_anchor * new_width + 0.5); if (new_scaled_height < new_height) *yofs = 0; else - *yofs = floor (view_cy * priv->zoom - priv->zoom_y_anchor * new_height + 0.5); + *yofs = floor (view_cy * priv->zoomy - priv->zoom_y_anchor * new_height + 0.5); } /* Size_allocate handler for the image view */ @@ -1160,7 +1171,7 @@ image_view_size_allocate (GtkWidget *widget, GtkAllocation *allocation) /* Set scroll increments */ - compute_scaled_size (view, priv->zoom, &scaled_width, &scaled_height); + compute_scaled_size (view, priv->zoomx, priv->zoomy, &scaled_width, &scaled_height); priv->hadj->page_size = MIN (scaled_width, allocation->width); priv->hadj->page_increment = allocation->width / 2; @@ -1262,12 +1273,12 @@ image_view_button_press (GtkWidget *widget, GdkEventButton *event) case 4: set_zoom_anchor (view, event->x, event->y); - image_view_set_zoom (view, priv->zoom * 1.05); + image_view_set_zoom (view, priv->zoomx * 1.05, priv->zoomy * 1.05); return TRUE; case 5: set_zoom_anchor (view, event->x, event->y); - image_view_set_zoom (view, priv->zoom / 1.05); + image_view_set_zoom (view, priv->zoomx / 1.05, priv->zoomy / 1.05); return TRUE; default: @@ -1376,7 +1387,7 @@ image_view_key_press (GtkWidget *widget, GdkEventKey *event) ImageView *view; ImageViewPrivate *priv; gboolean do_zoom; - double zoom; + double zoomx, zoomy; gboolean do_scroll; int xofs, yofs; @@ -1386,7 +1397,7 @@ image_view_key_press (GtkWidget *widget, GdkEventKey *event) do_zoom = FALSE; do_scroll = FALSE; xofs = yofs = 0; - zoom = 1.0; + zoomx = zoomy = 1.0; if ((event->state & (GDK_MODIFIER_MASK & ~GDK_LOCK_MASK)) != 0) return FALSE; @@ -1419,18 +1430,20 @@ image_view_key_press (GtkWidget *widget, GdkEventKey *event) case GDK_equal: case GDK_KP_Add: do_zoom = TRUE; - zoom = priv->zoom * 1.05; + zoomx = priv->zoomx * 1.05; + zoomy = priv->zoomy * 1.05; break; case GDK_minus: case GDK_KP_Subtract: do_zoom = TRUE; - zoom = priv->zoom / 1.05; + zoomx = priv->zoomx / 1.05; + zoomy = priv->zoomy / 1.05; break; case GDK_1: do_zoom = TRUE; - zoom = 1.0; + zoomx = zoomy = 1.0; break; case GDK_F: @@ -1453,7 +1466,7 @@ image_view_key_press (GtkWidget *widget, GdkEventKey *event) else set_default_zoom_anchor (view); - image_view_set_zoom (view, zoom); + image_view_set_zoom (view, zoomx, zoomy); } if (do_scroll) { @@ -1650,28 +1663,34 @@ image_view_get_image (ImageView *view) * Sets the zoom factor for an image view. **/ void -image_view_set_zoom (ImageView *view, double zoom) +image_view_set_zoom (ImageView *view, double zoomx, double zoomy) { ImageViewPrivate *priv; g_return_if_fail (view != NULL); g_return_if_fail (IS_IMAGE_VIEW (view)); - g_return_if_fail (zoom > 0.0); + g_return_if_fail (zoomx > 0.0); + g_return_if_fail (zoomy > 0.0); priv = view->priv; - if (zoom > MAX_ZOOM_FACTOR) - zoom = MAX_ZOOM_FACTOR; + if (zoomx > MAX_ZOOM_FACTOR) + zoomx = MAX_ZOOM_FACTOR; + if (zoomy > MAX_ZOOM_FACTOR) + zoomy = MAX_ZOOM_FACTOR; - if (priv->zoom == zoom) + if (DOUBLE_EQUAL (priv->zoomx, zoomx) && + DOUBLE_EQUAL (priv->zoomy, zoomy)) return; if (!priv->need_zoom_change) { - priv->old_zoom = priv->zoom; + priv->old_zoomx = priv->zoomx; + priv->old_zoomy = priv->zoomy; priv->need_zoom_change = TRUE; } - priv->zoom = zoom; + priv->zoomx = zoomx; + priv->zoomy = zoomy; gtk_widget_queue_resize (GTK_WIDGET (view)); } @@ -1693,7 +1712,7 @@ image_view_get_zoom (ImageView *view) g_return_val_if_fail (IS_IMAGE_VIEW (view), -1.0); priv = view->priv; - return priv->zoom; + return (priv->zoomx + priv->zoomy) / 2; } /** diff --git a/src/image-view.h b/src/image-view.h index 45ef9e4f..ccadaee5 100644 --- a/src/image-view.h +++ b/src/image-view.h @@ -69,7 +69,7 @@ GtkWidget *image_view_new (void); void image_view_set_image (ImageView *view, Image *image); Image *image_view_get_image (ImageView *view); -void image_view_set_zoom (ImageView *view, double zoom); +void image_view_set_zoom (ImageView *view, double zoomx, double zoomy); double image_view_get_zoom (ImageView *view); void image_view_set_interp_type (ImageView *view, GdkInterpType interp_type); diff --git a/src/ui-image.c b/src/ui-image.c index 90604ec1..34fc0005 100644 --- a/src/ui-image.c +++ b/src/ui-image.c @@ -227,7 +227,7 @@ ui_image_zoom_fit (UIImage *ui) image = image_view_get_image (IMAGE_VIEW (priv->view)); if (!image) { - image_view_set_zoom (IMAGE_VIEW (priv->view), 1.0); + image_view_set_zoom (IMAGE_VIEW (priv->view), 1.0, 1.0); return; } @@ -248,5 +248,5 @@ ui_image_zoom_fit (UIImage *ui) iw = ih = 0; zoom = zoom_fit_scale (w - 2 * xthick, h - 2 * ythick, iw, ih, TRUE); - image_view_set_zoom (IMAGE_VIEW (priv->view), zoom); + image_view_set_zoom (IMAGE_VIEW (priv->view), zoom, zoom); } diff --git a/viewer/ChangeLog b/viewer/ChangeLog index 9f456e07..bbfaafe2 100644 --- a/viewer/ChangeLog +++ b/viewer/ChangeLog @@ -1,3 +1,20 @@ +2001-01-17 Michael Meeks + + * eog-embeddable-view.c (eog_embeddable_view_construct): + don't allow scroll bars ever. + (configure_size): upd. + + * eog-image-view.c (eog_image_view_set_zoom): impl. + +2001-01-16 Michael Meeks + + * eog-embeddable-view.c (eog_embeddable_view_construct): + connect to view_size_allocation. (configure_size): impl. + (view_size_allocate_cb): hook up. + + * eog-image-view.c (eog_image_view_set_prop), + (eog_image_view_get_prop): update to new property bag API. + 2001-01-17 Michael Meeks * eog-image-view.c (eog_image_view_set_prop), diff --git a/viewer/eog-embeddable-view.c b/viewer/eog-embeddable-view.c index 9318e1e9..3b2c9c54 100644 --- a/viewer/eog-embeddable-view.c +++ b/viewer/eog-embeddable-view.c @@ -15,7 +15,9 @@ #include -#include +#include "gtkscrollframe.h" +#include "image-view.h" +#include "eog-embeddable-view.h" struct _EogEmbeddableViewPrivate { EogImage *image; @@ -168,6 +170,60 @@ eog_embeddable_view_corba_object_create (BonoboObject *object) return (Bonobo_View) bonobo_object_activate_servant (object, servant); } +#define EOG_DEBUG + +static void +configure_size (EogEmbeddableView *view, + GtkAllocation *allocation) +{ + GdkPixbuf *pixbuf; + double zoomx, zoomy; + + if (!view->priv->image) + return; + + if (!allocation) + allocation = &view->priv->root->allocation; + +/* g_warning ("Configure size allocation '%d' '%d'", + allocation->width, allocation->height);*/ + + pixbuf = eog_image_get_pixbuf ( + view->priv->image); + + if (!pixbuf) + return; + + zoomx = (1.0 * allocation->width) / + gdk_pixbuf_get_width (pixbuf); + zoomy = (1.0 * allocation->height) / + gdk_pixbuf_get_height (pixbuf); + +/* g_warning ("Set to zoom %f %f, pixbuf %d %d", + zoomx, zoomy, + gdk_pixbuf_get_width (pixbuf), + gdk_pixbuf_get_height (pixbuf));*/ + + eog_image_view_set_zoom (view->priv->image_view, + zoomx, zoomy); +} + +static void +view_size_allocate_cb (GtkWidget *drawing_area, + GtkAllocation *allocation, + EogEmbeddableView *view) +{ + configure_size (view, allocation); + +} + +static void +set_image_cb (EogImage *image, + EogEmbeddableView *view) +{ + configure_size (view, NULL); +} + EogEmbeddableView * eog_embeddable_view_construct (EogEmbeddableView *embeddable_view, Bonobo_View corba_object, @@ -187,6 +243,15 @@ eog_embeddable_view_construct (EogEmbeddableView *embeddable_view, embeddable_view->priv->image_view = eog_image_view_new (image, TRUE); embeddable_view->priv->root = eog_image_view_get_widget (embeddable_view->priv->image_view); + gtk_scroll_frame_set_policy (GTK_SCROLL_FRAME (embeddable_view->priv->root), + GTK_POLICY_NEVER, + GTK_POLICY_NEVER); + + gtk_signal_connect (GTK_OBJECT (image), "set_image", + GTK_SIGNAL_FUNC (set_image_cb), embeddable_view); + + gtk_signal_connect (GTK_OBJECT (embeddable_view->priv->root), "size_allocate", + GTK_SIGNAL_FUNC (view_size_allocate_cb), embeddable_view); bonobo_object_add_interface (BONOBO_OBJECT (embeddable_view), BONOBO_OBJECT (embeddable_view->priv->image_view)); diff --git a/viewer/eog-image-io.h b/viewer/eog-image-io.h index 42c1a33d..d01a5cd4 100644 --- a/viewer/eog-image-io.h +++ b/viewer/eog-image-io.h @@ -25,25 +25,23 @@ BEGIN_GNOME_DECLS -/* You may call all these functions with or without the image library +/* + * You may call all these functions with or without the image library * being installed; if the image library is not installed, this'll * set the Persist::WrongDataType exception and return FALSE. */ -gboolean -eog_image_save_xpm (EogImage *image, - Bonobo_Stream stream, - CORBA_Environment *ev); +gboolean eog_image_save_xpm (EogImage *image, + Bonobo_Stream stream, + CORBA_Environment *ev); -gboolean -eog_image_save_png (EogImage *image, - Bonobo_Stream stream, - CORBA_Environment *ev); +gboolean eog_image_save_png (EogImage *image, + Bonobo_Stream stream, + CORBA_Environment *ev); -gboolean -eog_image_save_jpeg (EogImage *image, - Bonobo_Stream stream, - CORBA_Environment *ev); +gboolean eog_image_save_jpeg (EogImage *image, + Bonobo_Stream stream, + CORBA_Environment *ev); END_GNOME_DECLS diff --git a/viewer/eog-image-view.c b/viewer/eog-image-view.c index e63eb0b6..d805bb46 100644 --- a/viewer/eog-image-view.c +++ b/viewer/eog-image-view.c @@ -476,7 +476,25 @@ eog_image_view_set_zoom_factor (EogImageView *image_view, view = IMAGE_VIEW (image_view->priv->image_view); - image_view_set_zoom (view, zoom_factor); + image_view_set_zoom (view, zoom_factor, zoom_factor); +} + +void +eog_image_view_set_zoom (EogImageView *image_view, + double zoomx, + double zoomy) + +{ + ImageView *view; + + g_return_if_fail (zoomx > 0.0); + g_return_if_fail (zoomy > 0.0); + g_return_if_fail (image_view != NULL); + g_return_if_fail (EOG_IS_IMAGE_VIEW (image_view)); + + view = IMAGE_VIEW (image_view->priv->image_view); + + image_view_set_zoom (view, zoomx, zoomy); } void diff --git a/viewer/eog-image-view.h b/viewer/eog-image-view.h index 1b5db04a..f02fd0b5 100644 --- a/viewer/eog-image-view.h +++ b/viewer/eog-image-view.h @@ -60,6 +60,10 @@ void eog_image_view_set_zoom_factor (EogImageView *image_view, float zoom_factor); void eog_image_view_zoom_to_fit (EogImageView *image_view, gboolean keep_aspect_ratio); +void eog_image_view_set_zoom (EogImageView *image_view, + double zoomx, + double zoomy); + /* Properties */