Blame gst/goom/goom_core.c

Packit 1f69a5
/* Goom Project
Packit 1f69a5
 * Copyright (C) <2003> Jean-Christophe Hoelt <jeko@free.fr>
Packit 1f69a5
 *
Packit 1f69a5
 * goom_core.c:Contains the core of goom's work.
Packit 1f69a5
 *
Packit 1f69a5
 * This library is free software; you can redistribute it and/or
Packit 1f69a5
 * modify it under the terms of the GNU Library General Public
Packit 1f69a5
 * License as published by the Free Software Foundation; either
Packit 1f69a5
 * version 2 of the License, or (at your option) any later version.
Packit 1f69a5
 *
Packit 1f69a5
 * This library is distributed in the hope that it will be useful,
Packit 1f69a5
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 1f69a5
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 1f69a5
 * Library General Public License for more details.
Packit 1f69a5
 *
Packit 1f69a5
 * You should have received a copy of the GNU Library General Public
Packit 1f69a5
 * License along with this library; if not, write to the
Packit 1f69a5
 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
Packit 1f69a5
 * Boston, MA 02110-1301, USA.
Packit 1f69a5
 */
Packit 1f69a5
Packit 1f69a5
#ifdef HAVE_CONFIG_H
Packit 1f69a5
#include "config.h"
Packit 1f69a5
#endif
Packit 1f69a5
Packit 1f69a5
#include <math.h>
Packit 1f69a5
#include <stdio.h>
Packit 1f69a5
#include <stdlib.h>
Packit 1f69a5
#include <string.h>
Packit 1f69a5
Packit 1f69a5
#ifdef HAVE_INTTYPES_H
Packit 1f69a5
#include <inttypes.h>
Packit 1f69a5
#endif
Packit 1f69a5
Packit 1f69a5
#include "goom.h"
Packit 1f69a5
#include "goom_tools.h"
Packit 1f69a5
#include "goom_filters.h"
Packit 1f69a5
#include "lines.h"
Packit 1f69a5
#include "ifs.h"
Packit 1f69a5
#include "tentacle3d.h"
Packit 1f69a5
Packit 1f69a5
#include "sound_tester.h"
Packit 1f69a5
#include "goom_plugin_info.h"
Packit 1f69a5
#include "goom_fx.h"
Packit 1f69a5
Packit 1f69a5
/* #define VERBOSE */
Packit 1f69a5
Packit 1f69a5
#define STOP_SPEED 128
Packit 1f69a5
/* TODO: put that as variable in PluginInfo */
Packit 1f69a5
#define TIME_BTW_CHG 300
Packit 1f69a5
Packit 1f69a5
static void choose_a_goom_line (PluginInfo * goomInfo, float *param1,
Packit 1f69a5
    float *param2, int *couleur, int *mode, float *amplitude, int far);
Packit 1f69a5
Packit 1f69a5
static void
Packit 1f69a5
init_buffers (PluginInfo * goomInfo, int buffsize)
Packit 1f69a5
{
Packit 1f69a5
  goomInfo->pixel = (guint32 *) malloc (buffsize * sizeof (guint32) + 128);
Packit 1f69a5
  memset (goomInfo->pixel, 0, buffsize * sizeof (guint32) + 128);
Packit 1f69a5
  goomInfo->back = (guint32 *) malloc (buffsize * sizeof (guint32) + 128);
Packit 1f69a5
  memset (goomInfo->back, 0, buffsize * sizeof (guint32) + 128);
Packit 1f69a5
  goomInfo->conv = (Pixel *) malloc (buffsize * sizeof (guint32) + 128);
Packit 1f69a5
  memset (goomInfo->conv, 0, buffsize * sizeof (guint32) + 128);
Packit 1f69a5
Packit 1f69a5
  goomInfo->outputBuf = goomInfo->conv;
Packit 1f69a5
Packit 1f69a5
  goomInfo->p1 = (Pixel *) ((1 + ((uintptr_t) (goomInfo->pixel)) / 128) * 128);
Packit 1f69a5
  goomInfo->p2 = (Pixel *) ((1 + ((uintptr_t) (goomInfo->back)) / 128) * 128);
Packit 1f69a5
}
Packit 1f69a5
Packit 1f69a5
/**************************
Packit 1f69a5
*         INIT           *
Packit 1f69a5
**************************/
Packit 1f69a5
PluginInfo *
Packit 1f69a5
goom_init (guint32 resx, guint32 resy)
Packit 1f69a5
{
Packit 1f69a5
  PluginInfo *goomInfo = (PluginInfo *) malloc (sizeof (PluginInfo));
Packit 1f69a5
Packit 1f69a5
#ifdef VERBOSE
Packit 1f69a5
  printf ("GOOM: init (%d, %d);\n", resx, resy);
Packit 1f69a5
#endif
Packit 1f69a5
Packit 1f69a5
  plugin_info_init (goomInfo, 4);
Packit 1f69a5
Packit 1f69a5
  goomInfo->screen.width = resx;
Packit 1f69a5
  goomInfo->screen.height = resy;
Packit 1f69a5
  goomInfo->screen.size = resx * resy;
Packit 1f69a5
Packit 1f69a5
  init_buffers (goomInfo, goomInfo->screen.size);
Packit 1f69a5
  goomInfo->gRandom = goom_random_init ((uintptr_t) goomInfo->pixel);
Packit 1f69a5
Packit 1f69a5
  goomInfo->cycle = 0;
Packit 1f69a5
Packit 1f69a5
  flying_star_create (&goomInfo->star_fx);
Packit 1f69a5
  goomInfo->star_fx.init (&goomInfo->star_fx, goomInfo);
Packit 1f69a5
Packit 1f69a5
  zoomFilterVisualFXWrapper_create (&goomInfo->zoomFilter_fx);
Packit 1f69a5
  goomInfo->zoomFilter_fx.init (&goomInfo->zoomFilter_fx, goomInfo);
Packit 1f69a5
Packit 1f69a5
  tentacle_fx_create (&goomInfo->tentacles_fx);
Packit 1f69a5
  goomInfo->tentacles_fx.init (&goomInfo->tentacles_fx, goomInfo);
Packit 1f69a5
Packit 1f69a5
  convolve_create (&goomInfo->convolve_fx);
Packit 1f69a5
  goomInfo->convolve_fx.init (&goomInfo->convolve_fx, goomInfo);
Packit 1f69a5
Packit 1f69a5
  plugin_info_add_visual (goomInfo, 0, &goomInfo->zoomFilter_fx);
Packit 1f69a5
  plugin_info_add_visual (goomInfo, 1, &goomInfo->tentacles_fx);
Packit 1f69a5
  plugin_info_add_visual (goomInfo, 2, &goomInfo->star_fx);
Packit 1f69a5
  plugin_info_add_visual (goomInfo, 3, &goomInfo->convolve_fx);
Packit 1f69a5
Packit 1f69a5
  ifs_visualfx_create (&goomInfo->ifs_fx);
Packit 1f69a5
  goomInfo->ifs_fx.init (&goomInfo->ifs_fx, goomInfo);
Packit 1f69a5
Packit 1f69a5
  goomInfo->gmline1 = goom_lines_init (goomInfo, resx, goomInfo->screen.height,
Packit 1f69a5
      GML_HLINE, goomInfo->screen.height, GML_BLACK,
Packit 1f69a5
      GML_CIRCLE, 0.4f * (float) goomInfo->screen.height, GML_VERT);
Packit 1f69a5
  goomInfo->gmline2 = goom_lines_init (goomInfo, resx, goomInfo->screen.height,
Packit 1f69a5
      GML_HLINE, 0, GML_BLACK,
Packit 1f69a5
      GML_CIRCLE, 0.2f * (float) goomInfo->screen.height, GML_RED);
Packit 1f69a5
Packit 1f69a5
  /* goom_set_main_script(goomInfo, goomInfo->main_script_str); */
Packit 1f69a5
Packit 1f69a5
  return goomInfo;
Packit 1f69a5
}
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
void
Packit 1f69a5
goom_set_resolution (PluginInfo * goomInfo, guint32 resx, guint32 resy)
Packit 1f69a5
{
Packit 1f69a5
  free (goomInfo->pixel);
Packit 1f69a5
  free (goomInfo->back);
Packit 1f69a5
  free (goomInfo->conv);
Packit 1f69a5
Packit 1f69a5
  goomInfo->screen.width = resx;
Packit 1f69a5
  goomInfo->screen.height = resy;
Packit 1f69a5
  goomInfo->screen.size = resx * resy;
Packit 1f69a5
Packit 1f69a5
  init_buffers (goomInfo, goomInfo->screen.size);
Packit 1f69a5
Packit 1f69a5
  /* init_ifs (goomInfo, resx, goomInfo->screen.height); */
Packit 1f69a5
  goomInfo->ifs_fx.free (&goomInfo->ifs_fx);
Packit 1f69a5
  goomInfo->ifs_fx.init (&goomInfo->ifs_fx, goomInfo);
Packit 1f69a5
Packit 1f69a5
  goom_lines_set_res (goomInfo->gmline1, resx, goomInfo->screen.height);
Packit 1f69a5
  goom_lines_set_res (goomInfo->gmline2, resx, goomInfo->screen.height);
Packit 1f69a5
}
Packit 1f69a5
Packit 1f69a5
int
Packit 1f69a5
goom_set_screenbuffer (PluginInfo * goomInfo, void *buffer)
Packit 1f69a5
{
Packit 1f69a5
  goomInfo->outputBuf = (Pixel *) buffer;
Packit 1f69a5
  return 1;
Packit 1f69a5
}
Packit 1f69a5
Packit 1f69a5
/********************************************
Packit 1f69a5
*                  UPDATE                  *
Packit 1f69a5
********************************************
Packit 1f69a5
Packit 1f69a5
* WARNING: this is a 600 lines function ! (21-11-2003)
Packit 1f69a5
*/
Packit 1f69a5
guint32 *
Packit 1f69a5
goom_update (PluginInfo * goomInfo, gint16 data[2][512], int forceMode,
Packit 1f69a5
    float fps)
Packit 1f69a5
{
Packit 1f69a5
  Pixel *return_val;
Packit 1f69a5
  guint32 pointWidth;
Packit 1f69a5
  guint32 pointHeight;
Packit 1f69a5
  int i;
Packit 1f69a5
  float largfactor;             /* elargissement de l'intervalle d'�volution des points */
Packit 1f69a5
  Pixel *tmp;
Packit 1f69a5
Packit 1f69a5
  ZoomFilterData *pzfd;
Packit 1f69a5
Packit 1f69a5
  /* test if the config has changed, update it if so */
Packit 1f69a5
  pointWidth = (goomInfo->screen.width * 2) / 5;
Packit 1f69a5
  pointHeight = ((goomInfo->screen.height) * 2) / 5;
Packit 1f69a5
Packit 1f69a5
  /* ! etude du signal ... */
Packit 1f69a5
  evaluate_sound (data, &(goomInfo->sound));
Packit 1f69a5
Packit 1f69a5
  /* goom_execute_main_script(goomInfo); */
Packit 1f69a5
Packit 1f69a5
  /* ! calcul du deplacement des petits points ... */
Packit 1f69a5
  largfactor =
Packit 1f69a5
      goomInfo->sound.speedvar / 150.0f + goomInfo->sound.volume / 1.5f;
Packit 1f69a5
Packit 1f69a5
  if (largfactor > 1.5f)
Packit 1f69a5
    largfactor = 1.5f;
Packit 1f69a5
Packit 1f69a5
  goomInfo->update.decay_ifs--;
Packit 1f69a5
  if (goomInfo->update.decay_ifs > 0)
Packit 1f69a5
    goomInfo->update.ifs_incr += 2;
Packit 1f69a5
  if (goomInfo->update.decay_ifs == 0)
Packit 1f69a5
    goomInfo->update.ifs_incr = 0;
Packit 1f69a5
Packit 1f69a5
  if (goomInfo->update.recay_ifs) {
Packit 1f69a5
    goomInfo->update.ifs_incr -= 2;
Packit 1f69a5
    goomInfo->update.recay_ifs--;
Packit 1f69a5
    if ((goomInfo->update.recay_ifs == 0) && (goomInfo->update.ifs_incr <= 0))
Packit 1f69a5
      goomInfo->update.ifs_incr = 1;
Packit 1f69a5
  }
Packit 1f69a5
Packit 1f69a5
  if (goomInfo->update.ifs_incr > 0)
Packit 1f69a5
    goomInfo->ifs_fx.apply (&goomInfo->ifs_fx, goomInfo->p2, goomInfo->p1,
Packit 1f69a5
        goomInfo);
Packit 1f69a5
Packit 1f69a5
  if (goomInfo->curGState->drawPoints) {
Packit 1f69a5
    for (i = 1; i * 15 <= goomInfo->sound.speedvar * 80.0f + 15; i++) {
Packit 1f69a5
      goomInfo->update.loopvar += goomInfo->sound.speedvar * 50 + 1;
Packit 1f69a5
Packit 1f69a5
      pointFilter (goomInfo, goomInfo->p1,
Packit 1f69a5
          YELLOW,
Packit 1f69a5
          ((pointWidth - 6.0f) * largfactor + 5.0f),
Packit 1f69a5
          ((pointHeight - 6.0f) * largfactor + 5.0f),
Packit 1f69a5
          i * 152.0f, 128.0f, goomInfo->update.loopvar + i * 2032);
Packit 1f69a5
      pointFilter (goomInfo, goomInfo->p1, ORANGE,
Packit 1f69a5
          ((pointWidth / 2) * largfactor) / i + 10.0f * i,
Packit 1f69a5
          ((pointHeight / 2) * largfactor) / i + 10.0f * i,
Packit 1f69a5
          96.0f, i * 80.0f, goomInfo->update.loopvar / i);
Packit 1f69a5
      pointFilter (goomInfo, goomInfo->p1, VIOLET,
Packit 1f69a5
          ((pointHeight / 3 + 5.0f) * largfactor) / i + 10.0f * i,
Packit 1f69a5
          ((pointHeight / 3 + 5.0f) * largfactor) / i + 10.0f * i,
Packit 1f69a5
          i + 122.0f, 134.0f, goomInfo->update.loopvar / i);
Packit 1f69a5
      pointFilter (goomInfo, goomInfo->p1, BLACK,
Packit 1f69a5
          ((pointHeight / 3) * largfactor + 20.0f),
Packit 1f69a5
          ((pointHeight / 3) * largfactor + 20.0f),
Packit 1f69a5
          58.0f, i * 66.0f, goomInfo->update.loopvar / i);
Packit 1f69a5
      pointFilter (goomInfo, goomInfo->p1, WHITE,
Packit 1f69a5
          (pointHeight * largfactor + 10.0f * i) / i,
Packit 1f69a5
          (pointHeight * largfactor + 10.0f * i) / i,
Packit 1f69a5
          66.0f, 74.0f, goomInfo->update.loopvar + i * 500);
Packit 1f69a5
    }
Packit 1f69a5
  }
Packit 1f69a5
Packit 1f69a5
  /* par d�faut pas de changement de zoom */
Packit 1f69a5
  pzfd = NULL;
Packit 1f69a5
Packit 1f69a5
  /* 
Packit 1f69a5
   * Test forceMode
Packit 1f69a5
   */
Packit 1f69a5
#ifdef VERBOSE
Packit 1f69a5
  if (forceMode != 0) {
Packit 1f69a5
    printf ("forcemode = %d\n", forceMode);
Packit 1f69a5
  }
Packit 1f69a5
#endif
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
  /* diminuer de 1 le temps de lockage */
Packit 1f69a5
  /* note pour ceux qui n'ont pas suivis : le lockvar permet d'empecher un */
Packit 1f69a5
  /* changement d'etat du plugin juste apres un autre changement d'etat. oki */
Packit 1f69a5
  if (--goomInfo->update.lockvar < 0)
Packit 1f69a5
    goomInfo->update.lockvar = 0;
Packit 1f69a5
Packit 1f69a5
  /* on verifie qu'il ne se pas un truc interressant avec le son. */
Packit 1f69a5
  if ((goomInfo->sound.timeSinceLastGoom == 0)
Packit 1f69a5
      || (forceMode > 0)
Packit 1f69a5
      || (goomInfo->update.cyclesSinceLastChange > TIME_BTW_CHG)) {
Packit 1f69a5
Packit 1f69a5
    /* changement eventuel de mode */
Packit 1f69a5
    if (goom_irand (goomInfo->gRandom, 16) == 0)
Packit 1f69a5
      switch (goom_irand (goomInfo->gRandom, 34)) {
Packit 1f69a5
        case 0:
Packit 1f69a5
        case 10:
Packit 1f69a5
          goomInfo->update.zoomFilterData.hypercosEffect =
Packit 1f69a5
              goom_irand (goomInfo->gRandom, 2);
Packit 1f69a5
        case 13:
Packit 1f69a5
        case 20:
Packit 1f69a5
        case 21:
Packit 1f69a5
          goomInfo->update.zoomFilterData.mode = WAVE_MODE;
Packit 1f69a5
          goomInfo->update.zoomFilterData.reverse = 0;
Packit 1f69a5
          goomInfo->update.zoomFilterData.waveEffect =
Packit 1f69a5
              (goom_irand (goomInfo->gRandom, 3) == 0);
Packit 1f69a5
          if (goom_irand (goomInfo->gRandom, 2))
Packit 1f69a5
            goomInfo->update.zoomFilterData.vitesse =
Packit 1f69a5
                (goomInfo->update.zoomFilterData.vitesse + 127) >> 1;
Packit 1f69a5
          break;
Packit 1f69a5
        case 1:
Packit 1f69a5
        case 11:
Packit 1f69a5
          goomInfo->update.zoomFilterData.mode = CRYSTAL_BALL_MODE;
Packit 1f69a5
          goomInfo->update.zoomFilterData.waveEffect = 0;
Packit 1f69a5
          goomInfo->update.zoomFilterData.hypercosEffect = 0;
Packit 1f69a5
          break;
Packit 1f69a5
        case 2:
Packit 1f69a5
        case 12:
Packit 1f69a5
          goomInfo->update.zoomFilterData.mode = AMULETTE_MODE;
Packit 1f69a5
          goomInfo->update.zoomFilterData.waveEffect = 0;
Packit 1f69a5
          goomInfo->update.zoomFilterData.hypercosEffect = 0;
Packit 1f69a5
          break;
Packit 1f69a5
        case 3:
Packit 1f69a5
          goomInfo->update.zoomFilterData.mode = WATER_MODE;
Packit 1f69a5
          goomInfo->update.zoomFilterData.waveEffect = 0;
Packit 1f69a5
          goomInfo->update.zoomFilterData.hypercosEffect = 0;
Packit 1f69a5
          break;
Packit 1f69a5
        case 4:
Packit 1f69a5
        case 14:
Packit 1f69a5
          goomInfo->update.zoomFilterData.mode = SCRUNCH_MODE;
Packit 1f69a5
          goomInfo->update.zoomFilterData.waveEffect = 0;
Packit 1f69a5
          goomInfo->update.zoomFilterData.hypercosEffect = 0;
Packit 1f69a5
          break;
Packit 1f69a5
        case 5:
Packit 1f69a5
        case 15:
Packit 1f69a5
        case 22:
Packit 1f69a5
          goomInfo->update.zoomFilterData.mode = HYPERCOS1_MODE;
Packit 1f69a5
          goomInfo->update.zoomFilterData.waveEffect = 0;
Packit 1f69a5
          goomInfo->update.zoomFilterData.hypercosEffect =
Packit 1f69a5
              (goom_irand (goomInfo->gRandom, 3) == 0);
Packit 1f69a5
          break;
Packit 1f69a5
        case 6:
Packit 1f69a5
        case 16:
Packit 1f69a5
          goomInfo->update.zoomFilterData.mode = HYPERCOS2_MODE;
Packit 1f69a5
          goomInfo->update.zoomFilterData.waveEffect = 0;
Packit 1f69a5
          goomInfo->update.zoomFilterData.hypercosEffect = 0;
Packit 1f69a5
          break;
Packit 1f69a5
        case 7:
Packit 1f69a5
        case 17:
Packit 1f69a5
          goomInfo->update.zoomFilterData.mode = CRYSTAL_BALL_MODE;
Packit 1f69a5
          goomInfo->update.zoomFilterData.waveEffect =
Packit 1f69a5
              (goom_irand (goomInfo->gRandom, 4) == 0);
Packit 1f69a5
          goomInfo->update.zoomFilterData.hypercosEffect =
Packit 1f69a5
              goom_irand (goomInfo->gRandom, 2);
Packit 1f69a5
          break;
Packit 1f69a5
        case 8:
Packit 1f69a5
        case 18:
Packit 1f69a5
        case 19:
Packit 1f69a5
          goomInfo->update.zoomFilterData.mode = SCRUNCH_MODE;
Packit 1f69a5
          goomInfo->update.zoomFilterData.waveEffect = 1;
Packit 1f69a5
          goomInfo->update.zoomFilterData.hypercosEffect = 1;
Packit 1f69a5
          break;
Packit 1f69a5
        case 29:
Packit 1f69a5
        case 30:
Packit 1f69a5
          goomInfo->update.zoomFilterData.mode = YONLY_MODE;
Packit 1f69a5
          break;
Packit 1f69a5
        case 31:
Packit 1f69a5
        case 32:
Packit 1f69a5
        case 33:
Packit 1f69a5
          goomInfo->update.zoomFilterData.mode = SPEEDWAY_MODE;
Packit 1f69a5
          break;
Packit 1f69a5
        default:
Packit 1f69a5
          goomInfo->update.zoomFilterData.mode = NORMAL_MODE;
Packit 1f69a5
          goomInfo->update.zoomFilterData.waveEffect = 0;
Packit 1f69a5
          goomInfo->update.zoomFilterData.hypercosEffect = 0;
Packit 1f69a5
      }
Packit 1f69a5
  }
Packit 1f69a5
Packit 1f69a5
  /* tout ceci ne sera fait qu'en cas de non-blocage */
Packit 1f69a5
  if (goomInfo->update.lockvar == 0) {
Packit 1f69a5
    /* reperage de goom (acceleration forte de l'acceleration du volume) */
Packit 1f69a5
    /* -> coup de boost de la vitesse si besoin.. */
Packit 1f69a5
    if (goomInfo->sound.timeSinceLastGoom == 0) {
Packit 1f69a5
Packit 1f69a5
      int i;
Packit 1f69a5
Packit 1f69a5
      goomInfo->update.goomvar++;
Packit 1f69a5
Packit 1f69a5
      /* SELECTION OF THE GOOM STATE */
Packit 1f69a5
      if ((!goomInfo->update.stateSelectionBlocker)
Packit 1f69a5
          && (goom_irand (goomInfo->gRandom, 3))) {
Packit 1f69a5
        goomInfo->update.stateSelectionRnd =
Packit 1f69a5
            goom_irand (goomInfo->gRandom, goomInfo->statesRangeMax);
Packit 1f69a5
        goomInfo->update.stateSelectionBlocker = 3;
Packit 1f69a5
      } else if (goomInfo->update.stateSelectionBlocker)
Packit 1f69a5
        goomInfo->update.stateSelectionBlocker--;
Packit 1f69a5
Packit 1f69a5
      for (i = 0; i < goomInfo->statesNumber; i++)
Packit 1f69a5
        if ((goomInfo->update.stateSelectionRnd >= goomInfo->states[i].rangemin)
Packit 1f69a5
            && (goomInfo->update.stateSelectionRnd <=
Packit 1f69a5
                goomInfo->states[i].rangemax))
Packit 1f69a5
          goomInfo->curGState = &(goomInfo->states[i]);
Packit 1f69a5
Packit 1f69a5
      if ((goomInfo->curGState->drawIFS) && (goomInfo->update.ifs_incr <= 0)) {
Packit 1f69a5
        goomInfo->update.recay_ifs = 5;
Packit 1f69a5
        goomInfo->update.ifs_incr = 11;
Packit 1f69a5
      }
Packit 1f69a5
Packit 1f69a5
      if ((!goomInfo->curGState->drawIFS) && (goomInfo->update.ifs_incr > 0)
Packit 1f69a5
          && (goomInfo->update.decay_ifs <= 0))
Packit 1f69a5
        goomInfo->update.decay_ifs = 100;
Packit 1f69a5
Packit 1f69a5
      if (!goomInfo->curGState->drawScope)
Packit 1f69a5
        goomInfo->update.stop_lines = 0xf000 & 5;
Packit 1f69a5
Packit 1f69a5
      if (!goomInfo->curGState->drawScope) {
Packit 1f69a5
        goomInfo->update.stop_lines = 0;
Packit 1f69a5
        goomInfo->update.lineMode = goomInfo->update.drawLinesDuration;
Packit 1f69a5
      }
Packit 1f69a5
Packit 1f69a5
      /* if (goomInfo->update.goomvar % 1 == 0) */
Packit 1f69a5
      {
Packit 1f69a5
        guint32 vtmp;
Packit 1f69a5
        guint32 newvit;
Packit 1f69a5
Packit 1f69a5
        goomInfo->update.lockvar = 50;
Packit 1f69a5
        newvit =
Packit 1f69a5
            STOP_SPEED + 1 -
Packit 1f69a5
            ((float) 3.5f * log10 (goomInfo->sound.speedvar * 60 + 1));
Packit 1f69a5
        /* retablir le zoom avant.. */
Packit 1f69a5
        if ((goomInfo->update.zoomFilterData.reverse)
Packit 1f69a5
            && (!(goomInfo->cycle % 13)) && (rand () % 5 == 0)) {
Packit 1f69a5
          goomInfo->update.zoomFilterData.reverse = 0;
Packit 1f69a5
          goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - 2;
Packit 1f69a5
          goomInfo->update.lockvar = 75;
Packit 1f69a5
        }
Packit 1f69a5
        if (goom_irand (goomInfo->gRandom, 10) == 0) {
Packit 1f69a5
          goomInfo->update.zoomFilterData.reverse = 1;
Packit 1f69a5
          goomInfo->update.lockvar = 100;
Packit 1f69a5
        }
Packit 1f69a5
Packit 1f69a5
        if (goom_irand (goomInfo->gRandom, 10) == 0)
Packit 1f69a5
          goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - 1;
Packit 1f69a5
        if (goom_irand (goomInfo->gRandom, 12) == 0)
Packit 1f69a5
          goomInfo->update.zoomFilterData.vitesse = STOP_SPEED + 1;
Packit 1f69a5
Packit 1f69a5
        /* changement de milieu.. */
Packit 1f69a5
        switch (goom_irand (goomInfo->gRandom, 25)) {
Packit 1f69a5
          case 0:
Packit 1f69a5
          case 3:
Packit 1f69a5
          case 6:
Packit 1f69a5
            goomInfo->update.zoomFilterData.middleY =
Packit 1f69a5
                goomInfo->screen.height - 1;
Packit 1f69a5
            goomInfo->update.zoomFilterData.middleX =
Packit 1f69a5
                goomInfo->screen.width / 2;
Packit 1f69a5
            break;
Packit 1f69a5
          case 1:
Packit 1f69a5
          case 4:
Packit 1f69a5
            goomInfo->update.zoomFilterData.middleX =
Packit 1f69a5
                goomInfo->screen.width - 1;
Packit 1f69a5
            break;
Packit 1f69a5
          case 2:
Packit 1f69a5
          case 5:
Packit 1f69a5
            goomInfo->update.zoomFilterData.middleX = 1;
Packit 1f69a5
            break;
Packit 1f69a5
          default:
Packit 1f69a5
            goomInfo->update.zoomFilterData.middleY =
Packit 1f69a5
                goomInfo->screen.height / 2;
Packit 1f69a5
            goomInfo->update.zoomFilterData.middleX =
Packit 1f69a5
                goomInfo->screen.width / 2;
Packit 1f69a5
        }
Packit 1f69a5
Packit 1f69a5
        if ((goomInfo->update.zoomFilterData.mode == WATER_MODE)
Packit 1f69a5
            || (goomInfo->update.zoomFilterData.mode == YONLY_MODE)
Packit 1f69a5
            || (goomInfo->update.zoomFilterData.mode == AMULETTE_MODE)) {
Packit 1f69a5
          goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width / 2;
Packit 1f69a5
          goomInfo->update.zoomFilterData.middleY = goomInfo->screen.height / 2;
Packit 1f69a5
        }
Packit 1f69a5
Packit 1f69a5
        switch (vtmp = (goom_irand (goomInfo->gRandom, 15))) {
Packit 1f69a5
          case 0:
Packit 1f69a5
            goomInfo->update.zoomFilterData.vPlaneEffect =
Packit 1f69a5
                goom_irand (goomInfo->gRandom, 3)
Packit 1f69a5
                - goom_irand (goomInfo->gRandom, 3);
Packit 1f69a5
            goomInfo->update.zoomFilterData.hPlaneEffect =
Packit 1f69a5
                goom_irand (goomInfo->gRandom, 3)
Packit 1f69a5
                - goom_irand (goomInfo->gRandom, 3);
Packit 1f69a5
            break;
Packit 1f69a5
          case 3:
Packit 1f69a5
            goomInfo->update.zoomFilterData.vPlaneEffect = 0;
Packit 1f69a5
            goomInfo->update.zoomFilterData.hPlaneEffect =
Packit 1f69a5
                goom_irand (goomInfo->gRandom, 8)
Packit 1f69a5
                - goom_irand (goomInfo->gRandom, 8);
Packit 1f69a5
            break;
Packit 1f69a5
          case 4:
Packit 1f69a5
          case 5:
Packit 1f69a5
          case 6:
Packit 1f69a5
          case 7:
Packit 1f69a5
            goomInfo->update.zoomFilterData.vPlaneEffect =
Packit 1f69a5
                goom_irand (goomInfo->gRandom, 5)
Packit 1f69a5
                - goom_irand (goomInfo->gRandom, 5);
Packit 1f69a5
            goomInfo->update.zoomFilterData.hPlaneEffect =
Packit 1f69a5
                -goomInfo->update.zoomFilterData.vPlaneEffect;
Packit 1f69a5
            break;
Packit 1f69a5
          case 8:
Packit 1f69a5
            goomInfo->update.zoomFilterData.hPlaneEffect =
Packit 1f69a5
                5 + goom_irand (goomInfo->gRandom, 8);
Packit 1f69a5
            goomInfo->update.zoomFilterData.vPlaneEffect =
Packit 1f69a5
                -goomInfo->update.zoomFilterData.hPlaneEffect;
Packit 1f69a5
            break;
Packit 1f69a5
          case 9:
Packit 1f69a5
            goomInfo->update.zoomFilterData.vPlaneEffect =
Packit 1f69a5
                5 + goom_irand (goomInfo->gRandom, 8);
Packit 1f69a5
            goomInfo->update.zoomFilterData.hPlaneEffect =
Packit 1f69a5
                -goomInfo->update.zoomFilterData.hPlaneEffect;
Packit 1f69a5
            break;
Packit 1f69a5
          case 13:
Packit 1f69a5
            goomInfo->update.zoomFilterData.hPlaneEffect = 0;
Packit 1f69a5
            goomInfo->update.zoomFilterData.vPlaneEffect =
Packit 1f69a5
                goom_irand (goomInfo->gRandom, 10)
Packit 1f69a5
                - goom_irand (goomInfo->gRandom, 10);
Packit 1f69a5
            break;
Packit 1f69a5
          case 14:
Packit 1f69a5
            goomInfo->update.zoomFilterData.hPlaneEffect =
Packit 1f69a5
                goom_irand (goomInfo->gRandom, 10)
Packit 1f69a5
                - goom_irand (goomInfo->gRandom, 10);
Packit 1f69a5
            goomInfo->update.zoomFilterData.vPlaneEffect =
Packit 1f69a5
                goom_irand (goomInfo->gRandom, 10)
Packit 1f69a5
                - goom_irand (goomInfo->gRandom, 10);
Packit 1f69a5
            break;
Packit 1f69a5
          default:
Packit 1f69a5
            if (vtmp < 10) {
Packit 1f69a5
              goomInfo->update.zoomFilterData.vPlaneEffect = 0;
Packit 1f69a5
              goomInfo->update.zoomFilterData.hPlaneEffect = 0;
Packit 1f69a5
            }
Packit 1f69a5
        }
Packit 1f69a5
Packit 1f69a5
        if (goom_irand (goomInfo->gRandom, 5) != 0)
Packit 1f69a5
          goomInfo->update.zoomFilterData.noisify = 0;
Packit 1f69a5
        else {
Packit 1f69a5
          goomInfo->update.zoomFilterData.noisify =
Packit 1f69a5
              goom_irand (goomInfo->gRandom, 2) + 1;
Packit 1f69a5
          goomInfo->update.lockvar *= 2;
Packit 1f69a5
        }
Packit 1f69a5
Packit 1f69a5
        if (goomInfo->update.zoomFilterData.mode == AMULETTE_MODE) {
Packit 1f69a5
          goomInfo->update.zoomFilterData.vPlaneEffect = 0;
Packit 1f69a5
          goomInfo->update.zoomFilterData.hPlaneEffect = 0;
Packit 1f69a5
          goomInfo->update.zoomFilterData.noisify = 0;
Packit 1f69a5
        }
Packit 1f69a5
Packit 1f69a5
        if ((goomInfo->update.zoomFilterData.middleX == 1)
Packit 1f69a5
            || (goomInfo->update.zoomFilterData.middleX ==
Packit 1f69a5
                (signed int) goomInfo->screen.width - 1)) {
Packit 1f69a5
          goomInfo->update.zoomFilterData.vPlaneEffect = 0;
Packit 1f69a5
          if (goom_irand (goomInfo->gRandom, 2))
Packit 1f69a5
            goomInfo->update.zoomFilterData.hPlaneEffect = 0;
Packit 1f69a5
        }
Packit 1f69a5
Packit 1f69a5
        if ((signed int) newvit < goomInfo->update.zoomFilterData.vitesse) {    /* on accelere */
Packit 1f69a5
          pzfd = &goomInfo->update.zoomFilterData;
Packit 1f69a5
          if (((newvit < STOP_SPEED - 7) &&
Packit 1f69a5
                  (goomInfo->update.zoomFilterData.vitesse < STOP_SPEED - 6) &&
Packit 1f69a5
                  (goomInfo->cycle % 3 == 0))
Packit 1f69a5
              || (goom_irand (goomInfo->gRandom, 40) == 0)) {
Packit 1f69a5
            goomInfo->update.zoomFilterData.vitesse =
Packit 1f69a5
                STOP_SPEED - goom_irand (goomInfo->gRandom, 2)
Packit 1f69a5
                + goom_irand (goomInfo->gRandom, 2);
Packit 1f69a5
            goomInfo->update.zoomFilterData.reverse =
Packit 1f69a5
                !goomInfo->update.zoomFilterData.reverse;
Packit 1f69a5
          } else {
Packit 1f69a5
            goomInfo->update.zoomFilterData.vitesse =
Packit 1f69a5
                (newvit + goomInfo->update.zoomFilterData.vitesse * 7) / 8;
Packit 1f69a5
          }
Packit 1f69a5
          goomInfo->update.lockvar += 50;
Packit 1f69a5
        }
Packit 1f69a5
      }
Packit 1f69a5
Packit 1f69a5
      if (goomInfo->update.lockvar > 150) {
Packit 1f69a5
        goomInfo->update.switchIncr = goomInfo->update.switchIncrAmount;
Packit 1f69a5
        goomInfo->update.switchMult = 1.0f;
Packit 1f69a5
      }
Packit 1f69a5
    }
Packit 1f69a5
    /* mode mega-lent */
Packit 1f69a5
    if (goom_irand (goomInfo->gRandom, 700) == 0) {
Packit 1f69a5
      /* 
Packit 1f69a5
       * printf ("coup du sort...\n") ;
Packit 1f69a5
       */
Packit 1f69a5
      pzfd = &goomInfo->update.zoomFilterData;
Packit 1f69a5
      goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - 1;
Packit 1f69a5
      goomInfo->update.zoomFilterData.pertedec = 8;
Packit 1f69a5
      goomInfo->update.zoomFilterData.sqrtperte = 16;
Packit 1f69a5
      goomInfo->update.goomvar = 1;
Packit 1f69a5
      goomInfo->update.lockvar += 50;
Packit 1f69a5
      goomInfo->update.switchIncr = goomInfo->update.switchIncrAmount;
Packit 1f69a5
      goomInfo->update.switchMult = 1.0f;
Packit 1f69a5
    }
Packit 1f69a5
  }
Packit 1f69a5
Packit 1f69a5
  /*
Packit 1f69a5
   * gros frein si la musique est calme
Packit 1f69a5
   */
Packit 1f69a5
  if ((goomInfo->sound.speedvar < 0.01f)
Packit 1f69a5
      && (goomInfo->update.zoomFilterData.vitesse < STOP_SPEED - 4)
Packit 1f69a5
      && (goomInfo->cycle % 16 == 0)) {
Packit 1f69a5
    pzfd = &goomInfo->update.zoomFilterData;
Packit 1f69a5
    goomInfo->update.zoomFilterData.vitesse += 3;
Packit 1f69a5
    goomInfo->update.zoomFilterData.pertedec = 8;
Packit 1f69a5
    goomInfo->update.zoomFilterData.sqrtperte = 16;
Packit 1f69a5
    goomInfo->update.goomvar = 0;
Packit 1f69a5
  }
Packit 1f69a5
Packit 1f69a5
  /*
Packit 1f69a5
   * baisser regulierement la vitesse...
Packit 1f69a5
   */
Packit 1f69a5
  if ((goomInfo->cycle % 73 == 0)
Packit 1f69a5
      && (goomInfo->update.zoomFilterData.vitesse < STOP_SPEED - 5)) {
Packit 1f69a5
    pzfd = &goomInfo->update.zoomFilterData;
Packit 1f69a5
    goomInfo->update.zoomFilterData.vitesse++;
Packit 1f69a5
  }
Packit 1f69a5
Packit 1f69a5
  /*
Packit 1f69a5
   * arreter de decr�menter au bout d'un certain temps
Packit 1f69a5
   */
Packit 1f69a5
  if ((goomInfo->cycle % 101 == 0)
Packit 1f69a5
      && (goomInfo->update.zoomFilterData.pertedec == 7)) {
Packit 1f69a5
    pzfd = &goomInfo->update.zoomFilterData;
Packit 1f69a5
    goomInfo->update.zoomFilterData.pertedec = 8;
Packit 1f69a5
    goomInfo->update.zoomFilterData.sqrtperte = 16;
Packit 1f69a5
  }
Packit 1f69a5
Packit 1f69a5
  /*
Packit 1f69a5
   * Permet de forcer un effet.
Packit 1f69a5
   */
Packit 1f69a5
  if ((forceMode > 0) && (forceMode <= NB_FX)) {
Packit 1f69a5
    pzfd = &goomInfo->update.zoomFilterData;
Packit 1f69a5
    pzfd->mode = forceMode - 1;
Packit 1f69a5
  }
Packit 1f69a5
Packit 1f69a5
  if (forceMode == -1) {
Packit 1f69a5
    pzfd = NULL;
Packit 1f69a5
  }
Packit 1f69a5
Packit 1f69a5
  /*
Packit 1f69a5
   * Changement d'effet de zoom !
Packit 1f69a5
   */
Packit 1f69a5
  if (pzfd != NULL) {
Packit 1f69a5
    int dif;
Packit 1f69a5
Packit 1f69a5
    goomInfo->update.cyclesSinceLastChange = 0;
Packit 1f69a5
Packit 1f69a5
    goomInfo->update.switchIncr = goomInfo->update.switchIncrAmount;
Packit 1f69a5
Packit 1f69a5
    dif =
Packit 1f69a5
        goomInfo->update.zoomFilterData.vitesse -
Packit 1f69a5
        goomInfo->update.previousZoomSpeed;
Packit 1f69a5
    if (dif < 0)
Packit 1f69a5
      dif = -dif;
Packit 1f69a5
Packit 1f69a5
    if (dif > 2) {
Packit 1f69a5
      goomInfo->update.switchIncr *= (dif + 2) / 2;
Packit 1f69a5
    }
Packit 1f69a5
    goomInfo->update.previousZoomSpeed =
Packit 1f69a5
        goomInfo->update.zoomFilterData.vitesse;
Packit 1f69a5
    goomInfo->update.switchMult = 1.0f;
Packit 1f69a5
Packit 1f69a5
    if (((goomInfo->sound.timeSinceLastGoom == 0)
Packit 1f69a5
            && (goomInfo->sound.totalgoom < 2)) || (forceMode > 0)) {
Packit 1f69a5
      goomInfo->update.switchIncr = 0;
Packit 1f69a5
      goomInfo->update.switchMult = goomInfo->update.switchMultAmount;
Packit 1f69a5
    }
Packit 1f69a5
  } else {
Packit 1f69a5
    if (goomInfo->update.cyclesSinceLastChange > TIME_BTW_CHG) {
Packit 1f69a5
      pzfd = &goomInfo->update.zoomFilterData;
Packit 1f69a5
      goomInfo->update.cyclesSinceLastChange = 0;
Packit 1f69a5
    } else
Packit 1f69a5
      goomInfo->update.cyclesSinceLastChange++;
Packit 1f69a5
  }
Packit 1f69a5
Packit 1f69a5
#ifdef VERBOSE
Packit 1f69a5
  if (pzfd) {
Packit 1f69a5
    printf ("GOOM: pzfd->mode = %d\n", pzfd->mode);
Packit 1f69a5
  }
Packit 1f69a5
#endif
Packit 1f69a5
Packit 1f69a5
  /* Zoom here ! */
Packit 1f69a5
  zoomFilterFastRGB (goomInfo, goomInfo->p1, goomInfo->p2, pzfd,
Packit 1f69a5
      goomInfo->screen.width, goomInfo->screen.height,
Packit 1f69a5
      goomInfo->update.switchIncr, goomInfo->update.switchMult);
Packit 1f69a5
Packit 1f69a5
  /*
Packit 1f69a5
   * Affichage tentacule
Packit 1f69a5
   */
Packit 1f69a5
Packit 1f69a5
  goomInfo->tentacles_fx.apply (&goomInfo->tentacles_fx, goomInfo->p1,
Packit 1f69a5
      goomInfo->p2, goomInfo);
Packit 1f69a5
  goomInfo->star_fx.apply (&goomInfo->star_fx, goomInfo->p2, goomInfo->p1,
Packit 1f69a5
      goomInfo);
Packit 1f69a5
Packit 1f69a5
  /*
Packit 1f69a5
   * Gestion du Scope
Packit 1f69a5
   */
Packit 1f69a5
Packit 1f69a5
  /*
Packit 1f69a5
   * arret demande
Packit 1f69a5
   */
Packit 1f69a5
  if ((goomInfo->update.stop_lines & 0xf000)
Packit 1f69a5
      || (!goomInfo->curGState->drawScope)) {
Packit 1f69a5
    float param1 = 0, param2 = 0, amplitude;
Packit 1f69a5
    int couleur;
Packit 1f69a5
    int mode;
Packit 1f69a5
Packit 1f69a5
    choose_a_goom_line (goomInfo, &param1, &param2, &couleur, &mode, &amplitude,
Packit 1f69a5
        1);
Packit 1f69a5
    couleur = GML_BLACK;
Packit 1f69a5
Packit 1f69a5
    goom_lines_switch_to (goomInfo->gmline1, mode, param1, amplitude, couleur);
Packit 1f69a5
    goom_lines_switch_to (goomInfo->gmline2, mode, param2, amplitude, couleur);
Packit 1f69a5
    goomInfo->update.stop_lines &= 0x0fff;
Packit 1f69a5
  }
Packit 1f69a5
Packit 1f69a5
  /*
Packit 1f69a5
   * arret aleatore.. changement de mode de ligne..
Packit 1f69a5
   */
Packit 1f69a5
  if (goomInfo->update.lineMode != goomInfo->update.drawLinesDuration) {
Packit 1f69a5
    goomInfo->update.lineMode--;
Packit 1f69a5
    if (goomInfo->update.lineMode == -1)
Packit 1f69a5
      goomInfo->update.lineMode = 0;
Packit 1f69a5
  } else if ((goomInfo->cycle % 80 == 0)
Packit 1f69a5
      && (goom_irand (goomInfo->gRandom, 5) == 0) && goomInfo->update.lineMode)
Packit 1f69a5
    goomInfo->update.lineMode--;
Packit 1f69a5
Packit 1f69a5
  if ((goomInfo->cycle % 120 == 0)
Packit 1f69a5
      && (goom_irand (goomInfo->gRandom, 4) == 0)
Packit 1f69a5
      && (goomInfo->curGState->drawScope)) {
Packit 1f69a5
    if (goomInfo->update.lineMode == 0)
Packit 1f69a5
      goomInfo->update.lineMode = goomInfo->update.drawLinesDuration;
Packit 1f69a5
    else if (goomInfo->update.lineMode == goomInfo->update.drawLinesDuration) {
Packit 1f69a5
      float param1, param2, amplitude;
Packit 1f69a5
      int couleur1, couleur2;
Packit 1f69a5
      int mode;
Packit 1f69a5
Packit 1f69a5
      goomInfo->update.lineMode--;
Packit 1f69a5
      choose_a_goom_line (goomInfo, &param1, &param2, &couleur1,
Packit 1f69a5
          &mode, &amplitude, goomInfo->update.stop_lines);
Packit 1f69a5
Packit 1f69a5
      couleur2 = 5 - couleur1;
Packit 1f69a5
      if (goomInfo->update.stop_lines) {
Packit 1f69a5
        goomInfo->update.stop_lines--;
Packit 1f69a5
        if (goom_irand (goomInfo->gRandom, 2))
Packit 1f69a5
          couleur2 = couleur1 = GML_BLACK;
Packit 1f69a5
      }
Packit 1f69a5
Packit 1f69a5
      goom_lines_switch_to (goomInfo->gmline1, mode, param1, amplitude,
Packit 1f69a5
          couleur1);
Packit 1f69a5
      goom_lines_switch_to (goomInfo->gmline2, mode, param2, amplitude,
Packit 1f69a5
          couleur2);
Packit 1f69a5
    }
Packit 1f69a5
  }
Packit 1f69a5
Packit 1f69a5
  /*
Packit 1f69a5
   * si on est dans un goom : afficher les lignes...
Packit 1f69a5
   */
Packit 1f69a5
  if ((goomInfo->update.lineMode != 0)
Packit 1f69a5
      || (goomInfo->sound.timeSinceLastGoom < 5)) {
Packit 1f69a5
    goomInfo->gmline2->power = goomInfo->gmline1->power;
Packit 1f69a5
Packit 1f69a5
    goom_lines_draw (goomInfo, goomInfo->gmline1, data[0], goomInfo->p2);
Packit 1f69a5
    goom_lines_draw (goomInfo, goomInfo->gmline2, data[1], goomInfo->p2);
Packit 1f69a5
Packit 1f69a5
    if (((goomInfo->cycle % 121) == 9)
Packit 1f69a5
        && (goom_irand (goomInfo->gRandom, 3) == 1)
Packit 1f69a5
        && ((goomInfo->update.lineMode == 0)
Packit 1f69a5
            || (goomInfo->update.lineMode ==
Packit 1f69a5
                goomInfo->update.drawLinesDuration))) {
Packit 1f69a5
      float param1, param2, amplitude;
Packit 1f69a5
      int couleur1, couleur2;
Packit 1f69a5
      int mode;
Packit 1f69a5
Packit 1f69a5
      choose_a_goom_line (goomInfo, &param1, &param2, &couleur1,
Packit 1f69a5
          &mode, &amplitude, goomInfo->update.stop_lines);
Packit 1f69a5
      couleur2 = 5 - couleur1;
Packit 1f69a5
Packit 1f69a5
      if (goomInfo->update.stop_lines) {
Packit 1f69a5
        goomInfo->update.stop_lines--;
Packit 1f69a5
        if (goom_irand (goomInfo->gRandom, 2))
Packit 1f69a5
          couleur2 = couleur1 = GML_BLACK;
Packit 1f69a5
      }
Packit 1f69a5
      goom_lines_switch_to (goomInfo->gmline1, mode, param1, amplitude,
Packit 1f69a5
          couleur1);
Packit 1f69a5
      goom_lines_switch_to (goomInfo->gmline2, mode, param2, amplitude,
Packit 1f69a5
          couleur2);
Packit 1f69a5
    }
Packit 1f69a5
  }
Packit 1f69a5
Packit 1f69a5
  return_val = goomInfo->p1;
Packit 1f69a5
  tmp = goomInfo->p1;
Packit 1f69a5
  goomInfo->p1 = goomInfo->p2;
Packit 1f69a5
  goomInfo->p2 = tmp;
Packit 1f69a5
Packit 1f69a5
  /* affichage et swappage des buffers.. */
Packit 1f69a5
  goomInfo->cycle++;
Packit 1f69a5
Packit 1f69a5
  goomInfo->convolve_fx.apply (&goomInfo->convolve_fx, return_val,
Packit 1f69a5
      goomInfo->outputBuf, goomInfo);
Packit 1f69a5
Packit 1f69a5
  return (guint32 *) goomInfo->outputBuf;
Packit 1f69a5
}
Packit 1f69a5
Packit 1f69a5
/****************************************
Packit 1f69a5
*                CLOSE                 *
Packit 1f69a5
****************************************/
Packit 1f69a5
void
Packit 1f69a5
goom_close (PluginInfo * goomInfo)
Packit 1f69a5
{
Packit 1f69a5
  if (goomInfo->pixel != NULL)
Packit 1f69a5
    free (goomInfo->pixel);
Packit 1f69a5
  if (goomInfo->back != NULL)
Packit 1f69a5
    free (goomInfo->back);
Packit 1f69a5
  if (goomInfo->conv != NULL)
Packit 1f69a5
    free (goomInfo->conv);
Packit 1f69a5
Packit 1f69a5
  goomInfo->pixel = goomInfo->back = NULL;
Packit 1f69a5
  goomInfo->conv = NULL;
Packit 1f69a5
  goom_random_free (goomInfo->gRandom);
Packit 1f69a5
  goom_lines_free (&goomInfo->gmline1);
Packit 1f69a5
  goom_lines_free (&goomInfo->gmline2);
Packit 1f69a5
Packit 1f69a5
  /* release_ifs (); */
Packit 1f69a5
  goomInfo->ifs_fx.free (&goomInfo->ifs_fx);
Packit 1f69a5
  goomInfo->convolve_fx.free (&goomInfo->convolve_fx);
Packit 1f69a5
  goomInfo->star_fx.free (&goomInfo->star_fx);
Packit 1f69a5
  goomInfo->tentacles_fx.free (&goomInfo->tentacles_fx);
Packit 1f69a5
  goomInfo->zoomFilter_fx.free (&goomInfo->zoomFilter_fx);
Packit 1f69a5
Packit 1f69a5
  plugin_info_free (goomInfo);
Packit 1f69a5
  free (goomInfo);
Packit 1f69a5
}
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
/* *** */
Packit 1f69a5
void
Packit 1f69a5
choose_a_goom_line (PluginInfo * goomInfo, float *param1, float *param2,
Packit 1f69a5
    int *couleur, int *mode, float *amplitude, int far)
Packit 1f69a5
{
Packit 1f69a5
  *mode = goom_irand (goomInfo->gRandom, 3);
Packit 1f69a5
  *amplitude = 1.0f;
Packit 1f69a5
  switch (*mode) {
Packit 1f69a5
    case GML_CIRCLE:
Packit 1f69a5
      if (far) {
Packit 1f69a5
        *param1 = *param2 = 0.47f;
Packit 1f69a5
        *amplitude = 0.8f;
Packit 1f69a5
        break;
Packit 1f69a5
      }
Packit 1f69a5
      if (goom_irand (goomInfo->gRandom, 3) == 0) {
Packit 1f69a5
        *param1 = *param2 = 0;
Packit 1f69a5
        *amplitude = 3.0f;
Packit 1f69a5
      } else if (goom_irand (goomInfo->gRandom, 2)) {
Packit 1f69a5
        *param1 = 0.40f * goomInfo->screen.height;
Packit 1f69a5
        *param2 = 0.22f * goomInfo->screen.height;
Packit 1f69a5
      } else {
Packit 1f69a5
        *param1 = *param2 = goomInfo->screen.height * 0.35;
Packit 1f69a5
      }
Packit 1f69a5
      break;
Packit 1f69a5
    case GML_HLINE:
Packit 1f69a5
      if (goom_irand (goomInfo->gRandom, 4) || far) {
Packit 1f69a5
        *param1 = goomInfo->screen.height / 7;
Packit 1f69a5
        *param2 = 6.0f * goomInfo->screen.height / 7.0f;
Packit 1f69a5
      } else {
Packit 1f69a5
        *param1 = *param2 = goomInfo->screen.height / 2.0f;
Packit 1f69a5
        *amplitude = 2.0f;
Packit 1f69a5
      }
Packit 1f69a5
      break;
Packit 1f69a5
    case GML_VLINE:
Packit 1f69a5
      if (goom_irand (goomInfo->gRandom, 3) || far) {
Packit 1f69a5
        *param1 = goomInfo->screen.width / 7.0f;
Packit 1f69a5
        *param2 = 6.0f * goomInfo->screen.width / 7.0f;
Packit 1f69a5
      } else {
Packit 1f69a5
        *param1 = *param2 = goomInfo->screen.width / 2.0f;
Packit 1f69a5
        *amplitude = 1.5f;
Packit 1f69a5
      }
Packit 1f69a5
      break;
Packit 1f69a5
    default:
Packit 1f69a5
      *param1 = *param2 = 0;
Packit 1f69a5
      break;
Packit 1f69a5
  }
Packit 1f69a5
Packit 1f69a5
  *couleur = goom_irand (goomInfo->gRandom, 6);
Packit 1f69a5
}