2012-08-31 18:28:27 +00:00
|
|
|
/*
|
|
|
|
* Cogl
|
|
|
|
*
|
2014-02-22 01:28:54 +00:00
|
|
|
* A Low Level GPU Graphics and Utilities API
|
2012-08-31 18:28:27 +00:00
|
|
|
*
|
|
|
|
* Copyright (C) 2012 Intel Corporation.
|
|
|
|
*
|
2014-02-22 01:28:54 +00:00
|
|
|
* Permission is hereby granted, free of charge, to any person
|
|
|
|
* obtaining a copy of this software and associated documentation
|
|
|
|
* files (the "Software"), to deal in the Software without
|
|
|
|
* restriction, including without limitation the rights to use, copy,
|
|
|
|
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
|
|
* of the Software, and to permit persons to whom the Software is
|
|
|
|
* furnished to do so, subject to the following conditions:
|
|
|
|
*
|
|
|
|
* The above copyright notice and this permission notice shall be
|
|
|
|
* included in all copies or substantial portions of the Software.
|
|
|
|
*
|
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
|
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
|
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
|
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
|
|
|
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
|
|
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
|
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
|
* SOFTWARE.
|
2012-08-31 18:28:27 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#if !defined(__COGL_H_INSIDE__) && !defined(COGL_COMPILATION)
|
|
|
|
#error "Only <cogl/cogl.h> can be included directly."
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef __COGL_ERROR_H__
|
|
|
|
#define __COGL_ERROR_H__
|
|
|
|
|
|
|
|
#include "cogl-types.h"
|
|
|
|
|
2013-05-28 17:47:12 +00:00
|
|
|
COGL_BEGIN_DECLS
|
|
|
|
|
2012-08-31 18:28:27 +00:00
|
|
|
/**
|
|
|
|
* SECTION:cogl-error
|
|
|
|
* @short_description: A way for Cogl to throw exceptions
|
|
|
|
*
|
|
|
|
* As a general rule Cogl shields non-recoverable errors from
|
|
|
|
* developers, such as most heap allocation failures (unless for
|
|
|
|
* exceptionally large resources which we might reasonably expect to
|
2012-10-06 00:30:09 +00:00
|
|
|
* fail) and this reduces the burden on developers.
|
2012-08-31 18:28:27 +00:00
|
|
|
*
|
|
|
|
* There are some Cogl apis though that can fail for exceptional
|
|
|
|
* reasons that can also potentially be recovered from at runtime
|
|
|
|
* and for these apis we use a standard convention for reporting
|
|
|
|
* runtime recoverable errors.
|
|
|
|
*
|
|
|
|
* As an example if we look at the cogl_context_new() api which
|
|
|
|
* takes an error argument:
|
|
|
|
* |[
|
|
|
|
* CoglContext *
|
|
|
|
* cogl_context_new (CoglDisplay *display, CoglError **error);
|
|
|
|
* ]|
|
|
|
|
*
|
|
|
|
* A caller interested in catching any runtime error when creating a
|
|
|
|
* new #CoglContext would pass the address of a #CoglError pointer
|
|
|
|
* that has first been initialized to %NULL as follows:
|
|
|
|
*
|
|
|
|
* |[
|
|
|
|
* CoglError *error = NULL;
|
|
|
|
* CoglContext *context;
|
|
|
|
*
|
|
|
|
* context = cogl_context_new (NULL, &error);
|
|
|
|
* ]|
|
|
|
|
*
|
|
|
|
* The return status should usually be enough to determine if there
|
|
|
|
* was an error set (in this example we can check if context == %NULL)
|
|
|
|
* but if it's not possible to tell from the function's return status
|
|
|
|
* you can instead look directly at the error pointer which you
|
|
|
|
* initialized to %NULL. In this example we now check the error,
|
|
|
|
* report any error to the user, free the error and then simply
|
|
|
|
* abort without attempting to recover.
|
|
|
|
*
|
|
|
|
* |[
|
|
|
|
* if (context == NULL)
|
|
|
|
* {
|
|
|
|
* fprintf (stderr, "Failed to create a Cogl context: %s\n",
|
|
|
|
* error->message);
|
|
|
|
* cogl_error_free (error);
|
|
|
|
* abort ();
|
|
|
|
* }
|
|
|
|
* ]|
|
|
|
|
*
|
|
|
|
* All Cogl APIs that accept an error argument can also be passed a
|
|
|
|
* %NULL pointer. In this case if an exceptional error condition is hit
|
|
|
|
* then Cogl will simply log the error message and abort the
|
|
|
|
* application. This can be compared to language execeptions where the
|
|
|
|
* developer has not attempted to catch the exception. This means the
|
|
|
|
* above example is essentially redundant because it's what Cogl would
|
|
|
|
* have done automatically and so, similarly, if your application has
|
|
|
|
* no way to recover from a particular error you might just as well
|
|
|
|
* pass a %NULL #CoglError pointer to save a bit of typing.
|
|
|
|
*
|
|
|
|
* <note>If you are used to using the GLib API you will probably
|
|
|
|
* recognize that #CoglError is just like a #GError. In fact if Cogl
|
|
|
|
* has been built with --enable-glib then it is safe to cast a
|
|
|
|
* #CoglError to a #GError.</note>
|
|
|
|
*
|
|
|
|
* <note>An important detail to be aware of if you are used to using
|
|
|
|
* GLib's GError API is that Cogl deviates from the GLib GError
|
|
|
|
* conventions in one noteable way which is that a %NULL error pointer
|
|
|
|
* does not mean you want to ignore the details of an error, it means
|
|
|
|
* you are not trying to catch any exceptional errors the function might
|
|
|
|
* throw which will result in the program aborting with a log message
|
|
|
|
* if an error is thrown.</note>
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifdef COGL_HAS_GLIB_SUPPORT
|
|
|
|
#define CoglError GError
|
|
|
|
#else
|
|
|
|
/**
|
|
|
|
* CoglError:
|
|
|
|
* @domain: A high-level domain identifier for the error
|
|
|
|
* @code: A specific error code within a specified domain
|
|
|
|
* @message: A human readable error message
|
|
|
|
*/
|
2012-12-31 17:31:50 +00:00
|
|
|
typedef struct _CoglError {
|
2012-08-31 18:28:27 +00:00
|
|
|
uint32_t domain;
|
|
|
|
int code;
|
|
|
|
char *message;
|
|
|
|
} CoglError;
|
|
|
|
#endif /* COGL_HAS_GLIB_SUPPORT */
|
|
|
|
|
|
|
|
/**
|
|
|
|
* cogl_error_free:
|
|
|
|
* @error: A #CoglError thrown by the Cogl api
|
|
|
|
*
|
|
|
|
* Frees a #CoglError and associated resources.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
cogl_error_free (CoglError *error);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* cogl_error_copy:
|
|
|
|
* @error: A #CoglError thrown by the Cogl api
|
|
|
|
*
|
|
|
|
* Makes a copy of @error which can later be freed using
|
|
|
|
* cogl_error_free().
|
|
|
|
*
|
|
|
|
* Return value: A newly allocated #CoglError initialized to match the
|
|
|
|
* contents of @error.
|
|
|
|
*/
|
|
|
|
CoglError *
|
|
|
|
cogl_error_copy (CoglError *error);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* cogl_error_matches:
|
|
|
|
* @error: A #CoglError thrown by the Cogl api or %NULL
|
2012-12-30 17:37:18 +00:00
|
|
|
* @domain: The error domain
|
|
|
|
* @code: The error code
|
2012-08-31 18:28:27 +00:00
|
|
|
*
|
2012-12-30 17:37:18 +00:00
|
|
|
* Returns %TRUE if error matches @domain and @code, %FALSE otherwise.
|
2012-08-31 18:28:27 +00:00
|
|
|
* In particular, when error is %NULL, FALSE will be returned.
|
|
|
|
*
|
|
|
|
* Return value: whether the @error corresponds to the given @domain
|
|
|
|
* and @code.
|
|
|
|
*/
|
|
|
|
CoglBool
|
|
|
|
cogl_error_matches (CoglError *error,
|
|
|
|
uint32_t domain,
|
|
|
|
int code);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* COGL_GLIB_ERROR:
|
|
|
|
* @COGL_ERROR: A #CoglError thrown by the Cogl api or %NULL
|
|
|
|
*
|
|
|
|
* Simply casts a #CoglError to a #CoglError
|
|
|
|
*
|
|
|
|
* If Cogl is built with GLib support then it can safely be assumed
|
|
|
|
* that a CoglError is a GError and can be used directly with the
|
|
|
|
* GError api.
|
|
|
|
*/
|
|
|
|
#ifdef COGL_HAS_GLIB_SUPPORT
|
|
|
|
#define COGL_GLIB_ERROR(COGL_ERROR) ((CoglError *)COGL_ERROR)
|
|
|
|
#endif
|
|
|
|
|
2013-05-28 17:47:12 +00:00
|
|
|
COGL_END_DECLS
|
|
|
|
|
2012-08-31 18:28:27 +00:00
|
|
|
#endif /* __COGL_ERROR_H__ */
|