From 0477a3066d0633c3ebbb5c97a1f16ceed67e07a5 Mon Sep 17 00:00:00 2001 From: "Owen W. Taylor" Date: Sun, 14 Nov 2010 12:22:05 -0500 Subject: [PATCH] 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(-) create mode 100644 src/compositor/cogl-utils.c create mode 100644 src/compositor/cogl-utils.h diff --git a/src/Makefile.am b/src/Makefile.am index d010ace15..5ad84f33c 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 000000000..2e5183cb4 --- /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 000000000..74748abbe --- /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 + +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 73337632c..1a9a447f7 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 #include +#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 *