diff options
Diffstat (limited to 'src/post/goom/plugin_info.c')
-rw-r--r-- | src/post/goom/plugin_info.c | 214 |
1 files changed, 214 insertions, 0 deletions
diff --git a/src/post/goom/plugin_info.c b/src/post/goom/plugin_info.c new file mode 100644 index 000000000..31627f96f --- /dev/null +++ b/src/post/goom/plugin_info.c @@ -0,0 +1,214 @@ +#include "goom_plugin_info.h" +#include "cpu_info.h" +#include "default_scripts.h" +#include "drawmethods.h" +#include <math.h> +#include <stdio.h> + + +#ifdef CPU_POWERPC +#include <sys/types.h> +#include <sys/sysctl.h> +#include "ppc_zoom_ultimate.h" +#include "ppc_drawings.h" +#endif /* CPU_POWERPC */ + + +#ifdef CPU_X86 +/* TODO: PUT THIS IN SEPARATE HEADERS */ +extern int xmmx_supported (); +extern int mmx_supported (); +extern void draw_line_mmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny); +extern void zoom_filter_mmx (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); +extern void zoom_filter_xmmx (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); +/* END TODO */ +#endif /* CPU_X86 */ + + + + +/* prototypes of methods */ + +void zoom_filter_c (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); +void create_output_with_brightness(Pixel *src, Pixel *output_buffer, int screensize, int iff); + + +static void setOptimizedMethods(PluginInfo *p) { + + unsigned int cpuFlavour = cpu_flavour(); + + /* set default methods */ + p->methods.draw_line = draw_line; + p->methods.zoom_filter = zoom_filter_c; + p->methods.create_output_with_brightness = create_output_with_brightness; + +#ifdef CPU_X86 + if (cpuFlavour & CPU_OPTION_XMMX) { +#ifdef VERBOSE + printf ("Extented MMX detected. Using the fastest methods !\n"); +#endif + p->methods.draw_line = draw_line_mmx; + p->methods.zoom_filter = zoom_filter_xmmx; + } + else if (cpuFlavour & CPU_OPTION_MMX) { +#ifdef VERBOSE + printf ("MMX detected. Using fast methods !\n"); +#endif + p->methods.draw_line = draw_line_mmx; + p->methods.zoom_filter = zoom_filter_mmx; + } +#ifdef VERBOSE + else + printf ("Too bad ! No SIMD optimization available for your CPU.\n"); +#endif +#endif /* CPU_X86 */ + +#ifdef CPU_POWERPC + + if (cpuFlavour & CPU_OPTION_64_BITS) { + p->methods.create_output_with_brightness = ppc_brightness_G5; + p->methods.zoom_filter = ppc_zoom_generic; + } + else if (cpuFlavour & CPU_OPTION_ALTIVEC) { + p->methods.create_output_with_brightness = ppc_brightness_G4; + p->methods.zoom_filter = ppc_zoom_G4; + } + else + { + p->methods.create_output_with_brightness = ppc_brightness_generic; + p->methods.zoom_filter = ppc_zoom_generic; + } +#endif /* CPU_POWERPC */ + +} + +void plugin_info_init(PluginInfo *pp, int nbVisuals) { + + PluginInfo p; + int i; + + p.sound.speedvar = p.sound.accelvar = p.sound.totalgoom = 0; + p.sound.prov_max = 0; + p.sound.goom_limit = 1; + p.sound.allTimesMax = 1; + + p.sound.volume_p = secure_f_feedback("Sound Volume"); + p.sound.accel_p = secure_f_feedback("Sound Acceleration"); + p.sound.speed_p = secure_f_feedback("Sound Speed"); + p.sound.goom_limit_p = secure_f_feedback("Goom Limit"); + p.sound.last_goom_p = secure_f_feedback("Goom Detection"); + p.sound.last_biggoom_p = secure_f_feedback("Big Goom Detection"); + p.sound.goom_power_p = secure_f_feedback("Goom Power"); + + p.sound.biggoom_speed_limit_p = secure_i_param("Big Goom Speed Limit"); + IVAL(p.sound.biggoom_speed_limit_p) = 10; + IMIN(p.sound.biggoom_speed_limit_p) = 0; + IMAX(p.sound.biggoom_speed_limit_p) = 100; + ISTEP(p.sound.biggoom_speed_limit_p) = 1; + + p.sound.biggoom_factor_p = secure_i_param("Big Goom Factor"); + IVAL(p.sound.biggoom_factor_p) = 10; + IMIN(p.sound.biggoom_factor_p) = 0; + IMAX(p.sound.biggoom_factor_p) = 100; + ISTEP(p.sound.biggoom_factor_p) = 1; + + p.sound.params = plugin_parameters ("Sound", 11); + + p.nbParams = 0; + p.nbVisuals = nbVisuals; + p.visuals = (VisualFX**)malloc(sizeof(VisualFX*)*nbVisuals); + + *pp = p; + pp->sound.params.params[0] = &pp->sound.biggoom_speed_limit_p; + pp->sound.params.params[1] = &pp->sound.biggoom_factor_p; + pp->sound.params.params[2] = 0; + pp->sound.params.params[3] = &pp->sound.volume_p; + pp->sound.params.params[4] = &pp->sound.accel_p; + pp->sound.params.params[5] = &pp->sound.speed_p; + pp->sound.params.params[6] = 0; + pp->sound.params.params[7] = &pp->sound.goom_limit_p; + pp->sound.params.params[8] = &pp->sound.goom_power_p; + pp->sound.params.params[9] = &pp->sound.last_goom_p; + pp->sound.params.params[10] = &pp->sound.last_biggoom_p; + + pp->statesNumber = 8; + pp->statesRangeMax = 510; + { + GoomState states[8] = { + {1,0,0,1,4, 0, 100}, + {1,0,0,0,1, 101, 140}, + {1,0,0,1,2, 141, 200}, + {0,1,0,1,2, 201, 260}, + {0,1,0,1,0, 261, 330}, + {0,1,1,1,4, 331, 400}, + {0,0,1,0,5, 401, 450}, + {0,0,1,1,1, 451, 510}}; + for (i=0;i<8;++i) + pp->states[i] = states[i]; + } + pp->curGState = &(pp->states[6]); + + /* datas for the update loop */ + pp->update.lockvar = 0; + pp->update.goomvar = 0; + pp->update.loopvar = 0; + pp->update.stop_lines = 0; + pp->update.ifs_incr = 1; /* dessiner l'ifs (0 = non: > = increment) */ + pp->update.decay_ifs = 0; /* disparition de l'ifs */ + pp->update.recay_ifs = 0; /* dedisparition de l'ifs */ + pp->update.cyclesSinceLastChange = 0; + pp->update.drawLinesDuration = 80; + pp->update.lineMode= pp->update.drawLinesDuration; + + pp->update.switchMultAmount = (29.0f/30.0f); + pp->update.switchIncrAmount = 0x7f; + pp->update.switchMult = 1.0f; + pp->update.switchIncr = pp->update.switchIncrAmount; + + pp->update.stateSelectionRnd = 0; + pp->update.stateSelectionBlocker = 0; + pp->update.previousZoomSpeed = 128; + pp->update.timeOfTitleDisplay = 0; + + pp->update_message.affiche = 0; + + { + ZoomFilterData zfd = { + 127, 8, 16, + 1, 1, 0, NORMAL_MODE, + 0, 0, 0, 0, 0 + }; + pp->update.zoomFilterData = zfd; + } + + setOptimizedMethods(pp); + + pp->scanner = goom_script_scanner_new(); + pp->main_scanner = goom_script_scanner_new(); + pp->main_script_str = GOOM_MAIN_SCRIPT; + + for (i = 0; i < 0xffff; i++) { + pp->sintable[i] = (int) (1024 * sin ((double) i * 360 / (sizeof (pp->sintable) / sizeof (pp->sintable[0]) - 1) * 3.141592 / 180) + .5); + /* sintable [us] = (int)(1024.0f * sin (us*2*3.31415f/0xffff)) ; */ + } +} + +void plugin_info_add_visual(PluginInfo *p, int i, VisualFX *visual) { + p->visuals[i] = visual; + if (i == p->nbVisuals-1) { + ++i; + p->nbParams = 1; + while (i--) { + if (p->visuals[i]->params) + p->nbParams++; + } + p->params = (PluginParameters *)malloc(sizeof(PluginParameters)*p->nbParams); + i = p->nbVisuals; + p->nbParams = 1; + p->params[0] = p->sound.params; + while (i--) { + if (p->visuals[i]->params) + p->params[p->nbParams++] = *(p->visuals[i]->params); + } + } +} |