GimpValueArray * gimp_dash_pattern_to_value_array (GArray *pattern) { if (pattern == NULL || pattern->len == 0) { return NULL; } else { GimpValueArray *value_array = gimp_value_array_new (pattern->len); GValue item = { 0, }; gint i; g_value_init (&item, G_TYPE_DOUBLE); for (i = 0; i < pattern->len; i++) { g_value_set_double (&item, g_array_index (pattern, gdouble, i)); gimp_value_array_append (value_array, &item); } g_value_unset (&item); return value_array; } }
static GTokenType gimp_config_deserialize_value_array (GValue *value, GimpConfig *config, GParamSpec *prop_spec, GScanner *scanner) { GimpParamSpecValueArray *array_spec; GimpValueArray *array; GValue array_value = { 0, }; gint n_values; GTokenType token; gint i; array_spec = GIMP_PARAM_SPEC_VALUE_ARRAY (prop_spec); if (! gimp_scanner_parse_int (scanner, &n_values)) return G_TOKEN_INT; array = gimp_value_array_new (n_values); for (i = 0; i < n_values; i++) { g_value_init (&array_value, array_spec->element_spec->value_type); token = gimp_config_deserialize_value (&array_value, config, array_spec->element_spec, scanner); if (token == G_TOKEN_RIGHT_PAREN) gimp_value_array_append (array, &array_value); g_value_unset (&array_value); if (token != G_TOKEN_RIGHT_PAREN) return token; } g_value_take_boxed (value, array); return G_TOKEN_RIGHT_PAREN; }
GimpValueArray * gimp_procedure_get_arguments (GimpProcedure *procedure) { GimpValueArray *args; GValue value = { 0, }; gint i; g_return_val_if_fail (GIMP_IS_PROCEDURE (procedure), NULL); args = gimp_value_array_new (procedure->num_args); for (i = 0; i < procedure->num_args; i++) { g_value_init (&value, G_PARAM_SPEC_VALUE_TYPE (procedure->args[i])); gimp_value_array_append (args, &value); g_value_unset (&value); } return args; }
GimpValueArray * gimp_dash_pattern_to_value_array (GArray *pattern) { if (pattern != NULL && pattern->len > 0) { GimpValueArray *value_array = gimp_value_array_new (pattern->len); GValue item = G_VALUE_INIT; gint i; g_value_init (&item, G_TYPE_DOUBLE); for (i = 0; i < pattern->len; i++) { g_value_set_double (&item, g_array_index (pattern, gdouble, i)); gimp_value_array_append (value_array, &item); } g_value_unset (&item); return value_array; } return NULL; }
GimpValueArray * plug_in_params_to_args (GParamSpec **pspecs, gint n_pspecs, GPParam *params, gint n_params, gboolean return_values, gboolean full_copy) { GimpValueArray *args; gint i; g_return_val_if_fail ((pspecs != NULL && n_pspecs > 0) || (pspecs == NULL && n_pspecs == 0), NULL); g_return_val_if_fail ((params != NULL && n_params > 0) || (params == NULL && n_params == 0), NULL); args = gimp_value_array_new (n_params); for (i = 0; i < n_params; i++) { GValue value = G_VALUE_INIT; GType type; gint count; /* first get the fallback compat GType that matches the pdb type */ type = gimp_pdb_compat_arg_type_to_gtype (params[i].type); /* then try to try to be more specific by looking at the param * spec (return values have one additional value (the status), * skip that, it's not in the array of param specs) */ if (i > 0 || ! return_values) { gint pspec_index = i; if (return_values) pspec_index--; /* are there param specs left? */ if (pspec_index < n_pspecs) { GType pspec_gtype; GimpPDBArgType pspec_arg_type; pspec_gtype = G_PARAM_SPEC_VALUE_TYPE (pspecs[pspec_index]); pspec_arg_type = gimp_pdb_compat_arg_type_from_gtype (pspec_gtype); /* if the param spec's GType, mapped to a pdb type, matches * the passed pdb type, use the param spec's GType */ if (pspec_arg_type == params[i].type) type = pspec_gtype; } } g_value_init (&value, type); switch (gimp_pdb_compat_arg_type_from_gtype (type)) { case GIMP_PDB_INT32: if (G_VALUE_HOLDS_INT (&value)) g_value_set_int (&value, params[i].data.d_int32); else if (G_VALUE_HOLDS_UINT (&value)) g_value_set_uint (&value, params[i].data.d_int32); else if (G_VALUE_HOLDS_ENUM (&value)) g_value_set_enum (&value, params[i].data.d_int32); else if (G_VALUE_HOLDS_BOOLEAN (&value)) g_value_set_boolean (&value, params[i].data.d_int32 ? TRUE : FALSE); else { g_printerr ("%s: unhandled GIMP_PDB_INT32 type: %s\n", G_STRFUNC, g_type_name (G_VALUE_TYPE (&value))); g_return_val_if_reached (args); } break; case GIMP_PDB_INT16: g_value_set_int (&value, params[i].data.d_int16); break; case GIMP_PDB_INT8: g_value_set_uint (&value, params[i].data.d_int8); break; case GIMP_PDB_FLOAT: g_value_set_double (&value, params[i].data.d_float); break; case GIMP_PDB_STRING: if (full_copy) g_value_set_string (&value, params[i].data.d_string); else g_value_set_static_string (&value, params[i].data.d_string); break; case GIMP_PDB_INT32ARRAY: count = g_value_get_int (gimp_value_array_index (args, i - 1)); if (full_copy) gimp_value_set_int32array (&value, params[i].data.d_int32array, count); else gimp_value_set_static_int32array (&value, params[i].data.d_int32array, count); break; case GIMP_PDB_INT16ARRAY: count = g_value_get_int (gimp_value_array_index (args, i - 1)); if (full_copy) gimp_value_set_int16array (&value, params[i].data.d_int16array, count); else gimp_value_set_static_int16array (&value, params[i].data.d_int16array, count); break; case GIMP_PDB_INT8ARRAY: count = g_value_get_int (gimp_value_array_index (args, i - 1)); if (full_copy) gimp_value_set_int8array (&value, params[i].data.d_int8array, count); else gimp_value_set_static_int8array (&value, params[i].data.d_int8array, count); break; case GIMP_PDB_FLOATARRAY: count = g_value_get_int (gimp_value_array_index (args, i - 1)); if (full_copy) gimp_value_set_floatarray (&value, params[i].data.d_floatarray, count); else gimp_value_set_static_floatarray (&value, params[i].data.d_floatarray, count); break; case GIMP_PDB_STRINGARRAY: count = g_value_get_int (gimp_value_array_index (args, i - 1)); if (full_copy) gimp_value_set_stringarray (&value, (const gchar **) params[i].data.d_stringarray, count); else gimp_value_set_static_stringarray (&value, (const gchar **) params[i].data.d_stringarray, count); break; case GIMP_PDB_COLOR: gimp_value_set_rgb (&value, ¶ms[i].data.d_color); break; case GIMP_PDB_ITEM: g_value_set_int (&value, params[i].data.d_item); break; case GIMP_PDB_DISPLAY: g_value_set_int (&value, params[i].data.d_display); break; case GIMP_PDB_IMAGE: g_value_set_int (&value, params[i].data.d_image); break; case GIMP_PDB_LAYER: g_value_set_int (&value, params[i].data.d_layer); break; case GIMP_PDB_CHANNEL: g_value_set_int (&value, params[i].data.d_channel); break; case GIMP_PDB_DRAWABLE: g_value_set_int (&value, params[i].data.d_drawable); break; case GIMP_PDB_SELECTION: g_value_set_int (&value, params[i].data.d_selection); break; case GIMP_PDB_COLORARRAY: count = g_value_get_int (gimp_value_array_index (args, i - 1)); if (full_copy) gimp_value_set_colorarray (&value, params[i].data.d_colorarray, count); else gimp_value_set_static_colorarray (&value, params[i].data.d_colorarray, count); break; case GIMP_PDB_VECTORS: g_value_set_int (&value, params[i].data.d_vectors); break; case GIMP_PDB_PARASITE: if (full_copy) g_value_set_boxed (&value, ¶ms[i].data.d_parasite); else g_value_set_static_boxed (&value, ¶ms[i].data.d_parasite); break; case GIMP_PDB_STATUS: g_value_set_enum (&value, params[i].data.d_status); break; case GIMP_PDB_END: break; } gimp_value_array_append (args, &value); g_value_unset (&value); } return args; }
GimpValueArray * gimp_procedure_get_return_values (GimpProcedure *procedure, gboolean success, const GError *error) { GimpValueArray *args; GValue value = { 0, }; gint i; g_return_val_if_fail (success == FALSE || GIMP_IS_PROCEDURE (procedure), NULL); if (success) { args = gimp_value_array_new (procedure->num_values + 1); g_value_init (&value, GIMP_TYPE_PDB_STATUS_TYPE); g_value_set_enum (&value, GIMP_PDB_SUCCESS); gimp_value_array_append (args, &value); g_value_unset (&value); for (i = 0; i < procedure->num_values; i++) { g_value_init (&value, G_PARAM_SPEC_VALUE_TYPE (procedure->values[i])); gimp_value_array_append (args, &value); g_value_unset (&value); } } else { args = gimp_value_array_new ((error && error->message) ? 2 : 1); g_value_init (&value, GIMP_TYPE_PDB_STATUS_TYPE); /* errors in the GIMP_PDB_ERROR domain are calling errors */ if (error && error->domain == GIMP_PDB_ERROR) { switch ((GimpPdbErrorCode) error->code) { case GIMP_PDB_ERROR_FAILED: case GIMP_PDB_ERROR_PROCEDURE_NOT_FOUND: case GIMP_PDB_ERROR_INVALID_ARGUMENT: case GIMP_PDB_ERROR_INVALID_RETURN_VALUE: case GIMP_PDB_ERROR_INTERNAL_ERROR: g_value_set_enum (&value, GIMP_PDB_CALLING_ERROR); break; case GIMP_PDB_ERROR_CANCELLED: g_value_set_enum (&value, GIMP_PDB_CANCEL); break; default: g_assert_not_reached (); } } else { g_value_set_enum (&value, GIMP_PDB_EXECUTION_ERROR); } gimp_value_array_append (args, &value); g_value_unset (&value); if (error && error->message) { g_value_init (&value, G_TYPE_STRING); g_value_set_string (&value, error->message); gimp_value_array_append (args, &value); g_value_unset (&value); } } return args; }
static void gimp_device_info_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { GimpDeviceInfo *info = GIMP_DEVICE_INFO (object); switch (property_id) { case PROP_DEVICE: g_value_set_object (value, info->device); break; case PROP_DISPLAY: g_value_set_object (value, info->display); break; case PROP_MODE: g_value_set_enum (value, gimp_device_info_get_mode (info)); break; case PROP_AXES: { GimpValueArray *array; GValue enum_value = { 0, }; gint n_axes; gint i; array = gimp_value_array_new (6); g_value_init (&enum_value, GDK_TYPE_AXIS_USE); n_axes = gimp_device_info_get_n_axes (info); for (i = 0; i < n_axes; i++) { g_value_set_enum (&enum_value, gimp_device_info_get_axis_use (info, i)); gimp_value_array_append (array, &enum_value); } g_value_unset (&enum_value); g_value_take_boxed (value, array); } break; case PROP_KEYS: { GimpValueArray *array; GValue string_value = { 0, }; gint n_keys; gint i; array = gimp_value_array_new (32); g_value_init (&string_value, G_TYPE_STRING); n_keys = gimp_device_info_get_n_keys (info); for (i = 0; i < n_keys; i++) { guint keyval; GdkModifierType modifiers; gimp_device_info_get_key (info, i, &keyval, &modifiers); if (keyval) { gchar *accel; gchar *escaped; accel = gtk_accelerator_name (keyval, modifiers); escaped = g_strescape (accel, NULL); g_free (accel); g_value_set_string (&string_value, escaped); g_free (escaped); } else { g_value_set_string (&string_value, ""); } gimp_value_array_append (array, &string_value); } g_value_unset (&string_value); g_value_take_boxed (value, array); } break; case PROP_PRESSURE_CURVE: g_value_set_object (value, info->pressure_curve); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } }
/* run automatically started extensions */ static void gimp_plug_in_manager_run_extensions (GimpPlugInManager *manager, GimpContext *context, GimpInitStatusFunc status_callback) { Gimp *gimp = manager->gimp; GSList *list; GList *extensions = NULL; gint n_extensions; /* build list of automatically started extensions */ for (list = manager->plug_in_procedures; list; list = list->next) { GimpPlugInProcedure *proc = list->data; if (proc->file && GIMP_PROCEDURE (proc)->proc_type == GIMP_EXTENSION && GIMP_PROCEDURE (proc)->num_args == 0) { extensions = g_list_prepend (extensions, proc); } } extensions = g_list_reverse (extensions); n_extensions = g_list_length (extensions); /* run the available extensions */ if (extensions) { GList *list; gint nth; status_callback (_("Starting Extensions"), "", 0.0); for (list = extensions, nth = 0; list; list = g_list_next (list), nth++) { GimpPlugInProcedure *proc = list->data; GimpValueArray *args; GError *error = NULL; if (gimp->be_verbose) g_print ("Starting extension: '%s'\n", gimp_object_get_name (proc)); status_callback (NULL, gimp_object_get_name (proc), (gdouble) nth / (gdouble) n_extensions); args = gimp_value_array_new (0); gimp_procedure_execute_async (GIMP_PROCEDURE (proc), gimp, context, NULL, args, NULL, &error); gimp_value_array_unref (args); if (error) { gimp_message_literal (gimp, NULL, GIMP_MESSAGE_ERROR, error->message); g_clear_error (&error); } } g_list_free (extensions); status_callback (NULL, "", 1.0); } }
static void gimp_curve_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { GimpCurve *curve = GIMP_CURVE (object); switch (property_id) { case PROP_CURVE_TYPE: g_value_set_enum (value, curve->curve_type); break; case PROP_N_POINTS: g_value_set_int (value, curve->n_points); break; case PROP_POINTS: { GimpValueArray *array = gimp_value_array_new (curve->n_points * 2); GValue v = { 0, }; gint i; g_value_init (&v, G_TYPE_DOUBLE); for (i = 0; i < curve->n_points; i++) { g_value_set_double (&v, curve->points[i].x); gimp_value_array_append (array, &v); g_value_set_double (&v, curve->points[i].y); gimp_value_array_append (array, &v); } g_value_unset (&v); g_value_take_boxed (value, array); } break; case PROP_N_SAMPLES: g_value_set_int (value, curve->n_samples); break; case PROP_SAMPLES: { GimpValueArray *array = gimp_value_array_new (curve->n_samples); GValue v = { 0, }; gint i; g_value_init (&v, G_TYPE_DOUBLE); for (i = 0; i < curve->n_samples; i++) { g_value_set_double (&v, curve->samples[i]); gimp_value_array_append (array, &v); } g_value_unset (&v); g_value_take_boxed (value, array); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } }