/* LIBGIMP - The GIMP Library
 * Copyright (C) 1995-2003 Peter Mattis and Spencer Kimball
 *
 * gimpdrawablefilter_pdb.c
 *
 * This library is free software: you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library.  If not, see
 * <https://www.gnu.org/licenses/>.
 */

/* NOTE: This file is auto-generated by pdbgen.pl */

#include "config.h"

#include "stamp-pdbgen.h"

#include "gimp.h"


/**
 * SECTION: gimpdrawablefilter
 * @title: gimpdrawablefilter
 * @short_description: Operations on drawable filters.
 *
 * Operations on drawable filters: creation, editing.
 **/


/**
 * gimp_drawable_filter_id_is_valid:
 * @filter_id: The filter ID to check.
 *
 * Returns %TRUE if the drawable filter ID is valid.
 *
 * This procedure checks if the given drawable filter ID is valid and
 * refers to an existing filter.
 *
 * Returns: Whether the filter ID is valid.
 *
 * Since: 3.0
 **/
gboolean
gimp_drawable_filter_id_is_valid (gint filter_id)
{
  GimpValueArray *args;
  GimpValueArray *return_vals;
  gboolean valid = FALSE;

  args = gimp_value_array_new_from_types (NULL,
                                          G_TYPE_INT, filter_id,
                                          G_TYPE_NONE);

  return_vals = _gimp_pdb_run_procedure_array (gimp_get_pdb (),
                                               "gimp-drawable-filter-id-is-valid",
                                               args);
  gimp_value_array_unref (args);

  if (GIMP_VALUES_GET_ENUM (return_vals, 0) == GIMP_PDB_SUCCESS)
    valid = GIMP_VALUES_GET_BOOLEAN (return_vals, 1);

  gimp_value_array_unref (return_vals);

  return valid;
}

/**
 * gimp_drawable_filter_new:
 * @drawable: The drawable.
 * @operation_name: The GEGL operation's name.
 * @name: (nullable): The effect name.
 *
 * Create a new drawable filter.
 *
 * This procedure creates a new filter for the specified operation on
 * @drawable.
 * The new effect still needs to be either added or merged to @drawable
 * later. Add the effect non-destructively with
 * [method@Gimp.Drawable.append_filter].
 * Currently only layers can have non-destructive effects. The effects
 * must be merged for all other types of drawable.
 *
 * Returns: (transfer none): The newly created filter.
 *
 * Since: 3.0
 **/
GimpDrawableFilter *
gimp_drawable_filter_new (GimpDrawable *drawable,
                          const gchar  *operation_name,
                          const gchar  *name)
{
  GimpValueArray *args;
  GimpValueArray *return_vals;
  GimpDrawableFilter *filter = NULL;

  args = gimp_value_array_new_from_types (NULL,
                                          GIMP_TYPE_DRAWABLE, drawable,
                                          G_TYPE_STRING, operation_name,
                                          G_TYPE_STRING, name,
                                          G_TYPE_NONE);

  return_vals = _gimp_pdb_run_procedure_array (gimp_get_pdb (),
                                               "gimp-drawable-filter-new",
                                               args);
  gimp_value_array_unref (args);

  if (GIMP_VALUES_GET_ENUM (return_vals, 0) == GIMP_PDB_SUCCESS)
    filter = GIMP_VALUES_GET_DRAWABLE_FILTER (return_vals, 1);

  gimp_value_array_unref (return_vals);

  return filter;
}

/**
 * gimp_drawable_filter_get_name:
 * @filter: The filter whose name you want.
 *
 * Get a drawable filter's name.
 *
 * This procedure returns the specified filter's name.
 * Since it is not possible to set a drawable filter's name yet, this
 * will be the operation's name. Eventually this filter's name will be
 * a free form field so do not rely on this information for any
 * processing.
 *
 * Returns: (transfer full): The filter's name.
 *          The returned value must be freed with g_free().
 *
 * Since: 3.0
 **/
gchar *
gimp_drawable_filter_get_name (GimpDrawableFilter *filter)
{
  GimpValueArray *args;
  GimpValueArray *return_vals;
  gchar *name = NULL;

  args = gimp_value_array_new_from_types (NULL,
                                          GIMP_TYPE_DRAWABLE_FILTER, filter,
                                          G_TYPE_NONE);

  return_vals = _gimp_pdb_run_procedure_array (gimp_get_pdb (),
                                               "gimp-drawable-filter-get-name",
                                               args);
  gimp_value_array_unref (args);

  if (GIMP_VALUES_GET_ENUM (return_vals, 0) == GIMP_PDB_SUCCESS)
    name = GIMP_VALUES_DUP_STRING (return_vals, 1);

  gimp_value_array_unref (return_vals);

  return name;
}

/**
 * gimp_drawable_filter_get_operation_name:
 * @filter: The filter whose operation name you want.
 *
 * Get a drawable filter's operation name.
 *
 * This procedure returns the specified filter's operation name.
 *
 * Returns: (transfer full): The filter's operation name.
 *          The returned value must be freed with g_free().
 *
 * Since: 3.0
 **/
gchar *
gimp_drawable_filter_get_operation_name (GimpDrawableFilter *filter)
{
  GimpValueArray *args;
  GimpValueArray *return_vals;
  gchar *name = NULL;

  args = gimp_value_array_new_from_types (NULL,
                                          GIMP_TYPE_DRAWABLE_FILTER, filter,
                                          G_TYPE_NONE);

  return_vals = _gimp_pdb_run_procedure_array (gimp_get_pdb (),
                                               "gimp-drawable-filter-get-operation-name",
                                               args);
  gimp_value_array_unref (args);

  if (GIMP_VALUES_GET_ENUM (return_vals, 0) == GIMP_PDB_SUCCESS)
    name = GIMP_VALUES_DUP_STRING (return_vals, 1);

  gimp_value_array_unref (return_vals);

  return name;
}

/**
 * gimp_drawable_filter_get_visible:
 * @filter: The filter.
 *
 * Get the visibility of the specified filter.
 *
 * This procedure returns the specified filter's visibility.
 *
 * Returns: The filter visibility.
 *
 * Since: 3.0
 **/
gboolean
gimp_drawable_filter_get_visible (GimpDrawableFilter *filter)
{
  GimpValueArray *args;
  GimpValueArray *return_vals;
  gboolean visible = FALSE;

  args = gimp_value_array_new_from_types (NULL,
                                          GIMP_TYPE_DRAWABLE_FILTER, filter,
                                          G_TYPE_NONE);

  return_vals = _gimp_pdb_run_procedure_array (gimp_get_pdb (),
                                               "gimp-drawable-filter-get-visible",
                                               args);
  gimp_value_array_unref (args);

  if (GIMP_VALUES_GET_ENUM (return_vals, 0) == GIMP_PDB_SUCCESS)
    visible = GIMP_VALUES_GET_BOOLEAN (return_vals, 1);

  gimp_value_array_unref (return_vals);

  return visible;
}

/**
 * gimp_drawable_filter_set_visible:
 * @filter: The filter.
 * @visible: The new filter visibility.
 *
 * Set the visibility of the specified filter.
 *
 * This procedure sets the specified filter's visibility.
 * The drawable won't be immediately rendered. Use
 * [method@Gimp.Drawable.update] to trigger an update.
 *
 * Returns: TRUE on success.
 *
 * Since: 3.0
 **/
gboolean
gimp_drawable_filter_set_visible (GimpDrawableFilter *filter,
                                  gboolean            visible)
{
  GimpValueArray *args;
  GimpValueArray *return_vals;
  gboolean success = TRUE;

  args = gimp_value_array_new_from_types (NULL,
                                          GIMP_TYPE_DRAWABLE_FILTER, filter,
                                          G_TYPE_BOOLEAN, visible,
                                          G_TYPE_NONE);

  return_vals = _gimp_pdb_run_procedure_array (gimp_get_pdb (),
                                               "gimp-drawable-filter-set-visible",
                                               args);
  gimp_value_array_unref (args);

  success = GIMP_VALUES_GET_ENUM (return_vals, 0) == GIMP_PDB_SUCCESS;

  gimp_value_array_unref (return_vals);

  return success;
}

/**
 * gimp_drawable_filter_get_opacity:
 * @filter: The filter.
 *
 * Get the opacity of the specified filter.
 *
 * This procedure returns the specified filter's opacity.
 *
 * Returns: The filter's opacity.
 *
 * Since: 3.0
 **/
gdouble
gimp_drawable_filter_get_opacity (GimpDrawableFilter *filter)
{
  GimpValueArray *args;
  GimpValueArray *return_vals;
  gdouble opacity = 0.0;

  args = gimp_value_array_new_from_types (NULL,
                                          GIMP_TYPE_DRAWABLE_FILTER, filter,
                                          G_TYPE_NONE);

  return_vals = _gimp_pdb_run_procedure_array (gimp_get_pdb (),
                                               "gimp-drawable-filter-get-opacity",
                                               args);
  gimp_value_array_unref (args);

  if (GIMP_VALUES_GET_ENUM (return_vals, 0) == GIMP_PDB_SUCCESS)
    opacity = GIMP_VALUES_GET_DOUBLE (return_vals, 1);

  gimp_value_array_unref (return_vals);

  return opacity;
}

/**
 * gimp_drawable_filter_get_blend_mode:
 * @filter: The filter.
 *
 * Get the blending mode of the specified filter.
 *
 * This procedure returns the specified filter's mode.
 *
 * Returns: The effect blending mode.
 *
 * Since: 3.0
 **/
GimpLayerMode
gimp_drawable_filter_get_blend_mode (GimpDrawableFilter *filter)
{
  GimpValueArray *args;
  GimpValueArray *return_vals;
  GimpLayerMode mode = 0;

  args = gimp_value_array_new_from_types (NULL,
                                          GIMP_TYPE_DRAWABLE_FILTER, filter,
                                          G_TYPE_NONE);

  return_vals = _gimp_pdb_run_procedure_array (gimp_get_pdb (),
                                               "gimp-drawable-filter-get-blend-mode",
                                               args);
  gimp_value_array_unref (args);

  if (GIMP_VALUES_GET_ENUM (return_vals, 0) == GIMP_PDB_SUCCESS)
    mode = GIMP_VALUES_GET_ENUM (return_vals, 1);

  gimp_value_array_unref (return_vals);

  return mode;
}

/**
 * _gimp_drawable_filter_update:
 * @filter: The filter.
 * @propnames: (array zero-terminated=1): Array of property names.
 * @propvalues: Array of values, one per property in propnames.
 * @opacity: The filter's opacity.
 * @blend_mode: The effect blending mode.
 * @blend_space: The effect blending space.
 * @composite_mode: The layer composite mode.
 * @composite_space: The effect composite space.
 * @auxinputnames: (array zero-terminated=1): Array of aux input pads.
 * @auxinputs: (element-type GimpDrawable) (array zero-terminated=1): Array of drawables, one per auxinputnames.
 *
 * Update the settings of the specified filter.
 *
 * This procedure updates the settings of the specified filter all at
 * once.
 * In particular, update will be frozen and will happen only once for
 * all changed settings.
 * This PDB function is internal, meant to be private and its arguments
 * will likely change as filters evolve. It should not be used.
 *
 * Returns: TRUE on success.
 *
 * Since: 3.0
 **/
gboolean
_gimp_drawable_filter_update (GimpDrawableFilter      *filter,
                              const gchar            **propnames,
                              const GimpValueArray    *propvalues,
                              gdouble                  opacity,
                              GimpLayerMode            blend_mode,
                              GimpLayerColorSpace      blend_space,
                              GimpLayerCompositeMode   composite_mode,
                              GimpLayerColorSpace      composite_space,
                              const gchar            **auxinputnames,
                              const GimpDrawable     **auxinputs)
{
  GimpValueArray *args;
  GimpValueArray *return_vals;
  gboolean success = TRUE;

  args = gimp_value_array_new_from_types (NULL,
                                          GIMP_TYPE_DRAWABLE_FILTER, filter,
                                          G_TYPE_STRV, propnames,
                                          GIMP_TYPE_VALUE_ARRAY, propvalues,
                                          G_TYPE_DOUBLE, opacity,
                                          GIMP_TYPE_LAYER_MODE, blend_mode,
                                          GIMP_TYPE_LAYER_COLOR_SPACE, blend_space,
                                          GIMP_TYPE_LAYER_COMPOSITE_MODE, composite_mode,
                                          GIMP_TYPE_LAYER_COLOR_SPACE, composite_space,
                                          G_TYPE_STRV, auxinputnames,
                                          GIMP_TYPE_CORE_OBJECT_ARRAY, auxinputs,
                                          G_TYPE_NONE);

  return_vals = _gimp_pdb_run_procedure_array (gimp_get_pdb (),
                                               "gimp-drawable-filter-update",
                                               args);
  gimp_value_array_unref (args);

  success = GIMP_VALUES_GET_ENUM (return_vals, 0) == GIMP_PDB_SUCCESS;

  gimp_value_array_unref (return_vals);

  return success;
}

/**
 * _gimp_drawable_filter_get_number_arguments:
 * @filter: The filter.
 *
 * Queries for the number of arguments on the specified filter.
 *
 * This procedure returns the number of arguments on the specified
 * filter.
 * For specific information on each input argument, use
 * gimp_drawable_filter_get_argument().
 *
 * Returns: The number of input arguments.
 *
 * Since: 3.0
 **/
gint
_gimp_drawable_filter_get_number_arguments (GimpDrawableFilter *filter)
{
  GimpValueArray *args;
  GimpValueArray *return_vals;
  gint num_args = 0;

  args = gimp_value_array_new_from_types (NULL,
                                          GIMP_TYPE_DRAWABLE_FILTER, filter,
                                          G_TYPE_NONE);

  return_vals = _gimp_pdb_run_procedure_array (gimp_get_pdb (),
                                               "gimp-drawable-filter-get-number-arguments",
                                               args);
  gimp_value_array_unref (args);

  if (GIMP_VALUES_GET_ENUM (return_vals, 0) == GIMP_PDB_SUCCESS)
    num_args = GIMP_VALUES_GET_INT (return_vals, 1);

  gimp_value_array_unref (return_vals);

  return num_args;
}

/**
 * _gimp_drawable_filter_get_pspec:
 * @filter: The filter.
 * @arg_num: The argument number.
 *
 * Queries for information on the specified filter's argument.
 *
 * This procedure returns the #GParamSpec of filter's argument.
 *
 * Returns: (transfer full): The GParamSpec of the argument.
 *          The returned value must be freed with g_param_spec_unref().
 *
 * Since: 3.0
 **/
GParamSpec *
_gimp_drawable_filter_get_pspec (GimpDrawableFilter *filter,
                                 gint                arg_num)
{
  GimpValueArray *args;
  GimpValueArray *return_vals;
  GParamSpec *param_spec = NULL;

  args = gimp_value_array_new_from_types (NULL,
                                          GIMP_TYPE_DRAWABLE_FILTER, filter,
                                          G_TYPE_INT, arg_num,
                                          G_TYPE_NONE);

  return_vals = _gimp_pdb_run_procedure_array (gimp_get_pdb (),
                                               "gimp-drawable-filter-get-pspec",
                                               args);
  gimp_value_array_unref (args);

  if (GIMP_VALUES_GET_ENUM (return_vals, 0) == GIMP_PDB_SUCCESS)
    param_spec = GIMP_VALUES_DUP_PARAM (return_vals, 1);

  gimp_value_array_unref (return_vals);

  return param_spec;
}

/**
 * _gimp_drawable_filter_get_arguments:
 * @filter: The filter.
 * @values: (out): The values of the arguments in same order.
 *
 * Returns the currently set filter arguments.
 *
 * This procedure returns the filter's arguments.
 *
 * Returns: (array zero-terminated=1) (transfer full):
 *          The names of the arguments.
 *          The returned value must be freed with g_strfreev().
 *
 * Since: 3.0
 **/
gchar **
_gimp_drawable_filter_get_arguments (GimpDrawableFilter  *filter,
                                     GimpValueArray     **values)
{
  GimpValueArray *args;
  GimpValueArray *return_vals;
  gchar **argnames = NULL;

  args = gimp_value_array_new_from_types (NULL,
                                          GIMP_TYPE_DRAWABLE_FILTER, filter,
                                          G_TYPE_NONE);

  return_vals = _gimp_pdb_run_procedure_array (gimp_get_pdb (),
                                               "gimp-drawable-filter-get-arguments",
                                               args);
  gimp_value_array_unref (args);

  if (GIMP_VALUES_GET_ENUM (return_vals, 0) == GIMP_PDB_SUCCESS)
    {
      argnames = GIMP_VALUES_DUP_STRV (return_vals, 1);
      *values = g_value_dup_boxed (gimp_value_array_index (return_vals, 2));
    }

  gimp_value_array_unref (return_vals);

  return argnames;
}

/**
 * gimp_drawable_filter_delete:
 * @filter: The filter to delete.
 *
 * Delete a drawable filter.
 *
 * This procedure deletes the specified filter. This must not be done
 * if the drawable whose this filter was applied to was already deleted
 * or if the drawable was already removed from the image.
 * Do not use anymore the @filter object after having deleted it.
 *
 * Returns: TRUE on success.
 *
 * Since: 3.0
 **/
gboolean
gimp_drawable_filter_delete (GimpDrawableFilter *filter)
{
  GimpValueArray *args;
  GimpValueArray *return_vals;
  gboolean success = TRUE;

  args = gimp_value_array_new_from_types (NULL,
                                          GIMP_TYPE_DRAWABLE_FILTER, filter,
                                          G_TYPE_NONE);

  return_vals = _gimp_pdb_run_procedure_array (gimp_get_pdb (),
                                               "gimp-drawable-filter-delete",
                                               args);
  gimp_value_array_unref (args);

  success = GIMP_VALUES_GET_ENUM (return_vals, 0) == GIMP_PDB_SUCCESS;

  gimp_value_array_unref (return_vals);

  return success;
}

/**
 * gimp_drawable_filter_operation_get_available:
 *
 * Get a list of all available GEGL operation names for drawable
 * filters.
 *
 * This procedure returns a list of all GEGL operation names available
 * for use with drawable filters.
 *
 * Returns: (array zero-terminated=1) (transfer full):
 *          The list of GEGL operation names.
 *          The returned value must be freed with g_strfreev().
 *
 * Since: 3.2
 **/
gchar **
gimp_drawable_filter_operation_get_available (void)
{
  GimpValueArray *args;
  GimpValueArray *return_vals;
  gchar **names = NULL;

  args = gimp_value_array_new_from_types (NULL,
                                          G_TYPE_NONE);

  return_vals = _gimp_pdb_run_procedure_array (gimp_get_pdb (),
                                               "gimp-drawable-filter-operation-get-available",
                                               args);
  gimp_value_array_unref (args);

  if (GIMP_VALUES_GET_ENUM (return_vals, 0) == GIMP_PDB_SUCCESS)
    names = GIMP_VALUES_DUP_STRV (return_vals, 1);

  gimp_value_array_unref (return_vals);

  return names;
}

/**
 * gimp_drawable_filter_operation_get_details:
 * @operation_name: The GEGL operation's name.
 * @propnames: (out) (array zero-terminated=1) (transfer full): The names of properties.
 * @propvalues: (out): The values of properties in the same order.
 *
 * Get information about a GEGL operation.
 *
 * This procedure returns information about a GEGL operation. The
 * content of the list of information can vary across versions and
 * currently can contain:
 * - a human-readable title of the operation, - a description of the
 * operation's behaviour, - the categories the operation belongs to,
 * and - the license of the operation.
 * An operation can belong to no categories or to multiple categories.
 * Multiple categories are separated by the ':' character.
 * Some operation's license is not specifically set. In such cases, the
 * returned license is 'unknown'.
 *
 * Returns: TRUE on success.
 *
 * Since: 3.2
 **/
gboolean
gimp_drawable_filter_operation_get_details (const gchar      *operation_name,
                                            gchar          ***propnames,
                                            GimpValueArray  **propvalues)
{
  GimpValueArray *args;
  GimpValueArray *return_vals;
  gboolean success = TRUE;

  args = gimp_value_array_new_from_types (NULL,
                                          G_TYPE_STRING, operation_name,
                                          G_TYPE_NONE);

  return_vals = _gimp_pdb_run_procedure_array (gimp_get_pdb (),
                                               "gimp-drawable-filter-operation-get-details",
                                               args);
  gimp_value_array_unref (args);

  *propnames = NULL;
  *propvalues = NULL;

  success = GIMP_VALUES_GET_ENUM (return_vals, 0) == GIMP_PDB_SUCCESS;

  if (success)
    {
      *propnames = GIMP_VALUES_DUP_STRV (return_vals, 1);
      *propvalues = g_value_dup_boxed (gimp_value_array_index (return_vals, 2));
    }

  gimp_value_array_unref (return_vals);

  return success;
}

/**
 * gimp_drawable_filter_operation_get_pspecs:
 * @operation_name: The GEGL operation's name.
 *
 * Get information for all parameters of a GEGL operation.
 *
 * This procedure returns a list of all parameters used to configure a
 * GEGL operation.
 * Each parameter is represented by GParamSpec.
 *
 * Returns: List of all parameters of the GEGL operation.
 *          The returned value must be freed with g_free().
 *
 * Since: 3.2
 **/
GimpValueArray *
gimp_drawable_filter_operation_get_pspecs (const gchar *operation_name)
{
  GimpValueArray *args;
  GimpValueArray *return_vals;
  GimpValueArray *pspecs = NULL;

  args = gimp_value_array_new_from_types (NULL,
                                          G_TYPE_STRING, operation_name,
                                          G_TYPE_NONE);

  return_vals = _gimp_pdb_run_procedure_array (gimp_get_pdb (),
                                               "gimp-drawable-filter-operation-get-pspecs",
                                               args);
  gimp_value_array_unref (args);

  if (GIMP_VALUES_GET_ENUM (return_vals, 0) == GIMP_PDB_SUCCESS)
    pspecs = g_value_dup_boxed (gimp_value_array_index (return_vals, 1));

  gimp_value_array_unref (return_vals);

  return pspecs;
}
