[mutter] Refactor "texture material" creation from MetaShadowFactory
- From: Owen Taylor <otaylor src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] Refactor "texture material" creation from MetaShadowFactory
- Date: Thu, 18 Nov 2010 19:00:52 +0000 (UTC)
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]