[mutter] background: downscale background to fit in texture limits
- From: Ray Strode <halfline src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] background: downscale background to fit in texture limits
- Date: Mon, 1 Jul 2013 11:29:26 +0000 (UTC)
commit 15e01152da335f5a9e7617674ffa54cb1bdef957
Author: Ray Strode <rstrode redhat com>
Date: Fri Jun 14 16:11:30 2013 -0400
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
src/compositor/meta-background.c | 30 ++++++++++++++++++++++++++++++
1 files changed, 30 insertions(+), 0 deletions(-)
---
diff --git a/src/compositor/meta-background.c b/src/compositor/meta-background.c
index fca5dce..35ca45c 100644
--- a/src/compositor/meta-background.c
+++ b/src/compositor/meta-background.c
@@ -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);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]