diff options
author | Damien Lespiau <damien.lespiau@intel.com> | 2013-01-05 16:37:24 +0000 |
---|---|---|
committer | Damien Lespiau <damien.lespiau@intel.com> | 2013-01-05 16:46:38 +0000 |
commit | 1b6450f8460c970b244112fb1846201278747582 (patch) | |
tree | e646fde016da48a96c9a4f50d2ae8daccbf0d50c | |
parent | b174f9e3b9a2f4e40d5b796c70d078aa8173176b (diff) | |
download | cogl-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.cs | 12 | ||||
-rw-r--r-- | cogl-sharp/_Pipeline.cs | 12 | ||||
-rwxr-xr-x | cogl-sharp/parse-gir.py | 55 |
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: |