mutter/cogl/cogl-snippet.c
Neil Roberts f37738453e Add a CoglSnippet type
This adds a CoglObject called CoglSnippet which will be used to store
strings used as GLSL snippets to be attached at hook points to a
CoglPipeline. The snippets can currently contain three strings:

declarations - This will be placed in the global scope and is intended
               to be used to declare uniforms, attributes and
               functions.

pre           - This will be inserted before the hook point.

post          - This will be inserted after the hook point.

Reviewed-by: Robert Bragg <robert@linux.intel.com>
2011-12-06 19:02:05 +00:00

146 lines
3.2 KiB
C

/*
* Cogl
*
* An object oriented GL/GLES Abstraction/Utility Layer
*
* Copyright (C) 2011 Intel Corporation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see
* <http://www.gnu.org/licenses/>.
*
*
*
* Authors:
* Neil Roberts <neil@linux.intel.com>
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "cogl-snippet-private.h"
#include "cogl-util.h"
static void
_cogl_snippet_free (CoglSnippet *snippet);
COGL_OBJECT_DEFINE (Snippet, snippet);
CoglSnippet *
cogl_snippet_new (const char *declarations,
const char *post)
{
CoglSnippet *snippet = g_slice_new0 (CoglSnippet);
_cogl_snippet_object_new (snippet);
cogl_snippet_set_declarations (snippet, declarations);
cogl_snippet_set_post (snippet, post);
return snippet;
}
static gboolean
_cogl_snippet_modify (CoglSnippet *snippet)
{
if (snippet->immutable)
{
g_warning ("A CoglSnippet should not be modified once it has been "
"attached to a pipeline. Any modifications after that point "
"will be ignored.");
return FALSE;
}
return TRUE;
}
void
cogl_snippet_set_declarations (CoglSnippet *snippet,
const char *declarations)
{
_COGL_RETURN_IF_FAIL (cogl_is_snippet (snippet));
if (!_cogl_snippet_modify (snippet))
return;
g_free (snippet->declarations);
snippet->declarations = declarations ? g_strdup (declarations) : NULL;
}
const char *
cogl_snippet_get_declarations (CoglSnippet *snippet)
{
_COGL_RETURN_VAL_IF_FAIL (cogl_is_snippet (snippet), NULL);
return snippet->declarations;
}
void
cogl_snippet_set_pre (CoglSnippet *snippet,
const char *pre)
{
_COGL_RETURN_IF_FAIL (cogl_is_snippet (snippet));
if (!_cogl_snippet_modify (snippet))
return;
g_free (snippet->pre);
snippet->pre = pre ? g_strdup (pre) : NULL;
}
const char *
cogl_snippet_get_pre (CoglSnippet *snippet)
{
_COGL_RETURN_VAL_IF_FAIL (cogl_is_snippet (snippet), NULL);
return snippet->pre;
}
void
cogl_snippet_set_post (CoglSnippet *snippet,
const char *post)
{
_COGL_RETURN_IF_FAIL (cogl_is_snippet (snippet));
if (!_cogl_snippet_modify (snippet))
return;
g_free (snippet->post);
snippet->post = post ? g_strdup (post) : NULL;
}
const char *
cogl_snippet_get_post (CoglSnippet *snippet)
{
_COGL_RETURN_VAL_IF_FAIL (cogl_is_snippet (snippet), NULL);
return snippet->post;
}
void
_cogl_snippet_make_immutable (CoglSnippet *snippet)
{
snippet->immutable = TRUE;
}
static void
_cogl_snippet_free (CoglSnippet *snippet)
{
g_free (snippet->declarations);
g_free (snippet->pre);
g_free (snippet->post);
g_slice_free (CoglSnippet, snippet);
}