From 217a4736fbd1aab1c6113e406f14ac48b5235aea Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Kempf Date: Fri, 7 Aug 2009 13:02:42 +0200 Subject: [PATCH] Delete galaktos plugin. This hasn't work for quite some time and we have projectM module. Moreover, noone complained. --- NEWS | 1 + configure.ac | 20 +- modules/LIST | 1 - modules/visualization/Modules.am | 2 +- modules/visualization/galaktos/Modules.am | 21 - modules/visualization/galaktos/PCM.c | 202 - modules/visualization/galaktos/PCM.h | 6 - modules/visualization/galaktos/beat_detect.c | 148 - modules/visualization/galaktos/beat_detect.h | 5 - .../visualization/galaktos/builtin_funcs.h | 206 - modules/visualization/galaktos/common.h | 31 - modules/visualization/galaktos/compare.h | 3 - modules/visualization/galaktos/custom_shape.c | 603 --- modules/visualization/galaktos/custom_shape.h | 14 - .../galaktos/custom_shape_types.h | 75 - modules/visualization/galaktos/custom_wave.c | 737 ---- modules/visualization/galaktos/custom_wave.h | 29 - .../galaktos/custom_wave_types.h | 92 - modules/visualization/galaktos/engine_vars.c | 166 - modules/visualization/galaktos/engine_vars.h | 142 - modules/visualization/galaktos/eval.c | 784 ---- modules/visualization/galaktos/eval.h | 55 - modules/visualization/galaktos/expr_types.h | 48 - modules/visualization/galaktos/fatal.h | 9 - modules/visualization/galaktos/fftsg.c | 3340 ----------------- modules/visualization/galaktos/fftsg.h | 30 - modules/visualization/galaktos/func.c | 222 -- modules/visualization/galaktos/func.h | 14 - modules/visualization/galaktos/func_types.h | 13 - modules/visualization/galaktos/idle_preset.h | 8 - modules/visualization/galaktos/init_cond.c | 168 - modules/visualization/galaktos/init_cond.h | 12 - .../visualization/galaktos/init_cond_types.h | 11 - .../visualization/galaktos/interface_types.h | 12 - modules/visualization/galaktos/main.c | 1585 -------- modules/visualization/galaktos/main.h | 31 - modules/visualization/galaktos/param.c | 721 ---- modules/visualization/galaktos/param.h | 36 - modules/visualization/galaktos/param_types.h | 39 - modules/visualization/galaktos/parser.c | 2117 ----------- modules/visualization/galaktos/parser.h | 16 - .../visualization/galaktos/per_frame_eqn.c | 114 - .../visualization/galaktos/per_frame_eqn.h | 9 - .../galaktos/per_frame_eqn_types.h | 11 - .../visualization/galaktos/per_pixel_eqn.c | 221 -- .../visualization/galaktos/per_pixel_eqn.h | 14 - .../galaktos/per_pixel_eqn_types.h | 26 - .../visualization/galaktos/per_point_types.h | 13 - modules/visualization/galaktos/plugin.c | 333 -- modules/visualization/galaktos/plugin.h | 64 - modules/visualization/galaktos/preset.c | 1032 ----- modules/visualization/galaktos/preset.h | 26 - modules/visualization/galaktos/preset_types.h | 41 - modules/visualization/galaktos/splaytree.c | 702 ---- modules/visualization/galaktos/splaytree.h | 24 - .../visualization/galaktos/splaytree_types.h | 17 - modules/visualization/galaktos/tree_types.c | 92 - modules/visualization/galaktos/tree_types.h | 10 - modules/visualization/galaktos/video_init.c | 141 - modules/visualization/galaktos/video_init.h | 3 - po/POTFILES.in | 55 - 61 files changed, 3 insertions(+), 14720 deletions(-) delete mode 100644 modules/visualization/galaktos/Modules.am delete mode 100644 modules/visualization/galaktos/PCM.c delete mode 100644 modules/visualization/galaktos/PCM.h delete mode 100644 modules/visualization/galaktos/beat_detect.c delete mode 100644 modules/visualization/galaktos/beat_detect.h delete mode 100644 modules/visualization/galaktos/builtin_funcs.h delete mode 100644 modules/visualization/galaktos/common.h delete mode 100644 modules/visualization/galaktos/compare.h delete mode 100644 modules/visualization/galaktos/custom_shape.c delete mode 100644 modules/visualization/galaktos/custom_shape.h delete mode 100644 modules/visualization/galaktos/custom_shape_types.h delete mode 100644 modules/visualization/galaktos/custom_wave.c delete mode 100644 modules/visualization/galaktos/custom_wave.h delete mode 100644 modules/visualization/galaktos/custom_wave_types.h delete mode 100644 modules/visualization/galaktos/engine_vars.c delete mode 100644 modules/visualization/galaktos/engine_vars.h delete mode 100644 modules/visualization/galaktos/eval.c delete mode 100644 modules/visualization/galaktos/eval.h delete mode 100644 modules/visualization/galaktos/expr_types.h delete mode 100644 modules/visualization/galaktos/fatal.h delete mode 100644 modules/visualization/galaktos/fftsg.c delete mode 100644 modules/visualization/galaktos/fftsg.h delete mode 100644 modules/visualization/galaktos/func.c delete mode 100644 modules/visualization/galaktos/func.h delete mode 100644 modules/visualization/galaktos/func_types.h delete mode 100644 modules/visualization/galaktos/idle_preset.h delete mode 100644 modules/visualization/galaktos/init_cond.c delete mode 100644 modules/visualization/galaktos/init_cond.h delete mode 100644 modules/visualization/galaktos/init_cond_types.h delete mode 100644 modules/visualization/galaktos/interface_types.h delete mode 100644 modules/visualization/galaktos/main.c delete mode 100644 modules/visualization/galaktos/main.h delete mode 100644 modules/visualization/galaktos/param.c delete mode 100644 modules/visualization/galaktos/param.h delete mode 100644 modules/visualization/galaktos/param_types.h delete mode 100644 modules/visualization/galaktos/parser.c delete mode 100644 modules/visualization/galaktos/parser.h delete mode 100644 modules/visualization/galaktos/per_frame_eqn.c delete mode 100644 modules/visualization/galaktos/per_frame_eqn.h delete mode 100644 modules/visualization/galaktos/per_frame_eqn_types.h delete mode 100644 modules/visualization/galaktos/per_pixel_eqn.c delete mode 100644 modules/visualization/galaktos/per_pixel_eqn.h delete mode 100644 modules/visualization/galaktos/per_pixel_eqn_types.h delete mode 100644 modules/visualization/galaktos/per_point_types.h delete mode 100644 modules/visualization/galaktos/plugin.c delete mode 100644 modules/visualization/galaktos/plugin.h delete mode 100644 modules/visualization/galaktos/preset.c delete mode 100644 modules/visualization/galaktos/preset.h delete mode 100644 modules/visualization/galaktos/preset_types.h delete mode 100644 modules/visualization/galaktos/splaytree.c delete mode 100644 modules/visualization/galaktos/splaytree.h delete mode 100644 modules/visualization/galaktos/splaytree_types.h delete mode 100644 modules/visualization/galaktos/tree_types.c delete mode 100644 modules/visualization/galaktos/tree_types.h delete mode 100644 modules/visualization/galaktos/video_init.c delete mode 100644 modules/visualization/galaktos/video_init.h diff --git a/NEWS b/NEWS index 480d41aec3..2c78ad7cae 100644 --- a/NEWS +++ b/NEWS @@ -29,6 +29,7 @@ Visualisation: Removed modules: * csri + * galaktos Changes between 0.9.9a and 1.0.0: --------------------------------- diff --git a/configure.ac b/configure.ac index 53a21b1363..cdf4c5fba9 100644 --- a/configure.ac +++ b/configure.ac @@ -721,7 +721,7 @@ AC_CHECK_LIB(m,cos,[ VLC_ADD_LIBS([adjust wave ripple psychedelic gradient a52tofloat32 dtstofloat32 x264 goom visual panoramix rotate noise grain scene],[-lm]) ]) AC_CHECK_LIB(m,pow,[ - VLC_ADD_LIBS([avcodec avformat swscale postproc ffmpegaltivec stream_out_transrate i420_rgb faad twolame equalizer spatializer param_eq libvlccore freetype mod mpc dmo quicktime realaudio realvideo galaktos opengl],[-lm]) + VLC_ADD_LIBS([avcodec avformat swscale postproc ffmpegaltivec stream_out_transrate i420_rgb faad twolame equalizer spatializer param_eq libvlccore freetype mod mpc dmo quicktime realaudio realvideo opengl],[-lm]) ]) AC_CHECK_LIB(m,sqrt,[ VLC_ADD_LIBS([headphone_channel_mixer normvol speex mono colorthres extract],[-lm]) @@ -4694,23 +4694,6 @@ then VLC_ADD_PLUGIN([visual]) fi -dnl -dnl OpenGL visualisation plugin -dnl -AC_ARG_ENABLE(galaktos, - [ --enable-galaktos OpenGL visualisation plugin (default disabled)]) -if test "${enable_galaktos}" = "yes" -then - AC_CHECK_HEADERS(GL/gl.h GL/glu.h, [ - VLC_ADD_PLUGIN([galaktos]) - if test "${SYS}" != "mingw32"; then - VLC_ADD_LIBS([galaktos],[${X_LIBS} -lGL -lGLU]) - else - VLC_ADD_LIBS([galaktos],[-lopengl32]) - fi - ]) -fi - dnl dnl goom visualization plugin dnl @@ -5455,7 +5438,6 @@ AC_CONFIG_FILES([ modules/video_output/x11/Makefile modules/visualization/Makefile modules/visualization/visual/Makefile - modules/visualization/galaktos/Makefile ]) dnl Generate makefiles diff --git a/modules/LIST b/modules/LIST index c3628d95b2..7b92234caf 100644 --- a/modules/LIST +++ b/modules/LIST @@ -116,7 +116,6 @@ $Id$ * folder: folder meta data and art finder * freetype: Utility to put text on video using freetype2 * ftp : FTP input module - * galaktos: a visualization module that outputs OpenGL * gapi: PocketPC Video output * gaussianblur: gaussian blur video filter * gestures: mouse gestures control plugin diff --git a/modules/visualization/Modules.am b/modules/visualization/Modules.am index 16ca27ad97..3e62eb0946 100644 --- a/modules/visualization/Modules.am +++ b/modules/visualization/Modules.am @@ -1,3 +1,3 @@ -SUBDIRS = visual galaktos +SUBDIRS = visual SOURCES_goom = goom.c SOURCES_projectm = projectm.cpp diff --git a/modules/visualization/galaktos/Modules.am b/modules/visualization/galaktos/Modules.am deleted file mode 100644 index 35d774681e..0000000000 --- a/modules/visualization/galaktos/Modules.am +++ /dev/null @@ -1,21 +0,0 @@ -SOURCES_galaktos = plugin.c plugin.h \ - main.c main.h \ - preset.c preset.h preset_types.h \ - beat_detect.c beat_detect.h \ - builtin_funcs.h common.h compare.h expr_types.h \ - fatal.h idle_preset.h interface_types.h per_point_types.h \ - param.c param.h param_types.h \ - engine_vars.c engine_vars.h \ - parser.c parser.h \ - eval.c eval.h \ - init_cond.c init_cond.h init_cond_types.h \ - PCM.c PCM.h \ - fftsg.c fftsg.h \ - per_frame_eqn.c per_frame_eqn.h per_frame_eqn_types.h \ - splaytree.c splaytree.h splaytree_types.h \ - custom_shape.c custom_shape.h custom_shape_types.h \ - func.c func.h func_types.h \ - per_pixel_eqn.c per_pixel_eqn.h per_pixel_eqn_types.h \ - tree_types.c tree_types.h \ - custom_wave.c custom_wave.h custom_wave_types.h \ - video_init.c video_init.h diff --git a/modules/visualization/galaktos/PCM.c b/modules/visualization/galaktos/PCM.c deleted file mode 100644 index 82162f3f33..0000000000 --- a/modules/visualization/galaktos/PCM.c +++ /dev/null @@ -1,202 +0,0 @@ -/***************************************************************************** - * PCM.c: - ***************************************************************************** - * Copyright (C) 2004 the VideoLAN team - * $Id$ - * - * Authors: Cyril Deguet - * code from projectM http://xmms-projectm.sourceforge.net - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - - -//PCM.c - Sound data handler -// -//by Peter Sperl -// -//Takes sound data from wherever and hands it back out. -//Returns PCM Data or spectrum data, or the derivative of the PCM data - -#include -#include -#include - -#include "fftsg.h" - -double **PCMd; //data structure to store PCM data PCM[channels][maxsamples] -int maxsamples; //size of PCM buffer -int start; //where to add data next - -int *ip; //working space for FFT routines -double *w; //lookup table for FFT routines -int new; //how many new samples - - -//initPCM(int samples) -// -//Initializes the PCM buffer to -// number of samples specified. - -void initPCM(int samples) -{ - int i; - - //Allocate memory for PCM data buffer - PCMd = (double **)malloc(2 * sizeof(double *)); - PCMd[0] = (double *)malloc(samples * sizeof(double)); - PCMd[1] = (double *)malloc(samples * sizeof(double)); - - maxsamples=samples; - new=0; - - //Initialize buffers to 0 - for (i=0;imaxsamples) new=maxsamples; -} - - -//puts sound data requested at provided pointer -// -//samples is number of PCM samples to return -//freq = 0 gives PCM data -//freq = 1 gives FFT data -//smoothing is the smoothing coefficient - -//returned values are normalized from -1 to 1 - -void getPCM(double *PCMdata, int samples, int channel, int freq, double smoothing, int derive) -{ - int i,index; - - index=start-1; - - if (index<0) index=maxsamples+index; - - PCMdata[0]=PCMd[channel][index]; - - for(i=1;i - * code from projectM http://xmms-projectm.sourceforge.net - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - -// -//by Peter Sperl -// -//Takes sound data from wherever and returns beat detection values -//Uses statistical Energy-Based methods. Very simple -// -//Some stuff was taken from Frederic Patin's beat-detection article, you'll find it online - -#include -#include -#include "engine_vars.h" - -double beat_buffer[32][80],beat_instant[32],beat_history[32]; -double *beat_val,*beat_att,*beat_variance; -int beat_buffer_pos; - -double vol_buffer[80],vol_instant,vol_history; - -void initBeatDetect() -{ - - int x,y; - - vol_instant=0; - vol_history=0; - - for (y=0;y<80;y++) - { - vol_buffer[y]=0; - } - - beat_buffer_pos=0; - - beat_val=(double *)malloc(32*sizeof(double)); - beat_att=(double *)malloc(32*sizeof(double)); - beat_variance=(double *)malloc(32*sizeof(double)); - - for (x=0;x<32;x++) - { - beat_instant[x]=0; - beat_history[x]=0; - beat_val[x]=1.0; - beat_att[x]=1.0; - beat_variance[x]=0; - for (y=0;y<80;y++) - { - beat_buffer[x][y]=0; - } - } - -} - -void getBeatVals(double *vdataL,double *vdataR, double *vol) -{ - int linear=0; - int x,y; - - vol_instant=0; - - for ( x=0;x<16;x++) - { - - beat_instant[x]=0; - for ( y=linear*2;y<(linear+8+x)*2;y++) - { - beat_instant[x]+=((vdataL[y]*vdataL[y])+(vdataR[y]*vdataR[y]))*(1.0/(8+x)); - vol_instant+=((vdataL[y]*vdataL[y])+(vdataR[y]*vdataR[y]))*(1.0/512.0); - - } - - linear=y/2; - beat_history[x]-=(beat_buffer[x][beat_buffer_pos])*.0125; - beat_buffer[x][beat_buffer_pos]=beat_instant[x]; - beat_history[x]+=(beat_instant[x])*.0125; - - beat_val[x]=(beat_instant[x])/(beat_history[x]); - - beat_att[x]+=(beat_instant[x])/(beat_history[x]); - - - - } - - vol_history-=(vol_buffer[beat_buffer_pos])*.0125; - vol_buffer[beat_buffer_pos]=vol_instant; - vol_history+=(vol_instant)*.0125; - - double temp2=0; - mid=0; - for(x=1;x<10;x++) - { - mid+=(beat_instant[x]); - temp2+=(beat_history[x]); - - } - - mid=mid/(1.5*temp2); - temp2=0; - treb=0; - for(x=10;x<16;x++) - { - treb+=(beat_instant[x]); - temp2+=(beat_history[x]); - } - treb=treb/(1.5*temp2); - *vol=vol_instant/(1.5*vol_history); - - bass=(beat_instant[0])/(1.5*beat_history[0]); - - treb_att=.6 * treb_att + .4 * treb; - mid_att=.6 * mid_att + .4 * mid; - bass_att=.6 * bass_att + .4 * bass; - //printf("%f %f %f %f\n",bass,mid,treb,*vol); - // *vol=(beat_instant[3])/(beat_history[3]); - beat_buffer_pos++; - if( beat_buffer_pos>79)beat_buffer_pos=0; - -} -void freeBeatDetect() -{ - free(beat_att); - free(beat_val); - free(beat_variance); -} diff --git a/modules/visualization/galaktos/beat_detect.h b/modules/visualization/galaktos/beat_detect.h deleted file mode 100644 index c673cc1c6b..0000000000 --- a/modules/visualization/galaktos/beat_detect.h +++ /dev/null @@ -1,5 +0,0 @@ - - -void initBeatDetect(); -void getBeatVals(double *vdataL,double *vdataR,double *vol); -void freeBeatDetect(); diff --git a/modules/visualization/galaktos/builtin_funcs.h b/modules/visualization/galaktos/builtin_funcs.h deleted file mode 100644 index 8c6cb5767d..0000000000 --- a/modules/visualization/galaktos/builtin_funcs.h +++ /dev/null @@ -1,206 +0,0 @@ -/***************************************************************************** - * builtin_funcs.c: - ***************************************************************************** - * Copyright (C) 2004 the VideoLAN team - * $Id$ - * - * Authors: Cyril Deguet - * code from projectM http://xmms-projectm.sourceforge.net - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - - -#include -#include -#include -/* Values to optimize the sigmoid function */ -#define R 32767 -#define RR 65534 - -static inline double int_wrapper(double * arg_list) { - - return floor(arg_list[0]); - -} - - -static inline double sqr_wrapper(double * arg_list) { - - return pow(2, arg_list[0]); -} - - -static inline double sign_wrapper(double * arg_list) { - - return -arg_list[0]; -} - -static inline double min_wrapper(double * arg_list) { - - if (arg_list[0] > arg_list[1]) - return arg_list[1]; - - return arg_list[0]; -} - -static inline double max_wrapper(double * arg_list) { - - if (arg_list[0] > arg_list[1]) - return arg_list[0]; - - return arg_list[1]; -} - -/* consult your AI book */ -static inline double sigmoid_wrapper(double * arg_list) { - return (RR / (1 + exp( -(((double)(arg_list[0])) * arg_list[1]) / R) - R)); -} - - -static inline double bor_wrapper(double * arg_list) { - - return (double)((int)arg_list[0] || (int)arg_list[1]); -} - -static inline double band_wrapper(double * arg_list) { - return (double)((int)arg_list[0] && (int)arg_list[1]); -} - -static inline double bnot_wrapper(double * arg_list) { - return (double)(!(int)arg_list[0]); -} - -static inline double if_wrapper(double * arg_list) { - - if ((int)arg_list[0] == 0) - return arg_list[2]; - return arg_list[1]; -} - - -static inline double rand_wrapper(double * arg_list) { - double l; - - // printf("RAND ARG:(%d)\n", (int)arg_list[0]); - l = (double)((rand()) % ((int)arg_list[0])); - //printf("VAL: %f\n", l); - return l; -} - -static inline double equal_wrapper(double * arg_list) { - - return (arg_list[0] == arg_list[1]); -} - - -static inline double above_wrapper(double * arg_list) { - - return (arg_list[0] > arg_list[1]); -} - - -static inline double below_wrapper(double * arg_list) { - - return (arg_list[0] < arg_list[1]); -} - -static inline double sin_wrapper(double * arg_list) { - return (sin (arg_list[0])); -} - - -static inline double cos_wrapper(double * arg_list) { - return (cos (arg_list[0])); -} - -static inline double tan_wrapper(double * arg_list) { - return (tan(arg_list[0])); -} - -static inline double asin_wrapper(double * arg_list) { - return (asin (arg_list[0])); -} - -static inline double acos_wrapper(double * arg_list) { - return (acos (arg_list[0])); -} - -static inline double atan_wrapper(double * arg_list) { - return (atan (arg_list[0])); -} - -static inline double atan2_wrapper(double * arg_list) { - return (atan2 (arg_list[0], arg_list[1])); -} - -static inline double pow_wrapper(double * arg_list) { - return (pow (arg_list[0], arg_list[1])); -} - -static inline double exp_wrapper(double * arg_list) { - return (exp(arg_list[0])); -} - -static inline double abs_wrapper(double * arg_list) { - return (fabs(arg_list[0])); -} - -static inline double log_wrapper(double *arg_list) { - return (log (arg_list[0])); -} - -static inline double log10_wrapper(double * arg_list) { - return (log10 (arg_list[0])); -} - -static inline double sqrt_wrapper(double * arg_list) { - return (sqrt (arg_list[0])); -} - - -static inline double nchoosek_wrapper(double * arg_list) { - unsigned long cnm = 1UL; - int i, f; - int n, m; - - n = (int)arg_list[0]; - m = (int)arg_list[1]; - - if (m*2 >n) m = n-m; - for (i=1 ; i <= m; n--, i++) - { - if ((f=n) % i == 0) - f /= i; - else cnm /= i; - cnm *= f; - } - return (double)cnm; -} - - -static inline double fact_wrapper(double * arg_list) { - - - int result = 1; - - int n = (int)arg_list[0]; - - while (n > 1) { - result = result * n; - n--; - } - return (double)result; -} diff --git a/modules/visualization/galaktos/common.h b/modules/visualization/galaktos/common.h deleted file mode 100644 index 560a6cc5e6..0000000000 --- a/modules/visualization/galaktos/common.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef COMMON_H -#define COMMON_H - -#define DEFAULT_FONT_PATH "/home/carm/fonts/courier1.glf" -#define MAX_TOKEN_SIZE 512 -#define MAX_PATH_SIZE 4096 - -#define STRING_BUFFER_SIZE 1024*150 -#define STRING_LINE_SIZE 1024 - -#ifndef TRUE -#define TRUE 1 -#endif -#ifndef FALSE -#define FALSE 0 -#endif - -#define PROJECTM_FILE_EXTENSION ".prjm" -#define MILKDROP_FILE_EXTENSION ".milk" - -#define MAX_DOUBLE_SIZE 10000000.0 -#define MIN_DOUBLE_SIZE -10000000.0 - -#define MAX_INT_SIZE 10000000 -#define MIN_INT_SIZE -10000000 - -#define DEFAULT_DOUBLE_IV 0.0 /* default double initial value */ -#define DEFAULT_DOUBLE_LB MIN_DOUBLE_SIZE /* default double lower bound */ -#define DEFAULT_DOUBLE_UB MAX_DOUBLE_SIZE /* default double upper bound */ - -#endif diff --git a/modules/visualization/galaktos/compare.h b/modules/visualization/galaktos/compare.h deleted file mode 100644 index 851aad340f..0000000000 --- a/modules/visualization/galaktos/compare.h +++ /dev/null @@ -1,3 +0,0 @@ - -int compare_int(int * num1, int * num2); -int compare_string(char * string1, char * string2); diff --git a/modules/visualization/galaktos/custom_shape.c b/modules/visualization/galaktos/custom_shape.c deleted file mode 100644 index c2f16fca48..0000000000 --- a/modules/visualization/galaktos/custom_shape.c +++ /dev/null @@ -1,603 +0,0 @@ -/***************************************************************************** - * custom_shape.c: - ***************************************************************************** - * Copyright (C) 2004 the VideoLAN team - * $Id$ - * - * Authors: Cyril Deguet - * code from projectM http://xmms-projectm.sourceforge.net - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - -#include -#include - -#include "common.h" -#include "fatal.h" - -#include "param_types.h" -#include "param.h" - -#include "expr_types.h" -#include "eval.h" - -#include "splaytree_types.h" -#include "splaytree.h" -#include "tree_types.h" - -#include "per_frame_eqn_types.h" -#include "per_frame_eqn.h" - -#include "init_cond_types.h" -#include "init_cond.h" - -#include "preset_types.h" - -#include "custom_shape_types.h" -#include "custom_shape.h" - -#include "init_cond_types.h" -#include "init_cond.h" - -custom_shape_t * interface_shape = NULL; -int cwave_interface_id = 0; -extern preset_t * active_preset; -static inline void eval_custom_shape_init_conds(custom_shape_t * custom_shape); -void load_unspec_init_cond_shape(param_t * param); - -void destroy_param_db_tree_shape(splaytree_t * tree); -void destroy_per_frame_eqn_tree_shape(splaytree_t * tree); -void destroy_per_frame_init_eqn_tree_shape(splaytree_t * tree); -void destroy_init_cond_tree_shape(splaytree_t * tree); - -custom_shape_t * new_custom_shape(int id) { - - custom_shape_t * custom_shape; - param_t * param; - - if ((custom_shape = (custom_shape_t*)malloc(sizeof(custom_shape_t))) == NULL) - return NULL; - - custom_shape->id = id; - custom_shape->per_frame_count = 0; - custom_shape->per_frame_eqn_string_index = 0; - custom_shape->per_frame_init_eqn_string_index = 0; - - /* Initialize tree data structures */ - - if ((custom_shape->param_tree = - create_splaytree(compare_string, copy_string, free_string)) == NULL) { - free_custom_shape(custom_shape); - return NULL; - } - - if ((custom_shape->per_frame_eqn_tree = - create_splaytree(compare_int, copy_int, free_int)) == NULL) { - free_custom_shape(custom_shape); - return NULL; - } - - if ((custom_shape->init_cond_tree = - create_splaytree(compare_string, copy_string, free_string)) == NULL) { - free_custom_shape(custom_shape); - return NULL; - } - - if ((custom_shape->per_frame_init_eqn_tree = - create_splaytree(compare_string, copy_string, free_string)) == NULL) { - free_custom_shape(custom_shape); - return NULL; - } - - /* Start: Load custom shape parameters */ - - if ((param = new_param_double("r", P_FLAG_NONE, &custom_shape->r, NULL, 1.0, 0.0, .5)) == NULL) { - free_custom_shape(custom_shape); - return NULL; - } - - if (insert_param(param, custom_shape->param_tree) < 0) { - free_custom_shape(custom_shape); - return NULL; - } - - if ((param = new_param_double("g", P_FLAG_NONE, &custom_shape->g, NULL, 1.0, 0.0, .5)) == NULL){ - free_custom_shape(custom_shape); - return NULL; - } - - if (insert_param(param, custom_shape->param_tree) < 0) { - free_custom_shape(custom_shape); - return NULL; - } - - if ((param = new_param_double("b", P_FLAG_NONE, &custom_shape->b, NULL, 1.0, 0.0, .5)) == NULL){ - free_custom_shape(custom_shape); - return NULL; - } - - if (insert_param(param, custom_shape->param_tree) < 0) { - free_custom_shape(custom_shape); - return NULL; - } - - if ((param = new_param_double("a", P_FLAG_NONE, &custom_shape->a, NULL, 1.0, 0.0, .5)) == NULL){ - free_custom_shape(custom_shape); - return NULL; - } - - if (insert_param(param, custom_shape->param_tree) < 0) { - free_custom_shape(custom_shape); - return NULL; - } - - if ((param = new_param_double("border_r", P_FLAG_NONE, &custom_shape->border_r, NULL, 1.0, 0.0, .5)) == NULL) { - free_custom_shape(custom_shape); - return NULL; - } - - if (insert_param(param, custom_shape->param_tree) < 0) { - free_custom_shape(custom_shape); - return NULL; - } - - if ((param = new_param_double("border_g", P_FLAG_NONE, &custom_shape->border_g, NULL, 1.0, 0.0, .5)) == NULL){ - free_custom_shape(custom_shape); - return NULL; - } - - if (insert_param(param, custom_shape->param_tree) < 0) { - free_custom_shape(custom_shape); - return NULL; - } - - if ((param = new_param_double("border_b", P_FLAG_NONE, &custom_shape->border_b, NULL, 1.0, 0.0, .5)) == NULL){ - free_custom_shape(custom_shape); - return NULL; - } - - if (insert_param(param, custom_shape->param_tree) < 0) { - free_custom_shape(custom_shape); - return NULL; - } - - if ((param = new_param_double("border_a", P_FLAG_NONE, &custom_shape->border_a, NULL, 1.0, 0.0, .5)) == NULL){ - free_custom_shape(custom_shape); - return NULL; - } - - if (insert_param(param, custom_shape->param_tree) < 0) { - free_custom_shape(custom_shape); - return NULL; - } - - if ((param = new_param_double("r2", P_FLAG_NONE, &custom_shape->r2, NULL, 1.0, 0.0, .5)) == NULL) { - free_custom_shape(custom_shape); - return NULL; - } - - if (insert_param(param, custom_shape->param_tree) < 0) { - free_custom_shape(custom_shape); - return NULL; - } - - if ((param = new_param_double("g2", P_FLAG_NONE, &custom_shape->g2, NULL, 1.0, 0.0, .5)) == NULL){ - free_custom_shape(custom_shape); - return NULL; - } - - if (insert_param(param, custom_shape->param_tree) < 0) { - free_custom_shape(custom_shape); - return NULL; - } - - if ((param = new_param_double("b2", P_FLAG_NONE, &custom_shape->b2, NULL, 1.0, 0.0, .5)) == NULL){ - free_custom_shape(custom_shape); - return NULL; - } - - if (insert_param(param, custom_shape->param_tree) < 0) { - free_custom_shape(custom_shape); - return NULL; - } - - if ((param = new_param_double("a2", P_FLAG_NONE, &custom_shape->a2, NULL, 1.0, 0.0, .5)) == NULL){ - free_custom_shape(custom_shape); - return NULL; - } - - if (insert_param(param, custom_shape->param_tree) < 0) { - free_custom_shape(custom_shape); - return NULL; - } - - if ((param = new_param_double("x", P_FLAG_NONE, &custom_shape->x, NULL, 1.0, 0.0, .5)) == NULL) { - free_custom_shape(custom_shape); - return NULL; - } - - if (insert_param(param, custom_shape->param_tree) < 0) { - free_custom_shape(custom_shape); - return NULL; - } - - if ((param = new_param_double("y", P_FLAG_NONE, &custom_shape->y, NULL, 1.0, 0.0, .5)) == NULL) { - free_custom_shape(custom_shape); - return NULL; - } - - if (insert_param(param, custom_shape->param_tree) < 0) { - free_custom_shape(custom_shape); - return NULL; - } - - if ((param = new_param_bool("thickOutline", P_FLAG_NONE, &custom_shape->thickOutline, 1, 0, 0)) == NULL) { - free_custom_shape(custom_shape); - return NULL; - } - - if (insert_param(param, custom_shape->param_tree) < 0) { - free_custom_shape(custom_shape); - return NULL; - } - - if ((param = new_param_bool("enabled", P_FLAG_NONE, &custom_shape->enabled, 1, 0, 0)) == NULL) { - free_custom_shape(custom_shape); - return NULL; - } - - if (insert_param(param, custom_shape->param_tree) < 0) { - free_custom_shape(custom_shape); - return NULL; - } - - if ((param = new_param_int("sides", P_FLAG_NONE, &custom_shape->sides, 100, 3, 3)) == NULL) { - free_custom_shape(custom_shape); - return NULL; - } - - if (insert_param(param, custom_shape->param_tree) < 0) { - free_custom_shape(custom_shape); - return NULL; - } - - if ((param = new_param_bool("additive", P_FLAG_NONE, &custom_shape->additive, 1, 0, 0)) == NULL) { - free_custom_shape(custom_shape); - return NULL; - } - - if (insert_param(param, custom_shape->param_tree) < 0) { - free_custom_shape(custom_shape); - return NULL; - } - - if ((param = new_param_bool("textured", P_FLAG_NONE, &custom_shape->textured, 1, 0, 0)) == NULL) { - free_custom_shape(custom_shape); - return NULL; - } - - if (insert_param(param, custom_shape->param_tree) < 0) { - free_custom_shape(custom_shape); - return NULL; - } - - if ((param = new_param_double("rad", P_FLAG_NONE, &custom_shape->rad, NULL, MAX_DOUBLE_SIZE, 0, 0.0)) == NULL) { - free_custom_shape(custom_shape); - return NULL; - } - - if (insert_param(param, custom_shape->param_tree) < 0) { - free_custom_shape(custom_shape); - return NULL; - } - - if ((param = new_param_double("ang", P_FLAG_NONE, &custom_shape->ang, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) { - free_custom_shape(custom_shape); - return NULL; - } - - if (insert_param(param, custom_shape->param_tree) < 0) { - free_custom_shape(custom_shape); - return NULL; - } - - if ((param = new_param_double("tex_zoom", P_FLAG_NONE, &custom_shape->tex_zoom, NULL, MAX_DOUBLE_SIZE, .00000000001, 0.0)) == NULL) { - free_custom_shape(custom_shape); - return NULL; - } - - if (insert_param(param, custom_shape->param_tree) < 0) { - free_custom_shape(custom_shape); - return NULL; - } - - if ((param = new_param_double("tex_ang", P_FLAG_NONE, &custom_shape->tex_ang, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) { - free_custom_shape(custom_shape); - return NULL; - } - - if (insert_param(param, custom_shape->param_tree) < 0) { - free_custom_shape(custom_shape); - return NULL; - } - if ((param = new_param_double("t1", P_FLAG_TVAR, &custom_shape->t1, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) { - free_custom_shape(custom_shape); - return NULL; - } - - if (insert_param(param, custom_shape->param_tree) < 0) { - free_custom_shape(custom_shape); - return NULL; - } - - if ((param = new_param_double("t2", P_FLAG_TVAR, &custom_shape->t2, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) { - free_custom_shape(custom_shape); - return NULL; - } - - if (insert_param(param, custom_shape->param_tree) < 0) { - free_custom_shape(custom_shape); - return NULL; - } - - if ((param = new_param_double("t3", P_FLAG_TVAR, &custom_shape->t3, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) { - free_custom_shape(custom_shape); - return NULL; - } - - if (insert_param(param, custom_shape->param_tree) < 0) { - free_custom_shape(custom_shape); - return NULL; - } - if ((param = new_param_double("t4", P_FLAG_TVAR, &custom_shape->t4, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) { - free_custom_shape(custom_shape); - return NULL; - } - - if (insert_param(param, custom_shape->param_tree) < 0) { - free_custom_shape(custom_shape); - return NULL; - } - if ((param = new_param_double("t5", P_FLAG_TVAR, &custom_shape->t5, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) { - free_custom_shape(custom_shape); - return NULL; - } - - if (insert_param(param, custom_shape->param_tree) < 0) { - free_custom_shape(custom_shape); - return NULL; - } - if ((param = new_param_double("t6", P_FLAG_TVAR, &custom_shape->t6, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) { - free_custom_shape(custom_shape); - return NULL; - } - - if (insert_param(param, custom_shape->param_tree) < 0) { - free_custom_shape(custom_shape); - return NULL; - } - if ((param = new_param_double("t7", P_FLAG_TVAR, &custom_shape->t7, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) { - free_custom_shape(custom_shape); - return NULL; - } - - if (insert_param(param, custom_shape->param_tree) < 0) { - free_custom_shape(custom_shape); - return NULL; - } - - if ((param = new_param_double("t8", P_FLAG_TVAR, &custom_shape->t8, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) { - free_custom_shape(custom_shape); - return NULL; - } - - if (insert_param(param, custom_shape->param_tree) < 0) { - free_custom_shape(custom_shape); - return NULL; - } - - /* End of parameter loading. Note that the read only parameters associated - with custom shapes (ie, sample) are global variables, and not specific to - the custom shape datastructure. */ - - - - return custom_shape; - -} - -void destroy_per_frame_init_eqn_tree_shape(splaytree_t * tree) { - - if (!tree) - return; - - splay_traverse(free_init_cond, tree); - destroy_splaytree(tree); - -} - - - -void destroy_init_cond_tree_shape(splaytree_t * tree) { - - if (!tree) - return; - - splay_traverse(free_init_cond, tree); - destroy_splaytree(tree); - -} - -void destroy_per_frame_eqn_tree_shape(splaytree_t * tree) { - - - if (!tree) - return; - - splay_traverse(free_per_frame_eqn, tree); - destroy_splaytree(tree); - -} - - -void destroy_param_db_tree_shape(splaytree_t * tree) { - - if (!tree) - return; - - splay_traverse(free_param, tree); - destroy_splaytree(tree); - -} - -/* Frees a custom shape form object */ -void free_custom_shape(custom_shape_t * custom_shape) { - - if (custom_shape == NULL) - return; - - if (custom_shape->param_tree == NULL) - return; - - destroy_per_frame_eqn_tree_shape(custom_shape->per_frame_eqn_tree); - destroy_init_cond_tree_shape(custom_shape->init_cond_tree); - destroy_param_db_tree_shape(custom_shape->param_tree); - destroy_per_frame_init_eqn_tree_shape(custom_shape->per_frame_init_eqn_tree); - - free(custom_shape); - - return; - -} - - -custom_shape_t * find_custom_shape(int id, preset_t * preset, int create_flag) { - - custom_shape_t * custom_shape = NULL; - - if (preset == NULL) - return NULL; - - if ((custom_shape = splay_find(&id, preset->custom_shape_tree)) == NULL) { - - if (CUSTOM_SHAPE_DEBUG) { printf("find_custom_shape: creating custom shape (id = %d)...", id);fflush(stdout);} - - if (create_flag == FALSE) { - if (CUSTOM_SHAPE_DEBUG) printf("you specified not to (create flag = false), returning null\n"); - return NULL; - } - - if ((custom_shape = new_custom_shape(id)) == NULL) { - if (CUSTOM_SHAPE_DEBUG) printf("failed...out of memory?\n"); - return NULL; - } - - if (CUSTOM_SHAPE_DEBUG) { printf("success.Inserting..."); fflush(stdout);} - - if (splay_insert(custom_shape, &custom_shape->id, preset->custom_shape_tree) < 0) { - if (CUSTOM_SHAPE_DEBUG) printf("failed, probably a duplicated!!\n"); - free_custom_shape(custom_shape); - return NULL; - } - - if (CUSTOM_SHAPE_DEBUG) printf("done.\n"); - } - - return custom_shape; -} - -void evalCustomShapeInitConditions() { - splay_traverse(eval_custom_shape_init_conds, active_preset->custom_shape_tree); - -} - -static inline void eval_custom_shape_init_conds(custom_shape_t * custom_shape) { - splay_traverse(eval_init_cond, custom_shape->init_cond_tree); - splay_traverse(eval_init_cond, custom_shape->per_frame_init_eqn_tree); -} - - -void load_unspecified_init_conds_shape(custom_shape_t * custom_shape) { - - interface_shape = custom_shape; - splay_traverse(load_unspec_init_cond_shape, interface_shape->param_tree); - interface_shape = NULL; - -} - -void load_unspec_init_cond_shape(param_t * param) { - - init_cond_t * init_cond; - value_t init_val; - - /* Don't count read only parameters as initial conditions */ - if (param->flags & P_FLAG_READONLY) - return; - if (param->flags & P_FLAG_QVAR) - return; - if (param->flags & P_FLAG_TVAR) - return; - if (param->flags & P_FLAG_USERDEF) - return; - - /* If initial condition was not defined by the preset file, force a default one - with the following code */ - if ((init_cond = splay_find(param->name, interface_shape->init_cond_tree)) == NULL) { - - /* Make sure initial condition does not exist in the set of per frame initial equations */ - if ((init_cond = splay_find(param->name, interface_shape->per_frame_init_eqn_tree)) != NULL) - return; - - if (param->type == P_TYPE_BOOL) - init_val.bool_val = 0; - - else if (param->type == P_TYPE_INT) - init_val.int_val = *(int*)param->engine_val; - - else if (param->type == P_TYPE_DOUBLE) - init_val.double_val = *(double*)param->engine_val; - - //printf("%s\n", param->name); - /* Create new initial condition */ - if ((init_cond = new_init_cond(param, init_val)) == NULL) - return; - - /* Insert the initial condition into this presets tree */ - if (splay_insert(init_cond, init_cond->param->name, interface_shape->init_cond_tree) < 0) { - free_init_cond(init_cond); - return; - } - - } - -} - - -/* Interface function. Makes another custom shape the current - concern for per frame / point equations */ -custom_shape_t * nextCustomShape() { - - if ((interface_shape = splay_find(&cwave_interface_id, active_preset->custom_shape_tree)) == NULL) { - cwave_interface_id = 0; - return NULL; - } - - cwave_interface_id++; - - /* Evaluate all per frame equations associated with this shape */ - splay_traverse(eval_per_frame_eqn, interface_shape->per_frame_eqn_tree); - return interface_shape; -} diff --git a/modules/visualization/galaktos/custom_shape.h b/modules/visualization/galaktos/custom_shape.h deleted file mode 100644 index f07a5b4502..0000000000 --- a/modules/visualization/galaktos/custom_shape.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef CUSTOM_SHAPE_H -#define CUSTOM_SHAPE_H -#define CUSTOM_SHAPE_DEBUG 0 -#include "expr_types.h" -#include "custom_shape_types.h" -#include "preset_types.h" - -void free_custom_shape(custom_shape_t * custom_shape); -custom_shape_t * new_custom_shape(int id); -custom_shape_t * find_custom_shape(int id, preset_t * preset, int create_flag); -void load_unspecified_init_conds_shape(custom_shape_t * custom_shape); -void evalCustomShapeInitConditions(); -custom_shape_t * nextCustomShape(); -#endif diff --git a/modules/visualization/galaktos/custom_shape_types.h b/modules/visualization/galaktos/custom_shape_types.h deleted file mode 100644 index 23b69e9fa2..0000000000 --- a/modules/visualization/galaktos/custom_shape_types.h +++ /dev/null @@ -1,75 +0,0 @@ -#ifndef CUSTOM_SHAPE_TYPES_H -#define CUSTOM_SHAPE_TYPES_H -#include "common.h" -#include "splaytree_types.h" -#include "expr_types.h" - -typedef struct CUSTOM_SHAPE_T { - - /* Numerical id */ - int id; - int per_frame_count; - - /* Parameter tree associated with this custom shape */ - splaytree_t * param_tree; - - - /* Engine variables */ - int sides; - int thickOutline; - int enabled; - int additive; - int textured; - - double tex_zoom; - double tex_ang; - - double x; /* x position for per point equations */ - double y; /* y position for per point equations */ - double rad; - double ang; - - double r; /* red color value */ - double g; /* green color value */ - double b; /* blue color value */ - double a; /* alpha color value */ - - double r2; /* red color value */ - double g2; /* green color value */ - double b2; /* blue color value */ - double a2; /* alpha color value */ - - double border_r; /* red color value */ - double border_g; /* green color value */ - double border_b; /* blue color value */ - double border_a; /* alpha color value */ - - /* stupid t variables */ - double t1; - double t2; - double t3; - double t4; - double t5; - double t6; - double t7; - double t8; - - /* Data structure to hold per frame / per frame init equations */ - splaytree_t * init_cond_tree; - splaytree_t * per_frame_eqn_tree; - splaytree_t * per_frame_init_eqn_tree; - - /* Denotes the index of the last character for each string buffer */ - int per_frame_eqn_string_index; - int per_frame_init_eqn_string_index; - - /* String buffers for per frame / per frame init equations */ - char per_frame_eqn_string_buffer[STRING_BUFFER_SIZE]; - char per_frame_init_eqn_string_buffer[STRING_BUFFER_SIZE]; - /* Per point equation array */ - - -} custom_shape_t; - - -#endif diff --git a/modules/visualization/galaktos/custom_wave.c b/modules/visualization/galaktos/custom_wave.c deleted file mode 100644 index 8ccb9573cf..0000000000 --- a/modules/visualization/galaktos/custom_wave.c +++ /dev/null @@ -1,737 +0,0 @@ -/***************************************************************************** - * custom_wave.c: - ***************************************************************************** - * Copyright (C) 2004 the VideoLAN team - * $Id$ - * - * Authors: Cyril Deguet - * code from projectM http://xmms-projectm.sourceforge.net - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - -#include -#include -#include - -#include "common.h" -#include "fatal.h" - -#include "param_types.h" -#include "param.h" - -#include "expr_types.h" -#include "eval.h" - -#include "splaytree_types.h" -#include "splaytree.h" -#include "tree_types.h" - -#include "per_frame_eqn_types.h" -#include "per_frame_eqn.h" - -#include "init_cond_types.h" -#include "init_cond.h" - -#include "preset_types.h" - -#include "custom_wave_types.h" -#include "custom_wave.h" - -#include "init_cond_types.h" -#include "init_cond.h" - -#include "engine_vars.h" -#define MAX_SAMPLE_SIZE 4096 - -extern int mesh_i; - -custom_wave_t * interface_wave = NULL; -int interface_id = 0; -extern preset_t * active_preset; -static inline void eval_custom_wave_init_conds(custom_wave_t * custom_wave); -void load_unspec_init_cond(param_t * param); -void destroy_per_point_eqn_tree(splaytree_t * tree); -void destroy_param_db_tree(splaytree_t * tree); -void destroy_per_frame_eqn_tree(splaytree_t * tree); -void destroy_per_frame_init_eqn_tree(splaytree_t * tree); -void destroy_init_cond_tree(splaytree_t * tree); -static inline void evalPerPointEqn(per_point_eqn_t * per_point_eqn); - -custom_wave_t * new_custom_wave(int id) { - - custom_wave_t * custom_wave; - param_t * param; - - if ((custom_wave = (custom_wave_t*)malloc(sizeof(custom_wave_t))) == NULL) - return NULL; - - custom_wave->id = id; - custom_wave->per_frame_count = 0; - - custom_wave->samples = 512; - custom_wave->bSpectrum = 0; - custom_wave->enabled = 1; - custom_wave->sep = 1; - custom_wave->smoothing = 0.0; - custom_wave->bUseDots = 0; - custom_wave->bAdditive = 0; - custom_wave->r = custom_wave->g = custom_wave->b = custom_wave->a = 0.0; - custom_wave->scaling = 1.0; - custom_wave->per_frame_eqn_string_index = 0; - custom_wave->per_frame_init_eqn_string_index = 0; - custom_wave->per_point_eqn_string_index = 0; - - custom_wave->r_mesh = malloc(MAX_SAMPLE_SIZE*sizeof(double)); - custom_wave->g_mesh = malloc(MAX_SAMPLE_SIZE*sizeof(double)); - custom_wave->b_mesh = malloc(MAX_SAMPLE_SIZE*sizeof(double)); - custom_wave->a_mesh = malloc(MAX_SAMPLE_SIZE*sizeof(double)); - custom_wave->x_mesh = malloc(MAX_SAMPLE_SIZE*sizeof(double)); - custom_wave->y_mesh = malloc(MAX_SAMPLE_SIZE*sizeof(double)); - custom_wave->value1 = malloc(MAX_SAMPLE_SIZE*sizeof(double)); - custom_wave->value2 = malloc(MAX_SAMPLE_SIZE*sizeof(double)); - custom_wave->sample_mesh = malloc(MAX_SAMPLE_SIZE*sizeof(double)); - - /* Initialize tree data structures */ - - if ((custom_wave->param_tree = - create_splaytree(compare_string, copy_string, free_string)) == NULL) { - free_custom_wave(custom_wave); - return NULL; - } - - if ((custom_wave->per_point_eqn_tree = - create_splaytree(compare_int, copy_int, free_int)) == NULL) { - free_custom_wave(custom_wave); - return NULL; - } - - if ((custom_wave->per_frame_eqn_tree = - create_splaytree(compare_int, copy_int, free_int)) == NULL) { - free_custom_wave(custom_wave); - return NULL; - } - - if ((custom_wave->init_cond_tree = - create_splaytree(compare_string, copy_string, free_string)) == NULL) { - free_custom_wave(custom_wave); - return NULL; - } - - if ((custom_wave->per_frame_init_eqn_tree = - create_splaytree(compare_string, copy_string, free_string)) == NULL) { - free_custom_wave(custom_wave); - return NULL; - } - - - /* Start: Load custom wave parameters */ - - if ((param = new_param_double("r", P_FLAG_DONT_FREE_MATRIX | P_FLAG_PER_POINT, &custom_wave->r, custom_wave->r_mesh, 1.0, 0.0, .5)) == NULL) { - free_custom_wave(custom_wave); - return NULL; - } - - if (insert_param(param, custom_wave->param_tree) < 0) { - free_custom_wave(custom_wave); - return NULL; - } - - if ((param = new_param_double("g", P_FLAG_DONT_FREE_MATRIX | P_FLAG_PER_POINT, &custom_wave->g, custom_wave->g_mesh, 1.0, 0.0, .5)) == NULL){ - free_custom_wave(custom_wave); - return NULL; - } - - if (insert_param(param, custom_wave->param_tree) < 0) { - free_custom_wave(custom_wave); - return NULL; - } - - if ((param = new_param_double("b", P_FLAG_DONT_FREE_MATRIX | P_FLAG_PER_POINT, &custom_wave->b, custom_wave->b_mesh, 1.0, 0.0, .5)) == NULL){ - free_custom_wave(custom_wave); - return NULL; - } - - if (insert_param(param, custom_wave->param_tree) < 0) { - free_custom_wave(custom_wave); - return NULL; - } - - if ((param = new_param_double("a", P_FLAG_DONT_FREE_MATRIX | P_FLAG_PER_POINT, &custom_wave->a, custom_wave->a_mesh, 1.0, 0.0, .5)) == NULL){ - free_custom_wave(custom_wave); - return NULL; - } - - if (insert_param(param, custom_wave->param_tree) < 0) { - free_custom_wave(custom_wave); - return NULL; - } - - if ((param = new_param_double("x", P_FLAG_DONT_FREE_MATRIX | P_FLAG_PER_POINT, &custom_wave->x, custom_wave->x_mesh, 1.0, 0.0, .5)) == NULL) { - free_custom_wave(custom_wave); - return NULL; - } - - if (insert_param(param, custom_wave->param_tree) < 0) { - free_custom_wave(custom_wave); - return NULL; - } - - if ((param = new_param_double("y", P_FLAG_DONT_FREE_MATRIX | P_FLAG_PER_POINT, &custom_wave->y, custom_wave->y_mesh, 1.0, 0.0, .5)) == NULL) { - free_custom_wave(custom_wave); - return NULL; - } - - if (insert_param(param, custom_wave->param_tree) < 0) { - free_custom_wave(custom_wave); - return NULL; - } - - if ((param = new_param_bool("enabled", P_FLAG_NONE, &custom_wave->enabled, 1, 0, 0)) == NULL) { - free_custom_wave(custom_wave); - return NULL; - } - - if (insert_param(param, custom_wave->param_tree) < 0) { - free_custom_wave(custom_wave); - return NULL; - } - - if ((param = new_param_int("sep", P_FLAG_NONE, &custom_wave->sep, 100, -100, 0)) == NULL) { - free_custom_wave(custom_wave); - return NULL; - } - - if (insert_param(param, custom_wave->param_tree) < 0) { - free_custom_wave(custom_wave); - return NULL; - } - - if ((param = new_param_bool("bSpectrum", P_FLAG_NONE, &custom_wave->bSpectrum, 1, 0, 0)) == NULL) { - free_custom_wave(custom_wave); - return NULL; - } - - if (insert_param(param, custom_wave->param_tree) < 0) { - free_custom_wave(custom_wave); - return NULL; - } - - if ((param = new_param_bool("bDrawThick", P_FLAG_NONE, &custom_wave->bDrawThick, 1, 0, 0)) == NULL) { - free_custom_wave(custom_wave); - return NULL; - } - - if (insert_param(param, custom_wave->param_tree) < 0) { - free_custom_wave(custom_wave); - return NULL; - } - - if ((param = new_param_bool("bUseDots", P_FLAG_NONE, &custom_wave->bUseDots, 1, 0, 0)) == NULL) { - free_custom_wave(custom_wave); - return NULL; - } - - if (insert_param(param, custom_wave->param_tree) < 0) { - free_custom_wave(custom_wave); - return NULL; - } - - if ((param = new_param_bool("bAdditive", P_FLAG_NONE, &custom_wave->bAdditive, 1, 0, 0)) == NULL) { - free_custom_wave(custom_wave); - return NULL; - } - - if (insert_param(param, custom_wave->param_tree) < 0) { - free_custom_wave(custom_wave); - return NULL; - } - - if ((param = new_param_int("samples", P_FLAG_NONE, &custom_wave->samples, 2048, 1, 512)) == NULL) { - free_custom_wave(custom_wave); - return NULL; - } - - if (insert_param(param, custom_wave->param_tree) < 0) { - free_custom_wave(custom_wave); - return NULL; - } - - if ((param = new_param_double("sample", P_FLAG_READONLY | P_FLAG_DONT_FREE_MATRIX | P_FLAG_ALWAYS_MATRIX | P_FLAG_PER_POINT, - &custom_wave->sample, custom_wave->sample_mesh, 1.0, 0.0, 0.0)) == NULL) { - free_custom_wave(custom_wave); - return NULL; - } - - if (insert_param(param, custom_wave->param_tree) < 0) { - printf("failed to insert sample\n"); - free_custom_wave(custom_wave); - return NULL; - } - - if ((param = new_param_double("value1", P_FLAG_READONLY | P_FLAG_DONT_FREE_MATRIX | P_FLAG_ALWAYS_MATRIX | P_FLAG_PER_POINT, &custom_wave->v1, custom_wave->value1, 1.0, -1.0, 0.0)) == NULL) { - free_custom_wave(custom_wave); - return NULL; - } - - if (insert_param(param, custom_wave->param_tree) < 0) { - free_custom_wave(custom_wave); - return NULL; - } - - if ((param = new_param_double("value2", P_FLAG_READONLY | P_FLAG_DONT_FREE_MATRIX | P_FLAG_ALWAYS_MATRIX | P_FLAG_PER_POINT, &custom_wave->v2, custom_wave->value2, 1.0, -1.0, 0.0)) == NULL) { - free_custom_wave(custom_wave); - return NULL; - } - - if (insert_param(param, custom_wave->param_tree) < 0) { - free_custom_wave(custom_wave); - return NULL; - } - - if ((param = new_param_double("smoothing", P_FLAG_NONE, &custom_wave->smoothing, NULL, 1.0, 0.0, 0.0)) == NULL) { - free_custom_wave(custom_wave); - return NULL; - } - - if (insert_param(param, custom_wave->param_tree) < 0) { - free_custom_wave(custom_wave); - return NULL; - } - - if ((param = new_param_double("scaling", P_FLAG_NONE, &custom_wave->scaling, NULL, MAX_DOUBLE_SIZE, 0.0, 1.0)) == NULL) { - free_custom_wave(custom_wave); - return NULL; - } - - if (insert_param(param, custom_wave->param_tree) < 0) { - free_custom_wave(custom_wave); - return NULL; - } - - if ((param = new_param_double("t1", P_FLAG_PER_POINT | P_FLAG_TVAR, &custom_wave->t1, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) { - free_custom_wave(custom_wave); - return NULL; - } - - if (insert_param(param, custom_wave->param_tree) < 0) { - free_custom_wave(custom_wave); - return NULL; - } - - if ((param = new_param_double("t2", P_FLAG_PER_POINT |P_FLAG_TVAR, &custom_wave->t2, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) { - free_custom_wave(custom_wave); - return NULL; - } - - if (insert_param(param, custom_wave->param_tree) < 0) { - free_custom_wave(custom_wave); - return NULL; - } - - if ((param = new_param_double("t3", P_FLAG_PER_POINT |P_FLAG_TVAR, &custom_wave->t3, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) { - free_custom_wave(custom_wave); - return NULL; - } - - if (insert_param(param, custom_wave->param_tree) < 0) { - free_custom_wave(custom_wave); - return NULL; - } - if ((param = new_param_double("t4", P_FLAG_PER_POINT |P_FLAG_TVAR, &custom_wave->t4, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) { - free_custom_wave(custom_wave); - return NULL; - } - - if (insert_param(param, custom_wave->param_tree) < 0) { - free_custom_wave(custom_wave); - return NULL; - } - if ((param = new_param_double("t5", P_FLAG_TVAR, &custom_wave->t5, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) { - free_custom_wave(custom_wave); - return NULL; - } - - if (insert_param(param, custom_wave->param_tree) < 0) { - free_custom_wave(custom_wave); - return NULL; - } - if ((param = new_param_double("t6", P_FLAG_TVAR | P_FLAG_PER_POINT, &custom_wave->t6, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) { - free_custom_wave(custom_wave); - return NULL; - } - - if (insert_param(param, custom_wave->param_tree) < 0) { - free_custom_wave(custom_wave); - return NULL; - } - if ((param = new_param_double("t7", P_FLAG_TVAR | P_FLAG_PER_POINT, &custom_wave->t7, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) { - free_custom_wave(custom_wave); - return NULL; - } - - if (insert_param(param, custom_wave->param_tree) < 0) { - free_custom_wave(custom_wave); - return NULL; - } - - if ((param = new_param_double("t8", P_FLAG_TVAR | P_FLAG_PER_POINT, &custom_wave->t8, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) { - free_custom_wave(custom_wave); - return NULL; - } - - if (insert_param(param, custom_wave->param_tree) < 0) { - free_custom_wave(custom_wave); - return NULL; - } - - /* End of parameter loading. Note that the read only parameters associated - with custom waves (ie, sample) are global variables, and not specific to - the custom wave datastructure. */ - - - return custom_wave; - -} - -void destroy_per_frame_init_eqn_tree(splaytree_t * tree) { - - if (!tree) - return; - - splay_traverse(free_init_cond, tree); - destroy_splaytree(tree); - -} - - -void destroy_per_point_eqn_tree(splaytree_t * tree) { - - if (!tree) - return; - - splay_traverse(free_per_point_eqn, tree); - destroy_splaytree(tree); - -} - -void destroy_init_cond_tree(splaytree_t * tree) { - - if (!tree) - return; - - splay_traverse(free_init_cond, tree); - destroy_splaytree(tree); - -} - -void destroy_per_frame_eqn_tree(splaytree_t * tree) { - - - if (!tree) - return; - - splay_traverse(free_per_frame_eqn, tree); - destroy_splaytree(tree); - -} - - -void destroy_param_db_tree(splaytree_t * tree) { - - if (!tree) - return; - - splay_traverse(free_param, tree); - destroy_splaytree(tree); - -} - -/* Frees a custom wave form object */ -void free_custom_wave(custom_wave_t * custom_wave) { - - if (custom_wave == NULL) - return; - - if (custom_wave->param_tree == NULL) - return; - - destroy_per_point_eqn_tree(custom_wave->per_point_eqn_tree); - destroy_per_frame_eqn_tree(custom_wave->per_frame_eqn_tree); - destroy_init_cond_tree(custom_wave->init_cond_tree); - destroy_param_db_tree(custom_wave->param_tree); - destroy_per_frame_init_eqn_tree(custom_wave->per_frame_init_eqn_tree); - - free(custom_wave->r_mesh); - free(custom_wave->g_mesh); - free(custom_wave->b_mesh); - free(custom_wave->a_mesh); - free(custom_wave->x_mesh); - free(custom_wave->y_mesh); - free(custom_wave->value1); - free(custom_wave->value2); - free(custom_wave->sample_mesh); - - free(custom_wave); - - return; - -} - - - -int add_per_point_eqn(char * name, gen_expr_t * gen_expr, custom_wave_t * custom_wave) { - - per_point_eqn_t * per_point_eqn; - int index; - param_t * param = NULL; - - /* Argument checks */ - if (custom_wave == NULL) - return FAILURE; - if (gen_expr == NULL) - return FAILURE; - if (name == NULL) - return FAILURE; - - if (CUSTOM_WAVE_DEBUG) printf("add_per_point_eqn: per pixel equation (name = \"%s\")\n", name); - - /* Search for the parameter so we know what matrix the per pixel equation is referencing */ - - if ((param = find_param_db(name, custom_wave->param_tree, TRUE)) == NULL) { - if (CUSTOM_WAVE_DEBUG) printf("add_per_point_eqn: failed to allocate a new parameter!\n"); - return FAILURE; - - } - - /* Find most largest index in the splaytree */ - if ((per_point_eqn = splay_find_max(custom_wave->per_point_eqn_tree)) == NULL) - index = 0; - else - index = per_point_eqn->index+1; - - /* Create the per pixel equation given the index, parameter, and general expression */ - if ((per_point_eqn = new_per_point_eqn(index, param, gen_expr)) == NULL) - return FAILURE; - if (CUSTOM_WAVE_DEBUG) - printf("add_per_point_eqn: created new equation (index = %d) (name = \"%s\")\n", per_point_eqn->index, per_point_eqn->param->name); - /* Insert the per pixel equation into the preset per pixel database */ - if (splay_insert(per_point_eqn, &per_point_eqn->index, custom_wave->per_point_eqn_tree) < 0) { - free_per_point_eqn(per_point_eqn); - return FAILURE; - } - - /* Done */ - return SUCCESS; -} - -per_point_eqn_t * new_per_point_eqn(int index, param_t * param, gen_expr_t * gen_expr) { - - per_point_eqn_t * per_point_eqn; - - if (param == NULL) - return NULL; - if (gen_expr == NULL) - return NULL; - - if ((per_point_eqn = (per_point_eqn_t*)malloc(sizeof(per_point_eqn_t))) == NULL) - return NULL; - - - per_point_eqn->index = index; - per_point_eqn->gen_expr = gen_expr; - per_point_eqn->param = param; - return per_point_eqn; -} - - -void free_per_point_eqn(per_point_eqn_t * per_point_eqn) { - - if (per_point_eqn == NULL) - return; - - free_gen_expr(per_point_eqn->gen_expr); - - free(per_point_eqn); - - return; -} - -custom_wave_t * find_custom_wave(int id, preset_t * preset, int create_flag) { - - custom_wave_t * custom_wave = NULL; - - if (preset == NULL) - return NULL; - - if ((custom_wave = splay_find(&id, preset->custom_wave_tree)) == NULL) { - - if (CUSTOM_WAVE_DEBUG) { printf("find_custom_wave: creating custom wave (id = %d)...", id);fflush(stdout);} - - if (create_flag == FALSE) { - if (CUSTOM_WAVE_DEBUG) printf("you specified not to (create flag = false), returning null\n"); - return NULL; - } - - if ((custom_wave = new_custom_wave(id)) == NULL) { - if (CUSTOM_WAVE_DEBUG) printf("failed...out of memory?\n"); - return NULL; - } - - if (CUSTOM_WAVE_DEBUG) {printf("success.Inserting..."); fflush(stdout);} - - if (splay_insert(custom_wave, &custom_wave->id, preset->custom_wave_tree) < 0) { - if (CUSTOM_WAVE_DEBUG) printf("failed!\n"); - free_custom_wave(custom_wave); - return NULL; - } - - if (CUSTOM_WAVE_DEBUG) printf("done.\n"); - } - - return custom_wave; -} - -/* Interface function. Makes another custom wave the current - concern for per frame / point equations */ -custom_wave_t * nextCustomWave() { - - if ((interface_wave = splay_find(&interface_id, active_preset->custom_wave_tree)) == NULL) { - interface_id = 0; - return NULL; - } - - interface_id++; - - /* Evaluate all per frame equations associated with this wave */ - splay_traverse(eval_per_frame_eqn, interface_wave->per_frame_eqn_tree); - return interface_wave; -} - - -void evalPerPointEqns() { - - int x; - - for (x = 0; x < interface_wave->samples; x++) - interface_wave->r_mesh[x] = interface_wave->r; - for (x = 0; x < interface_wave->samples; x++) - interface_wave->g_mesh[x] = interface_wave->g; - for (x = 0; x < interface_wave->samples; x++) - interface_wave->b_mesh[x] = interface_wave->b; - for (x = 0; x < interface_wave->samples; x++) - interface_wave->a_mesh[x] = interface_wave->a; - for (x = 0; x < interface_wave->samples; x++) - interface_wave->x_mesh[x] = interface_wave->x; - for (x = 0; x < interface_wave->samples; x++) - interface_wave->y_mesh[x] = interface_wave->y; - - - /* Evaluate per pixel equations */ - splay_traverse(evalPerPointEqn, interface_wave->per_point_eqn_tree); - - /* Reset index */ - mesh_i = -1; -} - -/* Evaluates a per point equation for the current custom wave given by interface_wave ptr */ -static inline void evalPerPointEqn(per_point_eqn_t * per_point_eqn) { - - - int samples, size; - double * param_matrix; - gen_expr_t * eqn_ptr; - - samples = interface_wave->samples; - eqn_ptr = per_point_eqn->gen_expr; - - if (per_point_eqn->param->matrix == NULL) { - if ((param_matrix = per_point_eqn->param->matrix = malloc(size = samples*sizeof(double))) == NULL) - return; - memset(param_matrix, 0, size); - } - else - param_matrix = (double*)per_point_eqn->param->matrix; - - for (mesh_i = 0; mesh_i < samples; mesh_i++) { - param_matrix[mesh_i] = eval_gen_expr(eqn_ptr); - } - - /* Now that this parameter has been referenced with a per - point equation, we let the evaluator know by setting - this flag */ - per_point_eqn->param->matrix_flag = 1; - -} - - -void load_unspecified_init_conds(custom_wave_t * custom_wave) { - - interface_wave = custom_wave; - splay_traverse(load_unspec_init_cond, interface_wave->param_tree); - interface_wave = NULL; - -} - -void load_unspec_init_cond(param_t * param) { - - init_cond_t * init_cond; - value_t init_val; - - /* Don't count these parameters as initial conditions */ - if (param->flags & P_FLAG_READONLY) - return; - if (param->flags & P_FLAG_QVAR) - return; - if (param->flags & P_FLAG_TVAR) - return; - if (param->flags & P_FLAG_USERDEF) - return; - - /* If initial condition was not defined by the preset file, force a default one - with the following code */ - if ((init_cond = splay_find(param->name, interface_wave->init_cond_tree)) == NULL) { - - /* Make sure initial condition does not exist in the set of per frame initial equations */ - if ((init_cond = splay_find(param->name, interface_wave->per_frame_init_eqn_tree)) != NULL) - return; - - if (param->type == P_TYPE_BOOL) - init_val.bool_val = 0; - - else if (param->type == P_TYPE_INT) - init_val.int_val = *(int*)param->engine_val; - - else if (param->type == P_TYPE_DOUBLE) - init_val.double_val = *(double*)param->engine_val; - - //printf("%s\n", param->name); - /* Create new initial condition */ - if ((init_cond = new_init_cond(param, init_val)) == NULL) - return; - - /* Insert the initial condition into this presets tree */ - if (splay_insert(init_cond, init_cond->param->name, interface_wave->init_cond_tree) < 0) { - free_init_cond(init_cond); - return; - } - - } - -} - -void evalCustomWaveInitConditions() { - splay_traverse(eval_custom_wave_init_conds, active_preset->custom_wave_tree); -} diff --git a/modules/visualization/galaktos/custom_wave.h b/modules/visualization/galaktos/custom_wave.h deleted file mode 100644 index 113f749102..0000000000 --- a/modules/visualization/galaktos/custom_wave.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef CUSTOM_WAVE_H -#define CUSTOM_WAVE_H -#define CUSTOM_WAVE_DEBUG 0 -#include "expr_types.h" -#include "custom_wave_types.h" -#include "preset_types.h" -#include "splaytree.h" -#include "init_cond.h" - - -void free_custom_wave(custom_wave_t * custom_wave); -custom_wave_t * new_custom_wave(int id); - -void free_per_point_eqn(per_point_eqn_t * per_point_eqn); -per_point_eqn_t * new_per_point_eqn(int index, param_t * param,gen_expr_t * gen_expr); -void reset_per_point_eqn_array(custom_wave_t * custom_wave); -custom_wave_t * find_custom_wave(int id, preset_t * preset, int create_flag); - -int add_per_point_eqn(char * name, gen_expr_t * gen_expr, custom_wave_t * custom_wave); -void evalCustomWaveInitConditions(); -void evalPerPointEqns(); -custom_wave_t * nextCustomWave(); -void load_unspecified_init_conds(custom_wave_t * custom_wave); - -static inline void eval_custom_wave_init_conds(custom_wave_t * custom_wave) { - splay_traverse(eval_init_cond, custom_wave->init_cond_tree); - splay_traverse(eval_init_cond, custom_wave->per_frame_init_eqn_tree); -} -#endif diff --git a/modules/visualization/galaktos/custom_wave_types.h b/modules/visualization/galaktos/custom_wave_types.h deleted file mode 100644 index 3148181278..0000000000 --- a/modules/visualization/galaktos/custom_wave_types.h +++ /dev/null @@ -1,92 +0,0 @@ -#ifndef CUSTOM_WAVE_TYPES_H -#define CUSTOM_WAVE_TYPES_H -#include "common.h" -#include "splaytree_types.h" -#include "expr_types.h" - -#define X_POINT_OP 0 -#define Y_POINT_OP 1 -#define R_POINT_OP 2 -#define G_POINT_OP 3 -#define B_POINT_OP 4 -#define A_POINT_OP 5 -#define NUM_POINT_OPS 6 - -typedef struct PER_POINT_EQN_T { - int index; - param_t * param; - gen_expr_t * gen_expr; -} per_point_eqn_t; - -typedef struct CUSTOM_WAVE_T { - - /* Numerical id */ - int id; - int per_frame_count; - - /* Parameter tree associated with this custom wave */ - splaytree_t * param_tree; - - - /* Engine variables */ - - double x; /* x position for per point equations */ - double y; /* y position for per point equations */ - double r; /* red color value */ - double g; /* green color value */ - double b; /* blue color value */ - double a; /* alpha color value */ - double * x_mesh; - double * y_mesh; - double * r_mesh; - double * b_mesh; - double * g_mesh; - double * a_mesh; - double * value1; - double * value2; - double * sample_mesh; - - int enabled; /* if nonzero then wave is visible, hidden otherwise */ - int samples; /* number of samples associated with this wave form. Usually powers of 2 */ - double sample; - int bSpectrum; /* spectrum data or pcm data */ - int bUseDots; /* draw wave as dots or lines */ - int bDrawThick; /* draw thicker lines */ - int bAdditive; /* add color values together */ - - double scaling; /* scale factor of waveform */ - double smoothing; /* smooth factor of waveform */ - int sep; /* no idea what this is yet... */ - - /* stupid t variables */ - double t1; - double t2; - double t3; - double t4; - double t5; - double t6; - double t7; - double t8; - double v1,v2; - /* Data structure to hold per frame and per point equations */ - splaytree_t * init_cond_tree; - splaytree_t * per_frame_eqn_tree; - splaytree_t * per_point_eqn_tree; - splaytree_t * per_frame_init_eqn_tree; - - /* Denotes the index of the last character for each string buffer */ - int per_point_eqn_string_index; - int per_frame_eqn_string_index; - int per_frame_init_eqn_string_index; - - /* String buffers for per point and per frame equations */ - char per_point_eqn_string_buffer[STRING_BUFFER_SIZE]; - char per_frame_eqn_string_buffer[STRING_BUFFER_SIZE]; - char per_frame_init_eqn_string_buffer[STRING_BUFFER_SIZE]; - /* Per point equation array */ - gen_expr_t * per_point_eqn_array[NUM_POINT_OPS]; - -} custom_wave_t; - - -#endif diff --git a/modules/visualization/galaktos/engine_vars.c b/modules/visualization/galaktos/engine_vars.c deleted file mode 100644 index ca0de20f46..0000000000 --- a/modules/visualization/galaktos/engine_vars.c +++ /dev/null @@ -1,166 +0,0 @@ -/***************************************************************************** - * engine_vars.c: - ***************************************************************************** - * Copyright (C) 2004 the VideoLAN team - * $Id$ - * - * Authors: Cyril Deguet - * code from projectM http://xmms-projectm.sourceforge.net - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - - - -/* Include engine_vars.h to use these variables */ - char preset_name[256]; -/* PER FRAME CONSTANTS BEGIN */ - double zoom=1.0; - double zoomexp= 1.0; - double rot= 0.0; - double warp= 0.0; - - double sx= 1.0; - double sy= 1.0; - double dx= 0.0; - double dy= 0.0; - double cx= 0.5; - double cy= 0.5; - - int gx = 32; - int gy = 24; - - double decay=.98; - - double wave_r= 1.0; - double wave_g= 0.2; - double wave_b= 0.0; - double wave_x= 0.5; - double wave_y= 0.5; - double wave_mystery= 0.0; - - double ob_size= 0.0; - double ob_r= 0.0; - double ob_g= 0.0; - double ob_b= 0.0; - double ob_a= 0.0; - - double ib_size = 0.0; - double ib_r = 0.0; - double ib_g = 0.0; - double ib_b = 0.0; - double ib_a = 0.0; - - double mv_a = 0.0; - double mv_r = 0.0; - double mv_g = 0.0; - double mv_b = 0.0; - double mv_l = 1.0; - double mv_x = 16.0; - double mv_y = 12.0; - double mv_dy = 0.02; - double mv_dx = 0.02; - - int meshx = 0; - int meshy = 0; - - double Time = 0; - double treb = 0; - double mid = 0; - double bass = 0; - double treb_att = 0; - double mid_att = 0; - double bass_att = 0; - double progress = 0; - int frame = 0; - int fps = 30; -//double bass_thresh = 0; - -/* PER_FRAME CONSTANTS END */ - double fRating = 0; - double fGammaAdj = 1.0; - double fVideoEchoZoom = 1.0; - double fVideoEchoAlpha = 0; - double nVideoEchoOrientation = 0; - - int nWaveMode = 7; - int bAdditiveWaves = 0; - int bWaveDots = 0; - int bWaveThick = 0; - int bModWaveAlphaByVolume = 0; - int bMaximizeWaveColor = 0; - int bTexWrap = 0; - int bDarkenCenter = 0; - int bRedBlueStereo = 0; - int bBrighten = 0; - int bDarken = 0; - int bSolarize = 0; -int bInvert = 0; -int bMotionVectorsOn = 1; - - double fWaveAlpha =1.0; - double fWaveScale = 1.0; - double fWaveSmoothing = 0; - double fWaveParam = 0; - double fModWaveAlphaStart = 0; - double fModWaveAlphaEnd = 0; - double fWarpAnimSpeed = 0; - double fWarpScale = 0; - double fShader = 0; - - -/* PER_PIXEL CONSTANTS BEGIN */ -double x_per_pixel = 0; -double y_per_pixel = 0; -double rad_per_pixel = 0; -double ang_per_pixel = 0; - -/* PER_PIXEL CONSTANT END */ - - -/* Q AND T VARIABLES START */ - -double q1 = 0; -double q2 = 0; -double q3 = 0; -double q4 = 0; -double q5 = 0; -double q6 = 0; -double q7 = 0; -double q8 = 0; - - -/* Q AND T VARIABLES END */ - -//per pixel meshes - double **zoom_mesh; - double **zoomexp_mesh; - double **rot_mesh; - - - double **sx_mesh; - double **sy_mesh; - double **dx_mesh; - double **dy_mesh; - double **cx_mesh; - double **cy_mesh; - - double **x_mesh; - double **y_mesh; - double **rad_mesh; - double **theta_mesh; - -//custom wave per point meshes - diff --git a/modules/visualization/galaktos/engine_vars.h b/modules/visualization/galaktos/engine_vars.h deleted file mode 100644 index 3854d3da0c..0000000000 --- a/modules/visualization/galaktos/engine_vars.h +++ /dev/null @@ -1,142 +0,0 @@ -/* Temporay file until these variables are all externed */ -#ifndef ENGINE_VARS_H -#define ENGINE_VARS_H - -extern char preset_name[256]; - -/* PER FRAME CONSTANTS BEGIN */ -extern double zoom; -extern double zoomexp; -extern double rot; -extern double warp; - -extern double sx; -extern double sy; -extern double dx; -extern double dy; -extern double cx; -extern double cy; - -extern int gy; -extern int gx; - -extern double decay; - -extern double wave_r; -extern double wave_g; -extern double wave_b; -extern double wave_x; -extern double wave_y; -extern double wave_mystery; - -extern double ob_size; -extern double ob_r; -extern double ob_g; -extern double ob_b; -extern double ob_a; - -extern double ib_size; -extern double ib_r; -extern double ib_g; -extern double ib_b; -extern double ib_a; - -extern int meshx; -extern int meshy; - -extern double mv_a ; -extern double mv_r ; -extern double mv_g ; -extern double mv_b ; -extern double mv_l; -extern double mv_x; -extern double mv_y; -extern double mv_dy; -extern double mv_dx; - -extern double Time; -extern double treb ; -extern double mid ; -extern double bass ; -extern double treb_att ; -extern double mid_att ; -extern double bass_att ; -extern double progress ; -extern int frame ; - -/* PER_FRAME CONSTANTS END */ - -/* PER_PIXEL CONSTANTS BEGIN */ - -extern double x_per_pixel; -extern double y_per_pixel; -extern double rad_per_pixel; -extern double ang_per_pixel; - -/* PER_PIXEL CONSTANT END */ - - -extern double fRating; -extern double fGammaAdj; -extern double fVideoEchoZoom; -extern double fVideoEchoAlpha; - -extern int nVideoEchoOrientation; -extern int nWaveMode; -extern int bAdditiveWaves; -extern int bWaveDots; -extern int bWaveThick; -extern int bModWaveAlphaByVolume; -extern int bMaximizeWaveColor; -extern int bTexWrap; -extern int bDarkenCenter; -extern int bRedBlueStereo; -extern int bBrighten; -extern int bDarken; -extern int bSolarize; -extern int bInvert; -extern int bMotionVectorsOn; -extern int fps; - -extern double fWaveAlpha ; -extern double fWaveScale; -extern double fWaveSmoothing; -extern double fWaveParam; -extern double fModWaveAlphaStart; -extern double fModWaveAlphaEnd; -extern double fWarpAnimSpeed; -extern double fWarpScale; -extern double fShader; - - -/* Q VARIABLES START */ - -extern double q1; -extern double q2; -extern double q3; -extern double q4; -extern double q5; -extern double q6; -extern double q7; -extern double q8; - - -/* Q VARIABLES END */ - -extern double **zoom_mesh; -extern double **zoomexp_mesh; -extern double **rot_mesh; - -extern double **sx_mesh; -extern double **sy_mesh; -extern double **dx_mesh; -extern double **dy_mesh; -extern double **cx_mesh; -extern double **cy_mesh; - -extern double **x_mesh; -extern double **y_mesh; -extern double **rad_mesh; -extern double **theta_mesh; - -#endif diff --git a/modules/visualization/galaktos/eval.c b/modules/visualization/galaktos/eval.c deleted file mode 100644 index 601df08466..0000000000 --- a/modules/visualization/galaktos/eval.c +++ /dev/null @@ -1,784 +0,0 @@ -/***************************************************************************** - * eval.c: - ***************************************************************************** - * Copyright (C) 2004 the VideoLAN team - * $Id$ - * - * Authors: Cyril Deguet - * code from projectM http://xmms-projectm.sourceforge.net - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - -#include - -/* Evaluation Code */ - -#include -#include "common.h" -#include "fatal.h" - -#include "param_types.h" -#include "func_types.h" -#include "expr_types.h" -#include "eval.h" -#include "engine_vars.h" -#include "builtin_funcs.h" -#define EVAL_ERROR -1 - -/* All infix operators (except '=') are prototyped here */ -infix_op_t * infix_add, * infix_minus, * infix_div, * infix_mult, - * infix_or, * infix_and, * infix_mod, * infix_negative, * infix_positive; -int mesh_i=-1, mesh_j=-1; - -static inline double eval_tree_expr(tree_expr_t * tree_expr); -static inline double eval_prefun_expr(prefun_expr_t * prefun_expr); -static inline double eval_val_expr(val_expr_t * val_expr); - - -double eval_gen_expr(gen_expr_t * gen_expr) { - double l; - - if (gen_expr == NULL) - return 0; - - switch(gen_expr->type) { - case VAL_T: - return eval_val_expr(gen_expr->item); - case PREFUN_T: - l = eval_prefun_expr(gen_expr->item); - //if (EVAL_DEBUG) printf("eval_gen_expr: prefix function return value: %f\n", l); - return l; - case TREE_T: - return eval_tree_expr(gen_expr->item); - default: - #ifdef EVAL_DEBUG - printf("eval_gen_expr: general expression matched no cases!\n"); - #endif - return EVAL_ERROR; - } - -} - -/* Evaluates functions in prefix form */ -static inline double eval_prefun_expr(prefun_expr_t * prefun_expr) { - int i; - - - /* This is slightly less than safe, since - who knows if the passed argument is valid. For - speed purposes we'll go with this */ - double arg_list[prefun_expr->num_args]; - - #ifdef EVAL_DEBUG - printf("fn["); - fflush(stdout); - #endif - /* Evaluate each argument before calling the function itself */ - for (i = 0; i < prefun_expr->num_args; i++) { - arg_list[i] = eval_gen_expr(prefun_expr->expr_list[i]); - #ifdef EVAL_DEBUG - if (i < (prefun_expr->num_args - 1)) - printf(", "); - fflush(stdout); - #endif - } - - #ifdef EVAL_DEBUG - printf("]"); - fflush(stdout); - #endif - - /* Now we call the function, passing a list of - doubles as its argument */ - - - - return (prefun_expr->func_ptr)(arg_list); -} - -/* Evaluates a value expression */ -static inline double eval_val_expr(val_expr_t * val_expr) { - - /* Shouldn't happen */ - if (val_expr == NULL) - return EVAL_ERROR; - - /* Value is a constant, return the double value */ - if (val_expr->type == CONSTANT_TERM_T) { - #ifdef EVAL_DEBUG - printf("%.4f", val_expr->term.constant); - fflush(stdout); - #endif - return (val_expr->term.constant); - } - - /* Value is variable, dereference it */ - if (val_expr->type == PARAM_TERM_T) { - switch (val_expr->term.param->type) { - - case P_TYPE_BOOL: - #ifdef EVAL_DEBUG - printf("(%s:%.4f)", val_expr->term.param->name, (double)(*((int*)(val_expr->term.param->engine_val)))); - fflush(stdout); - #endif - - - return (double)(*((int*)(val_expr->term.param->engine_val))); - case P_TYPE_INT: - #ifdef EVAL_DEBUG - printf("(%s:%.4f)", val_expr->term.param->name, (double)(*((int*)(val_expr->term.param->engine_val)))); - fflush(stdout); - #endif - - - return (double)(*((int*)(val_expr->term.param->engine_val))); - case P_TYPE_DOUBLE: - #ifdef EVAL_DEBUG - printf("(%s:%.4f)", val_expr->term.param->name, (*((double*)val_expr->term.param->engine_val))); - fflush(stdout); - #endif - - if (val_expr->term.param->matrix_flag | (val_expr->term.param->flags & P_FLAG_ALWAYS_MATRIX)) { - if (mesh_j >= 0) { - return (((double**)val_expr->term.param->matrix)[mesh_i][mesh_j]); - } - else { - return (((double*)val_expr->term.param->matrix)[mesh_i]); - } - } - return *((double*)(val_expr->term.param->engine_val)); - default: - return ERROR; - } - } - /* Unknown type, return failure */ - return FAILURE; -} - -/* Evaluates an expression tree */ -static inline double eval_tree_expr(tree_expr_t * tree_expr) { - - double left_arg, right_arg; - infix_op_t * infix_op; - - /* Shouldn't happen */ - if (tree_expr == NULL) - return EVAL_ERROR; - - /* A leaf node, evaluate the general expression. If the expression is null as well, return zero */ - if (tree_expr->infix_op == NULL) { - if (tree_expr->gen_expr == NULL) - return 0; - else - return eval_gen_expr(tree_expr->gen_expr); - } - - /* Otherwise, this node is an infix operator. Evaluate - accordingly */ - - infix_op = (infix_op_t*)tree_expr->infix_op; - #ifdef EVAL_DEBUG - printf("("); - fflush(stdout); - #endif - - left_arg = eval_tree_expr(tree_expr->left); - - #ifdef EVAL_DEBUG - - switch (infix_op->type) { - case INFIX_ADD: - printf("+"); - break; - case INFIX_MINUS: - printf("-"); - break; - case INFIX_MULT: - printf("*"); - break; - case INFIX_MOD: - printf("%%"); - break; - case INFIX_OR: - printf("|"); - break; - case INFIX_AND: - printf("&"); - break; - case INFIX_DIV: - printf("/"); - break; - default: - printf("?"); - } - - fflush(stdout); - #endif - - right_arg = eval_tree_expr(tree_expr->right); - - #ifdef EVAL_DEBUG - printf(")"); - fflush(stdout); - #endif - - switch (infix_op->type) { - case INFIX_ADD: - return (left_arg + right_arg); - case INFIX_MINUS: - return (left_arg - right_arg); - case INFIX_MULT: - return (left_arg * right_arg); - case INFIX_MOD: - if ((int)right_arg == 0) { - #ifdef EVAL_DEBUG - printf("eval_tree_expr: modulo zero!\n"); - #endif - return DIV_BY_ZERO; - } - return ((int)left_arg % (int)right_arg); - case INFIX_OR: - return ((int)left_arg | (int)right_arg); - case INFIX_AND: - return ((int)left_arg & (int)right_arg); - case INFIX_DIV: - if (right_arg == 0) { - #ifdef EVAL_DEBUG - printf("eval_tree_expr: division by zero!\n"); - #endif - return MAX_DOUBLE_SIZE; - } - return (left_arg / right_arg); - default: - #ifdef EVAL_DEBUG - printf("eval_tree_expr: unknown infix operator!\n"); - #endif - return ERROR; - } - - return ERROR; -} - -/* Converts a double value to a general expression */ -gen_expr_t * const_to_expr(double val) { - - gen_expr_t * gen_expr; - val_expr_t * val_expr; - term_t term; - - term.constant = val; - - if ((val_expr = new_val_expr(CONSTANT_TERM_T, term)) == NULL) - return NULL; - - gen_expr = new_gen_expr(VAL_T, (void*)val_expr); - - if (gen_expr == NULL) { - free_val_expr(val_expr); - } - - return gen_expr; -} - -/* Converts a regular parameter to an expression */ -gen_expr_t * param_to_expr(param_t * param) { - - gen_expr_t * gen_expr = NULL; - val_expr_t * val_expr = NULL; - term_t term; - - if (param == NULL) - return NULL; - - /* This code is still a work in progress. We need - to figure out if the initial condition is used for - each per frame equation or not. I am guessing that - it isn't, and it is thusly implemented this way */ - - /* Current guess of true behavior (08/01/03) note from carm - First try to use the per_pixel_expr (with cloning). - If it is null however, use the engine variable instead. */ - - /* 08/20/03 : Presets are now objects, as well as per pixel equations. This ends up - making the parser handle the case where parameters are essentially per pixel equation - substitutions */ - - - term.param = param; - if ((val_expr = new_val_expr(PARAM_TERM_T, term)) == NULL) - return NULL; - - if ((gen_expr = new_gen_expr(VAL_T, (void*)val_expr)) == NULL) { - free_val_expr(val_expr); - return NULL; - } - return gen_expr; -} - -/* Converts a prefix function to an expression */ -gen_expr_t * prefun_to_expr(double (*func_ptr)(), gen_expr_t ** expr_list, int num_args) { - - gen_expr_t * gen_expr; - prefun_expr_t * prefun_expr; - - - /* Malloc a new prefix function expression */ - prefun_expr = (prefun_expr_t*)malloc(sizeof(prefun_expr_t)); - - if (prefun_expr == NULL) - return NULL; - - prefun_expr->num_args = num_args; - prefun_expr->func_ptr = func_ptr; - prefun_expr->expr_list = expr_list; - - gen_expr = new_gen_expr(PREFUN_T, (void*)prefun_expr); - - if (gen_expr == NULL) - free_prefun_expr(prefun_expr); - - return gen_expr; -} - -/* Creates a new tree expression */ -tree_expr_t * new_tree_expr(infix_op_t * infix_op, gen_expr_t * gen_expr, tree_expr_t * left, tree_expr_t * right) { - - tree_expr_t * tree_expr; - tree_expr = (tree_expr_t*)malloc(sizeof(tree_expr_t)); - - if (tree_expr == NULL) - return NULL; - tree_expr->infix_op = infix_op; - tree_expr->gen_expr = gen_expr; - tree_expr->left = left; - tree_expr->right = right; - return tree_expr; -} - - -/* Creates a new value expression */ -val_expr_t * new_val_expr(int type, term_t term) { - - val_expr_t * val_expr; - val_expr = (val_expr_t*)malloc(sizeof(val_expr_t)); - - if (val_expr == NULL) - return NULL; - - val_expr->type = type; - val_expr->term = term; - - return val_expr; -} - -/* Creates a new general expression */ -gen_expr_t * new_gen_expr(int type, void * item) { - - gen_expr_t * gen_expr; - - gen_expr = (gen_expr_t*)malloc(sizeof(gen_expr_t)); - if (gen_expr == NULL) - return NULL; - gen_expr->type = type; - gen_expr->item = item; - - return gen_expr; -} - -/* Frees a general expression */ -int free_gen_expr(gen_expr_t * gen_expr) { - - if (gen_expr == NULL) - return SUCCESS; - - switch (gen_expr->type) { - case VAL_T: - free_val_expr(gen_expr->item); - break; - case PREFUN_T: - free_prefun_expr(gen_expr->item); - break; - case TREE_T: - free_tree_expr(gen_expr->item); - break; - default: - return FAILURE; - } - - free(gen_expr); - return SUCCESS; - -} - - -/* Frees a function in prefix notation */ -int free_prefun_expr(prefun_expr_t * prefun_expr) { - - int i; - if (prefun_expr == NULL) - return SUCCESS; - - /* Free every element in expression list */ - for (i = 0 ; i < prefun_expr->num_args; i++) { - free_gen_expr(prefun_expr->expr_list[i]); - } - - free(prefun_expr); - return SUCCESS; -} - -/* Frees values of type VARIABLE and CONSTANT */ -int free_val_expr(val_expr_t * val_expr) { - - if (val_expr == NULL) - return SUCCESS; - - free(val_expr); - return SUCCESS; -} - -/* Frees a tree expression */ -int free_tree_expr(tree_expr_t * tree_expr) { - - if (tree_expr == NULL) - return SUCCESS; - - /* free left tree */ - free_tree_expr(tree_expr->left); - - /* free general expression object */ - free_gen_expr(tree_expr->gen_expr); - - /* Note that infix operators are always - stored in memory unless the program - exits, so we don't remove them here */ - - /* free right tree */ - free_tree_expr(tree_expr->right); - - - /* finally, free the struct itself */ - free(tree_expr); - return SUCCESS; -} - - - -/* Initializes all infix operators */ -int init_infix_ops() { - - infix_add = new_infix_op(INFIX_ADD, 4); - infix_minus = new_infix_op(INFIX_MINUS, 3); - infix_div = new_infix_op(INFIX_DIV, 2); - infix_or = new_infix_op(INFIX_OR, 5); - infix_and = new_infix_op(INFIX_AND,4); - infix_mod = new_infix_op(INFIX_MOD, 1); - infix_mult = new_infix_op(INFIX_MULT, 2); - - /* Prefix operators */ - infix_positive = new_infix_op(INFIX_ADD, 0); - infix_negative = new_infix_op(INFIX_MINUS, 0); - - return SUCCESS; -} - -/* Destroys the infix operator list. This should - be done on program exit */ -int destroy_infix_ops() -{ - - free(infix_add); - free(infix_minus); - free(infix_div); - free(infix_or); - free(infix_and); - free(infix_mod); - free(infix_mult); - free(infix_positive); - free(infix_negative); - - return SUCCESS; -} - -/* Initializes an infix operator */ -infix_op_t * new_infix_op(int type, int precedence) { - - infix_op_t * infix_op; - - infix_op = (infix_op_t*)malloc(sizeof(infix_op_t)); - - if (infix_op == NULL) - return NULL; - - infix_op->type = type; - infix_op->precedence = precedence; - - return infix_op; -} - - - - -/* Clones a general expression */ -gen_expr_t * clone_gen_expr(gen_expr_t * gen_expr) { - - gen_expr_t * new_gen_expr; - val_expr_t * val_expr; - tree_expr_t * tree_expr; - prefun_expr_t * prefun_expr; - - /* Null argument check */ - if (gen_expr == NULL) - return NULL; - - /* Out of memory */ - if ((new_gen_expr = (gen_expr_t*)malloc(sizeof(gen_expr_t))) == NULL) - return NULL; - - /* Case on the type of general expression */ - switch (new_gen_expr->type = gen_expr->type) { - - case VAL_T: /* val expression */ - if ((val_expr = clone_val_expr((val_expr_t*)gen_expr->item)) == NULL) { - free(new_gen_expr); - return NULL; - } - new_gen_expr->item = (void*)val_expr; - break; - - case PREFUN_T: /* prefix function expression */ - if ((prefun_expr = clone_prefun_expr((prefun_expr_t*)gen_expr->item)) == NULL) { - free(new_gen_expr); - return NULL; - } - new_gen_expr->item = (void*)prefun_expr; - break; - - case TREE_T: /* tree expression */ - if ((tree_expr = clone_tree_expr((tree_expr_t*)gen_expr->item)) == NULL) { - free(new_gen_expr); - return NULL; - } - new_gen_expr->item = (void*)tree_expr; - break; - - default: /* unknown type, ut oh.. */ - free(new_gen_expr); - return NULL; - } - - return new_gen_expr; /* Return the new (cloned) general expression */ -} - - -/* Clones a tree expression */ -tree_expr_t * clone_tree_expr(tree_expr_t * tree_expr) { - - tree_expr_t * new_tree_expr; - - /* Null argument */ - if (tree_expr == NULL) - return NULL; - - /* Out of memory */ - if ((new_tree_expr = (tree_expr_t*)malloc(sizeof(tree_expr_t))) == NULL) - return NULL; - - /* Set each argument in tree_expr_t struct */ - new_tree_expr->infix_op = tree_expr->infix_op; /* infix operators are in shared memory */ - new_tree_expr->gen_expr = clone_gen_expr(tree_expr->gen_expr); /* clone the general expression */ - new_tree_expr->left = clone_tree_expr(tree_expr->left); /* clone the left tree expression */ - new_tree_expr->right = clone_tree_expr(tree_expr->right); /* clone the right tree expression */ - - return new_tree_expr; /* Return the new (cloned) tree expression */ -} - -/* Clones a value expression, currently only passes the pointer to - the value that this object represents, not a pointer to a copy of the value */ -val_expr_t * clone_val_expr(val_expr_t * val_expr) { - - val_expr_t * new_val_expr; - - /* Null argument */ - if (val_expr == NULL) - return NULL; - - /* Allocate space, check for out of memory */ - if ((new_val_expr = (val_expr_t*)malloc(sizeof(val_expr_t))) == NULL) - return NULL; - - /* Set the values in the val_expr_t struct */ - new_val_expr->type = val_expr->type; - new_val_expr->term = val_expr->term; - - /* Return the new (cloned) value expression */ - return new_val_expr; -} - -/* Clones a prefix function with its arguments */ -prefun_expr_t * clone_prefun_expr(prefun_expr_t * prefun_expr) { - - int i; - prefun_expr_t * new_prefun_expr; - - /* Null argument */ - if (prefun_expr == NULL) - return NULL; - - /* Out of memory */ - if ((new_prefun_expr = (prefun_expr_t*)malloc(sizeof(prefun_expr_t))) == NULL) - return NULL; - - /* Set the function argument paired with its number of arguments */ - new_prefun_expr->num_args = prefun_expr->num_args; - new_prefun_expr->func_ptr = prefun_expr->func_ptr; - - /* Allocate space for the expression list pointers */ - if ((new_prefun_expr->expr_list = (gen_expr_t**)malloc(sizeof(gen_expr_t*)*new_prefun_expr->num_args)) == NULL) { - free(new_prefun_expr); - return NULL; - } - - /* Now copy each general expression from the argument expression list */ - for (i = 0; i < new_prefun_expr->num_args;i++) - new_prefun_expr->expr_list[i] = clone_gen_expr(prefun_expr->expr_list[i]); - - /* Finally, return the new (cloned) prefix function expression */ - return new_prefun_expr; -} - -/* Reinitializes the engine variables to a default (conservative and sane) value */ -void reset_engine_vars() { - - zoom=1.0; - zoomexp= 1.0; - rot= 0.0; - warp= 0.0; - - sx= 1.0; - sy= 1.0; - dx= 0.0; - dy= 0.0; - cx= 0.5; - cy= 0.5; - - - decay=.98; - - wave_r= 1.0; - wave_g= 0.2; - wave_b= 0.0; - wave_x= 0.5; - wave_y= 0.5; - wave_mystery= 0.0; - - ob_size= 0.0; - ob_r= 0.0; - ob_g= 0.0; - ob_b= 0.0; - ob_a= 0.0; - - ib_size = 0.0; - ib_r = 0.0; - ib_g = 0.0; - ib_b = 0.0; - ib_a = 0.0; - - mv_a = 0.0; - mv_r = 0.0; - mv_g = 0.0; - mv_b = 0.0; - mv_l = 1.0; - mv_x = 16.0; - mv_y = 12.0; - mv_dy = 0.02; - mv_dx = 0.02; - - meshx = 0; - meshy = 0; - - Time = 0; - treb = 0; - mid = 0; - bass = 0; - treb_att = 0; - mid_att = 0; - bass_att = 0; - progress = 0; - frame = 0; - -// bass_thresh = 0; - -/* PER_FRAME CONSTANTS END */ - fRating = 0; - fGammaAdj = 1.0; - fVideoEchoZoom = 1.0; - fVideoEchoAlpha = 0; - nVideoEchoOrientation = 0; - - nWaveMode = 7; - bAdditiveWaves = 0; - bWaveDots = 0; - bWaveThick = 0; - bModWaveAlphaByVolume = 0; - bMaximizeWaveColor = 0; - bTexWrap = 0; - bDarkenCenter = 0; - bRedBlueStereo = 0; - bBrighten = 0; - bDarken = 0; - bSolarize = 0; - bInvert = 0; - bMotionVectorsOn = 1; - - fWaveAlpha =1.0; - fWaveScale = 1.0; - fWaveSmoothing = 0; - fWaveParam = 0; - fModWaveAlphaStart = 0; - fModWaveAlphaEnd = 0; - fWarpAnimSpeed = 0; - fWarpScale = 0; - fShader = 0; - - -/* PER_PIXEL CONSTANTS BEGIN */ - x_per_pixel = 0; - y_per_pixel = 0; - rad_per_pixel = 0; - ang_per_pixel = 0; - -/* PER_PIXEL CONSTANT END */ - - -/* Q VARIABLES START */ - - q1 = 0; - q2 = 0; - q3 = 0; - q4 = 0; - q5 = 0; - q6 = 0; - q7 = 0; - q8 = 0; - - - /* Q VARIABLES END */ - - -} - - diff --git a/modules/visualization/galaktos/eval.h b/modules/visualization/galaktos/eval.h deleted file mode 100644 index a48ccccbe6..0000000000 --- a/modules/visualization/galaktos/eval.h +++ /dev/null @@ -1,55 +0,0 @@ -/* eval.h: evaluation functions of expressions */ -#ifndef EVAL_H -#define EVAL_H -#include "func_types.h" -#include "param_types.h" - -#define VAL_T 1 -#define PREFUN_T 3 -#define TREE_T 4 -#define NONE_T 0 - - -#define CONSTANT_TERM_T 0 -#define PARAM_TERM_T 1 - -#define INFIX_ADD 0 -#define INFIX_MINUS 1 -#define INFIX_MOD 2 -#define INFIX_DIV 3 -#define INFIX_MULT 4 -#define INFIX_OR 5 -#define INFIX_AND 6 - -//#define EVAL_DEBUG - - -double eval_gen_expr(gen_expr_t * gen_expr); -inline gen_expr_t * opt_gen_expr(gen_expr_t * gen_expr, int ** param_list); - -gen_expr_t * const_to_expr(double val); -gen_expr_t * param_to_expr(struct PARAM_T * param); -gen_expr_t * prefun_to_expr(double (*func_ptr)(), gen_expr_t ** expr_list, int num_args); - -tree_expr_t * new_tree_expr(infix_op_t * infix_op, gen_expr_t * gen_expr, tree_expr_t * left, tree_expr_t * right); -gen_expr_t * new_gen_expr(int type, void * item); -val_expr_t * new_val_expr(int type, term_t term); - -int free_gen_expr(gen_expr_t * gen_expr); -int free_prefun_expr(prefun_expr_t * prefun_expr); -int free_tree_expr(tree_expr_t * tree_expr); -int free_val_expr(val_expr_t * val_expr); - -infix_op_t * new_infix_op(int type, int precedence); -int init_infix_ops(); -int destroy_infix_ops(); -void reset_engine_vars(); - -gen_expr_t * clone_gen_expr(gen_expr_t * gen_expr); -tree_expr_t * clone_tree_expr(tree_expr_t * tree_expr); -val_expr_t * clone_val_expr(val_expr_t * val_expr); -prefun_expr_t * clone_prefun_expr(prefun_expr_t * prefun_expr); - - - -#endif diff --git a/modules/visualization/galaktos/expr_types.h b/modules/visualization/galaktos/expr_types.h deleted file mode 100644 index a5563f0936..0000000000 --- a/modules/visualization/galaktos/expr_types.h +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef EXPR_TYPES_H -#define EXPR_TYPES_H -#include "param_types.h" - -#define CONST_STACK_ELEMENT 0 -#define EXPR_STACK_ELEMENT 1 - -/* General Expression Type */ -typedef struct GEN_EXPR_T { - int type; - void * item; -} gen_expr_t; - -typedef union TERM_T { - double constant; /* static variable */ - struct PARAM_T * param; /* pointer to a changing variable */ -} term_t; - -/* Value expression, contains a term union */ -typedef struct VAL_EXPR_T { - int type; - term_t term; -} val_expr_t; - -/* Infix Operator Function */ -typedef struct INFIX_OP_T { - int type; - int precedence; -} infix_op_t; - -/* A binary expression tree ordered by operator precedence */ -typedef struct TREE_EXPR_T { - infix_op_t * infix_op; /* null if leaf */ - gen_expr_t * gen_expr; - struct TREE_EXPR_T * left, * right; -} tree_expr_t; - -/* A function expression in prefix form */ -typedef struct PREFUN_EXPR_T { - double (*func_ptr)(); - int num_args; - gen_expr_t ** expr_list; -} prefun_expr_t; - - - - -#endif diff --git a/modules/visualization/galaktos/fatal.h b/modules/visualization/galaktos/fatal.h deleted file mode 100644 index 352bccb030..0000000000 --- a/modules/visualization/galaktos/fatal.h +++ /dev/null @@ -1,9 +0,0 @@ -/* Fatal Error Definitions */ - -#define OUTOFMEM_ERROR -7; /* out of memory */ -#define ERROR -1 /* non specific error */ -#define SUCCESS 1 -#define FAILURE -1 -#define PARSE_ERROR -11 -#define DIV_BY_ZERO -3 -#define OK 2 diff --git a/modules/visualization/galaktos/fftsg.c b/modules/visualization/galaktos/fftsg.c deleted file mode 100644 index 7d6488f72d..0000000000 --- a/modules/visualization/galaktos/fftsg.c +++ /dev/null @@ -1,3340 +0,0 @@ -/***************************************************************************** - * fftsg.c: - ***************************************************************************** - * Copyright (C) 2004 the VideoLAN team - * $Id$ - * - * Authors: Cyril Deguet - * code from projectM http://xmms-projectm.sourceforge.net - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - - - -/* -Fast Fourier/Cosine/Sine Transform - dimension :one - data length :power of 2 - decimation :frequency - radix :split-radix - data :inplace - table :use -functions - cdft: Complex Discrete Fourier Transform - rdft: Real Discrete Fourier Transform - ddct: Discrete Cosine Transform - ddst: Discrete Sine Transform - dfct: Cosine Transform of RDFT (Real Symmetric DFT) - dfst: Sine Transform of RDFT (Real Anti-symmetric DFT) -function prototypes - void cdft(int, int, double *, int *, double *); - void rdft(int, int, double *, int *, double *); - void ddct(int, int, double *, int *, double *); - void ddst(int, int, double *, int *, double *); - void dfct(int, double *, double *, int *, double *); - void dfst(int, double *, double *, int *, double *); -macro definitions - USE_CDFT_PTHREADS : default=not defined - CDFT_THREADS_BEGIN_N : must be >= 512, default=8192 - CDFT_4THREADS_BEGIN_N : must be >= 512, default=65536 - USE_CDFT_WINTHREADS : default=not defined - CDFT_THREADS_BEGIN_N : must be >= 512, default=32768 - CDFT_4THREADS_BEGIN_N : must be >= 512, default=524288 - - --------- Complex DFT (Discrete Fourier Transform) -------- - [definition] - - X[k] = sum_j=0^n-1 x[j]*exp(2*pi*i*j*k/n), 0<=k - X[k] = sum_j=0^n-1 x[j]*exp(-2*pi*i*j*k/n), 0<=k - ip[0] = 0; // first time only - cdft(2*n, 1, a, ip, w); - - ip[0] = 0; // first time only - cdft(2*n, -1, a, ip, w); - [parameters] - 2*n :data length (int) - n >= 1, n = power of 2 - a[0...2*n-1] :input/output data (double *) - input data - a[2*j] = Re(x[j]), - a[2*j+1] = Im(x[j]), 0<=j= 2+sqrt(n) - strictly, - length of ip >= - 2+(1<<(int)(log(n+0.5)/log(2))/2). - ip[0],ip[1] are pointers of the cos/sin table. - w[0...n/2-1] :cos/sin table (double *) - w[],ip[] are initialized if ip[0] == 0. - [remark] - Inverse of - cdft(2*n, -1, a, ip, w); - is - cdft(2*n, 1, a, ip, w); - for (j = 0; j <= 2 * n - 1; j++) { - a[j] *= 1.0 / n; - } - . - - --------- Real DFT / Inverse of Real DFT -------- - [definition] - RDFT - R[k] = sum_j=0^n-1 a[j]*cos(2*pi*j*k/n), 0<=k<=n/2 - I[k] = sum_j=0^n-1 a[j]*sin(2*pi*j*k/n), 0 IRDFT (excluding scale) - a[k] = (R[0] + R[n/2]*cos(pi*k))/2 + - sum_j=1^n/2-1 R[j]*cos(2*pi*j*k/n) + - sum_j=1^n/2-1 I[j]*sin(2*pi*j*k/n), 0<=k - ip[0] = 0; // first time only - rdft(n, 1, a, ip, w); - - ip[0] = 0; // first time only - rdft(n, -1, a, ip, w); - [parameters] - n :data length (int) - n >= 2, n = power of 2 - a[0...n-1] :input/output data (double *) - - output data - a[2*k] = R[k], 0<=k - input data - a[2*j] = R[j], 0<=j= 2+sqrt(n/2) - strictly, - length of ip >= - 2+(1<<(int)(log(n/2+0.5)/log(2))/2). - ip[0],ip[1] are pointers of the cos/sin table. - w[0...n/2-1] :cos/sin table (double *) - w[],ip[] are initialized if ip[0] == 0. - [remark] - Inverse of - rdft(n, 1, a, ip, w); - is - rdft(n, -1, a, ip, w); - for (j = 0; j <= n - 1; j++) { - a[j] *= 2.0 / n; - } - . - - --------- DCT (Discrete Cosine Transform) / Inverse of DCT -------- - [definition] - IDCT (excluding scale) - C[k] = sum_j=0^n-1 a[j]*cos(pi*j*(k+1/2)/n), 0<=k DCT - C[k] = sum_j=0^n-1 a[j]*cos(pi*(j+1/2)*k/n), 0<=k - ip[0] = 0; // first time only - ddct(n, 1, a, ip, w); - - ip[0] = 0; // first time only - ddct(n, -1, a, ip, w); - [parameters] - n :data length (int) - n >= 2, n = power of 2 - a[0...n-1] :input/output data (double *) - output data - a[k] = C[k], 0<=k= 2+sqrt(n/2) - strictly, - length of ip >= - 2+(1<<(int)(log(n/2+0.5)/log(2))/2). - ip[0],ip[1] are pointers of the cos/sin table. - w[0...n*5/4-1] :cos/sin table (double *) - w[],ip[] are initialized if ip[0] == 0. - [remark] - Inverse of - ddct(n, -1, a, ip, w); - is - a[0] *= 0.5; - ddct(n, 1, a, ip, w); - for (j = 0; j <= n - 1; j++) { - a[j] *= 2.0 / n; - } - . - - --------- DST (Discrete Sine Transform) / Inverse of DST -------- - [definition] - IDST (excluding scale) - S[k] = sum_j=1^n A[j]*sin(pi*j*(k+1/2)/n), 0<=k DST - S[k] = sum_j=0^n-1 a[j]*sin(pi*(j+1/2)*k/n), 0 - ip[0] = 0; // first time only - ddst(n, 1, a, ip, w); - - ip[0] = 0; // first time only - ddst(n, -1, a, ip, w); - [parameters] - n :data length (int) - n >= 2, n = power of 2 - a[0...n-1] :input/output data (double *) - - input data - a[j] = A[j], 0 - output data - a[k] = S[k], 0= 2+sqrt(n/2) - strictly, - length of ip >= - 2+(1<<(int)(log(n/2+0.5)/log(2))/2). - ip[0],ip[1] are pointers of the cos/sin table. - w[0...n*5/4-1] :cos/sin table (double *) - w[],ip[] are initialized if ip[0] == 0. - [remark] - Inverse of - ddst(n, -1, a, ip, w); - is - a[0] *= 0.5; - ddst(n, 1, a, ip, w); - for (j = 0; j <= n - 1; j++) { - a[j] *= 2.0 / n; - } - . - - --------- Cosine Transform of RDFT (Real Symmetric DFT) -------- - [definition] - C[k] = sum_j=0^n a[j]*cos(pi*j*k/n), 0<=k<=n - [usage] - ip[0] = 0; // first time only - dfct(n, a, t, ip, w); - [parameters] - n :data length - 1 (int) - n >= 2, n = power of 2 - a[0...n] :input/output data (double *) - output data - a[k] = C[k], 0<=k<=n - t[0...n/2] :work area (double *) - ip[0...*] :work area for bit reversal (int *) - length of ip >= 2+sqrt(n/4) - strictly, - length of ip >= - 2+(1<<(int)(log(n/4+0.5)/log(2))/2). - ip[0],ip[1] are pointers of the cos/sin table. - w[0...n*5/8-1] :cos/sin table (double *) - w[],ip[] are initialized if ip[0] == 0. - [remark] - Inverse of - a[0] *= 0.5; - a[n] *= 0.5; - dfct(n, a, t, ip, w); - is - a[0] *= 0.5; - a[n] *= 0.5; - dfct(n, a, t, ip, w); - for (j = 0; j <= n; j++) { - a[j] *= 2.0 / n; - } - . - - --------- Sine Transform of RDFT (Real Anti-symmetric DFT) -------- - [definition] - S[k] = sum_j=1^n-1 a[j]*sin(pi*j*k/n), 0= 2, n = power of 2 - a[0...n-1] :input/output data (double *) - output data - a[k] = S[k], 0= 2+sqrt(n/4) - strictly, - length of ip >= - 2+(1<<(int)(log(n/4+0.5)/log(2))/2). - ip[0],ip[1] are pointers of the cos/sin table. - w[0...n*5/8-1] :cos/sin table (double *) - w[],ip[] are initialized if ip[0] == 0. - [remark] - Inverse of - dfst(n, a, t, ip, w); - is - dfst(n, a, t, ip, w); - for (j = 1; j <= n - 1; j++) { - a[j] *= 2.0 / n; - } - . - - -Appendix : - The cos/sin table is recalculated when the larger table required. - w[] and ip[] are compatible with all routines. -*/ - - -void cdft(int n, int isgn, double *a, int *ip, double *w) -{ - void makewt(int nw, int *ip, double *w); - void cftfsub(int n, double *a, int *ip, int nw, double *w); - void cftbsub(int n, double *a, int *ip, int nw, double *w); - int nw; - - nw = ip[0]; - if (n > (nw << 2)) { - nw = n >> 2; - makewt(nw, ip, w); - } - if (isgn >= 0) { - cftfsub(n, a, ip, nw, w); - } else { - cftbsub(n, a, ip, nw, w); - } -} - - -void rdft(int n, int isgn, double *a, int *ip, double *w) -{ - void makewt(int nw, int *ip, double *w); - void makect(int nc, int *ip, double *c); - void cftfsub(int n, double *a, int *ip, int nw, double *w); - void cftbsub(int n, double *a, int *ip, int nw, double *w); - void rftfsub(int n, double *a, int nc, double *c); - void rftbsub(int n, double *a, int nc, double *c); - int nw, nc; - double xi; - - nw = ip[0]; - if (n > (nw << 2)) { - nw = n >> 2; - makewt(nw, ip, w); - } - nc = ip[1]; - if (n > (nc << 2)) { - nc = n >> 2; - makect(nc, ip, w + nw); - } - if (isgn >= 0) { - if (n > 4) { - cftfsub(n, a, ip, nw, w); - rftfsub(n, a, nc, w + nw); - } else if (n == 4) { - cftfsub(n, a, ip, nw, w); - } - xi = a[0] - a[1]; - a[0] += a[1]; - a[1] = xi; - } else { - a[1] = 0.5 * (a[0] - a[1]); - a[0] -= a[1]; - if (n > 4) { - rftbsub(n, a, nc, w + nw); - cftbsub(n, a, ip, nw, w); - } else if (n == 4) { - cftbsub(n, a, ip, nw, w); - } - } -} - - -void ddct(int n, int isgn, double *a, int *ip, double *w) -{ - void makewt(int nw, int *ip, double *w); - void makect(int nc, int *ip, double *c); - void cftfsub(int n, double *a, int *ip, int nw, double *w); - void cftbsub(int n, double *a, int *ip, int nw, double *w); - void rftfsub(int n, double *a, int nc, double *c); - void rftbsub(int n, double *a, int nc, double *c); - void dctsub(int n, double *a, int nc, double *c); - int j, nw, nc; - double xr; - - nw = ip[0]; - if (n > (nw << 2)) { - nw = n >> 2; - makewt(nw, ip, w); - } - nc = ip[1]; - if (n > nc) { - nc = n; - makect(nc, ip, w + nw); - } - if (isgn < 0) { - xr = a[n - 1]; - for (j = n - 2; j >= 2; j -= 2) { - a[j + 1] = a[j] - a[j - 1]; - a[j] += a[j - 1]; - } - a[1] = a[0] - xr; - a[0] += xr; - if (n > 4) { - rftbsub(n, a, nc, w + nw); - cftbsub(n, a, ip, nw, w); - } else if (n == 4) { - cftbsub(n, a, ip, nw, w); - } - } - dctsub(n, a, nc, w + nw); - if (isgn >= 0) { - if (n > 4) { - cftfsub(n, a, ip, nw, w); - rftfsub(n, a, nc, w + nw); - } else if (n == 4) { - cftfsub(n, a, ip, nw, w); - } - xr = a[0] - a[1]; - a[0] += a[1]; - for (j = 2; j < n; j += 2) { - a[j - 1] = a[j] - a[j + 1]; - a[j] += a[j + 1]; - } - a[n - 1] = xr; - } -} - - -void ddst(int n, int isgn, double *a, int *ip, double *w) -{ - void makewt(int nw, int *ip, double *w); - void makect(int nc, int *ip, double *c); - void cftfsub(int n, double *a, int *ip, int nw, double *w); - void cftbsub(int n, double *a, int *ip, int nw, double *w); - void rftfsub(int n, double *a, int nc, double *c); - void rftbsub(int n, double *a, int nc, double *c); - void dstsub(int n, double *a, int nc, double *c); - int j, nw, nc; - double xr; - - nw = ip[0]; - if (n > (nw << 2)) { - nw = n >> 2; - makewt(nw, ip, w); - } - nc = ip[1]; - if (n > nc) { - nc = n; - makect(nc, ip, w + nw); - } - if (isgn < 0) { - xr = a[n - 1]; - for (j = n - 2; j >= 2; j -= 2) { - a[j + 1] = -a[j] - a[j - 1]; - a[j] -= a[j - 1]; - } - a[1] = a[0] + xr; - a[0] -= xr; - if (n > 4) { - rftbsub(n, a, nc, w + nw); - cftbsub(n, a, ip, nw, w); - } else if (n == 4) { - cftbsub(n, a, ip, nw, w); - } - } - dstsub(n, a, nc, w + nw); - if (isgn >= 0) { - if (n > 4) { - cftfsub(n, a, ip, nw, w); - rftfsub(n, a, nc, w + nw); - } else if (n == 4) { - cftfsub(n, a, ip, nw, w); - } - xr = a[0] - a[1]; - a[0] += a[1]; - for (j = 2; j < n; j += 2) { - a[j - 1] = -a[j] - a[j + 1]; - a[j] -= a[j + 1]; - } - a[n - 1] = -xr; - } -} - - -void dfct(int n, double *a, double *t, int *ip, double *w) -{ - void makewt(int nw, int *ip, double *w); - void makect(int nc, int *ip, double *c); - void cftfsub(int n, double *a, int *ip, int nw, double *w); - void rftfsub(int n, double *a, int nc, double *c); - void dctsub(int n, double *a, int nc, double *c); - int j, k, l, m, mh, nw, nc; - double xr, xi, yr, yi; - - nw = ip[0]; - if (n > (nw << 3)) { - nw = n >> 3; - makewt(nw, ip, w); - } - nc = ip[1]; - if (n > (nc << 1)) { - nc = n >> 1; - makect(nc, ip, w + nw); - } - m = n >> 1; - yi = a[m]; - xi = a[0] + a[n]; - a[0] -= a[n]; - t[0] = xi - yi; - t[m] = xi + yi; - if (n > 2) { - mh = m >> 1; - for (j = 1; j < mh; j++) { - k = m - j; - xr = a[j] - a[n - j]; - xi = a[j] + a[n - j]; - yr = a[k] - a[n - k]; - yi = a[k] + a[n - k]; - a[j] = xr; - a[k] = yr; - t[j] = xi - yi; - t[k] = xi + yi; - } - t[mh] = a[mh] + a[n - mh]; - a[mh] -= a[n - mh]; - dctsub(m, a, nc, w + nw); - if (m > 4) { - cftfsub(m, a, ip, nw, w); - rftfsub(m, a, nc, w + nw); - } else if (m == 4) { - cftfsub(m, a, ip, nw, w); - } - a[n - 1] = a[0] - a[1]; - a[1] = a[0] + a[1]; - for (j = m - 2; j >= 2; j -= 2) { - a[2 * j + 1] = a[j] + a[j + 1]; - a[2 * j - 1] = a[j] - a[j + 1]; - } - l = 2; - m = mh; - while (m >= 2) { - dctsub(m, t, nc, w + nw); - if (m > 4) { - cftfsub(m, t, ip, nw, w); - rftfsub(m, t, nc, w + nw); - } else if (m == 4) { - cftfsub(m, t, ip, nw, w); - } - a[n - l] = t[0] - t[1]; - a[l] = t[0] + t[1]; - k = 0; - for (j = 2; j < m; j += 2) { - k += l << 2; - a[k - l] = t[j] - t[j + 1]; - a[k + l] = t[j] + t[j + 1]; - } - l <<= 1; - mh = m >> 1; - for (j = 0; j < mh; j++) { - k = m - j; - t[j] = t[m + k] - t[m + j]; - t[k] = t[m + k] + t[m + j]; - } - t[mh] = t[m + mh]; - m = mh; - } - a[l] = t[0]; - a[n] = t[2] - t[1]; - a[0] = t[2] + t[1]; - } else { - a[1] = a[0]; - a[2] = t[0]; - a[0] = t[1]; - } -} - - -void dfst(int n, double *a, double *t, int *ip, double *w) -{ - void makewt(int nw, int *ip, double *w); - void makect(int nc, int *ip, double *c); - void cftfsub(int n, double *a, int *ip, int nw, double *w); - void rftfsub(int n, double *a, int nc, double *c); - void dstsub(int n, double *a, int nc, double *c); - int j, k, l, m, mh, nw, nc; - double xr, xi, yr, yi; - - nw = ip[0]; - if (n > (nw << 3)) { - nw = n >> 3; - makewt(nw, ip, w); - } - nc = ip[1]; - if (n > (nc << 1)) { - nc = n >> 1; - makect(nc, ip, w + nw); - } - if (n > 2) { - m = n >> 1; - mh = m >> 1; - for (j = 1; j < mh; j++) { - k = m - j; - xr = a[j] + a[n - j]; - xi = a[j] - a[n - j]; - yr = a[k] + a[n - k]; - yi = a[k] - a[n - k]; - a[j] = xr; - a[k] = yr; - t[j] = xi + yi; - t[k] = xi - yi; - } - t[0] = a[mh] - a[n - mh]; - a[mh] += a[n - mh]; - a[0] = a[m]; - dstsub(m, a, nc, w + nw); - if (m > 4) { - cftfsub(m, a, ip, nw, w); - rftfsub(m, a, nc, w + nw); - } else if (m == 4) { - cftfsub(m, a, ip, nw, w); - } - a[n - 1] = a[1] - a[0]; - a[1] = a[0] + a[1]; - for (j = m - 2; j >= 2; j -= 2) { - a[2 * j + 1] = a[j] - a[j + 1]; - a[2 * j - 1] = -a[j] - a[j + 1]; - } - l = 2; - m = mh; - while (m >= 2) { - dstsub(m, t, nc, w + nw); - if (m > 4) { - cftfsub(m, t, ip, nw, w); - rftfsub(m, t, nc, w + nw); - } else if (m == 4) { - cftfsub(m, t, ip, nw, w); - } - a[n - l] = t[1] - t[0]; - a[l] = t[0] + t[1]; - k = 0; - for (j = 2; j < m; j += 2) { - k += l << 2; - a[k - l] = -t[j] - t[j + 1]; - a[k + l] = t[j] - t[j + 1]; - } - l <<= 1; - mh = m >> 1; - for (j = 1; j < mh; j++) { - k = m - j; - t[j] = t[m + k] + t[m + j]; - t[k] = t[m + k] - t[m + j]; - } - t[0] = t[m + mh]; - m = mh; - } - a[l] = t[0]; - } - a[0] = 0; -} - - -/* -------- initializing routines -------- */ - - -#include - -void makewt(int nw, int *ip, double *w) -{ - void makeipt(int nw, int *ip); - int j, nwh, nw0, nw1; - double delta, wn4r, wk1r, wk1i, wk3r, wk3i; - - ip[0] = nw; - ip[1] = 1; - if (nw > 2) { - nwh = nw >> 1; - delta = atan(1.0) / nwh; - wn4r = cos(delta * nwh); - w[0] = 1; - w[1] = wn4r; - if (nwh == 4) { - w[2] = cos(delta * 2); - w[3] = sin(delta * 2); - } else if (nwh > 4) { - makeipt(nw, ip); - w[2] = 0.5 / cos(delta * 2); - w[3] = 0.5 / cos(delta * 6); - for (j = 4; j < nwh; j += 4) { - w[j] = cos(delta * j); - w[j + 1] = sin(delta * j); - w[j + 2] = cos(3 * delta * j); - w[j + 3] = -sin(3 * delta * j); - } - } - nw0 = 0; - while (nwh > 2) { - nw1 = nw0 + nwh; - nwh >>= 1; - w[nw1] = 1; - w[nw1 + 1] = wn4r; - if (nwh == 4) { - wk1r = w[nw0 + 4]; - wk1i = w[nw0 + 5]; - w[nw1 + 2] = wk1r; - w[nw1 + 3] = wk1i; - } else if (nwh > 4) { - wk1r = w[nw0 + 4]; - wk3r = w[nw0 + 6]; - w[nw1 + 2] = 0.5 / wk1r; - w[nw1 + 3] = 0.5 / wk3r; - for (j = 4; j < nwh; j += 4) { - wk1r = w[nw0 + 2 * j]; - wk1i = w[nw0 + 2 * j + 1]; - wk3r = w[nw0 + 2 * j + 2]; - wk3i = w[nw0 + 2 * j + 3]; - w[nw1 + j] = wk1r; - w[nw1 + j + 1] = wk1i; - w[nw1 + j + 2] = wk3r; - w[nw1 + j + 3] = wk3i; - } - } - nw0 = nw1; - } - } -} - - -void makeipt(int nw, int *ip) -{ - int j, l, m, m2, p, q; - - ip[2] = 0; - ip[3] = 16; - m = 2; - for (l = nw; l > 32; l >>= 2) { - m2 = m << 1; - q = m2 << 3; - for (j = m; j < m2; j++) { - p = ip[j] << 2; - ip[m + j] = p; - ip[m2 + j] = p + q; - } - m = m2; - } -} - - -void makect(int nc, int *ip, double *c) -{ - int j, nch; - double delta; - - ip[1] = nc; - if (nc > 1) { - nch = nc >> 1; - delta = atan(1.0) / nch; - c[0] = cos(delta * nch); - c[nch] = 0.5 * c[0]; - for (j = 1; j < nch; j++) { - c[j] = 0.5 * cos(delta * j); - c[nc - j] = 0.5 * sin(delta * j); - } - } -} - - -/* -------- child routines -------- */ - - -#ifdef USE_CDFT_PTHREADS -#define USE_CDFT_THREADS -#ifndef CDFT_THREADS_BEGIN_N -#define CDFT_THREADS_BEGIN_N 8192 -#endif -#ifndef CDFT_4THREADS_BEGIN_N -#define CDFT_4THREADS_BEGIN_N 65536 -#endif -#include -#include -#include -#define cdft_thread_t pthread_t -#define cdft_thread_create(thp,func,argp) { \ - if (pthread_create(thp, NULL, func, (void *) argp) != 0) { \ - fprintf(stderr, "cdft thread error\n"); \ - exit(1); \ - } \ -} -#define cdft_thread_wait(th) { \ - if (pthread_join(th, NULL) != 0) { \ - fprintf(stderr, "cdft thread error\n"); \ - exit(1); \ - } \ -} -#endif /* USE_CDFT_PTHREADS */ - - -#ifdef USE_CDFT_WINTHREADS -#define USE_CDFT_THREADS -#ifndef CDFT_THREADS_BEGIN_N -#define CDFT_THREADS_BEGIN_N 32768 -#endif -#ifndef CDFT_4THREADS_BEGIN_N -#define CDFT_4THREADS_BEGIN_N 524288 -#endif -#include -#include -#include -#define cdft_thread_t HANDLE -#define cdft_thread_create(thp,func,argp) { \ - DWORD thid; \ - *(thp) = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) func, (LPVOID) argp, 0, &thid); \ - if (*(thp) == 0) { \ - fprintf(stderr, "cdft thread error\n"); \ - exit(1); \ - } \ -} -#define cdft_thread_wait(th) { \ - WaitForSingleObject(th, INFINITE); \ - CloseHandle(th); \ -} -#endif /* USE_CDFT_WINTHREADS */ - - -void cftfsub(int n, double *a, int *ip, int nw, double *w) -{ - void bitrv2(int n, int *ip, double *a); - void bitrv216(double *a); - void bitrv208(double *a); - void cftf1st(int n, double *a, double *w); - void cftrec4(int n, double *a, int nw, double *w); - void cftleaf(int n, int isplt, double *a, int nw, double *w); - void cftfx41(int n, double *a, int nw, double *w); - void cftf161(double *a, double *w); - void cftf081(double *a, double *w); - void cftf040(double *a); - void cftx020(double *a); -#ifdef USE_CDFT_THREADS - void cftrec4_th(int n, double *a, int nw, double *w); -#endif /* USE_CDFT_THREADS */ - - if (n > 8) { - if (n > 32) { - cftf1st(n, a, &w[nw - (n >> 2)]); -#ifdef USE_CDFT_THREADS - if (n > CDFT_THREADS_BEGIN_N) { - cftrec4_th(n, a, nw, w); - } else -#endif /* USE_CDFT_THREADS */ - if (n > 512) { - cftrec4(n, a, nw, w); - } else if (n > 128) { - cftleaf(n, 1, a, nw, w); - } else { - cftfx41(n, a, nw, w); - } - bitrv2(n, ip, a); - } else if (n == 32) { - cftf161(a, &w[nw - 8]); - bitrv216(a); - } else { - cftf081(a, w); - bitrv208(a); - } - } else if (n == 8) { - cftf040(a); - } else if (n == 4) { - cftx020(a); - } -} - - -void cftbsub(int n, double *a, int *ip, int nw, double *w) -{ - void bitrv2conj(int n, int *ip, double *a); - void bitrv216neg(double *a); - void bitrv208neg(double *a); - void cftb1st(int n, double *a, double *w); - void cftrec4(int n, double *a, int nw, double *w); - void cftleaf(int n, int isplt, double *a, int nw, double *w); - void cftfx41(int n, double *a, int nw, double *w); - void cftf161(double *a, double *w); - void cftf081(double *a, double *w); - void cftb040(double *a); - void cftx020(double *a); -#ifdef USE_CDFT_THREADS - void cftrec4_th(int n, double *a, int nw, double *w); -#endif /* USE_CDFT_THREADS */ - - if (n > 8) { - if (n > 32) { - cftb1st(n, a, &w[nw - (n >> 2)]); -#ifdef USE_CDFT_THREADS - if (n > CDFT_THREADS_BEGIN_N) { - cftrec4_th(n, a, nw, w); - } else -#endif /* USE_CDFT_THREADS */ - if (n > 512) { - cftrec4(n, a, nw, w); - } else if (n > 128) { - cftleaf(n, 1, a, nw, w); - } else { - cftfx41(n, a, nw, w); - } - bitrv2conj(n, ip, a); - } else if (n == 32) { - cftf161(a, &w[nw - 8]); - bitrv216neg(a); - } else { - cftf081(a, w); - bitrv208neg(a); - } - } else if (n == 8) { - cftb040(a); - } else if (n == 4) { - cftx020(a); - } -} - - -void bitrv2(int n, int *ip, double *a) -{ - int j, j1, k, k1, l, m, nh, nm; - double xr, xi, yr, yi; - - m = 1; - for (l = n >> 2; l > 8; l >>= 2) { - m <<= 1; - } - nh = n >> 1; - nm = 4 * m; - if (l == 8) { - for (k = 0; k < m; k++) { - for (j = 0; j < k; j++) { - j1 = 4 * j + 2 * ip[m + k]; - k1 = 4 * k + 2 * ip[m + j]; - xr = a[j1]; - xi = a[j1 + 1]; - yr = a[k1]; - yi = a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 += nm; - k1 += 2 * nm; - xr = a[j1]; - xi = a[j1 + 1]; - yr = a[k1]; - yi = a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 += nm; - k1 -= nm; - xr = a[j1]; - xi = a[j1 + 1]; - yr = a[k1]; - yi = a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 += nm; - k1 += 2 * nm; - xr = a[j1]; - xi = a[j1 + 1]; - yr = a[k1]; - yi = a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 += nh; - k1 += 2; - xr = a[j1]; - xi = a[j1 + 1]; - yr = a[k1]; - yi = a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 -= nm; - k1 -= 2 * nm; - xr = a[j1]; - xi = a[j1 + 1]; - yr = a[k1]; - yi = a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 -= nm; - k1 += nm; - xr = a[j1]; - xi = a[j1 + 1]; - yr = a[k1]; - yi = a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 -= nm; - k1 -= 2 * nm; - xr = a[j1]; - xi = a[j1 + 1]; - yr = a[k1]; - yi = a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 += 2; - k1 += nh; - xr = a[j1]; - xi = a[j1 + 1]; - yr = a[k1]; - yi = a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 += nm; - k1 += 2 * nm; - xr = a[j1]; - xi = a[j1 + 1]; - yr = a[k1]; - yi = a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 += nm; - k1 -= nm; - xr = a[j1]; - xi = a[j1 + 1]; - yr = a[k1]; - yi = a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 += nm; - k1 += 2 * nm; - xr = a[j1]; - xi = a[j1 + 1]; - yr = a[k1]; - yi = a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 -= nh; - k1 -= 2; - xr = a[j1]; - xi = a[j1 + 1]; - yr = a[k1]; - yi = a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 -= nm; - k1 -= 2 * nm; - xr = a[j1]; - xi = a[j1 + 1]; - yr = a[k1]; - yi = a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 -= nm; - k1 += nm; - xr = a[j1]; - xi = a[j1 + 1]; - yr = a[k1]; - yi = a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 -= nm; - k1 -= 2 * nm; - xr = a[j1]; - xi = a[j1 + 1]; - yr = a[k1]; - yi = a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - } - k1 = 4 * k + 2 * ip[m + k]; - j1 = k1 + 2; - k1 += nh; - xr = a[j1]; - xi = a[j1 + 1]; - yr = a[k1]; - yi = a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 += nm; - k1 += 2 * nm; - xr = a[j1]; - xi = a[j1 + 1]; - yr = a[k1]; - yi = a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 += nm; - k1 -= nm; - xr = a[j1]; - xi = a[j1 + 1]; - yr = a[k1]; - yi = a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 -= 2; - k1 -= nh; - xr = a[j1]; - xi = a[j1 + 1]; - yr = a[k1]; - yi = a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 += nh + 2; - k1 += nh + 2; - xr = a[j1]; - xi = a[j1 + 1]; - yr = a[k1]; - yi = a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 -= nh - nm; - k1 += 2 * nm - 2; - xr = a[j1]; - xi = a[j1 + 1]; - yr = a[k1]; - yi = a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - } - } else { - for (k = 0; k < m; k++) { - for (j = 0; j < k; j++) { - j1 = 4 * j + ip[m + k]; - k1 = 4 * k + ip[m + j]; - xr = a[j1]; - xi = a[j1 + 1]; - yr = a[k1]; - yi = a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 += nm; - k1 += nm; - xr = a[j1]; - xi = a[j1 + 1]; - yr = a[k1]; - yi = a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 += nh; - k1 += 2; - xr = a[j1]; - xi = a[j1 + 1]; - yr = a[k1]; - yi = a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 -= nm; - k1 -= nm; - xr = a[j1]; - xi = a[j1 + 1]; - yr = a[k1]; - yi = a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 += 2; - k1 += nh; - xr = a[j1]; - xi = a[j1 + 1]; - yr = a[k1]; - yi = a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 += nm; - k1 += nm; - xr = a[j1]; - xi = a[j1 + 1]; - yr = a[k1]; - yi = a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 -= nh; - k1 -= 2; - xr = a[j1]; - xi = a[j1 + 1]; - yr = a[k1]; - yi = a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 -= nm; - k1 -= nm; - xr = a[j1]; - xi = a[j1 + 1]; - yr = a[k1]; - yi = a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - } - k1 = 4 * k + ip[m + k]; - j1 = k1 + 2; - k1 += nh; - xr = a[j1]; - xi = a[j1 + 1]; - yr = a[k1]; - yi = a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 += nm; - k1 += nm; - xr = a[j1]; - xi = a[j1 + 1]; - yr = a[k1]; - yi = a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - } - } -} - - -void bitrv2conj(int n, int *ip, double *a) -{ - int j, j1, k, k1, l, m, nh, nm; - double xr, xi, yr, yi; - - m = 1; - for (l = n >> 2; l > 8; l >>= 2) { - m <<= 1; - } - nh = n >> 1; - nm = 4 * m; - if (l == 8) { - for (k = 0; k < m; k++) { - for (j = 0; j < k; j++) { - j1 = 4 * j + 2 * ip[m + k]; - k1 = 4 * k + 2 * ip[m + j]; - xr = a[j1]; - xi = -a[j1 + 1]; - yr = a[k1]; - yi = -a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 += nm; - k1 += 2 * nm; - xr = a[j1]; - xi = -a[j1 + 1]; - yr = a[k1]; - yi = -a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 += nm; - k1 -= nm; - xr = a[j1]; - xi = -a[j1 + 1]; - yr = a[k1]; - yi = -a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 += nm; - k1 += 2 * nm; - xr = a[j1]; - xi = -a[j1 + 1]; - yr = a[k1]; - yi = -a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 += nh; - k1 += 2; - xr = a[j1]; - xi = -a[j1 + 1]; - yr = a[k1]; - yi = -a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 -= nm; - k1 -= 2 * nm; - xr = a[j1]; - xi = -a[j1 + 1]; - yr = a[k1]; - yi = -a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 -= nm; - k1 += nm; - xr = a[j1]; - xi = -a[j1 + 1]; - yr = a[k1]; - yi = -a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 -= nm; - k1 -= 2 * nm; - xr = a[j1]; - xi = -a[j1 + 1]; - yr = a[k1]; - yi = -a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 += 2; - k1 += nh; - xr = a[j1]; - xi = -a[j1 + 1]; - yr = a[k1]; - yi = -a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 += nm; - k1 += 2 * nm; - xr = a[j1]; - xi = -a[j1 + 1]; - yr = a[k1]; - yi = -a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 += nm; - k1 -= nm; - xr = a[j1]; - xi = -a[j1 + 1]; - yr = a[k1]; - yi = -a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 += nm; - k1 += 2 * nm; - xr = a[j1]; - xi = -a[j1 + 1]; - yr = a[k1]; - yi = -a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 -= nh; - k1 -= 2; - xr = a[j1]; - xi = -a[j1 + 1]; - yr = a[k1]; - yi = -a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 -= nm; - k1 -= 2 * nm; - xr = a[j1]; - xi = -a[j1 + 1]; - yr = a[k1]; - yi = -a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 -= nm; - k1 += nm; - xr = a[j1]; - xi = -a[j1 + 1]; - yr = a[k1]; - yi = -a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 -= nm; - k1 -= 2 * nm; - xr = a[j1]; - xi = -a[j1 + 1]; - yr = a[k1]; - yi = -a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - } - k1 = 4 * k + 2 * ip[m + k]; - j1 = k1 + 2; - k1 += nh; - a[j1 - 1] = -a[j1 - 1]; - xr = a[j1]; - xi = -a[j1 + 1]; - yr = a[k1]; - yi = -a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - a[k1 + 3] = -a[k1 + 3]; - j1 += nm; - k1 += 2 * nm; - xr = a[j1]; - xi = -a[j1 + 1]; - yr = a[k1]; - yi = -a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 += nm; - k1 -= nm; - xr = a[j1]; - xi = -a[j1 + 1]; - yr = a[k1]; - yi = -a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 -= 2; - k1 -= nh; - xr = a[j1]; - xi = -a[j1 + 1]; - yr = a[k1]; - yi = -a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 += nh + 2; - k1 += nh + 2; - xr = a[j1]; - xi = -a[j1 + 1]; - yr = a[k1]; - yi = -a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 -= nh - nm; - k1 += 2 * nm - 2; - a[j1 - 1] = -a[j1 - 1]; - xr = a[j1]; - xi = -a[j1 + 1]; - yr = a[k1]; - yi = -a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - a[k1 + 3] = -a[k1 + 3]; - } - } else { - for (k = 0; k < m; k++) { - for (j = 0; j < k; j++) { - j1 = 4 * j + ip[m + k]; - k1 = 4 * k + ip[m + j]; - xr = a[j1]; - xi = -a[j1 + 1]; - yr = a[k1]; - yi = -a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 += nm; - k1 += nm; - xr = a[j1]; - xi = -a[j1 + 1]; - yr = a[k1]; - yi = -a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 += nh; - k1 += 2; - xr = a[j1]; - xi = -a[j1 + 1]; - yr = a[k1]; - yi = -a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 -= nm; - k1 -= nm; - xr = a[j1]; - xi = -a[j1 + 1]; - yr = a[k1]; - yi = -a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 += 2; - k1 += nh; - xr = a[j1]; - xi = -a[j1 + 1]; - yr = a[k1]; - yi = -a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 += nm; - k1 += nm; - xr = a[j1]; - xi = -a[j1 + 1]; - yr = a[k1]; - yi = -a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 -= nh; - k1 -= 2; - xr = a[j1]; - xi = -a[j1 + 1]; - yr = a[k1]; - yi = -a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - j1 -= nm; - k1 -= nm; - xr = a[j1]; - xi = -a[j1 + 1]; - yr = a[k1]; - yi = -a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - } - k1 = 4 * k + ip[m + k]; - j1 = k1 + 2; - k1 += nh; - a[j1 - 1] = -a[j1 - 1]; - xr = a[j1]; - xi = -a[j1 + 1]; - yr = a[k1]; - yi = -a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - a[k1 + 3] = -a[k1 + 3]; - j1 += nm; - k1 += nm; - a[j1 - 1] = -a[j1 - 1]; - xr = a[j1]; - xi = -a[j1 + 1]; - yr = a[k1]; - yi = -a[k1 + 1]; - a[j1] = yr; - a[j1 + 1] = yi; - a[k1] = xr; - a[k1 + 1] = xi; - a[k1 + 3] = -a[k1 + 3]; - } - } -} - - -void bitrv216(double *a) -{ - double x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, - x5r, x5i, x7r, x7i, x8r, x8i, x10r, x10i, - x11r, x11i, x12r, x12i, x13r, x13i, x14r, x14i; - - x1r = a[2]; - x1i = a[3]; - x2r = a[4]; - x2i = a[5]; - x3r = a[6]; - x3i = a[7]; - x4r = a[8]; - x4i = a[9]; - x5r = a[10]; - x5i = a[11]; - x7r = a[14]; - x7i = a[15]; - x8r = a[16]; - x8i = a[17]; - x10r = a[20]; - x10i = a[21]; - x11r = a[22]; - x11i = a[23]; - x12r = a[24]; - x12i = a[25]; - x13r = a[26]; - x13i = a[27]; - x14r = a[28]; - x14i = a[29]; - a[2] = x8r; - a[3] = x8i; - a[4] = x4r; - a[5] = x4i; - a[6] = x12r; - a[7] = x12i; - a[8] = x2r; - a[9] = x2i; - a[10] = x10r; - a[11] = x10i; - a[14] = x14r; - a[15] = x14i; - a[16] = x1r; - a[17] = x1i; - a[20] = x5r; - a[21] = x5i; - a[22] = x13r; - a[23] = x13i; - a[24] = x3r; - a[25] = x3i; - a[26] = x11r; - a[27] = x11i; - a[28] = x7r; - a[29] = x7i; -} - - -void bitrv216neg(double *a) -{ - double x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, - x5r, x5i, x6r, x6i, x7r, x7i, x8r, x8i, - x9r, x9i, x10r, x10i, x11r, x11i, x12r, x12i, - x13r, x13i, x14r, x14i, x15r, x15i; - - x1r = a[2]; - x1i = a[3]; - x2r = a[4]; - x2i = a[5]; - x3r = a[6]; - x3i = a[7]; - x4r = a[8]; - x4i = a[9]; - x5r = a[10]; - x5i = a[11]; - x6r = a[12]; - x6i = a[13]; - x7r = a[14]; - x7i = a[15]; - x8r = a[16]; - x8i = a[17]; - x9r = a[18]; - x9i = a[19]; - x10r = a[20]; - x10i = a[21]; - x11r = a[22]; - x11i = a[23]; - x12r = a[24]; - x12i = a[25]; - x13r = a[26]; - x13i = a[27]; - x14r = a[28]; - x14i = a[29]; - x15r = a[30]; - x15i = a[31]; - a[2] = x15r; - a[3] = x15i; - a[4] = x7r; - a[5] = x7i; - a[6] = x11r; - a[7] = x11i; - a[8] = x3r; - a[9] = x3i; - a[10] = x13r; - a[11] = x13i; - a[12] = x5r; - a[13] = x5i; - a[14] = x9r; - a[15] = x9i; - a[16] = x1r; - a[17] = x1i; - a[18] = x14r; - a[19] = x14i; - a[20] = x6r; - a[21] = x6i; - a[22] = x10r; - a[23] = x10i; - a[24] = x2r; - a[25] = x2i; - a[26] = x12r; - a[27] = x12i; - a[28] = x4r; - a[29] = x4i; - a[30] = x8r; - a[31] = x8i; -} - - -void bitrv208(double *a) -{ - double x1r, x1i, x3r, x3i, x4r, x4i, x6r, x6i; - - x1r = a[2]; - x1i = a[3]; - x3r = a[6]; - x3i = a[7]; - x4r = a[8]; - x4i = a[9]; - x6r = a[12]; - x6i = a[13]; - a[2] = x4r; - a[3] = x4i; - a[6] = x6r; - a[7] = x6i; - a[8] = x1r; - a[9] = x1i; - a[12] = x3r; - a[13] = x3i; -} - - -void bitrv208neg(double *a) -{ - double x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, - x5r, x5i, x6r, x6i, x7r, x7i; - - x1r = a[2]; - x1i = a[3]; - x2r = a[4]; - x2i = a[5]; - x3r = a[6]; - x3i = a[7]; - x4r = a[8]; - x4i = a[9]; - x5r = a[10]; - x5i = a[11]; - x6r = a[12]; - x6i = a[13]; - x7r = a[14]; - x7i = a[15]; - a[2] = x7r; - a[3] = x7i; - a[4] = x3r; - a[5] = x3i; - a[6] = x5r; - a[7] = x5i; - a[8] = x1r; - a[9] = x1i; - a[10] = x6r; - a[11] = x6i; - a[12] = x2r; - a[13] = x2i; - a[14] = x4r; - a[15] = x4i; -} - - -void cftf1st(int n, double *a, double *w) -{ - int j, j0, j1, j2, j3, k, m, mh; - double wn4r, csc1, csc3, wk1r, wk1i, wk3r, wk3i, - wd1r, wd1i, wd3r, wd3i; - double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, - y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i; - - mh = n >> 3; - m = 2 * mh; - j1 = m; - j2 = j1 + m; - j3 = j2 + m; - x0r = a[0] + a[j2]; - x0i = a[1] + a[j2 + 1]; - x1r = a[0] - a[j2]; - x1i = a[1] - a[j2 + 1]; - x2r = a[j1] + a[j3]; - x2i = a[j1 + 1] + a[j3 + 1]; - x3r = a[j1] - a[j3]; - x3i = a[j1 + 1] - a[j3 + 1]; - a[0] = x0r + x2r; - a[1] = x0i + x2i; - a[j1] = x0r - x2r; - a[j1 + 1] = x0i - x2i; - a[j2] = x1r - x3i; - a[j2 + 1] = x1i + x3r; - a[j3] = x1r + x3i; - a[j3 + 1] = x1i - x3r; - wn4r = w[1]; - csc1 = w[2]; - csc3 = w[3]; - wd1r = 1; - wd1i = 0; - wd3r = 1; - wd3i = 0; - k = 0; - for (j = 2; j < mh - 2; j += 4) { - k += 4; - wk1r = csc1 * (wd1r + w[k]); - wk1i = csc1 * (wd1i + w[k + 1]); - wk3r = csc3 * (wd3r + w[k + 2]); - wk3i = csc3 * (wd3i + w[k + 3]); - wd1r = w[k]; - wd1i = w[k + 1]; - wd3r = w[k + 2]; - wd3i = w[k + 3]; - j1 = j + m; - j2 = j1 + m; - j3 = j2 + m; - x0r = a[j] + a[j2]; - x0i = a[j + 1] + a[j2 + 1]; - x1r = a[j] - a[j2]; - x1i = a[j + 1] - a[j2 + 1]; - y0r = a[j + 2] + a[j2 + 2]; - y0i = a[j + 3] + a[j2 + 3]; - y1r = a[j + 2] - a[j2 + 2]; - y1i = a[j + 3] - a[j2 + 3]; - x2r = a[j1] + a[j3]; - x2i = a[j1 + 1] + a[j3 + 1]; - x3r = a[j1] - a[j3]; - x3i = a[j1 + 1] - a[j3 + 1]; - y2r = a[j1 + 2] + a[j3 + 2]; - y2i = a[j1 + 3] + a[j3 + 3]; - y3r = a[j1 + 2] - a[j3 + 2]; - y3i = a[j1 + 3] - a[j3 + 3]; - a[j] = x0r + x2r; - a[j + 1] = x0i + x2i; - a[j + 2] = y0r + y2r; - a[j + 3] = y0i + y2i; - a[j1] = x0r - x2r; - a[j1 + 1] = x0i - x2i; - a[j1 + 2] = y0r - y2r; - a[j1 + 3] = y0i - y2i; - x0r = x1r - x3i; - x0i = x1i + x3r; - a[j2] = wk1r * x0r - wk1i * x0i; - a[j2 + 1] = wk1r * x0i + wk1i * x0r; - x0r = y1r - y3i; - x0i = y1i + y3r; - a[j2 + 2] = wd1r * x0r - wd1i * x0i; - a[j2 + 3] = wd1r * x0i + wd1i * x0r; - x0r = x1r + x3i; - x0i = x1i - x3r; - a[j3] = wk3r * x0r + wk3i * x0i; - a[j3 + 1] = wk3r * x0i - wk3i * x0r; - x0r = y1r + y3i; - x0i = y1i - y3r; - a[j3 + 2] = wd3r * x0r + wd3i * x0i; - a[j3 + 3] = wd3r * x0i - wd3i * x0r; - j0 = m - j; - j1 = j0 + m; - j2 = j1 + m; - j3 = j2 + m; - x0r = a[j0] + a[j2]; - x0i = a[j0 + 1] + a[j2 + 1]; - x1r = a[j0] - a[j2]; - x1i = a[j0 + 1] - a[j2 + 1]; - y0r = a[j0 - 2] + a[j2 - 2]; - y0i = a[j0 - 1] + a[j2 - 1]; - y1r = a[j0 - 2] - a[j2 - 2]; - y1i = a[j0 - 1] - a[j2 - 1]; - x2r = a[j1] + a[j3]; - x2i = a[j1 + 1] + a[j3 + 1]; - x3r = a[j1] - a[j3]; - x3i = a[j1 + 1] - a[j3 + 1]; - y2r = a[j1 - 2] + a[j3 - 2]; - y2i = a[j1 - 1] + a[j3 - 1]; - y3r = a[j1 - 2] - a[j3 - 2]; - y3i = a[j1 - 1] - a[j3 - 1]; - a[j0] = x0r + x2r; - a[j0 + 1] = x0i + x2i; - a[j0 - 2] = y0r + y2r; - a[j0 - 1] = y0i + y2i; - a[j1] = x0r - x2r; - a[j1 + 1] = x0i - x2i; - a[j1 - 2] = y0r - y2r; - a[j1 - 1] = y0i - y2i; - x0r = x1r - x3i; - x0i = x1i + x3r; - a[j2] = wk1i * x0r - wk1r * x0i; - a[j2 + 1] = wk1i * x0i + wk1r * x0r; - x0r = y1r - y3i; - x0i = y1i + y3r; - a[j2 - 2] = wd1i * x0r - wd1r * x0i; - a[j2 - 1] = wd1i * x0i + wd1r * x0r; - x0r = x1r + x3i; - x0i = x1i - x3r; - a[j3] = wk3i * x0r + wk3r * x0i; - a[j3 + 1] = wk3i * x0i - wk3r * x0r; - x0r = y1r + y3i; - x0i = y1i - y3r; - a[j3 - 2] = wd3i * x0r + wd3r * x0i; - a[j3 - 1] = wd3i * x0i - wd3r * x0r; - } - wk1r = csc1 * (wd1r + wn4r); - wk1i = csc1 * (wd1i + wn4r); - wk3r = csc3 * (wd3r - wn4r); - wk3i = csc3 * (wd3i - wn4r); - j0 = mh; - j1 = j0 + m; - j2 = j1 + m; - j3 = j2 + m; - x0r = a[j0 - 2] + a[j2 - 2]; - x0i = a[j0 - 1] + a[j2 - 1]; - x1r = a[j0 - 2] - a[j2 - 2]; - x1i = a[j0 - 1] - a[j2 - 1]; - x2r = a[j1 - 2] + a[j3 - 2]; - x2i = a[j1 - 1] + a[j3 - 1]; - x3r = a[j1 - 2] - a[j3 - 2]; - x3i = a[j1 - 1] - a[j3 - 1]; - a[j0 - 2] = x0r + x2r; - a[j0 - 1] = x0i + x2i; - a[j1 - 2] = x0r - x2r; - a[j1 - 1] = x0i - x2i; - x0r = x1r - x3i; - x0i = x1i + x3r; - a[j2 - 2] = wk1r * x0r - wk1i * x0i; - a[j2 - 1] = wk1r * x0i + wk1i * x0r; - x0r = x1r + x3i; - x0i = x1i - x3r; - a[j3 - 2] = wk3r * x0r + wk3i * x0i; - a[j3 - 1] = wk3r * x0i - wk3i * x0r; - x0r = a[j0] + a[j2]; - x0i = a[j0 + 1] + a[j2 + 1]; - x1r = a[j0] - a[j2]; - x1i = a[j0 + 1] - a[j2 + 1]; - x2r = a[j1] + a[j3]; - x2i = a[j1 + 1] + a[j3 + 1]; - x3r = a[j1] - a[j3]; - x3i = a[j1 + 1] - a[j3 + 1]; - a[j0] = x0r + x2r; - a[j0 + 1] = x0i + x2i; - a[j1] = x0r - x2r; - a[j1 + 1] = x0i - x2i; - x0r = x1r - x3i; - x0i = x1i + x3r; - a[j2] = wn4r * (x0r - x0i); - a[j2 + 1] = wn4r * (x0i + x0r); - x0r = x1r + x3i; - x0i = x1i - x3r; - a[j3] = -wn4r * (x0r + x0i); - a[j3 + 1] = -wn4r * (x0i - x0r); - x0r = a[j0 + 2] + a[j2 + 2]; - x0i = a[j0 + 3] + a[j2 + 3]; - x1r = a[j0 + 2] - a[j2 + 2]; - x1i = a[j0 + 3] - a[j2 + 3]; - x2r = a[j1 + 2] + a[j3 + 2]; - x2i = a[j1 + 3] + a[j3 + 3]; - x3r = a[j1 + 2] - a[j3 + 2]; - x3i = a[j1 + 3] - a[j3 + 3]; - a[j0 + 2] = x0r + x2r; - a[j0 + 3] = x0i + x2i; - a[j1 + 2] = x0r - x2r; - a[j1 + 3] = x0i - x2i; - x0r = x1r - x3i; - x0i = x1i + x3r; - a[j2 + 2] = wk1i * x0r - wk1r * x0i; - a[j2 + 3] = wk1i * x0i + wk1r * x0r; - x0r = x1r + x3i; - x0i = x1i - x3r; - a[j3 + 2] = wk3i * x0r + wk3r * x0i; - a[j3 + 3] = wk3i * x0i - wk3r * x0r; -} - - -void cftb1st(int n, double *a, double *w) -{ - int j, j0, j1, j2, j3, k, m, mh; - double wn4r, csc1, csc3, wk1r, wk1i, wk3r, wk3i, - wd1r, wd1i, wd3r, wd3i; - double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, - y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i; - - mh = n >> 3; - m = 2 * mh; - j1 = m; - j2 = j1 + m; - j3 = j2 + m; - x0r = a[0] + a[j2]; - x0i = -a[1] - a[j2 + 1]; - x1r = a[0] - a[j2]; - x1i = -a[1] + a[j2 + 1]; - x2r = a[j1] + a[j3]; - x2i = a[j1 + 1] + a[j3 + 1]; - x3r = a[j1] - a[j3]; - x3i = a[j1 + 1] - a[j3 + 1]; - a[0] = x0r + x2r; - a[1] = x0i - x2i; - a[j1] = x0r - x2r; - a[j1 + 1] = x0i + x2i; - a[j2] = x1r + x3i; - a[j2 + 1] = x1i + x3r; - a[j3] = x1r - x3i; - a[j3 + 1] = x1i - x3r; - wn4r = w[1]; - csc1 = w[2]; - csc3 = w[3]; - wd1r = 1; - wd1i = 0; - wd3r = 1; - wd3i = 0; - k = 0; - for (j = 2; j < mh - 2; j += 4) { - k += 4; - wk1r = csc1 * (wd1r + w[k]); - wk1i = csc1 * (wd1i + w[k + 1]); - wk3r = csc3 * (wd3r + w[k + 2]); - wk3i = csc3 * (wd3i + w[k + 3]); - wd1r = w[k]; - wd1i = w[k + 1]; - wd3r = w[k + 2]; - wd3i = w[k + 3]; - j1 = j + m; - j2 = j1 + m; - j3 = j2 + m; - x0r = a[j] + a[j2]; - x0i = -a[j + 1] - a[j2 + 1]; - x1r = a[j] - a[j2]; - x1i = -a[j + 1] + a[j2 + 1]; - y0r = a[j + 2] + a[j2 + 2]; - y0i = -a[j + 3] - a[j2 + 3]; - y1r = a[j + 2] - a[j2 + 2]; - y1i = -a[j + 3] + a[j2 + 3]; - x2r = a[j1] + a[j3]; - x2i = a[j1 + 1] + a[j3 + 1]; - x3r = a[j1] - a[j3]; - x3i = a[j1 + 1] - a[j3 + 1]; - y2r = a[j1 + 2] + a[j3 + 2]; - y2i = a[j1 + 3] + a[j3 + 3]; - y3r = a[j1 + 2] - a[j3 + 2]; - y3i = a[j1 + 3] - a[j3 + 3]; - a[j] = x0r + x2r; - a[j + 1] = x0i - x2i; - a[j + 2] = y0r + y2r; - a[j + 3] = y0i - y2i; - a[j1] = x0r - x2r; - a[j1 + 1] = x0i + x2i; - a[j1 + 2] = y0r - y2r; - a[j1 + 3] = y0i + y2i; - x0r = x1r + x3i; - x0i = x1i + x3r; - a[j2] = wk1r * x0r - wk1i * x0i; - a[j2 + 1] = wk1r * x0i + wk1i * x0r; - x0r = y1r + y3i; - x0i = y1i + y3r; - a[j2 + 2] = wd1r * x0r - wd1i * x0i; - a[j2 + 3] = wd1r * x0i + wd1i * x0r; - x0r = x1r - x3i; - x0i = x1i - x3r; - a[j3] = wk3r * x0r + wk3i * x0i; - a[j3 + 1] = wk3r * x0i - wk3i * x0r; - x0r = y1r - y3i; - x0i = y1i - y3r; - a[j3 + 2] = wd3r * x0r + wd3i * x0i; - a[j3 + 3] = wd3r * x0i - wd3i * x0r; - j0 = m - j; - j1 = j0 + m; - j2 = j1 + m; - j3 = j2 + m; - x0r = a[j0] + a[j2]; - x0i = -a[j0 + 1] - a[j2 + 1]; - x1r = a[j0] - a[j2]; - x1i = -a[j0 + 1] + a[j2 + 1]; - y0r = a[j0 - 2] + a[j2 - 2]; - y0i = -a[j0 - 1] - a[j2 - 1]; - y1r = a[j0 - 2] - a[j2 - 2]; - y1i = -a[j0 - 1] + a[j2 - 1]; - x2r = a[j1] + a[j3]; - x2i = a[j1 + 1] + a[j3 + 1]; - x3r = a[j1] - a[j3]; - x3i = a[j1 + 1] - a[j3 + 1]; - y2r = a[j1 - 2] + a[j3 - 2]; - y2i = a[j1 - 1] + a[j3 - 1]; - y3r = a[j1 - 2] - a[j3 - 2]; - y3i = a[j1 - 1] - a[j3 - 1]; - a[j0] = x0r + x2r; - a[j0 + 1] = x0i - x2i; - a[j0 - 2] = y0r + y2r; - a[j0 - 1] = y0i - y2i; - a[j1] = x0r - x2r; - a[j1 + 1] = x0i + x2i; - a[j1 - 2] = y0r - y2r; - a[j1 - 1] = y0i + y2i; - x0r = x1r + x3i; - x0i = x1i + x3r; - a[j2] = wk1i * x0r - wk1r * x0i; - a[j2 + 1] = wk1i * x0i + wk1r * x0r; - x0r = y1r + y3i; - x0i = y1i + y3r; - a[j2 - 2] = wd1i * x0r - wd1r * x0i; - a[j2 - 1] = wd1i * x0i + wd1r * x0r; - x0r = x1r - x3i; - x0i = x1i - x3r; - a[j3] = wk3i * x0r + wk3r * x0i; - a[j3 + 1] = wk3i * x0i - wk3r * x0r; - x0r = y1r - y3i; - x0i = y1i - y3r; - a[j3 - 2] = wd3i * x0r + wd3r * x0i; - a[j3 - 1] = wd3i * x0i - wd3r * x0r; - } - wk1r = csc1 * (wd1r + wn4r); - wk1i = csc1 * (wd1i + wn4r); - wk3r = csc3 * (wd3r - wn4r); - wk3i = csc3 * (wd3i - wn4r); - j0 = mh; - j1 = j0 + m; - j2 = j1 + m; - j3 = j2 + m; - x0r = a[j0 - 2] + a[j2 - 2]; - x0i = -a[j0 - 1] - a[j2 - 1]; - x1r = a[j0 - 2] - a[j2 - 2]; - x1i = -a[j0 - 1] + a[j2 - 1]; - x2r = a[j1 - 2] + a[j3 - 2]; - x2i = a[j1 - 1] + a[j3 - 1]; - x3r = a[j1 - 2] - a[j3 - 2]; - x3i = a[j1 - 1] - a[j3 - 1]; - a[j0 - 2] = x0r + x2r; - a[j0 - 1] = x0i - x2i; - a[j1 - 2] = x0r - x2r; - a[j1 - 1] = x0i + x2i; - x0r = x1r + x3i; - x0i = x1i + x3r; - a[j2 - 2] = wk1r * x0r - wk1i * x0i; - a[j2 - 1] = wk1r * x0i + wk1i * x0r; - x0r = x1r - x3i; - x0i = x1i - x3r; - a[j3 - 2] = wk3r * x0r + wk3i * x0i; - a[j3 - 1] = wk3r * x0i - wk3i * x0r; - x0r = a[j0] + a[j2]; - x0i = -a[j0 + 1] - a[j2 + 1]; - x1r = a[j0] - a[j2]; - x1i = -a[j0 + 1] + a[j2 + 1]; - x2r = a[j1] + a[j3]; - x2i = a[j1 + 1] + a[j3 + 1]; - x3r = a[j1] - a[j3]; - x3i = a[j1 + 1] - a[j3 + 1]; - a[j0] = x0r + x2r; - a[j0 + 1] = x0i - x2i; - a[j1] = x0r - x2r; - a[j1 + 1] = x0i + x2i; - x0r = x1r + x3i; - x0i = x1i + x3r; - a[j2] = wn4r * (x0r - x0i); - a[j2 + 1] = wn4r * (x0i + x0r); - x0r = x1r - x3i; - x0i = x1i - x3r; - a[j3] = -wn4r * (x0r + x0i); - a[j3 + 1] = -wn4r * (x0i - x0r); - x0r = a[j0 + 2] + a[j2 + 2]; - x0i = -a[j0 + 3] - a[j2 + 3]; - x1r = a[j0 + 2] - a[j2 + 2]; - x1i = -a[j0 + 3] + a[j2 + 3]; - x2r = a[j1 + 2] + a[j3 + 2]; - x2i = a[j1 + 3] + a[j3 + 3]; - x3r = a[j1 + 2] - a[j3 + 2]; - x3i = a[j1 + 3] - a[j3 + 3]; - a[j0 + 2] = x0r + x2r; - a[j0 + 3] = x0i - x2i; - a[j1 + 2] = x0r - x2r; - a[j1 + 3] = x0i + x2i; - x0r = x1r + x3i; - x0i = x1i + x3r; - a[j2 + 2] = wk1i * x0r - wk1r * x0i; - a[j2 + 3] = wk1i * x0i + wk1r * x0r; - x0r = x1r - x3i; - x0i = x1i - x3r; - a[j3 + 2] = wk3i * x0r + wk3r * x0i; - a[j3 + 3] = wk3i * x0i - wk3r * x0r; -} - - -#ifdef USE_CDFT_THREADS -struct cdft_arg_st { - int n0; - int n; - double *a; - int nw; - double *w; -}; -typedef struct cdft_arg_st cdft_arg_t; - - -void cftrec4_th(int n, double *a, int nw, double *w) -{ - void *cftrec1_th(void *p); - void *cftrec2_th(void *p); - int i, idiv4, m, nthread; - cdft_thread_t th[4]; - cdft_arg_t ag[4]; - - nthread = 2; - idiv4 = 0; - m = n >> 1; - if (n > CDFT_4THREADS_BEGIN_N) { - nthread = 4; - idiv4 = 1; - m >>= 1; - } - for (i = 0; i < nthread; i++) { - ag[i].n0 = n; - ag[i].n = m; - ag[i].a = &a[i * m]; - ag[i].nw = nw; - ag[i].w = w; - if (i != idiv4) { - cdft_thread_create(&th[i], cftrec1_th, &ag[i]); - } else { - cdft_thread_create(&th[i], cftrec2_th, &ag[i]); - } - } - for (i = 0; i < nthread; i++) { - cdft_thread_wait(th[i]); - } -} - - -void *cftrec1_th(void *p) -{ - int cfttree(int n, int j, int k, double *a, int nw, double *w); - void cftleaf(int n, int isplt, double *a, int nw, double *w); - void cftmdl1(int n, double *a, double *w); - int isplt, j, k, m, n, n0, nw; - double *a, *w; - - n0 = ((cdft_arg_t *) p)->n0; - n = ((cdft_arg_t *) p)->n; - a = ((cdft_arg_t *) p)->a; - nw = ((cdft_arg_t *) p)->nw; - w = ((cdft_arg_t *) p)->w; - m = n0; - while (m > 512) { - m >>= 2; - cftmdl1(m, &a[n - m], &w[nw - (m >> 1)]); - } - cftleaf(m, 1, &a[n - m], nw, w); - k = 0; - for (j = n - m; j > 0; j -= m) { - k++; - isplt = cfttree(m, j, k, a, nw, w); - cftleaf(m, isplt, &a[j - m], nw, w); - } - return (void *) 0; -} - - -void *cftrec2_th(void *p) -{ - int cfttree(int n, int j, int k, double *a, int nw, double *w); - void cftleaf(int n, int isplt, double *a, int nw, double *w); - void cftmdl2(int n, double *a, double *w); - int isplt, j, k, m, n, n0, nw; - double *a, *w; - - n0 = ((cdft_arg_t *) p)->n0; - n = ((cdft_arg_t *) p)->n; - a = ((cdft_arg_t *) p)->a; - nw = ((cdft_arg_t *) p)->nw; - w = ((cdft_arg_t *) p)->w; - k = 1; - m = n0; - while (m > 512) { - m >>= 2; - k <<= 2; - cftmdl2(m, &a[n - m], &w[nw - m]); - } - cftleaf(m, 0, &a[n - m], nw, w); - k >>= 1; - for (j = n - m; j > 0; j -= m) { - k++; - isplt = cfttree(m, j, k, a, nw, w); - cftleaf(m, isplt, &a[j - m], nw, w); - } - return (void *) 0; -} -#endif /* USE_CDFT_THREADS */ - - -void cftrec4(int n, double *a, int nw, double *w) -{ - int cfttree(int n, int j, int k, double *a, int nw, double *w); - void cftleaf(int n, int isplt, double *a, int nw, double *w); - void cftmdl1(int n, double *a, double *w); - int isplt, j, k, m; - - m = n; - while (m > 512) { - m >>= 2; - cftmdl1(m, &a[n - m], &w[nw - (m >> 1)]); - } - cftleaf(m, 1, &a[n - m], nw, w); - k = 0; - for (j = n - m; j > 0; j -= m) { - k++; - isplt = cfttree(m, j, k, a, nw, w); - cftleaf(m, isplt, &a[j - m], nw, w); - } -} - - -int cfttree(int n, int j, int k, double *a, int nw, double *w) -{ - void cftmdl1(int n, double *a, double *w); - void cftmdl2(int n, double *a, double *w); - int i, isplt, m; - - if ((k & 3) != 0) { - isplt = k & 1; - if (isplt != 0) { - cftmdl1(n, &a[j - n], &w[nw - (n >> 1)]); - } else { - cftmdl2(n, &a[j - n], &w[nw - n]); - } - } else { - m = n; - for (i = k; (i & 3) == 0; i >>= 2) { - m <<= 2; - } - isplt = i & 1; - if (isplt != 0) { - while (m > 128) { - cftmdl1(m, &a[j - m], &w[nw - (m >> 1)]); - m >>= 2; - } - } else { - while (m > 128) { - cftmdl2(m, &a[j - m], &w[nw - m]); - m >>= 2; - } - } - } - return isplt; -} - - -void cftleaf(int n, int isplt, double *a, int nw, double *w) -{ - void cftmdl1(int n, double *a, double *w); - void cftmdl2(int n, double *a, double *w); - void cftf161(double *a, double *w); - void cftf162(double *a, double *w); - void cftf081(double *a, double *w); - void cftf082(double *a, double *w); - - if (n == 512) { - cftmdl1(128, a, &w[nw - 64]); - cftf161(a, &w[nw - 8]); - cftf162(&a[32], &w[nw - 32]); - cftf161(&a[64], &w[nw - 8]); - cftf161(&a[96], &w[nw - 8]); - cftmdl2(128, &a[128], &w[nw - 128]); - cftf161(&a[128], &w[nw - 8]); - cftf162(&a[160], &w[nw - 32]); - cftf161(&a[192], &w[nw - 8]); - cftf162(&a[224], &w[nw - 32]); - cftmdl1(128, &a[256], &w[nw - 64]); - cftf161(&a[256], &w[nw - 8]); - cftf162(&a[288], &w[nw - 32]); - cftf161(&a[320], &w[nw - 8]); - cftf161(&a[352], &w[nw - 8]); - if (isplt != 0) { - cftmdl1(128, &a[384], &w[nw - 64]); - cftf161(&a[480], &w[nw - 8]); - } else { - cftmdl2(128, &a[384], &w[nw - 128]); - cftf162(&a[480], &w[nw - 32]); - } - cftf161(&a[384], &w[nw - 8]); - cftf162(&a[416], &w[nw - 32]); - cftf161(&a[448], &w[nw - 8]); - } else { - cftmdl1(64, a, &w[nw - 32]); - cftf081(a, &w[nw - 8]); - cftf082(&a[16], &w[nw - 8]); - cftf081(&a[32], &w[nw - 8]); - cftf081(&a[48], &w[nw - 8]); - cftmdl2(64, &a[64], &w[nw - 64]); - cftf081(&a[64], &w[nw - 8]); - cftf082(&a[80], &w[nw - 8]); - cftf081(&a[96], &w[nw - 8]); - cftf082(&a[112], &w[nw - 8]); - cftmdl1(64, &a[128], &w[nw - 32]); - cftf081(&a[128], &w[nw - 8]); - cftf082(&a[144], &w[nw - 8]); - cftf081(&a[160], &w[nw - 8]); - cftf081(&a[176], &w[nw - 8]); - if (isplt != 0) { - cftmdl1(64, &a[192], &w[nw - 32]); - cftf081(&a[240], &w[nw - 8]); - } else { - cftmdl2(64, &a[192], &w[nw - 64]); - cftf082(&a[240], &w[nw - 8]); - } - cftf081(&a[192], &w[nw - 8]); - cftf082(&a[208], &w[nw - 8]); - cftf081(&a[224], &w[nw - 8]); - } -} - - -void cftmdl1(int n, double *a, double *w) -{ - int j, j0, j1, j2, j3, k, m, mh; - double wn4r, wk1r, wk1i, wk3r, wk3i; - double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; - - mh = n >> 3; - m = 2 * mh; - j1 = m; - j2 = j1 + m; - j3 = j2 + m; - x0r = a[0] + a[j2]; - x0i = a[1] + a[j2 + 1]; - x1r = a[0] - a[j2]; - x1i = a[1] - a[j2 + 1]; - x2r = a[j1] + a[j3]; - x2i = a[j1 + 1] + a[j3 + 1]; - x3r = a[j1] - a[j3]; - x3i = a[j1 + 1] - a[j3 + 1]; - a[0] = x0r + x2r; - a[1] = x0i + x2i; - a[j1] = x0r - x2r; - a[j1 + 1] = x0i - x2i; - a[j2] = x1r - x3i; - a[j2 + 1] = x1i + x3r; - a[j3] = x1r + x3i; - a[j3 + 1] = x1i - x3r; - wn4r = w[1]; - k = 0; - for (j = 2; j < mh; j += 2) { - k += 4; - wk1r = w[k]; - wk1i = w[k + 1]; - wk3r = w[k + 2]; - wk3i = w[k + 3]; - j1 = j + m; - j2 = j1 + m; - j3 = j2 + m; - x0r = a[j] + a[j2]; - x0i = a[j + 1] + a[j2 + 1]; - x1r = a[j] - a[j2]; - x1i = a[j + 1] - a[j2 + 1]; - x2r = a[j1] + a[j3]; - x2i = a[j1 + 1] + a[j3 + 1]; - x3r = a[j1] - a[j3]; - x3i = a[j1 + 1] - a[j3 + 1]; - a[j] = x0r + x2r; - a[j + 1] = x0i + x2i; - a[j1] = x0r - x2r; - a[j1 + 1] = x0i - x2i; - x0r = x1r - x3i; - x0i = x1i + x3r; - a[j2] = wk1r * x0r - wk1i * x0i; - a[j2 + 1] = wk1r * x0i + wk1i * x0r; - x0r = x1r + x3i; - x0i = x1i - x3r; - a[j3] = wk3r * x0r + wk3i * x0i; - a[j3 + 1] = wk3r * x0i - wk3i * x0r; - j0 = m - j; - j1 = j0 + m; - j2 = j1 + m; - j3 = j2 + m; - x0r = a[j0] + a[j2]; - x0i = a[j0 + 1] + a[j2 + 1]; - x1r = a[j0] - a[j2]; - x1i = a[j0 + 1] - a[j2 + 1]; - x2r = a[j1] + a[j3]; - x2i = a[j1 + 1] + a[j3 + 1]; - x3r = a[j1] - a[j3]; - x3i = a[j1 + 1] - a[j3 + 1]; - a[j0] = x0r + x2r; - a[j0 + 1] = x0i + x2i; - a[j1] = x0r - x2r; - a[j1 + 1] = x0i - x2i; - x0r = x1r - x3i; - x0i = x1i + x3r; - a[j2] = wk1i * x0r - wk1r * x0i; - a[j2 + 1] = wk1i * x0i + wk1r * x0r; - x0r = x1r + x3i; - x0i = x1i - x3r; - a[j3] = wk3i * x0r + wk3r * x0i; - a[j3 + 1] = wk3i * x0i - wk3r * x0r; - } - j0 = mh; - j1 = j0 + m; - j2 = j1 + m; - j3 = j2 + m; - x0r = a[j0] + a[j2]; - x0i = a[j0 + 1] + a[j2 + 1]; - x1r = a[j0] - a[j2]; - x1i = a[j0 + 1] - a[j2 + 1]; - x2r = a[j1] + a[j3]; - x2i = a[j1 + 1] + a[j3 + 1]; - x3r = a[j1] - a[j3]; - x3i = a[j1 + 1] - a[j3 + 1]; - a[j0] = x0r + x2r; - a[j0 + 1] = x0i + x2i; - a[j1] = x0r - x2r; - a[j1 + 1] = x0i - x2i; - x0r = x1r - x3i; - x0i = x1i + x3r; - a[j2] = wn4r * (x0r - x0i); - a[j2 + 1] = wn4r * (x0i + x0r); - x0r = x1r + x3i; - x0i = x1i - x3r; - a[j3] = -wn4r * (x0r + x0i); - a[j3 + 1] = -wn4r * (x0i - x0r); -} - - -void cftmdl2(int n, double *a, double *w) -{ - int j, j0, j1, j2, j3, k, kr, m, mh; - double wn4r, wk1r, wk1i, wk3r, wk3i, wd1r, wd1i, wd3r, wd3i; - double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, y0r, y0i, y2r, y2i; - - mh = n >> 3; - m = 2 * mh; - wn4r = w[1]; - j1 = m; - j2 = j1 + m; - j3 = j2 + m; - x0r = a[0] - a[j2 + 1]; - x0i = a[1] + a[j2]; - x1r = a[0] + a[j2 + 1]; - x1i = a[1] - a[j2]; - x2r = a[j1] - a[j3 + 1]; - x2i = a[j1 + 1] + a[j3]; - x3r = a[j1] + a[j3 + 1]; - x3i = a[j1 + 1] - a[j3]; - y0r = wn4r * (x2r - x2i); - y0i = wn4r * (x2i + x2r); - a[0] = x0r + y0r; - a[1] = x0i + y0i; - a[j1] = x0r - y0r; - a[j1 + 1] = x0i - y0i; - y0r = wn4r * (x3r - x3i); - y0i = wn4r * (x3i + x3r); - a[j2] = x1r - y0i; - a[j2 + 1] = x1i + y0r; - a[j3] = x1r + y0i; - a[j3 + 1] = x1i - y0r; - k = 0; - kr = 2 * m; - for (j = 2; j < mh; j += 2) { - k += 4; - wk1r = w[k]; - wk1i = w[k + 1]; - wk3r = w[k + 2]; - wk3i = w[k + 3]; - kr -= 4; - wd1i = w[kr]; - wd1r = w[kr + 1]; - wd3i = w[kr + 2]; - wd3r = w[kr + 3]; - j1 = j + m; - j2 = j1 + m; - j3 = j2 + m; - x0r = a[j] - a[j2 + 1]; - x0i = a[j + 1] + a[j2]; - x1r = a[j] + a[j2 + 1]; - x1i = a[j + 1] - a[j2]; - x2r = a[j1] - a[j3 + 1]; - x2i = a[j1 + 1] + a[j3]; - x3r = a[j1] + a[j3 + 1]; - x3i = a[j1 + 1] - a[j3]; - y0r = wk1r * x0r - wk1i * x0i; - y0i = wk1r * x0i + wk1i * x0r; - y2r = wd1r * x2r - wd1i * x2i; - y2i = wd1r * x2i + wd1i * x2r; - a[j] = y0r + y2r; - a[j + 1] = y0i + y2i; - a[j1] = y0r - y2r; - a[j1 + 1] = y0i - y2i; - y0r = wk3r * x1r + wk3i * x1i; - y0i = wk3r * x1i - wk3i * x1r; - y2r = wd3r * x3r + wd3i * x3i; - y2i = wd3r * x3i - wd3i * x3r; - a[j2] = y0r + y2r; - a[j2 + 1] = y0i + y2i; - a[j3] = y0r - y2r; - a[j3 + 1] = y0i - y2i; - j0 = m - j; - j1 = j0 + m; - j2 = j1 + m; - j3 = j2 + m; - x0r = a[j0] - a[j2 + 1]; - x0i = a[j0 + 1] + a[j2]; - x1r = a[j0] + a[j2 + 1]; - x1i = a[j0 + 1] - a[j2]; - x2r = a[j1] - a[j3 + 1]; - x2i = a[j1 + 1] + a[j3]; - x3r = a[j1] + a[j3 + 1]; - x3i = a[j1 + 1] - a[j3]; - y0r = wd1i * x0r - wd1r * x0i; - y0i = wd1i * x0i + wd1r * x0r; - y2r = wk1i * x2r - wk1r * x2i; - y2i = wk1i * x2i + wk1r * x2r; - a[j0] = y0r + y2r; - a[j0 + 1] = y0i + y2i; - a[j1] = y0r - y2r; - a[j1 + 1] = y0i - y2i; - y0r = wd3i * x1r + wd3r * x1i; - y0i = wd3i * x1i - wd3r * x1r; - y2r = wk3i * x3r + wk3r * x3i; - y2i = wk3i * x3i - wk3r * x3r; - a[j2] = y0r + y2r; - a[j2 + 1] = y0i + y2i; - a[j3] = y0r - y2r; - a[j3 + 1] = y0i - y2i; - } - wk1r = w[m]; - wk1i = w[m + 1]; - j0 = mh; - j1 = j0 + m; - j2 = j1 + m; - j3 = j2 + m; - x0r = a[j0] - a[j2 + 1]; - x0i = a[j0 + 1] + a[j2]; - x1r = a[j0] + a[j2 + 1]; - x1i = a[j0 + 1] - a[j2]; - x2r = a[j1] - a[j3 + 1]; - x2i = a[j1 + 1] + a[j3]; - x3r = a[j1] + a[j3 + 1]; - x3i = a[j1 + 1] - a[j3]; - y0r = wk1r * x0r - wk1i * x0i; - y0i = wk1r * x0i + wk1i * x0r; - y2r = wk1i * x2r - wk1r * x2i; - y2i = wk1i * x2i + wk1r * x2r; - a[j0] = y0r + y2r; - a[j0 + 1] = y0i + y2i; - a[j1] = y0r - y2r; - a[j1 + 1] = y0i - y2i; - y0r = wk1i * x1r - wk1r * x1i; - y0i = wk1i * x1i + wk1r * x1r; - y2r = wk1r * x3r - wk1i * x3i; - y2i = wk1r * x3i + wk1i * x3r; - a[j2] = y0r - y2r; - a[j2 + 1] = y0i - y2i; - a[j3] = y0r + y2r; - a[j3 + 1] = y0i + y2i; -} - - -void cftfx41(int n, double *a, int nw, double *w) -{ - void cftf161(double *a, double *w); - void cftf162(double *a, double *w); - void cftf081(double *a, double *w); - void cftf082(double *a, double *w); - - if (n == 128) { - cftf161(a, &w[nw - 8]); - cftf162(&a[32], &w[nw - 32]); - cftf161(&a[64], &w[nw - 8]); - cftf161(&a[96], &w[nw - 8]); - } else { - cftf081(a, &w[nw - 8]); - cftf082(&a[16], &w[nw - 8]); - cftf081(&a[32], &w[nw - 8]); - cftf081(&a[48], &w[nw - 8]); - } -} - - -void cftf161(double *a, double *w) -{ - double wn4r, wk1r, wk1i, - x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, - y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, - y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i, - y8r, y8i, y9r, y9i, y10r, y10i, y11r, y11i, - y12r, y12i, y13r, y13i, y14r, y14i, y15r, y15i; - - wn4r = w[1]; - wk1r = w[2]; - wk1i = w[3]; - x0r = a[0] + a[16]; - x0i = a[1] + a[17]; - x1r = a[0] - a[16]; - x1i = a[1] - a[17]; - x2r = a[8] + a[24]; - x2i = a[9] + a[25]; - x3r = a[8] - a[24]; - x3i = a[9] - a[25]; - y0r = x0r + x2r; - y0i = x0i + x2i; - y4r = x0r - x2r; - y4i = x0i - x2i; - y8r = x1r - x3i; - y8i = x1i + x3r; - y12r = x1r + x3i; - y12i = x1i - x3r; - x0r = a[2] + a[18]; - x0i = a[3] + a[19]; - x1r = a[2] - a[18]; - x1i = a[3] - a[19]; - x2r = a[10] + a[26]; - x2i = a[11] + a[27]; - x3r = a[10] - a[26]; - x3i = a[11] - a[27]; - y1r = x0r + x2r; - y1i = x0i + x2i; - y5r = x0r - x2r; - y5i = x0i - x2i; - x0r = x1r - x3i; - x0i = x1i + x3r; - y9r = wk1r * x0r - wk1i * x0i; - y9i = wk1r * x0i + wk1i * x0r; - x0r = x1r + x3i; - x0i = x1i - x3r; - y13r = wk1i * x0r - wk1r * x0i; - y13i = wk1i * x0i + wk1r * x0r; - x0r = a[4] + a[20]; - x0i = a[5] + a[21]; - x1r = a[4] - a[20]; - x1i = a[5] - a[21]; - x2r = a[12] + a[28]; - x2i = a[13] + a[29]; - x3r = a[12] - a[28]; - x3i = a[13] - a[29]; - y2r = x0r + x2r; - y2i = x0i + x2i; - y6r = x0r - x2r; - y6i = x0i - x2i; - x0r = x1r - x3i; - x0i = x1i + x3r; - y10r = wn4r * (x0r - x0i); - y10i = wn4r * (x0i + x0r); - x0r = x1r + x3i; - x0i = x1i - x3r; - y14r = wn4r * (x0r + x0i); - y14i = wn4r * (x0i - x0r); - x0r = a[6] + a[22]; - x0i = a[7] + a[23]; - x1r = a[6] - a[22]; - x1i = a[7] - a[23]; - x2r = a[14] + a[30]; - x2i = a[15] + a[31]; - x3r = a[14] - a[30]; - x3i = a[15] - a[31]; - y3r = x0r + x2r; - y3i = x0i + x2i; - y7r = x0r - x2r; - y7i = x0i - x2i; - x0r = x1r - x3i; - x0i = x1i + x3r; - y11r = wk1i * x0r - wk1r * x0i; - y11i = wk1i * x0i + wk1r * x0r; - x0r = x1r + x3i; - x0i = x1i - x3r; - y15r = wk1r * x0r - wk1i * x0i; - y15i = wk1r * x0i + wk1i * x0r; - x0r = y12r - y14r; - x0i = y12i - y14i; - x1r = y12r + y14r; - x1i = y12i + y14i; - x2r = y13r - y15r; - x2i = y13i - y15i; - x3r = y13r + y15r; - x3i = y13i + y15i; - a[24] = x0r + x2r; - a[25] = x0i + x2i; - a[26] = x0r - x2r; - a[27] = x0i - x2i; - a[28] = x1r - x3i; - a[29] = x1i + x3r; - a[30] = x1r + x3i; - a[31] = x1i - x3r; - x0r = y8r + y10r; - x0i = y8i + y10i; - x1r = y8r - y10r; - x1i = y8i - y10i; - x2r = y9r + y11r; - x2i = y9i + y11i; - x3r = y9r - y11r; - x3i = y9i - y11i; - a[16] = x0r + x2r; - a[17] = x0i + x2i; - a[18] = x0r - x2r; - a[19] = x0i - x2i; - a[20] = x1r - x3i; - a[21] = x1i + x3r; - a[22] = x1r + x3i; - a[23] = x1i - x3r; - x0r = y5r - y7i; - x0i = y5i + y7r; - x2r = wn4r * (x0r - x0i); - x2i = wn4r * (x0i + x0r); - x0r = y5r + y7i; - x0i = y5i - y7r; - x3r = wn4r * (x0r - x0i); - x3i = wn4r * (x0i + x0r); - x0r = y4r - y6i; - x0i = y4i + y6r; - x1r = y4r + y6i; - x1i = y4i - y6r; - a[8] = x0r + x2r; - a[9] = x0i + x2i; - a[10] = x0r - x2r; - a[11] = x0i - x2i; - a[12] = x1r - x3i; - a[13] = x1i + x3r; - a[14] = x1r + x3i; - a[15] = x1i - x3r; - x0r = y0r + y2r; - x0i = y0i + y2i; - x1r = y0r - y2r; - x1i = y0i - y2i; - x2r = y1r + y3r; - x2i = y1i + y3i; - x3r = y1r - y3r; - x3i = y1i - y3i; - a[0] = x0r + x2r; - a[1] = x0i + x2i; - a[2] = x0r - x2r; - a[3] = x0i - x2i; - a[4] = x1r - x3i; - a[5] = x1i + x3r; - a[6] = x1r + x3i; - a[7] = x1i - x3r; -} - - -void cftf162(double *a, double *w) -{ - double wn4r, wk1r, wk1i, wk2r, wk2i, wk3r, wk3i, - x0r, x0i, x1r, x1i, x2r, x2i, - y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, - y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i, - y8r, y8i, y9r, y9i, y10r, y10i, y11r, y11i, - y12r, y12i, y13r, y13i, y14r, y14i, y15r, y15i; - - wn4r = w[1]; - wk1r = w[4]; - wk1i = w[5]; - wk3r = w[6]; - wk3i = -w[7]; - wk2r = w[8]; - wk2i = w[9]; - x1r = a[0] - a[17]; - x1i = a[1] + a[16]; - x0r = a[8] - a[25]; - x0i = a[9] + a[24]; - x2r = wn4r * (x0r - x0i); - x2i = wn4r * (x0i + x0r); - y0r = x1r + x2r; - y0i = x1i + x2i; - y4r = x1r - x2r; - y4i = x1i - x2i; - x1r = a[0] + a[17]; - x1i = a[1] - a[16]; - x0r = a[8] + a[25]; - x0i = a[9] - a[24]; - x2r = wn4r * (x0r - x0i); - x2i = wn4r * (x0i + x0r); - y8r = x1r - x2i; - y8i = x1i + x2r; - y12r = x1r + x2i; - y12i = x1i - x2r; - x0r = a[2] - a[19]; - x0i = a[3] + a[18]; - x1r = wk1r * x0r - wk1i * x0i; - x1i = wk1r * x0i + wk1i * x0r; - x0r = a[10] - a[27]; - x0i = a[11] + a[26]; - x2r = wk3i * x0r - wk3r * x0i; - x2i = wk3i * x0i + wk3r * x0r; - y1r = x1r + x2r; - y1i = x1i + x2i; - y5r = x1r - x2r; - y5i = x1i - x2i; - x0r = a[2] + a[19]; - x0i = a[3] - a[18]; - x1r = wk3r * x0r - wk3i * x0i; - x1i = wk3r * x0i + wk3i * x0r; - x0r = a[10] + a[27]; - x0i = a[11] - a[26]; - x2r = wk1r * x0r + wk1i * x0i; - x2i = wk1r * x0i - wk1i * x0r; - y9r = x1r - x2r; - y9i = x1i - x2i; - y13r = x1r + x2r; - y13i = x1i + x2i; - x0r = a[4] - a[21]; - x0i = a[5] + a[20]; - x1r = wk2r * x0r - wk2i * x0i; - x1i = wk2r * x0i + wk2i * x0r; - x0r = a[12] - a[29]; - x0i = a[13] + a[28]; - x2r = wk2i * x0r - wk2r * x0i; - x2i = wk2i * x0i + wk2r * x0r; - y2r = x1r + x2r; - y2i = x1i + x2i; - y6r = x1r - x2r; - y6i = x1i - x2i; - x0r = a[4] + a[21]; - x0i = a[5] - a[20]; - x1r = wk2i * x0r - wk2r * x0i; - x1i = wk2i * x0i + wk2r * x0r; - x0r = a[12] + a[29]; - x0i = a[13] - a[28]; - x2r = wk2r * x0r - wk2i * x0i; - x2i = wk2r * x0i + wk2i * x0r; - y10r = x1r - x2r; - y10i = x1i - x2i; - y14r = x1r + x2r; - y14i = x1i + x2i; - x0r = a[6] - a[23]; - x0i = a[7] + a[22]; - x1r = wk3r * x0r - wk3i * x0i; - x1i = wk3r * x0i + wk3i * x0r; - x0r = a[14] - a[31]; - x0i = a[15] + a[30]; - x2r = wk1i * x0r - wk1r * x0i; - x2i = wk1i * x0i + wk1r * x0r; - y3r = x1r + x2r; - y3i = x1i + x2i; - y7r = x1r - x2r; - y7i = x1i - x2i; - x0r = a[6] + a[23]; - x0i = a[7] - a[22]; - x1r = wk1i * x0r + wk1r * x0i; - x1i = wk1i * x0i - wk1r * x0r; - x0r = a[14] + a[31]; - x0i = a[15] - a[30]; - x2r = wk3i * x0r - wk3r * x0i; - x2i = wk3i * x0i + wk3r * x0r; - y11r = x1r + x2r; - y11i = x1i + x2i; - y15r = x1r - x2r; - y15i = x1i - x2i; - x1r = y0r + y2r; - x1i = y0i + y2i; - x2r = y1r + y3r; - x2i = y1i + y3i; - a[0] = x1r + x2r; - a[1] = x1i + x2i; - a[2] = x1r - x2r; - a[3] = x1i - x2i; - x1r = y0r - y2r; - x1i = y0i - y2i; - x2r = y1r - y3r; - x2i = y1i - y3i; - a[4] = x1r - x2i; - a[5] = x1i + x2r; - a[6] = x1r + x2i; - a[7] = x1i - x2r; - x1r = y4r - y6i; - x1i = y4i + y6r; - x0r = y5r - y7i; - x0i = y5i + y7r; - x2r = wn4r * (x0r - x0i); - x2i = wn4r * (x0i + x0r); - a[8] = x1r + x2r; - a[9] = x1i + x2i; - a[10] = x1r - x2r; - a[11] = x1i - x2i; - x1r = y4r + y6i; - x1i = y4i - y6r; - x0r = y5r + y7i; - x0i = y5i - y7r; - x2r = wn4r * (x0r - x0i); - x2i = wn4r * (x0i + x0r); - a[12] = x1r - x2i; - a[13] = x1i + x2r; - a[14] = x1r + x2i; - a[15] = x1i - x2r; - x1r = y8r + y10r; - x1i = y8i + y10i; - x2r = y9r - y11r; - x2i = y9i - y11i; - a[16] = x1r + x2r; - a[17] = x1i + x2i; - a[18] = x1r - x2r; - a[19] = x1i - x2i; - x1r = y8r - y10r; - x1i = y8i - y10i; - x2r = y9r + y11r; - x2i = y9i + y11i; - a[20] = x1r - x2i; - a[21] = x1i + x2r; - a[22] = x1r + x2i; - a[23] = x1i - x2r; - x1r = y12r - y14i; - x1i = y12i + y14r; - x0r = y13r + y15i; - x0i = y13i - y15r; - x2r = wn4r * (x0r - x0i); - x2i = wn4r * (x0i + x0r); - a[24] = x1r + x2r; - a[25] = x1i + x2i; - a[26] = x1r - x2r; - a[27] = x1i - x2i; - x1r = y12r + y14i; - x1i = y12i - y14r; - x0r = y13r - y15i; - x0i = y13i + y15r; - x2r = wn4r * (x0r - x0i); - x2i = wn4r * (x0i + x0r); - a[28] = x1r - x2i; - a[29] = x1i + x2r; - a[30] = x1r + x2i; - a[31] = x1i - x2r; -} - - -void cftf081(double *a, double *w) -{ - double wn4r, x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, - y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, - y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i; - - wn4r = w[1]; - x0r = a[0] + a[8]; - x0i = a[1] + a[9]; - x1r = a[0] - a[8]; - x1i = a[1] - a[9]; - x2r = a[4] + a[12]; - x2i = a[5] + a[13]; - x3r = a[4] - a[12]; - x3i = a[5] - a[13]; - y0r = x0r + x2r; - y0i = x0i + x2i; - y2r = x0r - x2r; - y2i = x0i - x2i; - y1r = x1r - x3i; - y1i = x1i + x3r; - y3r = x1r + x3i; - y3i = x1i - x3r; - x0r = a[2] + a[10]; - x0i = a[3] + a[11]; - x1r = a[2] - a[10]; - x1i = a[3] - a[11]; - x2r = a[6] + a[14]; - x2i = a[7] + a[15]; - x3r = a[6] - a[14]; - x3i = a[7] - a[15]; - y4r = x0r + x2r; - y4i = x0i + x2i; - y6r = x0r - x2r; - y6i = x0i - x2i; - x0r = x1r - x3i; - x0i = x1i + x3r; - x2r = x1r + x3i; - x2i = x1i - x3r; - y5r = wn4r * (x0r - x0i); - y5i = wn4r * (x0r + x0i); - y7r = wn4r * (x2r - x2i); - y7i = wn4r * (x2r + x2i); - a[8] = y1r + y5r; - a[9] = y1i + y5i; - a[10] = y1r - y5r; - a[11] = y1i - y5i; - a[12] = y3r - y7i; - a[13] = y3i + y7r; - a[14] = y3r + y7i; - a[15] = y3i - y7r; - a[0] = y0r + y4r; - a[1] = y0i + y4i; - a[2] = y0r - y4r; - a[3] = y0i - y4i; - a[4] = y2r - y6i; - a[5] = y2i + y6r; - a[6] = y2r + y6i; - a[7] = y2i - y6r; -} - - -void cftf082(double *a, double *w) -{ - double wn4r, wk1r, wk1i, x0r, x0i, x1r, x1i, - y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, - y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i; - - wn4r = w[1]; - wk1r = w[2]; - wk1i = w[3]; - y0r = a[0] - a[9]; - y0i = a[1] + a[8]; - y1r = a[0] + a[9]; - y1i = a[1] - a[8]; - x0r = a[4] - a[13]; - x0i = a[5] + a[12]; - y2r = wn4r * (x0r - x0i); - y2i = wn4r * (x0i + x0r); - x0r = a[4] + a[13]; - x0i = a[5] - a[12]; - y3r = wn4r * (x0r - x0i); - y3i = wn4r * (x0i + x0r); - x0r = a[2] - a[11]; - x0i = a[3] + a[10]; - y4r = wk1r * x0r - wk1i * x0i; - y4i = wk1r * x0i + wk1i * x0r; - x0r = a[2] + a[11]; - x0i = a[3] - a[10]; - y5r = wk1i * x0r - wk1r * x0i; - y5i = wk1i * x0i + wk1r * x0r; - x0r = a[6] - a[15]; - x0i = a[7] + a[14]; - y6r = wk1i * x0r - wk1r * x0i; - y6i = wk1i * x0i + wk1r * x0r; - x0r = a[6] + a[15]; - x0i = a[7] - a[14]; - y7r = wk1r * x0r - wk1i * x0i; - y7i = wk1r * x0i + wk1i * x0r; - x0r = y0r + y2r; - x0i = y0i + y2i; - x1r = y4r + y6r; - x1i = y4i + y6i; - a[0] = x0r + x1r; - a[1] = x0i + x1i; - a[2] = x0r - x1r; - a[3] = x0i - x1i; - x0r = y0r - y2r; - x0i = y0i - y2i; - x1r = y4r - y6r; - x1i = y4i - y6i; - a[4] = x0r - x1i; - a[5] = x0i + x1r; - a[6] = x0r + x1i; - a[7] = x0i - x1r; - x0r = y1r - y3i; - x0i = y1i + y3r; - x1r = y5r - y7r; - x1i = y5i - y7i; - a[8] = x0r + x1r; - a[9] = x0i + x1i; - a[10] = x0r - x1r; - a[11] = x0i - x1i; - x0r = y1r + y3i; - x0i = y1i - y3r; - x1r = y5r + y7r; - x1i = y5i + y7i; - a[12] = x0r - x1i; - a[13] = x0i + x1r; - a[14] = x0r + x1i; - a[15] = x0i - x1r; -} - - -void cftf040(double *a) -{ - double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; - - x0r = a[0] + a[4]; - x0i = a[1] + a[5]; - x1r = a[0] - a[4]; - x1i = a[1] - a[5]; - x2r = a[2] + a[6]; - x2i = a[3] + a[7]; - x3r = a[2] - a[6]; - x3i = a[3] - a[7]; - a[0] = x0r + x2r; - a[1] = x0i + x2i; - a[2] = x1r - x3i; - a[3] = x1i + x3r; - a[4] = x0r - x2r; - a[5] = x0i - x2i; - a[6] = x1r + x3i; - a[7] = x1i - x3r; -} - - -void cftb040(double *a) -{ - double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; - - x0r = a[0] + a[4]; - x0i = a[1] + a[5]; - x1r = a[0] - a[4]; - x1i = a[1] - a[5]; - x2r = a[2] + a[6]; - x2i = a[3] + a[7]; - x3r = a[2] - a[6]; - x3i = a[3] - a[7]; - a[0] = x0r + x2r; - a[1] = x0i + x2i; - a[2] = x1r + x3i; - a[3] = x1i - x3r; - a[4] = x0r - x2r; - a[5] = x0i - x2i; - a[6] = x1r - x3i; - a[7] = x1i + x3r; -} - - -void cftx020(double *a) -{ - double x0r, x0i; - - x0r = a[0] - a[2]; - x0i = a[1] - a[3]; - a[0] += a[2]; - a[1] += a[3]; - a[2] = x0r; - a[3] = x0i; -} - - -void rftfsub(int n, double *a, int nc, double *c) -{ - int j, k, kk, ks, m; - double wkr, wki, xr, xi, yr, yi; - - m = n >> 1; - ks = 2 * nc / m; - kk = 0; - for (j = 2; j < m; j += 2) { - k = n - j; - kk += ks; - wkr = 0.5 - c[nc - kk]; - wki = c[kk]; - xr = a[j] - a[k]; - xi = a[j + 1] + a[k + 1]; - yr = wkr * xr - wki * xi; - yi = wkr * xi + wki * xr; - a[j] -= yr; - a[j + 1] -= yi; - a[k] += yr; - a[k + 1] -= yi; - } -} - - -void rftbsub(int n, double *a, int nc, double *c) -{ - int j, k, kk, ks, m; - double wkr, wki, xr, xi, yr, yi; - - m = n >> 1; - ks = 2 * nc / m; - kk = 0; - for (j = 2; j < m; j += 2) { - k = n - j; - kk += ks; - wkr = 0.5 - c[nc - kk]; - wki = c[kk]; - xr = a[j] - a[k]; - xi = a[j + 1] + a[k + 1]; - yr = wkr * xr + wki * xi; - yi = wkr * xi - wki * xr; - a[j] -= yr; - a[j + 1] -= yi; - a[k] += yr; - a[k + 1] -= yi; - } -} - - -void dctsub(int n, double *a, int nc, double *c) -{ - int j, k, kk, ks, m; - double wkr, wki, xr; - - m = n >> 1; - ks = nc / n; - kk = 0; - for (j = 1; j < m; j++) { - k = n - j; - kk += ks; - wkr = c[kk] - c[nc - kk]; - wki = c[kk] + c[nc - kk]; - xr = wki * a[j] - wkr * a[k]; - a[j] = wkr * a[j] + wki * a[k]; - a[k] = xr; - } - a[m] *= c[0]; -} - - -void dstsub(int n, double *a, int nc, double *c) -{ - int j, k, kk, ks, m; - double wkr, wki, xr; - - m = n >> 1; - ks = nc / n; - kk = 0; - for (j = 1; j < m; j++) { - k = n - j; - kk += ks; - wkr = c[kk] - c[nc - kk]; - wki = c[kk] + c[nc - kk]; - xr = wki * a[k] - wkr * a[j]; - a[k] = wkr * a[k] + wki * a[j]; - a[j] = xr; - } - a[m] *= c[0]; -} - diff --git a/modules/visualization/galaktos/fftsg.h b/modules/visualization/galaktos/fftsg.h deleted file mode 100644 index 779f011c14..0000000000 --- a/modules/visualization/galaktos/fftsg.h +++ /dev/null @@ -1,30 +0,0 @@ -/***************************************************************************** - * fftsg.c: - ***************************************************************************** - * Copyright (C) 2004 the VideoLAN team - * $Id$ - * - * Authors: Cyril Deguet - * code from projectM http://xmms-projectm.sourceforge.net - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - - void cdft(int, int, double *, int *, double *); - void rdft(int, int, double *, int *, double *); - void ddct(int, int, double *, int *, double *); - void ddst(int, int, double *, int *, double *); - void dfct(int, double *, double *, int *, double *); - void dfst(int, double *, double *, int *, double *); diff --git a/modules/visualization/galaktos/func.c b/modules/visualization/galaktos/func.c deleted file mode 100644 index 73aa95f667..0000000000 --- a/modules/visualization/galaktos/func.c +++ /dev/null @@ -1,222 +0,0 @@ -/* Function management */ - -#include -#include -#include - -#include "common.h" -#include "fatal.h" - -#include "func_types.h" -#include "func.h" - -#include "splaytree_types.h" -#include "splaytree.h" -#include "tree_types.h" - -#include "builtin_funcs.h" - -/* A splay tree of builtin functions */ -splaytree_t * builtin_func_tree; - -/* Private function prototypes */ -int compare_func(char * name, char * name2); -int insert_func(func_t * name); -void * copy_func_key(char * string); - - -void * copy_func_key(char * string) { - - char * clone_string; - - if ((clone_string = malloc(MAX_TOKEN_SIZE)) == NULL) - return NULL; - - strncpy(clone_string, string, MAX_TOKEN_SIZE-1); - - return (void*)clone_string; -} - - -func_t * create_func (const char * name, double (*func_ptr)(), int num_args) { - - func_t * func; - func = (func_t*)malloc(sizeof(func_t)); - - if (func == NULL) - return NULL; - - - /* Clear name space */ - memset(func->name, 0, MAX_TOKEN_SIZE); - - /* Copy given name into function structure */ - strncpy(func->name, name, MAX_TOKEN_SIZE); - - /* Assign value pointer */ - func->func_ptr = func_ptr; - func->num_args = num_args; - /* Return instantiated function */ - return func; - -} - -/* Initialize the builtin function database. - Should only be necessary once */ -int init_builtin_func_db() { - int retval; - - builtin_func_tree = create_splaytree(compare_string, copy_string, free_string); - - if (builtin_func_tree == NULL) - return OUTOFMEM_ERROR; - - retval = load_all_builtin_func(); - return SUCCESS; -} - - -/* Destroy the builtin function database. - Generally, do this on projectm exit */ -int destroy_builtin_func_db() { - - splay_traverse(free_func, builtin_func_tree); - destroy_splaytree(builtin_func_tree); - return SUCCESS; - -} - -/* Insert a function into the database */ -int insert_func(func_t * func) { - - if (func == NULL) - return ERROR; - - splay_insert(func, func->name, builtin_func_tree); - - return SUCCESS; -} - -/* Frees a function type, real complicated... */ -void free_func(func_t * func) { - free(func); -} - -/* Remove a function from the database */ -int remove_func(func_t * func) { - - if (func == NULL) - return ERROR; - - splay_delete(func->name, builtin_func_tree); - - return SUCCESS; -} - -/* Find a function given its name */ -func_t * find_func(char * name) { - - func_t * func = NULL; - - /* First look in the builtin database */ - func = (func_t *)splay_find(name, builtin_func_tree); - - return func; - -} - -/* Compare string name with function name */ -int compare_func(char * name, char * name2) { - - int cmpval; - - /* Uses string comparison function */ - cmpval = strncmp(name, name2, MAX_TOKEN_SIZE-1); - - return cmpval; -} - -/* Loads a builtin function */ -int load_builtin_func(const char * name, double (*func_ptr)(), int num_args) { - - func_t * func; - int retval; - - /* Create new function */ - func = create_func(name, func_ptr, num_args); - - if (func == NULL) - return OUTOFMEM_ERROR; - - retval = insert_func(func); - - return retval; - -} - -/* Loads all builtin functions */ -int load_all_builtin_func() { - - - if (load_builtin_func("int", int_wrapper, 1) < 0) - return ERROR; - if (load_builtin_func("abs", abs_wrapper, 1) < 0) - return ERROR; - if (load_builtin_func("sin", sin_wrapper, 1) < 0) - return ERROR; - if (load_builtin_func("cos", cos_wrapper, 1) < 0) - return ERROR; - if (load_builtin_func("tan", tan_wrapper, 1) < 0) - return ERROR; - if (load_builtin_func("asin", asin_wrapper, 1) < 0) - return ERROR; - if (load_builtin_func("acos", acos_wrapper, 1) < 0) - return ERROR; - if (load_builtin_func("atan", atan_wrapper, 1) < 0) - return ERROR; - if (load_builtin_func("sqr", sqr_wrapper, 1) < 0) - return ERROR; - if (load_builtin_func("sqrt", sqrt_wrapper, 1) < 0) - return ERROR; - if (load_builtin_func("pow", pow_wrapper, 2) < 0) - return ERROR; - if (load_builtin_func("exp", exp_wrapper, 1) < 0) - return ERROR; - if (load_builtin_func("log", log_wrapper, 1) < 0) - return ERROR; - if (load_builtin_func("log10", log10_wrapper, 1) < 0) - return ERROR; - if (load_builtin_func("sign", sign_wrapper, 1) < 0) - return ERROR; - if (load_builtin_func("min", min_wrapper, 2) < 0) - return ERROR; - if (load_builtin_func("max", max_wrapper, 2) < 0) - return ERROR; - if (load_builtin_func("sigmoid", sigmoid_wrapper, 2) < 0) - return ERROR; - if (load_builtin_func("atan2", atan2_wrapper, 2) < 0) - return ERROR; - if (load_builtin_func("rand", rand_wrapper, 1) < 0) - return ERROR; - if (load_builtin_func("band", band_wrapper, 2) < 0) - return ERROR; - if (load_builtin_func("bor", bor_wrapper, 2) < 0) - return ERROR; - if (load_builtin_func("bnot", bnot_wrapper, 1) < 0) - return ERROR; - if (load_builtin_func("if", if_wrapper, 3) < 0) - return ERROR; - if (load_builtin_func("equal", equal_wrapper, 2) < 0) - return ERROR; - if (load_builtin_func("above", above_wrapper, 2) < 0) - return ERROR; - if (load_builtin_func("below", below_wrapper, 2) < 0) - return ERROR; - if (load_builtin_func("nchoosek", nchoosek_wrapper, 2) < 0) - return ERROR; - if (load_builtin_func("fact", fact_wrapper, 1) < 0) - return ERROR; - - - return SUCCESS; -} diff --git a/modules/visualization/galaktos/func.h b/modules/visualization/galaktos/func.h deleted file mode 100644 index 422012daab..0000000000 --- a/modules/visualization/galaktos/func.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef FUNC_H -#define FUNC_H - -/* Public Prototypes */ -func_t * create_func (const char * name, double (*func_ptr)(), int num_args); -int remove_func(func_t * func); -func_t * find_func(char * name); -int init_builtin_func_db(); -int destroy_builtin_func_db(); -int load_all_builtin_func(); -int load_builtin_func(const char * name, double (*func_ptr)(), int num_args); -void free_func(func_t * func); - -#endif diff --git a/modules/visualization/galaktos/func_types.h b/modules/visualization/galaktos/func_types.h deleted file mode 100644 index dcd758350c..0000000000 --- a/modules/visualization/galaktos/func_types.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef FUNC_TYPES_H -#define FUNC_TYPES_H -#include "common.h" - - -/* Function Type */ -typedef struct FUNC_T { - char name[MAX_TOKEN_SIZE]; - double (*func_ptr)(); - int num_args; -} func_t; - -#endif diff --git a/modules/visualization/galaktos/idle_preset.h b/modules/visualization/galaktos/idle_preset.h deleted file mode 100644 index 38294c8072..0000000000 --- a/modules/visualization/galaktos/idle_preset.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef IDLE_PRESET_H -#include "preset_types.h" -#define IDLE_PRESET_H - -#define IDLE_PRESET_STRING "[idlepreset]\n" - -preset_t * idle_preset; -#endif diff --git a/modules/visualization/galaktos/init_cond.c b/modules/visualization/galaktos/init_cond.c deleted file mode 100644 index 1162d4013f..0000000000 --- a/modules/visualization/galaktos/init_cond.c +++ /dev/null @@ -1,168 +0,0 @@ -/***************************************************************************** - * init_cond.: - ***************************************************************************** - * Copyright (C) 2004 the VideoLAN team - * $Id$ - * - * Authors: Cyril Deguet - * code from projectM http://xmms-projectm.sourceforge.net - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include - -/* Library functions to manipulate initial condition values */ - -#include -#include -#include - -#include "common.h" -#include "fatal.h" - -#include "param_types.h" -#include "expr_types.h" -#include "init_cond_types.h" -#include "init_cond.h" - -#include "splaytree_types.h" -#include "splaytree.h" -char init_cond_string_buffer[STRING_BUFFER_SIZE]; -int init_cond_string_buffer_index = 0; - - -void init_cond_to_string(init_cond_t * init_cond); - -/* Frees initial condition structure */ -void free_init_cond(init_cond_t * init_cond) { - free(init_cond); -} - -/* Evaluate an initial conditon */ -void eval_init_cond(init_cond_t * init_cond) { - - if (init_cond == NULL) - return; - - /* Parameter is of boolean type, either a 1 or 0 value integer */ - - /* Set matrix flag to zero. This ensures - its constant value will be used rather than a matrix value - */ - init_cond->param->matrix_flag = 0; - if (init_cond->param->type == P_TYPE_BOOL) { - if (INIT_COND_DEBUG) printf("init_cond: %s = %d (TYPE BOOL)\n", init_cond->param->name, init_cond->init_val.bool_val); - *((int*)init_cond->param->engine_val) = init_cond->init_val.bool_val; - return; - } - - /* Parameter is an integer type, just like C */ - - if (init_cond->param->type == P_TYPE_INT) { - if (INIT_COND_DEBUG) printf("init_cond: %s = %d (TYPE INT)\n", init_cond->param->name, init_cond->init_val.int_val); - *((int*)init_cond->param->engine_val) = init_cond->init_val.int_val; - return; - } - - /* Parameter is of a double type, just like C */ - - if (init_cond->param->type == P_TYPE_DOUBLE) { - if (INIT_COND_DEBUG) printf("init_cond: %s = %f (TYPE DOUBLE)\n", init_cond->param->name, init_cond->init_val.double_val); - *((double*)init_cond->param->engine_val) = init_cond->init_val.double_val; - return; - } - - /* Unknown type of parameter */ - return; -} - -/* Creates a new initial condition */ -init_cond_t * new_init_cond(param_t * param, value_t init_val) { - - init_cond_t * init_cond; - - init_cond = (init_cond_t*)malloc(sizeof(init_cond_t)); - - if (init_cond == NULL) - return NULL; - - init_cond->param = param; - init_cond->init_val = init_val; - return init_cond; -} - -/* WIP */ -void init_cond_to_string(init_cond_t * init_cond) { - - int string_length; - char string[MAX_TOKEN_SIZE]; - - if (init_cond == NULL) - return; - - /* Create a string "param_name=val" */ - switch (init_cond->param->type) { - lldiv_t div; - - case P_TYPE_BOOL: - sprintf(string, "%s=%d\n", init_cond->param->name, init_cond->init_val.bool_val); - break; - case P_TYPE_INT: - sprintf(string, "%s=%d\n", init_cond->param->name, init_cond->init_val.int_val); - break; - case P_TYPE_DOUBLE: - div = lldiv( init_cond->init_val.double_val * 1000000, - 1000000 ); - sprintf(string, "%s=%"PRId64".%06u\n", init_cond->param->name, div.quot, (unsigned int) div.rem ); - break; - default: - return; - } - - /* Compute the length of the string */ - string_length = strlen(string); - - /* Buffer overflow check */ - if ((init_cond_string_buffer_index + string_length + 1) > (STRING_BUFFER_SIZE - 1)) - return; - - /* Copy the string into the initial condition string buffer */ - - strncpy(init_cond_string_buffer + init_cond_string_buffer_index, string, string_length); - - /* Increment the string buffer, offset by one for the null terminator, which will be - overwritten by the next call to this function */ - init_cond_string_buffer_index+= string_length + 1; - -} - - -char * create_init_cond_string_buffer(splaytree_t * init_cond_tree) { - - if (init_cond_tree == NULL) - return NULL; - - init_cond_string_buffer_index = 0; - - splay_traverse(init_cond_to_string, init_cond_tree); - - return init_cond_string_buffer; - -} diff --git a/modules/visualization/galaktos/init_cond.h b/modules/visualization/galaktos/init_cond.h deleted file mode 100644 index 40bf8e4951..0000000000 --- a/modules/visualization/galaktos/init_cond.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef INIT_COND_H -#define INIT_COND_H -#define INIT_COND_DEBUG 0 -#include "param_types.h" -#include "init_cond_types.h" -#include "splaytree_types.h" - -void eval_init_cond(init_cond_t * init_cond); -init_cond_t * new_init_cond(param_t * param, value_t init_val); -void free_init_cond(init_cond_t * init_cond); -char * create_init_cond_string_buffer(splaytree_t * init_cond_tree); -#endif diff --git a/modules/visualization/galaktos/init_cond_types.h b/modules/visualization/galaktos/init_cond_types.h deleted file mode 100644 index d339fb103b..0000000000 --- a/modules/visualization/galaktos/init_cond_types.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef INIT_COND_TYPES_H -#define INIT_COND_TYPES_H - -#include "param_types.h" -#include "expr_types.h" - -typedef struct INIT_COND_T { - struct PARAM_T * param; - value_t init_val; -} init_cond_t; -#endif diff --git a/modules/visualization/galaktos/interface_types.h b/modules/visualization/galaktos/interface_types.h deleted file mode 100644 index f1aa496cf3..0000000000 --- a/modules/visualization/galaktos/interface_types.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef INTERFACE_TYPES_H -#define INTERFACE_TYPES_H -typedef enum { - - MENU_INTERFACE, - SHELL_INTERFACE, - EDITOR_INTERFACE, - DEFAULT_INTERFACE, - BROWSER_INTERFACE -} interface_t; - -#endif diff --git a/modules/visualization/galaktos/main.c b/modules/visualization/galaktos/main.c deleted file mode 100644 index 50be639e59..0000000000 --- a/modules/visualization/galaktos/main.c +++ /dev/null @@ -1,1585 +0,0 @@ -/***************************************************************************** - * main.c: - ***************************************************************************** - * Copyright (C) 2004 the VideoLAN team - * $Id$ - * - * Authors: Cyril Deguet - * Adapted from projectM (http://xmms-projectm.sourceforge.net/) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - -#include "plugin.h" -#include -#include -#include -#include -#include -#include -#include "common.h" -#include "preset_types.h" -#include "preset.h" -#include "engine_vars.h" -#include "per_pixel_eqn_types.h" -#include "per_pixel_eqn.h" -#include "interface_types.h" -#include "video_init.h" //Video Init Routines, resizing/fullscreen, creating pbuffers -#include "PCM.h" //Sound data handler (buffering, FFT, etc.) -#include "beat_detect.h" //beat detection routines -#include "custom_wave_types.h" -#include "custom_wave.h" -#include "custom_shape_types.h" -#include "custom_shape.h" -#include "splaytree.h" -//#include - -// Forward declarations - -void read_cfg(); - -void modulate_opacity_by_volume(); -void maximize_colors(); -void do_per_pixel_math(); -void do_per_frame(); - -void render_interpolation(); -void render_texture_to_screen(); -void render_texture_to_studio(); -void draw_motion_vectors(); -void draw_borders(); -void draw_shapes(); -void draw_waveform(); -void draw_custom_waves(); - -void reset_per_pixel_matrices(); -void init_per_pixel_matrices(); -void free_per_pixel_matrices(); - -int noSwitch=0; -int pcmframes=1; -int freqframes=0; -int totalframes=1; - -int studio=0; - -extern preset_t * active_preset; - -GLuint RenderTargetTextureID; - -double wave_o; - -//double gx=32; //size of interpolation -//double gy=24; - -int texsize=512; //size of texture to do actual graphics -int vw=512; //runtime dimensions -int vh=512; -int fullscreen=0; - -int maxsamples=2048; //size of PCM buffer -int numsamples; //size of new PCM info -double *pcmdataL; //holder for most recent pcm data -double *pcmdataR; //holder for most recent pcm data - -int avgtime=500; //# frames per preset - -char *title = NULL; -int drawtitle; -int title_font; -int other_font; - -int correction=1; - -double vol; - -//per pixel equation variables - - -double **gridx; //grid containing interpolated mesh -double **gridy; -double **origtheta; //grid containing interpolated mesh reference values -double **origrad; -double **origx; //original mesh -double **origy; - -char *buffer; //XXX - - -static inline int isPerPixelEqn(int op) { - - return active_preset->per_pixel_flag[op]; - -} -int galaktos_init( galaktos_thread_t *p_thread ) -{ - init_per_pixel_matrices(); - pcmdataL=(double *)malloc(maxsamples*sizeof(double)); - pcmdataR=(double *)malloc(maxsamples*sizeof(double)); - - /* Preset loading function */ - initPresetLoader(); - - /* Load default preset directory */ -// loadPresetDir("/home/cyril/.vlc/galaktos"); - loadPresetDir("/etc/projectM/presets"); - - initPCM(maxsamples); - initBeatDetect(); - - // mutex = SDL_CreateMutex(); - return 0; -} - - -void galaktos_done( galaktos_thread_t *p_thread ) -{ - free(pcmdataL); - free(pcmdataR); - - freeBeatDetect(); - freePCM(); - free_per_pixel_matrices(); - closePresetDir(); -// destroyPresetLoader(); XXX segfaults :( -} - - -int galaktos_update( galaktos_thread_t *p_thread ) -{ - static int nohard=0; - double vdataL[512]; //holders for FFT data (spectrum) - double vdataR[512]; - - avgtime=fps*18; - totalframes++; //total amount of frames since startup - - Time=(double)(mdate()/1000000); - - frame++; //number of frames for current preset - progress= frame/(double)avgtime; - if (progress>1.0) progress=1.0; - // printf("start:%d at:%d min:%d stop:%d on:%d %d\n",startframe, frame frame-startframe,avgtime, noSwitch,progress); - - if (frame>avgtime) - { - if (noSwitch==0) switchPreset(RANDOM_NEXT,0); - } - - evalInitConditions(); - evalPerFrameEquations(); - - evalCustomWaveInitConditions(); - evalCustomShapeInitConditions(); - - // printf("%f %d\n",Time,frame); - - reset_per_pixel_matrices(); - - - numsamples = getPCMnew(pcmdataR,1,0,fWaveSmoothing,0,0); - getPCMnew(pcmdataL,0,0,fWaveSmoothing,0,1); - getPCM(vdataL,512,0,1,0,0); - getPCM(vdataR,512,1,1,0,0); - - bass=0;mid=0;treb=0; - - getBeatVals(vdataL,vdataR,&vol); - - nohard--; - if(vol>8.0 && nohard<0 && noSwitch==0) - { - - switchPreset(RANDOM_NEXT, HARD_CUT); - nohard=100; - } - - //BEGIN PASS 1 - // - //This pass is used to render our texture - //the texture is drawn to a subsection of the framebuffer - //and then we perform our manipulations on it - //in pass 2 we will copy the texture into texture memory - - // galaktos_glx_activate_pbuffer( p_thread ); - - glPushAttrib( GL_ALL_ATTRIB_BITS ); /* Overkill, but safe */ - - // if (RenderTarget) glViewport( 0, 0, RenderTarget->w, RenderTarget->h ); - if (0) {} - else glViewport( 0, 0, texsize, texsize ); - - - glMatrixMode( GL_MODELVIEW ); - glPushMatrix(); - glLoadIdentity(); - - glMatrixMode( GL_PROJECTION ); - glPushMatrix(); - glLoadIdentity(); - - glOrtho(0.0, texsize, 0.0,texsize,10,40); - - do_per_pixel_math(); - - do_per_frame(); //apply per-frame effects - render_interpolation(); //apply per-pixel effects - draw_motion_vectors(); //draw motion vectors - draw_borders(); //draw borders - - draw_waveform(); - draw_shapes(); - draw_custom_waves(); - - glMatrixMode( GL_MODELVIEW ); - glPopMatrix(); - - glMatrixMode( GL_PROJECTION ); - glPopMatrix(); - - glPopAttrib(); - - //if ( RenderTarget ) SDL_GL_UnlockRenderTarget(RenderTarget); - /* Copy our rendering to the fake render target texture */ - glBindTexture( GL_TEXTURE_2D, RenderTargetTextureID ); - glCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, texsize, texsize); -// galaktos_glx_activate_window( p_thread ); - - //BEGIN PASS 2 - // - //end of texture rendering - //now we copy the texture from the framebuffer to - //video texture memory and render fullscreen on a quad surface. - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - - glFrustum(-vw*.5, vw*.5, -vh*.5,vh*.5,10,40); - - glLineWidth(texsize/512.0); - if(studio%2)render_texture_to_studio(); - else render_texture_to_screen(); - - glFinish(); - glFlush(); - // printf("Flush %d\n",(SDL_GetTicks()-timestart)); - - p_thread->p_opengl->pf_swap( p_thread->p_opengl ); - - /* Process events */ - if( p_thread->p_opengl->pf_manage && - p_thread->p_opengl->pf_manage( p_thread->p_opengl ) ) - { - return 1; - } - - return 0; -} - - -void free_per_pixel_matrices() -{ - int x; - - for(x = 0; x < gx; x++) - { - free(gridx[x]); - free(gridy[x]); - free(origtheta[x]); - free(origrad[x]); - free(origx[x]); - free(origy[x]); - free(x_mesh[x]); - free(y_mesh[x]); - free(rad_mesh[x]); - free(theta_mesh[x]); - } - - free(origx); - free(origy); - free(gridx); - free(gridy); - free(x_mesh); - free(y_mesh); - free(rad_mesh); - free(theta_mesh); -} - - -void init_per_pixel_matrices() -{ - int x,y; - - gridx=(double **)malloc(gx * sizeof(double *)); - gridy=(double **)malloc(gx * sizeof(double *)); - - origx=(double **)malloc(gx * sizeof(double *)); - origy=(double **)malloc(gx * sizeof(double *)); - origrad=(double **)malloc(gx * sizeof(double *)); - origtheta=(double **)malloc(gx * sizeof(double *)); - - x_mesh=(double **)malloc(gx * sizeof(double *)); - y_mesh=(double **)malloc(gx * sizeof(double *)); - rad_mesh=(double **)malloc(gx * sizeof(double *)); - theta_mesh=(double **)malloc(gx * sizeof(double *)); - - sx_mesh=(double **)malloc(gx * sizeof(double *)); - sy_mesh=(double **)malloc(gx * sizeof(double *)); - dx_mesh=(double **)malloc(gx * sizeof(double *)); - dy_mesh=(double **)malloc(gx * sizeof(double *)); - cx_mesh=(double **)malloc(gx * sizeof(double *)); - cy_mesh=(double **)malloc(gx * sizeof(double *)); - zoom_mesh=(double **)malloc(gx * sizeof(double *)); - zoomexp_mesh=(double **)malloc(gx * sizeof(double *)); - rot_mesh=(double **)malloc(gx * sizeof(double *)); - - for(x = 0; x < gx; x++) - { - gridx[x] = (double *)malloc(gy * sizeof(double)); - gridy[x] = (double *)malloc(gy * sizeof(double)); - - origtheta[x] = (double *)malloc(gy * sizeof(double)); - origrad[x] = (double *)malloc(gy * sizeof(double)); - origx[x] = (double *)malloc(gy * sizeof(double)); - origy[x] = (double *)malloc(gy * sizeof(double)); - - x_mesh[x] = (double *)malloc(gy * sizeof(double)); - y_mesh[x] = (double *)malloc(gy * sizeof(double)); - - rad_mesh[x] = (double *)malloc(gy * sizeof(double)); - theta_mesh[x] = (double *)malloc(gy * sizeof(double)); - - sx_mesh[x] = (double *)malloc(gy * sizeof(double)); - sy_mesh[x] = (double *)malloc(gy * sizeof(double)); - dx_mesh[x] = (double *)malloc(gy * sizeof(double)); - dy_mesh[x] = (double *)malloc(gy * sizeof(double)); - cx_mesh[x] = (double *)malloc(gy * sizeof(double)); - cy_mesh[x] = (double *)malloc(gy * sizeof(double)); - - zoom_mesh[x] = (double *)malloc(gy * sizeof(double)); - zoomexp_mesh[x] = (double *)malloc(gy * sizeof(double)); - - rot_mesh[x] = (double *)malloc(gy * sizeof(double)); - } - - //initialize reference grid values - for (x=0;xenabled==1) - { - // nextCustomWave(); - - //glPushMatrix(); - - //if(wavecode->bUseDots==1) glEnable(GL_LINE_STIPPLE); - if (wavecode->bAdditive==0) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - else glBlendFunc(GL_SRC_ALPHA, GL_ONE); - if (wavecode->bDrawThick==1) glLineWidth(2*texsize/512); - - // xx= ((pcmdataL[x]-pcmdataL[x-1])*80*fWaveScale)*2; - //yy=pcmdataL[x]*80*fWaveScale,-1; - //glVertex3f( (wave_x*texsize)+(xx+yy)*cos(45), (wave_y*texsize)+(-yy+xx)*cos(45),-1); - // printf("samples: %d\n", wavecode->samples); - - getPCM(wavecode->value1,wavecode->samples,0,wavecode->bSpectrum,wavecode->smoothing,0); - getPCM(wavecode->value2,wavecode->samples,1,wavecode->bSpectrum,wavecode->smoothing,0); - // printf("%f\n",pcmL[0]); - for(x=0;xsamples;x++) - {wavecode->value1[x]=wavecode->value1[x]*wavecode->scaling;} - - for(x=0;xsamples;x++) - {wavecode->value2[x]=wavecode->value2[x]*wavecode->scaling;} - - for(x=0;xsamples;x++) - {wavecode->sample_mesh[x]=((double)x)/((double)(wavecode->samples-1));} - - // printf("mid inner loop\n"); - evalPerPointEqns(); - /* - if(!isPerPointEquation("x")) - {for(x=0;xsamples;x++) - {cw_x[x]=0;} } - - if(!isPerPointEquation(Y_POINT_OP)) - {for(x=0;xsamples;x++) - {cw_y[x]=0;}} - - if(!isPerPointEquation(R_POINT_OP)) - {for(x=0;xsamples;x++) - {cw_r[x]=wavecode->r;}} - if(!isPerPointEquation(G_POINT_OP)) - {for(x=0;xsamples;x++) - {cw_g[x]=wavecode->g;}} - if(!isPerPointEquation(B_POINT_OP)) - {for(x=0;xsamples;x++) - {cw_b[x]=wavecode->b;}} - if(!isPerPointEquation(A_POINT_OP)) - {for(x=0;xsamples;x++) - {cw_a[x]=wavecode->a;}} - */ - //put drawing code here - if (wavecode->bUseDots==1) glBegin(GL_POINTS); - else glBegin(GL_LINE_STRIP); - - for(x=0;xsamples;x++) - { - // printf("x:%f y:%f a:%f g:%f %f\n", wavecode->x_mesh[x], wavecode->y_mesh[x], wavecode->a_mesh[x], wavecode->g_mesh[x], wavecode->sample_mesh[x]); - glColor4f(wavecode->r_mesh[x],wavecode->g_mesh[x],wavecode->b_mesh[x],wavecode->a_mesh[x]); - glVertex3f(wavecode->x_mesh[x]*texsize,-(wavecode->y_mesh[x]-1)*texsize,-1); - } - glEnd(); - glPointSize(texsize/512); - glLineWidth(texsize/512); - glDisable(GL_LINE_STIPPLE); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - // glPopMatrix(); - - } - - } -} - - - -void draw_shapes() -{ - int i; - - double theta; - double rad2; - - double pi = 3.14159265; - double start,inc,xval,yval; - custom_shape_t *shapecode; - - while ((shapecode = nextCustomShape()) != NULL) - { - if(shapecode->enabled==1) - { - // printf("drawing shape %f\n",shapecode->ang); - shapecode->y=-((shapecode->y)-1); - rad2=.5; - shapecode->rad=shapecode->rad*(texsize*.707*.707*.707*1.04); - //Additive Drawing or Overwrite - if (shapecode->additive==0) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - else glBlendFunc(GL_SRC_ALPHA, GL_ONE); - - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - if(correction) - { - glTranslatef(texsize*.5,texsize*.5, 0); - glScalef(1.0,vw/(double)vh,1.0); - glTranslatef((-texsize*.5) ,(-texsize*.5),0); - } - - start=.78539+shapecode->ang; - inc=(pi*2)/(double)shapecode->sides; - xval=shapecode->x*texsize; - yval=shapecode->y*texsize; - - if (shapecode->textured) - { - glMatrixMode(GL_TEXTURE); - glPushMatrix(); - glLoadIdentity(); - - glTranslatef(.5,.5, 0); - if (correction) glScalef(1,vw/(double)vh,1); - - glRotatef((shapecode->tex_ang*360/6.280), 0, 0, 1); - - glScalef(1/(shapecode->tex_zoom),1/(shapecode->tex_zoom),1); - - // glScalef(1,vh/(double)vw,1); - glTranslatef((-.5) ,(-.5),0); - // glScalef(1,vw/(double)vh,1); - glEnable(GL_TEXTURE_2D); - - - glBegin(GL_TRIANGLE_FAN); - - glColor4f(shapecode->r,shapecode->g,shapecode->b,shapecode->a); - theta=start; - glTexCoord2f(.5,.5); - glVertex3f(xval,yval,-1); - glColor4f(shapecode->r2,shapecode->g2,shapecode->b2,shapecode->a2); - - for ( i=0;isides+1;i++) - { - - theta+=inc; - // glColor4f(shapecode->r2,shapecode->g2,shapecode->b2,shapecode->a2); - glTexCoord2f(rad2*cos(theta)+.5 ,rad2*sin(theta)+.5 ); - glVertex3f(shapecode->rad*cos(theta)+xval,shapecode->rad*sin(theta)+yval,-1); - } - glEnd(); - - - - - glDisable(GL_TEXTURE_2D); - glPopMatrix(); - glMatrixMode(GL_MODELVIEW); - } - else - {//Untextured (use color values) - //printf("untextured %f %f %f @:%f,%f %f %f\n",shapecode->a2,shapecode->a,shapecode->border_a, shapecode->x,shapecode->y,shapecode->rad,shapecode->ang); - //draw first n-1 triangular pieces - glBegin(GL_TRIANGLE_FAN); - - glColor4f(shapecode->r,shapecode->g,shapecode->b,shapecode->a); - theta=start; - // glTexCoord2f(.5,.5); - glVertex3f(xval,yval,-1); - glColor4f(shapecode->r2,shapecode->g2,shapecode->b2,shapecode->a2); - - for ( i=0;isides+1;i++) - { - - theta+=inc; - // glColor4f(shapecode->r2,shapecode->g2,shapecode->b2,shapecode->a2); - // glTexCoord2f(rad2*cos(theta)+.5 ,rad2*sin(theta)+.5 ); - glVertex3f(shapecode->rad*cos(theta)+xval,shapecode->rad*sin(theta)+yval,-1); - } - glEnd(); - - - } - if (bWaveThick==1) glLineWidth(2*texsize/512); - glBegin(GL_LINE_LOOP); - glColor4f(shapecode->border_r,shapecode->border_g,shapecode->border_b,shapecode->border_a); - for ( i=0;isides;i++) - { - theta+=inc; - glVertex3f(shapecode->rad*cos(theta)+xval,shapecode->rad*sin(theta)+yval,-1); - } - glEnd(); - if (bWaveThick==1) glLineWidth(texsize/512); - - glPopMatrix(); - } - } - -} - - -void draw_waveform() -{ - - int x; - - double r,theta; - - double offset,scale,dy2_adj; - - double co; - - double wave_x_temp=0; - double wave_y_temp=0; - - modulate_opacity_by_volume(); - maximize_colors(); - - if(bWaveDots==1) glEnable(GL_LINE_STIPPLE); - - offset=(wave_x-.5)*texsize; - scale=texsize/505.0; - - //Thick wave drawing - if (bWaveThick==1) glLineWidth(2*texsize/512); - - //Additive wave drawing (vice overwrite) - if (bAdditiveWaves==0) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - else glBlendFunc(GL_SRC_ALPHA, GL_ONE); - - switch(nWaveMode) - { - case 8://monitor - - glPushMatrix(); - - glTranslatef(texsize*.5,texsize*.5, 0); - glRotated(-wave_mystery*90,0,0,1); - - glTranslatef(-texsize*.5,-texsize*.825, 0); - - /* - for (x=0;x<16;x++) - { - glBegin(GL_LINE_STRIP); - glColor4f(1.0-(x/15.0),.5,x/15.0,1.0); - glVertex3f((totalframes%256)*2*scale, -beat_val[x]*fWaveScale+texsize*wave_y,-1); - glColor4f(.5,.5,.5,1.0); - glVertex3f((totalframes%256)*2*scale, texsize*wave_y,-1); - glColor4f(1.0,1.0,0,1.0); - //glVertex3f((totalframes%256)*scale*2, beat_val_att[x]*fWaveScale+texsize*wave_y,-1); - glEnd(); - - glTranslatef(0,texsize*(1/36.0), 0); - } - */ - - glTranslatef(0,texsize*(1/18.0), 0); - - - glBegin(GL_LINE_STRIP); - glColor4f(1.0,1.0,0.5,1.0); - glVertex3f((totalframes%256)*2*scale, treb_att*5*fWaveScale+texsize*wave_y,-1); - glColor4f(.2,.2,.2,1.0); - glVertex3f((totalframes%256)*2*scale, texsize*wave_y,-1); - glColor4f(1.0,1.0,0,1.0); - glVertex3f((totalframes%256)*scale*2, treb*-5*fWaveScale+texsize*wave_y,-1); - glEnd(); - - glTranslatef(0,texsize*.075, 0); - glBegin(GL_LINE_STRIP); - glColor4f(0,1.0,0.0,1.0); - glVertex3f((totalframes%256)*2*scale, mid_att*5*fWaveScale+texsize*wave_y,-1); - glColor4f(.2,.2,.2,1.0); - glVertex3f((totalframes%256)*2*scale, texsize*wave_y,-1); - glColor4f(.5,1.0,.5,1.0); - glVertex3f((totalframes%256)*scale*2, mid*-5*fWaveScale+texsize*wave_y,-1); - glEnd(); - - - glTranslatef(0,texsize*.075, 0); - glBegin(GL_LINE_STRIP); - glColor4f(1.0,0,0,1.0); - glVertex3f((totalframes%256)*2*scale, bass_att*5*fWaveScale+texsize*wave_y,-1); - glColor4f(.2,.2,.2,1.0); - glVertex3f((totalframes%256)*2*scale, texsize*wave_y,-1); - glColor4f(1.0,.5,.5,1.0); - glVertex3f((totalframes%256)*scale*2, bass*-5*fWaveScale+texsize*wave_y,-1); - glEnd(); - - - glPopMatrix(); - break; - - case 0://circular waveforms - // double co; - glPushMatrix(); - - glTranslatef(texsize*.5,texsize*.5, 0); - glScalef(1.0,vw/(double)vh,1.0); - glTranslatef((-texsize*.5) ,(-texsize*.5),0); - - wave_y=-1*(wave_y-1.0); - - glBegin(GL_LINE_STRIP); - - for ( x=0;x=wave_g && wave_r>=wave_b) //red brightest - { - wave_b_switch=wave_b*(1/wave_r); - wave_g_switch=wave_g*(1/wave_r); - wave_r_switch=1.0; - } - else if (wave_b>=wave_g && wave_b>=wave_r) //blue brightest - { - wave_r_switch=wave_r*(1/wave_b); - wave_g_switch=wave_g*(1/wave_b); - wave_b_switch=1.0; - - } - - else if (wave_g>=wave_b && wave_g>=wave_r) //green brightest - { - wave_b_switch=wave_b*(1/wave_g); - wave_r_switch=wave_r*(1/wave_g); - wave_g_switch=1.0; - } - glColor4f(wave_r_switch, wave_g_switch, wave_b_switch, wave_o); - } - else - { - glColor4f(wave_r, wave_g, wave_b, wave_o); - } - -} - - -void modulate_opacity_by_volume() - -{ - //modulate volume by opacity - // - //set an upper and lower bound and linearly - //calculate the opacity from 0=lower to 1=upper - //based on current volume - - if (bModWaveAlphaByVolume==1) - {if (vol<=fModWaveAlphaStart) wave_o=0.0; - else if (vol>=fModWaveAlphaEnd) wave_o=fWaveAlpha; - else wave_o=fWaveAlpha*((vol-fModWaveAlphaStart)/(fModWaveAlphaEnd-fModWaveAlphaStart));} - else wave_o=fWaveAlpha; -} - - -void draw_motion_vectors() -{ - int x,y; - - double offsetx=mv_dx*texsize, intervalx=texsize/(double)mv_x; - double offsety=mv_dy*texsize, intervaly=texsize/(double)mv_y; - - glPointSize(mv_l); - glColor4f(mv_r, mv_g, mv_b, mv_a); - glBegin(GL_POINTS); - for (x=0;x - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - -#ifndef _GALAKTOS_MAIN_H_ -#define _GALAKTOS_MAIN_H_ - -int galaktos_init( galaktos_thread_t *p_thread ); -void galaktos_done( galaktos_thread_t *p_thread ); -int galaktos_update( galaktos_thread_t *p_thread ); - -#endif diff --git a/modules/visualization/galaktos/param.c b/modules/visualization/galaktos/param.c deleted file mode 100644 index 784d23565e..0000000000 --- a/modules/visualization/galaktos/param.c +++ /dev/null @@ -1,721 +0,0 @@ -/***************************************************************************** - * param.c: - ***************************************************************************** - * Copyright (C) 2004 the VideoLAN team - * $Id$ - * - * Authors: Cyril Deguet - * code from projectM http://xmms-projectm.sourceforge.net - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - - - -/* Basic Parameter Functions */ - -#include -#include -#include -#include -#include "fatal.h" -#include "common.h" - -#include "splaytree_types.h" -#include "splaytree.h" -#include "tree_types.h" - -#include "param_types.h" -#include "param.h" - -#include "expr_types.h" -#include "eval.h" - -#include "engine_vars.h" - -void reset_param(param_t * param); - -int is_valid_param_string(char * string); /* true if string is valid variable or function name */ - - -/* A splay tree of builtin parameters */ -splaytree_t * builtin_param_tree = NULL; - -int insert_param_alt_name(param_t * param, const char * alt_name); - -int insert_builtin_param(param_t * param); - -/* Private function prototypes */ -int compare_param(char * name, char * name2); - -int load_builtin_param_double(const char * name, void * engine_val, void * matrix, short int flags, - double init_val, double upper_bound, double lower_bound, const char * alt_name); - -int load_builtin_param_int(const char * name, void * engine_val, short int flags, - int init_val, int upper_bound, int lower_bound, const char * alt_name); - -int load_builtin_param_bool(const char * name, void * engine_val, short int flags, - int init_val, const char * alt_name); - - - -param_t * create_param (const char * name, short int type, short int flags, void * engine_val, void * matrix, - value_t default_init_val, value_t upper_bound, value_t lower_bound) { - - param_t * param = NULL; - - param = (param_t*)malloc(sizeof(param_t)); - - if (param == NULL) { - printf("create_param: out of memory!!!\n"); - return NULL; - } - - /* Clear name space, think the strncpy statement makes this redundant */ - //memset(param->name, 0, MAX_TOKEN_SIZE); - - /* Copy given name into parameter structure */ - strncpy(param->name, name, MAX_TOKEN_SIZE-1); - - /* Assign other entries in a constructor like fashion */ - param->type = type; - param->flags = flags; - param->matrix_flag = 0; - param->matrix = matrix; - param->engine_val = engine_val; - param->default_init_val = default_init_val; - //*param->init_val = default_init_val; - param->upper_bound = upper_bound; - param->lower_bound = lower_bound; - - /* Return instantiated parameter */ - return param; - -} - -/* Creates a user defined parameter */ -param_t * create_user_param(char * name) { - - param_t * param; - value_t iv; - value_t ub; - value_t lb; - double * engine_val; - - /* Set initial values to default */ - iv.double_val = DEFAULT_DOUBLE_IV; - ub.double_val = DEFAULT_DOUBLE_UB; - lb.double_val = DEFAULT_DOUBLE_LB; - - /* Argument checks */ - if (name == NULL) - return NULL; - - /* Allocate space for the engine variable */ - if ((engine_val = (double*)malloc(sizeof(double))) == NULL) - return NULL; - - (*engine_val) = iv.double_val; /* set some default init value */ - - /* Create the new user parameter */ - if ((param = create_param(name, P_TYPE_DOUBLE, P_FLAG_USERDEF, engine_val, NULL, iv, ub, lb)) == NULL) { - free(engine_val); - return NULL; - } - if (PARAM_DEBUG) printf("create_param: \"%s\" initialized\n", param->name); - /* Return the instantiated parameter */ - return param; -} - -/* Initialize the builtin parameter database. - Should only be necessary once */ -int init_builtin_param_db() { - - /* Create the builtin parameter splay tree (go Sleator...) */ - if ((builtin_param_tree = create_splaytree(compare_string, copy_string, free_string)) == NULL) { - if (PARAM_DEBUG) printf("init_builtin_param_db: failed to initialize database (FATAL)\n"); - return OUTOFMEM_ERROR; - } - - if (PARAM_DEBUG) { - printf("init_builtin_param: loading database..."); - fflush(stdout); - } - - /* Loads all builtin parameters into the database */ - if (load_all_builtin_param() < 0) { - if (PARAM_DEBUG) printf("failed loading builtin parameters (FATAL)\n"); - return ERROR; - } - - if (PARAM_DEBUG) printf("success!\n"); - - /* Finished, no errors */ - return SUCCESS; -} - -/* Destroy the builtin parameter database. - Generally, do this on projectm exit */ -int destroy_builtin_param_db() { - - splay_traverse(free_param, builtin_param_tree); - destroy_splaytree(builtin_param_tree); - builtin_param_tree = NULL; - return SUCCESS; - -} - - -/* Insert a parameter into the database with an alternate name */ -int insert_param_alt_name(param_t * param, const char * alt_name) { - - if (param == NULL) - return ERROR; - if (alt_name == NULL) - return ERROR; - - splay_insert_link(alt_name, param->name, builtin_param_tree); - - return SUCCESS; -} - - -param_t * find_builtin_param(char * name) { - - /* Null argument checks */ - if (name == NULL) - return NULL; - - return splay_find(name, builtin_param_tree); - -} - -/* Find a parameter given its name, will create one if not found */ -param_t * find_param(char * name, preset_t * preset, int flags) { - - param_t * param = NULL; - - /* Null argument checks */ - if (name == NULL) - return NULL; - if (preset == NULL) - return NULL; - - /* First look in the builtin database */ - param = (param_t *)splay_find(name, builtin_param_tree); - - /* If the search failed, check the user database */ - if (param == NULL) { - param = (param_t*)splay_find(name, preset->user_param_tree); - } - /* If it doesn't exist in the user (or builtin) database and - create_flag is set, then make it and insert into the database - */ - - if ((param == NULL) && (flags & P_CREATE)) { - - /* Check if string is valid */ - if (!is_valid_param_string(name)) { - if (PARAM_DEBUG) printf("find_param: invalid parameter name:\"%s\"\n", name); - return NULL; - } - /* Now, create the user defined parameter given the passed name */ - if ((param = create_user_param(name)) == NULL) { - if (PARAM_DEBUG) printf("find_param: failed to create a new user parameter!\n"); - return NULL; - } - /* Finally, insert the new parameter into this preset's proper splaytree */ - if (splay_insert(param, param->name, preset->user_param_tree) < 0) { - if (PARAM_DEBUG) printf("PARAM \"%s\" already exists in user parameter tree!\n", param->name); - free_param(param); - return NULL; - } - - } - - /* Return the found (or created) parameter. Note that if P_CREATE is not set, this could be null */ - return param; - -} - -/* Compare string name with parameter name */ -int compare_param(char * name, char * name2) { - - int cmpval; - printf("am i used\n"); - /* Uses string comparison function */ - cmpval = strncmp(name, name2, MAX_TOKEN_SIZE-1); - - return cmpval; -} - -/* Loads all builtin parameters, limits are also defined here */ -int load_all_builtin_param() { - - load_builtin_param_double("fRating", (void*)&fRating, NULL, P_FLAG_NONE, 0.0 , 5.0, 0.0, NULL); - load_builtin_param_double("fWaveScale", (void*)&fWaveScale, NULL, P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL); - load_builtin_param_double("gamma", (void*)&fGammaAdj, NULL, P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, 0, "fGammaAdj"); - load_builtin_param_double("echo_zoom", (void*)&fVideoEchoZoom, NULL, P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, 0, "fVideoEchoZoom"); - load_builtin_param_double("echo_alpha", (void*)&fVideoEchoAlpha, NULL, P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, 0, "fVideoEchoAlpha"); - load_builtin_param_double("wave_a", (void*)&fWaveAlpha, NULL, P_FLAG_NONE, 0.0, 1.0, 0, "fWaveAlpha"); - load_builtin_param_double("fWaveSmoothing", (void*)&fWaveSmoothing, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, NULL); - load_builtin_param_double("fModWaveAlphaStart", (void*)&fModWaveAlphaStart, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, NULL); - load_builtin_param_double("fModWaveAlphaEnd", (void*)&fModWaveAlphaEnd, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, NULL); - load_builtin_param_double("fWarpAnimSpeed", (void*)&fWarpAnimSpeed, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, NULL); - // load_builtin_param_double("warp", (void*)&warp, warp_mesh, P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, 0, NULL); - - load_builtin_param_double("fShader", (void*)&fShader, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, NULL); - load_builtin_param_double("decay", (void*)&decay, NULL, P_FLAG_NONE, 0.0, 1.0, 0, "fDecay"); - - load_builtin_param_int("echo_orient", (void*)&nVideoEchoOrientation, P_FLAG_NONE, 0, 3, 0, "nVideoEchoOrientation"); - load_builtin_param_int("wave_mode", (void*)&nWaveMode, P_FLAG_NONE, 0, 7, 0, "nWaveMode"); - - load_builtin_param_bool("wave_additive", (void*)&bAdditiveWaves, P_FLAG_NONE, FALSE, "bAdditiveWaves"); - load_builtin_param_bool("bModWaveAlphaByVolume", (void*)&bModWaveAlphaByVolume, P_FLAG_NONE, FALSE, NULL); - load_builtin_param_bool("wave_brighten", (void*)&bMaximizeWaveColor, P_FLAG_NONE, FALSE, "bMaximizeWaveColor"); - load_builtin_param_bool("wrap", (void*)&bTexWrap, P_FLAG_NONE, FALSE, "bTexWrap"); - load_builtin_param_bool("darken_center", (void*)&bDarkenCenter, P_FLAG_NONE, FALSE, "bDarkenCenter"); - load_builtin_param_bool("bRedBlueStereo", (void*)&bRedBlueStereo, P_FLAG_NONE, FALSE, NULL); - load_builtin_param_bool("brighten", (void*)&bBrighten, P_FLAG_NONE, FALSE, "bBrighten"); - load_builtin_param_bool("darken", (void*)&bDarken, P_FLAG_NONE, FALSE, "bDarken"); - load_builtin_param_bool("solarize", (void*)&bSolarize, P_FLAG_NONE, FALSE, "bSolarize"); - load_builtin_param_bool("invert", (void*)&bInvert, P_FLAG_NONE, FALSE, "bInvert"); - load_builtin_param_bool("bMotionVectorsOn", (void*)&bMotionVectorsOn, P_FLAG_NONE, FALSE, NULL); - load_builtin_param_bool("wave_dots", (void*)&bWaveDots, P_FLAG_NONE, FALSE, "bWaveDots"); - load_builtin_param_bool("wave_thick", (void*)&bWaveThick, P_FLAG_NONE, FALSE, "bWaveThick"); - - - - 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); - 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); - load_builtin_param_double("zoomexp", (void*)&zoomexp, zoomexp_mesh, P_FLAG_PER_PIXEL |P_FLAG_NONE, 0.0, MAX_DOUBLE_SIZE, 0, "fZoomExponent"); - - load_builtin_param_double("cx", (void*)&cx, cx_mesh, P_FLAG_PER_PIXEL | P_FLAG_DONT_FREE_MATRIX, 0.0, 1.0, 0, NULL); - load_builtin_param_double("cy", (void*)&cy, cy_mesh, P_FLAG_PER_PIXEL | P_FLAG_DONT_FREE_MATRIX, 0.0, 1.0, 0, NULL); - 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); - 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); - 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); - 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); - - load_builtin_param_double("wave_r", (void*)&wave_r, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, NULL); - load_builtin_param_double("wave_g", (void*)&wave_g, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, NULL); - load_builtin_param_double("wave_b", (void*)&wave_b, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, NULL); - load_builtin_param_double("wave_x", (void*)&wave_x, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, NULL); - load_builtin_param_double("wave_y", (void*)&wave_y, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, NULL); - load_builtin_param_double("wave_mystery", (void*)&wave_mystery, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, "fWaveParam"); - - load_builtin_param_double("ob_size", (void*)&ob_size, NULL, P_FLAG_NONE, 0.0, 0.5, 0, NULL); - load_builtin_param_double("ob_r", (void*)&ob_r, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, NULL); - load_builtin_param_double("ob_g", (void*)&ob_g, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, NULL); - load_builtin_param_double("ob_b", (void*)&ob_b, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, NULL); - load_builtin_param_double("ob_a", (void*)&ob_a, NULL, P_FLAG_NONE, 0.0, 1.0, 0.0, NULL); - - load_builtin_param_double("ib_size", (void*)&ib_size, NULL,P_FLAG_NONE, 0.0, .5, 0.0, NULL); - load_builtin_param_double("ib_r", (void*)&ib_r, NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, NULL); - load_builtin_param_double("ib_g", (void*)&ib_g, NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, NULL); - load_builtin_param_double("ib_b", (void*)&ib_b, NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, NULL); - load_builtin_param_double("ib_a", (void*)&ib_a, NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, NULL); - - load_builtin_param_double("mv_r", (void*)&mv_r, NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, NULL); - load_builtin_param_double("mv_g", (void*)&mv_g, NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, NULL); - load_builtin_param_double("mv_b", (void*)&mv_b, NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, NULL); - load_builtin_param_double("mv_x", (void*)&mv_x, NULL,P_FLAG_NONE, 0.0, 64.0, 0.0, "nMotionVectorsX"); - load_builtin_param_double("mv_y", (void*)&mv_y, NULL,P_FLAG_NONE, 0.0, 48.0, 0.0, "nMotionVectorsY"); - load_builtin_param_double("mv_l", (void*)&mv_l, NULL,P_FLAG_NONE, 0.0, 5.0, 0.0, NULL); - load_builtin_param_double("mv_dy", (void*)&mv_dy, NULL, P_FLAG_NONE, 0.0, 1.0, -1.0, NULL); - load_builtin_param_double("mv_dx", (void*)&mv_dx, NULL,P_FLAG_NONE, 0.0, 1.0, -1.0, NULL); - load_builtin_param_double("mv_a", (void*)&mv_a, NULL,P_FLAG_NONE, 0.0, 1.0, 0.0, NULL); - - load_builtin_param_double("time", (void*)&Time, NULL,P_FLAG_READONLY, 0.0, MAX_DOUBLE_SIZE, 0.0, NULL); - load_builtin_param_double("bass", (void*)&bass, NULL,P_FLAG_READONLY, 0.0, MAX_DOUBLE_SIZE, 0.0, NULL); - load_builtin_param_double("mid", (void*)&mid, NULL,P_FLAG_READONLY, 0.0, MAX_DOUBLE_SIZE, 0, NULL); - load_builtin_param_double("bass_att", (void*)&bass_att, NULL,P_FLAG_READONLY, 0.0, MAX_DOUBLE_SIZE, 0, NULL); - load_builtin_param_double("mid_att", (void*)&mid_att, NULL,P_FLAG_READONLY, 0.0, MAX_DOUBLE_SIZE, 0, NULL); - load_builtin_param_double("treb_att", (void*)&treb_att, NULL,P_FLAG_READONLY, 0.0, MAX_DOUBLE_SIZE, 0, NULL); - load_builtin_param_int("frame", (void*)&frame, P_FLAG_READONLY, 0, MAX_INT_SIZE, 0, NULL); - load_builtin_param_double("progress", (void*)&progress, NULL,P_FLAG_READONLY, 0.0, 1, 0, NULL); - load_builtin_param_int("fps", (void*)&fps, P_FLAG_NONE, 15, MAX_INT_SIZE, 0, NULL); - - - - 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, - 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL); - 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, - 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL); - 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, - 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL); - 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, - 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL); - - - load_builtin_param_double("q1", (void*)&q1, NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL); - load_builtin_param_double("q2", (void*)&q2, NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL); - load_builtin_param_double("q3", (void*)&q3, NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL); - load_builtin_param_double("q4", (void*)&q4, NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL); - load_builtin_param_double("q5", (void*)&q5, NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL); - load_builtin_param_double("q6", (void*)&q6, NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL); - load_builtin_param_double("q7", (void*)&q7, NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL); - load_builtin_param_double("q8", (void*)&q8, NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, NULL); - - - - /* variables added in 1.04 */ - load_builtin_param_int("meshx", (void*)&gx, P_FLAG_READONLY, 32, 96, 8, NULL); - load_builtin_param_int("meshy", (void*)&gy, P_FLAG_READONLY, 24, 72, 6, NULL); - - return SUCCESS; - -} - -/* Free's a parameter type */ -void free_param(param_t * param) { - int x; - if (param == NULL) - return; - - if (param->flags & P_FLAG_USERDEF) { - free(param->engine_val); - - } - - if (!(param->flags & P_FLAG_DONT_FREE_MATRIX)) { - - if (param->flags & P_FLAG_PER_POINT) - free(param->matrix); - - else if (param->flags & P_FLAG_PER_PIXEL) { - for(x = 0; x < gx; x++) - free(((double**)param->matrix)[x]); - free(param->matrix); - } - } - - if (PARAM_DEBUG) printf("free_param: freeing \"%s\".\n", param->name); - free(param); - -} - -/* Loads a double parameter into the builtin database */ -int load_builtin_param_double(const char * name, void * engine_val, void * matrix, short int flags, - double init_val, double upper_bound, double lower_bound, const char * alt_name) { - - param_t * param = NULL; - value_t iv, ub, lb; - - iv.double_val = init_val; - ub.double_val = upper_bound; - lb.double_val = lower_bound; - - /* Create new parameter of type double */ - if (PARAM_DEBUG == 2) { - printf("load_builtin_param_double: (name \"%s\") (alt_name = \"%s\") ", name, alt_name); - fflush(stdout); - } - - if ((param = create_param(name, P_TYPE_DOUBLE, flags, engine_val, matrix, iv, ub, lb)) == NULL) { - return OUTOFMEM_ERROR; - } - - if (PARAM_DEBUG == 2) { - printf("created..."); - fflush(stdout); - } - - /* Insert the paremeter into the database */ - - if (insert_builtin_param(param) < 0) { - free_param(param); - return ERROR; - } - - if (PARAM_DEBUG == 2) { - printf("inserted..."); - fflush(stdout); - } - - /* If this parameter has an alternate name, insert it into the database as link */ - - if (alt_name != NULL) { - insert_param_alt_name(param, alt_name); - - if (PARAM_DEBUG == 2) { - printf("alt_name inserted..."); - fflush(stdout); - } - - - } - - if (PARAM_DEBUG == 2) printf("finished\n"); - /* Finished, return success */ - return SUCCESS; -} - - - -/* Loads a double parameter into the builtin database */ -param_t * new_param_double(const char * name, short int flags, void * engine_val, void * matrix, - double upper_bound, double lower_bound, double init_val) { - - param_t * param; - value_t iv, ub, lb; - - iv.double_val = init_val; - ub.double_val = upper_bound; - lb.double_val = lower_bound; - - if ((param = create_param(name, P_TYPE_DOUBLE, flags, engine_val, matrix,iv, ub, lb)) == NULL) - return NULL; - - - /* Finished, return success */ - return param; -} - - -/* Creates a new parameter of type int */ -param_t * new_param_int(const char * name, short int flags, void * engine_val, - int upper_bound, int lower_bound, int init_val) { - - param_t * param; - value_t iv, ub, lb; - - iv.int_val = init_val; - ub.int_val = upper_bound; - lb.int_val = lower_bound; - - if ((param = create_param(name, P_TYPE_INT, flags, engine_val, NULL, iv, ub, lb)) == NULL) - return NULL; - - - /* Finished, return success */ - return param; -} - -/* Creates a new parameter of type bool */ -param_t * new_param_bool(const char * name, short int flags, void * engine_val, - int upper_bound, int lower_bound, int init_val) { - - param_t * param; - value_t iv, ub, lb; - - iv.bool_val = init_val; - ub.bool_val = upper_bound; - lb.bool_val = lower_bound; - - if ((param = create_param(name, P_TYPE_BOOL, flags, engine_val, NULL, iv, ub, lb)) == NULL) - return NULL; - - - /* Finished, return success */ - return param; -} - - -/* Loads a integer parameter into the builtin database */ -int load_builtin_param_int(const char * name, void * engine_val, short int flags, - int init_val, int upper_bound, int lower_bound, const char * alt_name) { - - param_t * param; - value_t iv, ub, lb; - - iv.int_val = init_val; - ub.int_val = upper_bound; - lb.int_val = lower_bound; - - param = create_param(name, P_TYPE_INT, flags, engine_val, NULL, iv, ub, lb); - - if (param == NULL) { - return OUTOFMEM_ERROR; - } - - if (insert_builtin_param(param) < 0) { - free_param(param); - return ERROR; - } - - if (alt_name != NULL) { - insert_param_alt_name(param, alt_name); - } - - return SUCCESS; - -} - -/* Loads a boolean parameter */ -int load_builtin_param_bool(const char * name, void * engine_val, short int flags, - int init_val, const char * alt_name) { - - param_t * param; - value_t iv, ub, lb; - - iv.int_val = init_val; - ub.int_val = TRUE; - lb.int_val = FALSE; - - param = create_param(name, P_TYPE_BOOL, flags, engine_val, NULL, iv, ub, lb); - - if (param == NULL) { - return OUTOFMEM_ERROR; - } - - if (insert_builtin_param(param) < 0) { - free_param(param); - return ERROR; - } - - if (alt_name != NULL) { - insert_param_alt_name(param, alt_name); - } - - return SUCCESS; - -} - - - - -/* Returns nonzero if the string is valid parameter name */ -int is_valid_param_string(char * string) { - - if (string == NULL) - return FALSE; - - /* This ensures the first character is non numeric */ - if( ((*string) >= 48) && ((*string) <= 57)) - return FALSE; - - /* These probably should never happen */ - if (*string == '.') - return FALSE; - - if (*string == '+') - return FALSE; - - if (*string == '-') - return FALSE; - - /* Could also add checks for other symbols. May do later */ - - return TRUE; - -} - -/* Inserts a parameter into the builtin database */ -int insert_builtin_param(param_t * param) { - - if (param == NULL) - return FAILURE; - - return splay_insert(param, param->name, builtin_param_tree); -} - -/* Inserts a parameter into the builtin database */ -int insert_param(param_t * param, splaytree_t * database) { - - if (param == NULL) - return FAILURE; - if (database == NULL) - return FAILURE; - - return splay_insert(param, param->name, database); -} - - -/* Sets the parameter engine value to value val. - clipping occurs if necessary */ -void set_param(param_t * param, double val) { - - switch (param->type) { - - case P_TYPE_BOOL: - if (val < 0) - *((int*)param->engine_val) = 0; - else if (val > 0) - *((int*)param->engine_val) = 1; - else - *((int*)param->engine_val) = 0; - break; - case P_TYPE_INT: - /* Make sure value is an integer */ - val = floor(val); - if (val < param->lower_bound.int_val) - *((int*)param->engine_val) = param->lower_bound.int_val; - else if (val > param->upper_bound.int_val) - *((int*)param->engine_val) = param->upper_bound.int_val; - else - *((int*)param->engine_val) = val; - break; - case P_TYPE_DOUBLE: - /* Make sure value is an integer */ - - - if (val < param->lower_bound.double_val) - *((double*)param->engine_val) = param->lower_bound.double_val; - else if (val > param->upper_bound.double_val) - *((double*)param->engine_val) = param->upper_bound.double_val; - else - *((double*)param->engine_val) = val; - break; - default: - break; - - } - - return; -} - - - - -/* Search for parameter 'name' in 'database', if create_flag is true, then generate the parameter - and insert it into 'database' */ -param_t * find_param_db(char * name, splaytree_t * database, int create_flag) { - - param_t * param = NULL; - - /* Null argument checks */ - if (name == NULL) - return NULL; - if (database == NULL) - return NULL; - - /* First look in the builtin database */ - param = (param_t *)splay_find(name, database); - - - if (((param = (param_t *)splay_find(name, database)) == NULL) && (create_flag == TRUE)) { - - /* Check if string is valid */ - if (!is_valid_param_string(name)) - return NULL; - - /* Now, create the user defined parameter given the passed name */ - if ((param = create_user_param(name)) == NULL) - return NULL; - - /* Finally, insert the new parameter into this preset's proper splaytree */ - if (splay_insert(param, param->name, database) < 0) { - free_param(param); - return NULL; - } - - } - - /* Return the found (or created) parameter. Note that this could be null */ - return param; - -} - diff --git a/modules/visualization/galaktos/param.h b/modules/visualization/galaktos/param.h deleted file mode 100644 index ecf14ac5a4..0000000000 --- a/modules/visualization/galaktos/param.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef PARAM_H -#define PARAM_H -#include "preset_types.h" -#include "splaytree_types.h" -/* Debug level, zero for none */ -#define PARAM_DEBUG 0 - -/* Used to store a number of decidable type */ - -/* Function prototypes */ -param_t * create_param (const char * name, short int type, short int flags, void * eqn_val, void * matrix, - value_t default_init_val, value_t upper_bound, value_t lower_bound); -param_t * create_user_param(char * name); -int init_builtin_param_db(); -int init_user_param_db(); -int destroy_user_param_db(); -int destroy_builtin_param_db(); -void set_param(param_t * param, double val); -int remove_param(param_t * param); -param_t * find_param(char * name, struct PRESET_T * preset, int flags); -void free_param(param_t * param); -int load_all_builtin_param(); -int insert_param(param_t * param, splaytree_t * database); -param_t * find_builtin_param(char * name); -param_t * new_param_double(const char * name, short int flags, void * engine_val, void * matrix, - double upper_bound, double lower_bound, double init_val); - -param_t * new_param_int(const char * name, short int flags, void * engine_val, - int upper_bound, int lower_bound, int init_val); - -param_t * new_param_bool(const char * name, short int flags, void * engine_val, - int upper_bound, int lower_bound, int init_val); - -param_t * find_param_db(char * name, splaytree_t * database, int create_flag); - -#endif diff --git a/modules/visualization/galaktos/param_types.h b/modules/visualization/galaktos/param_types.h deleted file mode 100644 index aae00cff40..0000000000 --- a/modules/visualization/galaktos/param_types.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef PARAM_TYPES_H -#define PARAM_TYPES_H -#include "expr_types.h" -#define P_CREATE 1 -#define P_NONE 0 - -#define P_TYPE_BOOL 0 -#define P_TYPE_INT 1 -#define P_TYPE_DOUBLE 2 - -#define P_FLAG_NONE 0 -#define P_FLAG_READONLY 1 -#define P_FLAG_USERDEF (1 << 1) -#define P_FLAG_QVAR (1 << 2) -#define P_FLAG_TVAR (1 << 3) -#define P_FLAG_ALWAYS_MATRIX (1 << 4) -#define P_FLAG_DONT_FREE_MATRIX (1 << 5) -#define P_FLAG_PER_PIXEL (1 << 6) -#define P_FLAG_PER_POINT (1 << 7) - -typedef union VALUE_T { - int bool_val; - int int_val; - double double_val; -} value_t; - -/* Parameter Type */ -typedef struct PARAM_T { - char name[MAX_TOKEN_SIZE]; /* name of the parameter, not necessary but useful neverthless */ - short int type; /* parameter number type (int, bool, or double) */ - short int flags; /* read, write, user defined, etc */ - short int matrix_flag; /* for optimization purposes */ - void * engine_val; /* pointer to the engine variable */ - void * matrix; /* per pixel / per point matrix for this variable */ - value_t default_init_val; /* a default initial condition value */ - value_t upper_bound; /* this parameter's upper bound */ - value_t lower_bound; /* this parameter's lower bound */ -} param_t; -#endif diff --git a/modules/visualization/galaktos/parser.c b/modules/visualization/galaktos/parser.c deleted file mode 100644 index 63d54976db..0000000000 --- a/modules/visualization/galaktos/parser.c +++ /dev/null @@ -1,2117 +0,0 @@ -/***************************************************************************** - * parser.c: - ***************************************************************************** - * Copyright (C) 2004 the VideoLAN team - * $Id$ - * - * Authors: Cyril Deguet - * code from projectM http://xmms-projectm.sourceforge.net - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - - - -/* parser.c */ - -#include -#include -#include - -#include "common.h" -#include "fatal.h" - -#include "splaytree_types.h" -#include "splaytree.h" -#include "tree_types.h" - -#include "expr_types.h" -#include "eval.h" - -#include "param_types.h" -#include "param.h" - -#include "func_types.h" -#include "func.h" - -#include "preset_types.h" -#include "builtin_funcs.h" - -#include "per_pixel_eqn_types.h" -#include "per_pixel_eqn.h" - -#include "init_cond_types.h" -#include "init_cond.h" - -#include "per_frame_eqn_types.h" -#include "per_frame_eqn.h" - -#include "parser.h" -#include "engine_vars.h" - -#include "custom_wave_types.h" -#include "custom_wave.h" - -#include "custom_shape_types.h" -#include "custom_shape.h" - -/* Strings that prefix (and denote the type of) equations */ - - -#define PER_FRAME_STRING "per_frame_" -#define PER_FRAME_STRING_LENGTH 10 - -#define PER_PIXEL_STRING "per_pixel_" -#define PER_PIXEL_STRING_LENGTH 10 - -#define PER_FRAME_INIT_STRING "per_frame_init_" -#define PER_FRAME_INIT_STRING_LENGTH 15 - -#define WAVECODE_STRING "wavecode_" -#define WAVECODE_STRING_LENGTH 9 - -#define WAVE_STRING "wave_" -#define WAVE_STRING_LENGTH 5 - -#define PER_POINT_STRING "per_point" -#define PER_POINT_STRING_LENGTH 9 - -#define PER_FRAME_STRING_NO_UNDERSCORE "per_frame" -#define PER_FRAME_STRING_NO_UNDERSCORE_LENGTH 9 - -#define SHAPECODE_STRING "shapecode_" -#define SHAPECODE_STRING_LENGTH 10 - -#define SHAPE_STRING "shape_" -#define SHAPE_STRING_LENGTH 6 - -#define SHAPE_INIT_STRING "init" -#define SHAPE_INIT_STRING_LENGTH 4 - -#define WAVE_INIT_STRING "init" -#define WAVE_INIT_STRING_LENGTH 4 - -/* Stores a line of a file as its being parsed */ -char string_line_buffer[STRING_LINE_SIZE]; - -/* The current position of the string line buffer (see above) */ -int string_line_buffer_index = 0; - -/* All infix operators (except '=') are prototyped here */ -extern infix_op_t * infix_add, * infix_minus, * infix_div, * infix_mult, - * infix_or, * infix_and, * infix_mod, * infix_positive, * infix_negative; - -/* If the parser reads a line with a custom wave, this pointer is set to - the custom wave of concern */ -custom_wave_t * current_wave = NULL; -custom_shape_t * current_shape = NULL; -/* Counts the number of lines parsed */ -unsigned int line_count = 1; -int per_frame_eqn_count = 0; -int per_frame_init_eqn_count = 0; - -typedef enum { - NORMAL_LINE_MODE, - PER_FRAME_LINE_MODE, - PER_PIXEL_LINE_MODE, - INIT_COND_LINE_MODE, - CUSTOM_WAVE_PER_POINT_LINE_MODE, - CUSTOM_WAVE_PER_FRAME_LINE_MODE, - CUSTOM_WAVE_WAVECODE_LINE_MODE, - CUSTOM_SHAPE_SHAPECODE_LINE_MODE, -} line_mode_t; - -line_mode_t line_mode = NORMAL_LINE_MODE; - -/* Token enumeration type */ -typedef enum { - - tEOL, /* end of a line, usually a '/n' or '/r' */ - tEOF, /* end of file */ - tLPr, /* ( */ - tRPr, /* ) */ - tLBr, /* [ */ - tRBr, /* ] */ - tEq, /* = */ - tPlus, /* + */ - tMinus, /* - */ - tMult, /* * */ - tMod, /* % */ - tDiv, /* / */ - tOr, /* | */ - tAnd, /* & */ - tComma, /* , */ - tPositive, /* + as a prefix operator */ - tNegative, /* - as a prefix operator */ - tSemiColon, /* ; */ - tStringTooLong, /* special token to indicate an invalid string length */ - tStringBufferFilled /* the string buffer for this line is maxed out */ -} token_t; - - -int get_string_prefix_len(char * string); -tree_expr_t * insert_gen_expr(gen_expr_t * gen_expr, tree_expr_t ** root); -tree_expr_t * insert_infix_op(infix_op_t * infix_op, tree_expr_t ** root); -token_t parseToken(FILE * fs, char * string); -gen_expr_t ** parse_prefix_args(FILE * fs, int num_args, struct PRESET_T * preset); -gen_expr_t * parse_infix_op(FILE * fs, token_t token, tree_expr_t * tree_expr, struct PRESET_T * preset); -gen_expr_t * parse_sign_arg(FILE * fs); -int parse_float(FILE * fs, double * float_ptr); -int parse_int(FILE * fs, int * int_ptr); -int insert_gen_rec(gen_expr_t * gen_expr, tree_expr_t * root); -int insert_infix_rec(infix_op_t * infix_op, tree_expr_t * root); -gen_expr_t * parse_gen_expr(FILE * fs, tree_expr_t * tree_expr, struct PRESET_T * preset); -per_frame_eqn_t * parse_implicit_per_frame_eqn(FILE * fs, char * param_string, int index, struct PRESET_T * preset); -init_cond_t * parse_per_frame_init_eqn(FILE * fs, struct PRESET_T * preset, splaytree_t * database); -int parse_wavecode_prefix(char * token, int * id, char ** var_string); -int parse_wavecode(char * token, FILE * fs, preset_t * preset); -int parse_wave_prefix(char * token, int * id, char ** eqn_string); - -int parse_shapecode(char * eqn_string, FILE * fs, preset_t * preset); -int parse_shapecode_prefix(char * token, int * id, char ** var_string); - -int parse_wave(char * eqn_string, FILE * fs, preset_t * preset); -int parse_shape(char * eqn_string, FILE * fs, preset_t * preset); -int parse_shape_prefix(char * token, int * id, char ** eqn_string); - -int update_string_buffer(char * buffer, int * index); -int string_to_float(char * string, double * float_ptr); - -/* Grabs the next token from the file. The second argument points - to the raw string */ - -token_t parseToken(FILE * fs, char * string) { - - char c; - int i; - - if (string != NULL) - memset(string, 0, MAX_TOKEN_SIZE); - - /* Loop until a delimiter is found, or the maximum string size is found */ - for (i = 0; i < MAX_TOKEN_SIZE;i++) { - c = fgetc(fs); - - /* If the string line buffer is full, quit */ - if (string_line_buffer_index == (STRING_LINE_SIZE - 1)) - return tStringBufferFilled; - - /* Otherwise add this character to the string line buffer */ - string_line_buffer[string_line_buffer_index++] = c; - /* Now interpret the character */ - switch (c) { - - case '+': - return tPlus; - case '-': - return tMinus; - case '%': - return tMod; - case '/': - - /* check for line comment here */ - if ((c = fgetc(fs)) == '/') { - while(1) { - c = fgetc(fs); - if (c == EOF) { - line_mode = NORMAL_LINE_MODE; - return tEOF; - } - if (c == '\n') { - line_mode = NORMAL_LINE_MODE; - return tEOL; - } - } - - } - - /* Otherwise, just a regular division operator */ - ungetc(c, fs); - return tDiv; - - case '*': - return tMult; - case '|': - return tOr; - case '&': - return tAnd; - case '(': - return tLPr; - case ')': - return tRPr; - case '[': - return tLBr; - case ']': - return tRBr; - case '=': - return tEq; - // case '\r': - //break; - case '\n': - line_count++; - line_mode = NORMAL_LINE_MODE; - return tEOL; - case ',': - return tComma; - case ';': - return tSemiColon; - case ' ': /* space, skip the character */ - i--; - break; - case EOF: - line_count = 1; - line_mode = NORMAL_LINE_MODE; - return tEOF; - - default: - if (string != NULL) - string[i] = c; - } - - } - - /* String reached maximum length, return special token error */ - return tStringTooLong; - -} - -/* Parse input in the form of "exp, exp, exp, ...)" - Returns a general expression list */ - -gen_expr_t ** parse_prefix_args(FILE * fs, int num_args, struct PRESET_T * preset) { - - int i, j; - gen_expr_t ** expr_list; /* List of arguments to function */ - gen_expr_t * gen_expr; - - /* Malloc the expression list */ - expr_list = (gen_expr_t**)malloc(sizeof(gen_expr_t*)*num_args); - - /* Malloc failed */ - if (expr_list == NULL) - return NULL; - - - i = 0; - - while (i < num_args) { - //if (PARSE_DEBUG) printf("parse_prefix_args: parsing argument %d...\n", i+1); - /* Parse the ith expression in the list */ - if ((gen_expr = parse_gen_expr(fs, NULL, preset)) == NULL) { - //if (PARSE_DEBUG) printf("parse_prefix_args: failed to get parameter # %d for function (LINE %d)\n", i+1, line_count); - for (j = 0; j < i; j++) - free_gen_expr(expr_list[j]); - free(expr_list); - return NULL; - } - /* Assign entry in expression list */ - expr_list[i++] = gen_expr; - } - - //if (PARSE_DEBUG) printf("parse_prefix_args: finished parsing %d arguments (LINE %d)\n", num_args, line_count); - /* Finally, return the resulting expression list */ - return expr_list; - -} - -/* Parses a comment at the top of the file. Stops when left bracket is found */ -int parse_top_comment(FILE * fs) { - - char string[MAX_TOKEN_SIZE]; - token_t token; - - /* Process tokens until left bracket is found */ - while ((token = parseToken(fs, string)) != tLBr) { - if (token == tEOF) - return PARSE_ERROR; - } - - /* Done, return success */ - return SUCCESS; -} - -/* Right Bracket is parsed by this function. - puts a new string into name */ -int parse_preset_name(FILE * fs, char * name) { - - token_t token; - - if (name == NULL) - return FAILURE; - - if ((token = parseToken(fs, name)) != tRBr) - return PARSE_ERROR; - - //if (PARSE_DEBUG) printf("parse_preset_name: parsed preset (name = \"%s\")\n", name); - - return SUCCESS; -} - - -/* Parses per pixel equations */ -int parse_per_pixel_eqn(FILE * fs, preset_t * preset) { - - - char string[MAX_TOKEN_SIZE]; - gen_expr_t * gen_expr; - - if (PARSE_DEBUG) printf("parse_per_pixel: per_pixel equation parsing start...(LINE %d)\n", line_count); - - if (parseToken(fs, string) != tEq) { /* parse per pixel operator name */ - if (PARSE_DEBUG) printf("parse_per_pixel: equal operator expected after per pixel operator \"%s\", but not found (LINE %d)\n", - string, line_count); - return PARSE_ERROR; - } - - /* Parse right side of equation as an expression */ - if ((gen_expr = parse_gen_expr(fs, NULL, preset)) == NULL) { - if (PARSE_DEBUG) printf("parse_per_pixel: equation evaluated to null? (LINE %d)\n", line_count); - return PARSE_ERROR; - } - - /* Add the per pixel equation */ - if (add_per_pixel_eqn(string, gen_expr, preset) < 0) { - free_gen_expr(gen_expr); - return PARSE_ERROR; - } - - return SUCCESS; -} - -/* Parses an equation line, this function is way too big, should add some helper functions */ -int parse_line(FILE * fs, struct PRESET_T * preset) { - - char eqn_string[MAX_TOKEN_SIZE]; - token_t token; - init_cond_t * init_cond; - per_frame_eqn_t * per_frame_eqn; - - /* Clear the string line buffer */ - memset(string_line_buffer, 0, STRING_LINE_SIZE); - string_line_buffer_index = 0; - - - switch (token = parseToken(fs, eqn_string)) { - - /* Invalid Cases */ - case tRBr: - case tLPr: - case tRPr: - case tComma: - case tLBr: - case tPlus: - case tMinus: - case tMod: - case tMult: - case tOr: - case tAnd: - case tDiv: - - // if (PARSE_DEBUG) printf("parse_line: invalid token found at start of line (LINE %d)\n", line_count); - /* Invalid token found, return a parse error */ - return PARSE_ERROR; - - - case tEOL: /* Empty line */ - line_mode = NORMAL_LINE_MODE; - return SUCCESS; - - case tEOF: /* End of File */ - line_mode = NORMAL_LINE_MODE; - line_count = 1; - return EOF; - - case tSemiColon: /* Indicates end of expression */ - return SUCCESS; - - /* Valid Case, either an initial condition or equation should follow */ - case tEq: - - /* CASE: PER FRAME INIT EQUATION */ - if (!strncmp(eqn_string, PER_FRAME_INIT_STRING, PER_FRAME_INIT_STRING_LENGTH)) { - - //if (PARSE_DEBUG) printf("parse_line: per frame init equation found...(LINE %d)\n", line_count); - - /* Set the line mode to normal */ - line_mode = NORMAL_LINE_MODE; - - /* Parse the per frame equation */ - if ((init_cond = parse_per_frame_init_eqn(fs, preset, NULL)) == NULL) { - //if (PARSE_DEBUG) printf("parse_line: per frame init equation parsing failed (LINE %d)\n", line_count); - return PARSE_ERROR; - } - - /* Insert the equation in the per frame equation tree */ - if (splay_insert(init_cond, init_cond->param->name, preset->per_frame_init_eqn_tree) < 0) { - //if (PARSE_DEBUG) printf("parse_line: failed to add a perframe equation (ERROR)\n"); - free_init_cond(init_cond); /* will free the gen expr too */ - return ERROR; - } - - - if (update_string_buffer(preset->per_frame_init_eqn_string_buffer, - &preset->per_frame_init_eqn_string_index) < 0) - { return FAILURE;} - - return SUCCESS; - - } - - /* Per frame equation case */ - if (!strncmp(eqn_string, PER_FRAME_STRING, PER_FRAME_STRING_LENGTH)) { - - /* Sometimes per frame equations are implicitly defined without the - per_frame_ prefix. This informs the parser that one could follow */ - line_mode = PER_FRAME_LINE_MODE; - - //if (PARSE_DEBUG) printf("parse_line: per frame equation found...(LINE %d)\n", line_count); - - /* Parse the per frame equation */ - if ((per_frame_eqn = parse_per_frame_eqn(fs, ++per_frame_eqn_count, preset)) == NULL) { - if (PARSE_DEBUG) printf("parse_line: per frame equation parsing failed (LINE %d)\n", line_count); - return PARSE_ERROR; - } - - /* Insert the equation in the per frame equation tree */ - if (splay_insert(per_frame_eqn, &per_frame_eqn_count, preset->per_frame_eqn_tree) < 0) { - if (PARSE_DEBUG) printf("parse_line: failed to add a perframe equation (ERROR)\n"); - free_per_frame_eqn(per_frame_eqn); /* will free the gen expr too */ - return ERROR; - } - - if (update_string_buffer(preset->per_frame_eqn_string_buffer, - &preset->per_frame_eqn_string_index) < 0) - return FAILURE; - - - - return SUCCESS; - - } - - /* Wavecode initial condition case */ - if (!strncmp(eqn_string, WAVECODE_STRING, WAVECODE_STRING_LENGTH)) { - - line_mode = CUSTOM_WAVE_WAVECODE_LINE_MODE; - - //if (PARSE_DEBUG) - // printf("parse_line: wavecode prefix found: \"%s\"\n", eqn_string); - - // printf("string:%d\n", 5); - - //SUPER MYSTERIO-BUG - Don't Remove - printf(""); - - return parse_wavecode(eqn_string, fs, preset); - } - - /* Custom Wave Prefix */ - if ((!strncmp(eqn_string, WAVE_STRING, WAVE_STRING_LENGTH)) && - ((eqn_string[5] >= 48) && (eqn_string[5] <= 57))) { - - // if (PARSE_DEBUG) printf("parse_line wave prefix found: \"%s\"\n", eqn_string); - - return parse_wave(eqn_string, fs, preset); - - } - - - /* Shapecode initial condition case */ - if (!strncmp(eqn_string, SHAPECODE_STRING, SHAPECODE_STRING_LENGTH)) { - - line_mode = CUSTOM_SHAPE_SHAPECODE_LINE_MODE; - - if (PARSE_DEBUG) printf("parse_line: shapecode prefix found: \"%s\"\n", eqn_string); - - return parse_shapecode(eqn_string, fs, preset); - } - - /* Custom Shape Prefix */ - if ((!strncmp(eqn_string, SHAPE_STRING, SHAPE_STRING_LENGTH)) && - ((eqn_string[6] >= 48) && (eqn_string[6] <= 57))) { - - if (PARSE_DEBUG) printf("parse_line shape prefix found: \"%s\"\n", eqn_string); - return parse_shape(eqn_string, fs, preset); - - } - - /* Per pixel equation case */ - if (!strncmp(eqn_string, PER_PIXEL_STRING, PER_PIXEL_STRING_LENGTH)) { - line_mode = PER_PIXEL_LINE_MODE; - - if (parse_per_pixel_eqn(fs, preset) < 0) - return PARSE_ERROR; - - - if (update_string_buffer(preset->per_pixel_eqn_string_buffer, - &preset->per_pixel_eqn_string_index) < 0) - return FAILURE; - - if (PARSE_DEBUG) printf("parse_line: finished parsing per pixel equation (LINE %d)\n", line_count); - return SUCCESS; - } - - /* Sometimes equations are written implicitly in milkdrop files, in the form - - per_frame_1 = p1 = eqn1; p2 = eqn2; p3 = eqn3;..; - - which is analagous to: - - per_frame_1 = p1 = eqn1; per_frame_2 = p2 = eqn2; per_frame_3 = p3 = eqn3; ...; - - The following line mode hack allows such implicit declaration of the - prefix that specifies the equation type. An alternative method - may be to associate each equation line as list of equations separated - by semicolons (and a new line ends the list). Instead, however, a global - variable called "line_mode" specifies the last type of equation found, - and bases any implicitly typed input on this fact - - Note added by Carmelo Piccione (cep@andrew.cmu.edu) 10/19/03 - */ - - /* Per frame line mode previously, try to parse the equation implicitly */ - if (line_mode == PER_FRAME_LINE_MODE) { - if ((per_frame_eqn = parse_implicit_per_frame_eqn(fs, eqn_string, ++per_frame_eqn_count, preset)) == NULL) - return PARSE_ERROR; - - /* Insert the equation in the per frame equation tree */ - if (splay_insert(per_frame_eqn, &per_frame_eqn_count, preset->per_frame_eqn_tree) < 0) { - if (PARSE_DEBUG) printf("parse_line: failed to add a perframe equation (ERROR)\n"); - free_per_frame_eqn(per_frame_eqn); /* will free the gen expr too */ - return ERROR; - } - - - if (update_string_buffer(preset->per_frame_eqn_string_buffer, - &preset->per_frame_eqn_string_index) < 0) - return FAILURE; - - - - return SUCCESS; - } - - //if (PARSE_DEBUG) printf("parse_line: found initial condition: name = \"%s\" (LINE %d)\n", eqn_string, line_count); - - /* Evaluate the initial condition */ - if ((init_cond = parse_init_cond(fs, eqn_string, preset)) == NULL) { - if (PARSE_DEBUG) printf("parse_line: failed to parse initial condition (LINE %d)\n", line_count); - return PARSE_ERROR; - } - - /* Add equation to initial condition tree */ - if (splay_insert(init_cond, init_cond->param->name, preset->init_cond_tree) < 0) { - if (PARSE_DEBUG) printf("parse_line: failed to add initial condition \"%s\" to equation tree (LINE %d)\n", - init_cond->param->name, line_count); - free_init_cond(init_cond); - return FAILURE; - } - - /* Finished with initial condition line */ - // if (PARSE_DEBUG) printf("parse_line: initial condition parsed successfully\n"); - - return SUCCESS; - - /* END INITIAL CONDITIONING PARSING */ - - - default: /* an uncaught type or an error has occurred */ - if (PARSE_DEBUG) printf("parse_line: uncaught case, token val = %d\n", token); - return PARSE_ERROR; - } - - /* Because of the default in the case statement, - control flow should never actually reach here */ - return PARSE_ERROR; -} - - - -/* Parses a general expression, this function is the meat of the parser */ -gen_expr_t * parse_gen_expr (FILE * fs, tree_expr_t * tree_expr, struct PRESET_T * preset) { - - int i; - char string[MAX_TOKEN_SIZE]; - token_t token; - gen_expr_t * gen_expr; - double val; - param_t * param = NULL; - func_t * func; - gen_expr_t ** expr_list; - - switch (token = parseToken(fs,string)) { - /* Left Parentice Case */ - case tLPr: - - /* CASE 1 (Left Parentice): See if the previous string before this parentice is a function name */ - if ((func = find_func(string)) != NULL) { - if (PARSE_DEBUG) printf("parse_gen_expr: found prefix function (name = %s) (LINE %d)\n", func->name, line_count); - - /* Parse the functions arguments */ - if ((expr_list = parse_prefix_args(fs, func->num_args, preset)) == NULL) { - if (PARSE_DEBUG) printf("parse_prefix_args: failed to generate an expresion list! (LINE %d) \n", line_count); - free_tree_expr(tree_expr); - return NULL; - } - - /* Convert function to expression */ - if ((gen_expr = prefun_to_expr((void*)func->func_ptr, expr_list, func->num_args)) == NULL) { - if (PARSE_DEBUG) printf("parse_prefix_args: failed to convert prefix function to general expression (LINE %d) \n", - line_count); - free_tree_expr(tree_expr); - for (i = 0; i < func->num_args;i++) - free_gen_expr(expr_list[i]); - free(expr_list); - return NULL; - } - - - - token = parseToken(fs, string); - - if (*string != 0) { - if (PARSE_DEBUG) printf("parse_prefix_args: empty string expected, but not found...(LINE %d)\n", line_count); - /* continue anyway for now, could be implicit multiplication */ - } - - return parse_infix_op(fs, token, insert_gen_expr(gen_expr, &tree_expr), preset); - } - - - /* Case 2: (Left Parentice), a string coupled with a left parentice. Either an error or implicit - multiplication operator. For now treat it as an error */ - if (*string != 0) { - if (PARSE_DEBUG) printf("parse_gen_expr: implicit multiplication case unimplemented!\n"); - free_tree_expr(tree_expr); - return NULL; - } - - /* CASE 3 (Left Parentice): the following is enclosed parentices to change order - of operations. So we create a new expression tree */ - - if ((gen_expr = parse_gen_expr(fs, NULL, preset)) == NULL) { - //if (PARSE_DEBUG) printf("parse_gen_expr: found left parentice, but failed to create new expression tree \n"); - free_tree_expr(tree_expr); - return NULL; - } - - if (PARSE_DEBUG) printf("parse_gen_expr: finished enclosed expression tree...\n"); - token = parseToken(fs, string); - return parse_infix_op(fs, token, insert_gen_expr(gen_expr, &tree_expr), preset); - - /* Plus is a prefix operator check */ - case tPlus: - if (*string == 0) { - - //if (PARSE_DEBUG) printf("parse_gen_expr: plus used as prefix (LINE %d)\n", line_count); - - /* Treat prefix plus as implict 0 preceding operator */ - gen_expr = const_to_expr(0); - - return parse_infix_op(fs, tPositive, insert_gen_expr(gen_expr, &tree_expr), preset); - } - - /* Minus is a prefix operator check */ - case tMinus: - if (*string == 0) { - - /* Use the negative infix operator, but first add an implicit zero to the operator tree */ - gen_expr = const_to_expr(0); - //return parse_gen_expr(fs, insert_gen_expr(gen_expr, &tree_expr), preset); - return parse_infix_op(fs, tNegative, insert_gen_expr(gen_expr, &tree_expr), preset); - } - - /* All the following cases are strings followed by an infix operator or terminal */ - case tRPr: - case tEOL: - case tEOF: - case tSemiColon: - case tComma: - - /* CASE 1 (terminal): string is empty, but not null. Not sure if this will actually happen - any more. */ - if (*string == 0) { - //if (PARSE_DEBUG) printf("parse_gen_expr: empty string coupled with terminal (LINE %d) \n", line_count); - return parse_infix_op(fs, token, tree_expr, preset); - - } - - default: - - /* CASE 0: Empty string, parse error */ - if (*string == 0) { - if (PARSE_DEBUG) printf("parse_gen_expr: empty string coupled with infix op (ERROR!) (LINE %d) \n", line_count); - free_tree_expr(tree_expr); - return NULL; - } - - /* CASE 1: Check if string is a just a floating point number */ - if (string_to_float(string, &val) != PARSE_ERROR) { - if ((gen_expr = const_to_expr(val)) == NULL) { - free_tree_expr(tree_expr); - return NULL; - } - - /* Parse the rest of the line */ - return parse_infix_op(fs, token, insert_gen_expr(gen_expr, &tree_expr), preset); - - } - - - /* CASE 4: custom shape variable */ - if (current_shape != NULL) { - if ((param = find_param_db(string, current_shape->param_tree, FALSE)) == NULL) { - if ((param = find_builtin_param(string)) == NULL) - if ((param = find_param_db(string, current_shape->param_tree, TRUE)) == NULL) { - free_tree_expr(tree_expr); - return NULL; - } - } - - if (PARSE_DEBUG) { - printf("parse_gen_expr: custom shape parameter (name = %s)... ", param->name); - fflush(stdout); - } - - /* Convert parameter to an expression */ - if ((gen_expr = param_to_expr(param)) == NULL) { - free_tree_expr(tree_expr); - return NULL; - } - - //if (PARSE_DEBUG) printf("converted to expression (LINE %d)\n", line_count); - - /* Parse the rest of the line */ - return parse_infix_op(fs, token, insert_gen_expr(gen_expr, &tree_expr), preset); - } - - /* CASE 5: custom wave variable */ - if (current_wave != NULL) { - if ((param = find_param_db(string, current_wave->param_tree, FALSE)) == NULL) { - if ((param = find_builtin_param(string)) == NULL) - if ((param = find_param_db(string, current_wave->param_tree, TRUE)) == NULL) { - free_tree_expr(tree_expr); - return NULL; - } - - } - - if (PARSE_DEBUG) { - printf("parse_gen_expr: custom wave parameter (name = %s)... ", param->name); - fflush(stdout); - } - - /* Convert parameter to an expression */ - if ((gen_expr = param_to_expr(param)) == NULL) { - free_tree_expr(tree_expr); - return NULL; - } - - if (PARSE_DEBUG) printf("converted to expression (LINE %d)\n", line_count); - - /* Parse the rest of the line */ - return parse_infix_op(fs, token, insert_gen_expr(gen_expr, &tree_expr), preset); - - } - - /* CASE 6: regular parameter. Will be created if necessary and the string has no invalid characters */ - if ((param = find_param(string, preset, P_CREATE)) != NULL) { - - if (PARSE_DEBUG) { - printf("parse_gen_expr: parameter (name = %s)... ", param->name); - fflush(stdout); - } - - /* Convert parameter to an expression */ - if ((gen_expr = param_to_expr(param)) == NULL) { - free_tree_expr(tree_expr); - return NULL; - } - - if (PARSE_DEBUG) printf("converted to expression (LINE %d)\n", line_count); - - /* Parse the rest of the line */ - return parse_infix_op(fs, token, insert_gen_expr(gen_expr, &tree_expr), preset); - - } - - /* CASE 7: Bad string, give up */ - if (PARSE_DEBUG) printf("parse_gen_expr: syntax error [string = \"%s\"] (LINE %d)\n", string, line_count); - free_tree_expr(tree_expr); - return NULL; - } -} - - - -/* Inserts expressions into tree according to operator precedence. - If root is null, a new tree is created, with gen_expr as only element */ - -tree_expr_t * insert_infix_op(infix_op_t * infix_op, tree_expr_t **root) { - - tree_expr_t * new_root; - - /* Sanity check */ - if (infix_op == NULL) - return NULL; - - /* The root is null, so make this operator - the new root */ - - if (*root == NULL) { - new_root = new_tree_expr(infix_op, NULL, NULL, NULL); - *root = new_root; - return new_root; - } - - /* The root node is not an infix function, - so we make this infix operator the new root */ - - if ((*root)->infix_op == NULL) { - new_root = new_tree_expr(infix_op, NULL, *root, NULL); - (*root) = new_root; - return new_root; - } - - /* The root is an infix function. If the precedence - of the item to be inserted is greater than the root's - precedence, then make gen_expr the root */ - - if (infix_op->precedence > (*root)->infix_op->precedence) { - new_root = new_tree_expr(infix_op, NULL, *root, NULL); - (*root) = new_root; - return new_root; - } - - /* If control flow reaches here, use a recursive helper - with the knowledge that the root is higher precedence - than the item to be inserted */ - - insert_infix_rec(infix_op, *root); - return *root; - -} - - -tree_expr_t * insert_gen_expr(gen_expr_t * gen_expr, tree_expr_t ** root) { - - tree_expr_t * new_root; - - /* If someone foolishly passes a null - pointer to insert, return the original tree */ - - if (gen_expr == NULL) { - return *root; - } - - /* If the root is null, generate a new expression tree, - using the passed expression as the root element */ - - if (*root == NULL) { - new_root = new_tree_expr(NULL, gen_expr, NULL, NULL); - *root = new_root; - return new_root; - } - - - /* Otherwise. the new element definitely will not replace the current root. - Use a recursive helper function to do insertion */ - - insert_gen_rec(gen_expr, *root); - return *root; -} - -/* A recursive helper function to insert general expression elements into the operator tree */ -int insert_gen_rec(gen_expr_t * gen_expr, tree_expr_t * root) { - - /* Trivial Case: root is null */ - - if (root == NULL) { - ////if (PARSE_DEBUG) printf("insert_gen_rec: root is null, returning failure\n"); - return FAILURE; - } - - - /* The current node's left pointer is null, and this - current node is an infix operator, so insert the - general expression at the left pointer */ - - if ((root->left == NULL) && (root->infix_op != NULL)) { - root->left = new_tree_expr(NULL, gen_expr, NULL, NULL); - return SUCCESS; - } - - /* The current node's right pointer is null, and this - current node is an infix operator, so insert the - general expression at the right pointer */ - - if ((root->right == NULL) && (root->infix_op != NULL)) { - root->right = new_tree_expr(NULL, gen_expr, NULL, NULL); - return SUCCESS; - } - - /* Otherwise recurse down to the left. If - this succeeds then return. If it fails, try - recursing down to the right */ - - if (insert_gen_rec(gen_expr, root->left) == FAILURE) - return insert_gen_rec(gen_expr, root->right); - - /* Impossible for control flow to reach here, but in - the world of C programming, who knows... */ - //if (PARSE_DEBUG) printf("insert_gen_rec: should never reach here!\n"); - return FAILURE; -} - - -/* A recursive helper function to insert infix arguments by operator precedence */ -int insert_infix_rec(infix_op_t * infix_op, tree_expr_t * root) { - - /* Shouldn't happen, implies a parse error */ - - if (root == NULL) - return FAILURE; - - /* Also shouldn't happen, also implies a (different) parse error */ - - if (root->infix_op == NULL) - return FAILURE; - - /* Left tree is empty, attach this operator to it. - I don't think this will ever happen */ - if (root->left == NULL) { - root->left = new_tree_expr(infix_op, NULL, root->left, NULL); - return SUCCESS; - } - - /* Right tree is empty, attach this operator to it */ - if (root->right == NULL) { - root->right = new_tree_expr(infix_op, NULL, root->right, NULL); - return SUCCESS; - } - - /* The left element can now be ignored, since there is no way for this - operator to use those expressions */ - - /* If the right element is not an infix operator, - then insert the expression here, attaching the old right branch - to the left of the new expression */ - - if (root->right->infix_op == NULL) { - root->right = new_tree_expr(infix_op, NULL, root->right, NULL); - return SUCCESS; - } - - /* Traverse deeper if the inserting operator precedence is less than the - the root's right operator precedence */ - if (infix_op->precedence < root->right->infix_op->precedence) - return insert_infix_rec(infix_op, root->right); - - /* Otherwise, insert the operator here */ - - root->right = new_tree_expr(infix_op, NULL, root->right, NULL); - return SUCCESS; - -} - -/* Parses an infix operator */ -gen_expr_t * parse_infix_op(FILE * fs, token_t token, tree_expr_t * tree_expr, struct PRESET_T * preset) { - - gen_expr_t * gen_expr; - - switch (token) { - /* All the infix operators */ - case tPlus: - //if (PARSE_DEBUG) printf("parse_infix_op: found addition operator (LINE %d)\n", line_count); - return parse_gen_expr(fs, insert_infix_op(infix_add, &tree_expr), preset); - case tMinus: - //if (PARSE_DEBUG) printf("parse_infix_op: found subtraction operator (LINE %d)\n", line_count); - return parse_gen_expr(fs, insert_infix_op(infix_minus, &tree_expr), preset); - case tMult: - //if (PARSE_DEBUG) printf("parse_infix_op: found multiplication operator (LINE %d)\n", line_count); - return parse_gen_expr(fs, insert_infix_op(infix_mult, &tree_expr), preset); - case tDiv: - //if (PARSE_DEBUG) printf("parse_infix_op: found division operator (LINE %d)\n", line_count); - return parse_gen_expr(fs, insert_infix_op(infix_div, &tree_expr), preset); - case tMod: - //if (PARSE_DEBUG) printf("parse_infix_op: found modulo operator (LINE %d)\n", line_count); - return parse_gen_expr(fs, insert_infix_op(infix_mod, &tree_expr), preset); - case tOr: - //if (PARSE_DEBUG) printf("parse_infix_op: found bitwise or operator (LINE %d)\n", line_count); - return parse_gen_expr(fs, insert_infix_op(infix_or, &tree_expr), preset); - case tAnd: - //if (PARSE_DEBUG) printf("parse_infix_op: found bitwise and operator (LINE %d)\n", line_count); - return parse_gen_expr(fs, insert_infix_op(infix_and, &tree_expr), preset); - case tPositive: - //if (PARSE_DEBUG) printf("parse_infix_op: found positive operator (LINE %d)\n", line_count); - return parse_gen_expr(fs, insert_infix_op(infix_positive, &tree_expr), preset); - case tNegative: - //if (PARSE_DEBUG) printf("parse_infix_op: found negative operator (LINE %d)\n", line_count); - return parse_gen_expr(fs, insert_infix_op(infix_negative, &tree_expr), preset); - - case tEOL: - case tEOF: - case tSemiColon: - case tRPr: - case tComma: - //if (PARSE_DEBUG) printf("parse_infix_op: terminal found (LINE %d)\n", line_count); - gen_expr = new_gen_expr(TREE_T, (void*)tree_expr); - return gen_expr; - default: - //if (PARSE_DEBUG) printf("parse_infix_op: operator or terminal expected, but not found (LINE %d)\n", line_count); - free_tree_expr(tree_expr); - return NULL; - } - - /* Will never happen */ - return NULL; - -} - -/* Parses an integer, checks for +/- prefix */ -int parse_int(FILE * fs, int * int_ptr) { - -char string[MAX_TOKEN_SIZE]; - token_t token; - int sign; - char * end_ptr = " "; - - token = parseToken(fs, string); - - - switch (token) { - case tMinus: - sign = -1; - token = parseToken(fs, string); - break; - case tPlus: - sign = 1; - token = parseToken(fs, string); - break; - default: - sign = 1; - break; - } - - - if (string[0] == 0) - return PARSE_ERROR; - - /* Convert the string to an integer. *end_ptr - should end up pointing to null terminator of 'string' - if the conversion was successful. */ - // printf("STRING: \"%s\"\n", string); - - (*int_ptr) = sign*strtol(string, &end_ptr, 10); - - /* If end pointer is a return character or null terminator, all is well */ - if ((*end_ptr == '\r') || (*end_ptr == '\0')) - return SUCCESS; - - return PARSE_ERROR; - -} -/* Parses a floating point number */ -int string_to_float(char * string, double * float_ptr) { - - char ** error_ptr; - - if (*string == 0) - return PARSE_ERROR; - - error_ptr = malloc(sizeof(char**)); - - (*float_ptr) = strtod(string, error_ptr); - - /* These imply a succesful parse of the string */ - if ((**error_ptr == '\0') || (**error_ptr == '\r')) { - free(error_ptr); - return SUCCESS; - } - - (*float_ptr) = 0; - free(error_ptr); - return PARSE_ERROR; -} - -/* Parses a floating point number */ -int parse_float(FILE * fs, double * float_ptr) { - - char string[MAX_TOKEN_SIZE]; - char ** error_ptr; - token_t token; - int sign; - - error_ptr = malloc(sizeof(char**)); - - token = parseToken(fs, string); - - switch (token) { - case tMinus: - sign = -1; - token = parseToken(fs, string); - break; - case tPlus: - sign = 1; - token = parseToken(fs, string); - break; - default: - sign = 1; - } - - if (string[0] == 0) { - free(error_ptr); - return PARSE_ERROR; - } - - (*float_ptr) = sign*strtod(string, error_ptr); - - /* No conversion was performed */ - if ((**error_ptr == '\0') || (**error_ptr == '\r')) { - free(error_ptr); - return SUCCESS; - } - - //if (PARSE_DEBUG) printf("parse_float: double conversion failed for string \"%s\"\n", string); - - (*float_ptr) = 0; - free(error_ptr); - return PARSE_ERROR; - - - -} - -/* Parses a per frame equation. That is, interprets a stream of data as a per frame equation */ -per_frame_eqn_t * parse_per_frame_eqn(FILE * fs, int index, struct PRESET_T * preset) { - - char string[MAX_TOKEN_SIZE]; - param_t * param; - per_frame_eqn_t * per_frame_eqn; - gen_expr_t * gen_expr; - - if (parseToken(fs, string) != tEq) { - //if (PARSE_DEBUG) printf("parse_per_frame_eqn: no equal sign after string \"%s\" (LINE %d)\n", string, line_count); - return NULL; - } - - /* Find the parameter associated with the string, create one if necessary */ - if ((param = find_param(string, preset, P_CREATE)) == NULL) { - return NULL; - } - - /* Make sure parameter is writable */ - if (param->flags & P_FLAG_READONLY) { - //if (PARSE_DEBUG) printf("parse_per_frame_eqn: parameter %s is marked as read only (LINE %d)\n", param->name, line_count); - return NULL; - } - - /* Parse right side of equation as an expression */ - if ((gen_expr = parse_gen_expr(fs, NULL, preset)) == NULL) { - //if (PARSE_DEBUG) printf("parse_per_frame_eqn: equation evaluated to null (LINE %d)\n", line_count); - return NULL; - } - - //if (PARSE_DEBUG) printf("parse_per_frame_eqn: finished per frame equation evaluation (LINE %d)\n", line_count); - - /* Create a new per frame equation */ - if ((per_frame_eqn = new_per_frame_eqn(index, param, gen_expr)) == NULL) { - //if (PARSE_DEBUG) printf("parse_per_frame_eqn: failed to create a new per frame eqn, out of memory?\n"); - free_gen_expr(gen_expr); - return NULL; - } - - //if (PARSE_DEBUG) printf("parse_per_frame_eqn: per_frame eqn parsed succesfully\n"); - - return per_frame_eqn; -} - -/* Parses an 'implicit' per frame equation. That is, interprets a stream of data as a per frame equation without a prefix */ -per_frame_eqn_t * parse_implicit_per_frame_eqn(FILE * fs, char * param_string, int index, struct PRESET_T * preset) { - - param_t * param; - per_frame_eqn_t * per_frame_eqn; - gen_expr_t * gen_expr; - - if (fs == NULL) - return NULL; - if (param_string == NULL) - return NULL; - if (preset == NULL) - return NULL; - - //rintf("param string: %s\n", param_string); - /* Find the parameter associated with the string, create one if necessary */ - if ((param = find_param(param_string, preset, P_CREATE)) == NULL) { - return NULL; - } - - //printf("parse_implicit_per_frame_eqn: param is %s\n", param->name); - - /* Make sure parameter is writable */ - if (param->flags & P_FLAG_READONLY) { - //if (PARSE_DEBUG) printf("parse_implicit_per_frame_eqn: parameter %s is marked as read only (LINE %d)\n", param->name, line_count); - return NULL; - } - - /* Parse right side of equation as an expression */ - if ((gen_expr = parse_gen_expr(fs, NULL, preset)) == NULL) { - //if (PARSE_DEBUG) printf("parse_implicit_per_frame_eqn: equation evaluated to null (LINE %d)\n", line_count); - return NULL; - } - - //if (PARSE_DEBUG) printf("parse_implicit_per_frame_eqn: finished per frame equation evaluation (LINE %d)\n", line_count); - - /* Create a new per frame equation */ - if ((per_frame_eqn = new_per_frame_eqn(index, param, gen_expr)) == NULL) { - //if (PARSE_DEBUG) printf("parse_implicit_per_frame_eqn: failed to create a new per frame eqn, out of memory?\n"); - free_gen_expr(gen_expr); - return NULL; - } - - //if (PARSE_DEBUG) printf("parse_implicit_per_frame_eqn: per_frame eqn parsed succesfully\n"); - - return per_frame_eqn; -} - -/* Parses an initial condition */ -init_cond_t * parse_init_cond(FILE * fs, char * name, struct PRESET_T * preset) { - - param_t * param; - value_t init_val; - init_cond_t * init_cond; - - if (name == NULL) - return NULL; - if (preset == NULL) - return NULL; - - /* Search for the paramater in the database, creating it if necessary */ - if ((param = find_param(name, preset, P_CREATE)) == NULL) { - return NULL; - } - - //if (PARSE_DEBUG) printf("parse_init_cond: parameter = \"%s\" (LINE %d)\n", param->name, line_count); - - if (param->flags & P_FLAG_READONLY) { - //if (PARSE_DEBUG) printf("parse_init_cond: builtin parameter \"%s\" marked as read only!\n", param->name); - return NULL; - } - - /* At this point, a parameter has been created or was found - in the database. */ - - //if (PARSE_DEBUG) printf("parse_init_cond: parsing initial condition value... (LINE %d)\n", line_count); - - /* integer value (boolean is an integer in C) */ - if ((param->type == P_TYPE_INT) || (param->type == P_TYPE_BOOL)) { - if ((parse_int(fs, (int*)&init_val.int_val)) == PARSE_ERROR) { - //if (PARSE_DEBUG) printf("parse_init_cond: error parsing integer!\n"); - return NULL; - } - } - - /* double value */ - else if (param->type == P_TYPE_DOUBLE) { - if ((parse_float(fs, (double*)&init_val.double_val)) == PARSE_ERROR) { - //if (PARSE_DEBUG) printf("parse_init_cond: error parsing double!\n"); - return NULL; - } - } - - /* Unknown value */ - else { - //if (PARSE_DEBUG) printf("parse_init_cond: unknown parameter type!\n"); - return NULL; - } - - /* Create new initial condition */ - if ((init_cond = new_init_cond(param, init_val)) == NULL) { - //if (PARSE_DEBUG) printf("parse_init_cond: new_init_cond failed!\n"); - return NULL; - } - - /* Finished */ - return init_cond; -} - -/* Parses a per frame init equation, not sure if this works right now */ -init_cond_t * parse_per_frame_init_eqn(FILE * fs, struct PRESET_T * preset, splaytree_t * database) { - - char name[MAX_TOKEN_SIZE]; - param_t * param = NULL; - value_t init_val; - init_cond_t * init_cond; - gen_expr_t * gen_expr; - double val; - token_t token; - - - if (preset == NULL) - return NULL; - if (fs == NULL) - return NULL; - - if ((token = parseToken(fs, name)) != tEq) - return NULL; - - - /* If a database was specified,then use find_param_db instead */ - if ((database != NULL) && ((param = find_param_db(name, database, TRUE)) == NULL)) { - return NULL; - } - - /* Otherwise use the builtin parameter and user databases. This is confusing. Sorry. */ - if ((param == NULL) && ((param = find_param(name, preset, P_CREATE)) == NULL)) { - return NULL; - } - - //if (PARSE_DEBUG) printf("parse_per_frame_init_eqn: parameter = \"%s\" (LINE %d)\n", param->name, line_count); - - if (param->flags & P_FLAG_READONLY) { - //if (PARSE_DEBUG) printf("pars_per_frame_init_eqn: builtin parameter \"%s\" marked as read only!\n", param->name); - return NULL; - } - - /* At this point, a parameter has been created or was found - in the database. */ - - //if (PARSE_DEBUG) printf("parse_per_frame_init_eqn: parsing right hand side of per frame init equation.. (LINE %d)\n", line_count); - - if ((gen_expr = parse_gen_expr(fs, NULL, preset)) == NULL) { - //if (PARSE_DEBUG) printf("parse_per_frame_init_eqn: failed to parse general expresion!\n"); - return NULL; - } - - /* Compute initial condition value */ - val = eval_gen_expr(gen_expr); - - /* Free the general expression now that we are done with it */ - free_gen_expr(gen_expr); - - /* integer value (boolean is an integer in C) */ - if ((param->type == P_TYPE_INT) || (param->type == P_TYPE_BOOL)) { - init_val.int_val = (int)val; - } - - /* double value */ - else if (param->type == P_TYPE_DOUBLE) { - init_val.double_val = val; - } - - /* Unknown value */ - else { - //if (PARSE_DEBUG) printf("parse_per_frame_init_eqn: unknown parameter type!\n"); - return NULL; - } - - - /* Create new initial condition */ - if ((init_cond = new_init_cond(param, init_val)) == NULL) { - //if (PARSE_DEBUG) printf("parse_per_frame_init_eqn: new_init_cond failed!\n"); - return NULL; - } - - - /* Finished */ - return init_cond; -} - -int parse_wavecode(char * token, FILE * fs, preset_t * preset) { - - char * var_string; - init_cond_t * init_cond; - custom_wave_t * custom_wave; - int id; - value_t init_val; - param_t * param; - - /* Null argument checks */ - if (preset == NULL) - return FAILURE; - if (fs == NULL) - return FAILURE; - if (token == NULL) - return FAILURE; - - /* token should be in the form wavecode_N_var, such as wavecode_1_samples */ - - /* Get id and variable name from token string */ - if (parse_wavecode_prefix(token, &id, &var_string) < 0) - return PARSE_ERROR; - - //if (PARSE_DEBUG) printf("parse_wavecode: wavecode id = %d, parameter = \"%s\"\n", id, var_string); - - /* Retrieve custom wave information from preset. The 3rd argument - if true creates a custom wave if one does not exist */ - if ((custom_wave = find_custom_wave(id, preset, TRUE)) == NULL) { - //if (PARSE_DEBUG) printf("parse_wavecode: failed to load (or create) custom wave (id = %d)!\n", id); - return FAILURE; - } - //if (PARSE_DEBUG) printf("parse_wavecode: custom wave found (id = %d)\n", custom_wave->id); - - /* Retrieve parameter from this custom waves parameter db */ - if ((param = find_param_db(var_string, custom_wave->param_tree, TRUE)) == NULL) - return FAILURE; - - //if (PARSE_DEBUG) printf("parse_wavecode: custom wave parameter found (name = %s)\n", param->name); - - /* integer value (boolean is an integer in C) */ - if ((param->type == P_TYPE_INT) || (param->type == P_TYPE_BOOL)) { - if ((parse_int(fs, (int*)&init_val.int_val)) == PARSE_ERROR) { - //if (PARSE_DEBUG) printf("parse_wavecode: error parsing integer!\n"); - return PARSE_ERROR; - } - } - - /* double value */ - else if (param->type == P_TYPE_DOUBLE) { - if ((parse_float(fs, (double*)&init_val.double_val)) == PARSE_ERROR) { - //if (PARSE_DEBUG) printf("parse_wavecode: error parsing double!\n"); - return PARSE_ERROR; - } - } - - /* Unknown value */ - else { - //if (PARSE_DEBUG) printf("parse_wavecode: unknown parameter type!\n"); - return PARSE_ERROR; - } - - /* Create new initial condition */ - if ((init_cond = new_init_cond(param, init_val)) == NULL) { - //if (PARSE_DEBUG) printf("parse_wavecode: new_init_cond failed!\n"); - return FAILURE; - } - - if (splay_insert(init_cond, param->name, custom_wave->init_cond_tree) < 0) { - free_init_cond(init_cond); - return PARSE_ERROR; - } - - //if (PARSE_DEBUG) printf("parse_wavecode: [success]\n"); - return SUCCESS; -} - -int parse_shapecode(char * token, FILE * fs, preset_t * preset) { - - char * var_string; - init_cond_t * init_cond; - custom_shape_t * custom_shape; - int id; - value_t init_val; - param_t * param; - - /* Null argument checks */ - if (preset == NULL) - return FAILURE; - if (fs == NULL) - return FAILURE; - if (token == NULL) - return FAILURE; - - /* token should be in the form shapecode_N_var, such as shapecode_1_samples */ - - /* Get id and variable name from token string */ - if (parse_shapecode_prefix(token, &id, &var_string) < 0) - return PARSE_ERROR; - - //if (PARSE_DEBUG) printf("parse_shapecode: shapecode id = %d, parameter = \"%s\"\n", id, var_string); - - /* Retrieve custom shape information from preset. The 3rd argument - if true creates a custom shape if one does not exist */ - if ((custom_shape = find_custom_shape(id, preset, TRUE)) == NULL) { - //if (PARSE_DEBUG) printf("parse_shapecode: failed to load (or create) custom shape (id = %d)!\n", id); - return FAILURE; - } - //if (PARSE_DEBUG) printf("parse_shapecode: custom shape found (id = %d)\n", custom_shape->id); - - /* Retrieve parameter from this custom shapes parameter db */ - if ((param = find_param_db(var_string, custom_shape->param_tree, TRUE)) == NULL) { - //if (PARSE_DEBUG) printf("parse_shapecode: failed to create parameter.\n"); - return FAILURE; - } - //if (PARSE_DEBUG) printf("parse_shapecode: custom shape parameter found (name = %s)\n", param->name); - - /* integer value (boolean is an integer in C) */ - if ((param->type == P_TYPE_INT) || (param->type == P_TYPE_BOOL)) { - if ((parse_int(fs, (int*)&init_val.int_val)) == PARSE_ERROR) { - //if (PARSE_DEBUG) printf("parse_shapecode: error parsing integer!\n"); - return PARSE_ERROR; - } - } - - /* double value */ - else if (param->type == P_TYPE_DOUBLE) { - if ((parse_float(fs, (double*)&init_val.double_val)) == PARSE_ERROR) { - //if (PARSE_DEBUG) printf("parse_shapecode: error parsing double!\n"); - return PARSE_ERROR; - } - } - - /* Unknown value */ - else { - //if (PARSE_DEBUG) printf("parse_shapecode: unknown parameter type!\n"); - return PARSE_ERROR; - } - - /* Create new initial condition */ - if ((init_cond = new_init_cond(param, init_val)) == NULL) { - //if (PARSE_DEBUG) printf("parse_shapecode: new_init_cond failed!\n"); - return FAILURE; - } - - if (splay_insert(init_cond, param->name, custom_shape->init_cond_tree) < 0) { - free_init_cond(init_cond); - //if (PARSE_DEBUG) printf("parse_shapecode: initial condition already set, not reinserting it (param = \"%s\")\n", param->name); - return PARSE_ERROR; - } - - //if (PARSE_DEBUG) printf("parse_shapecode: [success]\n"); - return SUCCESS; -} - - -int parse_wavecode_prefix(char * token, int * id, char ** var_string) { - - int len, i, j; - - if (token == NULL) - return FAILURE; - if (*var_string == NULL) - return FAILURE; - if (id == NULL) - return FAILURE; - - len = strlen(token); - - /* Move pointer passed "wavecode_" prefix */ - if (len <= WAVECODE_STRING_LENGTH) - return FAILURE; - i = WAVECODE_STRING_LENGTH; - j = 0; - (*id) = 0; - - /* This loop grabs the integer id for this custom wave */ - while ((i < len) && (token[i] >= 48) && (token[i] <= 57)) { - if (j >= MAX_TOKEN_SIZE) - return FAILURE; - - (*id) = 10*(*id) + (token[i]-48); - j++; - i++; - } - - - if (i > (len - 2)) - return FAILURE; - - *var_string = token + i + 1; - - return SUCCESS; - -} - - -int parse_shapecode_prefix(char * token, int * id, char ** var_string) { - - int len, i, j; - - if (token == NULL) - return FAILURE; - if (*var_string == NULL) - return FAILURE; - if (id == NULL) - return FAILURE; - - len = strlen(token); - - /* Move pointer passed "shapecode_" prefix */ - if (len <= SHAPECODE_STRING_LENGTH) - return FAILURE; - i = SHAPECODE_STRING_LENGTH; - j = 0; - (*id) = 0; - - /* This loop grabs the integer id for this custom shape */ - while ((i < len) && (token[i] >= 48) && (token[i] <= 57)) { - if (j >= MAX_TOKEN_SIZE) - return FAILURE; - - (*id) = 10*(*id) + (token[i]-48); - j++; - i++; - } - - - if (i > (len - 2)) - return FAILURE; - - *var_string = token + i + 1; - - return SUCCESS; - -} - -int parse_wave_prefix(char * token, int * id, char ** eqn_string) { - - int len, i, j; - - if (token == NULL) - return FAILURE; - if (eqn_string == NULL) - return FAILURE; - if (id == NULL) - return FAILURE; - - len = strlen(token); - - if (len <= WAVE_STRING_LENGTH) - return FAILURE; - - - i = WAVE_STRING_LENGTH; - j = 0; - (*id) = 0; - - /* This loop grabs the integer id for this custom wave */ - while ((i < len) && (token[i] >= 48) && (token[i] <= 57)) { - if (j >= MAX_TOKEN_SIZE) - return FAILURE; - - (*id) = 10*(*id) + (token[i]-48); - j++; - i++; - } - - if (i > (len - 2)) - return FAILURE; - - *eqn_string = token + i + 1; - - return SUCCESS; - -} - -int parse_shape_prefix(char * token, int * id, char ** eqn_string) { - - int len, i, j; - - if (token == NULL) - return FAILURE; - if (eqn_string == NULL) - return FAILURE; - if (id == NULL) - return FAILURE; - - len = strlen(token); - - if (len <= SHAPE_STRING_LENGTH) - return FAILURE; - - - i = SHAPE_STRING_LENGTH; - j = 0; - (*id) = 0; - - /* This loop grabs the integer id for this custom wave */ - while ((i < len) && (token[i] >= 48) && (token[i] <= 57)) { - if (j >= MAX_TOKEN_SIZE) - return FAILURE; - - (*id) = 10*(*id) + (token[i]-48); - j++; - i++; - } - - if (i > (len - 2)) - return FAILURE; - - *eqn_string = token + i + 1; - - return SUCCESS; - -} - -/* Parses custom wave equations */ -int parse_wave(char * token, FILE * fs, preset_t * preset) { - - int id; - char * eqn_type; - char string[MAX_TOKEN_SIZE]; - param_t * param; - per_frame_eqn_t * per_frame_eqn; - gen_expr_t * gen_expr; - custom_wave_t * custom_wave; - init_cond_t * init_cond; - - if (token == NULL) - return FAILURE; - if (fs == NULL) - return FAILURE; - if (preset == NULL) - return FAILURE; - - /* Grab custom wave id and equation type (per frame or per point) from string token */ - if (parse_wave_prefix(token, &id, &eqn_type) < 0) { - //if (PARSE_DEBUG) printf("parse_wave: syntax error in custom wave prefix!\n"); - return FAILURE; - } - /* Retrieve custom wave associated with this id */ - if ((custom_wave = find_custom_wave(id, preset, TRUE)) == NULL) - return FAILURE; - - - /* per frame init equation case */ - if (!strncmp(eqn_type, WAVE_INIT_STRING, WAVE_INIT_STRING_LENGTH)) { - - //if (PARSE_DEBUG) printf("parse_wave (per frame init): [begin] (LINE %d)\n", line_count); - - /* Parse the per frame equation */ - if ((init_cond = parse_per_frame_init_eqn(fs, preset, custom_wave->param_tree)) == NULL) { - //if (PARSE_DEBUG) printf("parse_wave (per frame init): equation parsing failed (LINE %d)\n", line_count); - return PARSE_ERROR; - } - - /* Insert the equation in the per frame equation tree */ - if (splay_insert(init_cond, init_cond->param->name, custom_wave->per_frame_init_eqn_tree) < 0) { - //if (PARSE_DEBUG) printf("parse_wave (per frame init): failed to add equation (ERROR)\n"); - free_init_cond(init_cond); /* will free the gen expr too */ - return FAILURE; - } - - if (update_string_buffer(custom_wave->per_frame_init_eqn_string_buffer, - &custom_wave->per_frame_init_eqn_string_index) < 0) - return FAILURE; - - return SUCCESS; - - } - - /* per frame equation case */ - if (!strncmp(eqn_type, PER_FRAME_STRING_NO_UNDERSCORE, PER_FRAME_STRING_NO_UNDERSCORE_LENGTH)) { - - //if (PARSE_DEBUG) printf("parse_wave (per_frame): [start] (custom wave id = %d)\n", custom_wave->id); - - if (parseToken(fs, string) != tEq) { - //if (PARSE_DEBUG) printf("parse_wave (per_frame): no equal sign after string \"%s\" (LINE %d)\n", string, line_count); - return PARSE_ERROR; - } - - /* Find the parameter associated with the string in the custom wave database */ - if ((param = find_param_db(string, custom_wave->param_tree, TRUE)) == NULL) { - //if (PARSE_DEBUG) printf("parse_wave (per_frame): parameter \"%s\" not found or cannot be malloc'ed!!\n", string); - return FAILURE; - } - - - /* Make sure parameter is writable */ - if (param->flags & P_FLAG_READONLY) { - //if (PARSE_DEBUG) printf("parse_wave (per_frame): parameter %s is marked as read only (LINE %d)\n", param->name, line_count); - return FAILURE; - } - - /* Parse right side of equation as an expression */ - - current_wave = custom_wave; - if ((gen_expr = parse_gen_expr(fs, NULL, preset)) == NULL) { - //if (PARSE_DEBUG) printf("parse_wave (per_frame): equation evaluated to null (LINE %d)\n", line_count); - current_wave = NULL; - return PARSE_ERROR; - - } - current_wave = NULL; - - //if (PARSE_DEBUG) printf("parse_wave (per_frame): [finished parsing equation] (LINE %d)\n", line_count); - - /* Create a new per frame equation */ - if ((per_frame_eqn = new_per_frame_eqn(custom_wave->per_frame_count++, param, gen_expr)) == NULL) { - //if (PARSE_DEBUG) printf("parse_wave (per_frame): failed to create a new per frame eqn, out of memory?\n"); - free_gen_expr(gen_expr); - return FAILURE; - } - - if (splay_insert(per_frame_eqn, &per_frame_eqn->index, custom_wave->per_frame_eqn_tree) < 0) { - free_per_frame_eqn(per_frame_eqn); - return FAILURE; - } - - //if (PARSE_DEBUG) printf("parse_wave (per_frame): equation %d associated with custom wave %d [success]\n", - // per_frame_eqn->index, custom_wave->id); - - - /* Need to add stuff to string buffer so the editor can read the equations. - Why not make a nice little helper function for this? - here it is: */ - - - if (update_string_buffer(custom_wave->per_frame_eqn_string_buffer, &custom_wave->per_frame_eqn_string_index) < 0) - return FAILURE; - - - return SUCCESS; - } - - - /* per point equation case */ - if (!strncmp(eqn_type, PER_POINT_STRING, PER_POINT_STRING_LENGTH)) { - - //if (PARSE_DEBUG) printf("parse_wave (per_point): per_pixel equation parsing start...(LINE %d)\n", line_count); - - if (parseToken(fs, string) != tEq) { /* parse per pixel operator name */ - //if (PARSE_DEBUG) printf("parse_wave (per_point): equal operator missing after per pixel operator! (LINE %d)\n", line_count); - return PARSE_ERROR; - } - - /* Parse right side of equation as an expression */ - current_wave = custom_wave; - if ((gen_expr = parse_gen_expr(fs, NULL, preset)) == NULL) { - //if (PARSE_DEBUG) printf("parse_wave (per_point): equation evaluated to null? (LINE %d)\n", line_count); - return PARSE_ERROR; - } - current_wave = NULL; - - /* Add the per point equation */ - if (add_per_point_eqn(string, gen_expr, custom_wave) < 0) { - free_gen_expr(gen_expr); - return PARSE_ERROR; - } - - - if (update_string_buffer(custom_wave->per_point_eqn_string_buffer, &custom_wave->per_point_eqn_string_index) < 0) - return FAILURE; - - //if (PARSE_DEBUG) printf("parse_wave (per_point): [finished] (custom wave id = %d)\n", custom_wave->id); - return SUCCESS; - } - - - /* Syntax error, return parse error */ - return PARSE_ERROR; -} - - - -/* Parses custom shape equations */ -int parse_shape(char * token, FILE * fs, preset_t * preset) { - - int id; - char * eqn_type; - char string[MAX_TOKEN_SIZE]; - param_t * param; - per_frame_eqn_t * per_frame_eqn; - gen_expr_t * gen_expr; - custom_shape_t * custom_shape; - init_cond_t * init_cond; - - if (token == NULL) - - return FAILURE; - if (fs == NULL) - return FAILURE; - if (preset == NULL) - return FAILURE; - - /* Grab custom shape id and equation type (per frame or per point) from string token */ - if (parse_shape_prefix(token, &id, &eqn_type) < 0) { - //if (PARSE_DEBUG) printf("parse_shape: syntax error in custom shape prefix!\n"); - return PARSE_ERROR; - } - /* Retrieve custom shape associated with this id */ - if ((custom_shape = find_custom_shape(id, preset, TRUE)) == NULL) - return FAILURE; - - - /* per frame init equation case */ - if (!strncmp(eqn_type, SHAPE_INIT_STRING, SHAPE_INIT_STRING_LENGTH)) { - - //if (PARSE_DEBUG) printf("parse_shape (per frame init): [begin] (LINE %d)\n", line_count); - - /* Parse the per frame equation */ - if ((init_cond = parse_per_frame_init_eqn(fs, preset, custom_shape->param_tree)) == NULL) { - //if (PARSE_DEBUG) printf("parse_shape (per frame init): equation parsing failed (LINE %d)\n", line_count); - return PARSE_ERROR; - } - - /* Insert the equation in the per frame equation tree */ - if (splay_insert(init_cond, init_cond->param->name, custom_shape->per_frame_init_eqn_tree) < 0) { - //if (PARSE_DEBUG) printf("parse_shape (per frame init): failed to add equation (ERROR)\n"); - free_init_cond(init_cond); /* will free the gen expr too */ - return ERROR; - } - - if (update_string_buffer(custom_shape->per_frame_init_eqn_string_buffer, - &custom_shape->per_frame_init_eqn_string_index) < 0) - return FAILURE; - - return SUCCESS; - - } - - /* per frame equation case */ - if (!strncmp(eqn_type, PER_FRAME_STRING_NO_UNDERSCORE, PER_FRAME_STRING_NO_UNDERSCORE_LENGTH)) { - - //if (PARSE_DEBUG) printf("parse_shape (per_frame): [start] (custom shape id = %d)\n", custom_shape->id); - - if (parseToken(fs, string) != tEq) { - //if (PARSE_DEBUG) printf("parse_shape (per_frame): no equal sign after string \"%s\" (LINE %d)\n", string, line_count); - return PARSE_ERROR; - } - - /* Find the parameter associated with the string in the custom shape database */ - if ((param = find_param_db(string, custom_shape->param_tree, TRUE)) == NULL) { - //if (PARSE_DEBUG) printf("parse_shape (per_frame): parameter \"%s\" not found or cannot be malloc'ed!!\n", string); - return FAILURE; - } - - - /* Make sure parameter is writable */ - if (param->flags & P_FLAG_READONLY) { - //if (PARSE_DEBUG) printf("parse_shape (per_frame): parameter %s is marked as read only (LINE %d)\n", param->name, line_count); - return FAILURE; - } - - /* Parse right side of equation as an expression */ - - current_shape = custom_shape; - if ((gen_expr = parse_gen_expr(fs, NULL, preset)) == NULL) { - //if (PARSE_DEBUG) printf("parse_shape (per_frame): equation evaluated to null (LINE %d)\n", line_count); - current_shape = NULL; - return PARSE_ERROR; - } - - current_shape = NULL; - - //if (PARSE_DEBUG) printf("parse_shape (per_frame): [finished parsing equation] (LINE %d)\n", line_count); - - /* Create a new per frame equation */ - if ((per_frame_eqn = new_per_frame_eqn(custom_shape->per_frame_count++, param, gen_expr)) == NULL) { - //if (PARSE_DEBUG) printf("parse_shape (per_frame): failed to create a new per frame eqn, out of memory?\n"); - free_gen_expr(gen_expr); - return FAILURE; - } - - if (splay_insert(per_frame_eqn, &per_frame_eqn->index, custom_shape->per_frame_eqn_tree) < 0) { - free_per_frame_eqn(per_frame_eqn); - return FAILURE; - } - - //if (PARSE_DEBUG) printf("parse_shape (per_frame): equation %d associated with custom shape %d [success]\n", - // per_frame_eqn->index, custom_shape->id); - - - /* Need to add stuff to string buffer so the editor can read the equations. - Why not make a nice little helper function for this? - here it is: */ - - if (update_string_buffer(custom_shape->per_frame_eqn_string_buffer, &custom_shape->per_frame_eqn_string_index) < 0) - return FAILURE; - - - return SUCCESS; - } - - - /* Syntax error, return parse error */ - return PARSE_ERROR; -} - -/* Helper function to update the string buffers used by the editor */ -int update_string_buffer(char * buffer, int * index) { - - int string_length; - int skip_size; - - if (!buffer) - return FAILURE; - if (!index) - return FAILURE; - - - /* If the string line buffer used by the parser is already full then quit */ - if (string_line_buffer_index == (STRING_LINE_SIZE-1)) - return FAILURE; - - if ((skip_size = get_string_prefix_len(string_line_buffer)) == FAILURE) - return FAILURE; - - string_line_buffer[string_line_buffer_index++] = '\n'; - - // string_length = strlen(string_line_buffer + strlen(eqn_string)+1); - if (skip_size >= STRING_LINE_SIZE) - return FAILURE; - - string_length = strlen(string_line_buffer + skip_size); - - if (skip_size > (STRING_LINE_SIZE-1)) - return FAILURE; - - /* Add line to string buffer */ - strncpy(buffer + (*index), - string_line_buffer + skip_size, string_length); - - /* Buffer full, quit */ - if ((*index) > (STRING_BUFFER_SIZE - 1)) { - //if (PARSE_DEBUG) printf("update_string_buffer: string buffer full!\n"); - return FAILURE; - } - - /* Otherwise, increment string index by the added string length */ - (*index)+=string_length; - - return SUCCESS; - -} - - -/* Helper function: returns the length of the prefix portion in the line - buffer (the passed string here). In other words, given - the string 'per_frame_1 = x = ....', return the length of 'per_frame_1 = ' - Returns -1 if syntax error -*/ - -int get_string_prefix_len(char * string) { - - int i = 0; - - /* Null argument check */ - if (string == NULL) - return FAILURE; - - - /* First find the equal sign */ - while (string[i] != '=') { - if (string[i] == 0) - return FAILURE; - i++; - } - - /* If the string already ends at the next char then give up */ - if (string[i+1] == 0) - return FAILURE; - - /* Move past the equal sign */ - i++; - - /* Now found the start of the LHS variable, ie skip the spaces */ - while(string[i] == ' ') { - i++; - } - - /* If this is the end of the string then its a syntax error */ - if (string[i] == 0) - return FAILURE; - - /* Finished succesfully, return the length */ - return i; -} diff --git a/modules/visualization/galaktos/parser.h b/modules/visualization/galaktos/parser.h deleted file mode 100644 index 9b226f533c..0000000000 --- a/modules/visualization/galaktos/parser.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef PARSER_H -#define PARSER_H -#define PARSE_DEBUG 0 -#include "expr_types.h" -#include "per_frame_eqn_types.h" -#include "init_cond_types.h" -#include "preset_types.h" -#include - -per_frame_eqn_t * parse_per_frame_eqn(FILE * fs, int index, struct PRESET_T * preset); -int parse_per_pixel_eqn(FILE * fs, preset_t * preset); -init_cond_t * parse_init_cond(FILE * fs, char * name, struct PRESET_T * preset); -int parse_preset_name(FILE * fs, char * name); -int parse_top_comment(FILE * fs); -int parse_line(FILE * fs, struct PRESET_T * preset); -#endif diff --git a/modules/visualization/galaktos/per_frame_eqn.c b/modules/visualization/galaktos/per_frame_eqn.c deleted file mode 100644 index 2cc067bb44..0000000000 --- a/modules/visualization/galaktos/per_frame_eqn.c +++ /dev/null @@ -1,114 +0,0 @@ -/***************************************************************************** - * per_frame_eqn.c: - ***************************************************************************** - * Copyright (C) 2004 the VideoLAN team - * $Id$ - * - * Authors: Cyril Deguet - * code from projectM http://xmms-projectm.sourceforge.net - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - -#include -#include -#include - -#include "fatal.h" -#include "common.h" -#include "param.h" -#include "per_frame_eqn_types.h" -#include "per_frame_eqn.h" - -#include "expr_types.h" -#include "eval.h" - -/* Evaluate an equation */ -void eval_per_frame_eqn(per_frame_eqn_t * per_frame_eqn) { - - if (per_frame_eqn == NULL) - return; - - if (PER_FRAME_EQN_DEBUG) { - printf("per_frame_%d=%s= ", per_frame_eqn->index, per_frame_eqn->param->name); - fflush(stdout); - } - - //*((double*)per_frame_eqn->param->engine_val) = eval_gen_expr(per_frame_eqn->gen_expr); - set_param(per_frame_eqn->param, eval_gen_expr(per_frame_eqn->gen_expr)); - if (PER_FRAME_EQN_DEBUG) printf(" = %.4f\n", *((double*)per_frame_eqn->param->engine_val)); - -} - -/* -void eval_per_frame_init_eqn(per_frame_eqn_t * per_frame_eqn) { - - double val; - init_cond_t * init_cond; - if (per_frame_eqn == NULL) - return; - - if (PER_FRAME_EQN_DEBUG) { - printf("per_frame_init: %s = ", per_frame_eqn->param->name); - fflush(stdout); - } - - - val = *((double*)per_frame_eqn->param->engine_val) = eval_gen_expr(per_frame_eqn->gen_expr); - if (PER_FRAME_EQN_DEBUG) printf(" = %f\n", *((double*)per_frame_eqn->param->engine_val)); - - if (per_frame_eqn->param->flags & P_FLAG_QVAR) { - - per_frame_eqn->param->init_val.double_val = val; - if ((init_cond = new_init_cond(per_frame_eqn->param)) == NULL) - return; - - if ((list_append(init_cond_list, init_cond)) < 0) { - free_init_cond(init_cond); - return; - } - } -} -*/ - -/* Frees perframe equation structure */ -void free_per_frame_eqn(per_frame_eqn_t * per_frame_eqn) { - - if (per_frame_eqn == NULL) - return; - - free_gen_expr(per_frame_eqn->gen_expr); - free(per_frame_eqn); -} - -/* Create a new per frame equation */ -per_frame_eqn_t * new_per_frame_eqn(int index, param_t * param, gen_expr_t * gen_expr) { - - per_frame_eqn_t * per_frame_eqn; - - per_frame_eqn = (per_frame_eqn_t*)malloc(sizeof(per_frame_eqn_t)); - - if (per_frame_eqn == NULL) - return NULL; - - per_frame_eqn->param = param; - per_frame_eqn->gen_expr = gen_expr; - per_frame_eqn->index = index; - /* Set per frame eqn name */ - // memset(per_frame_eqn->name, 0, MAX_TOKEN_SIZE); - //strncpy(per_frame_eqn->name, name, MAX_TOKEN_SIZE-1); - return per_frame_eqn; - -} diff --git a/modules/visualization/galaktos/per_frame_eqn.h b/modules/visualization/galaktos/per_frame_eqn.h deleted file mode 100644 index 908982f12a..0000000000 --- a/modules/visualization/galaktos/per_frame_eqn.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef PER_FRAME_EQN_H -#define PER_FRAME_EQN_H -#define PER_FRAME_EQN_DEBUG 0 - -per_frame_eqn_t * new_per_frame_eqn(int index, param_t * param, struct GEN_EXPR_T * gen_expr); -void eval_per_frame_eqn(per_frame_eqn_t * per_frame_eqn); -void free_per_frame_eqn(per_frame_eqn_t * per_frame_eqn); -void eval_per_frame_init_eqn(per_frame_eqn_t * per_frame_eqn); -#endif diff --git a/modules/visualization/galaktos/per_frame_eqn_types.h b/modules/visualization/galaktos/per_frame_eqn_types.h deleted file mode 100644 index c02305cf22..0000000000 --- a/modules/visualization/galaktos/per_frame_eqn_types.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef PER_FRAME_EQN_TYPES_H -#define PER_FRAME_EQN_TYPES_H -#include "param_types.h" -#include "expr_types.h" - -typedef struct PER_FRAME_EQN_T { - int index; - struct PARAM_T * param; /* parameter to be assigned a value */ - struct GEN_EXPR_T * gen_expr; /* expression that paremeter is equal to */ -} per_frame_eqn_t; -#endif diff --git a/modules/visualization/galaktos/per_pixel_eqn.c b/modules/visualization/galaktos/per_pixel_eqn.c deleted file mode 100644 index 3cd0c016aa..0000000000 --- a/modules/visualization/galaktos/per_pixel_eqn.c +++ /dev/null @@ -1,221 +0,0 @@ -/***************************************************************************** - * per_pixel_eqn.c: - ***************************************************************************** - * Copyright (C) 2004 the VideoLAN team - * $Id$ - * - * Authors: Cyril Deguet - * code from projectM http://xmms-projectm.sourceforge.net - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - -#include -#include -#include - -#include "fatal.h" -#include "common.h" - -#include "expr_types.h" -#include "eval.h" - -#include "splaytree_types.h" -#include "splaytree.h" - -#include "param_types.h" -#include "param.h" - -#include "per_pixel_eqn.h" -#include "per_pixel_eqn_types.h" - -#include "engine_vars.h" - - -extern preset_t * active_preset; - -extern int mesh_i; -extern int mesh_j; - - - -/* Evaluates a per pixel equation */ -void evalPerPixelEqn(per_pixel_eqn_t * per_pixel_eqn) { - - double ** param_matrix = NULL; - gen_expr_t * eqn_ptr = NULL; - int x,y; - - eqn_ptr = per_pixel_eqn->gen_expr; - if (per_pixel_eqn->param->matrix == NULL) { - if (PER_PIXEL_EQN_DEBUG) printf("evalPerPixelEqn: [begin initializing matrix] (index = %d) (name = %s)\n", - per_pixel_eqn->index, per_pixel_eqn->param->name); - - param_matrix = per_pixel_eqn->param->matrix = (double**)malloc(gx*sizeof(double*)); - - for(x = 0; x < gx; x++) - param_matrix[x] = (double *)malloc(gy * sizeof(double)); - - for (x = 0; x < gx; x++) - for (y = 0; y < gy; y++) - param_matrix[x][y] = 0.0; - - if (per_pixel_eqn->param->name == NULL) - printf("null parameter?\n"); - - // printf("PARAM MATRIX: \"%s\" initialized.\n", per_pixel_eqn->param->name); - } - else - param_matrix = (double**)per_pixel_eqn->param->matrix; - - if (eqn_ptr == NULL) - printf("something is seriously wrong...\n"); - for (mesh_i = 0; mesh_i < gx; mesh_i++) { - for (mesh_j = 0; mesh_j < gy; mesh_j++) { - param_matrix[mesh_i][mesh_j] = eval_gen_expr(eqn_ptr); - } - } - - /* Now that this parameter has been referenced with a per - pixel equation, we let the evaluator know by setting - this flag */ - per_pixel_eqn->param->matrix_flag = 1; -} - -void evalPerPixelEqns() { - - /* Evaluate all per pixel equations using splay traversal */ - splay_traverse(evalPerPixelEqn, active_preset->per_pixel_eqn_tree); - - /* Set mesh i / j values to -1 so engine vars are used by default again */ - mesh_i = mesh_j = -1; - -} -/* Adds a per pixel equation according to its string name. This - will be used only by the parser */ - -int add_per_pixel_eqn(char * name, gen_expr_t * gen_expr, preset_t * preset) { - - per_pixel_eqn_t * per_pixel_eqn; - int index; - param_t * param = NULL; - - /* Argument checks */ - if (preset == NULL) - return FAILURE; - if (gen_expr == NULL) - return FAILURE; - if (name == NULL) - return FAILURE; - - if (PER_PIXEL_EQN_DEBUG) printf("add_per_pixel_eqn: per pixel equation (name = \"%s\")\n", name); - - if (!strncmp(name, "dx", strlen("dx"))) - preset->per_pixel_flag[DX_OP] = TRUE; - else if (!strncmp(name, "dy", strlen("dy"))) - preset->per_pixel_flag[DY_OP] = TRUE; - else if (!strncmp(name, "cx", strlen("cx"))) - preset->per_pixel_flag[CX_OP] = TRUE; - else if (!strncmp(name, "cy", strlen("cy"))) - preset->per_pixel_flag[CX_OP] = TRUE; - else if (!strncmp(name, "zoom", strlen("zoom"))) - preset->per_pixel_flag[ZOOM_OP] = TRUE; - else if (!strncmp(name, "zoomexp", strlen("zoomexp"))) - preset->per_pixel_flag[ZOOMEXP_OP] = TRUE; - else if (!strncmp(name, "rot", strlen("rot"))) - preset->per_pixel_flag[ROT_OP] = TRUE; - else if (!strncmp(name, "sx", strlen("sx"))) - preset->per_pixel_flag[SX_OP] = TRUE; - else if (!strncmp(name, "sy", strlen("sy"))) - preset->per_pixel_flag[SY_OP] = TRUE; - - - /* Search for the parameter so we know what matrix the per pixel equation is referencing */ - - if ((param = find_param(name, preset, TRUE)) == NULL) { - if (PER_PIXEL_EQN_DEBUG) printf("add_per_pixel_eqn: failed to allocate a new parameter!\n"); - return FAILURE; - - } - - /* Find most largest index in the splaytree */ - // if ((per_pixel_eqn = splay_find_max(active_preset->per_pixel_eqn_tree)) == NULL) - // index = 0; - // else - index = splay_size(preset->per_pixel_eqn_tree); - - /* Create the per pixel equation given the index, parameter, and general expression */ - if ((per_pixel_eqn = new_per_pixel_eqn(index, param, gen_expr)) == NULL) { - if (PER_PIXEL_EQN_DEBUG) printf("add_per_pixel_eqn: failed to create new per pixel equation!\n"); - return FAILURE; - - } - - if (PER_PIXEL_EQN_DEBUG) printf("add_per_pixel_eqn: new equation (index = %d) (param = \"%s\")\n", - per_pixel_eqn->index, per_pixel_eqn->param->name); - /* Insert the per pixel equation into the preset per pixel database */ - if (splay_insert(per_pixel_eqn, &per_pixel_eqn->index, preset->per_pixel_eqn_tree) < 0) { - free_per_pixel_eqn(per_pixel_eqn); - printf("failed to add per pixel eqn!\n"); - return FAILURE; - } - - /* Done */ - return SUCCESS; -} - -per_pixel_eqn_t * new_per_pixel_eqn(int index, param_t * param, gen_expr_t * gen_expr) { - - per_pixel_eqn_t * per_pixel_eqn; - - if (index < 0) - return NULL; - if (param == NULL) - return NULL; - if (gen_expr == NULL) - return NULL; - - if ((per_pixel_eqn = (per_pixel_eqn_t*)malloc(sizeof(per_pixel_eqn_t))) == NULL) - return NULL; - - - per_pixel_eqn->index = index; - per_pixel_eqn->param = param; - per_pixel_eqn->gen_expr = gen_expr; - - return per_pixel_eqn; -} - - -void free_per_pixel_eqn(per_pixel_eqn_t * per_pixel_eqn) { - - if (per_pixel_eqn == NULL) - return; - - free_gen_expr(per_pixel_eqn->gen_expr); - - free(per_pixel_eqn); - - return; -} - -static inline int resetPerPixelEqnFlags(preset_t * preset) { - int i; - - for (i = 0; i < NUM_OPS;i++) - preset->per_pixel_flag[i] = FALSE; - - return SUCCESS; -} diff --git a/modules/visualization/galaktos/per_pixel_eqn.h b/modules/visualization/galaktos/per_pixel_eqn.h deleted file mode 100644 index 6861735814..0000000000 --- a/modules/visualization/galaktos/per_pixel_eqn.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef PER_PIXEL_EQN_H -#define PER_PIXEL_EQN_H - -#include "expr_types.h" -#include "preset_types.h" - -#define PER_PIXEL_EQN_DEBUG 0 -void evalPerPixelEqns(); -int add_per_pixel_eqn(char * name, gen_expr_t * gen_expr, struct PRESET_T * preset); -void free_per_pixel_eqn(per_pixel_eqn_t * per_pixel_eqn); -per_pixel_eqn_t * new_per_pixel_eqn(int index, param_t * param, gen_expr_t * gen_expr); -inline int resetPerPixelEqnFlags(); - -#endif diff --git a/modules/visualization/galaktos/per_pixel_eqn_types.h b/modules/visualization/galaktos/per_pixel_eqn_types.h deleted file mode 100644 index a5d4021f87..0000000000 --- a/modules/visualization/galaktos/per_pixel_eqn_types.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef PER_PIXEL_EQN_TYPES_H -#define PER_PIXEL_EQN_TYPES_H -/* This is sort of ugly, but it is also the fastest way to access the per pixel equations */ -#include "common.h" -#include "expr_types.h" - -typedef struct PER_PIXEL_EQN_T { - int index; /* used for splay tree ordering. */ - int flags; /* primarily to specify if this variable is user-defined */ - param_t * param; - gen_expr_t * gen_expr; -} per_pixel_eqn_t; - - -#define ZOOM_OP 0 -#define ZOOMEXP_OP 1 -#define ROT_OP 2 -#define CX_OP 3 -#define CY_OP 4 -#define SX_OP 5 -#define SY_OP 6 -#define DX_OP 7 -#define DY_OP 8 -#define WARP_OP 9 -#define NUM_OPS 10 /* obviously, this number is dependent on the number of existing per pixel operations */ -#endif diff --git a/modules/visualization/galaktos/per_point_types.h b/modules/visualization/galaktos/per_point_types.h deleted file mode 100644 index ce10a4116d..0000000000 --- a/modules/visualization/galaktos/per_point_types.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef PER_POINT_EQN_TYPES_H -#define PER_POINT_EQN_TYPES_H - -#include "custom_wave_types.h" - -typedef struct PER_POINT_EQN { - - custom_wave_t * custom_wave; - - -} per_point_eqn_t; - -#endif diff --git a/modules/visualization/galaktos/plugin.c b/modules/visualization/galaktos/plugin.c deleted file mode 100644 index c02b23c37d..0000000000 --- a/modules/visualization/galaktos/plugin.c +++ /dev/null @@ -1,333 +0,0 @@ -/***************************************************************************** - * plugin.c: - ***************************************************************************** - * Copyright (C) 2004 the VideoLAN team - * $Id$ - * - * Authors: Cyril Deguet - * Implementation of the winamp plugin MilkDrop - * based on projectM http://xmms-projectm.sourceforge.net - * and SciVi http://xmms-scivi.sourceforge.net - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - -/***************************************************************************** - * Preamble - *****************************************************************************/ - -#include "plugin.h" -#include "main.h" -#include "PCM.h" -#include "video_init.h" -#include - -#include -#include -#include - -/***************************************************************************** - * Module descriptor - *****************************************************************************/ -static int Open ( vlc_object_t * ); -static void Close ( vlc_object_t * ); - - -#define WIDTH_TEXT N_("Video width") -#define WIDTH_LONGTEXT N_("The width of the video window, in pixels.") - -#define HEIGHT_TEXT N_("Video height") -#define HEIGHT_LONGTEXT N_("The height of the video window, in pixels.") - - -vlc_module_begin () - set_description( N_("GaLaktos visualization") ) - set_capability( "visualization", 0 ) - set_callbacks( Open, Close ) - add_shortcut( "galaktos" ) - add_integer( "galaktos-width", 640, NULL, WIDTH_TEXT, WIDTH_LONGTEXT, - false ) - add_integer( "galaktos-height", 480, NULL, HEIGHT_TEXT, HEIGHT_LONGTEXT, - false ) -vlc_module_end () - -/***************************************************************************** - * Local prototypes - *****************************************************************************/ -struct aout_filter_sys_t -{ - galaktos_thread_t *p_thread; - -}; - -static void DoWork ( aout_instance_t *, aout_filter_t *, aout_buffer_t *, - aout_buffer_t * ); - -static void* Thread ( vlc_object_t * ); - -static char *TitleGet( vlc_object_t * ); - - -extern GLuint RenderTargetTextureID; - -/***************************************************************************** - * Open: open a scope effect plugin - *****************************************************************************/ -static int Open( vlc_object_t *p_this ) -{ - aout_filter_t *p_filter = (aout_filter_t *)p_this; - aout_filter_sys_t *p_sys; - galaktos_thread_t *p_thread; - - if( p_filter->input.i_format != VLC_CODEC_FL32 || - p_filter->output.i_format != VLC_CODEC_FL32 ) - { - msg_Warn( p_filter, "bad input or output format" ); - return VLC_EGENERIC; - } - if ( !AOUT_FMTS_SIMILAR( &p_filter->input, &p_filter->output ) ) - { - msg_Warn( p_filter, "input and output formats are not similar" ); - return VLC_EGENERIC; - } - - p_filter->pf_do_work = DoWork; - p_filter->b_in_place = 1; - - /* Allocate structure */ - p_sys = p_filter->p_sys = malloc( sizeof( aout_filter_sys_t ) ); - - /* Create galaktos thread */ - p_sys->p_thread = p_thread = - vlc_object_create( p_filter, sizeof( galaktos_thread_t ) ); - vlc_object_attach( p_thread, p_this ); - - p_thread->i_cur_sample = 0; - bzero( p_thread->p_data, 2*2*512 ); - - p_thread->i_width = var_CreateGetInteger( p_thread, "galaktos-width" ); - p_thread->i_height = var_CreateGetInteger( p_thread, "galaktos-height" ); - p_thread->b_fullscreen = 0; - galaktos_init( p_thread ); - - p_thread->i_channels = aout_FormatNbChannels( &p_filter->input ); - - p_thread->psz_title = TitleGet( VLC_OBJECT( p_filter ) ); - - if( vlc_thread_create( p_thread, "galaktos update thread", Thread, - VLC_THREAD_PRIORITY_LOW ) ) - { - msg_Err( p_filter, "cannot lauch galaktos thread" ); - free( p_thread->psz_title ); - vlc_object_detach( p_thread ); - vlc_object_release( p_thread ); - free( p_sys ); - return VLC_EGENERIC; - } - - return VLC_SUCCESS; -} - -/***************************************************************************** - * float to s16 conversion - *****************************************************************************/ -static inline int16_t FloatToInt16( float f ) -{ - if( f >= 1.0 ) - return 32767; - else if( f < -1.0 ) - return -32768; - else - return (int16_t)( f * 32768.0 ); -} - -/***************************************************************************** - * DoWork: process samples buffer - ***************************************************************************** - * This function queues the audio buffer to be processed by the galaktos thread - *****************************************************************************/ -static void DoWork( aout_instance_t * p_aout, aout_filter_t * p_filter, - aout_buffer_t * p_in_buf, aout_buffer_t * p_out_buf ) -{ - int i_samples; - int i_channels; - float *p_float; - galaktos_thread_t *p_thread = p_filter->p_sys->p_thread; - - p_float = (float *)p_in_buf->p_buffer; - i_channels = p_thread->i_channels; - - p_out_buf->i_nb_samples = p_in_buf->i_nb_samples; - p_out_buf->i_nb_bytes = p_in_buf->i_nb_bytes; - - for( i_samples = p_in_buf->i_nb_samples; i_samples > 0; i_samples-- ) - { - int i_cur_sample = p_thread->i_cur_sample; - - p_thread->p_data[0][i_cur_sample] = FloatToInt16( p_float[0] ); - if( i_channels > 1 ) - { - p_thread->p_data[1][i_cur_sample] = FloatToInt16( p_float[1] ); - } - p_float += i_channels; - - if( ++(p_thread->i_cur_sample) == 512 ) - { - addPCM( p_thread->p_data ); - p_thread->i_cur_sample = 0; - } - } -} - -/***************************************************************************** - * Thread: - *****************************************************************************/ -static void* Thread( vlc_object_t *p_this ) -{ - galaktos_thread_t *p_thread = (galaktos_thread_t*)p_this; - - int count=0; - double realfps=0,fpsstart=0; - int timed=0; - int timestart=0; - int mspf=0; - int canc = vlc_savecancel (); - - /* Get on OpenGL provider */ - p_thread->p_opengl = - (vout_thread_t *)vlc_object_create( p_this, sizeof( vout_thread_t ) ); - if( p_thread->p_opengl == NULL ) - { - vlc_restorecancel (canc); - return NULL; - } - vlc_object_attach( p_thread->p_opengl, p_this ); - - /* Initialize vout parameters */ - video_format_Setup( &p_thread->p_opengl->fmt_in, - VLC_CODEC_RGB32, p_thread->i_width, p_thread->i_height, 1 ); - p_thread->p_opengl->i_window_width = p_thread->i_width; - p_thread->p_opengl->i_window_height = p_thread->i_height; - p_thread->p_opengl->render.i_width = p_thread->i_width; - p_thread->p_opengl->render.i_height = p_thread->i_width; - p_thread->p_opengl->render.i_aspect = VOUT_ASPECT_FACTOR; - p_thread->p_opengl->b_fullscreen = false; - p_thread->p_opengl->i_alignment = 0; - p_thread->p_opengl->fmt_in.i_sar_num = 1; - p_thread->p_opengl->fmt_in.i_sar_den = 1; - p_thread->p_opengl->fmt_render = p_thread->p_opengl->fmt_in; - - p_thread->p_module = - module_need( p_thread->p_opengl, "opengl provider", NULL, false ); - if( p_thread->p_module == NULL ) - { - msg_Err( p_thread, "unable to initialize OpenGL" ); - vlc_object_detach( p_thread->p_opengl ); - vlc_object_release( p_thread->p_opengl ); - vlc_restorecancel (canc); - return NULL; - } - - p_thread->p_opengl->pf_init( p_thread->p_opengl ); - - setup_opengl( p_thread->i_width, p_thread->i_height ); - CreateRenderTarget(512, &RenderTargetTextureID, NULL); - - timestart=mdate()/1000; - - while( vlc_object_alive (p_thread) ) - { - mspf = 1000 / 60; - if( galaktos_update( p_thread ) == 1 ) - { - vlc_object_kill( p_thread ); - } - free( p_thread->psz_title ); - p_thread->psz_title = NULL; - - mtime_t now = mdate(); - if (++count%100==0) - { - realfps=100/((now/1000-fpsstart)/1000); - // printf("%f\n",realfps); - fpsstart=now/1000; - } - //framerate limiter - timed=mspf-(now/1000-timestart); - // printf("%d,%d\n",time,mspf); - if (timed>0) msleep(1000*timed); - // printf("Limiter %d\n",(mdate()/1000-timestart)); - timestart=mdate()/1000; - } - - /* Free the openGL provider */ - module_unneed( p_thread->p_opengl, p_thread->p_module ); - vlc_object_detach( p_thread->p_opengl ); - vlc_object_release( p_thread->p_opengl ); - vlc_restorecancel (canc); - return NULL; -} - -/***************************************************************************** - * Close: close the plugin - *****************************************************************************/ -static void Close( vlc_object_t *p_this ) -{ - aout_filter_t *p_filter = (aout_filter_t *)p_this; - aout_filter_sys_t *p_sys = p_filter->p_sys; - - /* Stop galaktos Thread */ - vlc_object_kill( p_sys->p_thread ); - - galaktos_done( p_sys->p_thread ); - - vlc_thread_join( p_sys->p_thread ); - - /* Free data */ - vlc_object_detach( p_sys->p_thread ); - vlc_object_release( p_sys->p_thread ); - - free( p_sys ); -} - -static char *TitleGet( vlc_object_t *p_this ) -{ - char *psz_title = NULL; - input_thread_t *p_input = - vlc_object_find( p_this, VLC_OBJECT_INPUT, FIND_ANYWHERE ); - - if( p_input ) - { - char *psz_orig = input_item_GetURI( input_GetItem( p_input ) ); - char *psz = strrchr( psz_orig, '/' ); - - if( psz ) - { - psz++; - } - else - { - psz = psz_orig; - } - if( psz && *psz ) - { - psz_title = strdup( psz ); - } - free( psz_orig ); - vlc_object_release( p_input ); - } - - return psz_title; -} diff --git a/modules/visualization/galaktos/plugin.h b/modules/visualization/galaktos/plugin.h deleted file mode 100644 index 980d34e03e..0000000000 --- a/modules/visualization/galaktos/plugin.h +++ /dev/null @@ -1,64 +0,0 @@ -/***************************************************************************** - * plugin.h: - ***************************************************************************** - * Copyright (C) 2004 the VideoLAN team - * $Id$ - * - * Authors: Cyril Deguet - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - -#ifndef _GALAKTOS_PLUGIN_H_ -#define _GALAKTOS_PLUGIN_H_ - -#ifdef HAVE_CONFIG_H - #include "config.h" -#endif - -#include -#include -#include - -#define MAX_BLOCKS 10 - -typedef struct -{ - VLC_COMMON_MEMBERS - - char *psz_title; - - /* OpenGL provider */ - vout_thread_t *p_opengl; - module_t *p_module; - - /* Window properties */ - int i_width; - int i_height; - int b_fullscreen; - - /* Audio properties */ - int i_channels; - - /* Audio buffer */ - int16_t p_data[2][512]; - int i_cur_sample; - - /* OS specific data */ - void *p_os_data; - -} galaktos_thread_t; - -#endif diff --git a/modules/visualization/galaktos/preset.c b/modules/visualization/galaktos/preset.c deleted file mode 100644 index e7aea345dd..0000000000 --- a/modules/visualization/galaktos/preset.c +++ /dev/null @@ -1,1032 +0,0 @@ -/***************************************************************************** - * preset.c: - ***************************************************************************** - * Copyright (C) 2004 the VideoLAN team - * $Id$ - * - * Authors: Cyril Deguet - * code from projectM http://xmms-projectm.sourceforge.net - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include -#include - -#include -#include -#include -#include -#include "common.h" -#include "fatal.h" - -#include "preset_types.h" -#include "preset.h" - -#include "parser.h" - -#include "expr_types.h" -#include "eval.h" - -#include "splaytree_types.h" -#include "splaytree.h" -#include "tree_types.h" - -#include "per_frame_eqn_types.h" -#include "per_frame_eqn.h" - -#include "per_pixel_eqn_types.h" -#include "per_pixel_eqn.h" - -#include "init_cond_types.h" -#include "init_cond.h" - -#include "param_types.h" -#include "param.h" - -#include "func_types.h" -#include "func.h" - -#include "custom_wave_types.h" -#include "custom_wave.h" - -#include "custom_shape_types.h" -#include "custom_shape.h" - -#include "idle_preset.h" - -/* The maximum number of preset names loaded into buffer */ -#define MAX_PRESETS_IN_DIR 50000 -extern int per_frame_eqn_count; -extern int per_frame_init_eqn_count; -//extern int custom_per_frame_eqn_count; - -extern splaytree_t * builtin_param_tree; - -preset_t * active_preset = NULL; -preset_t * idle_preset = NULL; -FILE * write_stream = NULL; - - -int preset_index = -1; -int preset_name_buffer_size = 0; -splaytree_t * chrono_order_preset_name_tree = NULL; -int get_preset_path(char ** preset_path_ptr, char * filepath, char * filename); -preset_t * load_preset(char * pathname); -int is_valid_extension(char * name); -int load_preset_file(char * pathname, preset_t * preset); -int close_preset(preset_t * preset); - -int write_preset_name(FILE * fs); -int write_per_pixel_equations(FILE * fs); -int write_per_frame_equations(FILE * fs); -int write_per_frame_init_equations(FILE * fs); -int write_init_conditions(FILE * fs); -void load_init_cond(param_t * param); -void load_init_conditions(); -void write_init(init_cond_t * init_cond); -int init_idle_preset(); -int destroy_idle_preset(); -void load_custom_wave_init_conditions(); -void load_custom_wave_init(custom_wave_t * custom_wave); - -void load_custom_shape_init_conditions(); -void load_custom_shape_init(custom_shape_t * custom_shape); - -/* loadPresetDir: opens the directory buffer - denoted by 'dir' to load presets */ - -int loadPresetDir(char * dir) { - - struct dirent ** name_list; - char * preset_name; - int i, j, dir_size; - - if (dir == NULL) - return ERROR; - - if (chrono_order_preset_name_tree != NULL) { - if (PRESET_DEBUG) printf("loadPresetDir: previous directory doesn't appear to be closed!\n"); - /* Let this slide for now */ - } - - /* Scan the entire directory, storing each entry in a dirent struct array that needs - to be freed later. For more information, consult scandir(3) in the man pages */ - if ((dir_size = scandir(dir, &name_list, 0, alphasort)) < 0) { - if (PRESET_DEBUG) printf("loadPresetDir: failed to open directory \"%s\"\n", dir); - return ERROR; - } - - chrono_order_preset_name_tree = create_splaytree(compare_int, copy_int, free_int); - - /* Iterate through entire dirent name list, adding to the preset name list if it - is valid */ - for (i = 0; ((i < dir_size) && (i < MAX_PRESETS_IN_DIR));i++) { - - /* Only perform the next set of operations if the preset name - contains a valid extension */ - if (is_valid_extension(name_list[i]->d_name)) { - - /* Handle the out of memory case. My guess is xmms would - crash before this program would, but whatever...*/ - if ((preset_name = (char*)malloc(MAX_PATH_SIZE)) == NULL) { - if (PRESET_DEBUG) printf("loadPresetDir: out of memory! \n"); - - /* Free the rest of the dirent name list */ - for (j = i; j < dir_size; j++) - free(name_list[j]); - destroy_splaytree(chrono_order_preset_name_tree); - return OUTOFMEM_ERROR; - } - - /* Now create the full path */ - if (get_preset_path(&preset_name, dir, name_list[i]->d_name) < 0) { - if (PRESET_DEBUG) printf("loadPresetDir: failed to generate full preset path name!\n"); - - /* Free the rest of the dirent name list */ - for (j = i; j < dir_size; j++) - free(name_list[j]); - destroy_splaytree(chrono_order_preset_name_tree); - return OUTOFMEM_ERROR; - - } - - /* Insert the character string into the splay tree, with the key being its sequence number */ - splay_insert(preset_name, &preset_name_buffer_size, chrono_order_preset_name_tree); - preset_name_buffer_size++; - } - - /* Free the dirent struct */ - free(name_list[i]); - - } - - free(name_list); - - /* No valid files in directory! */ - if (chrono_order_preset_name_tree->root == NULL) { - if (PRESET_DEBUG) printf("loadPresetDir: no valid files in directory \"%s\"\n", dir); - destroy_splaytree(chrono_order_preset_name_tree); - chrono_order_preset_name_tree = NULL; - return FAILURE; - } - - /* Start the prefix index right before the first entry, so next preset - starts at the top of the list */ - preset_index = -1; - - /* Start the first preset */ - - switchPreset(ALPHA_NEXT, HARD_CUT); - - return SUCCESS; -} - -/* closePresetDir: closes the current - preset directory buffer */ - -int closePresetDir() { - - /* No preset director appears to be loaded */ - if (chrono_order_preset_name_tree == NULL) - return SUCCESS; - - if (PRESET_DEBUG) { - printf("closePresetDir: freeing directory buffer..."); - fflush(stdout); - } - - /* Free each entry in the directory preset name tree */ - splay_traverse(free_int, chrono_order_preset_name_tree); - - /* Destroy the chronological order splay tree */ - destroy_splaytree(chrono_order_preset_name_tree); - chrono_order_preset_name_tree = NULL; - preset_name_buffer_size = 0; - if (PRESET_DEBUG) printf("finished\n"); - - return SUCCESS; -} - - - -/* Converts a preset file name to a full path */ -int get_preset_path(char ** preset_path_ptr, char * filepath, char * filename) { - - char * preset_path; - - /* An insanely paranoid sequence of argument checks */ - if (preset_path_ptr == NULL) - return ERROR; - if (*preset_path_ptr == NULL) - return ERROR; - if (filename == NULL) - return ERROR; - if (filepath == NULL) - return ERROR; - - /* Mostly here for looks */ - preset_path = *preset_path_ptr; - - /* Clear the name space first */ - memset(preset_path, 0, MAX_PATH_SIZE); - - /* Now create the string "PATH/FILENAME", where path is either absolute or relative location - of the .milk file, and filename is the name of the preset file itself */ - strcat( - strcat( - strncpy( - preset_path, - filepath, - MAX_PATH_SIZE-1), - "/"), - filename); - - return SUCCESS; -} - -/* switchPreset: loads the next preset from the directory stream. - loadPresetDir() must be called first. This is a - sequential load function */ - -int switchPreset(switch_mode_t switch_mode, int cut_type) { - - preset_t * new_preset; - - int switch_index; - - /* Make sure a preset directory list is in the buffer */ - if (chrono_order_preset_name_tree == NULL) { - if (PRESET_DEBUG) printf("switchPreset: it helps if you open a directory first with a loadPresetDir() call\n"); - return ERROR; - } - - - switch (switch_mode) { - - case ALPHA_NEXT: - /* An index variable that iterates through the directory - buffer, doing wrap around when it reaches the end of - the buffer */ - - if (preset_index == (preset_name_buffer_size - 1)) - switch_index = preset_index = 0; - else - switch_index = ++preset_index; - break; - - case ALPHA_PREVIOUS: - - if (preset_index == 0) - switch_index = preset_index = preset_name_buffer_size - 1; - else - switch_index = --preset_index; - break; - - case RANDOM_NEXT: - switch_index = (int) (preset_name_buffer_size*(rand()/(RAND_MAX+1.0))); - break; - case RESTART_ACTIVE: - switch_index = preset_index; - break; - default: - return FAILURE; - } - - - /* Finally, load the preset using its actual path */ - if ((new_preset = load_preset((char*)splay_find(&switch_index, chrono_order_preset_name_tree))) == NULL) { - if (PRESET_DEBUG) printf("switchPreset: failed to load preset\n"); - return ERROR; - } - - /* Closes a preset currently loaded, if any */ - if ((active_preset != NULL) && (active_preset != idle_preset)) - close_preset(active_preset); - - /* Sets global active_preset pointer */ - active_preset = new_preset; - - - /* Reinitialize the engine variables to sane defaults */ - reset_engine_vars(); - - /* Add any missing initial conditions */ - load_init_conditions(); - - /* Add any missing initial conditions for each wave */ - load_custom_wave_init_conditions(); - -/* Add any missing initial conditions for each shape */ - load_custom_shape_init_conditions(); - - /* Need to evaluate the initial conditions once */ - evalInitConditions(); - - - // evalInitPerFrameEquations(); - return SUCCESS; -} - -/* Loads a specific preset by absolute path */ -int loadPresetByFile(char * filename) { - - preset_t * new_preset; - - /* Finally, load the preset using its actual path */ - if ((new_preset = load_preset(filename)) == NULL) { - if (PRESET_DEBUG) printf("loadPresetByFile: failed to load preset!\n"); - return ERROR; - } - - /* Closes a preset currently loaded, if any */ - if ((active_preset != NULL) && (active_preset != idle_preset)) - close_preset(active_preset); - - /* Sets active preset global pointer */ - active_preset = new_preset; - - /* Reinitialize engine variables */ - reset_engine_vars(); - - - /* Add any missing initial conditions for each wave */ - load_custom_wave_init_conditions(); - - /* Add any missing initial conditions for each wave */ - load_custom_shape_init_conditions(); - - /* Add any missing initial conditions */ - load_init_conditions(); - - /* Need to do this once for menu */ - evalInitConditions(); - // evalPerFrameInitEquations(); - return SUCCESS; - -} - -int init_idle_preset() { - - preset_t * preset; - - /* Initialize idle preset struct */ - if ((preset = (preset_t*)malloc(sizeof(preset_t))) == NULL) - return FAILURE; - - - strncpy(preset->name, "idlepreset", strlen("idlepreset")); - - /* Initialize equation trees */ - preset->init_cond_tree = create_splaytree(compare_string, copy_string, free_string); - preset->user_param_tree = create_splaytree(compare_string, copy_string, free_string); - preset->per_frame_eqn_tree = create_splaytree(compare_int, copy_int, free_int); - preset->per_pixel_eqn_tree = create_splaytree(compare_int, copy_int, free_int); - preset->per_frame_init_eqn_tree = create_splaytree(compare_string, copy_string, free_string); - preset->custom_wave_tree = create_splaytree(compare_int, copy_int, free_int); - preset->custom_shape_tree = create_splaytree(compare_int, copy_int, free_int); - - /* Set file path to dummy name */ - strncpy(preset->file_path, "IDLE PRESET", MAX_PATH_SIZE-1); - - /* Set initial index values */ - preset->per_pixel_eqn_string_index = 0; - preset->per_frame_eqn_string_index = 0; - preset->per_frame_init_eqn_string_index = 0; - memset(preset->per_pixel_flag, 0, sizeof(int)*NUM_OPS); - - /* Clear string buffers */ - memset(preset->per_pixel_eqn_string_buffer, 0, STRING_BUFFER_SIZE); - memset(preset->per_frame_eqn_string_buffer, 0, STRING_BUFFER_SIZE); - memset(preset->per_frame_init_eqn_string_buffer, 0, STRING_BUFFER_SIZE); - - idle_preset = preset; - - return SUCCESS; -} - -int destroy_idle_preset() { - - return close_preset(idle_preset); - -} - -/* initPresetLoader: initializes the preset - loading library. this should be done before - any parsing */ -int initPresetLoader() { - - /* Initializes the builtin parameter database */ - init_builtin_param_db(); - - /* Initializes the builtin function database */ - init_builtin_func_db(); - - /* Initializes all infix operators */ - init_infix_ops(); - - /* Set the seed to the current time in seconds */ - srand(time(NULL)); - - /* Initialize the 'idle' preset */ - init_idle_preset(); - - - - reset_engine_vars(); - - active_preset = idle_preset; - load_init_conditions(); - - /* Done */ - if (PRESET_DEBUG) printf("initPresetLoader: finished\n"); - return SUCCESS; -} - -/* Sort of experimental code here. This switches - to a hard coded preset. Useful if preset directory - was not properly loaded, or a preset fails to parse */ - -void switchToIdlePreset() { - - - /* Idle Preset already activated */ - if (active_preset == idle_preset) - return; - - - /* Close active preset */ - if (active_preset != NULL) - close_preset(active_preset); - - /* Sets global active_preset pointer */ - active_preset = idle_preset; - - /* Reinitialize the engine variables to sane defaults */ - reset_engine_vars(); - - /* Add any missing initial conditions */ - load_init_conditions(); - - /* Need to evaluate the initial conditions once */ - evalInitConditions(); - -} - -/* destroyPresetLoader: closes the preset - loading library. This should be done when - projectM does cleanup */ - -int destroyPresetLoader() { - - if ((active_preset != NULL) && (active_preset != idle_preset)) { - close_preset(active_preset); - } - - active_preset = NULL; - - destroy_idle_preset(); - destroy_builtin_param_db(); - destroy_builtin_func_db(); - destroy_infix_ops(); - - return SUCCESS; - -} - -/* load_preset_file: private function that loads a specific preset denoted - by the given pathname */ -int load_preset_file(char * pathname, preset_t * preset) { - FILE * fs; - int retval; - - if (pathname == NULL) - return FAILURE; - if (preset == NULL) - return FAILURE; - - /* Open the file corresponding to pathname */ - if ((fs = utf8_fopen(pathname, "r")) == NULL) { - if (PRESET_DEBUG) printf("load_preset_file: loading of file %s failed!\n", pathname); - return ERROR; - } - - if (PRESET_DEBUG) printf("load_preset_file: file stream \"%s\" opened successfully\n", pathname); - - /* Parse any comments */ - if (parse_top_comment(fs) < 0) { - if (PRESET_DEBUG) printf("load_preset_file: no left bracket found...\n"); - fclose(fs); - return FAILURE; - } - - /* Parse the preset name and a left bracket */ - if (parse_preset_name(fs, preset->name) < 0) { - if (PRESET_DEBUG) printf("load_preset_file: loading of preset name in file \"%s\" failed\n", pathname); - fclose(fs); - return ERROR; - } - - if (PRESET_DEBUG) printf("load_preset_file: preset \"%s\" parsed\n", preset->name); - - /* Parse each line until end of file */ - if (PRESET_DEBUG) printf("load_preset_file: beginning line parsing...\n"); - while ((retval = parse_line(fs, preset)) != EOF) { - if (retval == PARSE_ERROR) { - if (PRESET_DEBUG > 1) printf("load_preset_file: parse error in file \"%s\"\n", pathname); - } - } - - if (PRESET_DEBUG) printf("load_preset_file: finished line parsing successfully\n"); - - /* Now the preset has been loaded. - Evaluation calls can be made at appropiate - times in the frame loop */ - - fclose(fs); - - if (PRESET_DEBUG) printf("load_preset_file: file \"%s\" closed, preset ready\n", pathname); - return SUCCESS; - -} - -void evalInitConditions() { - splay_traverse(eval_init_cond, active_preset->init_cond_tree); - splay_traverse(eval_init_cond, active_preset->per_frame_init_eqn_tree); -} - -void evalPerFrameEquations() { - splay_traverse(eval_per_frame_eqn, active_preset->per_frame_eqn_tree); -} - -void evalPerFrameInitEquations() { - //printf("evalPerFrameInitEquations: per frame init unimplemented!\n"); - // splay_traverse(eval_per_frame_eqn, active_preset->per_frame_init_eqn_tree); -} - -/* Returns nonzero if string 'name' contains .milk or - (the better) .prjm extension. Not a very strong function currently */ -int is_valid_extension(char * name) { - - if (PRESET_DEBUG > 1) { - printf("is_valid_extension: scanning string \"%s\"...", name); - fflush(stdout); - } - - if (strstr(name, MILKDROP_FILE_EXTENSION)) { - if (PRESET_DEBUG > 1) printf("\".milk\" extension found in string [true]\n"); - return TRUE; - } - - if (strstr(name, PROJECTM_FILE_EXTENSION)) { - if (PRESET_DEBUG > 1) printf("\".prjm\" extension found in string [true]\n"); - return TRUE; - } - - if (PRESET_DEBUG > 1) printf("no valid extension found [false]\n"); - return FALSE; -} - -/* Private function to close a preset file */ -int close_preset(preset_t * preset) { - - if (preset == NULL) - return FAILURE; - - - splay_traverse(free_init_cond, preset->init_cond_tree); - destroy_splaytree(preset->init_cond_tree); - - splay_traverse(free_init_cond, preset->per_frame_init_eqn_tree); - destroy_splaytree(preset->per_frame_init_eqn_tree); - - splay_traverse(free_per_pixel_eqn, preset->per_pixel_eqn_tree); - destroy_splaytree(preset->per_pixel_eqn_tree); - - splay_traverse(free_per_frame_eqn, preset->per_frame_eqn_tree); - destroy_splaytree(preset->per_frame_eqn_tree); - - splay_traverse(free_param, preset->user_param_tree); - destroy_splaytree(preset->user_param_tree); - - splay_traverse(free_custom_wave, preset->custom_wave_tree); - destroy_splaytree(preset->custom_wave_tree); - - splay_traverse(free_custom_shape, preset->custom_shape_tree); - destroy_splaytree(preset->custom_shape_tree); - - free(preset); - - return SUCCESS; - -} - -void reloadPerPixel(char *s, preset_t * preset) { - - FILE * fs; - int slen; - char c; - int i; - - if (s == NULL) - return; - - if (preset == NULL) - return; - - /* Clear previous per pixel equations */ - splay_traverse(free_per_pixel_eqn, preset->per_pixel_eqn_tree); - destroy_splaytree(preset->per_pixel_eqn_tree); - preset->per_pixel_eqn_tree = create_splaytree(compare_int, copy_int, free_int); - - /* Convert string to a stream */ - fs = fmemopen (s, strlen(s), "r"); - - while ((c = fgetc(fs)) != EOF) { - ungetc(c, fs); - parse_per_pixel_eqn(fs, preset); - } - - fclose(fs); - - /* Clear string space */ - memset(preset->per_pixel_eqn_string_buffer, 0, STRING_BUFFER_SIZE); - - /* Compute length of string */ - slen = strlen(s); - - /* Copy new string into buffer */ - strncpy(preset->per_pixel_eqn_string_buffer, s, slen); - - /* Yet again no bounds checking */ - preset->per_pixel_eqn_string_index = slen; - - /* Finished */ - - return; -} - -/* Obviously unwritten */ -void reloadPerFrameInit(char *s, preset_t * preset) { - -} - -void reloadPerFrame(char * s, preset_t * preset) { - - FILE * fs; - int slen; - char c; - int eqn_count = 1; - per_frame_eqn_t * per_frame; - - if (s == NULL) - return; - - if (preset == NULL) - return; - - /* Clear previous per frame equations */ - splay_traverse(free_per_frame_eqn, preset->per_frame_eqn_tree); - destroy_splaytree(preset->per_frame_eqn_tree); - preset->per_frame_eqn_tree = create_splaytree(compare_int, copy_int, free_int); - - /* Convert string to a stream */ - fs = fmemopen (s, strlen(s), "r"); - - while ((c = fgetc(fs)) != EOF) { - ungetc(c, fs); - if ((per_frame = parse_per_frame_eqn(fs, eqn_count, preset)) != NULL) { - splay_insert(per_frame, &eqn_count, preset->per_frame_eqn_tree); - eqn_count++; - } - } - - fclose(fs); - - /* Clear string space */ - memset(preset->per_frame_eqn_string_buffer, 0, STRING_BUFFER_SIZE); - - /* Compute length of string */ - slen = strlen(s); - - /* Copy new string into buffer */ - strncpy(preset->per_frame_eqn_string_buffer, s, slen); - - /* Yet again no bounds checking */ - preset->per_frame_eqn_string_index = slen; - - /* Finished */ - printf("reloadPerFrame: %d eqns parsed succesfully\n", eqn_count-1); - return; - -} - -preset_t * load_preset(char * pathname) { - - preset_t * preset; - - /* Initialize preset struct */ - if ((preset = (preset_t*)malloc(sizeof(preset_t))) == NULL) - return NULL; - - /* Initialize equation trees */ - preset->init_cond_tree = create_splaytree(compare_string, copy_string, free_string); - preset->user_param_tree = create_splaytree(compare_string, copy_string, free_string); - preset->per_frame_eqn_tree = create_splaytree(compare_int, copy_int, free_int); - preset->per_pixel_eqn_tree = create_splaytree(compare_int, copy_int, free_int); - preset->per_frame_init_eqn_tree = create_splaytree(compare_string, copy_string, free_string); - preset->custom_wave_tree = create_splaytree(compare_int, copy_int, free_int); - preset->custom_shape_tree = create_splaytree(compare_int, copy_int, free_int); - - memset(preset->per_pixel_flag, 0, sizeof(int)*NUM_OPS); - - /* Copy file path */ - strncpy(preset->file_path, pathname, MAX_PATH_SIZE-1); - - /* Set initial index values */ - preset->per_pixel_eqn_string_index = 0; - preset->per_frame_eqn_string_index = 0; - preset->per_frame_init_eqn_string_index = 0; - - - /* Clear string buffers */ - memset(preset->per_pixel_eqn_string_buffer, 0, STRING_BUFFER_SIZE); - memset(preset->per_frame_eqn_string_buffer, 0, STRING_BUFFER_SIZE); - memset(preset->per_frame_init_eqn_string_buffer, 0, STRING_BUFFER_SIZE); - - - if (load_preset_file(pathname, preset) < 0) { - if (PRESET_DEBUG) printf("load_preset: failed to load file \"%s\"\n", pathname); - close_preset(preset); - return NULL; - } - - /* It's kind of ugly to reset these values here. Should definitely be placed in the parser somewhere */ - per_frame_eqn_count = 0; - per_frame_init_eqn_count = 0; - - /* Finished, return new preset */ - return preset; -} - -void savePreset(char * filename) { - - FILE * fs; - - if (filename == NULL) - return; - - /* Open the file corresponding to pathname */ - if ((fs = utf8_fopen(filename, "w+")) == NULL) { - if (PRESET_DEBUG) printf("savePreset: failed to create filename \"%s\"!\n", filename); - return; - } - - write_stream = fs; - - if (write_preset_name(fs) < 0) { - write_stream = NULL; - fclose(fs); - return; - } - - if (write_init_conditions(fs) < 0) { - write_stream = NULL; - fclose(fs); - return; - } - - if (write_per_frame_init_equations(fs) < 0) { - write_stream = NULL; - fclose(fs); - return; - } - - if (write_per_frame_equations(fs) < 0) { - write_stream = NULL; - fclose(fs); - return; - } - - if (write_per_pixel_equations(fs) < 0) { - write_stream = NULL; - fclose(fs); - return; - } - - write_stream = NULL; - fclose(fs); - -} - -int write_preset_name(FILE * fs) { - - char s[256]; - int len; - - memset(s, 0, 256); - - if (fs == NULL) - return FAILURE; - - /* Format the preset name in a string */ - sprintf(s, "[%s]\n", active_preset->name); - - len = strlen(s); - - /* Write preset name to file stream */ - if (fwrite(s, 1, len, fs) != len) - return FAILURE; - - return SUCCESS; - -} - -int write_init_conditions(FILE * fs) { - - if (fs == NULL) - return FAILURE; - if (active_preset == NULL) - return FAILURE; - - - splay_traverse(write_init, active_preset->init_cond_tree); - - return SUCCESS; -} - -void write_init(init_cond_t * init_cond) { - - char s[512]; - int len; - - if (write_stream == NULL) - return; - - memset(s, 0, 512); - - if (init_cond->param->type == P_TYPE_BOOL) - sprintf(s, "%s=%d\n", init_cond->param->name, init_cond->init_val.bool_val); - - else if (init_cond->param->type == P_TYPE_INT) - sprintf(s, "%s=%d\n", init_cond->param->name, init_cond->init_val.int_val); - - else if (init_cond->param->type == P_TYPE_DOUBLE) - { - lldiv_t div = lldiv( init_cond->init_val.double_val * 1000000,1000000 ); - sprintf(s, "%s=%"PRId64".%06u\n", init_cond->param->name, div.quot, - (unsigned int) div.rem ); - } - - else { printf("write_init: unknown parameter type!\n"); return; } - - len = strlen(s); - - if ((fwrite(s, 1, len, write_stream)) != len) - printf("write_init: failed writing to file stream! Out of disk space?\n"); - -} - - -int write_per_frame_init_equations(FILE * fs) { - - int len; - - if (fs == NULL) - return FAILURE; - if (active_preset == NULL) - return FAILURE; - - len = strlen(active_preset->per_frame_init_eqn_string_buffer); - - if (fwrite(active_preset->per_frame_init_eqn_string_buffer, 1, len, fs) != len) - return FAILURE; - - return SUCCESS; -} - - -int write_per_frame_equations(FILE * fs) { - - int len; - - if (fs == NULL) - return FAILURE; - if (active_preset == NULL) - return FAILURE; - - len = strlen(active_preset->per_frame_eqn_string_buffer); - - if (fwrite(active_preset->per_frame_eqn_string_buffer, 1, len, fs) != len) - return FAILURE; - - return SUCCESS; -} - - -int write_per_pixel_equations(FILE * fs) { - - int len; - - if (fs == NULL) - return FAILURE; - if (active_preset == NULL) - return FAILURE; - - len = strlen(active_preset->per_pixel_eqn_string_buffer); - - if (fwrite(active_preset->per_pixel_eqn_string_buffer, 1, len, fs) != len) - return FAILURE; - - return SUCCESS; -} - - -void load_init_conditions() { - - splay_traverse(load_init_cond, builtin_param_tree); - - -} - -void load_init_cond(param_t * param) { - - init_cond_t * init_cond; - value_t init_val; - - /* Don't count read only parameters as initial conditions */ - if (param->flags & P_FLAG_READONLY) - return; - - /* If initial condition was not defined by the preset file, force a default one - with the following code */ - if ((init_cond = splay_find(param->name, active_preset->init_cond_tree)) == NULL) { - - /* Make sure initial condition does not exist in the set of per frame initial equations */ - if ((init_cond = splay_find(param->name, active_preset->per_frame_init_eqn_tree)) != NULL) - return; - - if (param->type == P_TYPE_BOOL) - init_val.bool_val = 0; - - else if (param->type == P_TYPE_INT) - init_val.int_val = *(int*)param->engine_val; - - else if (param->type == P_TYPE_DOUBLE) - init_val.double_val = *(double*)param->engine_val; - - //printf("%s\n", param->name); - /* Create new initial condition */ - if ((init_cond = new_init_cond(param, init_val)) == NULL) - return; - - /* Insert the initial condition into this presets tree */ - if (splay_insert(init_cond, init_cond->param->name, active_preset->init_cond_tree) < 0) { - free_init_cond(init_cond); - return; - } - - } - -} - -void load_custom_wave_init_conditions() { - - splay_traverse(load_custom_wave_init, active_preset->custom_wave_tree); - -} - -void load_custom_wave_init(custom_wave_t * custom_wave) { - - load_unspecified_init_conds(custom_wave); - -} - - -void load_custom_shape_init_conditions() { - - splay_traverse(load_custom_shape_init, active_preset->custom_shape_tree); - -} - -void load_custom_shape_init(custom_shape_t * custom_shape) { - - load_unspecified_init_conds_shape(custom_shape); - -} diff --git a/modules/visualization/galaktos/preset.h b/modules/visualization/galaktos/preset.h deleted file mode 100644 index 0c6b1c4df0..0000000000 --- a/modules/visualization/galaktos/preset.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef PRESET_H -#define PRESET_H -#define PRESET_DEBUG 0 /* 0 for no debugging, 1 for normal, 2 for insane */ - -#define HARD_CUT 0 -#define SOFT_CUT 1 -#include "preset_types.h" - -void evalInitConditions(); -void evalPerFrameEquations(); -void evalPerFrameInitEquations(); - -int switchPreset(switch_mode_t switch_mode, int cut_type); -void switchToIdlePreset(); -int loadPresetDir(char * dir); -int closePresetDir(); -int initPresetLoader(); -int destroyPresetLoader(); -int loadPresetByFile(char * filename); -void reloadPerFrame(char * s, preset_t * preset); -void reloadPerFrameInit(char *s, preset_t * preset); -void reloadPerPixel(char *s, preset_t * preset); -void savePreset(char * name); - - -#endif diff --git a/modules/visualization/galaktos/preset_types.h b/modules/visualization/galaktos/preset_types.h deleted file mode 100644 index 06cfa895d0..0000000000 --- a/modules/visualization/galaktos/preset_types.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef PRESET_TYPES_H -#define PRESET_TYPES_H - -#include "splaytree_types.h" -#include "expr_types.h" -#include "per_pixel_eqn_types.h" - -typedef enum { - ALPHA_NEXT, - ALPHA_PREVIOUS, - RANDOM_NEXT, - RESTART_ACTIVE, -} switch_mode_t; - -typedef struct PRESET_T { - - char name[MAX_TOKEN_SIZE]; /* preset name as parsed in file */ - char file_path[MAX_PATH_SIZE]; /* Points to the preset file name */ - - int per_pixel_eqn_string_index; - int per_frame_eqn_string_index; - int per_frame_init_eqn_string_index; - - int per_pixel_flag[NUM_OPS]; - char per_pixel_eqn_string_buffer[STRING_BUFFER_SIZE]; - char per_frame_eqn_string_buffer[STRING_BUFFER_SIZE]; - char per_frame_init_eqn_string_buffer[STRING_BUFFER_SIZE]; - - /* Data structures that contain equation and initial condition information */ - splaytree_t * per_frame_eqn_tree; /* per frame equations */ - splaytree_t * per_pixel_eqn_tree; /* per pixel equation tree */ - gen_expr_t * per_pixel_eqn_array[NUM_OPS]; /* per pixel equation array */ - splaytree_t * per_frame_init_eqn_tree; /* per frame initial equations */ - splaytree_t * init_cond_tree; /* initial conditions */ - splaytree_t * user_param_tree; /* user parameter splay tree */ - - splaytree_t * custom_wave_tree; /* custom wave forms for this preset */ - splaytree_t * custom_shape_tree; /* custom shapes for this preset */ - -} preset_t; -#endif diff --git a/modules/visualization/galaktos/splaytree.c b/modules/visualization/galaktos/splaytree.c deleted file mode 100644 index 5049cf4ff7..0000000000 --- a/modules/visualization/galaktos/splaytree.c +++ /dev/null @@ -1,702 +0,0 @@ -/***************************************************************************** - * splaytree.c: - ***************************************************************************** - * Copyright (C) 2004 the VideoLAN team - * $Id$ - * - * Authors: Cyril Deguet - * code from projectM http://xmms-projectm.sourceforge.net - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - - - -/* - An implementation of top-down splaying - D. Sleator - March 1992 - - "Splay trees", or "self-adjusting search trees" are a simple and - efficient data structure for storing an ordered set. The data - structure consists of a binary tree, without parent pointers, and no - additional fields. It allows searching, insertion, deletion, - deletemin, deletemax, splitting, joining, and many other operations, - all with amortized logarithmic performance. Since the trees adapt to - the sequence of requests, their performance on real access patterns is - typically even better. Splay trees are described in a number of texts - and papers [1,2,3,4,5]. - - The code here is adapted from simple top-down splay, at the bottom of - page 669 of [3]. It can be obtained via anonymous ftp from - spade.pc.cs.cmu.edu in directory /usr/sleator/public. - - The chief modification here is that the splay operation works even if the - item being splayed is not in the tree, and even if the tree root of the - tree is NULL. So the line: - - t = splay(i, t); - - causes it to search for item with key i in the tree rooted at t. If it's - there, it is splayed to the root. If it isn't there, then the node put - at the root is the last one before NULL that would have been reached in a - normal binary search for i. (It's a neighbor of i in the tree.) This - allows many other operations to be easily implemented, as shown below. - - [1] "Fundamentals of data structures in C", Horowitz, Sahni, - and Anderson-Freed, Computer Science Press, pp 542-547. - - [2] "Data Structures and Their Algorithms", Lewis and Denenberg, - Harper Collins, 1991, pp 243-251. - [3] "Self-adjusting Binary Search Trees" Sleator and Tarjan, - JACM Volume 32, No 3, July 1985, pp 652-686. - [4] "Data Structure and Algorithm Analysis", Mark Weiss, - Benjamin Cummins, 1992, pp 119-130. - [5] "Data Structures, Algorithms, and Performance", Derick Wood, - Addison-Wesley, 1993, pp 367-375. - - The following code was written by Daniel Sleator, and is released - in the public domain. It has been heavily modified by Carmelo Piccione, - (cep@andrew.cmu.edu), to suit personal needs, -*/ - -#include -#include - -#include "common.h" -#include "fatal.h" - -#include "splaytree_types.h" -#include "splaytree.h" - - - -splaynode_t * splay (void * key, splaynode_t * t, int * match_type, int (*compare)()); -int free_splaynode(splaynode_t * splaynode, void (*free_key)()); -void splay_traverse_helper (void (*func_ptr)(), splaynode_t * splaynode); -splaynode_t * splay_delete_helper(void * key, splaynode_t * t, int (*compare)(), void (*free_key)()); -void splay_find_above_min_helper(void * max_key, void ** closest_key, splaynode_t * root, int (*compare)()); -void splay_find_below_max_helper(void * max_key, void ** closest_key, splaynode_t * root, int (*compare)()); -splaynode_t * new_splaynode(int type, void * key, void * data); -int splay_insert_node(splaynode_t * splaynode, splaytree_t * splaytree); -int splay_rec_size(splaynode_t * splaynode); - -/* Creates a splay tree given a compare key function, copy key function, and free key function. - Ah yes, the wonders of procedural programming */ -splaytree_t * create_splaytree(int (*compare)(), void * (*copy_key)(), void (*free_key)()) { - - splaytree_t * splaytree; - - /* Allocate memory for the splaytree struct */ - if ((splaytree = (splaytree_t*)malloc(sizeof(splaytree_t))) == NULL) - return NULL; - - /* Set struct entries */ - splaytree->root = NULL; - splaytree->compare = compare; - splaytree->copy_key = copy_key; - splaytree->free_key = free_key; - - /* Return instantiated splay tree */ - return splaytree; -} - -/* Destroys a splay tree */ -int destroy_splaytree(splaytree_t * splaytree) { - - /* Null argument check */ - if (splaytree == NULL) - return FAILURE; - - /* Recursively free all splaynodes in tree */ - free_splaynode(splaytree->root, splaytree->free_key); - - /* Free the splaytree struct itself */ - free(splaytree); - - /* Done, return success */ - return SUCCESS; - -} - -/* Recursively free all the splaynodes */ -int free_splaynode(splaynode_t * splaynode, void (*free_key)()) { - - /* Ok if this happens, a recursive base case */ - if (splaynode == NULL) - return SUCCESS; - - /* Free left node */ - free_splaynode(splaynode->left, free_key); - - /* Free right node */ - free_splaynode(splaynode->right, free_key); - - /* Free this node's key */ - free_key(splaynode->key); - - /* Note that the data pointers are not freed here. - Should be freed with a splay traversal function */ - - /* Free the splaynode structure itself */ - free(splaynode); - - /* Finished, return success */ - return SUCCESS; - -} - -/* Traverses the entire splay tree with the given function func_ptr */ -void splay_traverse(void (*func_ptr)(), splaytree_t * splaytree) { - - /* Null argument check */ - - if (splaytree == NULL) - return; - if (func_ptr == NULL) - return; - - /* Call recursive helper function */ - splay_traverse_helper(func_ptr, splaytree->root); - - return; -} - -/* Helper function to traverse the entire splaytree */ -void splay_traverse_helper (void (*func_ptr)(), splaynode_t * splaynode) { - - /* Normal if this happens, its a base case of recursion */ - if (splaynode == NULL) - return; - - /* Recursively traverse to the left */ - splay_traverse_helper(func_ptr, splaynode->left); - - - /* Node is a of regular type, so its ok to perform the function on it */ - if (splaynode->type == REGULAR_NODE_TYPE) - func_ptr(splaynode->data); - - /* Node is of symbolic link type, do nothing */ - else if (splaynode->type == SYMBOLIC_NODE_TYPE) - ; - - /* Unknown node type */ - else - ; - - /* Recursively traverse to the right */ - splay_traverse_helper(func_ptr, splaynode->right); - - /* Done */ - return; -} - -/* Find the node corresponding to the given key in splaytree, return its data pointer */ -void * splay_find(void * key, splaytree_t * splaytree) { - - splaynode_t * splaynode; - int match_type; - - if (key == NULL) - return NULL; - - if (splaytree == NULL) - return NULL; - - splaynode = splaytree->root; - - /* Bring the targeted splay node to the top of the splaytree */ - splaynode = splay(key, splaynode, &match_type, splaytree->compare); - splaytree->root = splaynode; - - - /* We only want perfect matches, so return null when match isn't perfect */ - if (match_type == CLOSEST_MATCH) - return NULL; - - /* This shouldn't happen because of the match type check, but whatever */ - if (splaytree->root == NULL) - return NULL; - - /* Node is a regular type, return its data pointer */ - if (splaytree->root->type == REGULAR_NODE_TYPE) /* regular node */ - return splaytree->root->data; - - /* If the node is a symlink, pursue one link */ - if (splaytree->root->type == SYMBOLIC_NODE_TYPE) /* symbolic node */ - return ((splaynode_t*)splaytree->root->data)->data; - - - /* Unknown type */ - return NULL; -} - -/* Gets the splaynode that the given key points to */ -splaynode_t * get_splaynode_of(void * key, splaytree_t * splaytree) { - - splaynode_t * splaynode; - int match_type; - - /* Null argument checks */ - if (splaytree == NULL) - return NULL; - - if (key == NULL) - return NULL; - - splaynode = splaytree->root; - - /* Find the splaynode */ - splaynode = splay(key, splaynode, &match_type, splaytree->compare); - splaytree->root = splaynode; - - /* Only perfect matches are valid */ - if (match_type == CLOSEST_MATCH) - return NULL; - - /* Return the perfect match splay node */ - return splaynode; -} - -/* Finds the desired node, and changes the tree such that it is the root */ -splaynode_t * splay (void * key, splaynode_t * t, int * match_type, int (*compare)()) { - -/* Simple top down splay, not requiring key to be in the tree t. - What it does is described above. */ - - splaynode_t N, *l, *r, *y; - *match_type = CLOSEST_MATCH; - - if (t == NULL) return t; - N.left = N.right = NULL; - l = r = &N; - - for (;;) { - if (compare(key, t->key) < 0) { - if (t->left == NULL) break; - if (compare(key, t->left->key) < 0) { - y = t->left; /* rotate right */ - t->left = y->right; - y->right = t; - t = y; - if (t->left == NULL) break; - } - r->left = t; /* link right */ - r = t; - t = t->left; - } else if (compare(key, t->key) > 0) { - if (t->right == NULL) break; - if (compare(key, t->right->key) > 0) { - y = t->right; /* rotate left */ - t->right = y->left; - y->left = t; - t = y; - if (t->right == NULL) break; - } - l->right = t; /* link left */ - l = t; - t = t->right; - } else { - *match_type = PERFECT_MATCH; - break; - } - } - l->right = t->left; /* assemble */ - r->left = t->right; - t->left = N.right; - t->right = N.left; - - return t; - - //return NULL; -} - -/* Deletes a splay node from a splay tree. If the node doesn't exist - then nothing happens */ -int splay_delete(void * key, splaytree_t * splaytree) { - - splaynode_t * splaynode; - - /* Use helper function to delete the node and return the resulting tree */ - if ((splaynode = splay_delete_helper(key, splaytree->root, splaytree->compare, splaytree->free_key)) == NULL) - return FAILURE; - - /* Set new splaytree root equal to the returned splaynode after deletion */ - splaytree->root = splaynode; - - /* Finished, no errors */ - return SUCCESS; -} - -/* Deletes a splay node */ -splaynode_t * splay_delete_helper(void * key, splaynode_t * splaynode, int (*compare)(), void (*free_key)()) { - - splaynode_t * new_root; - int match_type; - - /* Argument check */ - if (splaynode == NULL) - return NULL; - - splaynode = splay(key, splaynode, &match_type, compare); - - /* If entry wasn't found, quit here */ - if (match_type == CLOSEST_MATCH) - return NULL; - - /* If the targeted node's left pointer is null, then set the new root - equal to the splaynode's right child */ - if (splaynode->left == NULL) { - new_root = splaynode->right; - } - - /* Otherwise, do something I don't currently understand */ - else { - new_root = splay(key, splaynode->left, &match_type, compare); - new_root->right = splaynode->right; - } - - /* Set splay nodes children pointers to null */ - splaynode->left = splaynode->right = NULL; - - /* Free the splaynode (and only this node since its children are now empty */ - free_splaynode(splaynode, free_key); - - /* Return the resulting tree */ - return new_root; - -} - -/* Create a new splay node type */ -splaynode_t * new_splaynode(int type, void * key, void * data) { - splaynode_t * splaynode; - /* Argument checks */ - if (data == NULL) - return NULL; - - if (key == NULL) - return NULL; - - /* Creates the new splay node struct */ - if ((splaynode = (splaynode_t*)malloc(sizeof(splaynode_t))) == NULL) - return NULL; - - splaynode->data = data; - splaynode->type = type; - splaynode->key = key; - - /* Return the new splay node */ - return splaynode; -} - -/* Inserts a link into the splay tree */ -int splay_insert_link(const void * alias_key, void * orig_key, splaytree_t * splaytree) { - - splaynode_t * splaynode, * data_node; - void * key_clone; - - /* Null arguments */ - if (splaytree == NULL) - return FAILURE; - - if (alias_key == NULL) - return FAILURE; - - if (orig_key == NULL) - return FAILURE; - - /* Find the splaynode corresponding to the original key */ - if ((data_node = get_splaynode_of(orig_key, splaytree)) == NULL) - return FAILURE; - - /* Create a new splay node of symbolic link type */ - if ((splaynode = new_splaynode(SYMBOLIC_NODE_TYPE, (key_clone = splaytree->copy_key(alias_key)), data_node)) == NULL) { - splaytree->free_key(key_clone); - return OUTOFMEM_ERROR; - } - - /* Insert the splaynode into the given splaytree */ - if ((splay_insert_node(splaynode, splaytree)) < 0) { - splaynode->left=splaynode->right = NULL; - free_splaynode(splaynode, splaytree->free_key); - return FAILURE; - } - - /* Done, return success */ - return SUCCESS; -} - -/* Inserts 'data' into the 'splaytree' paired with the passed 'key' */ -int splay_insert(void * data, void * key, splaytree_t * splaytree) { - - splaynode_t * splaynode; - void * key_clone; - - /* Null argument checks */ - if (splaytree == NULL) { - return FAILURE; - } - - if (key == NULL) - return FAILURE; - - /* Clone the key argument */ - key_clone = splaytree->copy_key(key); - - /* Create a new splaynode (of regular type) */ - if ((splaynode = new_splaynode(REGULAR_NODE_TYPE, key_clone, data)) == NULL) { - splaytree->free_key(key_clone); - return OUTOFMEM_ERROR; - } - - - /* Inserts the splaynode into the splaytree */ - if (splay_insert_node(splaynode, splaytree) < 0) { - splaynode->left=splaynode->right=NULL; - free_splaynode(splaynode, splaytree->free_key); - return FAILURE; - } - - - return SUCCESS; -} - -/* Helper function to insert splaynodes into the splaytree */ -int splay_insert_node(splaynode_t * splaynode, splaytree_t * splaytree) { - int match_type; - int cmpval; - void * key; - splaynode_t * t; - - /* Null argument checks */ - if (splaytree == NULL) - return FAILURE; - - if (splaynode == NULL) - return FAILURE; - - key = splaynode->key; - - t = splaytree->root; - - - /* Root is null, insert splaynode here */ - if (t == NULL) { - splaynode->left = splaynode->right = NULL; - splaytree->root = splaynode; - return SUCCESS; - - } - - t = splay(key, t, &match_type, splaytree->compare); - - if ((cmpval = splaytree->compare(key,t->key)) < 0) { - splaynode->left = t->left; - splaynode->right = t; - t->left = NULL; - splaytree->root = splaynode; - return SUCCESS; - - } - - else if (cmpval > 0) { - splaynode->right = t->right; - splaynode->left = t; - t->right = NULL; - splaytree->root = splaynode; - return SUCCESS; - } - - /* Item already exists in tree, don't reinsert */ - else { - - return FAILURE; - } -} - -/* Returns the 'maximum' key that is less than the given key in the splaytree */ -void * splay_find_below_max(void * key, splaytree_t * splaytree) { - - void * closest_key; - - if (splaytree == NULL) - return NULL; - if (splaytree->root == NULL) - return NULL; - if (key == NULL) - return NULL; - - closest_key = NULL; - - splay_find_below_max_helper(key, &closest_key, splaytree->root, splaytree->compare); - - if (closest_key == NULL) return NULL; - return splay_find(closest_key, splaytree); -} - - -/* Returns the 'minimum' key that is greater than the given key in the splaytree */ -void * splay_find_above_min(void * key, splaytree_t * splaytree) { - - void * closest_key; - - if (splaytree == NULL) - return NULL; - if (splaytree->root == NULL) - return NULL; - if (key == NULL) - return NULL; - closest_key = NULL; - - splay_find_above_min_helper(key, &closest_key, splaytree->root, splaytree->compare); - - if (closest_key == NULL) { - return NULL; - } - - return splay_find(closest_key, splaytree); -} - -/* Helper function */ -void splay_find_below_max_helper(void * min_key, void ** closest_key, splaynode_t * root, int (*compare)()) { - - /* Empty root, return*/ - if (root == NULL) - return; - - /* The root key is less than the previously found closest key. - Also try to make the key non null if the value is less than the max key */ - - if ((*closest_key == NULL) || (compare(root->key, *closest_key) < 0)) { - - /* The root key is less than the given max key, so this is the - smallest change from the given max key */ - if (compare(root->key, min_key) > 0) { - - *closest_key = root->key; - - /* Look right again in case even a greater key exists that is - still less than the given max key */ - splay_find_below_max_helper(min_key, closest_key, root->left, compare); - } - - /* The root key is greater than the given max key, and greater than - the closest key, so search left */ - else { - splay_find_below_max_helper(min_key, closest_key, root->right, compare); - } - } - - /* The root key is less than the found closest key, search right */ - else { - splay_find_below_max_helper(min_key, closest_key, root->left, compare); - } - -} - -/* Helper function */ -void splay_find_above_min_helper(void * max_key, void ** closest_key, splaynode_t * root, int (*compare)()) { - - /* Empty root, stop */ - if (root == NULL) - return; - - /* The root key is greater than the previously found closest key. - Also try to make the key non null if the value is less than the min key */ - - if ((*closest_key == NULL) || (compare(root->key, *closest_key) > 0)) { - - /* The root key is greater than the given min key, so this is the - smallest change from the given min key */ - if (compare(root->key, max_key) < 0) { - - *closest_key = root->key; - - /* Look left again in case even a smaller key exists that is - still greater than the given min key */ - splay_find_above_min_helper(max_key, closest_key, root->right, compare); - } - - /* The root key is less than the given min key, and less than - the closest key, so search right */ - else { - splay_find_above_min_helper(max_key, closest_key, root->left, compare); - } - } - - /* The root key is greater than the found closest key, search left */ - else { - splay_find_above_min_helper(max_key, closest_key, root->right, compare); - } -} - -/* Find the minimum entry of the splay tree */ -void * splay_find_min(splaytree_t * t) { - - splaynode_t * splaynode; - - if (t == NULL) - return NULL; - if (t->root == NULL) - return NULL; - - splaynode = t->root; - - while (splaynode->left != NULL) - splaynode= splaynode->left; - - return splaynode->data; -} - - -/* Find the maximum entry of the splay tree */ -void * splay_find_max(splaytree_t * t) { - - splaynode_t * splaynode; - - if (t == NULL) - return NULL; - if (t->root == NULL) - return NULL; - - splaynode = t->root; - - while (splaynode->right != NULL) { - printf("data:%d\n", *(int*)splaynode->key); - splaynode = splaynode->right; - } - return splaynode->data; -} - -int splay_size(splaytree_t * t) { - - if (t == NULL) - return 0; - if (t->root == NULL) - return 0; - - return splay_rec_size(t->root); - -} - -int splay_rec_size(splaynode_t * splaynode) { - - if (!splaynode) - return 0; - - return 1 + splay_rec_size(splaynode->left) + splay_rec_size(splaynode->right); - -} diff --git a/modules/visualization/galaktos/splaytree.h b/modules/visualization/galaktos/splaytree.h deleted file mode 100644 index fb82588ad3..0000000000 --- a/modules/visualization/galaktos/splaytree.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef SPLAYTREE_H -#define SPLAYTREE_H -#define REGULAR_NODE_TYPE 0 -#define SYMBOLIC_NODE_TYPE 1 - -#define PERFECT_MATCH 0 -#define CLOSEST_MATCH 1 - - - -void * splay_find(void * key, splaytree_t * t); -int splay_insert(void * data, void * key, splaytree_t * t); -int splay_insert_link(const void * alias_key, void * orig_key, splaytree_t * splaytree); -int splay_delete(void * key, splaytree_t * splaytree); -int splay_size(splaytree_t * t); -splaytree_t * create_splaytree(int (*compare)(), void * (*copy_key)(), void (*free_key)()); -int destroy_splaytree(splaytree_t * splaytree); -void splay_traverse(void (*func_ptr)(), splaytree_t * splaytree); -splaynode_t * get_splaynode_of(void * key, splaytree_t * splaytree); -void * splay_find_above_min(void * key, splaytree_t * root); -void * splay_find_below_max(void * key, splaytree_t * root); -void * splay_find_min(splaytree_t * t); -void * splay_find_max(splaytree_t * t); -#endif diff --git a/modules/visualization/galaktos/splaytree_types.h b/modules/visualization/galaktos/splaytree_types.h deleted file mode 100644 index 96ef977a69..0000000000 --- a/modules/visualization/galaktos/splaytree_types.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef SPLAYTREE_TYPES_H -#define SPLAYTREE_TYPES_H - -typedef struct SPLAYNODE_T { - int type; - struct SPLAYNODE_T * left, * right; - void * data; - void * key; -} splaynode_t; - -typedef struct SPLAYTREE_T { - splaynode_t * root; - int (*compare)(); - void * (*copy_key)(); - void (*free_key)(); -} splaytree_t; -#endif diff --git a/modules/visualization/galaktos/tree_types.c b/modules/visualization/galaktos/tree_types.c deleted file mode 100644 index 45f6145849..0000000000 --- a/modules/visualization/galaktos/tree_types.c +++ /dev/null @@ -1,92 +0,0 @@ -/***************************************************************************** - * tree_types.c: - ***************************************************************************** - * Copyright (C) 2004 the VideoLAN team - * $Id$ - * - * Authors: Cyril Deguet - * code from projectM http://xmms-projectm.sourceforge.net - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - -#define _GNU_SOURCE -#include -#include -#include -#include "common.h" - -/* Compares integer value numbers in 32 bit range */ -int compare_int(int * num1, int * num2) { - - if ((*num1) < (*num2)) - return -1; - if ((*num1) > (*num2)) - return 1; - - return 0; -} - -/* Compares strings in lexographical order */ -int compare_string(char * str1, char * str2) { - - // printf("comparing \"%s\" to \"%s\"\n", str1, str2); - //return strcmp(str1, str2); - return strncmp(str1, str2, MAX_TOKEN_SIZE-1); - -} - -/* Compares a string in version order. That is, file1 < file2 < file10 */ -int compare_string_version(char * str1, char * str2) { - - return strverscmp(str1, str2); - -} - - -void free_int(void * num) { - free(num); -} - - -void free_string(char * string) { - - free(string); -} - -void * copy_int(int * num) { - - int * new_num; - - if ((new_num = (int*)malloc(sizeof(int))) == NULL) - return NULL; - - *new_num = *num; - - return (void*)new_num; -} - - -void * copy_string(char * string) { - - char * new_string; - - if ((new_string = (char*)malloc(MAX_TOKEN_SIZE)) == NULL) - return NULL; - - strncpy(new_string, string, MAX_TOKEN_SIZE-1); - - return (void*)new_string; -} diff --git a/modules/visualization/galaktos/tree_types.h b/modules/visualization/galaktos/tree_types.h deleted file mode 100644 index e730b96c27..0000000000 --- a/modules/visualization/galaktos/tree_types.h +++ /dev/null @@ -1,10 +0,0 @@ -int compare_int(char * num1, char * num2); -int compare_string(char * str1, char * str2); - -void free_int(int * num); -void free_string(char * string); - -void * copy_int(int * num); -void * copy_string(char * string); - -void * compare_string_version(char * str1, char * str2); diff --git a/modules/visualization/galaktos/video_init.c b/modules/visualization/galaktos/video_init.c deleted file mode 100644 index 2cdef5d94e..0000000000 --- a/modules/visualization/galaktos/video_init.c +++ /dev/null @@ -1,141 +0,0 @@ -/***************************************************************************** - * video_init.c: - ***************************************************************************** - * Copyright (C) 2004 the VideoLAN team - * $Id$ - * - * Authors: Cyril Deguet - * code from projectM http://xmms-projectm.sourceforge.net - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - - - -//video_init.c - SDL/Opengl Windowing Creation/Resizing Functions -// -//by Peter Sperl -// -//Opens an SDL Window and creates an OpenGL session -//also able to handle resizing and fullscreening of windows -//just call init_display again with differant variables - -#include -#include -#include -#include "video_init.h" - -extern int texsize; - -extern char *buffer; - - -void setup_opengl( int w, int h ) -{ - - /* Our shading model--Gouraud (smooth). */ - glShadeModel( GL_SMOOTH); - /* Culling. */ - // glCullFace( GL_BACK ); - // glFrontFace( GL_CCW ); - // glEnable( GL_CULL_FACE ); - /* Set the clear color. */ - glClearColor( 0, 0, 0, 0 ); - /* Setup our viewport. */ - glViewport( 0, 0, w, h ); - /* - * Change to the projection matrix and set - * our viewing volume. - */ - glMatrixMode(GL_TEXTURE); - glLoadIdentity(); - - // gluOrtho2D(0.0, (GLfloat) width, 0.0, (GLfloat) height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - - // glFrustum(0.0, height, 0.0,width,10,40); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - -glDrawBuffer(GL_BACK); - glReadBuffer(GL_BACK); - glEnable(GL_BLEND); - - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - // glBlendFunc(GL_SRC_ALPHA, GL_ONE); - glEnable(GL_LINE_SMOOTH); - glEnable(GL_POINT_SMOOTH); - glClearColor(0.0f, 0.0f, 0.0f, 0.0f); - glClear(GL_COLOR_BUFFER_BIT); - - // glCopyTexImage2D(GL_TEXTURE_2D,0,GL_RGB,0,0,texsize,texsize,0); - //glCopyTexSubImage2D(GL_TEXTURE_2D,0,0,0,0,0,texsize,texsize); - glLineStipple(2, 0xAAAA); - - -} - -void CreateRenderTarget(int texsize,int *RenderTargetTextureID, int *RenderTarget ) -{ - /* Create the texture that will be bound to the render target */ - glGenTextures(1, RenderTargetTextureID); - glBindTexture(GL_TEXTURE_2D, *RenderTargetTextureID); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); -#if 0 - /* Create the render target */ - *RenderTarget = SDL_GL_CreateRenderTarget(texsize,texsize, NULL); - if ( *RenderTarget ) { - - int value; - - //printf("Created render target:\n"); - SDL_GL_GetRenderTargetAttribute( *RenderTarget, SDL_GL_RED_SIZE, &value ); - // printf( "SDL_GL_RED_SIZE: %d\n", value); - SDL_GL_GetRenderTargetAttribute( *RenderTarget, SDL_GL_GREEN_SIZE, &value ); - // printf( "SDL_GL_GREEN_SIZE: %d\n", value); - SDL_GL_GetRenderTargetAttribute( *RenderTarget, SDL_GL_BLUE_SIZE, &value ); - // printf( "SDL_GL_BLUE_SIZE: %d\n", value); - SDL_GL_GetRenderTargetAttribute( *RenderTarget, SDL_GL_ALPHA_SIZE, &value ); - // printf( "SDL_GL_ALPHA_SIZE: %d\n", value); - SDL_GL_GetRenderTargetAttribute( *RenderTarget, SDL_GL_DEPTH_SIZE, &value ); - // printf( "SDL_GL_DEPTH_SIZE: %d\n", value ); - - SDL_GL_BindRenderTarget(*RenderTarget, *RenderTargetTextureID); - - } else { -#endif - /* We can fake a render target in this demo by rendering to the - * screen and copying to a texture before we do normal rendering. - */ - buffer = malloc(3*texsize*texsize); - - glBindTexture(GL_TEXTURE_2D, *RenderTargetTextureID); - glTexImage2D(GL_TEXTURE_2D, - 0, - GL_RGB, - texsize, texsize, - 0, - GL_RGB, - GL_UNSIGNED_BYTE, - buffer); - // } - -} - - - - diff --git a/modules/visualization/galaktos/video_init.h b/modules/visualization/galaktos/video_init.h deleted file mode 100644 index 70d8d9ba68..0000000000 --- a/modules/visualization/galaktos/video_init.h +++ /dev/null @@ -1,3 +0,0 @@ -void setup_opengl( int w, int h ); - -void CreateRenderTarget(int texsize,int *RenderTargetTextureID, int *RenderTarget); diff --git a/po/POTFILES.in b/po/POTFILES.in index 282ecbd376..8680036d05 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -1278,61 +1278,6 @@ modules/video_output/xcb/window.c modules/video_output/xcb/x11.c modules/video_output/xcb/xvideo.c modules/video_output/yuv.c -modules/visualization/galaktos/PCM.c -modules/visualization/galaktos/PCM.h -modules/visualization/galaktos/beat_detect.c -modules/visualization/galaktos/beat_detect.h -modules/visualization/galaktos/builtin_funcs.h -modules/visualization/galaktos/common.h -modules/visualization/galaktos/compare.h -modules/visualization/galaktos/custom_shape.c -modules/visualization/galaktos/custom_shape.h -modules/visualization/galaktos/custom_shape_types.h -modules/visualization/galaktos/custom_wave.c -modules/visualization/galaktos/custom_wave.h -modules/visualization/galaktos/custom_wave_types.h -modules/visualization/galaktos/engine_vars.c -modules/visualization/galaktos/engine_vars.h -modules/visualization/galaktos/eval.c -modules/visualization/galaktos/eval.h -modules/visualization/galaktos/expr_types.h -modules/visualization/galaktos/fatal.h -modules/visualization/galaktos/fftsg.c -modules/visualization/galaktos/fftsg.h -modules/visualization/galaktos/func.c -modules/visualization/galaktos/func.h -modules/visualization/galaktos/func_types.h -modules/visualization/galaktos/idle_preset.h -modules/visualization/galaktos/init_cond.c -modules/visualization/galaktos/init_cond.h -modules/visualization/galaktos/init_cond_types.h -modules/visualization/galaktos/interface_types.h -modules/visualization/galaktos/main.c -modules/visualization/galaktos/main.h -modules/visualization/galaktos/param.c -modules/visualization/galaktos/param.h -modules/visualization/galaktos/param_types.h -modules/visualization/galaktos/parser.c -modules/visualization/galaktos/parser.h -modules/visualization/galaktos/per_frame_eqn.c -modules/visualization/galaktos/per_frame_eqn.h -modules/visualization/galaktos/per_frame_eqn_types.h -modules/visualization/galaktos/per_pixel_eqn.c -modules/visualization/galaktos/per_pixel_eqn.h -modules/visualization/galaktos/per_pixel_eqn_types.h -modules/visualization/galaktos/per_point_types.h -modules/visualization/galaktos/plugin.c -modules/visualization/galaktos/plugin.h -modules/visualization/galaktos/preset.c -modules/visualization/galaktos/preset.h -modules/visualization/galaktos/preset_types.h -modules/visualization/galaktos/splaytree.c -modules/visualization/galaktos/splaytree.h -modules/visualization/galaktos/splaytree_types.h -modules/visualization/galaktos/tree_types.c -modules/visualization/galaktos/tree_types.h -modules/visualization/galaktos/video_init.c -modules/visualization/galaktos/video_init.h modules/visualization/goom.c modules/visualization/visual/effects.c modules/visualization/visual/fft.c -- 2.39.2