[mutter] Refactor "texture material" creation from MetaShadowFactory



commit 0477a3066d0633c3ebbb5c97a1f16ceed67e07a5
Author: Owen W. Taylor <otaylor fishsoup net>
Date:   Sun Nov 14 12:22:05 2010 -0500

    Refactor "texture material" creation from MetaShadowFactory
    
    Create new cogl-utils.[ch] and move a helper function from
    MetaShadowFactory there as meta_create_texture_material(); this
    allows us to create single-layer materials from different parts of
    Mutter and have them share the same template material.
    
    Also expose a function for creating a 1x1 texture of a given
    color meta_create_color_texture_4ub().
    
    https://bugzilla.gnome.org/show_bug.cgi?id=634833

 src/Makefile.am                      |    2 +
 src/compositor/cogl-utils.c          |  104 ++++++++++++++++++++++++++++++++++
 src/compositor/cogl-utils.h          |   34 +++++++++++
 src/compositor/meta-shadow-factory.c |   47 +---------------
 4 files changed, 142 insertions(+), 45 deletions(-)
---
diff --git a/src/Makefile.am b/src/Makefile.am
index d010ace..5ad84f3 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -21,6 +21,8 @@ mutter_SOURCES= 				\
 	core/boxes.c				\
 	core/boxes-private.h			\
 	include/boxes.h				\
+	compositor/cogl-utils.c			\
+	compositor/cogl-utils.h			\
 	compositor/compositor.c			\
 	compositor/compositor-private.h		\
 	compositor/meta-module.c		\
diff --git a/src/compositor/cogl-utils.c b/src/compositor/cogl-utils.c
new file mode 100644
index 0000000..2e5183c
--- /dev/null
+++ b/src/compositor/cogl-utils.c
@@ -0,0 +1,104 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+/*
+ * Utilities for use with Cogl
+ *
+ * Copyright 2010 Red Hat, Inc.
+ * Copyright 2010 Intel Corporation
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ */
+
+#include "cogl-utils.h"
+
+/**
+ * meta_create_color_texture_4ub:
+ * @red:
+ * @green:
+ * @blue:
+ * @alpha:
+ *
+ * Creates a texture that is a single pixel with the specified
+ * unpremultiplied color components.
+ *
+ * Return value: (transfer full): a newly created Cogl texture
+ */
+CoglHandle
+meta_create_color_texture_4ub (guint8 red,
+                               guint8 green,
+                               guint8 blue,
+                               guint8 alpha)
+{
+  CoglColor color;
+  guint8 pixel[4];
+
+  cogl_color_set_from_4ub (&color, red, green, blue, alpha);
+  cogl_color_premultiply (&color);
+
+  pixel[0] = cogl_color_get_red_byte (&color);
+  pixel[1] = cogl_color_get_green_byte (&color);
+  pixel[2] = cogl_color_get_blue_byte (&color);
+  pixel[3] = cogl_color_get_alpha_byte (&color);
+
+  return cogl_texture_new_from_data (1, 1,
+                                     COGL_TEXTURE_NONE,
+                                     COGL_PIXEL_FORMAT_RGBA_8888_PRE,
+                                     COGL_PIXEL_FORMAT_ANY,
+                                     4, pixel);
+}
+
+
+/* Based on gnome-shell/src/st/st-private.c:_st_create_texture_material.c */
+
+/**
+ * meta_create_texture_material:
+ * @src_texture: (allow-none): texture to use initially for the layer
+ *
+ * Creates a material with a single layer. Using a common template
+ * allows sharing a shader for different uses in Mutter. To share the same
+ * shader with all other materials that are just texture plus opacity
+ * would require Cogl fixes.
+ * (See http://bugzilla.clutter-project.org/show_bug.cgi?id=2425)
+ *
+ * Return value: (transfer full): a newly created Cogl material
+ */
+CoglHandle
+meta_create_texture_material (CoglHandle src_texture)
+{
+  static CoglHandle texture_material_template = COGL_INVALID_HANDLE;
+  CoglHandle material;
+
+  /* We use a material that has a dummy texture as a base for all
+     texture materials. The idea is that only the Cogl texture object
+     would be different in the children so it is likely that Cogl will
+     be able to share GL programs between all the textures. */
+  if (G_UNLIKELY (texture_material_template == COGL_INVALID_HANDLE))
+    {
+      CoglHandle dummy_texture;
+
+      dummy_texture = meta_create_color_texture_4ub (0xff, 0xff, 0xff, 0xff);
+
+      texture_material_template = cogl_material_new ();
+      cogl_material_set_layer (texture_material_template, 0, dummy_texture);
+      cogl_handle_unref (dummy_texture);
+    }
+
+  material = cogl_material_copy (texture_material_template);
+
+  if (src_texture != COGL_INVALID_HANDLE)
+    cogl_material_set_layer (material, 0, src_texture);
+
+  return material;
+}
diff --git a/src/compositor/cogl-utils.h b/src/compositor/cogl-utils.h
new file mode 100644
index 0000000..74748ab
--- /dev/null
+++ b/src/compositor/cogl-utils.h
@@ -0,0 +1,34 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+/*
+ * Utilities for use with Cogl
+ *
+ * Copyright 2010 Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ */
+
+#ifndef __META_COGL_UTILS_H__
+#define __META_COGL_UTILS_H__
+
+#include <cogl/cogl.h>
+
+CoglHandle meta_create_color_texture_4ub (guint8     red,
+                                          guint8     green,
+                                          guint8     blue,
+                                          guint8     alpha);
+CoglHandle meta_create_texture_material  (CoglHandle src_texture);
+
+#endif /* __META_COGL_UTILS_H__ */
diff --git a/src/compositor/meta-shadow-factory.c b/src/compositor/meta-shadow-factory.c
index 7333763..1a9a447 100644
--- a/src/compositor/meta-shadow-factory.c
+++ b/src/compositor/meta-shadow-factory.c
@@ -5,7 +5,6 @@
  * Create and cache shadow textures for abritrary window shapes
  *
  * Copyright 2010 Red Hat, Inc.
- * Copyright 2010 Intel Corporation
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
@@ -26,6 +25,7 @@
 #include <math.h>
 #include <string.h>
 
+#include "cogl-utils.h"
 #include "meta-shadow-factory-private.h"
 #include "region-utils.h"
 
@@ -641,49 +641,6 @@ flip_buffer (guchar *buffer,
 #undef BLOCK_SIZE
 }
 
-/* Creates a material with a single layer. Using a common template
- * allows sharing a shader between all shadows. To share the same
- * shader with all other materials that are just texture plus
- * opacity would require cogl fixes. Based on
- * gnome-shell/src/st/_st_create_texture_material.c
- */
-static CoglHandle
-create_texture_material (CoglHandle src_texture)
-{
-  static CoglHandle texture_material_template = COGL_INVALID_HANDLE;
-  CoglHandle material;
-
-  g_return_val_if_fail (src_texture != COGL_INVALID_HANDLE,
-                        COGL_INVALID_HANDLE);
-
-  /* We use a material that has a dummy texture as a base for all
-     texture materials. The idea is that only the Cogl texture object
-     would be different in the children so it is likely that Cogl will
-     be able to share GL programs between all the textures. */
-  if (G_UNLIKELY (texture_material_template == COGL_INVALID_HANDLE))
-    {
-      static const guint8 white_pixel[] = { 0xff, 0xff, 0xff, 0xff };
-      CoglHandle dummy_texture;
-
-      dummy_texture =
-        cogl_texture_new_from_data (1, 1,
-                                    COGL_TEXTURE_NONE,
-                                    COGL_PIXEL_FORMAT_RGBA_8888_PRE,
-                                    COGL_PIXEL_FORMAT_ANY,
-                                    4, white_pixel);
-
-      texture_material_template = cogl_material_new ();
-      cogl_material_set_layer (texture_material_template, 0, dummy_texture);
-      cogl_handle_unref (dummy_texture);
-    }
-
-  material = cogl_material_copy (texture_material_template);
-
-  cogl_material_set_layer (material, 0, src_texture);
-
-  return material;
-}
-
 static void
 make_shadow (MetaShadow     *shadow,
              cairo_region_t *region)
@@ -791,7 +748,7 @@ make_shadow (MetaShadow     *shadow,
   cairo_region_destroy (column_convolve_region);
   g_free (buffer);
 
-  shadow->material = create_texture_material (shadow->texture);
+  shadow->material = meta_create_texture_material (shadow->texture);
 }
 
 static MetaShadowParams *



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