From ca1531efba4bd65342ed3488a9c5e9d5dc1296c3 Mon Sep 17 00:00:00 2001 From: Kleis Auke Wolthuizen Date: Sat, 9 Jun 2018 22:17:56 +0200 Subject: [PATCH 1/2] Add enum helper To get all enum values for a specific enum. --- pyvips/base.py | 21 ++++++++++++++++++++- pyvips/decls.py | 24 ++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/pyvips/base.py b/pyvips/base.py index ce52809..9f353f7 100644 --- a/pyvips/base.py +++ b/pyvips/base.py @@ -1,7 +1,7 @@ # basic defs and link to ffi -from pyvips import ffi, vips_lib, gobject_lib, _to_string, _to_bytes, Error +from pyvips import ffi, vips_lib, glib_lib, gobject_lib, _to_string, _to_bytes, Error def leak_set(leak): @@ -89,6 +89,24 @@ def type_map(gtype, fn): return vips_lib.vips_type_map(gtype, cb, ffi.NULL, ffi.NULL) +def values_for_enum(gtype): + """Get all values for a enum (gtype).""" + + g_type_class = gobject_lib.g_type_class_ref(gtype) + g_enum_class = ffi.cast('GEnumClass *', g_type_class) + + values = [] + + # -1 since we always have a "last" member. + for i in range(0, g_enum_class.n_values - 1): + value = _to_string(ffi.string(g_enum_class.values[i].value_nick)) + values.append(value) + + glib_lib.g_free(g_enum_class) + + return values + + __all__ = [ 'leak_set', 'version', @@ -100,4 +118,5 @@ def type_map(gtype, fn): 'type_name', 'type_map', 'type_from_name', + 'values_for_enum' ] diff --git a/pyvips/decls.py b/pyvips/decls.py index 1e62f8a..bd3027d 100644 --- a/pyvips/decls.py +++ b/pyvips/decls.py @@ -120,13 +120,15 @@ def cdefs(features): GType vips_interpretation_get_type (void); GType vips_operation_flags_get_type (void); GType vips_band_format_get_type (void); + GType vips_token_get_type (void); + GType vips_saveable_get_type (void); + GType vips_image_type_get_type (void); typedef struct _GData GData; typedef struct _GTypeClass GTypeClass; - typedef struct _GTypeInstance - { + typedef struct _GTypeInstance { GTypeClass *g_class; } GTypeInstance; @@ -153,6 +155,24 @@ def cdefs(features): unsigned int param_id; } GParamSpec; + typedef struct _GEnumValue { + int value; + + const char *value_name; + const char *value_nick; + } GEnumValue; + + typedef struct _GEnumClass { + GTypeClass *g_type_class; + + int minimum; + int maximum; + unsigned int n_values; + GEnumValue *values; + } GEnumClass; + + void* g_type_class_ref (GType type); + void g_object_ref (void* object); void g_object_unref (void* object); From d27b8e229809cf1ca4985cd4609c56385a94a89c Mon Sep 17 00:00:00 2001 From: Kleis Auke Wolthuizen Date: Sun, 10 Jun 2018 12:17:47 +0200 Subject: [PATCH 2/2] Don't explicitly free the memory Freeing isn't correct here. --- pyvips/base.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/pyvips/base.py b/pyvips/base.py index 9f353f7..2ecc22f 100644 --- a/pyvips/base.py +++ b/pyvips/base.py @@ -102,8 +102,6 @@ def values_for_enum(gtype): value = _to_string(ffi.string(g_enum_class.values[i].value_nick)) values.append(value) - glib_lib.g_free(g_enum_class) - return values