summaryrefslogtreecommitdiff
path: root/libmate-desktop
diff options
context:
space:
mode:
authorBastien Nocera <[email protected]>2017-01-06 17:36:20 +0100
committerraveit65 <[email protected]>2020-01-09 00:06:04 +0100
commit2bce55bfb71a354402499b497f42d0fe6851350b (patch)
tree32b9448364c50cd8e8f27eb503b83392e70c9f77 /libmate-desktop
parent12ffc111c5b9b9c595650a944b5da99453918dbb (diff)
downloadmate-desktop-2bce55bfb71a354402499b497f42d0fe6851350b.tar.bz2
mate-desktop-2bce55bfb71a354402499b497f42d0fe6851350b.tar.xz
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
Diffstat (limited to 'libmate-desktop')
-rw-r--r--libmate-desktop/mate-desktop-thumbnail.h7
-rw-r--r--libmate-desktop/mate-thumbnail-pixbuf-utils.c131
2 files changed, 17 insertions, 121 deletions
diff --git a/libmate-desktop/mate-desktop-thumbnail.h b/libmate-desktop/mate-desktop-thumbnail.h
index 1decb4a..9f26dab 100644
--- a/libmate-desktop/mate-desktop-thumbnail.h
+++ b/libmate-desktop/mate-desktop-thumbnail.h
@@ -101,6 +101,13 @@ char * mate_desktop_thumbnail_path_for_uri (const char *uri,
/* Pixbuf utils */
+#ifndef __GTK_DOC_IGNORE__
+#define MATE_DESKTOP_DEPRECATED_IN_1_24_FOR(f) G_DEPRECATED_FOR(f) extern
+#else
+#define MATE_DESKTOP_DEPRECATED_IN_1_24_FOR(f) extern
+#endif
+
+MATE_DESKTOP_DEPRECATED_IN_1_24_FOR(gdk_pixbuf_scale_simple)
GdkPixbuf *mate_desktop_thumbnail_scale_down_pixbuf (GdkPixbuf *pixbuf,
int dest_width,
int dest_height);
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);
}