/***********************************************************************/
/* Open Visualization Data Explorer                                    */
/* (C) Copyright IBM Corp. 1989,1999                                   */
/* ALL RIGHTS RESERVED                                                 */
/* This code licensed under the                                        */
/*    "IBM PUBLIC LICENSE - Open Visualization Data Explorer"          */
/***********************************************************************/
/*
 * $Header: /home/gda/dxcvs/dx/src/exec/dxmods/band.c,v 1.3 1999/05/10 15:45:22 gda Exp $
 */

#include <dxconfig.h>


#include <string.h>
#include <dx/dx.h>
#include <_helper_jea.h>
#include <_isosurface.h>

/* declared in isourface.m:  float *_dxd_user_def_values = NULL; */

extern
Error
m_Band ( Object *in, Object *out )
{

#define  I_data    in[0]
#define  I_value   in[1]
#define  I_number  in[2]
#define  I_remap   in[3]
#define  O_band    out[0]

    int          i;
    iso_arg_type iso_arg;
    Class        class;
    char         *remap_string;

    O_band               = NULL;

    _dxd_user_def_values = NULL;
    iso_arg              = ISO_ARG_INITIALIZER;
    iso_arg.module       = BAND;
    iso_arg.normal_type  = NO_NORMALS;

    if ( !I_data )
        ErrorGotoPlus1
            ( ERROR_MISSING_DATA,
              "#10000", /* %s must be specified */ "'data' parameter" );

    iso_arg.self = I_data;

    if ( !I_value )
    {
        iso_arg.isovals = NULL;

        if ( !I_number )
        {
            iso_arg.number   = 1;
            iso_arg.use_mean = 1;
        }
        else
        {
            if ( !DXExtractInteger ( I_number, &iso_arg.number )
                 ||
                 ( iso_arg.number < 1 ) )
                ErrorGotoPlus1
                    ( ERROR_BAD_PARAMETER, 
                      "#10020", /* %s must be a positive integer */
                      "'number' parameter" );

            iso_arg.use_mean = 0;
        }
    }
    else 
    {
        iso_arg.use_mean = 0;

        if ( !DXQueryParameter ( I_value, TYPE_FLOAT, 1, &iso_arg.number ) )
            ErrorGotoPlus1
                ( ERROR_BAD_PARAMETER,
                  "#10130", /* %s must be a scalar or scalar list */
                  "'value' parameter" );

        if ( ERROR == ( _dxd_user_def_values
                            = (float *) DXAllocate
                                          ( sizeof(float) *
                                            (iso_arg.number + 1) ) )
             ||
             !DXExtractParameter
                ( I_value, TYPE_FLOAT, 1, iso_arg.number,
                  (Pointer)_dxd_user_def_values ) )
            goto error;

        if ( I_number )
            DXWarning
                ( "#4110", /* %s has been specified; %s assignment ignored */
                  "'value' parameter", "'number'" );

        iso_arg.isovals = _dxd_user_def_values;
    }

    if ( I_remap )
    {
        if ( !DXExtractString ( I_remap, &remap_string ) )
        {
            DXSetError
                ( ERROR_BAD_PARAMETER,
                  "#10200", /* %s must be a string */
                  "'remap'" );
            goto error;
        }

        if ( 0 == strcmp ( remap_string, "original" ) )
            iso_arg.remap = ORIGINAL_DATA;

        else if ( 0 == strcmp ( remap_string, "low" ) )
            iso_arg.remap = DATA_LOW;

        else if ( 0 == strcmp ( remap_string, "high" ) )
            iso_arg.remap = DATA_HIGH;

        else 
            ErrorGotoPlus2
                ( ERROR_BAD_PARAMETER,
                  "#10211", /* %s must be one of the following strings: %s */
                  "'remap' parameter",
                  "\"original\", \"low\", or \"high\"" )
    }
    else
        iso_arg.remap = DATA_LOW;

    if ( ( ERROR == ( O_band = _dxf_IsosurfaceObject ( iso_arg ) ) )
         ||
         ( DXGetError() != ERROR_NONE ) )
        goto error;

    DXFree   ( (Pointer) _dxd_user_def_values );
    DXDelete ( (Object)  iso_arg.gradient_interpolator );

    _dxd_user_def_values = NULL;

    return OK;

    error:
        if ( O_band ) DXDelete ( O_band );

        DXFree ( (Pointer) _dxd_user_def_values );

        _dxd_user_def_values = NULL;
        O_band               = NULL;

        DXASSERT ( DXGetError() != ERROR_NONE );
        return ERROR;
}
