summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Lespiau <damien.lespiau@intel.com>2013-01-05 16:37:24 +0000
committerDamien Lespiau <damien.lespiau@intel.com>2013-01-05 16:46:38 +0000
commit1b6450f8460c970b244112fb1846201278747582 (patch)
treee646fde016da48a96c9a4f50d2ae8daccbf0d50c
parentb174f9e3b9a2f4e40d5b796c70d078aa8173176b (diff)
downloadcogl-wip/cogl-sharp.tar.gz
cogl-sharp: Support generation of functions with a CoglErrorwip/cogl-sharp
These functions throw a Cogl.Exception in the C# sharp versions and the mechanisms in C (boolean return value and CoglError** argument) are dropped.
-rw-r--r--cogl-sharp/_FrameBuffer.cs12
-rw-r--r--cogl-sharp/_Pipeline.cs12
-rwxr-xr-xcogl-sharp/parse-gir.py55
3 files changed, 70 insertions, 9 deletions
diff --git a/cogl-sharp/_FrameBuffer.cs b/cogl-sharp/_FrameBuffer.cs
index 247d839e..0c1b559e 100644
--- a/cogl-sharp/_FrameBuffer.cs
+++ b/cogl-sharp/_FrameBuffer.cs
@@ -7,6 +7,18 @@ namespace Cogl
public partial class FrameBuffer
{
[DllImport("cogl2.dll")]
+ public static extern bool cogl_framebuffer_allocate(IntPtr o, out IntPtr error);
+
+ public void Allocate()
+ {
+ IntPtr error;
+
+ cogl_framebuffer_allocate(handle, out error);
+ if (error != IntPtr.Zero)
+ throw new Cogl.Exception(error);
+ }
+
+ [DllImport("cogl2.dll")]
public static extern void cogl_framebuffer_clear(IntPtr o, BufferBit buffers, ref Color color);
public void Clear(BufferBit buffers, ref Color color)
diff --git a/cogl-sharp/_Pipeline.cs b/cogl-sharp/_Pipeline.cs
index ef6e9579..b0c82f4e 100644
--- a/cogl-sharp/_Pipeline.cs
+++ b/cogl-sharp/_Pipeline.cs
@@ -217,6 +217,18 @@ namespace Cogl
}
[DllImport("cogl2.dll")]
+ public static extern bool cogl_pipeline_set_layer_point_sprite_coords_enabled(IntPtr o, int layer_index, bool enable, out IntPtr error);
+
+ public void SetLayerPointSpriteCoordsEnabled(int layer_index, bool enable)
+ {
+ IntPtr error;
+
+ cogl_pipeline_set_layer_point_sprite_coords_enabled(handle, layer_index, enable, out error);
+ if (error != IntPtr.Zero)
+ throw new Cogl.Exception(error);
+ }
+
+ [DllImport("cogl2.dll")]
public static extern void cogl_pipeline_set_layer_texture(IntPtr o, int layer_index, IntPtr texture);
public void SetLayerTexture(int layer_index, Texture texture)
diff --git a/cogl-sharp/parse-gir.py b/cogl-sharp/parse-gir.py
index abc0d30c..86a8af8b 100755
--- a/cogl-sharp/parse-gir.py
+++ b/cogl-sharp/parse-gir.py
@@ -249,8 +249,9 @@ def is_handwritten(gir_name, overrides):
return gir_name in overrides['handwritten']
def generate_method(node, overrides, fo):
- gir_name = node.getAttribute("name")
+ throw_exception = False
+ gir_name = node.getAttribute("name")
gir_name = apply_name_override(gir_name, overrides)
native_method_name = node.getAttributeNS(C_NS, "identifier")
@@ -301,7 +302,8 @@ def generate_method(node, overrides, fo):
params = params_list.getElementsByTagName("parameter")
for param in params:
direction = param.getAttribute("direction")
- if direction == 'out':
+ out = direction == 'out'
+ if out:
print(" Skipping %s, out parameters not supported yet" %
(cs_method_name))
generatable = False
@@ -311,7 +313,11 @@ def generate_method(node, overrides, fo):
assert len(param_type) == 1
c_type = param_type.item(0).getAttributeNS(C_NS, "type")
gir_type = param_type.item(0).getAttribute("name")
- if not known_type(gir_type):
+ # mark methods throwing exceptions
+ if c_type == 'CoglError**':
+ throw_exception = True
+ out = True
+ elif not known_type(gir_type):
print(" Skipping %s, unknown parameter type '%s' (%s)" %
(cs_method_name, gir_type, c_type))
generatable = False
@@ -320,18 +326,32 @@ def generate_method(node, overrides, fo):
# time to update {native,cs}_params and call_params
param_name = param.getAttribute("name")
ref = 'ref ' if gir_type in struct_types else ''
+ out = 'out ' if out else ''
t = derive_native_type(gir_type, c_type)
- native_params.append(ref + t + ' ' + param_name)
+ native_params.append(ref + out + t + ' ' + param_name)
+
+ handle = '.Handle' if gir_type in object_types else ''
+ call_params.append(ref + out + param_name + handle)
+
+ # if we are throwing an exception then:
+ # 1. we don't want to mirror the exception argument in the C#
+ # wrapper so we skip the cs_param update
+ # 2. we can safely break the loop as exception are always the
+ # last parameter
+ if throw_exception:
+ break
t = derive_cs_type(gir_type, c_type)
cs_params.append(ref + t + ' ' + param_name)
- handle = '.Handle' if gir_type in object_types else ''
- call_params.append(ref + param_name + handle)
-
if not generatable:
return
+ # We hide the returned boolean from functions that can return a CoglError
+ # to have a exception-only error handling
+ if throw_exception:
+ cs_return_value = 'void'
+
return_str = 'return ' if (cs_return_value != 'void') else ''
# native symbol declaration
@@ -341,7 +361,7 @@ def generate_method(node, overrides, fo):
# C# wrapper
#
- # We support 2 types of functions:
+ # We support 3 types of functions:
#
# 1. simple wrappers (can return values as well)
#
@@ -357,10 +377,27 @@ def generate_method(node, overrides, fo):
# IntPtr p = cogl_pipeline_get_layer_texture(handle, layer_index);
# return new Texture(p);
# }
+ #
+ # 3. functions returning a CoglError throw exceptions
+ #
+ # public void Allocate()
+ # {
+ # IntPtr error;
+ #
+ # cogl_framebuffer_allocate(handle, out error);
+ # if (error != IntPtr.Zero)
+ # throw new Cogl.Exception(error);
+ # }
fo.write(" public %s %s(%s)\n" %
(cs_return_value, cs_method_name, ", ".join(cs_params)))
fo.write(" {\n")
- if not return_object:
+ if throw_exception:
+ fo.write(" IntPtr error;\n\n")
+ fo.write(" %s(%s);\n" %
+ (native_method_name, ", ".join(call_params)))
+ fo.write(" if (error != IntPtr.Zero)\n")
+ fo.write(" throw new Cogl.Exception(error);\n")
+ elif not return_object:
fo.write(" %s%s(%s);\n" %
(return_str, native_method_name, ", ".join(call_params)))
else: