param.c
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:24k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * param.c:
  3.  *****************************************************************************
  4.  * Copyright (C) 2004 VideoLAN
  5.  * $Id: param.c 8205 2004-07-17 13:55:48Z asmax $
  6.  *
  7.  * Authors: Cyril Deguet <asmax@videolan.org>
  8.  *          code from projectM http://xmms-projectm.sourceforge.net
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2 of the License, or
  13.  * (at your option) any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; if not, write to the Free Software
  22.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  23.  *****************************************************************************/
  24. /* Basic Parameter Functions */
  25. #include <stdio.h>
  26. #include <string.h>
  27. #include <stdlib.h>
  28. #include <math.h>
  29. #include "fatal.h"
  30. #include "common.h"
  31. #include "splaytree_types.h"
  32. #include "splaytree.h"
  33. #include "tree_types.h"
  34. #include "param_types.h"
  35. #include "param.h"
  36. #include "expr_types.h"
  37. #include "eval.h"
  38. #include "engine_vars.h" 
  39. void reset_param(param_t * param);
  40. int is_valid_param_string(char * string); /* true if string is valid variable or function name */
  41. /* A splay tree of builtin parameters */
  42. splaytree_t * builtin_param_tree = NULL;
  43. int insert_param_alt_name(param_t * param, char * alt_name);
  44. int insert_builtin_param(param_t * param);
  45. /* Private function prototypes */
  46. int compare_param(char * name, char * name2);
  47. int load_builtin_param_double(char * name, void * engine_val, void * matrix, short int flags, 
  48. double init_val, double upper_bound, double lower_bound, char * alt_name);
  49. int load_builtin_param_int(char * name, void * engine_val, short int flags, 
  50. int init_val, int upper_bound, int lower_bound, char * alt_name);
  51. int load_builtin_param_bool(char * name, void * engine_val, short int flags, 
  52. int init_val, char * alt_name);
  53. param_t * create_param (char * name, short int type, short int flags, void * engine_val, void * matrix,
  54. value_t default_init_val, value_t upper_bound, value_t lower_bound) {
  55.   param_t * param = NULL;
  56.   param = (param_t*)malloc(sizeof(param_t));
  57.  
  58.   if (param == NULL) {
  59. printf("create_param: out of memory!!!n");
  60. return NULL;
  61.   }
  62.   
  63.   /* Clear name space, think the strncpy statement makes this redundant */
  64.   //memset(param->name, 0, MAX_TOKEN_SIZE);
  65.   /* Copy given name into parameter structure */
  66.   strncpy(param->name, name, MAX_TOKEN_SIZE-1); 
  67.   
  68.   /* Assign other entries in a constructor like fashion */
  69.   param->type = type;
  70.   param->flags = flags;
  71.   param->matrix_flag = 0;
  72.   param->matrix = matrix;
  73.   param->engine_val = engine_val;
  74.   param->default_init_val = default_init_val;
  75.   //*param->init_val = default_init_val;
  76.   param->upper_bound = upper_bound;
  77.   param->lower_bound = lower_bound;
  78.   
  79.   /* Return instantiated parameter */
  80.   return param;
  81. }
  82. /* Creates a user defined parameter */
  83. param_t * create_user_param(char * name) {
  84.   param_t * param;
  85.   value_t iv;
  86.   value_t ub;
  87.   value_t lb;
  88.   double * engine_val;
  89.   
  90.   /* Set initial values to default */
  91.   iv.double_val = DEFAULT_DOUBLE_IV;
  92.   ub.double_val = DEFAULT_DOUBLE_UB;
  93.   lb.double_val = DEFAULT_DOUBLE_LB;
  94.   /* Argument checks */
  95.   if (name == NULL)
  96.     return NULL;
  97.   /* Allocate space for the engine variable */
  98.   if ((engine_val = (double*)malloc(sizeof(double))) == NULL)
  99.     return NULL;
  100.   (*engine_val) = iv.double_val; /* set some default init value */
  101.   
  102.   /* Create the new user parameter */
  103.   if ((param = create_param(name, P_TYPE_DOUBLE, P_FLAG_USERDEF, engine_val, NULL, iv, ub, lb)) == NULL) {
  104.     free(engine_val);
  105.     return NULL;
  106.   }
  107.   if (PARAM_DEBUG) printf("create_param: "%s" initializedn", param->name);
  108.   /* Return the instantiated parameter */
  109.   return param;
  110. }
  111. /* Initialize the builtin parameter database.
  112.    Should only be necessary once */
  113. int init_builtin_param_db() {
  114.   /* Create the builtin parameter splay tree (go Sleator...) */
  115.   if ((builtin_param_tree = create_splaytree(compare_string, copy_string, free_string)) == NULL) {
  116.   if (PARAM_DEBUG) printf("init_builtin_param_db: failed to initialize database (FATAL)n");  
  117.   return OUTOFMEM_ERROR;
  118.   } 
  119.   if (PARAM_DEBUG) {
  120.   printf("init_builtin_param: loading database...");
  121.   fflush(stdout);
  122.   }
  123.   
  124.   /* Loads all builtin parameters into the database */
  125.   if (load_all_builtin_param() < 0) {
  126. if (PARAM_DEBUG) printf("failed loading builtin parameters (FATAL)n");
  127.     return ERROR;
  128.   }
  129.   
  130.   if (PARAM_DEBUG) printf("success!n");
  131.   
  132.   /* Finished, no errors */
  133.   return SUCCESS;
  134. }
  135. /* Destroy the builtin parameter database.
  136.    Generally, do this on projectm exit */
  137. int destroy_builtin_param_db() {
  138.   
  139.   splay_traverse(free_param, builtin_param_tree);
  140.   destroy_splaytree(builtin_param_tree);
  141.   builtin_param_tree = NULL;
  142.   return SUCCESS;
  143. }
  144. /* Insert a parameter into the database with an alternate name */
  145. int insert_param_alt_name(param_t * param, char * alt_name) {
  146.   
  147.   if (param == NULL)
  148.     return ERROR;
  149.   if (alt_name == NULL)
  150.   return ERROR;
  151.   
  152.   splay_insert_link(alt_name, param->name, builtin_param_tree);
  153.   return SUCCESS;
  154. }
  155. param_t * find_builtin_param(char * name) {
  156.   /* Null argument checks */
  157.   if (name == NULL)
  158.   return NULL;
  159.     
  160.   return splay_find(name, builtin_param_tree);
  161. }
  162. /* Find a parameter given its name, will create one if not found */
  163. param_t * find_param(char * name, preset_t * preset, int flags) {
  164.   param_t * param = NULL;
  165.   /* Null argument checks */
  166.   if (name == NULL)
  167.   return NULL;
  168.   if (preset == NULL)
  169.   return NULL;
  170.   
  171.   /* First look in the builtin database */
  172.   param = (param_t *)splay_find(name, builtin_param_tree);
  173.   /* If the search failed, check the user database */
  174.   if (param == NULL) {
  175.     param = (param_t*)splay_find(name, preset->user_param_tree);
  176.   }
  177.   /* If it doesn't exist in the user (or builtin) database and 
  178.      create_flag is set, then make it and insert into the database 
  179.   */
  180.   
  181.   if ((param == NULL) && (flags & P_CREATE)) {
  182. /* Check if string is valid */
  183.     if (!is_valid_param_string(name)) {
  184.       if (PARAM_DEBUG) printf("find_param: invalid parameter name:"%s"n", name);
  185.       return NULL;
  186.     }
  187.     /* Now, create the user defined parameter given the passed name */
  188.     if ((param = create_user_param(name)) == NULL) {
  189.       if (PARAM_DEBUG) printf("find_param: failed to create a new user parameter!n");
  190.       return NULL;
  191.     }
  192.     /* Finally, insert the new parameter into this preset's proper splaytree */
  193.     if (splay_insert(param, param->name, preset->user_param_tree) < 0) {
  194.       if (PARAM_DEBUG) printf("PARAM "%s" already exists in user parameter tree!n", param->name);
  195.       free_param(param);
  196.       return NULL;
  197.     }  
  198.     
  199.   }   
  200.   
  201.   /* Return the found (or created) parameter. Note that if P_CREATE is not set, this could be null */
  202.   return param;
  203.   
  204. }
  205. /* Compare string name with parameter name */
  206. int compare_param(char * name, char * name2) {
  207.   int cmpval;
  208.   printf("am i usedn");
  209.   /* Uses string comparison function */
  210.   cmpval = strncmp(name, name2, MAX_TOKEN_SIZE-1);
  211.   
  212.   return cmpval;
  213. }
  214. /* Loads all builtin parameters, limits are also defined here */
  215. int load_all_builtin_param() {
  216.   load_builtin_param_double("fRating", (void*)&fRating, NULL, P_FLAG_NONE, 0.0 , 5.0, 0.0, NULL);
  217.   load_builtin_param_double("fWaveScale", (void*)&fWaveScale, NULL, P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL);
  218.   load_builtin_param_double("gamma", (void*)&fGammaAdj, NULL, P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, 0, "fGammaAdj");
  219.   load_builtin_param_double("echo_zoom", (void*)&fVideoEchoZoom, NULL, P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, 0, "fVideoEchoZoom");
  220.   load_builtin_param_double("echo_alpha", (void*)&fVideoEchoAlpha, NULL, P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, 0, "fVideoEchoAlpha");
  221.   load_builtin_param_double("wave_a", (void*)&fWaveAlpha, NULL, P_FLAG_NONE, 0.0, 1.0, 0, "fWaveAlpha");
  222.   load_builtin_param_double("fWaveSmoothing", (void*)&fWaveSmoothing, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, NULL);  
  223.   load_builtin_param_double("fModWaveAlphaStart", (void*)&fModWaveAlphaStart, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, NULL);
  224.   load_builtin_param_double("fModWaveAlphaEnd", (void*)&fModWaveAlphaEnd, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, NULL);
  225.   load_builtin_param_double("fWarpAnimSpeed",  (void*)&fWarpAnimSpeed, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, NULL);
  226.   //  load_builtin_param_double("warp", (void*)&warp, warp_mesh, P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, 0, NULL);
  227.   load_builtin_param_double("fShader", (void*)&fShader, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, NULL);
  228.   load_builtin_param_double("decay", (void*)&decay, NULL, P_FLAG_NONE, 0.0, 1.0, 0, "fDecay");
  229.   load_builtin_param_int("echo_orient", (void*)&nVideoEchoOrientation, P_FLAG_NONE, 0, 3, 0, "nVideoEchoOrientation");
  230.   load_builtin_param_int("wave_mode", (void*)&nWaveMode, P_FLAG_NONE, 0, 7, 0, "nWaveMode");
  231.   
  232.   load_builtin_param_bool("wave_additive", (void*)&bAdditiveWaves, P_FLAG_NONE, FALSE, "bAdditiveWaves");
  233.   load_builtin_param_bool("bModWaveAlphaByVolume", (void*)&bModWaveAlphaByVolume, P_FLAG_NONE, FALSE, NULL);
  234.   load_builtin_param_bool("wave_brighten", (void*)&bMaximizeWaveColor, P_FLAG_NONE, FALSE, "bMaximizeWaveColor");
  235.   load_builtin_param_bool("wrap", (void*)&bTexWrap, P_FLAG_NONE, FALSE, "bTexWrap");
  236.   load_builtin_param_bool("darken_center", (void*)&bDarkenCenter, P_FLAG_NONE, FALSE, "bDarkenCenter");
  237.   load_builtin_param_bool("bRedBlueStereo", (void*)&bRedBlueStereo, P_FLAG_NONE, FALSE, NULL);
  238.   load_builtin_param_bool("brighten", (void*)&bBrighten, P_FLAG_NONE, FALSE, "bBrighten");
  239.   load_builtin_param_bool("darken", (void*)&bDarken, P_FLAG_NONE, FALSE, "bDarken");
  240.   load_builtin_param_bool("solarize", (void*)&bSolarize, P_FLAG_NONE, FALSE, "bSolarize");
  241.   load_builtin_param_bool("invert", (void*)&bInvert, P_FLAG_NONE, FALSE, "bInvert");
  242.   load_builtin_param_bool("bMotionVectorsOn", (void*)&bMotionVectorsOn, P_FLAG_NONE, FALSE, NULL);
  243.   load_builtin_param_bool("wave_dots", (void*)&bWaveDots, P_FLAG_NONE, FALSE, "bWaveDots");
  244.   load_builtin_param_bool("wave_thick", (void*)&bWaveThick, P_FLAG_NONE, FALSE, "bWaveThick");
  245.  
  246.   
  247.   
  248.   load_builtin_param_double("zoom", (void*)&zoom, zoom_mesh,  P_FLAG_PER_PIXEL |P_FLAG_DONT_FREE_MATRIX, 0.0, MAX_DOUBLE_SIZE, 0, NULL);
  249.   load_builtin_param_double("rot", (void*)&rot, rot_mesh,  P_FLAG_PER_PIXEL |P_FLAG_DONT_FREE_MATRIX, 0.0, MAX_DOUBLE_SIZE, MIN_DOUBLE_SIZE, NULL);
  250.   load_builtin_param_double("zoomexp", (void*)&zoomexp, zoomexp_mesh,  P_FLAG_PER_PIXEL |P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, 0, "fZoomExponent");
  251.  
  252.   load_builtin_param_double("cx", (void*)&cx, cx_mesh, P_FLAG_PER_PIXEL | P_FLAG_DONT_FREE_MATRIX, 0.0, 1.0, 0, NULL);
  253.   load_builtin_param_double("cy", (void*)&cy, cy_mesh, P_FLAG_PER_PIXEL | P_FLAG_DONT_FREE_MATRIX, 0.0, 1.0, 0, NULL);
  254.   load_builtin_param_double("dx", (void*)&dx, dx_mesh,  P_FLAG_PER_PIXEL | P_FLAG_DONT_FREE_MATRIX, 0.0, MAX_DOUBLE_SIZE, MIN_DOUBLE_SIZE, NULL);
  255.   load_builtin_param_double("dy", (void*)&dy, dy_mesh,  P_FLAG_PER_PIXEL |P_FLAG_DONT_FREE_MATRIX, 0.0, MAX_DOUBLE_SIZE, MIN_DOUBLE_SIZE, NULL);
  256.   load_builtin_param_double("sx", (void*)&sx, sx_mesh,  P_FLAG_PER_PIXEL |P_FLAG_DONT_FREE_MATRIX, 0.0, MAX_DOUBLE_SIZE, 0, NULL);
  257.   load_builtin_param_double("sy", (void*)&sy, sy_mesh,  P_FLAG_PER_PIXEL |P_FLAG_DONT_FREE_MATRIX, 0.0, MAX_DOUBLE_SIZE, 0, NULL);
  258.   load_builtin_param_double("wave_r", (void*)&wave_r, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
  259.   load_builtin_param_double("wave_g", (void*)&wave_g, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
  260.   load_builtin_param_double("wave_b", (void*)&wave_b, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
  261.   load_builtin_param_double("wave_x", (void*)&wave_x, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
  262.   load_builtin_param_double("wave_y", (void*)&wave_y, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
  263.   load_builtin_param_double("wave_mystery", (void*)&wave_mystery, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, "fWaveParam");
  264.   
  265.   load_builtin_param_double("ob_size", (void*)&ob_size, NULL, P_FLAG_NONE, 0.0, 0.5, 0, NULL);
  266.   load_builtin_param_double("ob_r", (void*)&ob_r, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
  267.   load_builtin_param_double("ob_g", (void*)&ob_g, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
  268.   load_builtin_param_double("ob_b", (void*)&ob_b, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
  269.   load_builtin_param_double("ob_a", (void*)&ob_a, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
  270.   load_builtin_param_double("ib_size", (void*)&ib_size,  NULL,P_FLAG_NONE, 0.0, .5, 0.0, NULL);
  271.   load_builtin_param_double("ib_r", (void*)&ib_r,  NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
  272.   load_builtin_param_double("ib_g", (void*)&ib_g,  NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
  273.   load_builtin_param_double("ib_b", (void*)&ib_b,  NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
  274.   load_builtin_param_double("ib_a", (void*)&ib_a,  NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
  275.   load_builtin_param_double("mv_r", (void*)&mv_r,  NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
  276.   load_builtin_param_double("mv_g", (void*)&mv_g,  NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
  277.   load_builtin_param_double("mv_b", (void*)&mv_b,  NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
  278.   load_builtin_param_double("mv_x", (void*)&mv_x,  NULL,P_FLAG_NONE, 0.0, 64.0, 0.0, "nMotionVectorsX");
  279.   load_builtin_param_double("mv_y", (void*)&mv_y,  NULL,P_FLAG_NONE, 0.0, 48.0, 0.0, "nMotionVectorsY");
  280.   load_builtin_param_double("mv_l", (void*)&mv_l,  NULL,P_FLAG_NONE, 0.0, 5.0, 0.0, NULL);
  281.   load_builtin_param_double("mv_dy", (void*)&mv_dy, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, NULL);
  282.   load_builtin_param_double("mv_dx", (void*)&mv_dx,  NULL,P_FLAG_NONE, 0.0, 1.0, -1.0, NULL);
  283.   load_builtin_param_double("mv_a", (void*)&mv_a,  NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, NULL);
  284.   load_builtin_param_double("time", (void*)&Time,  NULL,P_FLAG_READONLY, 0.0, MAX_DOUBLE_SIZE, 0.0, NULL);        
  285.   load_builtin_param_double("bass", (void*)&bass,  NULL,P_FLAG_READONLY, 0.0, MAX_DOUBLE_SIZE, 0.0, NULL);
  286.   load_builtin_param_double("mid", (void*)&mid,  NULL,P_FLAG_READONLY, 0.0, MAX_DOUBLE_SIZE, 0, NULL);      
  287.   load_builtin_param_double("bass_att", (void*)&bass_att,  NULL,P_FLAG_READONLY, 0.0, MAX_DOUBLE_SIZE, 0, NULL);
  288.   load_builtin_param_double("mid_att", (void*)&mid_att,  NULL,P_FLAG_READONLY, 0.0, MAX_DOUBLE_SIZE, 0, NULL);
  289.   load_builtin_param_double("treb_att", (void*)&treb_att,  NULL,P_FLAG_READONLY, 0.0, MAX_DOUBLE_SIZE, 0, NULL);
  290.   load_builtin_param_int("frame", (void*)&frame, P_FLAG_READONLY, 0, MAX_INT_SIZE, 0, NULL);
  291.   load_builtin_param_double("progress", (void*)&progress,  NULL,P_FLAG_READONLY, 0.0, 1, 0, NULL);
  292.   load_builtin_param_int("fps", (void*)&fps, P_FLAG_NONE, 15, MAX_INT_SIZE, 0, NULL);
  293.   load_builtin_param_double("x", (void*)&x_per_pixel, x_mesh,  P_FLAG_PER_PIXEL |P_FLAG_ALWAYS_MATRIX | P_FLAG_READONLY | P_FLAG_DONT_FREE_MATRIX, 
  294.     0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL);
  295.   load_builtin_param_double("y", (void*)&y_per_pixel, y_mesh,  P_FLAG_PER_PIXEL |P_FLAG_ALWAYS_MATRIX |P_FLAG_READONLY | P_FLAG_DONT_FREE_MATRIX, 
  296.     0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL);
  297.   load_builtin_param_double("ang", (void*)&ang_per_pixel, theta_mesh,  P_FLAG_PER_PIXEL |P_FLAG_ALWAYS_MATRIX | P_FLAG_READONLY | P_FLAG_DONT_FREE_MATRIX, 
  298.     0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL);      
  299.   load_builtin_param_double("rad", (void*)&rad_per_pixel, rad_mesh,  P_FLAG_PER_PIXEL |P_FLAG_ALWAYS_MATRIX | P_FLAG_READONLY | P_FLAG_DONT_FREE_MATRIX, 
  300.     0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL);
  301.   load_builtin_param_double("q1", (void*)&q1,  NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL);
  302.   load_builtin_param_double("q2", (void*)&q2,  NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL);
  303.   load_builtin_param_double("q3", (void*)&q3,  NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL);
  304.   load_builtin_param_double("q4", (void*)&q4,  NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL);
  305.   load_builtin_param_double("q5", (void*)&q5,  NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL);
  306.   load_builtin_param_double("q6", (void*)&q6,  NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL);
  307.   load_builtin_param_double("q7", (void*)&q7,  NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL);
  308.   load_builtin_param_double("q8", (void*)&q8,  NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL);
  309.   /* variables added in 1.04 */
  310.   load_builtin_param_int("meshx", (void*)&gx, P_FLAG_READONLY, 32, 96, 8, NULL);
  311.   load_builtin_param_int("meshy", (void*)&gy, P_FLAG_READONLY, 24, 72, 6, NULL);
  312.   return SUCCESS;  
  313.   
  314. }
  315. /* Free's a parameter type */
  316. void free_param(param_t * param) {
  317.   int x;
  318.   if (param == NULL)
  319. return;
  320.   
  321.   if (param->flags & P_FLAG_USERDEF) {
  322.     free(param->engine_val);
  323.   }
  324.   if (!(param->flags & P_FLAG_DONT_FREE_MATRIX)) {
  325.     if (param->flags & P_FLAG_PER_POINT)
  326.       free(param->matrix);
  327.     else if (param->flags & P_FLAG_PER_PIXEL) {
  328.        for(x = 0; x < gx; x++) 
  329.    free(((double**)param->matrix)[x]);
  330.        free(param->matrix);
  331.       }
  332.   }
  333.   if (PARAM_DEBUG) printf("free_param: freeing "%s".n", param->name);
  334.   free(param);
  335. }
  336. /* Loads a double parameter into the builtin database */
  337. int load_builtin_param_double(char * name, void * engine_val, void * matrix, short int flags, 
  338. double init_val, double upper_bound, double lower_bound, char * alt_name) {
  339.   param_t * param = NULL;
  340.   value_t iv, ub, lb;
  341.   iv.double_val = init_val;
  342.   ub.double_val = upper_bound;
  343.   lb.double_val = lower_bound;
  344.   /* Create new parameter of type double */
  345.   if (PARAM_DEBUG == 2) {
  346.   printf("load_builtin_param_double: (name "%s") (alt_name = "%s") ", name, alt_name);
  347.   fflush(stdout);
  348.   }  
  349.   
  350.  if ((param = create_param(name, P_TYPE_DOUBLE, flags, engine_val, matrix, iv, ub, lb)) == NULL) {
  351.     return OUTOFMEM_ERROR;
  352.   }
  353.   
  354.   if (PARAM_DEBUG == 2) {
  355. printf("created...");
  356. fflush(stdout);
  357.    }   
  358.    
  359.   /* Insert the paremeter into the database */
  360.   if (insert_builtin_param(param) < 0) {
  361. free_param(param);
  362.     return ERROR;
  363.   }
  364.   if (PARAM_DEBUG == 2) {
  365.   printf("inserted...");
  366.   fflush(stdout);
  367.   }  
  368.   
  369.   /* If this parameter has an alternate name, insert it into the database as link */
  370.   
  371.   if (alt_name != NULL) {
  372. insert_param_alt_name(param, alt_name); 
  373.   if (PARAM_DEBUG == 2) {
  374.   printf("alt_name inserted...");
  375.   fflush(stdout);
  376.    }
  377.   
  378.   }     
  379.   if (PARAM_DEBUG == 2) printf("finishedn");   
  380.   /* Finished, return success */
  381.   return SUCCESS;
  382. }
  383. /* Loads a double parameter into the builtin database */
  384. param_t * new_param_double(char * name, short int flags, void * engine_val, void * matrix,
  385. double upper_bound, double lower_bound, double init_val) {
  386.   param_t * param;
  387.   value_t iv, ub, lb;
  388.   iv.double_val = init_val;
  389.   ub.double_val = upper_bound;
  390.   lb.double_val = lower_bound;
  391.      
  392.   if ((param = create_param(name, P_TYPE_DOUBLE, flags, engine_val, matrix,iv, ub, lb)) == NULL) 
  393.     return NULL;
  394.   
  395.   
  396.   /* Finished, return success */
  397.   return param;
  398. }
  399. /* Creates a new parameter of type int */
  400. param_t * new_param_int(char * name, short int flags, void * engine_val,
  401. int upper_bound, int lower_bound, int init_val) {
  402.   param_t * param;
  403.   value_t iv, ub, lb;
  404.   iv.int_val = init_val;
  405.   ub.int_val = upper_bound;
  406.   lb.int_val = lower_bound;
  407.   if ((param = create_param(name, P_TYPE_INT, flags, engine_val, NULL, iv, ub, lb)) == NULL) 
  408.     return NULL;
  409.   
  410.  
  411.   /* Finished, return success */
  412.   return param;
  413. }
  414. /* Creates a new parameter of type bool */
  415. param_t * new_param_bool(char * name, short int flags, void * engine_val,
  416. int upper_bound, int lower_bound, int init_val) {
  417.   param_t * param;
  418.   value_t iv, ub, lb;
  419.   iv.bool_val = init_val;
  420.   ub.bool_val = upper_bound;
  421.   lb.bool_val = lower_bound;
  422.   if ((param = create_param(name, P_TYPE_BOOL, flags, engine_val, NULL, iv, ub, lb)) == NULL)
  423.     return NULL;
  424.   
  425.  
  426.   /* Finished, return success */
  427.   return param;
  428. }
  429. /* Loads a integer parameter into the builtin database */
  430. int load_builtin_param_int(char * name, void * engine_val, short int flags,
  431. int init_val, int upper_bound, int lower_bound, char * alt_name) {
  432.   param_t * param;
  433.   value_t iv, ub, lb;
  434.   iv.int_val = init_val;
  435.   ub.int_val = upper_bound;
  436.   lb.int_val = lower_bound;
  437.   param = create_param(name, P_TYPE_INT, flags, engine_val, NULL, iv, ub, lb);
  438.   if (param == NULL) {
  439.     return OUTOFMEM_ERROR;
  440.   }
  441.   if (insert_builtin_param(param) < 0) {
  442. free_param(param);
  443.     return ERROR;
  444.   }
  445.   
  446.   if (alt_name != NULL) {
  447. insert_param_alt_name(param, alt_name);    
  448.   }  
  449.   
  450.   return SUCCESS;
  451. }
  452. /* Loads a boolean parameter */
  453. int load_builtin_param_bool(char * name, void * engine_val, short int flags, 
  454. int init_val, char * alt_name) {
  455.   param_t * param;
  456.   value_t iv, ub, lb;
  457.   iv.int_val = init_val;
  458.   ub.int_val = TRUE;
  459.   lb.int_val = FALSE;
  460.   param = create_param(name, P_TYPE_BOOL, flags, engine_val, NULL, iv, ub, lb);
  461.   if (param == NULL) {
  462.     return OUTOFMEM_ERROR;
  463.   }
  464.   if (insert_builtin_param(param) < 0) {
  465. free_param(param);
  466.     return ERROR;
  467.   }
  468.   
  469.   if (alt_name != NULL) {
  470. insert_param_alt_name(param, alt_name);    
  471.   }  
  472.   
  473.   return SUCCESS;
  474. }
  475. /* Returns nonzero if the string is valid parameter name */
  476. int is_valid_param_string(char * string) {
  477.   
  478.   if (string == NULL)
  479.     return FALSE;
  480.   
  481.   /* This ensures the first character is non numeric */
  482.   if( ((*string) >= 48) && ((*string) <= 57))
  483.     return FALSE; 
  484.   /* These probably should never happen */
  485.   if (*string == '.')
  486. return FALSE;
  487.   
  488.   if (*string == '+')
  489. return FALSE;
  490.   
  491.   if (*string == '-')
  492. return FALSE;
  493.   
  494.   /* Could also add checks for other symbols. May do later */
  495.   
  496.   return TRUE;
  497.    
  498. }
  499. /* Inserts a parameter into the builtin database */
  500. int insert_builtin_param(param_t * param) {
  501. if (param == NULL)
  502. return FAILURE;
  503. return splay_insert(param, param->name, builtin_param_tree);
  504. }
  505. /* Inserts a parameter into the builtin database */
  506. int insert_param(param_t * param, splaytree_t * database) {
  507. if (param == NULL)
  508.   return FAILURE;
  509. if (database == NULL)
  510.   return FAILURE;
  511. return splay_insert(param, param->name, database);
  512. }
  513. /* Sets the parameter engine value to value val.
  514. clipping occurs if necessary */
  515. void set_param(param_t * param, double val) {
  516. switch (param->type) {
  517. case P_TYPE_BOOL:
  518. if (val < 0)
  519. *((int*)param->engine_val) = 0;
  520. else if (val > 0)
  521. *((int*)param->engine_val) = 1;
  522. else
  523. *((int*)param->engine_val) = 0;
  524. break;
  525. case P_TYPE_INT:
  526. /* Make sure value is an integer */
  527. val = floor(val);
  528. if (val < param->lower_bound.int_val)
  529. *((int*)param->engine_val) = param->lower_bound.int_val;
  530. else if (val > param->upper_bound.int_val)
  531. *((int*)param->engine_val) = param->upper_bound.int_val;
  532. else
  533. *((int*)param->engine_val) = val;
  534. break;
  535. case P_TYPE_DOUBLE:
  536.   /* Make sure value is an integer */
  537.  
  538.   if (val < param->lower_bound.double_val) 
  539.     *((double*)param->engine_val) = param->lower_bound.double_val;   
  540.   else if (val > param->upper_bound.double_val)
  541.     *((double*)param->engine_val) = param->upper_bound.double_val;
  542.   else
  543.     *((double*)param->engine_val) = val;
  544.   break;
  545. default:
  546.   break;
  547. }
  548. return;
  549. }
  550. /* Search for parameter 'name' in 'database', if create_flag is true, then generate the parameter 
  551.    and insert it into 'database' */
  552. param_t * find_param_db(char * name, splaytree_t * database, int create_flag) {
  553.   param_t * param = NULL;
  554.   /* Null argument checks */
  555.   if (name == NULL)
  556.     return NULL;
  557.   if (database == NULL)
  558.     return NULL;
  559.   
  560.   /* First look in the builtin database */
  561.   param = (param_t *)splay_find(name, database);
  562.   
  563.   if (((param = (param_t *)splay_find(name, database)) == NULL) && (create_flag == TRUE)) {
  564. /* Check if string is valid */
  565. if (!is_valid_param_string(name))
  566. return NULL;
  567. /* Now, create the user defined parameter given the passed name */
  568. if ((param = create_user_param(name)) == NULL)
  569. return NULL;
  570. /* Finally, insert the new parameter into this preset's proper splaytree */
  571. if (splay_insert(param, param->name, database) < 0) {
  572. free_param(param);
  573. return NULL;
  574. }  
  575.   }   
  576.   
  577.   /* Return the found (or created) parameter. Note that this could be null */
  578.   return param;
  579. }