per_pixel_eqn.c
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:6k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * per_pixel_eqn.c:
  3.  *****************************************************************************
  4.  * Copyright (C) 2004 the VideoLAN team
  5.  * $Id: 3cd0c016aacfeb09ab5d7bdfcca84c0a12654012 $
  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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  23.  *****************************************************************************/
  24. #include <stdio.h>
  25. #include <string.h>
  26. #include <stdlib.h>
  27. #include "fatal.h"
  28. #include "common.h"
  29. #include "expr_types.h"
  30. #include "eval.h"
  31. #include "splaytree_types.h"
  32. #include "splaytree.h"
  33. #include "param_types.h"
  34. #include "param.h"
  35. #include "per_pixel_eqn.h"
  36. #include "per_pixel_eqn_types.h"
  37. #include "engine_vars.h"
  38. extern preset_t * active_preset;
  39. extern int mesh_i;
  40. extern int mesh_j;
  41. /* Evaluates a per pixel equation */
  42. void evalPerPixelEqn(per_pixel_eqn_t * per_pixel_eqn) {
  43.   double ** param_matrix = NULL;
  44.   gen_expr_t * eqn_ptr = NULL;
  45.   int x,y;
  46.   eqn_ptr = per_pixel_eqn->gen_expr; 
  47.  if (per_pixel_eqn->param->matrix == NULL) {
  48.     if (PER_PIXEL_EQN_DEBUG) printf("evalPerPixelEqn: [begin initializing matrix] (index = %d) (name = %s)n", 
  49.      per_pixel_eqn->index, per_pixel_eqn->param->name);
  50.     
  51.     param_matrix = per_pixel_eqn->param->matrix = (double**)malloc(gx*sizeof(double*));
  52.     
  53.     for(x = 0; x < gx; x++)
  54.       param_matrix[x] = (double *)malloc(gy * sizeof(double));
  55.     for (x = 0; x < gx; x++)
  56.       for (y = 0; y < gy; y++)
  57. param_matrix[x][y] = 0.0;
  58.     if (per_pixel_eqn->param->name == NULL)
  59.       printf("null parameter?n");
  60.     //    printf("PARAM MATRIX: "%s" initialized.n", per_pixel_eqn->param->name);
  61.   }
  62.   else 
  63.     param_matrix = (double**)per_pixel_eqn->param->matrix;
  64.  
  65.   if (eqn_ptr == NULL)
  66.     printf("something is seriously wrong...n");
  67.   for (mesh_i = 0; mesh_i < gx; mesh_i++) {    
  68.     for (mesh_j = 0; mesh_j < gy; mesh_j++) {     
  69.       param_matrix[mesh_i][mesh_j] = eval_gen_expr(eqn_ptr);
  70.     }
  71.   }
  72.   
  73.   /* Now that this parameter has been referenced with a per
  74.      pixel equation, we let the evaluator know by setting
  75.      this flag */
  76.   per_pixel_eqn->param->matrix_flag = 1; 
  77. }
  78. void evalPerPixelEqns() {
  79.   /* Evaluate all per pixel equations using splay traversal */
  80.   splay_traverse(evalPerPixelEqn, active_preset->per_pixel_eqn_tree);
  81.   /* Set mesh i / j values to -1 so engine vars are used by default again */
  82.   mesh_i = mesh_j = -1;
  83. }
  84. /* Adds a per pixel equation according to its string name. This
  85.    will be used only by the parser */
  86. int add_per_pixel_eqn(char * name, gen_expr_t * gen_expr, preset_t * preset) {
  87.   per_pixel_eqn_t * per_pixel_eqn;
  88.   int index;
  89.   param_t * param = NULL;
  90.   /* Argument checks */
  91.   if (preset == NULL)
  92.   return FAILURE;
  93.   if (gen_expr == NULL)
  94.   return FAILURE;
  95.   if (name == NULL)
  96.   return FAILURE;
  97.   
  98.  if (PER_PIXEL_EQN_DEBUG) printf("add_per_pixel_eqn: per pixel equation (name = "%s")n", name);
  99.  
  100.  if (!strncmp(name, "dx", strlen("dx"))) 
  101.    preset->per_pixel_flag[DX_OP] = TRUE;
  102.  else if (!strncmp(name, "dy", strlen("dy"))) 
  103.    preset->per_pixel_flag[DY_OP] = TRUE;
  104.  else if (!strncmp(name, "cx", strlen("cx"))) 
  105.    preset->per_pixel_flag[CX_OP] = TRUE;
  106.  else if (!strncmp(name, "cy", strlen("cy"))) 
  107.    preset->per_pixel_flag[CX_OP] = TRUE;
  108.  else if (!strncmp(name, "zoom", strlen("zoom"))) 
  109.    preset->per_pixel_flag[ZOOM_OP] = TRUE;
  110.  else if (!strncmp(name, "zoomexp", strlen("zoomexp"))) 
  111.    preset->per_pixel_flag[ZOOMEXP_OP] = TRUE;
  112.  else if (!strncmp(name, "rot", strlen("rot")))
  113.    preset->per_pixel_flag[ROT_OP] = TRUE;
  114.  else if (!strncmp(name, "sx", strlen("sx")))
  115.    preset->per_pixel_flag[SX_OP] = TRUE;
  116.  else if (!strncmp(name, "sy", strlen("sy")))
  117.    preset->per_pixel_flag[SY_OP] = TRUE;
  118.  
  119.  /* Search for the parameter so we know what matrix the per pixel equation is referencing */
  120.  if ((param = find_param(name, preset, TRUE)) == NULL) {
  121.    if (PER_PIXEL_EQN_DEBUG) printf("add_per_pixel_eqn: failed to allocate a new parameter!n");
  122.    return FAILURE;
  123.  
  124.  }   
  125.  /* Find most largest index in the splaytree */
  126.  // if ((per_pixel_eqn = splay_find_max(active_preset->per_pixel_eqn_tree)) == NULL)
  127.  // index = 0;
  128.  // else
  129.  index = splay_size(preset->per_pixel_eqn_tree);
  130.    
  131.  /* Create the per pixel equation given the index, parameter, and general expression */
  132.  if ((per_pixel_eqn = new_per_pixel_eqn(index, param, gen_expr)) == NULL) {
  133.    if (PER_PIXEL_EQN_DEBUG) printf("add_per_pixel_eqn: failed to create new per pixel equation!n");
  134.    return FAILURE;
  135.  }
  136.  if (PER_PIXEL_EQN_DEBUG) printf("add_per_pixel_eqn: new equation (index = %d) (param = "%s")n", 
  137.  per_pixel_eqn->index, per_pixel_eqn->param->name);
  138.  /* Insert the per pixel equation into the preset per pixel database */
  139.  if (splay_insert(per_pixel_eqn, &per_pixel_eqn->index, preset->per_pixel_eqn_tree) < 0) {
  140.    free_per_pixel_eqn(per_pixel_eqn);
  141.    printf("failed to add per pixel eqn!n");
  142.    return FAILURE;  
  143.  }
  144.  /* Done */ 
  145.  return SUCCESS;
  146. }
  147. per_pixel_eqn_t * new_per_pixel_eqn(int index, param_t * param, gen_expr_t * gen_expr) {
  148. per_pixel_eqn_t * per_pixel_eqn;
  149. if (index < 0)
  150.   return NULL;
  151. if (param == NULL)
  152.   return NULL;
  153. if (gen_expr == NULL)
  154.   return NULL;
  155. if ((per_pixel_eqn = (per_pixel_eqn_t*)malloc(sizeof(per_pixel_eqn_t))) == NULL)
  156.   return NULL;
  157. per_pixel_eqn->index = index;
  158. per_pixel_eqn->param = param;
  159. per_pixel_eqn->gen_expr = gen_expr;
  160. return per_pixel_eqn;
  161. }
  162. void free_per_pixel_eqn(per_pixel_eqn_t * per_pixel_eqn) {
  163. if (per_pixel_eqn == NULL)
  164. return;
  165. free_gen_expr(per_pixel_eqn->gen_expr);
  166. free(per_pixel_eqn);
  167. return;
  168. }
  169. static inline int resetPerPixelEqnFlags(preset_t * preset) {
  170.   int i;
  171.   for (i = 0; i < NUM_OPS;i++)
  172.     preset->per_pixel_flag[i] = FALSE;
  173.   return SUCCESS;
  174. }