[PATCH] EEL - Add pixbuf minimum scale functions



This attached patch for eel is from bug 320830 [1] required as a
dependency to implement a new background mode for control center in bug
105231 [2]. It was requested to be posted on the Nautilus list for any
comments.

It adds an EEL_BACKGROUND_ZOOM background placement enum and the two
functions eel_gdk_scale_to_min_factor() and
eel_gdk_pixbuf_scale_to_min(). The functions are the opposite of the
existing eel_gdk_scale_to_fit_factor and eel_gdk_pixbuf_scale_to_fit
functions. Instead of scaling to fit within a box, these are used scale
to fit outwith a box.

Two possible issues, the first of which is the function label "min"
which may not be ideal so perhaps "outfit" instead?

The name of the enum EEL_BACKGROUND_ZOOM was based on the submitted name
"Zoom" of the new background mode but the name has not been decided upon
yet AFAIK. See bug 105321 [2] for naming discussions with "Cropped"
being about the next best and other suggestions welcome. However as it's
internal only and the existing EEL_BACKGROUND_STRETCHED doesn't exactly
match its current label "Fill Screen" either, it's not too critical but
would be nice to match.

[1] http://bugzilla.gnome.org/show_bug.cgi?id=320830
[2] http://bugzilla.gnome.org/show_bug.cgi?id=105231

-- 
Alan.

"One must never be purposelessnessnesslessness."
diff -ur eel.orig/eel/eel-background.c eel/eel/eel-background.c
--- eel.orig/eel/eel-background.c	2005-10-27 16:03:37.000000000 +0100
+++ eel/eel/eel-background.c	2005-11-22 00:17:03.000000000 +0000
@@ -551,6 +551,7 @@
 	switch (background->details->image_placement) {
 	case EEL_BACKGROUND_TILED:
 	case EEL_BACKGROUND_SCALED:
+	case EEL_BACKGROUND_ZOOM:
 		return TRUE;
 	default:
 		g_assert_not_reached ();
@@ -676,6 +677,24 @@
 				}
 			}
 			break;
+		case EEL_BACKGROUND_ZOOM:
+			eel_gdk_scale_to_min_factor (background->details->image_width_unscaled,
+						     background->details->image_height_unscaled,
+						     dest_width, dest_height,
+						     &fit_width, &fit_height);
+
+			if (image_width != fit_width || image_height != fit_height) {
+				if (cur_scaled) {
+					reload_image = TRUE;
+				} else {
+					scaled_pixbuf = eel_gdk_pixbuf_scale_to_min (background->details->image, dest_width, dest_height);
+					g_object_unref (background->details->image);
+					background->details->image = scaled_pixbuf;
+					image_width = gdk_pixbuf_get_width (scaled_pixbuf);
+					image_height = gdk_pixbuf_get_height (scaled_pixbuf);
+				}
+			}
+			break;
 		}
 
 		if (reload_image) {
@@ -757,6 +776,7 @@
 		case EEL_BACKGROUND_CENTERED:
 		case EEL_BACKGROUND_SCALED:
 		case EEL_BACKGROUND_SCALED_ASPECT:
+		case EEL_BACKGROUND_ZOOM:
 			*pixmap_width = entire_width;
 			*pixmap_height = entire_height;
 		}
@@ -1354,6 +1374,7 @@
 		case EEL_BACKGROUND_CENTERED:
 		case EEL_BACKGROUND_SCALED:
 		case EEL_BACKGROUND_SCALED_ASPECT:
+		case EEL_BACKGROUND_ZOOM:
 			/* Since the image has already been scaled, all these cases
 			 * can be treated identically.
 			 */
diff -ur eel.orig/eel/eel-background.h eel/eel/eel-background.h
--- eel.orig/eel/eel-background.h	2005-03-16 08:29:16.000000000 +0000
+++ eel/eel/eel-background.h	2005-11-22 00:17:03.000000000 +0000
@@ -63,7 +63,8 @@
 	EEL_BACKGROUND_TILED = 0, /* zero makes this the default placement */
 	EEL_BACKGROUND_CENTERED,
 	EEL_BACKGROUND_SCALED,
-	EEL_BACKGROUND_SCALED_ASPECT
+	EEL_BACKGROUND_SCALED_ASPECT,
+	EEL_BACKGROUND_ZOOM
 } EelBackgroundImagePlacement;
 
 GtkType                     eel_background_get_type                         (void);
diff -ur eel.orig/eel/eel-gdk-pixbuf-extensions.c eel/eel/eel-gdk-pixbuf-extensions.c
--- eel.orig/eel/eel-gdk-pixbuf-extensions.c	2005-10-27 16:03:37.000000000 +0100
+++ eel/eel/eel-gdk-pixbuf-extensions.c	2005-11-22 00:17:03.000000000 +0000
@@ -404,6 +404,37 @@
 	}
 }
 
+double
+eel_gdk_scale_to_min_factor (int width, int height,
+			     int min_width, int min_height,
+			     int *scaled_width, int *scaled_height)
+{
+	double scale_factor;
+
+	scale_factor = MAX (min_width / (double) width, min_height / (double) height);
+
+	*scaled_width  = floor (width * scale_factor + .5);
+	*scaled_height = floor (height * scale_factor + .5);
+
+	return scale_factor;
+}
+
+/* Returns a scaled copy of pixbuf, preserving aspect ratio. The copy will
+ * be scaled as small as possible without going under the specified width and height.
+ */
+GdkPixbuf *
+eel_gdk_pixbuf_scale_to_min (GdkPixbuf *pixbuf, int min_width, int min_height)
+{
+	int scaled_width;
+	int scaled_height;
+
+	eel_gdk_scale_to_min_factor (gdk_pixbuf_get_width(pixbuf), gdk_pixbuf_get_height(pixbuf),
+				     min_width, min_height,
+				     &scaled_width, &scaled_height);
+
+	return gdk_pixbuf_scale_simple (pixbuf, scaled_width, scaled_height, GDK_INTERP_BILINEAR);	
+}
+
 /**
  * eel_gdk_pixbuf_is_valid:
  * @pixbuf: A GdkPixbuf
diff -ur eel.orig/eel/eel-gdk-pixbuf-extensions.h eel/eel/eel-gdk-pixbuf-extensions.h
--- eel.orig/eel/eel-gdk-pixbuf-extensions.h	2002-07-10 09:20:11.000000000 +0100
+++ eel/eel/eel-gdk-pixbuf-extensions.h	2005-11-22 00:17:03.000000000 +0000
@@ -71,6 +71,15 @@
 							       int                    max_height,
 							       int                   *scaled_width,
 							       int                   *scaled_height);
+GdkPixbuf *          eel_gdk_pixbuf_scale_to_min              (GdkPixbuf             *pixbuf,
+							       int                    min_width,
+							       int                    min_height);
+double              eel_gdk_scale_to_min_factor               (int                   width,
+                                                               int                   height,
+							       int                   min_width,
+							       int                   min_height,
+							       int                   *scaled_width,
+							       int                   *scaled_height);
 
 /* return average color values for each component (argb) */
 guint32              eel_gdk_pixbuf_average_value             (GdkPixbuf             *pixbuf);

Attachment: signature.asc
Description: This is a digitally signed message part



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]