diff options
author | Jan Schmidt <thaytan@mad.scientist.com> | 2006-02-05 20:43:49 +0000 |
---|---|---|
committer | Jan Schmidt <thaytan@mad.scientist.com> | 2006-02-05 20:43:49 +0000 |
commit | 07c1dceae064b547747a1513ca17225c1c1c3e0e (patch) | |
tree | eedb8d00eade1f2fa88e9d4d481e953eca950b11 /gst/goom/goom_core.c | |
parent | 4b5490014fb102cf65481d76222130d885eecebd (diff) |
gst/goom/: Make goom reentrant by moving all important static variables into instance structures.
Original commit message from CVS:
* gst/goom/filters.c: (zoomFilterNew), (calculatePXandPY),
(setPixelRGB), (setPixelRGB_), (getPixelRGB), (getPixelRGB_),
(zoomFilterSetResolution), (zoomFilterDestroy),
(zoomFilterFastRGB), (pointFilter):
* gst/goom/filters.h:
* gst/goom/goom_core.c: (goom_init), (goom_set_resolution),
(goom_update), (goom_close):
* gst/goom/goom_core.h:
* gst/goom/goom_tools.h:
* gst/goom/graphic.c:
* gst/goom/gstgoom.c: (gst_goom_class_init), (gst_goom_init),
(gst_goom_dispose), (gst_goom_src_setcaps), (gst_goom_chain):
* gst/goom/gstgoom.h:
* gst/goom/lines.c: (goom_lines):
* gst/goom/lines.h:
Make goom reentrant by moving all important static variables
into instance structures.
(Fixes #329181)
Diffstat (limited to 'gst/goom/goom_core.c')
-rw-r--r-- | gst/goom/goom_core.c | 408 |
1 files changed, 204 insertions, 204 deletions
diff --git a/gst/goom/goom_core.c b/gst/goom/goom_core.c index 644ff0a6..1734a316 100644 --- a/gst/goom/goom_core.c +++ b/gst/goom/goom_core.c @@ -1,3 +1,8 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include <glib.h> + #include <stdlib.h> #include <string.h> #include "goom_core.h" @@ -13,67 +18,69 @@ #define STOP_SPEED 128 - -/**-----------------------------------------------------** - ** SHARED DATA ** - **-----------------------------------------------------**/ -static guint32 *pixel; -static guint32 *back; -static guint32 *p1, *p2, *tmp; -static guint32 cycle; - -guint32 resolx, resoly, buffsize; - void -goom_init (guint32 resx, guint32 resy) +goom_init (GoomData * goomdata, guint32 resx, guint32 resy) { #ifdef VERBOSE printf ("GOOM: init (%d, %d);\n", resx, resy); #endif - resolx = resx; - resoly = resy; - buffsize = resx * resy; - - pixel = (guint32 *) malloc (buffsize * sizeof (guint32) + 128); - back = (guint32 *) malloc (buffsize * sizeof (guint32) + 128); - RAND_INIT (GPOINTER_TO_INT (pixel)); - cycle = 0; - - p1 = (void *) (((unsigned long) pixel + 0x7f) & (~0x7f)); - p2 = (void *) (((unsigned long) back + 0x7f) & (~0x7f)); + goomdata->resolx = 0; + goomdata->resoly = 0; + goomdata->buffsize = 0; + + goomdata->pixel = NULL; + goomdata->back = NULL; + goomdata->p1 = NULL; + goomdata->p2 = NULL; + + goom_set_resolution (goomdata, resx, resy); + RAND_INIT (goomdata, GPOINTER_TO_INT (goomdata->pixel)); + goomdata->cycle = 0; + + + goomdata->goomlimit = 2; /* sensibilité du goom */ + goomdata->zfd = zoomFilterNew (); + goomdata->lockvar = 0; /* pour empecher de nouveaux changements */ + goomdata->goomvar = 0; /* boucle des gooms */ + goomdata->totalgoom = 0; /* nombre de gooms par seconds */ + goomdata->agoom = 0; /* un goom a eu lieu.. */ + goomdata->loopvar = 0; /* mouvement des points */ + goomdata->speedvar = 0; /* vitesse des particules */ + goomdata->lineMode = 0; /* l'effet lineaire a dessiner */ } - void -goom_set_resolution (guint32 resx, guint32 resy) +goom_set_resolution (GoomData * goomdata, guint32 resx, guint32 resy) { - free (pixel); - free (back); - - resolx = resx; - resoly = resy; - buffsize = resx * resy; + guint32 buffsize = resx * resy; + + if ((goomdata->resolx == resx) && (goomdata->resoly == resy)) + return; + + if (goomdata->buffsize < buffsize) { + if (goomdata->pixel) + free (goomdata->pixel); + if (goomdata->back) + free (goomdata->back); + goomdata->pixel = (guint32 *) malloc (buffsize * sizeof (guint32) + 128); + goomdata->back = (guint32 *) malloc (buffsize * sizeof (guint32) + 128); + goomdata->buffsize = buffsize; + + goomdata->p1 = + (void *) (((unsigned long) goomdata->pixel + 0x7f) & (~0x7f)); + goomdata->p2 = (void *) (((unsigned long) goomdata->back + 0x7f) & (~0x7f)); + } - pixel = (guint32 *) malloc (buffsize * sizeof (guint32) + 128); - memset (pixel, 0, buffsize * sizeof (guint32) + 128); - back = (guint32 *) malloc (buffsize * sizeof (guint32) + 128); - memset (back, 0, buffsize * sizeof (guint32) + 128); + goomdata->resolx = resx; + goomdata->resoly = resy; - p1 = (void *) (((unsigned long) pixel + 0x7f) & (~0x7f)); - p2 = (void *) (((unsigned long) back + 0x7f) & (~0x7f)); + memset (goomdata->pixel, 0, buffsize * sizeof (guint32) + 128); + memset (goomdata->back, 0, buffsize * sizeof (guint32) + 128); } - guint32 * -goom_update (gint16 data[2][512]) +goom_update (GoomData * goomdata, gint16 data[2][512]) { - static int lockvar = 0; /* pour empecher de nouveaux changements */ - static int goomvar = 0; /* boucle des gooms */ - static int totalgoom = 0; /* nombre de gooms par seconds */ - static int agoom = 0; /* un goom a eu lieu.. */ - static int loopvar = 0; /* mouvement des points */ - static int speedvar = 0; /* vitesse des particules */ - static int lineMode = 0; /* l'effet lineaire a dessiner */ guint32 *return_val; guint32 pointWidth; guint32 pointHeight; @@ -81,16 +88,14 @@ goom_update (gint16 data[2][512]) int accelvar; /* acceleration des particules */ int i; float largfactor; /* elargissement de l'intervalle d'évolution des points */ - static char goomlimit = 2; /* sensibilité du goom */ - static ZoomFilterData zfd = { - 128, 8, 16, - 1, 1, 0, WAVE_MODE, - 0, 0, 0 - }; - - ZoomFilterData *pzfd; + int zfd_update = 0; + int resolx = goomdata->resolx; + int resoly = goomdata->resoly; + ZoomFilterData *pzfd = goomdata->zfd; + guint32 *tmp; /* test if the config has changed, update it if so */ + pointWidth = (resolx * 2) / 5; pointHeight = (resoly * 2) / 5; @@ -102,308 +107,303 @@ goom_update (gint16 data[2][512]) } accelvar = incvar / 5000; - if (speedvar > 5) { + if (goomdata->speedvar > 5) { accelvar--; - if (speedvar > 20) + if (goomdata->speedvar > 20) accelvar--; - if (speedvar > 40) - speedvar = 40; + if (goomdata->speedvar > 40) + goomdata->speedvar = 40; } accelvar--; - speedvar += accelvar; + goomdata->speedvar += accelvar; - if (speedvar < 0) - speedvar = 0; - if (speedvar > 40) - speedvar = 40; + if (goomdata->speedvar < 0) + goomdata->speedvar = 0; + if (goomdata->speedvar > 40) + goomdata->speedvar = 40; /* ! calcul du deplacement des petits points ... */ - largfactor = ((float) speedvar / 40.0f + (float) incvar / 50000.0f) / 1.5f; + largfactor = + ((float) goomdata->speedvar / 40.0f + (float) incvar / 50000.0f) / 1.5f; if (largfactor > 1.5f) largfactor = 1.5f; - for (i = 1; i * 15 <= speedvar + 15; i++) { - loopvar += speedvar + 1; + for (i = 1; i * 15 <= goomdata->speedvar + 15; i++) { + goomdata->loopvar += goomdata->speedvar + 1; - pointFilter (p1, + pointFilter (goomdata, YELLOW, ((pointWidth - 6.0f) * largfactor + 5.0f), ((pointHeight - 6.0f) * largfactor + 5.0f), - i * 152.0f, 128.0f, loopvar + i * 2032); - pointFilter (p1, ORANGE, + i * 152.0f, 128.0f, goomdata->loopvar + i * 2032); + pointFilter (goomdata, ORANGE, ((pointWidth / 2) * largfactor) / i + 10.0f * i, ((pointHeight / 2) * largfactor) / i + 10.0f * i, - 96.0f, i * 80.0f, loopvar / i); - pointFilter (p1, VIOLET, + 96.0f, i * 80.0f, goomdata->loopvar / i); + pointFilter (goomdata, VIOLET, ((pointHeight / 3 + 5.0f) * largfactor) / i + 10.0f * i, ((pointHeight / 3 + 5.0f) * largfactor) / i + 10.0f * i, - i + 122.0f, 134.0f, loopvar / i); - pointFilter (p1, BLACK, + i + 122.0f, 134.0f, goomdata->loopvar / i); + pointFilter (goomdata, BLACK, ((pointHeight / 3) * largfactor + 20.0f), ((pointHeight / 3) * largfactor + 20.0f), - 58.0f, i * 66.0f, loopvar / i); - pointFilter (p1, WHITE, + 58.0f, i * 66.0f, goomdata->loopvar / i); + pointFilter (goomdata, WHITE, (pointHeight * largfactor + 10.0f * i) / i, (pointHeight * largfactor + 10.0f * i) / i, - 66.0f, 74.0f, loopvar + i * 500); + 66.0f, 74.0f, goomdata->loopvar + i * 500); } - /* par défaut pas de changement de zoom */ - pzfd = NULL; - /* diminuer de 1 le temps de lockage */ /* note pour ceux qui n'ont pas suivis : le lockvar permet d'empecher un */ /* changement d'etat du plugins juste apres un autre changement d'etat. oki ? */ - if (--lockvar < 0) - lockvar = 0; + if (--goomdata->lockvar < 0) + goomdata->lockvar = 0; /* temps du goom */ - if (--agoom < 0) - agoom = 0; + if (--goomdata->agoom < 0) + goomdata->agoom = 0; /* on verifie qu'il ne se pas un truc interressant avec le son. */ - if ((accelvar > goomlimit) || (accelvar < -goomlimit)) { + if ((accelvar > goomdata->goomlimit) || (accelvar < -goomdata->goomlimit)) { /* UN GOOM !!! YAHOO ! */ - totalgoom++; - agoom = 20; /* mais pdt 20 cycles, il n'y en aura plus. */ - lineMode = (lineMode + 1) % 20; /* Tous les 10 gooms on change de mode lineaire */ + goomdata->totalgoom++; + goomdata->agoom = 20; /* mais pdt 20 cycles, il n'y en aura plus. */ + goomdata->lineMode = (goomdata->lineMode + 1) % 20; /* Tous les 10 gooms on change de mode lineaire */ /* changement eventuel de mode */ - switch (iRAND (10)) { + switch (iRAND (goomdata, 10)) { case 0: case 1: case 2: - zfd.mode = WAVE_MODE; - zfd.vitesse = STOP_SPEED - 1; - zfd.reverse = 0; + pzfd->mode = WAVE_MODE; + pzfd->vitesse = STOP_SPEED - 1; + pzfd->reverse = 0; break; case 3: case 4: - zfd.mode = CRYSTAL_BALL_MODE; + pzfd->mode = CRYSTAL_BALL_MODE; break; case 5: - zfd.mode = AMULETTE_MODE; + pzfd->mode = AMULETTE_MODE; break; case 6: - zfd.mode = WATER_MODE; + pzfd->mode = WATER_MODE; break; case 7: - zfd.mode = SCRUNCH_MODE; + pzfd->mode = SCRUNCH_MODE; break; default: - zfd.mode = NORMAL_MODE; + pzfd->mode = NORMAL_MODE; } } /* tout ceci ne sera fait qu'en cas de non-blocage */ - if (lockvar == 0) { + if (goomdata->lockvar == 0) { /* reperage de goom (acceleration forte de l'acceleration du volume) */ /* -> coup de boost de la vitesse si besoin.. */ - if ((accelvar > goomlimit) || (accelvar < -goomlimit)) { - goomvar++; + if ((accelvar > goomdata->goomlimit) || (accelvar < -goomdata->goomlimit)) { + goomdata->goomvar++; /*if (goomvar % 1 == 0) */ { guint32 vtmp; guint32 newvit; - newvit = STOP_SPEED - speedvar / 2; + newvit = STOP_SPEED - goomdata->speedvar / 2; /* retablir le zoom avant.. */ - if ((zfd.reverse) && (!(cycle % 12)) && (rand () % 3 == 0)) { - zfd.reverse = 0; - zfd.vitesse = STOP_SPEED - 2; - lockvar = 50; + if ((pzfd->reverse) && (!(goomdata->cycle % 12)) && (rand () % 3 == 0)) { + pzfd->reverse = 0; + pzfd->vitesse = STOP_SPEED - 2; + goomdata->lockvar = 50; } - if (iRAND (10) == 0) { - zfd.reverse = 1; - lockvar = 100; + if (iRAND (goomdata, 10) == 0) { + pzfd->reverse = 1; + goomdata->lockvar = 100; } /* changement de milieu.. */ - switch (iRAND (20)) { + switch (iRAND (goomdata, 20)) { case 0: - zfd.middleY = resoly - 1; - zfd.middleX = resolx / 2; + pzfd->middleY = resoly - 1; + pzfd->middleX = resolx / 2; break; case 1: - zfd.middleX = resolx - 1; + pzfd->middleX = resolx - 1; break; case 2: - zfd.middleX = 1; + pzfd->middleX = 1; break; default: - zfd.middleY = resoly / 2; - zfd.middleX = resolx / 2; + pzfd->middleY = resoly / 2; + pzfd->middleX = resolx / 2; } - if (zfd.mode == WATER_MODE) { - zfd.middleX = resolx / 2; - zfd.middleY = resoly / 2; + if (pzfd->mode == WATER_MODE) { + pzfd->middleX = resolx / 2; + pzfd->middleY = resoly / 2; } - switch (vtmp = (iRAND (27))) { + switch (vtmp = (iRAND (goomdata, 27))) { case 0: - zfd.vPlaneEffect = iRAND (3); - zfd.vPlaneEffect -= iRAND (3); - zfd.hPlaneEffect = iRAND (3); - zfd.hPlaneEffect -= iRAND (3); + pzfd->vPlaneEffect = iRAND (goomdata, 3); + pzfd->vPlaneEffect -= iRAND (goomdata, 3); + pzfd->hPlaneEffect = iRAND (goomdata, 3); + pzfd->hPlaneEffect -= iRAND (goomdata, 3); break; case 3: - zfd.vPlaneEffect = 0; - zfd.hPlaneEffect = iRAND (8); - zfd.hPlaneEffect -= iRAND (8); + pzfd->vPlaneEffect = 0; + pzfd->hPlaneEffect = iRAND (goomdata, 8); + pzfd->hPlaneEffect -= iRAND (goomdata, 8); break; case 4: case 5: case 6: case 7: - zfd.vPlaneEffect = iRAND (5); - zfd.vPlaneEffect -= iRAND (5); - zfd.hPlaneEffect = -zfd.vPlaneEffect; + pzfd->vPlaneEffect = iRAND (goomdata, 5); + pzfd->vPlaneEffect -= iRAND (goomdata, 5); + pzfd->hPlaneEffect = -pzfd->vPlaneEffect; break; case 8: - zfd.hPlaneEffect = 5 + iRAND (8); - zfd.vPlaneEffect = -zfd.hPlaneEffect; + pzfd->hPlaneEffect = 5 + iRAND (goomdata, 8); + pzfd->vPlaneEffect = -pzfd->hPlaneEffect; break; case 9: - zfd.vPlaneEffect = 5 + iRAND (8); - zfd.hPlaneEffect = -zfd.hPlaneEffect; + pzfd->vPlaneEffect = 5 + iRAND (goomdata, 8); + pzfd->hPlaneEffect = -pzfd->hPlaneEffect; break; case 13: - zfd.hPlaneEffect = 0; - zfd.vPlaneEffect = iRAND (10); - zfd.vPlaneEffect -= iRAND (10); + pzfd->hPlaneEffect = 0; + pzfd->vPlaneEffect = iRAND (goomdata, 10); + pzfd->vPlaneEffect -= iRAND (goomdata, 10); break; default: if (vtmp < 10) { - zfd.vPlaneEffect = 0; - zfd.hPlaneEffect = 0; + pzfd->vPlaneEffect = 0; + pzfd->hPlaneEffect = 0; } } - if (iRAND (3) != 0) - zfd.noisify = 0; + if (iRAND (goomdata, 3) != 0) + pzfd->noisify = 0; else { - zfd.noisify = iRAND (3) + 2; - lockvar *= 3; + pzfd->noisify = iRAND (goomdata, 3) + 2; + goomdata->lockvar *= 3; } - if (zfd.mode == AMULETTE_MODE) { - zfd.vPlaneEffect = 0; - zfd.hPlaneEffect = 0; - zfd.noisify = 0; + if (pzfd->mode == AMULETTE_MODE) { + pzfd->vPlaneEffect = 0; + pzfd->hPlaneEffect = 0; + pzfd->noisify = 0; } - if ((zfd.middleX == 1) || (zfd.middleX == resolx - 1)) { - zfd.vPlaneEffect = 0; - zfd.hPlaneEffect = iRAND (2) ? 0 : zfd.hPlaneEffect; + if ((pzfd->middleX == 1) || (pzfd->middleX == resolx - 1)) { + pzfd->vPlaneEffect = 0; + pzfd->hPlaneEffect = iRAND (goomdata, 2) ? 0 : pzfd->hPlaneEffect; } - if (newvit < zfd.vitesse) { /* on accelere */ - pzfd = &zfd; + if (newvit < pzfd->vitesse) { /* on accelere */ + zfd_update = 1; if (((newvit < STOP_SPEED - 7) && - (zfd.vitesse < STOP_SPEED - 6) && - (cycle % 3 == 0)) || (iRAND (40) == 0)) { - zfd.vitesse = STOP_SPEED - 1; - zfd.reverse = !zfd.reverse; + (pzfd->vitesse < STOP_SPEED - 6) && + (goomdata->cycle % 3 == 0)) || (iRAND (goomdata, 40) == 0)) { + pzfd->vitesse = STOP_SPEED - 1; + pzfd->reverse = !pzfd->reverse; } else { - zfd.vitesse = (newvit + zfd.vitesse * 4) / 5; + pzfd->vitesse = (newvit + pzfd->vitesse * 4) / 5; } - lockvar += 50; + goomdata->lockvar += 50; } } } /* mode mega-lent */ - if (iRAND (1000) == 0) { + if (iRAND (goomdata, 1000) == 0) { /* printf ("coup du sort...\n") ; */ - pzfd = &zfd; - zfd.vitesse = STOP_SPEED - 1; - zfd.pertedec = 8; - zfd.sqrtperte = 16; - goomvar = 1; - lockvar += 70; + zfd_update = 1; + pzfd->vitesse = STOP_SPEED - 1; + pzfd->pertedec = 8; + pzfd->sqrtperte = 16; + goomdata->goomvar = 1; + goomdata->lockvar += 70; } } /* gros frein si la musique est calme */ - if ((speedvar < 1) && (zfd.vitesse < STOP_SPEED - 4) && (cycle % 16 == 0)) { + if ((goomdata->speedvar < 1) && (pzfd->vitesse < STOP_SPEED - 4) + && (goomdata->cycle % 16 == 0)) { /* printf ("++slow part... %i\n", zfd.vitesse) ; */ - pzfd = &zfd; - zfd.vitesse += 3; - zfd.pertedec = 8; - zfd.sqrtperte = 16; - goomvar = 0; + zfd_update = 1; + pzfd->vitesse += 3; + pzfd->pertedec = 8; + pzfd->sqrtperte = 16; + goomdata->goomvar = 0; /* printf ("--slow part... %i\n", zfd.vitesse) ; */ } /* baisser regulierement la vitesse... */ - if ((cycle % 73 == 0) && (zfd.vitesse < STOP_SPEED - 5)) { + if ((goomdata->cycle % 73 == 0) && (pzfd->vitesse < STOP_SPEED - 5)) { /* printf ("slow down...\n") ; */ - pzfd = &zfd; - zfd.vitesse++; + zfd_update = 1; + pzfd->vitesse++; } /* arreter de decrémenter au bout d'un certain temps */ - if ((cycle % 101 == 0) && (zfd.pertedec == 7)) { - pzfd = &zfd; - zfd.pertedec = 8; - zfd.sqrtperte = 16; - } -#ifdef VERBOSE - if (pzfd) { - printf ("GOOM: pzfd->mode = %d\n", pzfd->mode); + if ((goomdata->cycle % 101 == 0) && (pzfd->pertedec == 7)) { + zfd_update = 1; + pzfd->pertedec = 8; + pzfd->sqrtperte = 16; } -#endif /* Zoom here ! */ - zoomFilterFastRGB (p1, p2, pzfd, resolx, resoly); + zoomFilterFastRGB (goomdata, pzfd, zfd_update); /* si on est dans un goom : afficher les lignes... */ - if (agoom > 15) + if (goomdata->agoom > 15) goom_lines - (data, ((zfd.middleX == resolx / 2) && (zfd.middleY == resoly / 2) - && (zfd.mode != WATER_MODE)) - ? (lineMode / 10) : 0, p2, agoom - 15); + (goomdata, data, ((pzfd->middleX == resolx / 2) + && (pzfd->middleY == resoly / 2) + && (pzfd->mode != WATER_MODE)) + ? (goomdata->lineMode / 10) : 0, goomdata->p2, goomdata->agoom - 15); - return_val = p2; - tmp = p1; - p1 = p2; - p2 = tmp; + return_val = goomdata->p2; + tmp = goomdata->p1; + goomdata->p1 = goomdata->p2; + goomdata->p2 = tmp; /* affichage et swappage des buffers.. */ - cycle++; + goomdata->cycle++; /* tous les 100 cycles : vérifier si le taux de goom est correct */ /* et le modifier sinon.. */ - if (!(cycle % 100)) { - if (totalgoom > 15) { + if (!(goomdata->cycle % 100)) { + if (goomdata->totalgoom > 15) { /* printf ("less gooms\n") ; */ - goomlimit++; + goomdata->goomlimit++; } else { - if ((totalgoom == 0) && (goomlimit > 1)) - goomlimit--; + if ((goomdata->totalgoom == 0) && (goomdata->goomlimit > 1)) + goomdata->goomlimit--; } - totalgoom = 0; + goomdata->totalgoom = 0; } return return_val; } void -goom_close () +goom_close (GoomData * goomdata) { - if (pixel != NULL) - free (pixel); - if (back != NULL) - free (back); - pixel = back = NULL; - RAND_CLOSE (); + if (goomdata->pixel != NULL) + free (goomdata->pixel); + if (goomdata->back != NULL) + free (goomdata->back); + goomdata->pixel = goomdata->back = NULL; + RAND_CLOSE (goomdata); } |