background: downscale background to fit in texture limits

Some cards have 2k texture limits, which can be smaller than
commonly sized backgrounds.

This commit downscales the background in this situation, so that
it won't fail to load.

https://bugzilla.gnome.org/show_bug.cgi?id=702283
This commit is contained in:
Ray Strode 2013-06-14 16:11:30 -04:00
parent 2103ff6a5c
commit 15e01152da

View File

@ -32,6 +32,8 @@
#include <clutter/clutter.h>
#include <GL/gl.h>
#include "cogl-utils.h"
#include "compositor-private.h"
#include "mutter-enum-types.h"
@ -971,6 +973,7 @@ load_file (GTask *task,
{
GError *error = NULL;
GdkPixbuf *pixbuf;
int max_texture_size = 0;
pixbuf = gdk_pixbuf_new_from_file (task_data->filename,
&error);
@ -981,6 +984,33 @@ load_file (GTask *task,
return;
}
glGetIntegerv (GL_MAX_TEXTURE_SIZE, &max_texture_size);
if (glGetError () != GL_NO_ERROR)
max_texture_size = 0;
if (max_texture_size > 0) {
double width, height;
width = gdk_pixbuf_get_width (pixbuf);
height = gdk_pixbuf_get_height (pixbuf);
if (width > max_texture_size || height > max_texture_size) {
GdkPixbuf *scaled_pixbuf;
if (width > height) {
width = max_texture_size;
height *= max_texture_size / width;
} else {
width *= max_texture_size / height;
height = max_texture_size;
}
scaled_pixbuf = gdk_pixbuf_scale_simple (pixbuf, width, height, GDK_INTERP_BILINEAR);
g_object_unref (pixbuf);
pixbuf = scaled_pixbuf;
}
}
g_task_return_pointer (task, pixbuf, (GDestroyNotify) g_object_unref);
}