From 2bce55bfb71a354402499b497f42d0fe6851350b Mon Sep 17 00:00:00 2001 From: Bastien Nocera Date: Fri, 6 Jan 2017 17:36:20 +0100 Subject: Deprecate mate_desktop_thumbnail_scale_down_pixbuf() As scaling down by huge factors is now fixed in gdk-pixbuf. Require the newer gdk-pixbuf as well, to avoid running into a pre-fix version. https://bugzilla.gnome.org/show_bug.cgi?id=775991 origin commit: https://gitlab.gnome.org/GNOME/gnome-desktop/commit/cb64228 --- libmate-desktop/mate-thumbnail-pixbuf-utils.c | 131 ++------------------------ 1 file changed, 10 insertions(+), 121 deletions(-) (limited to 'libmate-desktop/mate-thumbnail-pixbuf-utils.c') diff --git a/libmate-desktop/mate-thumbnail-pixbuf-utils.c b/libmate-desktop/mate-thumbnail-pixbuf-utils.c index d005913..ee00655 100644 --- a/libmate-desktop/mate-thumbnail-pixbuf-utils.c +++ b/libmate-desktop/mate-thumbnail-pixbuf-utils.c @@ -39,8 +39,11 @@ * @dest_height: the desired new height * * Scales the pixbuf to the desired size. This function - * is a lot faster than gdk-pixbuf when scaling down by - * large amounts. + * used to be a lot faster than gdk-pixbuf when scaling + * down by large amounts. This is not true anymore since + * gdk-pixbuf UNRELEASED. You should use + * gdk_pixbuf_scale_simple() instead, which this function + * now does internally. * * Return value: (transfer full): a scaled pixbuf * @@ -51,126 +54,12 @@ mate_desktop_thumbnail_scale_down_pixbuf (GdkPixbuf *pixbuf, int dest_width, int dest_height) { - int source_width, source_height; - int s_x1, s_y1, s_x2, s_y2; - int s_xfrac, s_yfrac; - int dx, dx_frac, dy, dy_frac; - div_t ddx, ddy; - int x, y; - int r, g, b, a; - int n_pixels; - gboolean has_alpha; - guchar *dest, *src, *xsrc, *src_pixels; - GdkPixbuf *dest_pixbuf; - int pixel_stride; - int source_rowstride, dest_rowstride; + g_return_val_if_fail (GDK_IS_PIXBUF (pixbuf), NULL); + g_return_val_if_fail (gdk_pixbuf_get_width (pixbuf) >= dest_width, NULL); + g_return_val_if_fail (gdk_pixbuf_get_height (pixbuf) >= dest_height, NULL); - if (dest_width == 0 || dest_height == 0) { + if (dest_width == 0 || dest_height == 0) return NULL; - } - source_width = gdk_pixbuf_get_width (pixbuf); - source_height = gdk_pixbuf_get_height (pixbuf); - - g_assert (source_width >= dest_width); - g_assert (source_height >= dest_height); - - ddx = div (source_width, dest_width); - dx = ddx.quot; - dx_frac = ddx.rem; - - ddy = div (source_height, dest_height); - dy = ddy.quot; - dy_frac = ddy.rem; - - has_alpha = gdk_pixbuf_get_has_alpha (pixbuf); - source_rowstride = gdk_pixbuf_get_rowstride (pixbuf); - src_pixels = gdk_pixbuf_get_pixels (pixbuf); - - dest_pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, has_alpha, 8, - dest_width, dest_height); - dest = gdk_pixbuf_get_pixels (dest_pixbuf); - dest_rowstride = gdk_pixbuf_get_rowstride (dest_pixbuf); - - pixel_stride = (has_alpha)?4:3; - - s_y1 = 0; - s_yfrac = -dest_height/2; - while (s_y1 < source_height) { - s_y2 = s_y1 + dy; - s_yfrac += dy_frac; - if (s_yfrac > 0) { - s_y2++; - s_yfrac -= dest_height; - } - - s_x1 = 0; - s_xfrac = -dest_width/2; - while (s_x1 < source_width) { - s_x2 = s_x1 + dx; - s_xfrac += dx_frac; - if (s_xfrac > 0) { - s_x2++; - s_xfrac -= dest_width; - } - - /* Average block of [x1,x2[ x [y1,y2[ and store in dest */ - r = g = b = a = 0; - n_pixels = 0; - - src = src_pixels + s_y1 * source_rowstride + s_x1 * pixel_stride; - for (y = s_y1; y < s_y2; y++) { - xsrc = src; - if (has_alpha) { - for (x = 0; x < s_x2-s_x1; x++) { - n_pixels++; - - r += xsrc[3] * xsrc[0]; - g += xsrc[3] * xsrc[1]; - b += xsrc[3] * xsrc[2]; - a += xsrc[3]; - xsrc += 4; - } - } else { - for (x = 0; x < s_x2-s_x1; x++) { - n_pixels++; - r += *xsrc++; - g += *xsrc++; - b += *xsrc++; - } - } - src += source_rowstride; - } - - if (has_alpha) { - if (a != 0) { - *dest++ = r / a; - *dest++ = g / a; - *dest++ = b / a; - *dest++ = a / n_pixels; - } else { - *dest++ = 0; - *dest++ = 0; - *dest++ = 0; - *dest++ = 0; - } - } else { - if (n_pixels != 0) { - *dest++ = r / n_pixels; - *dest++ = g / n_pixels; - *dest++ = b / n_pixels; - } else { - *dest++ = 0; - *dest++ = 0; - *dest++ = 0; - } - } - - s_x1 = s_x2; - } - s_y1 = s_y2; - dest += dest_rowstride - dest_width * pixel_stride; - } - - return dest_pixbuf; + return gdk_pixbuf_scale_simple (pixbuf, dest_width, dest_height, GDK_INTERP_HYPER); } -- cgit v1.2.1