diff options
Diffstat (limited to 'src/visualizations/Goom/goom.patch')
-rw-r--r-- | src/visualizations/Goom/goom.patch | 26454 |
1 files changed, 26454 insertions, 0 deletions
diff --git a/src/visualizations/Goom/goom.patch b/src/visualizations/Goom/goom.patch new file mode 100644 index 0000000000..78a07d11c2 --- /dev/null +++ b/src/visualizations/Goom/goom.patch @@ -0,0 +1,26454 @@ +diff -Naur /home/d4rk/goom2k4-0/src/config_param.c /src/config_param.c +--- /home/d4rk/goom2k4-0/src/config_param.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/config_param.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,110 +0,0 @@ +-/*---------------------------------------------------------------------------*/ +-/* +-** config_param.c +-** Goom Project +-** +-** Created by Jean-Christophe Hoelt on Sat Jul 19 2003 +-** Copyright (c) 2003 iOS. All rights reserved. +-*/ +-/*---------------------------------------------------------------------------*/ +- +-#include "goom_config_param.h" +-#include <string.h> +- +-/* TODO: Ajouter goom_ devant ces fonctions */ +- +-static void empty_fct(PluginParam *dummy) { +-} +- +-PluginParam goom_secure_param() { +- PluginParam p; +- p.changed = empty_fct; +- p.change_listener = empty_fct; +- p.user_data = 0; +- p.name = p.desc = 0; +- p.rw = 1; +- return p; +-} +- +-PluginParam goom_secure_f_param(char *name) { +- PluginParam p = secure_param(); +- p.name = name; +- p.type = PARAM_FLOATVAL; +- FVAL(p) = 0.5f; +- FMIN(p) = 0.0f; +- FMAX(p) = 1.0f; +- FSTEP(p) = 0.01f; +- return p; +-} +- +-PluginParam goom_secure_f_feedback(char *name) { +- PluginParam p = secure_f_param(name); +- p.rw = 0; +- return p; +-} +- +-PluginParam goom_secure_s_param(char *name) { +- PluginParam p = secure_param(); +- p.name = name; +- p.type = PARAM_STRVAL; +- SVAL(p) = 0; +- return p; +-} +- +-PluginParam goom_secure_b_param(char *name, int value) { +- PluginParam p = secure_param(); +- p.name = name; +- p.type = PARAM_BOOLVAL; +- BVAL(p) = value; +- return p; +-} +- +-PluginParam goom_secure_i_param(char *name) { +- PluginParam p = secure_param(); +- p.name = name; +- p.type = PARAM_INTVAL; +- IVAL(p) = 50; +- IMIN(p) = 0; +- IMAX(p) = 100; +- ISTEP(p) = 1; +- return p; +-} +- +-PluginParam goom_secure_i_feedback(char *name) { +- PluginParam p = secure_i_param(name); +- p.rw = 0; +- return p; +-} +- +-PluginParameters goom_plugin_parameters(const char *name, int nb) { +- PluginParameters p; +- p.name = (char *)name; +- p.desc = ""; +- p.nbParams = nb; +- p.params = (PluginParam**)malloc(nb*sizeof(PluginParam*)); +- return p; +-} +- +-/*---------------------------------------------------------------------------*/ +- +-void goom_set_str_param_value(PluginParam *p, const char *str) { +- int len = strlen(str); +- if (SVAL(*p)) +- SVAL(*p) = (char*)realloc(SVAL(*p), len+1); +- else +- SVAL(*p) = (char*)malloc(len+1); +- memcpy(SVAL(*p), str, len+1); +-} +- +-void goom_set_list_param_value(PluginParam *p, const char *str) { +- int len = strlen(str); +-#ifdef VERBOSE +- printf("%s: %d\n", str, len); +-#endif +- if (LVAL(*p)) +- LVAL(*p) = (char*)realloc(LVAL(*p), len+1); +- else +- LVAL(*p) = (char*)malloc(len+1); +- memcpy(LVAL(*p), str, len+1); +-} +- +diff -Naur /home/d4rk/goom2k4-0/src/convolve_fx.c /src/convolve_fx.c +--- /home/d4rk/goom2k4-0/src/convolve_fx.c 2005-02-07 06:46:42.000000000 -0700 ++++ /src/convolve_fx.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,335 +0,0 @@ +-#include "goom_fx.h" +-#include "goom_plugin_info.h" +-#include "goomsl.h" +-#include "goom_config.h" +-#include <math.h> +-#include <stdio.h> +-#include <stdlib.h> +-#include <string.h> +- +-//#define CONV_MOTIF_W 32 +-//#define CONV_MOTIF_WMASK 0x1f +- +-#define CONV_MOTIF_W 128 +-#define CONV_MOTIF_WMASK 0x7f +- +-typedef char Motif[CONV_MOTIF_W][CONV_MOTIF_W]; +- +-#include "motif_goom1.h" +-#include "motif_goom2.h" +- +-#define NB_THETA 512 +- +-#define MAX 2.0f +- +-typedef struct _CONV_DATA{ +- PluginParam light; +- PluginParam factor_adj_p; +- PluginParam factor_p; +- PluginParameters params; +- +- GoomSL *script; +- +- /* rotozoom */ +- int theta; +- float ftheta; +- int h_sin[NB_THETA]; +- int h_cos[NB_THETA]; +- int h_height; +- float visibility; +- Motif conv_motif; +- int inverse_motif; +- +-} ConvData; +- +-/* init rotozoom tables */ +-static void compute_tables(VisualFX *_this, PluginInfo *info) +-{ +- ConvData *data = (ConvData*)_this->fx_data; +- double screen_coef; +- int i; +- double h; +- double radian; +- +- if (data->h_height == info->screen.height) return; +- +- screen_coef = 2.0 * 300.0 / (double)info->screen.height; +- data->h_height = info->screen.height; +- +- for ( i=0 ; i<NB_THETA ; i++ ) { +- radian = 2*i*M_PI/NB_THETA; +- h = (0.2 + cos (radian) / 15.0 * sin(radian * 2.0 + 12.123)) * screen_coef; +- data->h_cos[i] = 0x10000 * (-h * cos (radian) * cos(radian)); +- data->h_sin[i] = 0x10000 * (h * sin (radian + 1.57) * sin(radian)); +- } +-} +- +-static void set_motif(ConvData *data, Motif motif) +-{ +- int i,j; +- for (i=0;i<CONV_MOTIF_W;++i) for (j=0;j<CONV_MOTIF_W;++j) +- data->conv_motif[i][j] = motif[CONV_MOTIF_W-i-1][CONV_MOTIF_W-j-1]; +-} +- +-static void convolve_init(VisualFX *_this, PluginInfo *info) { +- ConvData *data; +- data = (ConvData*)malloc(sizeof(ConvData)); +- _this->fx_data = (void*)data; +- +- data->light = secure_f_param("Screen Brightness"); +- data->light.param.fval.max = 300.0f; +- data->light.param.fval.step = 1.0f; +- data->light.param.fval.value = 100.0f; +- +- data->factor_adj_p = secure_f_param("Flash Intensity"); +- data->factor_adj_p.param.fval.max = 200.0f; +- data->factor_adj_p.param.fval.step = 1.0f; +- data->factor_adj_p.param.fval.value = 70.0f; +- +- data->factor_p = secure_f_feedback("Factor"); +- +- data->params = plugin_parameters ("Bright Flash", 5); +- data->params.params[0] = &data->light; +- data->params.params[1] = &data->factor_adj_p; +- data->params.params[2] = 0; +- data->params.params[3] = &data->factor_p; +- data->params.params[4] = 0; +- +- /* init rotozoom tables */ +- compute_tables(_this, info); +- data->theta = 0; +- data->ftheta = 0.0; +- data->visibility = 1.0; +- set_motif(data, CONV_MOTIF2); +- data->inverse_motif = 0; +- +- _this->params = &data->params; +-} +- +-static void convolve_free(VisualFX *_this) { +- free (_this->fx_data); +-} +- +-static void create_output_with_brightness(VisualFX *_this, Pixel *src, Pixel *dest, +- PluginInfo *info, int iff) +-{ +- ConvData *data = (ConvData*)_this->fx_data; +- +- int x,y; +- int i = 0;//info->screen.height * info->screen.width - 1; +- +- const int c = data->h_cos [data->theta]; +- const int s = data->h_sin [data->theta]; +- +- const int xi = -(info->screen.width/2) * c; +- const int yi = (info->screen.width/2) * s; +- +- const int xj = -(info->screen.height/2) * s; +- const int yj = -(info->screen.height/2) * c; +- +- int xprime = xj; +- int yprime = yj; +- +- int ifftab[16]; +- if (data->inverse_motif) { +- int i; +- for (i=0;i<16;++i) +- ifftab[i] = (double)iff * (1.0 + data->visibility * (15.0 - i) / 15.0); +- } +- else { +- int i; +- for (i=0;i<16;++i) +- ifftab[i] = (double)iff / (1.0 + data->visibility * (15.0 - i) / 15.0); +- } +- +- for (y=info->screen.height;y--;) { +- int xtex,ytex; +- +- xtex = xprime + xi + CONV_MOTIF_W * 0x10000 / 2; +- xprime += s; +- +- ytex = yprime + yi + CONV_MOTIF_W * 0x10000 / 2; +- yprime += c; +- +-#ifdef HAVE_MMX +- __asm__ __volatile__ +- ("\n\t pxor %%mm7, %%mm7" /* mm7 = 0 */ +- "\n\t movd %[xtex], %%mm2" +- "\n\t movd %[ytex], %%mm3" +- "\n\t punpckldq %%mm3, %%mm2" /* mm2 = [ ytex | xtex ] */ +- "\n\t movd %[c], %%mm4" +- "\n\t movd %[s], %%mm6" +- "\n\t pxor %%mm5, %%mm5" +- "\n\t psubd %%mm6, %%mm5" +- "\n\t punpckldq %%mm5, %%mm4" /* mm4 = [ -s | c ] */ +- "\n\t movd %[motif], %%mm6" /* mm6 = motif */ +- +- ::[xtex]"g"(xtex) ,[ytex]"g"(ytex) +- , [c]"g"(c), [s]"g"(s) +- , [motif] "g"(&data->conv_motif[0][0])); +- +- for (x=info->screen.width;x--;) +- { +- __asm__ __volatile__ +- ( +- "\n\t movd %[src], %%mm0" /* mm0 = src */ +- "\n\t paddd %%mm4, %%mm2" /* [ ytex | xtex ] += [ -s | s ] */ +- "\n\t movd %%esi, %%mm5" /* save esi into mm5 */ +- "\n\t movq %%mm2, %%mm3" +- "\n\t psrld $16, %%mm3" /* mm3 = [ (ytex>>16) | (xtex>>16) ] */ +- "\n\t movd %%mm3, %%eax" /* eax = xtex' */ +- +- "\n\t psrlq $25, %%mm3" +- "\n\t movd %%mm3, %%ecx" /* ecx = ytex' << 7 */ +- +- "\n\t andl $127, %%eax" +- "\n\t andl $16256, %%ecx" +- +- "\n\t addl %%ecx, %%eax" +- "\n\t movd %%mm6, %%esi" /* esi = motif */ +- "\n\t xorl %%ecx, %%ecx" +- "\n\t movb (%%eax,%%esi), %%cl" +- +- "\n\t movl %[ifftab], %%eax" +- "\n\t movd %%mm5, %%esi" /* restore esi from mm5 */ +- "\n\t movd (%%eax,%%ecx,4), %%mm1" /* mm1 = [0|0|0|iff2] */ +- +- "\n\t punpcklwd %%mm1, %%mm1" +- "\n\t punpcklbw %%mm7, %%mm0" +- "\n\t punpckldq %%mm1, %%mm1" +- "\n\t psrlw $1, %%mm0" +- "\n\t psrlw $2, %%mm1" +- "\n\t pmullw %%mm1, %%mm0" +- "\n\t psrlw $5, %%mm0" +- "\n\t packuswb %%mm7, %%mm0" +- "\n\t movd %%mm0, %[dest]" +- : [dest] "=g" (dest[i].val) +- : [src] "g" (src[i].val) +- , [ifftab]"g"(&ifftab[0]) +- : "eax","ecx"); +- +- i++; +- } +-#else +- for (x=info->screen.width;x--;) { +- +- int iff2; +- unsigned int f0,f1,f2,f3; +- +- xtex += c; +- ytex -= s; +- +- iff2 = ifftab[data->conv_motif[(ytex >>16) & CONV_MOTIF_WMASK][(xtex >> 16) & CONV_MOTIF_WMASK]]; +- +-#define sat(a) ((a)>0xFF?0xFF:(a)) +- f0 = src[i].val; +- f1 = ((f0 >> R_OFFSET) & 0xFF) * iff2 >> 8; +- f2 = ((f0 >> G_OFFSET) & 0xFF) * iff2 >> 8; +- f3 = ((f0 >> B_OFFSET) & 0xFF) * iff2 >> 8; +- dest[i].val = (sat(f1) << R_OFFSET) | (sat(f2) << G_OFFSET) | (sat(f3) << B_OFFSET); +-/* +- f0 = (src[i].cop[0] * iff2) >> 8; +- f1 = (src[i].cop[1] * iff2) >> 8; +- f2 = (src[i].cop[2] * iff2) >> 8; +- f3 = (src[i].cop[3] * iff2) >> 8; +- +- dest[i].cop[0] = (f0 & 0xffffff00) ? 0xff : (unsigned char)f0; +- dest[i].cop[1] = (f1 & 0xffffff00) ? 0xff : (unsigned char)f1; +- dest[i].cop[2] = (f2 & 0xffffff00) ? 0xff : (unsigned char)f2; +- dest[i].cop[3] = (f3 & 0xffffff00) ? 0xff : (unsigned char)f3; +-*/ +- i++; +- } +-#endif +- } +-#ifdef HAVE_MMX +- __asm__ __volatile__ ("\n\t emms"); +-#endif +- +- compute_tables(_this, info); +-} +- +- +-/*#include <stdint.h> +- +-static uint64_t GetTick() +-{ +- uint64_t x; +- asm volatile ("RDTSC" : "=A" (x)); +- return x; +-}*/ +- +- +-static void convolve_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *info) { +- +- ConvData *data = (ConvData*)_this->fx_data; +- float ff; +- int iff; +- +- ff = (FVAL(data->factor_p) * FVAL(data->factor_adj_p) + FVAL(data->light) ) / 100.0f; +- iff = (unsigned int)(ff * 256); +- +- { +- double fcycle = (double)info->cycle; +- double rotate_param, rotate_coef; +- float INCREASE_RATE = 1.5; +- float DECAY_RATE = 0.955; +- if (FVAL(info->sound.last_goom_p) > 0.8) +- FVAL(data->factor_p) += FVAL(info->sound.goom_power_p) * INCREASE_RATE; +- FVAL(data->factor_p) *= DECAY_RATE; +- +- rotate_param = FVAL(info->sound.last_goom_p); +- if (rotate_param < 0.0) +- rotate_param = 0.0; +- rotate_param += FVAL(info->sound.goom_power_p); +- +- rotate_coef = 4.0 + FVAL(info->sound.goom_power_p) * 6.0; +- data->ftheta = (data->ftheta + rotate_coef * sin(rotate_param * 6.3)); +- data->theta = ((unsigned int)data->ftheta) % NB_THETA; +- data->visibility = (cos(fcycle * 0.001 + 1.5) * sin(fcycle * 0.008) + cos(fcycle * 0.011 + 5.0) - 0.8 + info->sound.speedvar) * 1.5; +- if (data->visibility < 0.0) data->visibility = 0.0; +- data->factor_p.change_listener(&data->factor_p); +- } +- +- if (data->visibility < 0.01) { +- switch (goom_irand(info->gRandom, 300)) +- { +- case 1: +- set_motif(data, CONV_MOTIF1); data->inverse_motif = 1; break; +- case 2: +- set_motif(data, CONV_MOTIF2); data->inverse_motif = 0; break; +- } +- } +- +- if ((ff > 0.98f) && (ff < 1.02f)) +- memcpy(dest, src, info->screen.size * sizeof(Pixel)); +- else +- create_output_with_brightness(_this,src,dest,info,iff); +-/* +-// Benching suite... +- { +- uint64_t before, after; +- double timed; +- static double stimed = 10000.0; +- before = GetTick(); +- data->visibility = 1.0; +- create_output_with_brightness(_this,src,dest,info,iff); +- after = GetTick(); +- timed = (double)((after-before) / info->screen.size); +- if (timed < stimed) { +- stimed = timed; +- printf ("CLK = %3.0f CPP\n", stimed); +- } +- } +-*/ +-} +- +-VisualFX convolve_create(void) { +- VisualFX vfx = { +- init: convolve_init, +- free: convolve_free, +- apply: convolve_apply, +- fx_data: 0 +- }; +- return vfx; +-} +diff -Naur /home/d4rk/goom2k4-0/src/convolve_fx.c.jc /src/convolve_fx.c.jc +--- /home/d4rk/goom2k4-0/src/convolve_fx.c.jc 2005-02-07 06:46:42.000000000 -0700 ++++ /src/convolve_fx.c.jc 1969-12-31 17:00:00.000000000 -0700 +@@ -1,333 +0,0 @@ +-#include "goom_fx.h" +-#include "goom_plugin_info.h" +-#include "goomsl.h" +-#include "goom_config.h" +-#include <math.h> +-#include <stdio.h> +-#include <stdlib.h> +-#include <string.h> +- +-//#define CONV_MOTIF_W 32 +-//#define CONV_MOTIF_WMASK 0x1f +- +-#define CONV_MOTIF_W 128 +-#define CONV_MOTIF_WMASK 0x7f +- +-typedef char Motif[CONV_MOTIF_W][CONV_MOTIF_W]; +- +-#include "motif_goom1.h" +-#include "motif_goom2.h" +- +-#define NB_THETA 512 +- +-#define MAX 2.0f +- +-typedef struct _CONV_DATA{ +- PluginParam light; +- PluginParam factor_adj_p; +- PluginParam factor_p; +- PluginParameters params; +- +- GoomSL *script; +- +- /* rotozoom */ +- int theta; +- float ftheta; +- int h_sin[NB_THETA]; +- int h_cos[NB_THETA]; +- int h_height; +- float visibility; +- Motif conv_motif; +- int inverse_motif; +- +-} ConvData; +- +-/* init rotozoom tables */ +-static void compute_tables(VisualFX *_this, PluginInfo *info) +-{ +- ConvData *data = (ConvData*)_this->fx_data; +- double screen_coef; +- int i; +- double h; +- double radian; +- +- if (data->h_height == info->screen.height) return; +- +- screen_coef = 2.0 * 300.0 / (double)info->screen.height; +- data->h_height = info->screen.height; +- +- for ( i=0 ; i<NB_THETA ; i++ ) { +- radian = 2*i*M_PI/NB_THETA; +- h = (0.2 + cos (radian) / 15.0 * sin(radian * 2.0 + 12.123)) * screen_coef; +- data->h_cos[i] = 0x10000 * (-h * cos (radian) * cos(radian)); +- data->h_sin[i] = 0x10000 * (h * sin (radian + 1.57) * sin(radian)); +- } +-} +- +-static void set_motif(ConvData *data, Motif motif) +-{ +- int i,j; +- for (i=0;i<CONV_MOTIF_W;++i) for (j=0;j<CONV_MOTIF_W;++j) +- data->conv_motif[i][j] = motif[CONV_MOTIF_W-i-1][CONV_MOTIF_W-j-1]; +-} +- +-static void convolve_init(VisualFX *_this, PluginInfo *info) { +- ConvData *data; +- data = (ConvData*)malloc(sizeof(ConvData)); +- _this->fx_data = (void*)data; +- +- data->light = secure_f_param("Screen Brightness"); +- data->light.param.fval.max = 300.0f; +- data->light.param.fval.step = 1.0f; +- data->light.param.fval.value = 100.0f; +- +- data->factor_adj_p = secure_f_param("Flash Intensity"); +- data->factor_adj_p.param.fval.max = 200.0f; +- data->factor_adj_p.param.fval.step = 1.0f; +- data->factor_adj_p.param.fval.value = 70.0f; +- +- data->factor_p = secure_f_feedback("Factor"); +- +- data->params = plugin_parameters ("Bright Flash", 5); +- data->params.params[0] = &data->light; +- data->params.params[1] = &data->factor_adj_p; +- data->params.params[2] = 0; +- data->params.params[3] = &data->factor_p; +- data->params.params[4] = 0; +- +- /* init rotozoom tables */ +- compute_tables(_this, info); +- data->theta = 0; +- data->ftheta = 0.0; +- data->visibility = 1.0; +- set_motif(data, CONV_MOTIF2); +- data->inverse_motif = 0; +- +- _this->params = &data->params; +-} +- +-static void convolve_free(VisualFX *_this) { +- free (_this->fx_data); +-} +- +-static void create_output_with_brightness(VisualFX *_this, Pixel *src, Pixel *dest, +- PluginInfo *info, int iff) +-{ +- ConvData *data = (ConvData*)_this->fx_data; +- +- int x,y; +- int i = 0;//info->screen.height * info->screen.width - 1; +- +- const int c = data->h_cos [data->theta]; +- const int s = data->h_sin [data->theta]; +- +- const int xi = -(info->screen.width/2) * c; +- const int yi = (info->screen.width/2) * s; +- +- const int xj = -(info->screen.height/2) * s; +- const int yj = -(info->screen.height/2) * c; +- +- int xprime = xj; +- int yprime = yj; +- +- int ifftab[16]; +- if (data->inverse_motif) { +- int i; +- for (i=0;i<16;++i) +- ifftab[i] = (double)iff * (1.0 + data->visibility * (15.0 - i) / 15.0); +- } +- else { +- int i; +- for (i=0;i<16;++i) +- ifftab[i] = (double)iff / (1.0 + data->visibility * (15.0 - i) / 15.0); +- } +- +- for (y=info->screen.height;y--;) { +- int xtex,ytex; +- +- xtex = xprime + xi + CONV_MOTIF_W * 0x10000 / 2; +- xprime += s; +- +- ytex = yprime + yi + CONV_MOTIF_W * 0x10000 / 2; +- yprime += c; +- +-#ifdef HAVE_MMX +- __asm__ __volatile__ +- ("\n\t pxor %%mm7, %%mm7" /* mm7 = 0 */ +- "\n\t movd %[xtex], %%mm2" +- "\n\t movd %[ytex], %%mm3" +- "\n\t punpckldq %%mm3, %%mm2" /* mm2 = [ ytex | xtex ] */ +- "\n\t movd %[c], %%mm4" +- "\n\t movd %[s], %%mm6" +- "\n\t pxor %%mm5, %%mm5" +- "\n\t psubd %%mm6, %%mm5" +- "\n\t punpckldq %%mm5, %%mm4" /* mm4 = [ -s | c ] */ +- "\n\t movd %[motif], %%mm6" /* mm6 = motif */ +- +- ::[xtex]"g"(xtex) ,[ytex]"g"(ytex) +- , [c]"g"(c), [s]"g"(s) +- , [motif] "g"(&data->conv_motif[0][0])); +- +- for (x=info->screen.width;x--;) +- { +- __asm__ __volatile__ +- ( +- "\n\t movd %[src], %%mm0" /* mm0 = src */ +- "\n\t paddd %%mm4, %%mm2" /* [ ytex | xtex ] += [ -s | s ] */ +- "\n\t movd %%esi, %%mm5" /* save esi into mm5 */ +- "\n\t movq %%mm2, %%mm3" +- "\n\t psrld $16, %%mm3" /* mm3 = [ (ytex>>16) | (xtex>>16) ] */ +- "\n\t movd %%mm3, %%eax" /* eax = xtex' */ +- +- "\n\t psrlq $25, %%mm3" +- "\n\t movd %%mm3, %%ecx" /* ecx = ytex' << 7 */ +- +- "\n\t andl $127, %%eax" +- "\n\t andl $16256, %%ecx" +- +- "\n\t addl %%ecx, %%eax" +- "\n\t movd %%mm6, %%esi" /* esi = motif */ +- "\n\t xorl %%ecx, %%ecx" +- "\n\t movb (%%eax,%%esi), %%cl" +- +- "\n\t movl %[ifftab], %%eax" +- "\n\t movd %%mm5, %%esi" /* restore esi from mm5 */ +- "\n\t movd (%%eax,%%ecx,4), %%mm1" /* mm1 = [0|0|0|iff2] */ +- +- "\n\t punpcklwd %%mm1, %%mm1" +- "\n\t punpcklbw %%mm7, %%mm0" +- "\n\t punpckldq %%mm1, %%mm1" +- "\n\t psrlw $1, %%mm0" +- "\n\t psrlw $1, %%mm1" +- "\n\t pmullw %%mm1, %%mm0" +- "\n\t psrlw $6, %%mm0" +- "\n\t packuswb %%mm7, %%mm0" +- "\n\t movd %%mm0, %[dest]" +- : [dest] "=g" (dest[i].val) +- : [src] "g" (src[i].val) +- , [ifftab]"g"(&ifftab[0]) +- : "eax","ecx"); +- +- i++; +- } +-#else +- for (x=info->screen.width;x--;) { +- +- int iff2; +- unsigned int f0,f1,f2,f3; +- +- xtex += c; +- ytex -= s; +- +- iff2 = ifftab[data->conv_motif[(ytex >>16) & CONV_MOTIF_WMASK][(xtex >> 16) & CONV_MOTIF_WMASK]]; +- +-#define sat(a) ((a)>0xFF?0xFF:(a)) +- f0 = src[i].val; +- f1 = ((f0 >> R_OFFSET) & 0xFF) * iff2 >> 8; +- f2 = ((f0 >> G_OFFSET) & 0xFF) * iff2 >> 8; +- f3 = ((f0 >> B_OFFSET) & 0xFF) * iff2 >> 8; +- dest[i].val = (sat(f1) << R_OFFSET) | (sat(f2) << G_OFFSET) | (sat(f3) << B_OFFSET); +-/* +- f0 = (src[i].cop[0] * iff2) >> 8; +- f1 = (src[i].cop[1] * iff2) >> 8; +- f2 = (src[i].cop[2] * iff2) >> 8; +- f3 = (src[i].cop[3] * iff2) >> 8; +- +- dest[i].cop[0] = (f0 & 0xffffff00) ? 0xff : (unsigned char)f0; +- dest[i].cop[1] = (f1 & 0xffffff00) ? 0xff : (unsigned char)f1; +- dest[i].cop[2] = (f2 & 0xffffff00) ? 0xff : (unsigned char)f2; +- dest[i].cop[3] = (f3 & 0xffffff00) ? 0xff : (unsigned char)f3; +-*/ +- i++; +- } +-#endif +- } +- __asm__ __volatile__ ("\n\t emms"); +- +- compute_tables(_this, info); +-} +- +-/* +-#include <stdint.h> +- +-static uint64_t GetTick() +-{ +- uint64_t x; +- asm volatile ("RDTSC" : "=A" (x)); +- return x; +-} +-*/ +- +-static void convolve_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *info) { +- +- ConvData *data = (ConvData*)_this->fx_data; +- float ff; +- int iff; +- +- ff = (FVAL(data->factor_p) * FVAL(data->factor_adj_p) + FVAL(data->light) ) / 100.0f; +- iff = (unsigned int)(ff * 256); +- +- { +- double fcycle = (double)info->cycle; +- double rotate_param, rotate_coef; +- float INCREASE_RATE = 1.5; +- float DECAY_RATE = 0.955; +- if (FVAL(info->sound.last_goom_p) > 0.8) +- FVAL(data->factor_p) += FVAL(info->sound.goom_power_p) * INCREASE_RATE; +- FVAL(data->factor_p) *= DECAY_RATE; +- +- rotate_param = FVAL(info->sound.last_goom_p); +- if (rotate_param < 0.0) +- rotate_param = 0.0; +- rotate_param += FVAL(info->sound.goom_power_p); +- +- rotate_coef = 4.0 + FVAL(info->sound.goom_power_p) * 6.0; +- data->ftheta = (data->ftheta + rotate_coef * sin(rotate_param * 6.3)); +- data->theta = ((unsigned int)data->ftheta) % NB_THETA; +- data->visibility = (cos(fcycle * 0.001 + 1.5) * sin(fcycle * 0.008) + cos(fcycle * 0.011 + 5.0) - 0.8 + info->sound.speedvar) * 1.5; +- if (data->visibility < 0.0) data->visibility = 0.0; +- data->factor_p.change_listener(&data->factor_p); +- } +- +- if (data->visibility < 0.01) { +- switch (goom_irand(info->gRandom, 300)) +- { +- case 1: +- set_motif(data, CONV_MOTIF1); data->inverse_motif = 1; break; +- case 2: +- set_motif(data, CONV_MOTIF2); data->inverse_motif = 0; break; +- } +- } +- +- if ((ff > 0.96f) && (ff < 1.04f)) +- memcpy(dest, src, info->screen.size * sizeof(Pixel)); +- else +- create_output_with_brightness(_this,src,dest,info,iff); +-/* +- Benching suite... +- { +- uint64_t before, after; +- double timed; +- static double stimed = 10000.0; +- before = GetTick(); +- data->visibility = 1.0; +- create_output_with_brightness(_this,src,dest,info,iff); +- after = GetTick(); +- timed = (double)((after-before) / info->screen.size); +- if (timed < stimed) { +- stimed = timed; +- printf ("CLK = %3.0f CPP\n", stimed); +- } +- } +-*/ +-} +- +-VisualFX convolve_create(void) { +- VisualFX vfx = { +- init: convolve_init, +- free: convolve_free, +- apply: convolve_apply, +- fx_data: 0 +- }; +- return vfx; +-} +diff -Naur /home/d4rk/goom2k4-0/src/cpu_info.c /src/cpu_info.c +--- /home/d4rk/goom2k4-0/src/cpu_info.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/cpu_info.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,71 +0,0 @@ +-/* +- * cpu_info.c +- * Goom +- * +- * Created by Guillaume Borios on Sun Dec 28 2003. +- * Copyright (c) 2003 iOS. All rights reserved. +- * +- */ +- +-#include "cpu_info.h" +- +-#ifdef CPU_X86 +-#include "mmx.h" +-#endif +- +-#ifdef CPU_POWERPC +-#include <sys/types.h> +-#include <stdlib.h> +-#endif +- +-static unsigned int CPU_FLAVOUR = 0; +-static unsigned int CPU_NUMBER = 1; +-static unsigned int CPU_DETECTED = 0; +- +-static void autoset_cpu_info (void) +-{ +- CPU_DETECTED = 1; +- +-#ifdef CPU_POWERPC +- int result; +- size_t size; +- +- result = 0; +- size = 4; +- if (sysctlbyname("hw.optional.altivec",&result,&size,NULL,NULL) == 0) +- { +- if (result != 0) CPU_FLAVOUR |= CPU_OPTION_ALTIVEC; +- } +- +- result = 0; +- size = 4; +- if (sysctlbyname("hw.optional.64bitops",&result,&size,NULL,NULL) == 0) +- { +- if (result != 0) CPU_FLAVOUR |= CPU_OPTION_64_BITS; +- } +- +- result = 0; +- size = 4; +- if (sysctlbyname("hw.ncpu",&result,&size,NULL,NULL) == 0) +- { +- if (result != 0) CPU_NUMBER = result; +- } +-#endif /* CPU_POWERPC */ +- +-#ifdef CPU_X86 +- if (mmx_supported()) CPU_FLAVOUR |= CPU_OPTION_MMX; +- if (xmmx_supported()) CPU_FLAVOUR |= CPU_OPTION_XMMX; +-#endif /* CPU_X86 */ +-} +- +-unsigned int cpu_flavour (void) +-{ +- if (CPU_DETECTED == 0) autoset_cpu_info(); +- return CPU_FLAVOUR; +-} +- +-unsigned int cpu_number (void) +-{ +- if (CPU_DETECTED == 0) autoset_cpu_info(); +- return CPU_NUMBER; +-} +diff -Naur /home/d4rk/goom2k4-0/src/cpu_info.h /src/cpu_info.h +--- /home/d4rk/goom2k4-0/src/cpu_info.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/cpu_info.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,34 +0,0 @@ +-#ifndef CPU_INFO_H +-#define CPU_INFO_H +- +-/* +- * cpu_info.h +- * Goom +- * +- * Created by Guillaume Borios on Sun Dec 28 2003. +- * Copyright (c) 2003 iOS. All rights reserved. +- * +- */ +- +-#ifdef HAVE_MMX +-#ifndef CPU_X86 +-#define CPU_X86 +-#endif +-#endif +- +-/* Returns the CPU flavour described with the constants below */ +-unsigned int cpu_flavour (void); +- +-#define CPU_OPTION_ALTIVEC 0x1 +-#define CPU_OPTION_64_BITS 0x2 +-#define CPU_OPTION_MMX 0x4 +-#define CPU_OPTION_XMMX 0x8 +-#define CPU_OPTION_SSE 0x10 +-#define CPU_OPTION_SSE2 0x20 +-#define CPU_OPTION_3DNOW 0x40 +- +- +-/* Returns the CPU number */ +-unsigned int cpu_number (void); +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/default_script.goom /src/default_script.goom +--- /home/d4rk/goom2k4-0/src/default_script.goom 2005-02-07 06:46:41.000000000 -0700 ++++ /src/default_script.goom 1969-12-31 17:00:00.000000000 -0700 +@@ -1,34 +0,0 @@ +-/* +- * specify here high-level properties of a flash. +- */ +- +-flash_occurs when (Sound.Goom_Detection > 50%) and (Sound.Sound_Speed > 14%); +- +-max_flash = 200%; +-slow_down_coef = 96%; +- +-/* +- * Here you have the fx's state machin behaviour. +- */ +- +-(locked) ? locked--; +- +-(not locked) and (flash_occurs) ? +-{ +- cur_power = Sound_Speed.Goom_Detection; +- start flashing_up; +-} +- +-(not locked) and (flashing_up) ? +-{ +- factor += cur_power * 2 * (speedvar / 4 + 0.95); +- if (factor > max_flash) factor = max_flash; +- +- (not flash_occurs) ? +- { +- locked = 200; +- stop flashing_up; +- } +-} +- +-factor *= slow_down_coef; +diff -Naur /home/d4rk/goom2k4-0/src/default_scripts.h /src/default_scripts.h +--- /home/d4rk/goom2k4-0/src/default_scripts.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/default_scripts.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,6 +0,0 @@ +-#ifndef _DEFAULT_SCRIPTS_H +-#define _DEFAULT_SCRIPTS_H +- +-#define GOOM_MAIN_SCRIPT "" +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/DOCODE.TXT /src/DOCODE.TXT +--- /home/d4rk/goom2k4-0/src/DOCODE.TXT 2005-02-07 06:46:41.000000000 -0700 ++++ /src/DOCODE.TXT 1969-12-31 17:00:00.000000000 -0700 +@@ -1,55 +0,0 @@ +-Les différentes données.. +------ +- +-typedef struct { +- int32 * buf; +- int32 width; +- int32 height; +- int32 size; +- +- int32 * realstart; +-} Surface; +------ +- +->> taille du buffer de zoom +-guint32 mmx_zoom_size; +------ +- +->> les buffers bruts contiennent les px et py de chaque point +->> => brutS[0] = px0, brutS[1] = py0, brutS[2] = px1, [...] +- +-signed int *brutS = 0, *freebrutS = 0; // source +-signed int *brutD = 0, *freebrutD = 0; // dest +-signed int *brutT = 0, *freebrutT = 0; // temp (en cours de génération) +- +->> pointeur vers p1 +-guint32 *expix1 = 0; +->> pointeur vers p2 +-guint32 *expix2 = 0; +- +->> largeur d'une ligne = prevX +-guint32 zoom_width; +- +->> largeur et hauteur des differents buffers. +-int prevX=0,prevY=0; +------ +- +->> buffratio est un fixpoint : 16,16 +->> valeur normalement comprise entre 0 et 1, +->> soit 0<=buffratio<=BUFFPOINTMASK +- +-int buffratio = 0; +- +-#define BUFFPOINTNB 16 +-#define BUFFPOINTMASK 0xffff +-#define BUFFINCR 0xff +------ +- +-#define sqrtperte 16 +->> faire : a % sqrtperte <=> a & pertemask +-#define PERTEMASK 0xf +->> faire : a / sqrtperte <=> a >> PERTEDEC +-#define PERTEDEC 4 +------ +- +-int precalCoef[16][16]; +diff -Naur /home/d4rk/goom2k4-0/src/drawmethods.c /src/drawmethods.c +--- /home/d4rk/goom2k4-0/src/drawmethods.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/drawmethods.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,203 +0,0 @@ +-#include "drawmethods.h" +- +-#define DRAWMETHOD_PLUS(_out,_backbuf,_col) \ +-{\ +- int tra=0,i=0;\ +- unsigned char *bra = (unsigned char*)&(_backbuf);\ +- unsigned char *dra = (unsigned char*)&(_out);\ +- unsigned char *cra = (unsigned char*)&(_col);\ +- for (;i<4;i++) {\ +- tra = *cra;\ +- tra += *bra;\ +- if (tra>255) tra=255;\ +- *dra = tra;\ +- ++dra;++cra;++bra;\ +- }\ +-} +- +-#define DRAWMETHOD DRAWMETHOD_PLUS(*p,*p,col) +- +-void draw_line (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny) +-{ +- int x, y, dx, dy, yy, xx; +- Pixel *p; +- +- if ((y1 < 0) || (y2 < 0) || (x1 < 0) || (x2 < 0) || (y1 >= screeny) || (y2 >= screeny) || (x1 >= screenx) || (x2 >= screenx)) return; +- +- /* clip to top edge +- if ((y1 < 0) && (y2 < 0)) +- return; +- +- if (y1 < 0) { +- x1 += (y1 * (x1 - x2)) / (y2 - y1); +- y1 = 0; +- } +- if (y2 < 0) { +- x2 += (y2 * (x1 - x2)) / (y2 - y1); +- y2 = 0; +- } +- +- clip to bottom edge +- if ((y1 >= screeny) && (y2 >= screeny)) +- return; +- if (y1 >= screeny) { +- x1 -= ((screeny - y1) * (x1 - x2)) / (y2 - y1); +- y1 = screeny - 1; +- } +- if (y2 >= screeny) { +- x2 -= ((screeny - y2) * (x1 - x2)) / (y2 - y1); +- y2 = screeny - 1; +- } +- clip to left edge +- if ((x1 < 0) && (x2 < 0)) +- return; +- if (x1 < 0) { +- y1 += (x1 * (y1 - y2)) / (x2 - x1); +- x1 = 0; +- } +- if (x2 < 0) { +- y2 += (x2 * (y1 - y2)) / (x2 - x1); +- x2 = 0; +- } +- clip to right edge +- if ((x1 >= screenx) && (x2 >= screenx)) +- return; +- if (x1 >= screenx) { +- y1 -= ((screenx - x1) * (y1 - y2)) / (x2 - x1); +- x1 = screenx - 1; +- } +- if (x2 >= screenx) { +- y2 -= ((screenx - x2) * (y1 - y2)) / (x2 - x1); +- x2 = screenx - 1; +- } +- */ +- +- dx = x2 - x1; +- dy = y2 - y1; +- if (x1 > x2) { +- int tmp; +- +- tmp = x1; +- x1 = x2; +- x2 = tmp; +- tmp = y1; +- y1 = y2; +- y2 = tmp; +- dx = x2 - x1; +- dy = y2 - y1; +- } +- +- /* vertical line */ +- if (dx == 0) { +- if (y1 < y2) { +- p = &(data[(screenx * y1) + x1]); +- for (y = y1; y <= y2; y++) { +- DRAWMETHOD; +- p += screenx; +- } +- } +- else { +- p = &(data[(screenx * y2) + x1]); +- for (y = y2; y <= y1; y++) { +- DRAWMETHOD; +- p += screenx; +- } +- } +- return; +- } +- /* horizontal line */ +- if (dy == 0) { +- if (x1 < x2) { +- p = &(data[(screenx * y1) + x1]); +- for (x = x1; x <= x2; x++) { +- DRAWMETHOD; +- p++; +- } +- return; +- } +- else { +- p = &(data[(screenx * y1) + x2]); +- for (x = x2; x <= x1; x++) { +- DRAWMETHOD; +- p++; +- } +- return; +- } +- } +- /* 1 */ +- /* \ */ +- /* \ */ +- /* 2 */ +- if (y2 > y1) { +- /* steep */ +- if (dy > dx) { +- dx = ((dx << 16) / dy); +- x = x1 << 16; +- for (y = y1; y <= y2; y++) { +- xx = x >> 16; +- p = &(data[(screenx * y) + xx]); +- DRAWMETHOD; +- if (xx < (screenx - 1)) { +- p++; +- /* DRAWMETHOD; */ +- } +- x += dx; +- } +- return; +- } +- /* shallow */ +- else { +- dy = ((dy << 16) / dx); +- y = y1 << 16; +- for (x = x1; x <= x2; x++) { +- yy = y >> 16; +- p = &(data[(screenx * yy) + x]); +- DRAWMETHOD; +- if (yy < (screeny - 1)) { +- p += screeny; +- /* DRAWMETHOD; */ +- } +- y += dy; +- } +- } +- } +- /* 2 */ +- /* / */ +- /* / */ +- /* 1 */ +- else { +- /* steep */ +- if (-dy > dx) { +- dx = ((dx << 16) / -dy); +- x = (x1 + 1) << 16; +- for (y = y1; y >= y2; y--) { +- xx = x >> 16; +- p = &(data[(screenx * y) + xx]); +- DRAWMETHOD; +- if (xx < (screenx - 1)) { +- p--; +- /* DRAWMETHOD; */ +- } +- x += dx; +- } +- return; +- } +- /* shallow */ +- else { +- dy = ((dy << 16) / dx); +- y = y1 << 16; +- for (x = x1; x <= x2; x++) { +- yy = y >> 16; +- p = &(data[(screenx * yy) + x]); +- DRAWMETHOD; +- if (yy < (screeny - 1)) { +- p += screeny; +- /* DRAWMETHOD; */ +- } +- y += dy; +- } +- return; +- } +- } +-} +- +diff -Naur /home/d4rk/goom2k4-0/src/drawmethods.h /src/drawmethods.h +--- /home/d4rk/goom2k4-0/src/drawmethods.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/drawmethods.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,9 +0,0 @@ +-#ifndef _DRAWMETHODS_H +-#define _DRAWMETHODS_H +- +-#include "goom_config.h" +-#include "goom_graphic.h" +- +-void draw_line (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny); +- +-#endif /* _DRAWMETHODS_H */ +diff -Naur /home/d4rk/goom2k4-0/src/filters.c /src/filters.c +--- /home/d4rk/goom2k4-0/src/filters.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/filters.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,767 +0,0 @@ +-// --- CHUI EN TRAIN DE SUPPRIMER LES EXTERN RESOLX ET C_RESOLY --- +- +-/* filter.c version 0.7 +-* contient les filtres applicable a un buffer +-* creation : 01/10/2000 +-* -ajout de sinFilter() +-* -ajout de zoomFilter() +-* -copie de zoomFilter() en zoomFilterRGB(), gerant les 3 couleurs +-* -optimisation de sinFilter (utilisant une table de sin) +-* -asm +-* -optimisation de la procedure de generation du buffer de transformation +-* la vitesse est maintenant comprise dans [0..128] au lieu de [0..100] +-*/ +- +-/* #define _DEBUG_PIXEL */ +- +-#include <string.h> +-#include <stdlib.h> +-#include <math.h> +-#include <stdio.h> +-#include <inttypes.h> +- +-#include "goom_filters.h" +-#include "goom_graphic.h" +-#include "goom_tools.h" +-#include "goom_plugin_info.h" +-#include "goom_fx.h" +-#include "v3d.h" +- +-/* TODO : MOVE THIS AWAY !!! */ +-/* jeko: j'ai essayer de le virer, mais si on veut les laisser inline c'est un peu lourdo... */ +-static inline void setPixelRGB (PluginInfo *goomInfo, Pixel *buffer, Uint x, Uint y, Color c) +-{ +- Pixel i; +- +- i.channels.b = c.b; +- i.channels.g = c.v; +- i.channels.r = c.r; +- *(buffer + (x + y * goomInfo->screen.width)) = i; +-} +- +-static inline void setPixelRGB_ (Pixel *buffer, Uint x, Color c) +-{ +- buffer[x].channels.r = c.r; +- buffer[x].channels.g = c.v; +- buffer[x].channels.b = c.b; +-} +- +-static inline void getPixelRGB (PluginInfo *goomInfo, Pixel *buffer, Uint x, Uint y, Color * c) +-{ +- Pixel i = *(buffer + (x + y * goomInfo->screen.width)); +- c->b = i.channels.b; +- c->v = i.channels.g; +- c->r = i.channels.r; +-} +- +-static inline void getPixelRGB_ (Pixel *buffer, Uint x, Color * c) +-{ +- Pixel i = *(buffer + x); +- c->b = i.channels.b; +- c->v = i.channels.g; +- c->r = i.channels.r; +-} +-/* END TODO */ +- +- +-/* DEPRECATED */ +-// retourne x>>s , en testant le signe de x +-//#define ShiftRight(_x,_s) (((_x)<0) ? -(-(_x)>>(_s)) : ((_x)>>(_s))) +-//#define EFFECT_DISTORS 4 +-//#define EFFECT_DISTORS_SL 2 +-//#define INTERLACE_ADD 9 +-//#define INTERLACE_AND 0xf +-/* END DEPRECATED */ +- +-#define BUFFPOINTNB 16 +-#define BUFFPOINTNBF 16.0f +-#define BUFFPOINTMASK 0xffff +- +-#define sqrtperte 16 +-/* faire : a % sqrtperte <=> a & pertemask */ +-#define PERTEMASK 0xf +-/* faire : a / sqrtperte <=> a >> PERTEDEC */ +-#define PERTEDEC 4 +- +-/* pure c version of the zoom filter */ +-static void c_zoom (Pixel *expix1, Pixel *expix2, unsigned int prevX, unsigned int prevY, signed int *brutS, signed int *brutD, int buffratio, int precalCoef[BUFFPOINTNB][BUFFPOINTNB]); +- +-/* simple wrapper to give it the same proto than the others */ +-void zoom_filter_c (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]) { +- c_zoom(src, dest, sizeX, sizeY, brutS, brutD, buffratio, precalCoef); +-} +- +-static void generatePrecalCoef (int precalCoef[BUFFPOINTNB][BUFFPOINTNB]); +- +- +-typedef struct _ZOOM_FILTER_FX_WRAPPER_DATA { +- +- PluginParam enabled_bp; +- PluginParameters params; +- +- unsigned int *coeffs, *freecoeffs; +- +- signed int *brutS, *freebrutS; /* source */ +- signed int *brutD, *freebrutD; /* dest */ +- signed int *brutT, *freebrutT; /* temp (en cours de generation) */ +- +- guint32 zoom_width; +- +- unsigned int prevX, prevY; +- +- float general_speed; +- int reverse; /* reverse the speed */ +- char theMode; +- int waveEffect; +- int hypercosEffect; +- int vPlaneEffect; +- int hPlaneEffect; +- char noisify; +- int middleX, middleY; +- +- int mustInitBuffers; +- int interlace_start; +- +- /** modif by jeko : fixedpoint : buffration = (16:16) (donc 0<=buffration<=2^16) */ +- int buffratio; +- int *firedec; +- +- /** modif d'optim by Jeko : precalcul des 4 coefs resultant des 2 pos */ +- int precalCoef[BUFFPOINTNB][BUFFPOINTNB]; +- +- /** calculatePXandPY statics */ +- int wave; +- int wavesp; +- +-} ZoomFilterFXWrapperData; +- +- +- +- +-static inline v2g zoomVector(ZoomFilterFXWrapperData *data, float X, float Y) +-{ +- v2g vecteur; +- float vx, vy; +- float sq_dist = X*X + Y*Y; +- +- /* sx = (X < 0.0f) ? -1.0f : 1.0f; +- sy = (Y < 0.0f) ? -1.0f : 1.0f; +- */ +- float coefVitesse = (1.0f+ data->general_speed) / 50.0f; +- +- // Effects +- +- /* Centralized FX */ +- +- switch (data->theMode) { +- case CRYSTAL_BALL_MODE: +- coefVitesse -= (sq_dist-0.3f)/15.0f; +- break; +- case AMULETTE_MODE: +- coefVitesse += sq_dist * 3.5f; +- break; +- case WAVE_MODE: +- coefVitesse += sin(sq_dist*20.0f) / 100.0f; +- break; +- case SCRUNCH_MODE: +- coefVitesse += sq_dist / 10.0f; +- break; +- //case HYPERCOS1_MODE: +- break; +- //case HYPERCOS2_MODE: +- break; +- //case YONLY_MODE: +- break; +- case SPEEDWAY_MODE: +- coefVitesse *= 4.0f * Y; +- break; +- default: +- break; +- } +- +- if (coefVitesse < -2.01f) +- coefVitesse = -2.01f; +- if (coefVitesse > 2.01f) +- coefVitesse = 2.01f; +- +- vx = coefVitesse * X; +- vy = coefVitesse * Y; +- +- /* Amulette 2 */ +- // vx = X * tan(dist); +- // vy = Y * tan(dist); +- +- /* Rotate */ +- //vx = (X+Y)*0.1; +- //vy = (Y-X)*0.1; +- +- +- // Effects adds-on +- +- /* Noise */ +- if (data->noisify) +- { +- vx += (((float)random()) / ((float)RAND_MAX) - 0.5f) / 50.0f; +- vy += (((float)random()) / ((float)RAND_MAX) - 0.5f) / 50.0f; +- } +- +- /* Hypercos */ +- if (data->hypercosEffect) +- { +- vx += sin(Y*10.0f)/120.0f; +- vy += sin(X*10.0f)/120.0f; +- } +- +- /* H Plane */ +- if (data->hPlaneEffect) vx += Y * 0.0025f * data->hPlaneEffect; +- +- /* V Plane */ +- if (data->vPlaneEffect) vy += X * 0.0025f * data->vPlaneEffect; +- +- /* TODO : Water Mode */ +- // if (data->waveEffect) +- +- vecteur.x = vx; +- vecteur.y = vy; +- +- return vecteur; +-} +- +- +-/* +- * Makes a stripe of a transform buffer (brutT) +- * +- * The transform is (in order) : +- * Translation (-data->middleX, -data->middleY) +- * Homothetie (Center : 0,0 Coeff : 2/data->prevX) +- */ +-static void makeZoomBufferStripe(ZoomFilterFXWrapperData * data, int INTERLACE_INCR) +-{ +- // Position of the pixel to compute in pixmap coordinates +- Uint x, y; +- // Where (verticaly) to stop generating the buffer stripe +- int maxEnd = (data->interlace_start + INTERLACE_INCR); +- // Ratio from pixmap to normalized coordinates +- float ratio = 2.0f/((float)data->prevX); +- // Ratio from normalized to virtual pixmap coordinates +- float inv_ratio = BUFFPOINTNBF/ratio; +- float min = ratio/BUFFPOINTNBF; +- // Y position of the pixel to compute in normalized coordinates +- float Y = ((float)(data->interlace_start - data->middleY)) * ratio; +- +- maxEnd = data->prevY; +- if (maxEnd > (data->interlace_start + INTERLACE_INCR)) +- maxEnd = (data->interlace_start + INTERLACE_INCR); +- +- for (y = data->interlace_start; (y < data->prevY) && ((signed int)y<maxEnd); y++) { +- Uint premul_y_prevX = y * data->prevX * 2; +- float X = - ((float)data->middleX) * ratio; +- for (x = 0; x < data->prevX; x++) +- { +- v2g vector = zoomVector (data, X, Y); +- +- /* Finish and avoid null displacement */ +- if (fabs(vector.x) < min) vector.x = (vector.x < 0.0f) ? -min : min; +- if (fabs(vector.y) < min) vector.y = (vector.y < 0.0f) ? -min : min; +- +- data->brutT[premul_y_prevX] = ((int)((X-vector.x)*inv_ratio)+((int)(data->middleX*BUFFPOINTNB))); +- data->brutT[premul_y_prevX+1] = ((int)((Y-vector.y)*inv_ratio)+((int)(data->middleY*BUFFPOINTNB))); +- premul_y_prevX += 2; +- X += ratio; +- } +- Y += ratio; +- } +- data->interlace_start += INTERLACE_INCR; +- if (y >= data->prevY-1) data->interlace_start = -1; +-} +- +- +-/* +- * calculer px et py en fonction de x,y,middleX,middleY et theMode +- * px et py indique la nouvelle position (en sqrtperte ieme de pixel) +- * (valeur * 16) +- +- inline void calculatePXandPY (PluginInfo *goomInfo, ZoomFilterFXWrapperData *data, int x, int y, int *px, int *py) +- { +- if (data->theMode == WATER_MODE) { +- int yy; +- +- yy = y + goom_irand(goomInfo->gRandom, 4) - goom_irand(goomInfo->gRandom, 4) + data->wave / 10; +- if (yy < 0) +- yy = 0; +- if (yy >= (signed int)goomInfo->screen.height) +- yy = goomInfo->screen.height - 1; +- +- *px = (x << 4) + data->firedec[yy] + (data->wave / 10); +- *py = (y << 4) + 132 - ((data->vitesse < 131) ? data->vitesse : 130); +- +- data->wavesp += goom_irand(goomInfo->gRandom, 3) - goom_irand(goomInfo->gRandom, 3); +- if (data->wave < -10) +- data->wavesp += 2; +- if (data->wave > 10) +- data->wavesp -= 2; +- data->wave += (data->wavesp / 10) + goom_irand(goomInfo->gRandom, 3) - goom_irand(goomInfo->gRandom, 3); +- if (data->wavesp > 100) +- data->wavesp = (data->wavesp * 9) / 10; +- } +- else { +- int dist = 0, vx9, vy9; +- int vx, vy; +- int ppx, ppy; +- int fvitesse = data->vitesse << 4; +- +- if (data->noisify) { +- x += goom_irand(goomInfo->gRandom, data->noisify) - goom_irand(goomInfo->gRandom, data->noisify); +- y += goom_irand(goomInfo->gRandom, data->noisify) - goom_irand(goomInfo->gRandom, data->noisify); +- } +- vx = (x - data->middleX) << 9; +- vy = (y - data->middleY) << 9; +- +- if (data->hPlaneEffect) +- vx += data->hPlaneEffect * (y - data->middleY); +- +- if (data->vPlaneEffect) +- vy += data->vPlaneEffect * (x - data->middleX); +- +- if (data->waveEffect) { +- fvitesse *= +- 1024 + +- ShiftRight (goomInfo->sintable +- [(unsigned short) (dist * 0xffff + EFFECT_DISTORS)], 6); +- fvitesse /= 1024; +- } +- +- if (data->hypercosEffect) { +- vx += ShiftRight (goomInfo->sintable[(-vy + dist) & 0xffff], 1); +- vy += ShiftRight (goomInfo->sintable[(vx + dist) & 0xffff], 1); +- } +- +- vx9 = ShiftRight (vx, 9); +- vy9 = ShiftRight (vy, 9); +- dist = vx9 * vx9 + vy9 * vy9; +- +- switch (data->theMode) { +- case WAVE_MODE: +- fvitesse *= +- 1024 + +- ShiftRight (goomInfo->sintable +- [(unsigned short) (dist * 0xffff * EFFECT_DISTORS)], 6); +- fvitesse>>=10; +- break; +- case CRYSTAL_BALL_MODE: +- fvitesse += (dist >> (10-EFFECT_DISTORS_SL)); +- break; +- case AMULETTE_MODE: +- fvitesse -= (dist >> (4 - EFFECT_DISTORS_SL)); +- break; +- case SCRUNCH_MODE: +- fvitesse -= (dist >> (10 - EFFECT_DISTORS_SL)); +- break; +- case HYPERCOS1_MODE: +- vx = vx + ShiftRight (goomInfo->sintable[(-vy + dist) & 0xffff], 1); +- vy = vy + ShiftRight (goomInfo->sintable[(vx + dist) & 0xffff], 1); +- break; +- case HYPERCOS2_MODE: +- vx = +- vx + ShiftRight (goomInfo->sintable[(-ShiftRight (vy, 1) + dist) & 0xffff], 0); +- vy = +- vy + ShiftRight (goomInfo->sintable[(ShiftRight (vx, 1) + dist) & 0xffff], 0); +- fvitesse = 128 << 4; +- break; +- case YONLY_MODE: +- fvitesse *= 1024 + ShiftRight (goomInfo->sintable[vy & 0xffff], 6); +- fvitesse >>= 10; +- break; +- case SPEEDWAY_MODE: +- fvitesse -= (ShiftRight(vy,10-EFFECT_DISTORS_SL)); +- break; +- } +- +- if (fvitesse < -3024) +- fvitesse = -3024; +- +- if (vx < 0) // pb avec decalage sur nb negatif +- ppx = -(-(vx * fvitesse) >> 16); +- // 16 = 9 + 7 (7 = nb chiffre virgule de vitesse * (v = 128 => immobile) +- // * * * * * 9 = nb chiffre virgule de vx) +- else +- ppx = ((vx * fvitesse) >> 16); +- +- if (vy < 0) +- ppy = -(-(vy * fvitesse) >> 16); +- else +- ppy = ((vy * fvitesse) >> 16); +- +- *px = (data->middleX << 4) + ppx; +- *py = (data->middleY << 4) + ppy; +- } +- } +- */ +- +- +- +-static void c_zoom (Pixel *expix1, Pixel *expix2, unsigned int prevX, unsigned int prevY, signed int *brutS, signed int *brutD, +- int buffratio, int precalCoef[16][16]) +-{ +- int myPos, myPos2; +- Color couleur; +- +- unsigned int ax = (prevX - 1) << PERTEDEC, ay = (prevY - 1) << PERTEDEC; +- +- int bufsize = prevX * prevY * 2; +- int bufwidth = prevX; +- +- expix1[0].val=expix1[prevX-1].val=expix1[prevX*prevY-1].val=expix1[prevX*prevY-prevX].val=0; +- +- for (myPos = 0; myPos < bufsize; myPos += 2) { +- Color col1, col2, col3, col4; +- int c1, c2, c3, c4, px, py; +- int pos; +- int coeffs; +- +- int brutSmypos = brutS[myPos]; +- +- myPos2 = myPos + 1; +- +- px = brutSmypos + (((brutD[myPos] - brutSmypos) * buffratio) >> BUFFPOINTNB); +- brutSmypos = brutS[myPos2]; +- py = brutSmypos + (((brutD[myPos2] - brutSmypos) * buffratio) >> BUFFPOINTNB); +- +- if ((py >= ay) || (px >= ax)) { +- pos = coeffs = 0; +- } else { +- pos = ((px >> PERTEDEC) + prevX * (py >> PERTEDEC)); +- /* coef en modulo 15 */ +- coeffs = precalCoef[px & PERTEMASK][py & PERTEMASK]; +- } +- getPixelRGB_ (expix1, pos, &col1); +- getPixelRGB_ (expix1, pos + 1, &col2); +- getPixelRGB_ (expix1, pos + bufwidth, &col3); +- getPixelRGB_ (expix1, pos + bufwidth + 1, &col4); +- +- c1 = coeffs; +- c2 = (c1 >> 8) & 0xFF; +- c3 = (c1 >> 16) & 0xFF; +- c4 = (c1 >> 24) & 0xFF; +- c1 = c1 & 0xff; +- +- couleur.r = col1.r * c1 + col2.r * c2 + col3.r * c3 + col4.r * c4; +- if (couleur.r > 5) +- couleur.r -= 5; +- couleur.r >>= 8; +- +- couleur.v = col1.v * c1 + col2.v * c2 + col3.v * c3 + col4.v * c4; +- if (couleur.v > 5) +- couleur.v -= 5; +- couleur.v >>= 8; +- +- couleur.b = col1.b * c1 + col2.b * c2 + col3.b * c3 + col4.b * c4; +- if (couleur.b > 5) +- couleur.b -= 5; +- couleur.b >>= 8; +- +- setPixelRGB_ (expix2, myPos >> 1, couleur); +- } +-} +- +-/** generate the water fx horizontal direction buffer */ +-static void generateTheWaterFXHorizontalDirectionBuffer(PluginInfo *goomInfo, ZoomFilterFXWrapperData *data) { +- +- int loopv; +- int decc = goom_irand(goomInfo->gRandom, 8) - 4; +- int spdc = goom_irand(goomInfo->gRandom, 8) - 4; +- int accel = goom_irand(goomInfo->gRandom, 8) - 4; +- +- for (loopv = data->prevY; loopv != 0;) { +- +- loopv--; +- data->firedec[loopv] = decc; +- decc += spdc / 10; +- spdc += goom_irand(goomInfo->gRandom, 3) - goom_irand(goomInfo->gRandom, 3); +- +- if (decc > 4) +- spdc -= 1; +- if (decc < -4) +- spdc += 1; +- +- if (spdc > 30) +- spdc = spdc - goom_irand(goomInfo->gRandom, 3) + accel / 10; +- if (spdc < -30) +- spdc = spdc + goom_irand(goomInfo->gRandom, 3) + accel / 10; +- +- if (decc > 8 && spdc > 1) +- spdc -= goom_irand(goomInfo->gRandom, 3) - 2; +- +- if (decc < -8 && spdc < -1) +- spdc += goom_irand(goomInfo->gRandom, 3) + 2; +- +- if (decc > 8 || decc < -8) +- decc = decc * 8 / 9; +- +- accel += goom_irand(goomInfo->gRandom, 2) - goom_irand(goomInfo->gRandom, 2); +- if (accel > 20) +- accel -= 2; +- if (accel < -20) +- accel += 2; +- } +-} +- +- +- +-/** +-* Main work for the dynamic displacement map. +- * +- * Reads data from pix1, write to pix2. +- * +- * Useful datas for this FX are stored in ZoomFilterData. +- * +- * If you think that this is a strange function name, let me say that a long time ago, +- * there has been a slow version and a gray-level only one. Then came these function, +- * fast and workin in RGB colorspace ! nice but it only was applying a zoom to the image. +- * So that is why you have this name, for the nostalgy of the first days of goom +- * when it was just a tiny program writen in Turbo Pascal on my i486... +- */ +-void zoomFilterFastRGB (PluginInfo *goomInfo, Pixel * pix1, Pixel * pix2, ZoomFilterData * zf, Uint resx, Uint resy, int switchIncr, float switchMult) +-{ +- Uint x, y; +- +- ZoomFilterFXWrapperData *data = (ZoomFilterFXWrapperData*)goomInfo->zoomFilter_fx.fx_data; +- +- if (!BVAL(data->enabled_bp)) return; +- +- /** changement de taille **/ +- if ((data->prevX != resx) || (data->prevY != resy)) { +- data->prevX = resx; +- data->prevY = resy; +- +- if (data->brutS) free (data->freebrutS); +- data->brutS = 0; +- if (data->brutD) free (data->freebrutD); +- data->brutD = 0; +- if (data->brutT) free (data->freebrutT); +- data->brutT = 0; +- +- data->middleX = resx / 2; +- data->middleY = resy / 2; +- data->mustInitBuffers = 1; +- if (data->firedec) free (data->firedec); +- data->firedec = 0; +- } +- +- if (data->interlace_start != -2) +- zf = NULL; +- +- /** changement de config **/ +- if (zf) { +- data->reverse = zf->reverse; +- data->general_speed = (float)(zf->vitesse-128)/128.0f; +- if (data->reverse) data->general_speed = -data->general_speed; +- data->middleX = zf->middleX; +- data->middleY = zf->middleY; +- data->theMode = zf->mode; +- data->hPlaneEffect = zf->hPlaneEffect; +- data->vPlaneEffect = zf->vPlaneEffect; +- data->waveEffect = zf->waveEffect; +- data->hypercosEffect = zf->hypercosEffect; +- data->noisify = zf->noisify; +- data->interlace_start = 0; +- } +- +- +- if (data->mustInitBuffers) { +- +- data->mustInitBuffers = 0; +- data->freebrutS = (signed int *) calloc (resx * resy * 2 + 128, sizeof(unsigned int)); +- data->brutS = (gint32 *) ((1 + ((uintptr_t) (data->freebrutS)) / 128) * 128); +- +- data->freebrutD = (signed int *) calloc (resx * resy * 2 + 128, sizeof(unsigned int)); +- data->brutD = (gint32 *) ((1 + ((uintptr_t) (data->freebrutD)) / 128) * 128); +- +- data->freebrutT = (signed int *) calloc (resx * resy * 2 + 128, sizeof(unsigned int)); +- data->brutT = (gint32 *) ((1 + ((uintptr_t) (data->freebrutT)) / 128) * 128); +- +- data->buffratio = 0; +- +- data->firedec = (int *) malloc (data->prevY * sizeof (int)); +- generateTheWaterFXHorizontalDirectionBuffer(goomInfo, data); +- +- data->interlace_start = 0; +- makeZoomBufferStripe(data,resy); +- +- /* Copy the data from temp to dest and source */ +- memcpy(data->brutS,data->brutT,resx * resy * 2 * sizeof(int)); +- memcpy(data->brutD,data->brutT,resx * resy * 2 * sizeof(int)); +- } +- +- /* generation du buffer de trans */ +- if (data->interlace_start == -1) { +- +- /* sauvegarde de l'etat actuel dans la nouvelle source +- * TODO: write that in MMX (has been done in previous version, but did not follow some new fonctionnalities) */ +- y = data->prevX * data->prevY * 2; +- for (x = 0; x < y; x += 2) { +- int brutSmypos = data->brutS[x]; +- int x2 = x + 1; +- +- data->brutS[x] = brutSmypos + (((data->brutD[x] - brutSmypos) * data->buffratio) >> BUFFPOINTNB); +- brutSmypos = data->brutS[x2]; +- data->brutS[x2] = brutSmypos + (((data->brutD[x2] - brutSmypos) * data->buffratio) >> BUFFPOINTNB); +- } +- data->buffratio = 0; +- } +- +- if (data->interlace_start == -1) { +- signed int * tmp; +- tmp = data->brutD; +- data->brutD=data->brutT; +- data->brutT=tmp; +- tmp = data->freebrutD; +- data->freebrutD=data->freebrutT; +- data->freebrutT=tmp; +- data->interlace_start = -2; +- } +- +- if (data->interlace_start>=0) +- { +- /* creation de la nouvelle destination */ +- makeZoomBufferStripe(data,resy/16); +- } +- +- if (switchIncr != 0) { +- data->buffratio += switchIncr; +- if (data->buffratio > BUFFPOINTMASK) +- data->buffratio = BUFFPOINTMASK; +- } +- +- if (switchMult != 1.0f) { +- data->buffratio = (int) ((float) BUFFPOINTMASK * (1.0f - switchMult) + +- (float) data->buffratio * switchMult); +- } +- +- data->zoom_width = data->prevX; +- +- goomInfo->methods.zoom_filter (data->prevX, data->prevY, pix1, pix2, +- data->brutS, data->brutD, data->buffratio, data->precalCoef); +-} +- +-static void generatePrecalCoef (int precalCoef[16][16]) +-{ +- int coefh, coefv; +- +- for (coefh = 0; coefh < 16; coefh++) { +- for (coefv = 0; coefv < 16; coefv++) { +- +- int i; +- int diffcoeffh; +- int diffcoeffv; +- +- diffcoeffh = sqrtperte - coefh; +- diffcoeffv = sqrtperte - coefv; +- +- if (!(coefh || coefv)) { +- i = 255; +- } +- else { +- int i1, i2, i3, i4; +- +- i1 = diffcoeffh * diffcoeffv; +- i2 = coefh * diffcoeffv; +- i3 = diffcoeffh * coefv; +- i4 = coefh * coefv; +- +- // TODO: faire mieux... +- if (i1) i1--; +- if (i2) i2--; +- if (i3) i3--; +- if (i4) i4--; +- +- i = (i1) | (i2 << 8) | (i3 << 16) | (i4 << 24); +- } +- precalCoef[coefh][coefv] = i; +- } +- } +-} +- +-/* VisualFX Wrapper */ +- +-static void zoomFilterVisualFXWrapper_init (struct _VISUAL_FX *_this, PluginInfo *info) +-{ +- ZoomFilterFXWrapperData *data = (ZoomFilterFXWrapperData*)malloc(sizeof(ZoomFilterFXWrapperData)); +- +- data->coeffs = 0; +- data->freecoeffs = 0; +- data->brutS = 0; +- data->freebrutS = 0; +- data->brutD = 0; +- data->freebrutD = 0; +- data->brutT = 0; +- data->freebrutT = 0; +- data->prevX = 0; +- data->prevY = 0; +- +- data->mustInitBuffers = 1; +- data->interlace_start = -2; +- +- data->general_speed = 0.0f; +- data->reverse = 0; +- data->theMode = AMULETTE_MODE; +- data->waveEffect = 0; +- data->hypercosEffect = 0; +- data->vPlaneEffect = 0; +- data->hPlaneEffect = 0; +- data->noisify = 2; +- +- /** modif by jeko : fixedpoint : buffration = (16:16) (donc 0<=buffration<=2^16) */ +- data->buffratio = 0; +- data->firedec = 0; +- +- data->wave = data->wavesp = 0; +- +- data->enabled_bp = secure_b_param("Enabled", 1); +- +- data->params = plugin_parameters ("Zoom Filter", 1); +- data->params.params[0] = &data->enabled_bp; +- +- _this->params = &data->params; +- _this->fx_data = (void*)data; +- +- /** modif d'optim by Jeko : precalcul des 4 coefs resultant des 2 pos */ +- generatePrecalCoef(data->precalCoef); +-} +- +-static void zoomFilterVisualFXWrapper_free (struct _VISUAL_FX *_this) +-{ +- free(_this->fx_data); +-} +- +-static void zoomFilterVisualFXWrapper_apply (struct _VISUAL_FX *_this, Pixel *src, Pixel *dest, PluginInfo *info) +-{ +-} +- +-VisualFX zoomFilterVisualFXWrapper_create(void) +-{ +- VisualFX fx; +- fx.init = zoomFilterVisualFXWrapper_init; +- fx.free = zoomFilterVisualFXWrapper_free; +- fx.apply = zoomFilterVisualFXWrapper_apply; +- return fx; +-} +- +- +-/* TODO : MOVE THIS AWAY */ +- +-void pointFilter (PluginInfo *goomInfo, Pixel * pix1, Color c, float t1, float t2, float t3, float t4, Uint cycle) +-{ +- Uint x = (Uint) ((int) (goomInfo->screen.width / 2) +- + (int) (t1 * cos ((float) cycle / t3))); +- Uint y = (Uint) ((int) (goomInfo->screen.height/2) +- + (int) (t2 * sin ((float) cycle / t4))); +- +- if ((x > 1) && (y > 1) && (x < goomInfo->screen.width - 2) && (y < goomInfo->screen.height - 2)) { +- setPixelRGB (goomInfo, pix1, x + 1, y, c); +- setPixelRGB (goomInfo, pix1, x, y + 1, c); +- setPixelRGB (goomInfo, pix1, x + 1, y + 1, WHITE); +- setPixelRGB (goomInfo, pix1, x + 2, y + 1, c); +- setPixelRGB (goomInfo, pix1, x + 1, y + 2, c); +- } +-} +diff -Naur /home/d4rk/goom2k4-0/src/filters.c.rej /src/filters.c.rej +--- /home/d4rk/goom2k4-0/src/filters.c.rej 2005-02-07 06:46:41.000000000 -0700 ++++ /src/filters.c.rej 1969-12-31 17:00:00.000000000 -0700 +@@ -1,31 +0,0 @@ +-*************** +-*** 427,439 **** +- brutSmypos = brutS[myPos2]; +- py = brutSmypos + (((brutD[myPos2] - brutSmypos) * buffratio) >> BUFFPOINTNB); +- +- pos = ((px >> PERTEDEC) + prevX * (py >> PERTEDEC)); +- /* coef en modulo 15 */ +- coeffs = precalCoef[px & PERTEMASK][py & PERTEMASK]; +-- +-- if ((py >= (signed int)ay) || (px >= (signed int)ax)) { +-- pos = coeffs = 0; +-- } +- +- getPixelRGB_ (expix1, pos, &col1); +- getPixelRGB_ (expix1, pos + 1, &col2); +---- 427,441 ---- +- brutSmypos = brutS[myPos2]; +- py = brutSmypos + (((brutD[myPos2] - brutSmypos) * buffratio) >> BUFFPOINTNB); +- +-+ +-+ if ((py >= ay) || (px >= ax)) { +-+ pos = coeffs = 0; +-+ } else { +- pos = ((px >> PERTEDEC) + prevX * (py >> PERTEDEC)); +- /* coef en modulo 15 */ +- coeffs = precalCoef[px & PERTEMASK][py & PERTEMASK]; +-+ } +-+ +- +- getPixelRGB_ (expix1, pos, &col1); +- getPixelRGB_ (expix1, pos + 1, &col2); +diff -Naur /home/d4rk/goom2k4-0/src/filters_mmx.s /src/filters_mmx.s +--- /home/d4rk/goom2k4-0/src/filters_mmx.s 2005-02-07 06:46:41.000000000 -0700 ++++ /src/filters_mmx.s 1969-12-31 17:00:00.000000000 -0700 +@@ -1,200 +0,0 @@ +-;// file : mmx_zoom.s +-;// author : JC Hoelt <jeko@free.fr> +-;// +-;// history +-;// 07/01/2001 : Changing FEMMS to EMMS : slower... but run on intel machines +-;// 03/01/2001 : WIDTH and HEIGHT are now variable +-;// 28/12/2000 : adding comments to the code, suppress some useless lines +-;// 27/12/2000 : reducing memory access... improving performance by 20% +-;// coefficients are now on 1 byte +-;// 22/12/2000 : Changing data structure +-;// 16/12/2000 : AT&T version +-;// 14/12/2000 : unrolling loop +-;// 12/12/2000 : 64 bits memory access +- +- +-.data +- +-chaine: +- .string "pos = %d\n\0" +- .long 0x0 +- +-thezero: +- .long 0x00000000 +- .long 0x00000000 +- +-.text +- +-.globl mmx_zoom ;// name of the function to call by C program +-/* .extern coeffs ;// the transformation buffer */ +-.extern expix1,expix2 ;// the source and destination buffer +-.extern mmx_zoom_size, zoom_width ;// size of the buffers +- +-.extern brutS,brutD,buffratio,precalCoef,prevX,prevY +- +-#define PERTEMASK 15 +-/* faire : a / sqrtperte <=> a >> PERTEDEC*/ +-#define PERTEDEC 4 +- +-.align 16 +-mmx_zoom: +- +- pushl %ebp +- movl %esp,%ebp +- subl $12,%esp +- +- movl prevX,%eax +- decl %eax +- sarl $4,%eax +- movl %eax,-4(%ebp) +- +- movl prevY,%eax +- decl %eax +- sarl $4,%eax +- movl %eax,-8(%ebp) +- +-;// initialisation du mm7 à zero +- movq (thezero), %mm7 +- +-movl mmx_zoom_size, %ecx +-decl %ecx +- +-.while: +- ;// esi <- nouvelle position +- movl brutS, %eax +- leal (%eax, %ecx, 8),%eax +- +- movl (%eax),%edx /* = brutS.px (brutSmypos) */ +- movl 4(%eax),%eax /* = brutS.py */ +- +- movl brutD,%ebx +- leal (%ebx, %ecx, 8),%ebx +- movl (%ebx),%esi +- subl %edx, %esi +- imull buffratio,%esi +- sarl $16,%esi +- addl %edx,%esi /* esi = px */ +- +- /* eax contient deja brutS.py = le nouveau brutSmypos*/ +- /* ebx pointe sur brutD[myPos] */ +- movl 4(%ebx),%edi +- subl %eax,%edi +- imull buffratio,%edi +- sarl $16,%edi +- addl %eax,%edi /* edi = py */ +- +-/* pushl %eax +- pushl %ebx*/ +-/* popl %ebx +- popl %eax*/ +- +- movl %esi,%eax +- andl $15,%eax /* eax = coefh */ +- movl %edi,%ebx +- andl $15,%ebx /* ebx = coefv */ +- +- leal 0(,%ebx,4),%ebx +- sall $6,%eax +- addl %ebx,%eax +- movl $precalCoef,%ebx +-/* movd (%eax,%ebx),%mm6*/ /* mm6 = coeffs */ +- +- cmpl -8(%ebp),%edi +- jge .then1 +- cmpl -4(%ebp),%esi +- jge .then1 +- +- sarl $4,%esi +- sarl $4,%edi +- imull zoom_width,%edi +- leal (%esi,%edi),%esi +- jmp .finsi1 +- +-.then1: +- movl $0,%esi +-.finsi1: +- +- /** apres ce calcul, %esi = pos, %mm6 = coeffs **/ +-/* pushl %esi +- pushl $chaine +- call printf +- addl $8,%esp*/ +- +- movl expix1,%eax +- +- ;// recuperation des deux premiers pixels dans mm0 et mm1 +-/* movq (%eax,%esi,4), %mm0 /* b1-v1-r1-a1-b2-v2-r2-a2 */ +- movq %mm0, %mm1 /* b1-v1-r1-a1-b2-v2-r2-a2 */ +- +- ;// depackage du premier pixel +- punpcklbw %mm7, %mm0 /* 00-b2-00-v2-00-r2-00-a2 */ +- +- movq %mm6, %mm5 /* ??-??-??-??-c4-c3-c2-c1 */ +- ;// depackage du 2ieme pixel +- punpckhbw %mm7, %mm1 /* 00-b1-00-v1-00-r1-00-a1 */ +- +- ;// extraction des coefficients... +- punpcklbw %mm5, %mm6 /* c4-c4-c3-c3-c2-c2-c1-c1 */ +- movq %mm6, %mm4 /* c4-c4-c3-c3-c2-c2-c1-c1 */ +- movq %mm6, %mm5 /* c4-c4-c3-c3-c2-c2-c1-c1 */ +- +- punpcklbw %mm5, %mm6 /* c2-c2-c2-c2-c1-c1-c1-c1 */ +- punpckhbw %mm5, %mm4 /* c4-c4-c4-c4-c3-c3-c3-c3 */ +- +- movq %mm6, %mm3 /* c2-c2-c2-c2-c1-c1-c1-c1 */ +- punpcklbw %mm7, %mm6 /* 00-c1-00-c1-00-c1-00-c1 */ +- punpckhbw %mm7, %mm3 /* 00-c2-00-c2-00-c2-00-c2 */ +- +- ;// multiplication des pixels par les coefficients +- pmullw %mm6, %mm0 /* c1*b2-c1*v2-c1*r2-c1*a2 */ +- pmullw %mm3, %mm1 /* c2*b1-c2*v1-c2*r1-c2*a1 */ +- paddw %mm1, %mm0 +- +- ;// ...extraction des 2 derniers coefficients +- movq %mm4, %mm5 /* c4-c4-c4-c4-c3-c3-c3-c3 */ +- punpcklbw %mm7, %mm4 /* 00-c3-00-c3-00-c3-00-c3 */ +- punpckhbw %mm7, %mm5 /* 00-c4-00-c4-00-c4-00-c4 */ +- +- /* ajouter la longueur de ligne a esi */ +- addl prevX,%esi +- +- ;// recuperation des 2 derniers pixels +-/* movq (%eax,%esi,4), %mm1*/ +- movq %mm1, %mm2 +- +- ;// depackage des pixels +- punpcklbw %mm7, %mm1 +- punpckhbw %mm7, %mm2 +- +- ;// multiplication pas les coeffs +- pmullw %mm4, %mm1 +- pmullw %mm5, %mm2 +- +- ;// ajout des valeurs obtenues à la valeur finale +- paddw %mm1, %mm0 +- paddw %mm2, %mm0 +- +- ;// division par 256 = 16+16+16+16, puis repackage du pixel final +- psrlw $8, %mm0 +- packuswb %mm7, %mm0 +- +- ;// passage au suivant +- +- ;// enregistrement du resultat +- movl expix2,%eax +-/* movd %mm0,(%eax,%ecx,4)*/ +- +- decl %ecx +- ;// test de fin du tantque +- cmpl $0, %ecx ;// 400x300 +- +- jz .fin_while +- jmp .while +- +-.fin_while: +- emms +- +- movl %ebp,%esp +- popl %ebp +- +- ret ;//The End +diff -Naur /home/d4rk/goom2k4-0/src/filter_test/mmx.h /src/filter_test/mmx.h +--- /home/d4rk/goom2k4-0/src/filter_test/mmx.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/filter_test/mmx.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,705 +0,0 @@ +-/* mmx.h +- +- MultiMedia eXtensions GCC interface library for IA32. +- +- To use this library, simply include this header file +- and compile with GCC. You MUST have inlining enabled +- in order for mmx_ok() to work; this can be done by +- simply using -O on the GCC command line. +- +- Compiling with -DMMX_TRACE will cause detailed trace +- output to be sent to stderr for each mmx operation. +- This adds lots of code, and obviously slows execution to +- a crawl, but can be very useful for debugging. +- +- THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY +- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT +- LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY +- AND FITNESS FOR ANY PARTICULAR PURPOSE. +- +- 1997-99 by H. Dietz and R. Fisher +- +- Notes: +- It appears that the latest gas has the pand problem fixed, therefore +- I'll undefine BROKEN_PAND by default. +-*/ +- +-#ifndef _MMX_H +-#define _MMX_H +- +-/* Warning: at this writing, the version of GAS packaged +- with most Linux distributions does not handle the +- parallel AND operation mnemonic correctly. If the +- symbol BROKEN_PAND is defined, a slower alternative +- coding will be used. If execution of mmxtest results +- in an illegal instruction fault, define this symbol. +-*/ +-#undef BROKEN_PAND +- +- +-/* The type of an value that fits in an MMX register +- (note that long long constant values MUST be suffixed +- by LL and unsigned long long values by ULL, lest +- they be truncated by the compiler) +-*/ +-typedef union { +- long long q; /* Quadword (64-bit) value */ +- unsigned long long uq; /* Unsigned Quadword */ +- int d[2]; /* 2 Doubleword (32-bit) values */ +- unsigned int ud[2]; /* 2 Unsigned Doubleword */ +- short w[4]; /* 4 Word (16-bit) values */ +- unsigned short uw[4]; /* 4 Unsigned Word */ +- char b[8]; /* 8 Byte (8-bit) values */ +- unsigned char ub[8]; /* 8 Unsigned Byte */ +- float s[2]; /* Single-precision (32-bit) value */ +-} __attribute__ ((aligned (8))) mmx_t; /* On an 8-byte (64-bit) boundary */ +- +- +- +-/* Function to test if multimedia instructions are supported... +-*/ +-inline extern int +-mm_support(void) +-{ +- /* Returns 1 if MMX instructions are supported, +- 3 if Cyrix MMX and Extended MMX instructions are supported +- 5 if AMD MMX and 3DNow! instructions are supported +- 0 if hardware does not support any of these +- */ +- register int rval = 0; +- +- __asm__ __volatile__ ( +- /* See if CPUID instruction is supported ... */ +- /* ... Get copies of EFLAGS into eax and ecx */ +- "pushf\n\t" +- "popl %%eax\n\t" +- "movl %%eax, %%ecx\n\t" +- +- /* ... Toggle the ID bit in one copy and store */ +- /* to the EFLAGS reg */ +- "xorl $0x200000, %%eax\n\t" +- "push %%eax\n\t" +- "popf\n\t" +- +- /* ... Get the (hopefully modified) EFLAGS */ +- "pushf\n\t" +- "popl %%eax\n\t" +- +- /* ... Compare and test result */ +- "xorl %%eax, %%ecx\n\t" +- "testl $0x200000, %%ecx\n\t" +- "jz NotSupported1\n\t" /* CPUID not supported */ +- +- +- /* Get standard CPUID information, and +- go to a specific vendor section */ +- "movl $0, %%eax\n\t" +- "cpuid\n\t" +- +- /* Check for Intel */ +- "cmpl $0x756e6547, %%ebx\n\t" +- "jne TryAMD\n\t" +- "cmpl $0x49656e69, %%edx\n\t" +- "jne TryAMD\n\t" +- "cmpl $0x6c65746e, %%ecx\n" +- "jne TryAMD\n\t" +- "jmp Intel\n\t" +- +- /* Check for AMD */ +- "\nTryAMD:\n\t" +- "cmpl $0x68747541, %%ebx\n\t" +- "jne TryCyrix\n\t" +- "cmpl $0x69746e65, %%edx\n\t" +- "jne TryCyrix\n\t" +- "cmpl $0x444d4163, %%ecx\n" +- "jne TryCyrix\n\t" +- "jmp AMD\n\t" +- +- /* Check for Cyrix */ +- "\nTryCyrix:\n\t" +- "cmpl $0x69727943, %%ebx\n\t" +- "jne NotSupported2\n\t" +- "cmpl $0x736e4978, %%edx\n\t" +- "jne NotSupported3\n\t" +- "cmpl $0x64616574, %%ecx\n\t" +- "jne NotSupported4\n\t" +- /* Drop through to Cyrix... */ +- +- +- /* Cyrix Section */ +- /* See if extended CPUID level 80000001 is supported */ +- /* The value of CPUID/80000001 for the 6x86MX is undefined +- according to the Cyrix CPU Detection Guide (Preliminary +- Rev. 1.01 table 1), so we'll check the value of eax for +- CPUID/0 to see if standard CPUID level 2 is supported. +- According to the table, the only CPU which supports level +- 2 is also the only one which supports extended CPUID levels. +- */ +- "cmpl $0x2, %%eax\n\t" +- "jne MMXtest\n\t" /* Use standard CPUID instead */ +- +- /* Extended CPUID supported (in theory), so get extended +- features */ +- "movl $0x80000001, %%eax\n\t" +- "cpuid\n\t" +- "testl $0x00800000, %%eax\n\t" /* Test for MMX */ +- "jz NotSupported5\n\t" /* MMX not supported */ +- "testl $0x01000000, %%eax\n\t" /* Test for Ext'd MMX */ +- "jnz EMMXSupported\n\t" +- "movl $1, %0:\n\n\t" /* MMX Supported */ +- "jmp Return\n\n" +- "EMMXSupported:\n\t" +- "movl $3, %0:\n\n\t" /* EMMX and MMX Supported */ +- "jmp Return\n\t" +- +- +- /* AMD Section */ +- "AMD:\n\t" +- +- /* See if extended CPUID is supported */ +- "movl $0x80000000, %%eax\n\t" +- "cpuid\n\t" +- "cmpl $0x80000000, %%eax\n\t" +- "jl MMXtest\n\t" /* Use standard CPUID instead */ +- +- /* Extended CPUID supported, so get extended features */ +- "movl $0x80000001, %%eax\n\t" +- "cpuid\n\t" +- "testl $0x00800000, %%edx\n\t" /* Test for MMX */ +- "jz NotSupported6\n\t" /* MMX not supported */ +- "testl $0x80000000, %%edx\n\t" /* Test for 3DNow! */ +- "jnz ThreeDNowSupported\n\t" +- "movl $1, %0:\n\n\t" /* MMX Supported */ +- "jmp Return\n\n" +- "ThreeDNowSupported:\n\t" +- "movl $5, %0:\n\n\t" /* 3DNow! and MMX Supported */ +- "jmp Return\n\t" +- +- +- /* Intel Section */ +- "Intel:\n\t" +- +- /* Check for MMX */ +- "MMXtest:\n\t" +- "movl $1, %%eax\n\t" +- "cpuid\n\t" +- "testl $0x00800000, %%edx\n\t" /* Test for MMX */ +- "jz NotSupported7\n\t" /* MMX Not supported */ +- "movl $1, %0:\n\n\t" /* MMX Supported */ +- "jmp Return\n\t" +- +- /* Nothing supported */ +- "\nNotSupported1:\n\t" +- "#movl $101, %0:\n\n\t" +- "\nNotSupported2:\n\t" +- "#movl $102, %0:\n\n\t" +- "\nNotSupported3:\n\t" +- "#movl $103, %0:\n\n\t" +- "\nNotSupported4:\n\t" +- "#movl $104, %0:\n\n\t" +- "\nNotSupported5:\n\t" +- "#movl $105, %0:\n\n\t" +- "\nNotSupported6:\n\t" +- "#movl $106, %0:\n\n\t" +- "\nNotSupported7:\n\t" +- "#movl $107, %0:\n\n\t" +- "movl $0, %0:\n\n\t" +- +- "Return:\n\t" +- : "=a" (rval) +- : /* no input */ +- : "eax", "ebx", "ecx", "edx" +- ); +- +- /* Return */ +- return(rval); +-} +- +-/* Function to test if mmx instructions are supported... +-*/ +-inline extern int +-mmx_ok(void) +-{ +- /* Returns 1 if MMX instructions are supported, 0 otherwise */ +- return ( mm_support() & 0x1 ); +-} +- +- +-/* Helper functions for the instruction macros that follow... +- (note that memory-to-register, m2r, instructions are nearly +- as efficient as register-to-register, r2r, instructions; +- however, memory-to-memory instructions are really simulated +- as a convenience, and are only 1/3 as efficient) +-*/ +-#ifdef MMX_TRACE +- +-/* Include the stuff for printing a trace to stderr... +-*/ +- +-#include <stdio.h> +- +-#define mmx_i2r(op, imm, reg) \ +- { \ +- mmx_t mmx_trace; \ +- mmx_trace.uq = (imm); \ +- printf(#op "_i2r(" #imm "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#reg "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ (#op " %0, %%" #reg \ +- : /* nothing */ \ +- : "X" (imm)); \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#reg "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#define mmx_m2r(op, mem, reg) \ +- { \ +- mmx_t mmx_trace; \ +- mmx_trace = (mem); \ +- printf(#op "_m2r(" #mem "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#reg "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ (#op " %0, %%" #reg \ +- : /* nothing */ \ +- : "X" (mem)); \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#reg "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#define mmx_r2m(op, reg, mem) \ +- { \ +- mmx_t mmx_trace; \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#op "_r2m(" #reg "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- mmx_trace = (mem); \ +- printf(#mem "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ (#op " %%" #reg ", %0" \ +- : "=X" (mem) \ +- : /* nothing */ ); \ +- mmx_trace = (mem); \ +- printf(#mem "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#define mmx_r2r(op, regs, regd) \ +- { \ +- mmx_t mmx_trace; \ +- __asm__ __volatile__ ("movq %%" #regs ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#op "_r2r(" #regs "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ ("movq %%" #regd ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#regd "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ (#op " %" #regs ", %" #regd); \ +- __asm__ __volatile__ ("movq %%" #regd ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#regd "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#define mmx_m2m(op, mems, memd) \ +- { \ +- mmx_t mmx_trace; \ +- mmx_trace = (mems); \ +- printf(#op "_m2m(" #mems "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- mmx_trace = (memd); \ +- printf(#memd "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ +- #op " %1, %%mm0\n\t" \ +- "movq %%mm0, %0" \ +- : "=X" (memd) \ +- : "X" (mems)); \ +- mmx_trace = (memd); \ +- printf(#memd "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#else +- +-/* These macros are a lot simpler without the tracing... +-*/ +- +-#define mmx_i2r(op, imm, reg) \ +- __asm__ __volatile__ (#op " %0, %%" #reg \ +- : /* nothing */ \ +- : "X" (imm) ) +- +-#define mmx_m2r(op, mem, reg) \ +- __asm__ __volatile__ (#op " %0, %%" #reg \ +- : /* nothing */ \ +- : "X" (mem)) +- +-#define mmx_r2m(op, reg, mem) \ +- __asm__ __volatile__ (#op " %%" #reg ", %0" \ +- : "=X" (mem) \ +- : /* nothing */ ) +- +-#define mmx_r2r(op, regs, regd) \ +- __asm__ __volatile__ (#op " %" #regs ", %" #regd) +- +-#define mmx_m2m(op, mems, memd) \ +- __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ +- #op " %1, %%mm0\n\t" \ +- "movq %%mm0, %0" \ +- : "=X" (memd) \ +- : "X" (mems)) +- +-#endif +- +- +-/* 1x64 MOVe Quadword +- (this is both a load and a store... +- in fact, it is the only way to store) +-*/ +-#define movq_m2r(var, reg) mmx_m2r(movq, var, reg) +-#define movq_r2m(reg, var) mmx_r2m(movq, reg, var) +-#define movq_r2r(regs, regd) mmx_r2r(movq, regs, regd) +-#define movq(vars, vard) \ +- __asm__ __volatile__ ("movq %1, %%mm0\n\t" \ +- "movq %%mm0, %0" \ +- : "=X" (vard) \ +- : "X" (vars)) +- +- +-/* 1x32 MOVe Doubleword +- (like movq, this is both load and store... +- but is most useful for moving things between +- mmx registers and ordinary registers) +-*/ +-#define movd_m2r(var, reg) mmx_m2r(movd, var, reg) +-#define movd_r2m(reg, var) mmx_r2m(movd, reg, var) +-#define movd_r2r(regs, regd) mmx_r2r(movd, regs, regd) +-#define movd(vars, vard) \ +- __asm__ __volatile__ ("movd %1, %%mm0\n\t" \ +- "movd %%mm0, %0" \ +- : "=X" (vard) \ +- : "X" (vars)) +- +- +-/* 2x32, 4x16, and 8x8 Parallel ADDs +-*/ +-#define paddd_m2r(var, reg) mmx_m2r(paddd, var, reg) +-#define paddd_r2r(regs, regd) mmx_r2r(paddd, regs, regd) +-#define paddd(vars, vard) mmx_m2m(paddd, vars, vard) +- +-#define paddw_m2r(var, reg) mmx_m2r(paddw, var, reg) +-#define paddw_r2r(regs, regd) mmx_r2r(paddw, regs, regd) +-#define paddw(vars, vard) mmx_m2m(paddw, vars, vard) +- +-#define paddb_m2r(var, reg) mmx_m2r(paddb, var, reg) +-#define paddb_r2r(regs, regd) mmx_r2r(paddb, regs, regd) +-#define paddb(vars, vard) mmx_m2m(paddb, vars, vard) +- +- +-/* 4x16 and 8x8 Parallel ADDs using Saturation arithmetic +-*/ +-#define paddsw_m2r(var, reg) mmx_m2r(paddsw, var, reg) +-#define paddsw_r2r(regs, regd) mmx_r2r(paddsw, regs, regd) +-#define paddsw(vars, vard) mmx_m2m(paddsw, vars, vard) +- +-#define paddsb_m2r(var, reg) mmx_m2r(paddsb, var, reg) +-#define paddsb_r2r(regs, regd) mmx_r2r(paddsb, regs, regd) +-#define paddsb(vars, vard) mmx_m2m(paddsb, vars, vard) +- +- +-/* 4x16 and 8x8 Parallel ADDs using Unsigned Saturation arithmetic +-*/ +-#define paddusw_m2r(var, reg) mmx_m2r(paddusw, var, reg) +-#define paddusw_r2r(regs, regd) mmx_r2r(paddusw, regs, regd) +-#define paddusw(vars, vard) mmx_m2m(paddusw, vars, vard) +- +-#define paddusb_m2r(var, reg) mmx_m2r(paddusb, var, reg) +-#define paddusb_r2r(regs, regd) mmx_r2r(paddusb, regs, regd) +-#define paddusb(vars, vard) mmx_m2m(paddusb, vars, vard) +- +- +-/* 2x32, 4x16, and 8x8 Parallel SUBs +-*/ +-#define psubd_m2r(var, reg) mmx_m2r(psubd, var, reg) +-#define psubd_r2r(regs, regd) mmx_r2r(psubd, regs, regd) +-#define psubd(vars, vard) mmx_m2m(psubd, vars, vard) +- +-#define psubw_m2r(var, reg) mmx_m2r(psubw, var, reg) +-#define psubw_r2r(regs, regd) mmx_r2r(psubw, regs, regd) +-#define psubw(vars, vard) mmx_m2m(psubw, vars, vard) +- +-#define psubb_m2r(var, reg) mmx_m2r(psubb, var, reg) +-#define psubb_r2r(regs, regd) mmx_r2r(psubb, regs, regd) +-#define psubb(vars, vard) mmx_m2m(psubb, vars, vard) +- +- +-/* 4x16 and 8x8 Parallel SUBs using Saturation arithmetic +-*/ +-#define psubsw_m2r(var, reg) mmx_m2r(psubsw, var, reg) +-#define psubsw_r2r(regs, regd) mmx_r2r(psubsw, regs, regd) +-#define psubsw(vars, vard) mmx_m2m(psubsw, vars, vard) +- +-#define psubsb_m2r(var, reg) mmx_m2r(psubsb, var, reg) +-#define psubsb_r2r(regs, regd) mmx_r2r(psubsb, regs, regd) +-#define psubsb(vars, vard) mmx_m2m(psubsb, vars, vard) +- +- +-/* 4x16 and 8x8 Parallel SUBs using Unsigned Saturation arithmetic +-*/ +-#define psubusw_m2r(var, reg) mmx_m2r(psubusw, var, reg) +-#define psubusw_r2r(regs, regd) mmx_r2r(psubusw, regs, regd) +-#define psubusw(vars, vard) mmx_m2m(psubusw, vars, vard) +- +-#define psubusb_m2r(var, reg) mmx_m2r(psubusb, var, reg) +-#define psubusb_r2r(regs, regd) mmx_r2r(psubusb, regs, regd) +-#define psubusb(vars, vard) mmx_m2m(psubusb, vars, vard) +- +- +-/* 4x16 Parallel MULs giving Low 4x16 portions of results +-*/ +-#define pmullw_m2r(var, reg) mmx_m2r(pmullw, var, reg) +-#define pmullw_r2r(regs, regd) mmx_r2r(pmullw, regs, regd) +-#define pmullw(vars, vard) mmx_m2m(pmullw, vars, vard) +- +- +-/* 4x16 Parallel MULs giving High 4x16 portions of results +-*/ +-#define pmulhw_m2r(var, reg) mmx_m2r(pmulhw, var, reg) +-#define pmulhw_r2r(regs, regd) mmx_r2r(pmulhw, regs, regd) +-#define pmulhw(vars, vard) mmx_m2m(pmulhw, vars, vard) +- +- +-/* 4x16->2x32 Parallel Mul-ADD +- (muls like pmullw, then adds adjacent 16-bit fields +- in the multiply result to make the final 2x32 result) +-*/ +-#define pmaddwd_m2r(var, reg) mmx_m2r(pmaddwd, var, reg) +-#define pmaddwd_r2r(regs, regd) mmx_r2r(pmaddwd, regs, regd) +-#define pmaddwd(vars, vard) mmx_m2m(pmaddwd, vars, vard) +- +- +-/* 1x64 bitwise AND +-*/ +-#ifdef BROKEN_PAND +-#define pand_m2r(var, reg) \ +- { \ +- mmx_m2r(pandn, (mmx_t) -1LL, reg); \ +- mmx_m2r(pandn, var, reg); \ +- } +-#define pand_r2r(regs, regd) \ +- { \ +- mmx_m2r(pandn, (mmx_t) -1LL, regd); \ +- mmx_r2r(pandn, regs, regd) \ +- } +-#define pand(vars, vard) \ +- { \ +- movq_m2r(vard, mm0); \ +- mmx_m2r(pandn, (mmx_t) -1LL, mm0); \ +- mmx_m2r(pandn, vars, mm0); \ +- movq_r2m(mm0, vard); \ +- } +-#else +-#define pand_m2r(var, reg) mmx_m2r(pand, var, reg) +-#define pand_r2r(regs, regd) mmx_r2r(pand, regs, regd) +-#define pand(vars, vard) mmx_m2m(pand, vars, vard) +-#endif +- +- +-/* 1x64 bitwise AND with Not the destination +-*/ +-#define pandn_m2r(var, reg) mmx_m2r(pandn, var, reg) +-#define pandn_r2r(regs, regd) mmx_r2r(pandn, regs, regd) +-#define pandn(vars, vard) mmx_m2m(pandn, vars, vard) +- +- +-/* 1x64 bitwise OR +-*/ +-#define por_m2r(var, reg) mmx_m2r(por, var, reg) +-#define por_r2r(regs, regd) mmx_r2r(por, regs, regd) +-#define por(vars, vard) mmx_m2m(por, vars, vard) +- +- +-/* 1x64 bitwise eXclusive OR +-*/ +-#define pxor_m2r(var, reg) mmx_m2r(pxor, var, reg) +-#define pxor_r2r(regs, regd) mmx_r2r(pxor, regs, regd) +-#define pxor(vars, vard) mmx_m2m(pxor, vars, vard) +- +- +-/* 2x32, 4x16, and 8x8 Parallel CoMPare for EQuality +- (resulting fields are either 0 or -1) +-*/ +-#define pcmpeqd_m2r(var, reg) mmx_m2r(pcmpeqd, var, reg) +-#define pcmpeqd_r2r(regs, regd) mmx_r2r(pcmpeqd, regs, regd) +-#define pcmpeqd(vars, vard) mmx_m2m(pcmpeqd, vars, vard) +- +-#define pcmpeqw_m2r(var, reg) mmx_m2r(pcmpeqw, var, reg) +-#define pcmpeqw_r2r(regs, regd) mmx_r2r(pcmpeqw, regs, regd) +-#define pcmpeqw(vars, vard) mmx_m2m(pcmpeqw, vars, vard) +- +-#define pcmpeqb_m2r(var, reg) mmx_m2r(pcmpeqb, var, reg) +-#define pcmpeqb_r2r(regs, regd) mmx_r2r(pcmpeqb, regs, regd) +-#define pcmpeqb(vars, vard) mmx_m2m(pcmpeqb, vars, vard) +- +- +-/* 2x32, 4x16, and 8x8 Parallel CoMPare for Greater Than +- (resulting fields are either 0 or -1) +-*/ +-#define pcmpgtd_m2r(var, reg) mmx_m2r(pcmpgtd, var, reg) +-#define pcmpgtd_r2r(regs, regd) mmx_r2r(pcmpgtd, regs, regd) +-#define pcmpgtd(vars, vard) mmx_m2m(pcmpgtd, vars, vard) +- +-#define pcmpgtw_m2r(var, reg) mmx_m2r(pcmpgtw, var, reg) +-#define pcmpgtw_r2r(regs, regd) mmx_r2r(pcmpgtw, regs, regd) +-#define pcmpgtw(vars, vard) mmx_m2m(pcmpgtw, vars, vard) +- +-#define pcmpgtb_m2r(var, reg) mmx_m2r(pcmpgtb, var, reg) +-#define pcmpgtb_r2r(regs, regd) mmx_r2r(pcmpgtb, regs, regd) +-#define pcmpgtb(vars, vard) mmx_m2m(pcmpgtb, vars, vard) +- +- +-/* 1x64, 2x32, and 4x16 Parallel Shift Left Logical +-*/ +-#define psllq_i2r(imm, reg) mmx_i2r(psllq, imm, reg) +-#define psllq_m2r(var, reg) mmx_m2r(psllq, var, reg) +-#define psllq_r2r(regs, regd) mmx_r2r(psllq, regs, regd) +-#define psllq(vars, vard) mmx_m2m(psllq, vars, vard) +- +-#define pslld_i2r(imm, reg) mmx_i2r(pslld, imm, reg) +-#define pslld_m2r(var, reg) mmx_m2r(pslld, var, reg) +-#define pslld_r2r(regs, regd) mmx_r2r(pslld, regs, regd) +-#define pslld(vars, vard) mmx_m2m(pslld, vars, vard) +- +-#define psllw_i2r(imm, reg) mmx_i2r(psllw, imm, reg) +-#define psllw_m2r(var, reg) mmx_m2r(psllw, var, reg) +-#define psllw_r2r(regs, regd) mmx_r2r(psllw, regs, regd) +-#define psllw(vars, vard) mmx_m2m(psllw, vars, vard) +- +- +-/* 1x64, 2x32, and 4x16 Parallel Shift Right Logical +-*/ +-#define psrlq_i2r(imm, reg) mmx_i2r(psrlq, imm, reg) +-#define psrlq_m2r(var, reg) mmx_m2r(psrlq, var, reg) +-#define psrlq_r2r(regs, regd) mmx_r2r(psrlq, regs, regd) +-#define psrlq(vars, vard) mmx_m2m(psrlq, vars, vard) +- +-#define psrld_i2r(imm, reg) mmx_i2r(psrld, imm, reg) +-#define psrld_m2r(var, reg) mmx_m2r(psrld, var, reg) +-#define psrld_r2r(regs, regd) mmx_r2r(psrld, regs, regd) +-#define psrld(vars, vard) mmx_m2m(psrld, vars, vard) +- +-#define psrlw_i2r(imm, reg) mmx_i2r(psrlw, imm, reg) +-#define psrlw_m2r(var, reg) mmx_m2r(psrlw, var, reg) +-#define psrlw_r2r(regs, regd) mmx_r2r(psrlw, regs, regd) +-#define psrlw(vars, vard) mmx_m2m(psrlw, vars, vard) +- +- +-/* 2x32 and 4x16 Parallel Shift Right Arithmetic +-*/ +-#define psrad_i2r(imm, reg) mmx_i2r(psrad, imm, reg) +-#define psrad_m2r(var, reg) mmx_m2r(psrad, var, reg) +-#define psrad_r2r(regs, regd) mmx_r2r(psrad, regs, regd) +-#define psrad(vars, vard) mmx_m2m(psrad, vars, vard) +- +-#define psraw_i2r(imm, reg) mmx_i2r(psraw, imm, reg) +-#define psraw_m2r(var, reg) mmx_m2r(psraw, var, reg) +-#define psraw_r2r(regs, regd) mmx_r2r(psraw, regs, regd) +-#define psraw(vars, vard) mmx_m2m(psraw, vars, vard) +- +- +-/* 2x32->4x16 and 4x16->8x8 PACK and Signed Saturate +- (packs source and dest fields into dest in that order) +-*/ +-#define packssdw_m2r(var, reg) mmx_m2r(packssdw, var, reg) +-#define packssdw_r2r(regs, regd) mmx_r2r(packssdw, regs, regd) +-#define packssdw(vars, vard) mmx_m2m(packssdw, vars, vard) +- +-#define packsswb_m2r(var, reg) mmx_m2r(packsswb, var, reg) +-#define packsswb_r2r(regs, regd) mmx_r2r(packsswb, regs, regd) +-#define packsswb(vars, vard) mmx_m2m(packsswb, vars, vard) +- +- +-/* 4x16->8x8 PACK and Unsigned Saturate +- (packs source and dest fields into dest in that order) +-*/ +-#define packuswb_m2r(var, reg) mmx_m2r(packuswb, var, reg) +-#define packuswb_r2r(regs, regd) mmx_r2r(packuswb, regs, regd) +-#define packuswb(vars, vard) mmx_m2m(packuswb, vars, vard) +- +- +-/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK Low +- (interleaves low half of dest with low half of source +- as padding in each result field) +-*/ +-#define punpckldq_m2r(var, reg) mmx_m2r(punpckldq, var, reg) +-#define punpckldq_r2r(regs, regd) mmx_r2r(punpckldq, regs, regd) +-#define punpckldq(vars, vard) mmx_m2m(punpckldq, vars, vard) +- +-#define punpcklwd_m2r(var, reg) mmx_m2r(punpcklwd, var, reg) +-#define punpcklwd_r2r(regs, regd) mmx_r2r(punpcklwd, regs, regd) +-#define punpcklwd(vars, vard) mmx_m2m(punpcklwd, vars, vard) +- +-#define punpcklbw_m2r(var, reg) mmx_m2r(punpcklbw, var, reg) +-#define punpcklbw_r2r(regs, regd) mmx_r2r(punpcklbw, regs, regd) +-#define punpcklbw(vars, vard) mmx_m2m(punpcklbw, vars, vard) +- +- +-/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK High +- (interleaves high half of dest with high half of source +- as padding in each result field) +-*/ +-#define punpckhdq_m2r(var, reg) mmx_m2r(punpckhdq, var, reg) +-#define punpckhdq_r2r(regs, regd) mmx_r2r(punpckhdq, regs, regd) +-#define punpckhdq(vars, vard) mmx_m2m(punpckhdq, vars, vard) +- +-#define punpckhwd_m2r(var, reg) mmx_m2r(punpckhwd, var, reg) +-#define punpckhwd_r2r(regs, regd) mmx_r2r(punpckhwd, regs, regd) +-#define punpckhwd(vars, vard) mmx_m2m(punpckhwd, vars, vard) +- +-#define punpckhbw_m2r(var, reg) mmx_m2r(punpckhbw, var, reg) +-#define punpckhbw_r2r(regs, regd) mmx_r2r(punpckhbw, regs, regd) +-#define punpckhbw(vars, vard) mmx_m2m(punpckhbw, vars, vard) +- +- +-/* Empty MMx State +- (used to clean-up when going from mmx to float use +- of the registers that are shared by both; note that +- there is no float-to-mmx operation needed, because +- only the float tag word info is corruptible) +-*/ +-#ifdef MMX_TRACE +- +-#define emms() \ +- { \ +- printf("emms()\n"); \ +- __asm__ __volatile__ ("emms"); \ +- } +- +-#else +- +-#define emms() __asm__ __volatile__ ("emms") +- +-#endif +- +-#endif +- +diff -Naur /home/d4rk/goom2k4-0/src/filter_test/px_py_calc.c /src/filter_test/px_py_calc.c +--- /home/d4rk/goom2k4-0/src/filter_test/px_py_calc.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/filter_test/px_py_calc.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,94 +0,0 @@ +-#include "mmx.h" +- +-int testD [] = {0x1200, 0x2011, 0, 0x12, 0x5331, 0x8000}; +-int testS [] = {0x1205, 0x11, 0x4210, 0x412, 0x121, 0x1211}; +- +-int ratios [] = {0x8000, 0x4000, 0x1234, 0x6141, 0xffff, 0}; +- +-int main () { +- int nbERROR = 0; +- int i,j; +- volatile mmx_t ratiox; +- +- volatile mmx_t sortie; +- +- /* creation des variables de test */ +- volatile int buffratio = 0x8000; +- volatile int loop = 0; +- volatile int *buffS; +- volatile int *buffD; +- buffS = malloc (256); +- buffD = malloc (256); +- +- buffS = buffS + (unsigned)buffS % 64; +- buffD = buffD + (unsigned)buffD % 64; +- +- for (j=0;j<6;j++) +- for (i=0;i<3;i++) { +- +- buffratio = ratios[j]; +- +- buffS[0] = testS[i<<1]; +- buffS[1] = testS[(i<<1)+1]; +- +- buffD[0] = testD[i*2]; +- buffD[1] = testD[i*2+1]; +- +- /* code */ +- +- ratiox.d[0] = buffratio; +- ratiox.d[1] = buffratio; +- movq_m2r (ratiox, mm6); +- pslld_i2r (16,mm6); +- +- /* |0hhhhhhh|llllvvvv| +- x |00000000|bbbbbbbb| +- ================= +- |.bl.high|..bl.low| +- + |..bh.low|00000000| +- ================= +- result1 +- */ +- +- /* +- * pre : mm6 = [buffratio<<16|buffratio<<16] +- */ +- +- movq_m2r (buffS[loop],mm0); /* mm0 = S */ +- movq_m2r (buffD[loop],mm1); /* mm1 = D */ +- psubd_r2r (mm0,mm1); /* mm1 = D - S */ +- movq_r2r (mm1, mm2); /* mm2 = D - S */ +- +- pslld_i2r (16,mm1); +- mmx_r2r (pmulhuw, mm6, mm1); /* mm1 = ?? */ +- pmullw_r2r (mm6, mm2); +- +- paddd_r2r (mm2, mm1); /* mm1 = (D - S) * buffratio >> 16 */ +- pslld_i2r (16,mm0); +- +- paddd_r2r (mm1, mm0); /* mm0 = S + mm1 */ +- psrld_i2r (16, mm0); +- movq_r2m (mm0, sortie); +- +- /* +- * post : mm0 = S + ((D-S)*buffratio)>>16 +- * modified = mm0,mm1,mm2 +- */ +- +- if ( +- (buffS[0] + (((buffD[0]-buffS[0]) * buffratio)>>16) != sortie.d[0]) +- | (buffS[1] + (((buffD[1]-buffS[1]) * buffratio)>>16) != sortie.d[1])) +- { +- nbERROR++; +- printf ("\ns : (0x%08x,0x%08x)\n", buffS[0], buffS[1]); +- printf ("d : (0x%08x,0x%08x)\n", buffD[0], buffD[1]); +- printf ("ratio : (0x%08x,0x%08x)\n", buffratio, buffratio); +- +- printf ("en mmx : (0x%08x,0x%08x)\n", sortie.d[0], sortie.d[1]); +- printf ("en c : (0x%08x,0x%08x)\n", +- buffS[0] + (((buffD[0]-buffS[0]) * buffratio)>>16), +- buffS[1] + (((buffD[1]-buffS[1]) * buffratio)>>16)); +- } +- } +- printf ("%d errors\n",nbERROR); +-} +diff -Naur /home/d4rk/goom2k4-0/src/filter_test/zoom_filter_mmx.c /src/filter_test/zoom_filter_mmx.c +--- /home/d4rk/goom2k4-0/src/filter_test/zoom_filter_mmx.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/filter_test/zoom_filter_mmx.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,186 +0,0 @@ +- +-#define BUFFPOINTNB 16 +-#define BUFFPOINTMASK 0xffff +-#define BUFFINCR 0xff +- +-#define sqrtperte 16 +-// faire : a % sqrtperte <=> a & pertemask +-#define PERTEMASK 0xf +-// faire : a / sqrtperte <=> a >> PERTEDEC +-#define PERTEDEC 4 +- +-//#define MMX_TRACE +-#include "mmx.h" +- +-void zoom_filter_mmx (int prevX, int prevY, +- unsigned int *expix1, unsigned int *expix2, +- int *lbruS, int *lbruD, int buffratio, +- int precalCoef[16][16]) +-{ +- int bufsize = prevX * prevY; /* taille du buffer */ +- volatile int loop; /* variable de boucle */ +- +- mmx_t *brutS = (mmx_t*)lbruS; /* buffer de transformation source */ +- mmx_t *brutD = (mmx_t*)lbruD; /* buffer de transformation dest */ +- +- int pos; +- +- volatile mmx_t prevXY; +- volatile mmx_t ratiox; +- volatile mmx_t interpix; +- +- volatile mmx_t mask; /* masque des nombres a virgules */ +- mask.ud[0] = BUFFPOINTMASK; +- mask.ud[1] = BUFFPOINTMASK; +- +- prevXY.ud[0] = (prevX-1)<<PERTEDEC; +- prevXY.ud[1] = (prevY-1)<<PERTEDEC; +- +- pxor_r2r (mm7,mm7); +- +- ratiox.d[0] = buffratio; +- ratiox.d[1] = buffratio; +- movq_m2r (ratiox, mm6); +- pslld_i2r (16,mm6); +- +- for (loop=0; loop<bufsize; loop++) +- { +- /* +- * pre : mm6 = [buffratio<<16|buffratio<<16] +- * post : mm0 = S + ((D-S)*buffratio)>>16 format [X|Y] +- * modified = mm0,mm1,mm2 +- */ +- +- movq_m2r (brutS[loop],mm0); /* mm0 = S */ +- movq_m2r (brutD[loop],mm1); /* mm1 = D */ +- psubd_r2r (mm0,mm1); /* mm1 = D - S */ +- movq_r2r (mm1, mm2); /* mm2 = D - S */ +- +- pslld_i2r (16,mm1); +- mmx_r2r (pmulhuw, mm6, mm1); /* mm1 = ?? */ +- pmullw_r2r (mm6, mm2); +- +- paddd_r2r (mm2, mm1); /* mm1 = (D - S) * buffratio >> 16 */ +- pslld_i2r (16,mm0); +- +- paddd_r2r (mm1, mm0); /* mm0 = S + mm1 */ +- psrld_i2r (16, mm0); +- +- /* +- * pre : mm0 : position vector on screen +- * prevXY : coordinate of the lower-right point on screen +- * post : clipped mm0 +- * modified : mm0,mm1 +- */ +- movq_m2r (prevXY,mm1); +- pcmpgtd_r2r (mm0, mm1); /* mm0 en X contient : +- 1111 si prevXY > px +- 0000 si prevXY <= px +- (idem pour y) */ +- pand_r2r (mm1, mm0); /* on met a zero la partie qui deborde */ +- +- +- /* +- * pre : mm0 : clipped position on screen +- * post : mm6 : coefs for this position +- * mm1 : X vector [0|X] +- * modif : eax,ebx +- */ +- __asm__ __volatile__ ( +- "movq %%mm0,%%mm1\n" +- "movd %%mm0,%%eax\n" +- "psrlq $32,%%mm1\n" +- "movd %%mm1,%%ebx\n" +- "and $15,%%eax\n" +- "and $15,%%ebx\n" +- "add %0,%%eax\n" +- "movd (%%eax,%%ebx,$16),%%mm6\n" +- ::"X"(precalCoef):"eax","ebx"); +- +- /* +- * pre : mm0 : Y pos [*|Y] +- * mm1 : X pos [*|X] +- * post : eax : absolute position of the source pixel. +- * modif : ebx +- */ +- psrld_i2r (PERTEDEC,mm0); +- psrld_i2r (PERTEDEC,mm1); +- __asm__ __volatile__ ( +- "movd %%mm1,%%eax\n" +-// "movl %1,%%ebx\n" +- "mull %1\n" +- "movd %%mm0,%%ebx\n" +- "addl %%ebx,%%eax\n" +- "movl %%eax,%0\n" +- :"=X"(pos):"X"(prevX):"eax","ebx" +- ); +- +- expix2[loop] = expix1[pos]; +- /* +- * coeffs = precalCoef [px & PERTEMASK][py & PERTEMASK]; +- * coef en modulo 15 * +- * pos = ((px>>PERTEMASK) + prevX * (py>>PERTEMASK)); +- */ +-// precal + eax + ebx * 16 +- +-// movd_m2r (precalCoef[interpix.d[0]][interpix.d[1]],mm6); +- +- /* recuperation des deux premiers pixels dans mm0 et mm1 */ +-// movq_m2r (/*expix1[pos]*/a, mm0); /* b1-v1-r1-a1-b2-v2-r2-a2 */ +-// movq_r2r (mm0, mm1); /* b1-v1-r1-a1-b2-v2-r2-a2 */ +- +- /* depackage du premier pixel */ +-// punpcklbw_r2r (mm7, mm0); /* 00-b2-00-v2-00-r2-00-a2 */ +- +-// movq_r2r (mm6, mm5); /* ??-??-??-??-c4-c3-c2-c1 */ +- /* depackage du 2ieme pixel */ +-// punpckhbw_r2r (mm7, mm1); /* 00-b1-00-v1-00-r1-00-a1 */ +- +- /* extraction des coefficients... */ +-// punpcklbw_r2r (mm5, mm6); /* c4-c4-c3-c3-c2-c2-c1-c1 */ +-// movq_r2r (mm6, mm4); /* c4-c4-c3-c3-c2-c2-c1-c1 */ +-// movq_r2r (mm6, mm5); /* c4-c4-c3-c3-c2-c2-c1-c1 */ +- +-// punpcklbw_r2r (mm5, mm6); /* c2-c2-c2-c2-c1-c1-c1-c1 */ +-// punpckhbw_r2r (mm5, mm4); /* c4-c4-c4-c4-c3-c3-c3-c3 */ +- +-// movq_r2r (mm6, mm3); /* c2-c2-c2-c2-c1-c1-c1-c1 */ +-// punpcklbw_r2r (mm7, mm6); /* 00-c1-00-c1-00-c1-00-c1 */ +-// punpckhbw_r2r (mm7, mm3); /* 00-c2-00-c2-00-c2-00-c2 */ +- +- /* multiplication des pixels par les coefficients */ +-// pmullw_r2r (mm6, mm0); /* c1*b2-c1*v2-c1*r2-c1*a2 */ +-// pmullw_r2r (mm3, mm1); /* c2*b1-c2*v1-c2*r1-c2*a1 */ +-// paddw_r2r (mm1, mm0); +- +- /* ...extraction des 2 derniers coefficients */ +-// movq_r2r (mm4, mm5); /* c4-c4-c4-c4-c3-c3-c3-c3 */ +-// punpcklbw_r2r (mm7, mm4); /* 00-c3-00-c3-00-c3-00-c3 */ +-// punpckhbw_r2r (mm7, mm5); /* 00-c4-00-c4-00-c4-00-c4 */ +- +- /* recuperation des 2 derniers pixels */ +-// movq_m2r (a/*expix1[pos+largeur]*/, mm1); +-// movq_r2r (mm1, mm2); +- +- /* depackage des pixels */ +-// punpcklbw_r2r (mm7, mm1); +-// punpckhbw_r2r (mm7, mm2); +- +- /* multiplication pas les coeffs */ +-// pmullw_r2r (mm4, mm1); +-// pmullw_r2r (mm5, mm2); +- +- /* ajout des valeurs obtenues à la valeur finale */ +-// paddw_r2r (mm1, mm0); +-// paddw_r2r (mm2, mm0); +- +- /* division par 256 = 16+16+16+16, puis repackage du pixel final */ +-// psrlw_i2r (8, mm0); +-// packuswb_r2r (mm7, mm0); +- +-// movd_r2m (mm0,expix2[loop]); +- +- // expix2[loop] = couleur; +- } +- emms(); /* __asm__ __volatile__ ("emms"); */ +-} +diff -Naur /home/d4rk/goom2k4-0/src/filter_test/zoom_filter_mmx-v0.c /src/filter_test/zoom_filter_mmx-v0.c +--- /home/d4rk/goom2k4-0/src/filter_test/zoom_filter_mmx-v0.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/filter_test/zoom_filter_mmx-v0.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,202 +0,0 @@ +- +-#define BUFFPOINTNB 16 +-#define BUFFPOINTMASK 0xffff +-#define BUFFINCR 0xff +- +-#define sqrtperte 16 +-// faire : a % sqrtperte <=> a & pertemask +-#define PERTEMASK 0xf +-// faire : a / sqrtperte <=> a >> PERTEDEC +-#define PERTEDEC 4 +- +-//#define MMX_TRACE +-#include "mmx.h" +- +-void zoom_filter_mmx (int prevX, int prevY, +- unsigned int *expix1, unsigned int *expix2, +- int *lbruS, int *lbruD, int buffratio, +- int precalCoef[16][16]) +-{ +- int bufsize = prevX * prevY; /* taille du buffer */ +- volatile int loop; /* variable de boucle */ +- +- mmx_t *brutS = (mmx_t*)lbruS; /* buffer de transformation source */ +- mmx_t *brutD = (mmx_t*)lbruD; /* buffer de transformation dest */ +- +- volatile mmx_t prevXY; +- volatile mmx_t ratiox; +- volatile mmx_t interpix; +- +- volatile mmx_t mask; /* masque des nombres a virgules */ +- mask.ud[0] = BUFFPOINTMASK; +- mask.ud[1] = BUFFPOINTMASK; +- +- prevXY.ud[0] = (prevX-1)<<PERTEDEC; +- prevXY.ud[1] = (prevY-1)<<PERTEDEC; +- +- pxor_r2r (mm7,mm7); +- +- ratiox.d[0] = buffratio; +- ratiox.d[1] = buffratio; +- movq_m2r (ratiox, mm6); +- pslld_i2r (16,mm6); +- +- loop=0; +- while (loop<bufsize) +- { +- movq_m2r (ratiox, mm6); +- pslld_i2r (16,mm6); +- +- /* +- * pre : mm6 = [buffratio<<16|buffratio<<16] +- * post : mm0 = S + ((D-S)*buffratio)>>16 format [X|Y] +- * modified = mm0,mm1,mm2 +- */ +- +- __asm__ __volatile__ ( +- "movq %0,%%mm0\n" +- "movq %1,%%mm1\n" +- : :"X"(brutS[loop]),"X"(brutD[loop]) +- ); /* mm0 = S */ +- +- psubd_r2r (mm0,mm1); /* mm1 = D - S */ +- movq_r2r (mm1, mm2); /* mm2 = D - S */ +- +- pslld_i2r (16,mm1); +- mmx_r2r (pmulhuw, mm6, mm1); /* mm1 = ?? */ +- pmullw_r2r (mm6, mm2); +- +- paddd_r2r (mm2, mm1); /* mm1 = (D - S) * buffratio >> 16 */ +- pslld_i2r (16,mm0); +- +- paddd_r2r (mm1, mm0); /* mm0 = S + mm1 */ +- psrld_i2r (16, mm0); +- +- /* +- * pre : mm0 : position vector on screen +- * prevXY : coordinate of the lower-right point on screen +- * post : clipped mm0 +- * modified : mm0,mm1,mm2 +- */ +- movq_m2r (prevXY,mm1); +- pcmpgtd_r2r (mm0, mm1); /* mm0 en X contient : +- 1111 si prevXY > px +- 0000 si prevXY <= px +- (idem pour y) */ +- movq_r2r (mm1,mm2); +- punpckldq_r2r (mm1,mm1); +- punpckhdq_r2r (mm2,mm2); +- pand_r2r (mm1, mm0); /* on met a zero la partie qui deborde */ +- pand_r2r (mm2, mm0); /* on met a zero la partie qui deborde */ +- +- /* +- * pre : mm0 : clipped position on screen +- * post : mm6 : coefs for this position +- * mm1 : X vector [0|X] +- * modif : eax,ebx +- */ +- __asm__ __volatile__ ( +- "movq %%mm0,%%mm1\n" +- "movd %%mm0,%%ebx\n" +- "psrlq $32,%%mm1\n" +- "movd %%mm1,%%eax\n" +- "andl $15,%%eax\n" +- "andl $15,%%ebx\n" +- +- "shll $2,%%eax\n" +- "shll $3,%%ebx\n" +- +- "addl %0,%%eax\n" +- +- "movd (%%eax,%%ebx,8),%%mm6\n" +- ::"X"(precalCoef):"eax","ebx"); +- +- /* +- * pre : mm0 : Y pos [*|Y] +- * mm1 : X pos [*|X] +- * post : eax : absolute position of the source pixel. +- * modif : ebx +- */ +- psrld_i2r (PERTEDEC,mm0); +- psrld_i2r (PERTEDEC,mm1); +- __asm__ __volatile__ ( +- "movd %%mm1,%%eax\n" +- "mull %1\n" +- "movd %%mm0,%%ebx\n" +- "addl %%ebx,%%eax\n" +- "movl %0,%%ebx\n" +- "movq (%%ebx,%%eax,4),%%mm0\n" +- "addl %1,%%eax\n" +- "movq (%%ebx,%%eax,4),%%mm2\n" +- +- : : "X"(expix1), "X"(prevX):"eax","ebx" +- ); +- +- /* +- * coeffs = precalCoef [px & PERTEMASK][py & PERTEMASK]; +- * coef en modulo 15 * +- * pos = ((px>>PERTEMASK) + prevX * (py>>PERTEMASK)); +- */ +- +- /* recuperation des deux premiers pixels dans mm0 et mm1 */ +-// movq_m2r (expix1[pos], mm0); /* b1-v1-r1-a1-b2-v2-r2-a2 */ +- movq_r2r (mm0, mm1); /* b1-v1-r1-a1-b2-v2-r2-a2 */ +- +- /* recuperation des 2 derniers pixels */ +-// movq_m2r (expix1[pos+prevX], mm2); +- +- /* depackage du premier pixel */ +- punpcklbw_r2r (mm7, mm0); /* 00-b2-00-v2-00-r2-00-a2 */ +- +- movq_r2r (mm6, mm5); /* ??-??-??-??-c4-c3-c2-c1 */ +- /* depackage du 2ieme pixel */ +- punpckhbw_r2r (mm7, mm1); /* 00-b1-00-v1-00-r1-00-a1 */ +- +- /* extraction des coefficients... */ +- punpcklbw_r2r (mm5, mm6); /* c4-c4-c3-c3-c2-c2-c1-c1 */ +- movq_r2r (mm6, mm4); /* c4-c4-c3-c3-c2-c2-c1-c1 */ +- movq_r2r (mm6, mm5); /* c4-c4-c3-c3-c2-c2-c1-c1 */ +- +- punpcklbw_r2r (mm5, mm6); /* c2-c2-c2-c2-c1-c1-c1-c1 */ +- punpckhbw_r2r (mm5, mm4); /* c4-c4-c4-c4-c3-c3-c3-c3 */ +- +- movq_r2r (mm6, mm3); /* c2-c2-c2-c2-c1-c1-c1-c1 */ +- punpcklbw_r2r (mm7, mm6); /* 00-c1-00-c1-00-c1-00-c1 */ +- punpckhbw_r2r (mm7, mm3); /* 00-c2-00-c2-00-c2-00-c2 */ +- +- /* multiplication des pixels par les coefficients */ +- pmullw_r2r (mm6, mm0); /* c1*b2-c1*v2-c1*r2-c1*a2 */ +- pmullw_r2r (mm3, mm1); /* c2*b1-c2*v1-c2*r1-c2*a1 */ +- paddw_r2r (mm1, mm0); +- +- /* ...extraction des 2 derniers coefficients */ +- movq_r2r (mm4, mm5); /* c4-c4-c4-c4-c3-c3-c3-c3 */ +- punpcklbw_r2r (mm7, mm4); /* 00-c3-00-c3-00-c3-00-c3 */ +- punpckhbw_r2r (mm7, mm5); /* 00-c4-00-c4-00-c4-00-c4 */ +- +- /* recuperation des 2 derniers pixels */ +- movq_r2r (mm2, mm1); +- +- /* depackage des pixels */ +- punpcklbw_r2r (mm7, mm1); +- punpckhbw_r2r (mm7, mm2); +- +- /* multiplication pas les coeffs */ +- pmullw_r2r (mm4, mm1); +- pmullw_r2r (mm5, mm2); +- +- /* ajout des valeurs obtenues à la valeur finale */ +- paddw_r2r (mm1, mm0); +- paddw_r2r (mm2, mm0); +- +- /* division par 256 = 16+16+16+16, puis repackage du pixel final */ +- psrlw_i2r (8, mm0); +- packuswb_r2r (mm7, mm0); +- +- movd_r2m (mm0,expix2[loop]); +- +- // expix2[loop] = couleur; +- ++loop; +- } +- emms(); /* __asm__ __volatile__ ("emms"); */ +-} +diff -Naur /home/d4rk/goom2k4-0/src/flying_stars_fx.c /src/flying_stars_fx.c +--- /home/d4rk/goom2k4-0/src/flying_stars_fx.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/flying_stars_fx.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,314 +0,0 @@ +-#include "goom_fx.h" +-#include "goom_plugin_info.h" +-#include "goom_tools.h" +- +-#include "mathtools.h" +- +-/* TODO:-- FAIRE PROPREMENT... BOAH... */ +-#define NCOL 15 +- +-/*static const int colval[] = { +-0xfdf6f5, +-0xfae4e4, +-0xf7d1d1, +-0xf3b6b5, +-0xefa2a2, +-0xec9190, +-0xea8282, +-0xe87575, +-0xe46060, +-0xe14b4c, +-0xde3b3b, +-0xdc2d2f, +-0xd92726, +-0xd81619, +-0xd50c09, +-0 +-}; +-*/ +-static const int colval[] = { +- 0x1416181a, +- 0x1419181a, +- 0x141f181a, +- 0x1426181a, +- 0x142a181a, +- 0x142f181a, +- 0x1436181a, +- 0x142f1819, +- 0x14261615, +- 0x13201411, +- 0x111a100a, +- 0x0c180508, +- 0x08100304, +- 0x00050101, +- 0x0 +-}; +- +- +-/* The different modes of the visual FX. +- * Put this values on fx_mode */ +-#define FIREWORKS_FX 0 +-#define RAIN_FX 1 +-#define FOUNTAIN_FX 2 +-#define LAST_FX 3 +- +-typedef struct _FS_STAR { +- float x,y; +- float vx,vy; +- float ax,ay; +- float age,vage; +-} Star; +- +-typedef struct _FS_DATA{ +- +- int fx_mode; +- int nbStars; +- +- int maxStars; +- Star *stars; +- +- float min_age; +- float max_age; +- +- PluginParam min_age_p; +- PluginParam max_age_p; +- PluginParam nbStars_p; +- PluginParam nbStars_limit_p; +- PluginParam fx_mode_p; +- +- PluginParameters params; +-} FSData; +- +-static void fs_init(VisualFX *_this, PluginInfo *info) { +- +- FSData *data; +- data = (FSData*)malloc(sizeof(FSData)); +- +- data->fx_mode = FIREWORKS_FX; +- data->maxStars = 4096; +- data->stars = (Star*)malloc(data->maxStars * sizeof(Star)); +- data->nbStars = 0; +- +- data->max_age_p = secure_i_param ("Fireworks Smallest Bombs"); +- IVAL(data->max_age_p) = 80; +- IMIN(data->max_age_p) = 0; +- IMAX(data->max_age_p) = 100; +- ISTEP(data->max_age_p) = 1; +- +- data->min_age_p = secure_i_param ("Fireworks Largest Bombs"); +- IVAL(data->min_age_p) = 99; +- IMIN(data->min_age_p) = 0; +- IMAX(data->min_age_p) = 100; +- ISTEP(data->min_age_p) = 1; +- +- data->nbStars_limit_p = secure_i_param ("Max Number of Particules"); +- IVAL(data->nbStars_limit_p) = 512; +- IMIN(data->nbStars_limit_p) = 0; +- IMAX(data->nbStars_limit_p) = data->maxStars; +- ISTEP(data->nbStars_limit_p) = 64; +- +- data->fx_mode_p = secure_i_param ("FX Mode"); +- IVAL(data->fx_mode_p) = data->fx_mode; +- IMIN(data->fx_mode_p) = 1; +- IMAX(data->fx_mode_p) = 3; +- ISTEP(data->fx_mode_p) = 1; +- +- data->nbStars_p = secure_f_feedback ("Number of Particules (% of Max)"); +- +- data->params = plugin_parameters ("Particule System", 7); +- data->params.params[0] = &data->fx_mode_p; +- data->params.params[1] = &data->nbStars_limit_p; +- data->params.params[2] = 0; +- data->params.params[3] = &data->min_age_p; +- data->params.params[4] = &data->max_age_p; +- data->params.params[5] = 0; +- data->params.params[6] = &data->nbStars_p; +- +- _this->params = &data->params; +- _this->fx_data = (void*)data; +-} +- +-static void fs_free(VisualFX *_this) { +- free (_this->fx_data); +-} +- +- +-/** +- * Cree une nouvelle 'bombe', c'est a dire une particule appartenant a une fusee d'artifice. +- */ +-static void addABomb (FSData *fs, int mx, int my, float radius, float vage, float gravity, PluginInfo *info) { +- +- int i = fs->nbStars; +- float ro; +- int theta; +- +- if (fs->nbStars >= fs->maxStars) +- return; +- fs->nbStars++; +- +- fs->stars[i].x = mx; +- fs->stars[i].y = my; +- +- ro = radius * (float)goom_irand(info->gRandom,100) / 100.0f; +- ro *= (float)goom_irand(info->gRandom,100)/100.0f + 1.0f; +- theta = goom_irand(info->gRandom,256); +- +- fs->stars[i].vx = ro * cos256[theta]; +- fs->stars[i].vy = -0.2f + ro * sin256[theta]; +- +- fs->stars[i].ax = 0; +- fs->stars[i].ay = gravity; +- +- fs->stars[i].age = 0; +- if (vage < fs->min_age) +- vage=fs->min_age; +- fs->stars[i].vage = vage; +-} +- +- +-/** +- * Met a jour la position et vitesse d'une particule. +- */ +-static void updateStar (Star *s) { +- s->x+=s->vx; +- s->y+=s->vy; +- s->vx+=s->ax; +- s->vy+=s->ay; +- s->age+=s->vage; +-} +- +- +-/** +- * Ajoute de nouvelles particules au moment d'un evenement sonore. +- */ +-static void fs_sound_event_occured(VisualFX *_this, PluginInfo *info) { +- +- FSData *data = (FSData*)_this->fx_data; +- int i; +- +- int max = (int)((1.0f+info->sound.goomPower)*goom_irand(info->gRandom,150)) + 100; +- float radius = (1.0f+info->sound.goomPower) * (float)(goom_irand(info->gRandom,150)+50)/300; +- int mx; +- int my; +- float vage, gravity = 0.02f; +- +- switch (data->fx_mode) { +- case FIREWORKS_FX: +- { +- double dx,dy; +- do { +- mx = goom_irand(info->gRandom,info->screen.width); +- my = goom_irand(info->gRandom,info->screen.height); +- dx = (mx - info->screen.width/2); +- dy = (my - info->screen.height/2); +- } while (dx*dx + dy*dy < (info->screen.height/2)*(info->screen.height/2)); +- vage = data->max_age * (1.0f - info->sound.goomPower); +- } +- break; +- case RAIN_FX: +- mx = goom_irand(info->gRandom,info->screen.width); +- if (mx > info->screen.width/2) +- mx = info->screen.width; +- else +- mx = 0; +- my = -(info->screen.height/3)-goom_irand(info->gRandom,info->screen.width/3); +- radius *= 1.5; +- vage = 0.002f; +- break; +- case FOUNTAIN_FX: +- my = info->screen.height+2; +- vage = 0.001f; +- radius += 1.0f; +- mx = info->screen.width / 2; +- gravity = 0.04f; +- break; +- default: +- return; +- /* my = i R A N D (info->screen.height); vage = 0.01f; */ +- } +- +- radius *= info->screen.height / 200.0f; /* why 200 ? because the FX was developped on 320x200 */ +- max *= info->screen.height / 200.0f; +- +- if (info->sound.timeSinceLastBigGoom < 1) { +- radius *= 1.5; +- max *= 2; +- } +- for (i=0;i<max;++i) +- addABomb (data,mx,my,radius,vage,gravity,info); +-} +- +- +-/** +- * Main methode of the FX. +- */ +-static void fs_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *info) { +- +- int i; +- int col; +- FSData *data = (FSData*)_this->fx_data; +- +- /* Get the new parameters values */ +- data->min_age = 1.0f - (float)IVAL(data->min_age_p)/100.0f; +- data->max_age = 1.0f - (float)IVAL(data->max_age_p)/100.0f; +- FVAL(data->nbStars_p) = (float)data->nbStars / (float)data->maxStars; +- data->nbStars_p.change_listener(&data->nbStars_p); +- data->maxStars = IVAL(data->nbStars_limit_p); +- data->fx_mode = IVAL(data->fx_mode_p); +- +- /* look for events */ +- if (info->sound.timeSinceLastGoom < 1) { +- fs_sound_event_occured(_this, info); +- if (goom_irand(info->gRandom,20)==1) { +- IVAL(data->fx_mode_p) = goom_irand(info->gRandom,(LAST_FX*3)); +- data->fx_mode_p.change_listener(&data->fx_mode_p); +- } +- } +- +- /* update particules */ +- for (i=0;i<data->nbStars;++i) { +- updateStar(&data->stars[i]); +- +- /* dead particule */ +- if (data->stars[i].age>=NCOL) +- continue; +- +- /* choose the color of the particule */ +- col = colval[(int)data->stars[i].age]; +- +- /* draws the particule */ +- info->methods.draw_line(dest,(int)data->stars[i].x,(int)data->stars[i].y, +- (int)(data->stars[i].x-data->stars[i].vx*6), +- (int)(data->stars[i].y-data->stars[i].vy*6), +- col, +- (int)info->screen.width, (int)info->screen.height); +- info->methods.draw_line(dest,(int)data->stars[i].x,(int)data->stars[i].y, +- (int)(data->stars[i].x-data->stars[i].vx*2), +- (int)(data->stars[i].y-data->stars[i].vy*2), +- col, +- (int)info->screen.width, (int)info->screen.height); +- } +- +- /* look for dead particules */ +- for (i=0;i<data->nbStars;) { +- +- if ((data->stars[i].x > info->screen.width + 64) +- ||((data->stars[i].vy>=0)&&(data->stars[i].y - 16*data->stars[i].vy > info->screen.height)) +- ||(data->stars[i].x < -64) +- ||(data->stars[i].age>=NCOL)) { +- data->stars[i] = data->stars[data->nbStars-1]; +- data->nbStars--; +- } +- else ++i; +- } +-} +- +-VisualFX flying_star_create(void) { +- VisualFX vfx = { +- init: fs_init, +- free: fs_free, +- apply: fs_apply, +- fx_data: 0 +- }; +- return vfx; +-} +diff -Naur /home/d4rk/goom2k4-0/src/gfontlib.c /src/gfontlib.c +--- /home/d4rk/goom2k4-0/src/gfontlib.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/gfontlib.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,229 +0,0 @@ +-#include "goom_config.h" +-#include "gfontrle.h" +-#include "gfontlib.h" +-#include <string.h> +-#include <stdlib.h> +- +-static Pixel ***font_chars; +-static int *font_width; +-static int *font_height; +-static Pixel ***small_font_chars; +-static int *small_font_width; +-static int *small_font_height; +- +-void gfont_load (void) { +- unsigned char *gfont; +- unsigned int i = 0, j = 0; +- unsigned int nba = 0; +- unsigned int current = 32; +- int *font_pos; +- /* decompress le rle */ +- +- +- +- gfont = malloc (the_font.width*the_font.height*the_font.bytes_per_pixel); +- while (i<the_font.rle_size) { +- unsigned char c = the_font.rle_pixel [i++]; +- if (c == 0) { +- unsigned int nb = the_font.rle_pixel [i++]; +- while (nb--) +- gfont[j++] = 0; +- } +- else +- gfont [j++] = c; +- } +- +- /* determiner les positions de chaque lettre. */ +- +- font_height = calloc (256,sizeof(int)); +- small_font_height = calloc (256,sizeof(int)); +- font_width = calloc (256,sizeof(int)); +- small_font_width = calloc (256,sizeof(int)); +- font_chars = calloc (256,sizeof(int**)); +- small_font_chars = calloc (256,sizeof(int**)); +- font_pos = calloc (256,sizeof(int)); +- +- for (i=0;i<the_font.width;i++) { +- unsigned char a = gfont [i*4 + 3]; +- if (a) +- nba ++; +- else +- nba = 0; +- if (nba == 2) { +- font_width [current] = i - font_pos [current]; +- small_font_width [current] = font_width [current]/2; +- font_pos [++current] = i; +- font_height [current] = the_font.height - 2; +- small_font_height [current] = font_height [current]/2; +- } +- } +- font_pos [current] = 0; +- font_height [current] = 0; +- small_font_height [current] = 0; +- +- /* charger les lettres et convertir au format de la machine */ +- +- for (i=33;i<current;i++) { +- int x; int y; +- font_chars [i] = malloc (font_height[i]*sizeof(int *)); +- small_font_chars [i] = malloc (font_height[i]*sizeof(int *)/2); +- for (y = 0; y < font_height[i]; y++) { +- font_chars [i][y] = malloc (font_width[i]*sizeof(int)); +- for (x = 0; x < font_width[i]; x++) { +- unsigned int r,g,b,a; +- r = gfont[(y+2)*(the_font.width*4)+(x*4+font_pos[i]*4)]; +- g = gfont[(y+2)*(the_font.width*4)+(x*4+font_pos[i]*4+1)]; +- b = gfont[(y+2)*(the_font.width*4)+(x*4+font_pos[i]*4+2)]; +- a = gfont[(y+2)*(the_font.width*4)+(x*4+font_pos[i]*4+3)]; +- font_chars [i][y][x].val = +- (r<<(ROUGE*8))|(g<<(VERT*8))|(b<<(BLEU*8))|(a<<(ALPHA*8)); +- } +- } +- for (y = 0; y < font_height[i]/2; y++) { +- small_font_chars [i][y] = malloc (font_width[i]*sizeof(int)/2); +- for (x = 0; x < font_width[i]/2; x++) { +- unsigned int r1,g1,b1,a1,r2,g2,b2,a2,r3,g3,b3,a3,r4,g4,b4,a4; +- r1 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4)]; +- g1 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+1)]; +- b1 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+2)]; +- a1 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+3)]; +- r2 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+4)]; +- g2 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+5)]; +- b2 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+6)]; +- a2 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+7)]; +- r3 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4)]; +- g3 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+1)]; +- b3 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+2)]; +- a3 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+3)]; +- r4 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+4)]; +- g4 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+5)]; +- b4 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+6)]; +- a4 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+7)]; +- small_font_chars [i][y][x].val = +- (((r1 + r2 + r3 + r4)>>2)<<(ROUGE*8))| +- (((g1 + g2 + g3 + g4)>>2)<<(VERT*8))| +- (((b1 + b2 + b3 + b4)>>2)<<(BLEU*8))| +- (((a1 + a2 + a3 + a4)>>2)<<(ALPHA*8)); +- } +- } +- } +- +- /* definir les lettres restantes */ +- +- for (i=0;i<256;i++) { +- if (font_chars[i]==0) { +- font_chars[i]=font_chars[42]; +- small_font_chars[i]=small_font_chars[42]; +- font_width[i]=font_width[42]; +- font_pos[i]=font_pos[42]; +- font_height[i]=font_height[42]; +- small_font_width[i]=small_font_width[42]; +- small_font_height[i]=small_font_height[42]; +- } +- } +- +- font_width [32] = (the_font.height / 2) - 1; +- small_font_width [32] = font_width [32]/2; +- font_chars [32] = 0; +- small_font_chars [32] = 0; +-} +- +-void goom_draw_text (Pixel * buf,int resolx,int resoly, +- int x, int y, +- const char *str, float charspace, int center) { +- float fx = (float) x; +- int fin = 0; +- +- Pixel ***cur_font_chars; +- int *cur_font_width; +- int *cur_font_height; +- +- if (resolx>320) +- { +- /* printf("use big\n"); */ +- cur_font_chars = font_chars; +- cur_font_width = font_width; +- cur_font_height = font_height; +- } +- else +- { +- /* printf ("use small\n"); */ +- cur_font_chars = small_font_chars; +- cur_font_width = small_font_width; +- cur_font_height = small_font_height; +- } +- +- if (cur_font_chars == NULL) +- return ; +- +- if (center) { +- unsigned char *tmp = (unsigned char*)str; +- float lg = -charspace; +- +- while (*tmp != '\0') +- lg += cur_font_width[*(tmp++)] + charspace; +- +- fx -= lg / 2; +- } +- +- while (!fin) { +- unsigned char c = *str; +- +- x = (int) fx; +- +- if (c == '\0') +- fin = 1; +- else if (cur_font_chars[c]==0) { +- fx += cur_font_width[c] + charspace; +- } +- else { +- int xx, yy; +- int xmin = x; +- int xmax = x + cur_font_width[c]; +- int ymin = y - cur_font_height[c]; +- int ymax = y; +- +- yy = ymin; +- +- if (xmin < 0) +- xmin = 0; +- +- if (xmin >= resolx - 1) +- return; +- +- if (xmax >= (int) resolx) +- xmax = resolx - 1; +- +- if (yy < 0) +- yy = 0; +- +- if (yy <= (int) resoly - 1) { +- if (ymax >= (int) resoly - 1) +- ymax = resoly - 1; +- +- for (; yy < ymax; yy++) +- for (xx = xmin; xx < xmax; xx++) +- { +- Pixel color = cur_font_chars[c][yy - ymin][xx - x]; +- Pixel transparency; +- transparency.val = color.val & A_CHANNEL; +- if (transparency.val) +- { +- if (transparency.val==A_CHANNEL) buf[yy * resolx + xx] = color; +- else +- { +- Pixel back = buf[yy * resolx + xx]; +- unsigned int a1 = color.channels.a; +- unsigned int a2 = 255 - a1; +- buf[yy * resolx + xx].channels.r = (unsigned char)((((unsigned int)color.channels.r * a1) + ((unsigned int)back.channels.r * a2)) >> 8); +- buf[yy * resolx + xx].channels.g = (unsigned char)((((unsigned int)color.channels.g * a1) + ((unsigned int)back.channels.g * a2)) >> 8); +- buf[yy * resolx + xx].channels.b = (unsigned char)((((unsigned int)color.channels.b * a1) + ((unsigned int)back.channels.b * a2)) >> 8); +- } +- } +- } +- } +- fx += cur_font_width[c] + charspace; +- } +- str++; +- } +-} +diff -Naur /home/d4rk/goom2k4-0/src/gfontlib.h /src/gfontlib.h +--- /home/d4rk/goom2k4-0/src/gfontlib.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/gfontlib.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,10 +0,0 @@ +-#ifndef _GFONTLIB_H +-#define _GFONTLIB_H +- +-#include "goom_graphic.h" +- +-void gfont_load (void); +-void goom_draw_text (Pixel * buf,int resolx,int resoly, int x, int y, +- const char *str, float chspace, int center); +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/gfontrle.c /src/gfontrle.c +--- /home/d4rk/goom2k4-0/src/gfontrle.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/gfontrle.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,2500 +0,0 @@ +-/* RGBA C-Source image dump (with zRLE compression) */ +- +-const struct { +- unsigned int width; +- unsigned int height; +- unsigned int bytes_per_pixel; +- unsigned int rle_size; +- unsigned char rle_pixel [49725]; +-} the_font = { +-1277, 21, 4, 49725, { +-121,17,164,255,121,17,164,255,121,17,164,255,121,17,164,255,0,8,121,17, +-164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164, +-0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0, +-1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1, +-121,17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121, +-17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121,17, +-164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1,121,17,164, +-255,121,17,164,255,121,17,164,255,0,20,121,17,164,0,1,121,17,164,255, +-121,17,164,255,121,17,164,255,0,20,121,17,164,0,1,121,17,164,255,121, +-17,164,255,121,17,164,255,0,52,121,17,164,0,1,121,17,164,255,121,17, +-164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164, +-255,121,17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255, +-121,17,164,255,0,36,121,17,164,0,1,121,17,164,255,121,17,164,255,121, +-17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17, +-164,255,0,36,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164, +-255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255, +-0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0, +-44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44, +-121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121, +-17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17, +-164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164, +-0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0, +-1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1, +-121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121, +-17,164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1,121,17, +-164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1,121,17,164, +-255,121,17,164,255,121,17,164,255,0,36,121,17,164,0,1,121,17,164,255, +-121,17,164,255,121,17,164,255,0,36,121,17,164,0,1,121,17,164,255,121, +-17,164,255,121,17,164,255,0,36,121,17,164,0,1,121,17,164,255,121,17, +-164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164, +-255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255, +-121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121, +-17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17, +-164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164, +-255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255, +-0,36,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0, +-36,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44, +-121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121, +-17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,12,121,17, +-164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164, +-0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0, +-1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164,0,1, +-121,17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121, +-17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17, +-164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164, +-255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255, +-121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121, +-17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17, +-164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164, +-255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255, +-121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121, +-17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17, +-164,255,0,52,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164, +-255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255, +-0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0, +-44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,20, +-121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121, +-17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,20,121,17, +-164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164, +-0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164,0, +-1,121,17,164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1, +-121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121, +-17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17, +-164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164, +-255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255, +-121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121, +-17,164,255,121,17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17, +-164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164, +-255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255, +-121,17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255,121, +-17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17, +-164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164, +-255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255, +-0,52,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0, +-44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44, +-121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121, +-17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17, +-164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164, +-0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0, +-1,121,17,164,255,121,17,164,255,121,17,164,255,0,28,121,17,164,0,1, +-121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121, +-17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17, +-164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121,17,164, +-255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255, +-121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121, +-17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17, +-164,255,121,17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17,164, +-255,121,17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255, +-121,17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17,164,255,121, +-17,164,255,121,17,164,255,121,17,164,255,0,56,121,17,164,0,1,121,17, +-164,255,121,17,164,255,13,4,17,0,1,13,4,17,0,1,13,4,17,0, +-1,16,5,22,0,13,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,57,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,57,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-57,16,5,22,0,1,14,4,19,0,1,16,5,22,0,17,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,25,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,25,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-57,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,41,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-17,16,5,22,0,1,14,4,19,0,1,16,5,22,0,41,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-17,16,5,22,0,1,14,4,19,0,1,16,5,22,0,17,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,41,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,41,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,41,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,17,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,41,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,57,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,57,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,25,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,41,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,25,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,41,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-33,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,17,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-33,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,57,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,33,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,57,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,33,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,33,16,5,22,0,1,14,4,19,0,1,13,4,17,0, +-1,13,4,17,0,1,16,5,22,0,61,16,5,22,0,1,14,4,19,0, +-255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, +-255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, +-25,8,6,3,57,10,8,5,85,9,7,4,76,0,12,8,6,3,54,9, +-8,4,96,9,7,4,85,0,12,8,6,3,57,9,8,4,96,9,7,4, +-85,0,24,8,6,3,57,11,8,4,85,9,7,4,79,0,12,8,6,3, +-51,10,8,5,85,8,6,3,85,0,40,8,6,3,57,11,8,4,85,8, +-6,3,85,0,32,8,6,3,57,10,8,5,85,9,7,4,85,0,28,5, +-4,2,14,8,6,3,85,9,7,4,85,0,24,8,6,3,74,9,7,4, +-113,8,6,3,167,8,6,3,139,9,7,4,85,5,4,2,14,0,36,8, +-6,3,57,9,8,4,110,9,7,4,85,0,24,5,4,2,20,9,7,4, +-85,9,8,4,85,0,16,9,8,4,57,9,8,4,85,6,5,3,48,0, +-255,0,29,5,4,2,17,8,6,3,85,9,7,4,82,0,20,5,4,2, +-3,8,6,3,85,9,7,4,93,8,6,3,153,8,6,3,161,8,6,3, +-110,9,8,4,85,8,6,3,85,6,5,3,31,0,32,5,4,2,3,8, +-6,3,85,10,8,5,85,10,7,5,85,0,36,5,4,2,57,8,6,3, +-85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,8,6,3, +-108,8,6,3,85,6,5,3,71,0,24,5,4,2,42,8,6,3,85,9, +-7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,8,6,3,108,8, +-6,3,85,6,5,3,71,0,48,5,4,2,3,8,6,3,85,9,8,4, +-85,9,7,4,74,0,16,8,6,3,42,9,7,4,85,8,6,3,85,9, +-7,4,85,8,6,3,125,8,6,3,170,7,6,4,170,9,7,4,170,12, +-9,7,170,19,14,10,170,19,13,10,142,8,6,5,28,0,16,5,4,2, +-51,8,6,3,85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3, +-164,8,6,3,108,8,6,3,85,6,5,3,71,0,20,10,8,5,57,9, +-7,4,170,8,6,3,170,8,6,3,170,8,6,3,161,8,6,3,142,9, +-7,4,96,9,7,4,85,8,6,3,85,9,7,4,85,9,7,4,74,0, +-20,5,4,2,42,8,6,3,85,9,7,4,91,8,6,3,153,8,6,3, +-170,8,6,3,164,8,6,3,108,8,6,3,85,6,5,3,76,0,24,8, +-6,5,82,10,8,7,133,12,9,7,170,15,11,8,170,15,11,8,170,15, +-11,8,170,13,10,8,170,10,8,7,161,10,8,7,85,6,5,5,28,0, +-96,8,6,3,74,9,8,4,85,8,6,3,57,0,68,7,6,4,28,9, +-7,4,85,9,7,4,85,5,4,2,17,0,40,5,4,2,42,8,6,3, +-85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,8,6,3, +-108,8,6,3,85,6,5,3,85,0,24,8,6,5,85,10,8,7,133,12, +-9,7,170,15,10,8,170,15,11,8,170,15,11,8,170,13,10,8,170,10, +-8,7,150,8,6,5,62,0,24,8,6,5,82,10,8,7,133,12,9,7, +-170,15,10,8,170,14,10,7,170,9,7,4,170,8,6,5,147,10,8,5, +-85,7,6,4,85,5,4,4,3,0,16,12,9,7,57,11,8,6,161,9, +-7,6,170,10,8,7,170,13,10,8,170,14,10,7,170,13,10,8,170,12, +-9,7,170,10,8,7,156,10,8,7,85,6,5,5,25,0,20,6,5,3, +-57,8,7,5,85,9,7,4,110,9,7,4,170,10,8,5,170,10,8,5, +-170,11,8,6,170,10,8,7,150,10,8,7,85,6,5,5,25,0,16,15, +-11,8,57,11,8,6,170,9,7,6,170,10,8,7,170,13,10,8,170,15, +-11,8,170,15,11,8,170,13,10,8,170,10,8,7,159,10,8,7,85,6, +-5,5,25,0,16,15,11,8,59,11,9,6,170,9,7,4,125,10,8,5, +-85,8,6,3,133,8,6,3,167,8,6,3,170,8,6,3,170,9,8,4, +-113,0,16,8,6,3,42,10,8,5,85,10,7,5,85,9,7,4,125,10, +-8,5,170,12,10,7,170,14,11,7,170,19,14,10,170,19,14,10,142,8, +-6,5,28,0,16,8,6,5,82,10,8,7,133,12,9,7,170,15,11,8, +-170,15,11,8,170,15,11,8,170,13,10,8,170,10,8,7,161,10,8,7, +-85,6,5,5,25,0,16,12,10,7,74,14,10,7,170,12,9,7,139,7, +-6,4,28,0,16,10,8,7,110,14,10,7,170,13,10,8,125,0,16,13, +-10,8,71,15,11,8,170,13,10,8,130,5,5,4,8,0,44,11,8,6, +-85,9,7,4,170,10,8,5,93,0,16,12,9,7,57,10,8,5,167,11, +-8,6,110,6,5,3,8,0,16,11,8,6,57,10,7,5,159,11,8,6, +-102,0,16,8,6,3,51,10,8,5,85,9,7,4,85,0,40,10,7,5, +-57,11,9,6,85,7,6,4,57,0,28,7,5,4,28,10,8,5,85,11, +-8,6,85,0,16,8,6,3,48,10,8,5,85,8,6,3,85,0,20,8, +-6,3,57,11,8,4,85,9,7,4,79,0,20,5,4,2,45,8,6,3, +-85,9,7,4,85,9,7,4,88,9,7,4,108,9,8,4,93,9,7,4, +-85,8,6,3,85,6,5,3,74,0,20,8,6,3,45,9,7,4,85,8, +-6,3,85,9,7,4,85,8,6,3,125,8,6,3,170,8,6,3,164,8, +-6,3,108,8,6,3,85,6,5,3,74,0,24,6,5,3,57,8,7,5, +-85,10,8,5,85,9,7,4,119,8,6,3,142,9,7,4,130,10,8,5, +-91,10,7,5,85,6,5,3,85,0,20,9,7,4,57,10,8,5,85,10, +-7,5,85,10,8,5,85,8,6,3,144,8,6,3,170,8,6,3,164,8, +-6,3,108,8,6,3,85,6,5,3,71,0,24,5,4,2,45,8,6,3, +-85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,9,7,4, +-105,8,6,3,85,6,5,3,74,0,20,11,8,4,59,9,7,4,170,8, +-6,3,164,9,7,4,91,8,6,3,85,8,6,3,85,8,6,3,85,9, +-7,4,85,8,6,3,142,9,6,4,170,9,8,4,116,0,16,8,6,3, +-48,10,8,5,85,9,7,4,85,0,20,8,6,3,57,11,8,4,85,9, +-7,4,76,0,16,8,6,3,48,10,8,5,85,9,7,4,85,0,20,8, +-6,3,57,11,8,4,85,9,7,4,76,0,16,8,6,3,48,10,8,5, +-85,9,7,4,85,0,28,8,6,3,57,11,8,4,85,9,7,4,76,0, +-16,8,6,3,54,9,8,4,96,9,7,4,85,0,20,8,6,3,57,9, +-8,4,96,9,7,4,85,0,16,10,8,5,57,10,7,5,153,10,8,5, +-93,0,20,10,8,7,93,14,11,7,170,13,10,8,136,0,16,11,8,6, +-91,11,8,6,170,9,7,4,170,9,7,4,170,8,6,5,170,8,6,3, +-119,9,7,4,85,8,6,3,85,8,6,3,85,9,7,4,85,9,7,4, +-76,0,16,8,6,3,42,9,7,4,85,8,6,3,85,8,6,3,122,9, +-8,4,102,0,16,8,6,3,51,9,7,4,85,6,5,3,45,0,40,12, +-8,5,57,8,6,3,156,10,7,5,93,11,8,6,85,11,8,6,85,0, +-28,6,5,5,14,13,10,8,85,8,7,5,45,0,80,10,8,5,57,10, +-7,5,156,10,8,5,96,0,76,9,7,4,57,10,8,5,93,10,8,5, +-85,0,140,10,8,7,110,13,10,8,170,12,9,7,133,5,5,4,6,0, +-84,8,6,5,79,10,8,7,127,13,10,8,170,16,12,9,142,8,7,5, +-28,0,72,8,6,3,57,10,8,5,85,9,6,4,85,0,48,15,11,8, +-113,25,18,12,170,20,15,11,142,8,7,5,28,0,28,15,11,8,130,22, +-16,11,170,20,15,11,142,7,6,6,23,0,12,13,10,8,68,12,9,7, +-170,11,8,6,116,6,5,3,8,0,44,12,9,7,82,15,10,8,170,13, +-10,8,130,5,5,4,8,0,255,0,197,6,5,3,57,8,6,3,85,0, +-255,0,149,5,4,2,6,8,6,3,85,8,6,3,156,9,8,4,113,0, +-16,8,6,3,48,9,8,4,91,9,7,4,76,0,16,10,8,5,57,9, +-6,4,170,8,6,3,99,5,4,2,34,0,36,8,6,3,71,9,8,4, +-93,9,8,4,96,8,6,3,85,6,5,3,45,0,12,8,6,3,76,0, +-44,8,6,3,57,58,31,9,255,93,50,12,255,88,45,11,255,12,10,5, +-113,0,4,7,6,4,28,54,29,9,255,93,46,12,255,88,45,11,255,12, +-9,5,122,0,4,7,5,4,37,54,29,9,255,93,46,12,255,88,45,11, +-255,14,10,5,142,0,16,8,6,3,85,58,31,9,255,93,50,12,255,88, +-44,11,255,9,7,4,170,0,4,5,4,2,85,52,28,9,255,93,48,12, +-255,88,44,11,255,12,10,5,170,0,32,7,6,4,85,58,31,9,255,93, +-50,12,255,88,45,11,255,12,9,5,170,0,24,8,6,3,57,58,31,9, +-255,93,50,12,255,88,45,11,255,14,10,5,142,0,20,6,5,3,28,19, +-12,6,227,76,37,11,255,88,45,11,255,14,10,5,139,0,16,9,8,4, +-170,69,35,10,255,92,47,11,255,92,47,11,255,88,45,11,255,88,45,11, +-255,16,11,5,227,7,5,4,28,0,28,8,6,3,57,58,31,9,255,93, +-46,12,255,88,45,11,255,14,10,5,142,0,16,6,5,3,28,19,12,6, +-227,82,39,11,255,92,47,11,255,14,10,5,105,0,8,7,5,4,20,54, +-29,9,255,100,50,13,255,30,19,7,255,8,6,3,85,0,255,0,21,6, +-5,3,28,19,12,6,227,76,37,11,255,88,45,11,255,14,10,5,130,0, +-12,7,6,4,65,17,11,6,227,71,37,10,255,88,45,11,255,92,47,11, +-255,92,47,11,255,88,45,11,255,88,44,11,255,88,44,11,255,25,16,6, +-255,8,6,3,142,0,24,7,5,4,85,17,12,6,229,77,39,12,255,107, +-51,14,255,113,55,16,255,20,14,9,178,0,28,14,11,7,170,29,18,8, +-255,74,39,11,255,88,45,11,255,88,45,11,255,92,47,11,255,92,47,11, +-255,88,45,11,255,88,44,11,255,41,23,8,255,12,9,5,227,5,5,4, +-23,0,12,9,7,4,170,26,17,6,255,74,39,11,255,88,45,11,255,88, +-45,11,255,92,47,11,255,92,47,11,255,88,45,11,255,88,44,11,255,41, +-24,8,255,12,9,5,227,6,5,3,28,0,36,6,5,3,85,16,11,5, +-227,71,37,10,255,88,45,11,255,88,44,11,255,12,10,5,113,0,8,8, +-6,3,28,54,29,9,255,92,47,11,255,88,44,11,255,88,45,11,255,92, +-46,13,255,100,52,13,255,109,53,16,255,121,63,20,255,158,74,23,255,180, +-88,27,255,183,90,28,255,26,17,11,142,0,12,10,7,5,170,26,17,6, +-255,74,39,11,255,88,45,11,255,92,47,11,255,92,47,11,255,92,47,11, +-255,88,45,11,255,88,45,11,255,41,24,8,255,12,9,5,227,6,5,3, +-28,0,8,7,6,4,8,61,32,10,255,102,51,13,255,92,46,13,255,92, +-46,13,255,92,46,13,255,92,46,13,255,92,46,13,255,90,45,11,255,84, +-44,11,255,88,45,11,255,88,44,11,255,14,10,5,119,0,12,9,7,4, +-153,26,17,6,255,74,39,11,255,88,45,11,255,92,47,11,255,92,47,11, +-255,92,47,11,255,88,45,11,255,88,44,11,255,45,25,8,255,13,10,6, +-227,7,6,4,28,0,12,17,13,10,170,64,39,21,255,155,78,26,255,169, +-83,26,255,165,80,24,255,161,79,24,255,145,71,22,255,136,70,21,255,134, +-69,21,255,88,50,23,255,22,17,11,232,9,8,6,31,0,84,4,4,3, +-23,12,9,5,173,71,34,10,255,92,43,13,255,33,20,8,255,10,8,5, +-57,0,64,20,14,7,227,83,42,12,255,92,46,13,255,19,13,6,227,6, +-5,3,34,0,32,10,8,5,170,26,17,6,255,76,37,11,255,90,46,11, +-255,92,46,13,255,92,46,13,255,90,45,11,255,90,45,11,255,88,44,11, +-255,46,26,9,255,18,13,9,227,8,7,5,28,0,12,15,12,8,170,58, +-35,19,255,134,73,23,255,153,76,24,255,142,69,21,255,131,64,20,255,121, +-59,18,255,121,59,18,255,121,62,18,255,43,27,12,255,11,9,6,170,0, +-16,17,13,10,170,64,39,21,255,164,85,27,255,177,86,26,255,154,75,23, +-255,121,62,18,255,115,56,16,255,119,61,18,255,123,61,20,255,80,45,19, +-255,22,16,11,227,8,7,5,28,0,8,13,10,8,57,96,48,19,255,165, +-80,24,255,159,78,24,255,159,78,24,255,165,80,24,255,165,80,24,255,165, +-80,24,255,159,78,24,255,164,81,25,255,91,52,24,255,22,17,11,227,8, +-7,5,28,0,12,13,10,8,170,38,24,11,255,99,47,16,255,116,59,17, +-255,126,65,21,255,142,69,21,255,153,76,24,255,157,74,24,255,155,76,24, +-255,91,52,24,255,23,18,12,227,8,7,5,28,0,8,13,10,8,57,104, +-52,21,255,171,84,26,255,155,76,24,255,164,81,25,255,173,81,26,255,180, +-88,27,255,180,88,27,255,177,86,26,255,169,80,26,255,92,55,25,255,22, +-17,11,227,8,7,5,28,0,8,13,10,8,57,114,63,25,255,177,86,26, +-255,114,56,17,255,92,46,13,255,92,47,11,255,93,46,12,255,92,46,13, +-255,96,48,13,255,92,46,13,255,18,12,5,91,0,8,8,6,3,40,55, +-29,10,255,108,50,15,255,114,56,17,255,130,67,21,255,153,76,24,255,161, +-82,24,255,171,84,26,255,179,84,26,255,179,84,26,255,25,17,10,142,0, +-12,15,12,8,170,64,39,21,255,162,84,27,255,179,88,28,255,183,90,28, +-255,181,89,28,255,181,89,28,255,172,88,27,255,156,77,25,255,88,50,23, +-255,22,17,11,227,8,7,5,28,0,8,13,9,6,57,96,48,19,255,153, +-71,22,255,134,69,21,255,20,14,9,193,0,12,11,8,6,113,124,62,25, +-255,185,91,28,255,169,80,26,255,22,15,9,142,0,8,11,8,6,57,111, +-61,24,255,184,90,27,255,177,86,26,255,23,16,10,173,0,40,11,8,6, +-113,114,59,23,255,144,73,21,255,126,63,21,255,20,14,9,142,0,8,11, +-9,6,57,97,51,20,255,152,71,23,255,134,69,21,255,20,14,9,187,0, +-12,12,9,7,96,97,48,18,255,140,71,21,255,138,71,21,255,20,15,9, +-142,0,8,8,6,3,40,52,28,9,255,93,50,12,255,88,45,11,255,14, +-10,5,142,0,32,13,10,8,82,91,48,16,255,132,71,21,255,63,36,18, +-255,10,8,7,136,0,20,7,6,6,62,31,21,12,244,124,66,23,255,134, +-69,21,255,20,15,9,142,0,8,8,6,3,28,54,29,9,255,93,46,12, +-255,80,39,11,255,14,10,5,142,0,12,8,6,3,57,58,31,9,255,93, +-50,12,255,88,44,11,255,14,10,5,116,0,12,9,7,4,153,26,17,6, +-255,74,39,11,255,88,45,11,255,88,45,11,255,88,45,11,255,88,45,11, +-255,88,44,11,255,88,44,11,255,41,23,8,255,12,9,5,227,5,4,4, +-17,0,8,8,6,3,34,54,29,9,255,92,43,11,255,88,44,11,255,88, +-45,11,255,92,43,11,255,92,47,11,255,92,47,11,255,88,45,11,255,88, +-44,11,255,45,25,8,255,12,10,5,227,6,5,3,28,0,12,13,10,6, +-170,40,24,11,255,97,48,16,255,113,55,16,255,115,56,16,255,116,57,17, +-255,116,57,17,255,113,55,16,255,113,55,16,255,60,33,13,255,18,14,9, +-227,8,6,5,28,0,8,12,9,7,57,77,38,14,255,118,57,17,255,116, +-59,17,255,118,60,17,255,109,53,16,255,98,47,13,255,92,47,11,255,88, +-45,11,255,88,44,11,255,41,23,8,255,12,9,5,227,6,5,3,28,0, +-12,10,8,5,170,28,18,7,255,76,37,11,255,90,45,11,255,92,46,13, +-255,94,45,13,255,94,45,13,255,92,46,13,255,92,46,13,255,46,26,9, +-255,13,10,6,227,6,5,5,28,0,8,7,6,4,8,61,32,10,255,100, +-50,13,255,92,46,13,255,92,46,13,255,92,46,13,255,92,46,13,255,92, +-46,13,255,92,46,13,255,94,47,13,255,98,49,13,255,94,47,13,255,18, +-12,5,93,0,8,8,6,3,42,60,32,9,255,96,48,13,255,88,45,11, +-255,14,10,5,142,0,12,8,6,3,57,58,31,9,255,93,50,12,255,88, +-44,11,255,12,10,5,113,0,8,8,6,3,28,54,29,9,255,93,50,12, +-255,88,44,11,255,14,10,5,142,0,12,8,6,3,57,58,31,9,255,93, +-50,12,255,88,44,11,255,12,10,5,113,0,8,8,6,3,28,54,29,9, +-255,93,50,12,255,88,44,11,255,14,10,5,142,0,20,8,6,3,57,58, +-31,9,255,93,50,12,255,88,44,11,255,12,10,5,113,0,8,7,6,4, +-28,54,29,9,255,93,50,12,255,88,45,11,255,14,10,5,142,0,12,8, +-7,3,57,60,31,9,255,96,48,13,255,92,46,13,255,14,10,5,127,0, +-8,10,8,5,57,82,42,15,255,135,66,20,255,121,60,20,255,20,15,9, +-176,0,12,11,9,6,108,107,56,22,255,172,84,25,255,158,74,23,255,22, +-15,9,142,0,8,11,8,6,54,98,51,19,255,142,72,21,255,136,70,21, +-255,138,71,21,255,121,59,18,255,100,52,13,255,90,46,11,255,88,44,11, +-255,88,44,11,255,88,44,11,255,88,45,11,255,12,10,5,113,0,8,8, +-6,3,28,54,29,9,255,92,47,11,255,88,44,11,255,92,47,11,255,92, +-47,11,255,18,12,5,85,0,8,7,6,4,45,54,30,9,255,94,47,13, +-255,31,20,8,255,9,7,4,85,0,32,8,6,3,48,65,33,10,255,114, +-55,15,255,119,58,18,255,126,63,21,255,128,66,21,255,22,15,9,164,0, +-20,5,5,4,28,19,14,10,227,141,72,26,255,43,27,16,255,7,6,6, +-85,0,72,14,10,7,71,96,49,17,255,138,71,21,255,130,67,21,255,22, +-15,9,164,0,68,12,9,7,76,77,39,14,255,118,57,17,255,109,53,16, +-255,22,15,9,153,0,132,11,8,6,96,103,53,20,255,144,73,21,255,121, +-60,20,255,24,16,9,153,0,80,15,12,8,184,61,36,20,255,141,68,24, +-255,168,82,25,255,171,84,26,255,26,18,11,159,0,68,9,7,4,57,60, +-32,9,255,96,48,13,255,92,46,13,255,19,12,6,142,0,40,14,10,7, +-76,129,67,26,255,190,97,29,255,180,88,27,255,26,17,11,161,0,24,14, +-10,7,85,129,67,26,255,190,97,29,255,180,88,27,255,25,17,10,125,0, +-8,11,8,6,57,109,60,24,255,175,86,26,255,142,73,23,255,20,14,9, +-187,0,40,12,9,7,93,121,65,24,255,183,89,26,255,168,82,25,255,21, +-15,10,178,0,255,0,193,10,8,5,170,39,23,8,255,78,41,11,255,16, +-11,5,142,0,255,0,141,6,5,3,85,16,11,5,227,71,37,10,255,92, +-47,11,255,92,47,11,255,18,12,5,85,0,8,8,6,3,28,54,29,9, +-255,93,46,12,255,88,45,11,255,12,10,5,113,0,12,58,31,9,255,93, +-50,12,255,88,45,11,255,25,17,6,255,8,6,3,142,0,24,4,4,3, +-25,10,8,5,173,65,33,10,255,92,46,13,255,92,46,13,255,67,34,10, +-255,27,18,8,255,9,7,4,156,3,3,2,85,10,8,5,184,69,35,10, +-255,19,13,6,147,0,40,9,7,4,113,112,55,13,255,141,69,16,255,141, +-75,16,255,18,13,5,170,0,4,8,6,3,85,110,54,13,255,143,76,16, +-255,139,68,16,255,19,13,6,170,0,4,8,6,3,85,110,54,13,255,143, +-76,16,255,141,72,16,255,23,15,6,170,0,12,10,9,5,110,35,21,8, +-255,129,63,14,255,141,69,16,255,139,68,16,255,52,27,9,255,9,7,4, +-255,27,17,8,255,135,66,16,255,154,75,17,255,155,79,18,255,91,50,16, +-255,20,15,9,207,10,9,7,28,0,16,5,4,4,20,8,6,3,127,31, +-20,8,255,130,66,15,255,143,76,16,255,143,76,16,255,67,34,10,255,10, +-8,5,215,10,8,5,170,13,10,6,142,7,5,4,23,0,8,12,9,5, +-85,115,59,14,255,149,72,16,255,143,76,16,255,18,12,5,235,0,16,7, +-6,4,28,14,10,5,227,92,46,13,255,143,73,16,255,143,70,16,255,18, +-13,5,170,0,12,14,10,5,170,53,28,10,255,114,56,13,255,56,29,9, +-255,16,11,5,255,34,20,7,255,112,55,13,255,87,42,12,255,19,13,6, +-235,8,7,5,40,0,24,10,8,5,85,114,56,13,255,143,70,16,255,141, +-72,16,255,23,15,6,170,0,12,7,6,4,28,14,10,5,227,90,44,13, +-255,112,57,13,255,47,26,8,255,11,8,4,57,0,12,25,16,6,227,96, +-48,13,255,112,57,13,255,26,16,7,255,8,6,5,85,0,24,13,10,6, +-85,8,7,5,57,0,20,6,5,3,28,15,11,6,85,9,7,4,28,0, +-36,9,7,4,105,10,8,5,170,10,8,5,130,6,5,3,23,0,156,8, +-6,3,136,77,39,12,255,143,73,16,255,139,74,16,255,18,12,5,170,0, +-12,21,14,6,227,112,57,13,255,141,69,16,255,80,40,11,255,16,11,5, +-255,14,10,5,227,18,13,5,255,72,35,11,255,136,69,15,255,130,66,15, +-255,46,26,9,255,8,6,3,105,0,16,8,7,5,57,42,27,13,255,150, +-79,21,255,184,94,21,255,195,99,22,255,199,106,24,255,26,18,11,255,0, +-24,10,8,7,99,83,45,18,255,144,74,17,255,143,70,16,255,94,47,13, +-255,18,13,5,255,16,11,5,173,14,10,5,227,52,27,9,255,132,67,15, +-255,139,68,16,255,75,39,12,255,10,7,5,116,0,8,6,5,3,57,52, +-27,9,255,137,73,16,255,143,76,16,255,94,47,13,255,18,13,5,255,16, +-11,5,173,14,10,5,227,52,27,9,255,132,67,15,255,139,74,16,255,75, +-39,12,255,10,8,5,142,0,32,8,6,5,85,22,15,7,255,102,51,13, +-255,137,67,16,255,140,71,15,255,141,75,16,255,20,13,5,170,0,8,9, +-6,4,85,108,55,13,255,141,69,16,255,139,74,16,255,74,36,11,255,18, +-12,7,255,20,13,7,181,22,15,9,207,20,13,9,238,18,13,9,252,23, +-16,10,255,31,21,12,218,14,11,7,42,0,8,7,6,4,57,40,22,9, +-255,130,66,15,255,141,75,16,255,84,42,11,255,18,12,5,255,16,12,5, +-181,14,10,5,241,69,35,10,255,140,69,17,255,154,78,17,255,117,60,18, +-255,17,13,8,142,0,12,21,14,8,190,28,18,9,255,23,15,8,255,21, +-14,8,255,21,14,8,255,23,15,8,255,38,24,11,255,98,53,17,255,151, +-74,18,255,150,76,17,255,141,75,16,255,21,15,6,170,0,8,5,4,2, +-28,33,20,8,255,130,66,15,255,141,72,16,255,84,42,11,255,18,12,5, +-255,18,12,5,176,14,10,5,235,57,29,10,255,140,72,17,255,165,85,20, +-255,121,67,24,255,14,11,7,142,0,8,8,6,5,57,72,46,23,255,198, +-113,29,255,200,102,23,255,131,68,22,255,33,21,12,255,17,13,8,255,21, +-14,8,255,88,47,19,255,192,99,23,255,203,113,26,255,146,87,29,255,13, +-11,8,164,0,12,10,8,5,85,13,10,6,170,11,9,6,142,7,6,4, +-28,0,12,13,10,8,113,18,14,9,170,16,13,9,147,10,8,7,28,0, +-24,10,8,7,28,20,15,11,227,104,62,21,255,184,94,21,255,117,62,22, +-255,17,12,8,227,7,5,4,28,0,64,11,8,6,170,67,35,16,255,164, +-85,21,255,115,58,16,255,20,14,7,252,8,6,5,85,0,24,9,7,4, +-82,66,37,13,255,145,75,18,255,154,78,17,255,115,58,16,255,29,18,8, +-255,14,10,7,255,16,11,7,255,65,34,12,255,150,74,19,255,189,97,22, +-255,138,79,27,255,14,12,9,142,0,8,7,6,6,57,55,33,16,255,158, +-81,19,255,162,80,19,255,102,53,17,255,24,15,7,255,19,12,6,170,14, +-10,5,204,46,26,9,255,137,67,16,255,139,71,16,255,49,27,10,255,7, +-6,4,105,0,8,7,6,6,62,72,46,23,255,199,115,32,255,205,111,28, +-255,155,84,26,255,41,24,14,255,18,13,9,255,25,16,10,255,110,61,25, +-255,199,100,28,255,205,112,30,255,146,87,29,255,13,11,8,142,0,8,10, +-8,7,147,180,87,25,255,206,111,27,255,203,105,26,255,164,85,27,255,40, +-24,15,255,20,14,9,255,26,17,11,255,121,64,26,255,201,101,28,255,205, +-112,30,255,146,87,29,255,14,11,7,142,0,8,8,6,5,57,71,44,22, +-255,192,108,25,255,198,101,23,255,150,78,25,255,41,24,14,255,32,21,13, +-255,74,41,21,255,184,105,27,255,202,104,25,255,202,118,27,255,174,102,31, +-255,17,14,10,142,0,8,11,9,6,136,182,92,25,255,206,112,29,255,205, +-111,28,255,166,79,27,255,43,25,16,255,21,15,10,255,29,19,12,255,116, +-67,27,255,202,107,31,255,206,113,31,255,146,87,29,255,12,10,7,142,0, +-8,11,8,6,144,185,93,26,255,202,103,23,255,157,77,18,255,83,42,12, +-255,19,13,6,255,13,10,6,255,20,13,7,255,27,17,8,255,28,18,9, +-227,10,8,5,45,0,8,11,9,6,142,139,73,20,255,198,96,21,255,199, +-106,24,255,155,78,26,255,41,25,14,255,21,15,10,255,28,18,11,255,38, +-24,15,255,40,24,15,227,14,10,7,62,0,8,8,7,5,57,65,41,20, +-255,197,108,28,255,205,111,28,255,170,88,27,255,43,27,16,255,19,14,10, +-255,29,19,12,255,123,66,24,255,181,84,20,255,170,87,19,255,114,60,17, +-255,11,10,6,142,0,8,11,9,6,85,119,60,15,255,154,75,17,255,154, +-78,17,255,18,13,7,255,0,12,13,10,8,170,191,102,30,255,209,118,30, +-255,207,113,30,255,28,19,11,201,0,8,13,10,8,105,166,87,23,255,198, +-101,23,255,198,97,23,255,26,18,11,255,0,40,13,10,8,170,189,100,28, +-255,206,111,27,255,204,102,27,255,28,20,11,201,0,8,12,10,7,116,184, +-93,27,255,206,107,27,255,203,113,26,255,23,17,10,255,0,8,6,5,5, +-28,25,18,12,244,192,105,27,255,206,112,29,255,207,117,30,255,32,22,13, +-170,0,8,11,9,6,88,112,57,13,255,143,70,16,255,141,69,16,255,17, +-12,6,227,0,32,14,11,9,170,184,92,25,255,206,111,27,255,192,111,31, +-255,49,33,18,255,10,8,7,122,0,12,7,7,6,59,22,16,11,232,167, +-100,28,255,205,112,30,255,205,116,30,255,26,18,11,210,0,8,8,7,3, +-85,110,54,13,255,141,69,16,255,141,75,16,255,25,16,6,255,5,4,4, +-40,0,8,10,8,5,85,112,55,13,255,141,75,16,255,141,75,16,255,20, +-13,5,170,0,8,5,4,2,28,33,20,8,255,130,66,15,255,141,72,16, +-255,112,55,13,255,45,25,8,255,26,17,6,255,33,20,8,255,94,47,13, +-255,141,69,16,255,144,71,17,255,80,40,13,255,9,7,4,125,0,8,10, +-8,5,85,112,57,13,255,148,79,17,255,141,75,16,255,87,42,12,255,19, +-13,6,255,14,10,5,215,15,10,6,255,60,31,11,255,143,71,18,255,160, +-82,19,255,96,54,17,255,12,9,7,142,0,8,8,6,5,57,71,44,22, +-255,192,100,25,255,199,106,24,255,185,93,26,255,91,50,22,255,58,33,17, +-255,72,41,19,255,158,81,25,255,199,106,24,255,199,106,24,255,138,79,27, +-255,13,11,8,142,0,8,10,8,7,147,166,87,23,255,203,108,24,255,202, +-108,25,255,153,77,26,255,38,22,13,255,15,11,6,255,14,10,5,255,52, +-28,9,255,132,70,15,255,141,75,16,255,80,41,13,255,10,8,5,139,0, +-8,7,6,6,57,48,29,13,255,154,79,19,255,160,85,19,255,108,56,17, +-255,30,18,9,255,16,11,7,255,24,15,9,255,96,51,17,255,167,86,20, +-255,181,88,20,255,140,75,23,255,18,14,9,144,0,12,22,14,7,193,22, +-13,7,255,20,13,7,255,78,40,15,255,165,81,20,255,177,90,20,255,177, +-90,20,255,115,58,20,255,32,20,11,255,24,15,9,255,30,19,9,227,11, +-8,6,54,0,8,11,9,6,142,139,68,20,255,166,78,19,255,144,71,17, +-255,19,12,6,215,0,12,9,7,4,136,114,56,13,255,143,70,16,255,139, +-68,16,255,19,13,6,170,0,8,10,7,5,85,112,55,13,255,143,70,16, +-255,139,74,16,255,17,11,6,221,0,12,9,7,4,136,114,56,13,255,143, +-70,16,255,141,75,16,255,20,13,5,170,0,8,9,6,4,85,110,54,13, +-255,141,69,16,255,141,72,16,255,17,11,6,221,0,20,9,7,4,136,114, +-56,13,255,143,73,16,255,139,74,16,255,19,13,6,170,0,8,8,6,3, +-85,110,54,13,255,143,76,16,255,141,69,16,255,18,12,5,252,0,12,11, +-9,6,170,131,69,18,255,170,87,19,255,168,86,19,255,28,19,9,170,0, +-8,11,8,6,85,145,74,26,255,204,102,27,255,203,105,26,255,52,33,17, +-255,6,5,5,57,0,8,17,14,10,227,190,107,25,255,204,113,25,255,174, +-86,27,255,18,13,9,170,0,12,28,18,11,198,37,23,14,255,32,21,13, +-255,21,15,10,255,20,14,9,255,38,23,11,255,87,44,12,255,137,70,16, +-255,141,72,16,255,143,70,16,255,141,72,16,255,18,12,5,170,0,8,9, +-6,4,85,110,54,13,255,145,74,16,255,141,69,16,255,94,47,13,255,27, +-17,8,227,12,8,5,28,0,8,14,10,7,85,121,62,18,255,172,87,19, +-255,139,69,18,255,20,15,9,227,0,36,21,14,8,227,117,61,24,255,199, +-100,28,255,205,106,26,255,204,110,27,255,26,18,11,255,0,16,8,7,5, +-28,20,15,11,227,135,73,22,255,192,97,21,255,165,83,22,255,33,22,12, +-255,10,9,7,85,0,68,11,9,6,170,184,97,27,255,206,112,29,255,204, +-110,27,255,28,19,11,255,0,68,14,11,7,170,179,93,24,255,202,103,23, +-255,198,97,23,255,22,15,9,255,0,132,9,7,6,170,125,63,18,255,158, +-77,17,255,146,75,17,255,17,12,6,255,0,76,8,6,5,76,72,46,23, +-255,197,108,28,255,201,107,24,255,164,85,27,255,37,22,14,227,13,9,6, +-48,0,68,12,9,7,170,138,67,19,255,170,79,19,255,168,86,19,255,20, +-14,9,255,0,40,8,7,5,20,21,15,10,184,26,17,11,255,26,17,11, +-215,12,9,7,74,0,24,8,7,5,20,21,15,10,184,26,17,11,255,31, +-21,12,207,18,13,9,28,0,8,11,9,8,156,184,93,27,255,208,105,29, +-255,205,111,28,255,28,19,11,255,0,40,14,11,7,170,184,92,25,255,203, +-104,24,255,200,98,23,255,26,18,11,255,0,255,0,189,8,7,5,57,51, +-29,12,255,152,75,19,255,162,86,19,255,19,13,8,246,0,255,0,137,6, +-5,3,28,19,13,6,249,92,46,13,255,123,63,14,255,78,39,11,255,21, +-15,6,227,9,8,4,28,0,8,9,8,4,85,110,59,13,255,141,69,16, +-255,141,75,16,255,21,14,6,170,0,12,16,11,5,170,52,28,9,255,115, +-59,14,255,116,60,15,255,43,26,10,255,9,7,6,125,0,16,8,7,5, +-28,21,17,10,227,109,59,18,255,160,82,19,255,121,64,18,255,62,34,13, +-255,94,53,17,255,149,78,20,255,102,54,19,255,32,22,11,255,72,39,15, +-255,121,62,18,255,24,17,9,187,0,40,8,6,3,167,128,66,15,255,161, +-85,17,255,159,81,18,255,24,15,7,178,0,4,6,5,3,37,48,28,11, +-255,173,92,20,255,181,96,20,255,21,15,8,221,0,4,6,5,3,28,40, +-24,9,255,143,74,18,255,158,80,17,255,21,15,6,181,0,8,10,8,5, +-54,107,51,14,255,157,83,18,255,164,84,19,255,176,89,19,255,189,92,20, +-255,191,98,22,255,190,106,23,255,197,110,26,255,203,108,24,255,203,117,24, +-255,205,119,26,255,207,122,30,255,199,118,32,255,32,23,13,170,0,12,7, +-6,4,85,22,15,7,232,113,54,14,255,146,75,17,255,158,80,17,255,154, +-78,17,255,158,80,17,255,148,76,17,255,139,71,16,255,135,66,16,255,135, +-66,16,255,21,14,6,136,0,8,10,8,5,85,128,66,15,255,161,85,17, +-255,158,80,17,255,25,16,6,204,0,12,7,6,4,28,25,16,8,227,102, +-50,15,255,148,76,17,255,142,73,17,255,84,45,13,255,10,8,5,113,0, +-8,9,7,4,82,107,53,14,255,146,75,17,255,84,41,13,255,8,7,5, +-198,3,2,2,23,5,4,4,136,38,23,9,255,136,70,17,255,140,72,17, +-255,21,15,6,178,0,24,7,6,4,57,45,26,10,255,143,74,18,255,158, +-80,17,255,26,17,6,170,0,12,24,16,7,227,115,58,16,255,148,76,17, +-255,46,26,9,255,7,6,4,156,0,16,5,4,4,71,19,13,6,255,139, +-71,16,255,140,72,17,255,43,26,10,255,9,8,4,85,0,16,14,10,5, +-85,109,52,14,255,38,23,9,255,6,5,3,85,0,12,4,4,3,28,15, +-12,6,227,115,56,16,255,29,19,8,170,0,32,13,10,6,113,122,64,21, +-255,164,85,21,255,138,71,17,255,21,15,6,161,0,156,13,10,6,227,137, +-67,16,255,154,75,17,255,84,45,13,255,10,8,5,116,0,8,9,7,4, +-85,111,55,14,255,158,87,17,255,158,80,17,255,19,13,6,255,4,4,3, +-28,0,4,3,3,2,113,17,12,6,255,139,71,16,255,161,85,17,255,146, +-75,17,255,20,14,7,210,0,16,16,13,9,110,184,105,27,255,209,123,30, +-255,210,124,31,255,208,123,31,255,207,122,30,255,27,20,12,255,0,24,13, +-11,8,147,143,75,20,255,161,85,17,255,158,80,17,255,27,18,8,227,5, +-4,2,28,0,8,10,7,5,198,131,65,16,255,161,85,17,255,150,76,17, +-255,21,14,6,170,0,8,10,8,5,85,123,61,16,255,163,83,18,255,158, +-80,17,255,27,18,8,227,5,4,2,28,0,8,9,7,4,198,130,66,15, +-255,163,83,18,255,148,76,17,255,21,14,6,193,0,28,7,6,4,85,22, +-15,7,255,131,65,16,255,154,78,17,255,154,78,17,255,154,78,17,255,154, +-78,17,255,21,15,6,170,0,8,10,8,5,85,129,64,16,255,163,86,18, +-255,180,91,19,255,29,20,10,255,3,3,2,93,0,36,10,8,5,122,121, +-60,16,255,161,85,17,255,159,81,18,255,24,15,7,255,4,4,3,34,0, +-4,2,2,1,6,17,13,8,181,181,93,22,255,203,108,24,255,205,114,26, +-255,32,23,13,210,0,36,5,4,4,161,30,22,13,255,198,116,29,255,206, +-106,25,255,191,96,20,255,26,17,7,170,0,8,9,7,4,85,116,60,15, +-255,161,85,17,255,158,80,17,255,21,14,6,255,5,4,2,28,0,4,2, +-2,1,3,12,9,7,215,190,107,25,255,211,124,30,255,208,134,37,255,32, +-22,13,178,0,8,13,11,8,96,187,112,32,255,209,123,30,255,191,96,20, +-255,28,19,9,255,4,3,3,74,0,4,3,2,2,28,13,10,8,227,196, +-120,31,255,211,124,30,255,199,106,24,255,27,19,10,170,0,8,13,10,6, +-57,114,61,19,255,178,91,21,255,182,102,23,255,23,17,10,173,0,8,11, +-9,6,91,146,85,25,255,198,113,29,255,196,120,31,255,27,20,12,207,0, +-20,5,5,4,28,21,17,12,227,190,118,33,255,209,131,40,255,161,100,34, +-255,17,14,10,227,5,5,4,28,0,72,9,8,6,170,91,59,28,255,189, +-94,24,255,162,83,19,255,39,25,12,255,7,7,6,85,0,20,13,11,8, +-142,183,103,24,255,203,112,24,255,203,112,24,255,42,26,13,249,5,4,4, +-62,0,4,3,2,2,25,12,9,7,227,195,115,30,255,212,127,35,255,211, +-132,38,255,32,22,13,181,0,8,12,10,7,85,124,65,17,255,161,85,17, +-255,159,78,18,255,21,14,6,255,5,4,2,28,0,8,7,6,4,224,133, +-68,16,255,159,81,18,255,146,72,17,255,22,14,7,170,0,8,13,11,8, +-91,185,111,32,255,210,125,33,255,205,114,26,255,37,26,14,255,4,4,3, +-85,0,4,4,4,4,28,13,10,8,227,193,105,26,255,206,111,27,255,202, +-118,27,255,32,22,13,170,0,8,11,9,6,127,174,91,23,255,202,102,21, +-255,200,105,21,255,36,23,13,255,4,4,3,85,0,4,3,3,2,28,13, +-11,8,227,198,118,33,255,212,127,35,255,208,128,33,255,31,22,12,181,0, +-8,13,11,8,91,185,114,30,255,211,124,30,255,208,122,29,255,34,24,13, +-255,4,4,3,85,0,4,7,6,6,113,32,24,13,255,185,95,22,255,202, +-98,21,255,198,97,23,255,33,22,12,170,0,8,10,8,7,156,190,108,27, +-255,212,126,33,255,211,127,36,255,40,26,15,255,4,4,3,85,0,4,3, +-3,2,28,13,11,8,227,198,118,33,255,214,129,37,255,211,132,38,255,32, +-23,13,173,0,8,10,8,7,144,167,87,22,255,185,94,20,255,165,87,18, +-255,25,17,8,255,3,3,2,57,0,28,13,11,8,170,195,112,30,255,210, +-125,33,255,208,117,29,255,39,26,14,255,4,4,3,85,0,28,12,10,7, +-150,184,108,27,255,211,124,30,255,211,127,36,255,40,27,15,255,4,4,3, +-85,0,4,3,3,2,28,17,13,8,178,138,71,17,255,161,85,17,255,155, +-79,18,255,21,14,6,170,0,8,10,8,5,85,124,61,15,255,169,89,18, +-255,180,91,19,255,25,18,10,255,0,12,13,11,8,170,196,113,31,255,211, +-124,30,255,205,119,26,255,26,18,11,204,0,8,11,9,6,88,134,70,19, +-255,173,87,18,255,168,86,19,255,20,13,7,255,0,40,13,11,8,170,196, +-113,31,255,210,125,33,255,207,122,30,255,24,18,11,212,0,8,11,9,6, +-119,180,93,23,255,203,108,24,255,202,103,23,255,20,15,9,255,0,8,15, +-13,10,195,101,63,26,255,202,117,25,255,206,128,35,255,160,106,35,255,15, +-13,10,142,0,8,10,8,5,147,139,70,20,255,191,96,20,255,200,105,21, +-255,25,18,10,255,0,32,13,10,8,170,189,99,26,255,206,115,27,255,205, +-106,26,255,185,106,28,255,79,52,26,255,10,9,7,122,0,4,7,6,6, +-42,36,27,17,244,172,106,35,255,207,128,34,255,211,126,34,255,211,127,36, +-255,24,18,11,227,0,8,10,8,5,85,124,64,15,255,159,81,18,255,158, +-80,17,255,76,40,13,255,11,8,6,210,0,8,12,9,5,85,129,64,16, +-255,161,85,17,255,158,80,17,255,26,16,7,170,0,8,9,7,4,85,115, +-56,16,255,161,85,17,255,159,81,18,255,49,27,10,255,7,6,4,170,5, +-4,4,85,6,5,3,113,26,19,11,255,185,95,22,255,202,102,21,255,197, +-104,22,255,28,20,11,173,0,8,13,10,6,102,167,87,22,255,200,101,21, +-255,201,102,22,255,32,21,11,255,4,3,3,65,0,4,2,2,1,17,12, +-10,7,221,190,98,23,255,208,116,27,255,204,110,27,255,30,21,11,181,0, +-8,13,11,8,91,185,114,30,255,211,124,30,255,209,123,30,255,86,55,25, +-255,9,8,6,187,6,6,5,85,7,6,6,130,32,24,15,255,200,122,31, +-255,209,123,30,255,206,122,31,255,32,23,13,173,0,8,10,8,7,144,191, +-113,30,255,212,127,35,255,210,126,35,255,40,27,15,255,4,4,3,85,0, +-4,2,2,1,8,11,9,6,212,157,81,20,255,189,92,20,255,190,97,21, +-255,27,19,10,178,0,8,12,10,7,96,183,105,28,255,209,123,30,255,205, +-114,26,255,36,24,13,255,4,4,3,85,0,4,4,4,4,28,18,14,9, +-187,195,115,30,255,211,124,30,255,210,130,35,255,35,26,14,210,0,20,3, +-2,2,28,12,10,7,227,195,115,30,255,211,124,30,255,209,123,30,255,38, +-25,15,255,4,4,3,85,0,20,13,11,8,170,194,115,31,255,209,122,28, +-255,196,99,21,255,21,15,8,255,0,12,11,9,6,170,153,79,20,255,187, +-91,20,255,181,96,20,255,30,20,9,178,0,8,13,10,6,96,151,79,20, +-255,187,91,20,255,181,96,20,255,22,16,9,255,0,12,12,9,7,170,146, +-76,19,255,167,88,18,255,158,77,17,255,23,15,6,170,0,8,10,8,5, +-85,133,66,16,255,167,88,18,255,168,86,19,255,22,16,9,255,0,20,12, +-9,7,170,155,80,20,255,185,94,20,255,181,96,20,255,22,16,9,221,0, +-8,6,6,5,42,51,29,12,255,150,81,19,255,165,87,18,255,42,26,11, +-255,5,5,4,108,0,4,5,5,4,28,18,15,11,255,195,114,28,255,207, +-123,32,255,158,94,31,255,17,13,10,142,0,8,6,5,5,57,50,34,19, +-255,191,111,32,255,208,117,29,255,113,73,30,255,10,10,9,227,6,6,5, +-125,7,7,6,198,42,29,17,255,187,96,22,255,166,87,23,255,42,27,15, +-255,8,6,5,110,0,32,5,5,4,184,21,16,8,255,106,54,15,255,154, +-78,17,255,151,77,18,255,92,48,15,255,11,9,6,119,0,8,10,8,5, +-93,131,69,18,255,189,92,20,255,200,105,21,255,33,22,12,255,5,4,4, +-54,0,12,9,8,6,85,76,53,25,255,200,118,31,255,204,114,27,255,65, +-43,22,255,6,6,5,113,0,32,4,3,3,17,14,11,9,227,195,111,28, +-255,206,115,27,255,204,105,25,255,24,17,11,255,0,12,5,5,4,28,13, +-10,6,227,125,66,18,255,165,84,18,255,161,85,17,255,161,85,17,255,155, +-79,18,255,28,19,9,255,6,5,3,85,0,64,11,9,8,68,86,56,27, +-255,204,126,33,255,210,125,33,255,30,21,13,255,0,68,13,11,8,170,195, +-115,30,255,209,123,30,255,207,122,30,255,27,19,12,255,3,3,2,28,0, +-128,7,6,4,184,131,65,16,255,161,85,17,255,154,78,17,255,15,11,6, +-249,0,76,10,8,7,173,166,87,23,255,198,104,21,255,196,99,21,255,35, +-23,12,255,3,3,2,85,0,72,13,11,8,170,194,115,31,255,211,124,30, +-255,207,122,30,255,27,19,12,255,3,3,2,28,0,108,13,11,8,170,196, +-113,31,255,213,132,36,255,211,127,36,255,30,21,13,255,0,40,11,9,6, +-170,155,80,20,255,185,94,20,255,180,91,19,255,21,15,8,255,0,255,0, +-189,10,8,7,184,183,100,26,255,208,116,27,255,204,114,27,255,26,18,11, +-255,4,4,4,28,0,255,0,133,10,8,5,127,119,60,15,255,160,85,19, +-255,91,48,16,255,10,8,5,227,4,4,3,28,0,12,9,7,4,161,131, +-67,16,255,159,81,18,255,159,78,18,255,18,13,7,249,0,16,7,6,4, +-170,57,34,14,255,176,90,21,255,195,95,22,255,26,19,11,232,0,16,17, +-14,10,99,179,106,28,255,207,122,30,255,180,109,33,255,25,20,12,255,7, +-6,6,170,20,17,11,255,196,114,27,255,208,117,29,255,203,124,30,255,172, +-106,35,255,53,36,20,255,10,9,7,108,0,40,9,8,6,170,159,82,20, +-255,202,103,23,255,206,111,27,255,22,17,11,255,0,8,10,9,7,139,115, +-74,30,255,213,133,48,255,39,28,16,255,0,8,9,8,4,113,67,39,14, +-255,181,92,20,255,24,18,9,255,0,12,28,19,9,227,139,79,26,255,206, +-117,31,255,212,123,37,255,214,126,41,255,172,106,35,255,53,34,18,255,122, +-78,31,255,211,127,44,255,217,136,50,255,216,135,49,255,190,122,41,255,65, +-43,22,255,14,11,7,85,0,8,7,6,4,28,29,21,10,249,153,79,20, +-255,174,85,19,255,103,53,16,255,17,12,6,244,19,13,6,170,21,14,6, +-170,27,17,6,170,21,14,6,212,21,14,6,255,25,17,6,224,12,9,5, +-45,0,12,24,16,7,153,22,15,7,255,26,16,7,210,12,9,5,40,0, +-8,8,7,5,28,17,13,8,227,114,61,19,255,174,85,19,255,154,79,19, +-255,60,33,13,255,11,9,6,170,0,12,10,8,5,170,146,79,19,255,180, +-87,19,255,67,39,14,255,8,6,5,85,0,8,24,17,9,255,143,75,20, +-255,162,80,19,255,22,15,7,215,0,28,8,7,5,110,60,33,13,255,166, +-78,19,255,22,15,7,227,0,8,7,6,4,85,91,51,16,255,174,88,19, +-255,169,78,18,255,25,17,8,255,3,3,2,8,0,20,11,9,6,178,143, +-74,18,255,177,89,18,255,138,75,19,255,18,13,7,176,0,16,9,7,4, +-28,29,19,8,232,41,25,10,255,17,13,8,255,9,8,6,116,0,4,7, +-6,4,59,14,11,7,227,32,21,9,255,40,24,9,255,12,9,5,105,0, +-32,14,11,9,170,199,124,36,255,213,119,36,255,202,102,21,255,20,14,7, +-246,0,152,8,7,5,142,53,31,12,255,162,86,19,255,121,64,18,255,19, +-14,8,252,6,5,3,28,0,8,10,8,5,125,142,74,19,255,180,91,19, +-255,183,89,19,255,19,14,8,255,0,4,5,5,4,6,15,13,10,193,69, +-42,18,255,171,91,20,255,189,88,20,255,200,101,21,255,31,21,12,255,0, +-16,10,8,7,28,30,21,13,227,150,92,35,255,208,121,37,255,211,115,30, +-255,208,117,29,255,28,21,13,255,0,24,10,8,7,28,22,15,7,198,26, +-17,7,255,24,15,7,221,9,7,4,57,0,12,8,7,5,156,171,89,22, +-255,202,107,23,255,202,103,23,255,23,18,10,249,0,12,26,18,9,198,29, +-19,8,255,24,16,7,215,10,8,5,51,0,12,10,8,5,85,134,70,19, +-255,175,88,18,255,173,87,18,255,20,14,7,255,0,24,10,8,5,85,26, +-19,9,255,107,58,18,255,154,83,19,255,168,79,19,255,169,78,18,255,173, +-87,18,255,172,80,19,255,26,17,7,170,0,8,11,10,8,136,189,99,26, +-255,210,115,31,255,216,129,45,255,143,96,40,255,15,13,10,227,12,12,11, +-170,15,13,12,170,13,12,10,170,13,12,10,136,9,8,8,85,0,16,11, +-9,6,170,169,91,22,255,202,103,23,255,203,108,24,255,18,15,9,255,0, +-12,6,5,5,23,28,19,11,156,31,22,12,255,34,24,13,227,14,11,7, +-85,0,36,9,8,8,142,72,54,31,255,215,147,60,255,218,146,61,255,174, +-100,35,255,14,11,7,142,0,8,11,8,6,102,142,74,19,255,185,86,20, +-255,195,98,20,255,18,14,9,249,0,12,10,8,7,170,202,131,47,255,220, +-152,63,255,220,151,61,255,22,19,13,252,0,8,11,9,8,167,203,135,46, +-255,217,139,48,255,210,120,33,255,18,14,9,255,0,12,9,8,6,170,198, +-117,37,255,211,115,30,255,202,102,21,255,34,22,11,176,0,8,13,11,8, +-170,202,122,37,255,218,144,49,255,217,144,50,255,28,21,13,255,0,8,12, +-11,9,170,204,122,41,255,217,135,46,255,215,136,42,255,46,33,19,255,0, +-16,10,9,7,28,21,19,14,227,153,104,46,255,214,149,55,255,158,103,39, +-255,16,14,11,221,7,6,6,28,0,20,20,18,13,142,31,26,18,170,25, +-21,16,170,24,20,15,170,24,20,15,170,24,20,15,170,24,21,15,170,31, +-26,18,170,25,21,16,170,14,12,9,31,0,20,10,9,7,167,75,51,26, +-255,202,117,33,255,186,120,43,255,41,32,20,255,12,11,9,85,0,16,11, +-9,8,28,31,22,12,215,49,33,18,255,41,27,16,227,12,10,7,85,0, +-12,14,12,9,170,204,137,51,255,220,152,63,255,220,151,61,255,23,19,12, +-252,0,8,11,10,6,85,136,70,17,255,175,88,18,255,169,78,18,255,15, +-11,6,255,0,8,9,8,6,85,26,19,9,255,153,82,18,255,177,89,18, +-255,180,84,19,255,24,17,9,218,0,8,11,9,8,147,196,115,35,255,215, +-125,38,255,214,125,39,255,20,16,11,255,0,12,9,8,6,159,165,86,22, +-255,197,99,20,255,195,90,20,255,32,21,11,170,0,8,12,10,7,85,145, +-76,20,255,189,92,20,255,191,96,20,255,18,14,9,255,0,12,9,8,6, +-170,199,126,39,255,217,133,50,255,217,144,50,255,23,18,12,252,0,8,11, +-10,8,142,191,105,28,255,206,111,27,255,203,104,24,255,19,15,10,255,0, +-12,9,8,6,57,21,15,8,198,28,19,9,255,32,21,11,227,11,9,6, +-76,0,8,11,9,8,170,203,125,42,255,220,146,59,255,219,146,60,255,24, +-19,13,255,0,12,11,10,8,170,204,136,47,255,220,146,59,255,218,147,55, +-255,25,19,12,232,0,8,11,10,8,119,161,87,22,255,195,98,20,255,202, +-103,23,255,18,15,9,255,0,32,14,12,9,170,200,125,37,255,214,124,37, +-255,205,106,26,255,20,16,9,221,0,32,16,13,9,170,205,130,42,255,219, +-144,56,255,219,146,60,255,24,19,13,255,0,12,6,5,3,23,21,14,6, +-170,26,16,7,255,26,17,7,224,14,10,5,31,0,8,11,9,6,125,170, +-89,23,255,211,115,30,255,214,126,41,255,23,19,12,255,0,12,11,10,8, +-170,195,112,30,255,206,106,25,255,200,105,21,255,29,20,10,170,0,8,11, +-9,6,85,134,70,19,255,177,85,18,255,172,80,19,255,18,13,7,255,0, +-40,14,12,9,170,195,112,30,255,206,111,27,255,202,103,23,255,31,22,10, +-170,0,8,13,10,6,85,151,79,20,255,189,92,20,255,183,89,19,255,17, +-13,8,255,0,4,8,7,5,59,57,34,16,255,184,97,27,255,198,115,33, +-255,114,77,33,255,16,14,11,210,6,5,5,8,0,8,12,10,7,170,195, +-113,32,255,215,123,42,255,217,133,50,255,32,24,15,255,0,32,12,11,7, +-170,175,90,22,255,198,104,21,255,189,92,20,255,192,97,21,255,189,97,22, +-255,45,29,14,255,10,9,7,210,22,17,11,255,183,102,30,255,212,121,41, +-255,216,135,49,255,217,137,52,255,214,125,39,255,29,21,12,204,0,8,11, +-9,6,85,143,75,20,255,193,97,20,255,195,98,20,255,180,93,23,255,88, +-54,23,255,11,10,8,113,0,4,14,12,7,85,170,89,23,255,202,103,23, +-255,202,102,21,255,32,22,11,178,0,8,12,10,7,113,176,91,23,255,205, +-105,24,255,209,117,28,255,39,28,16,255,5,5,5,28,0,8,15,14,10, +-198,206,132,45,255,217,133,50,255,215,133,44,255,25,19,12,232,0,8,11, +-10,8,125,198,118,39,255,218,145,51,255,218,146,53,255,20,17,11,255,0, +-12,9,8,6,170,198,124,37,255,216,134,45,255,214,139,41,255,22,18,11, +-255,0,8,11,10,8,136,191,105,28,255,206,111,27,255,206,106,25,255,36, +-26,15,255,5,5,4,28,0,8,15,13,10,198,192,105,27,255,206,106,25, +-255,204,105,25,255,23,17,10,232,0,8,12,10,7,125,196,119,37,255,218, +-141,51,255,218,139,55,255,20,16,11,255,0,12,9,8,6,170,196,110,33, +-255,215,126,40,255,214,125,39,255,23,18,12,252,0,8,11,9,8,167,201, +-123,40,255,217,133,50,255,214,136,43,255,20,16,11,255,0,12,6,5,5, +-23,29,21,12,153,32,22,13,255,35,25,14,227,15,12,8,85,0,24,12, +-10,9,170,198,124,37,255,215,125,38,255,213,124,38,255,23,18,12,255,0, +-24,14,12,9,170,204,132,47,255,219,144,56,255,211,127,36,255,28,21,13, +-255,0,12,14,12,9,170,198,117,37,255,215,123,42,255,214,125,39,255,25, +-20,12,215,0,8,11,10,8,130,198,119,35,255,215,126,40,255,212,123,37, +-255,30,22,13,255,0,12,14,12,9,170,196,114,33,255,206,106,25,255,200, +-105,21,255,30,21,11,184,0,8,13,11,8,99,184,100,25,255,209,117,28, +-255,210,115,31,255,28,21,13,255,0,20,14,12,9,170,198,117,37,255,215, +-126,40,255,214,126,41,255,25,19,12,255,0,12,10,9,7,125,61,42,22, +-255,190,107,33,255,153,98,38,255,29,23,16,255,13,12,10,255,17,15,10, +-255,108,74,37,255,210,144,59,255,153,98,38,255,16,14,11,224,6,6,5, +-17,0,12,15,13,8,227,115,67,24,255,197,100,22,255,150,81,25,255,32, +-24,13,255,15,13,8,255,19,15,10,255,85,48,18,255,178,95,21,255,115, +-65,20,255,15,12,8,255,5,5,4,34,0,32,10,9,7,198,69,46,22, +-255,186,103,29,255,195,111,28,255,92,58,25,255,15,12,8,198,0,12,10, +-9,7,170,194,112,31,255,215,125,38,255,218,146,53,255,24,19,13,255,0, +-20,15,14,10,227,159,103,42,255,212,127,43,255,177,118,48,255,19,17,12, +-227,6,6,5,28,0,32,11,10,8,170,182,98,23,255,202,106,21,255,195, +-98,20,255,24,17,9,212,0,12,18,14,9,227,102,54,19,255,157,83,18, +-255,85,46,14,255,19,13,6,255,47,27,10,255,150,81,19,255,131,67,20, +-255,39,26,14,255,12,11,9,85,0,64,10,9,7,170,118,75,33,255,215, +-141,54,255,44,33,19,255,0,16,9,9,8,108,19,17,12,170,27,23,16, +-170,23,21,16,170,23,21,16,170,24,20,15,170,20,18,13,170,15,14,10, +-170,10,9,7,113,7,6,6,28,0,12,12,11,9,170,189,99,26,255,209, +-110,30,255,211,118,36,255,141,88,36,255,19,17,12,227,20,18,13,170,24, +-20,15,170,21,19,14,170,16,14,11,170,10,9,7,113,6,6,5,28,0, +-20,8,7,5,65,11,10,8,142,16,14,11,170,24,21,15,170,25,22,16, +-170,23,21,16,170,21,19,14,170,16,14,11,170,11,10,8,113,7,7,6, +-28,0,20,8,7,5,62,10,9,5,136,12,10,7,170,14,11,7,170,13, +-10,6,170,11,9,6,198,31,21,10,255,153,82,18,255,177,85,18,255,169, +-78,18,255,22,15,7,204,0,16,8,7,5,57,11,10,6,142,19,17,12, +-170,23,21,16,170,25,22,16,170,23,21,16,170,21,19,14,170,15,14,10, +-170,10,10,9,113,7,6,6,28,0,16,12,10,7,153,55,32,14,255,175, +-93,20,255,185,94,20,255,183,89,19,255,80,44,17,255,13,11,8,187,7, +-6,6,25,0,16,8,7,5,62,11,10,6,142,16,14,11,170,23,19,14, +-170,25,22,16,170,23,21,16,170,19,17,12,170,15,14,10,170,17,15,10, +-170,19,17,12,142,9,8,8,28,0,8,12,10,9,170,204,137,49,255,220, +-146,59,255,218,146,53,255,141,91,38,255,19,17,12,227,19,17,12,170,24, +-20,15,170,21,19,14,170,15,14,10,170,10,10,9,113,7,6,6,28,0, +-16,12,10,7,57,14,12,7,102,14,11,7,85,0,32,12,10,7,57,13, +-11,8,105,15,13,8,85,0,12,12,11,9,170,204,136,47,255,220,146,59, +-255,218,153,59,255,24,19,13,255,0,12,8,7,5,82,11,10,6,156,11, +-9,6,170,10,9,7,91,0,12,10,8,5,127,144,78,19,255,180,87,19, +-255,174,81,19,255,24,15,7,210,0,12,14,11,7,68,12,10,7,170,12, +-10,7,170,17,15,10,170,24,20,15,170,19,17,12,170,15,14,10,170,18, +-15,11,170,24,21,15,170,21,19,14,170,15,14,10,170,11,10,8,113,7, +-7,6,28,0,16,15,13,10,119,17,15,12,170,15,13,10,170,16,14,11, +-170,19,17,12,170,21,18,12,170,18,15,11,170,15,13,8,170,11,9,6, +-170,10,8,7,88,6,5,5,23,0,20,10,9,7,85,14,12,9,170,19, +-17,12,170,21,19,14,170,21,19,14,170,21,19,14,170,19,17,12,170,15, +-14,10,170,11,10,8,116,7,7,6,28,0,16,15,14,10,119,18,15,11, +-170,15,14,10,170,18,15,11,170,21,19,14,170,25,22,16,170,23,21,16, +-170,21,19,14,170,16,14,11,170,11,10,8,113,7,7,6,28,0,20,10, +-9,7,85,14,12,9,170,19,17,12,170,20,18,13,170,20,18,13,170,23, +-19,14,170,19,17,12,170,15,14,10,170,17,14,10,170,19,17,12,142,10, +-9,7,28,0,12,15,13,10,113,18,15,11,170,15,14,10,170,18,15,11, +-170,21,19,14,170,25,22,16,170,23,21,16,170,20,18,13,170,16,14,11, +-170,11,10,8,113,7,7,6,28,0,20,7,7,6,82,11,10,6,142,16, +-13,9,170,19,17,12,170,21,19,14,170,24,21,15,170,25,22,16,170,25, +-22,16,170,15,13,10,170,12,11,9,57,0,16,15,13,10,170,97,65,34, +-255,209,132,42,255,214,136,43,255,214,127,43,255,159,103,42,255,21,19,14, +-227,11,10,8,28,0,12,16,14,11,113,21,19,14,170,18,15,11,153,11, +-10,8,28,0,16,15,14,10,125,21,19,14,170,19,17,12,142,10,9,7, +-28,0,12,15,14,10,113,21,19,14,170,18,16,11,153,11,10,8,28,0, +-16,15,13,10,125,21,19,14,170,19,17,12,142,10,9,7,28,0,12,15, +-14,10,113,21,19,14,170,18,16,11,153,11,10,8,28,0,24,15,14,10, +-125,21,19,14,170,19,17,12,142,9,9,8,28,0,12,17,14,10,130,27, +-24,16,170,21,19,14,142,10,9,7,28,0,16,16,14,11,113,28,24,17, +-170,24,21,15,161,12,11,9,28,0,12,16,14,11,113,21,19,14,170,18, +-15,11,153,11,10,8,28,0,16,15,13,10,125,21,19,14,170,19,17,12, +-142,9,8,6,28,0,12,18,15,11,136,19,16,10,170,16,13,9,170,16, +-14,9,170,15,13,8,170,13,11,8,170,12,11,9,170,13,12,8,170,15, +-14,10,170,14,13,11,170,11,11,10,113,0,20,13,11,8,170,190,98,23, +-255,204,116,31,255,74,52,27,255,9,8,8,113,0,16,13,11,8,170,192, +-106,29,255,208,112,27,255,208,117,29,255,27,21,12,255,0,16,5,5,4, +-28,27,23,16,255,199,121,44,255,214,139,41,255,31,23,14,255,0,16,13, +-11,8,28,32,24,13,227,36,26,15,255,19,16,12,198,8,8,7,51,0, +-4,8,8,7,57,29,21,12,218,48,32,17,255,45,30,16,255,20,16,11, +-218,10,9,7,105,0,44,14,12,9,170,204,130,51,255,224,153,77,255,225, +-169,88,255,33,27,18,255,0,12,21,19,14,215,217,163,86,255,61,46,28, +-255,0,12,19,16,12,201,203,121,40,255,51,38,22,255,0,12,4,4,3, +-25,16,14,11,227,212,147,71,255,224,160,77,255,223,161,80,255,31,25,16, +-255,4,4,4,102,10,10,9,215,206,133,55,255,223,156,70,255,224,164,85, +-255,51,39,24,255,5,5,4,82,0,12,15,12,8,110,178,98,27,255,211, +-115,30,255,211,121,34,255,36,26,15,255,3,3,2,85,0,60,8,8,5, +-28,27,20,10,232,125,73,22,255,190,97,21,255,180,92,21,255,97,56,20, +-255,14,11,7,170,0,16,12,10,7,142,165,89,22,255,198,104,21,255,84, +-50,19,255,7,6,4,159,0,4,5,5,4,82,32,23,11,255,121,69,22, +-255,97,56,20,255,15,13,8,142,0,32,14,12,7,198,172,92,21,255,28, +-19,9,207,0,8,11,10,6,85,148,78,21,255,198,104,21,255,192,97,21, +-255,21,15,8,255,0,24,10,9,5,170,167,90,22,255,202,93,21,255,202, +-103,23,255,21,16,10,255,0,20,4,3,3,133,20,16,9,255,151,80,22, +-255,75,42,16,255,10,8,7,255,32,22,11,255,164,86,23,255,60,39,17, +-255,5,5,4,252,0,36,12,11,9,198,213,155,80,255,224,166,83,255,211, +-121,34,255,20,16,9,255,3,3,2,28,0,144,6,6,5,51,27,20,10, +-255,160,84,23,255,198,104,21,255,67,40,16,255,8,7,5,125,0,12,12, +-10,9,170,195,112,30,255,215,125,38,255,217,133,50,255,49,35,22,255,5, +-5,4,133,13,12,10,210,189,119,50,255,211,127,44,255,212,121,41,255,218, +-135,53,255,220,148,63,255,34,27,17,255,0,20,4,4,4,17,13,12,10, +-227,196,113,31,255,212,118,35,255,214,123,43,255,33,26,16,255,0,56,12, +-11,9,187,208,134,55,255,223,146,70,255,221,152,70,255,34,26,17,255,0, +-40,8,7,5,164,165,86,22,255,202,98,21,255,198,96,21,255,22,16,9, +-255,0,20,8,8,5,85,32,22,11,255,167,87,22,255,160,84,23,255,93, +-54,20,255,120,65,21,255,188,96,21,255,196,99,21,255,200,105,21,255,24, +-19,11,207,0,8,15,14,10,110,208,152,71,255,227,174,98,255,228,179,103, +-255,225,176,98,255,217,169,94,255,213,166,92,255,215,167,92,255,213,155,80, +-255,204,136,55,255,138,89,37,255,25,22,16,227,9,9,8,28,0,8,11, +-10,8,170,203,129,50,255,223,149,70,255,222,158,75,255,31,25,16,255,4, +-4,4,28,0,60,8,8,7,57,49,40,26,255,206,152,83,255,224,169,91, +-255,194,140,71,255,31,27,20,255,9,8,8,28,0,8,12,10,9,161,196, +-110,33,255,218,130,51,255,222,158,75,255,31,25,16,255,4,4,4,28,0, +-8,11,10,8,198,213,160,84,255,228,180,105,255,227,175,100,255,33,28,18, +-207,0,8,12,11,9,130,210,155,77,255,228,169,99,255,226,172,95,255,30, +-25,17,255,4,4,4,28,0,8,11,10,8,198,204,129,49,255,214,127,43, +-255,213,125,40,255,23,19,12,232,0,8,14,13,9,125,208,152,71,255,223, +-159,76,255,218,153,59,255,33,26,16,210,0,8,13,12,10,127,198,118,39, +-255,215,127,42,255,213,126,42,255,41,31,18,227,0,12,6,6,5,28,25, +-21,16,227,204,150,79,255,223,171,98,255,175,122,60,255,18,15,11,218,5, +-4,4,17,0,20,20,18,13,85,177,101,34,255,204,123,37,255,199,117,36, +-255,199,117,36,255,202,122,37,255,199,117,36,255,198,114,31,255,198,110,31, +-255,202,118,35,255,46,33,21,170,0,24,10,9,7,153,110,78,37,255,213, +-162,82,255,218,164,87,255,67,51,30,255,9,8,8,85,0,40,6,5,5, +-28,21,19,14,255,217,166,92,255,227,175,100,255,224,169,91,255,31,25,16, +-215,0,8,12,10,7,85,154,80,21,255,197,99,20,255,192,97,21,255,28, +-20,9,255,4,3,3,110,11,9,6,170,117,63,20,255,184,94,21,255,198, +-104,21,255,203,104,24,255,210,122,37,255,21,17,12,252,0,8,10,9,7, +-161,203,129,50,255,224,160,77,255,225,169,88,255,30,25,17,255,4,4,4, +-28,0,8,8,7,5,190,165,86,22,255,198,104,21,255,196,99,21,255,28, +-19,9,170,0,8,13,11,8,85,176,91,23,255,208,112,27,255,210,121,35, +-255,27,22,14,255,4,4,4,28,0,8,11,10,8,198,211,149,76,255,224, +-168,87,255,224,162,81,255,32,26,17,210,0,8,12,10,7,113,176,91,23, +-255,202,107,23,255,202,95,23,255,20,16,9,255,0,40,15,13,10,170,213, +-160,84,255,228,180,105,255,227,174,98,255,33,26,18,255,0,12,15,13,10, +-170,213,155,80,255,226,172,95,255,224,167,85,255,23,20,14,244,0,8,11, +-10,8,127,189,104,28,255,214,127,43,255,221,148,70,255,31,25,16,255,4, +-4,4,28,0,28,14,12,9,170,195,113,32,255,209,117,28,255,202,103,23, +-255,20,15,9,252,3,3,3,14,0,28,15,14,10,170,213,155,80,255,226, +-172,95,255,221,152,70,255,28,24,15,255,0,40,14,12,9,170,208,141,61, +-255,225,162,88,255,227,174,98,255,33,26,18,255,4,4,4,28,0,8,10, +-8,7,198,182,98,23,255,202,103,23,255,198,104,21,255,28,19,9,170,0, +-8,11,10,6,85,154,80,21,255,202,98,21,255,202,103,23,255,25,20,12, +-255,0,40,12,10,7,170,186,100,23,255,202,99,23,255,200,105,21,255,30, +-21,9,170,0,8,12,9,7,85,154,80,21,255,198,104,21,255,196,99,21, +-255,28,20,9,255,4,4,3,113,11,10,6,227,183,100,26,255,212,127,43, +-255,167,117,52,255,17,15,12,215,5,5,5,14,0,12,15,13,10,170,211, +-149,76,255,224,166,83,255,223,161,80,255,34,26,17,255,0,32,10,9,7, +-170,167,87,22,255,198,92,21,255,196,99,21,255,196,95,21,255,198,92,21, +-255,195,99,22,255,192,106,29,255,206,127,43,255,217,141,60,255,223,146,70, +-255,224,165,81,255,220,148,63,255,212,124,39,255,25,19,12,215,0,8,12, +-11,9,116,196,116,37,255,218,141,51,255,218,139,55,255,218,142,61,255,215, +-143,58,255,24,19,13,212,0,4,10,9,7,156,203,129,50,255,221,150,66, +-255,220,148,63,255,25,21,14,227,0,8,10,10,7,159,204,134,59,255,225, +-160,84,255,225,169,88,255,36,29,19,255,0,12,15,14,10,170,204,130,51, +-255,220,142,59,255,218,139,55,255,21,18,12,249,0,8,11,10,8,142,206, +-145,67,255,226,172,95,255,227,174,98,255,32,26,17,255,4,4,4,28,0, +-8,11,10,8,198,198,117,37,255,215,125,38,255,211,122,36,255,28,21,13, +-215,0,8,13,11,8,96,174,91,23,255,202,107,23,255,202,103,23,255,22, +-17,9,255,0,12,11,10,6,170,176,91,23,255,202,103,23,255,203,108,24, +-255,21,15,10,238,0,8,11,10,8,142,206,145,67,255,226,170,91,255,224, +-160,85,255,30,24,17,255,4,4,4,28,0,8,11,10,8,198,209,149,70, +-255,224,160,77,255,222,158,75,255,31,25,16,212,0,8,12,11,9,127,198, +-116,35,255,215,125,38,255,211,122,36,255,28,21,13,255,4,4,4,28,0, +-52,13,12,8,170,195,112,30,255,209,110,30,255,207,105,30,255,25,20,12, +-255,0,24,15,14,10,170,213,158,80,255,226,172,95,255,224,164,85,255,33, +-27,18,255,0,12,15,14,10,170,210,143,65,255,224,168,87,255,224,165,81, +-255,25,21,14,232,0,8,10,10,9,153,208,147,67,255,224,166,83,255,222, +-158,75,255,34,26,17,255,0,12,15,14,10,170,211,149,76,255,223,149,70, +-255,219,146,60,255,25,20,14,235,0,8,10,10,9,150,204,134,59,255,224, +-156,83,255,224,165,81,255,33,27,18,255,0,20,15,14,10,170,211,150,70, +-255,226,170,91,255,226,172,95,255,33,26,18,255,0,16,9,9,8,150,101, +-74,38,255,198,145,77,255,206,157,87,255,202,151,79,255,197,141,74,255,200, +-146,75,255,180,126,57,255,21,19,14,227,5,5,4,28,0,16,8,7,5, +-113,43,28,14,255,187,96,22,255,181,93,22,255,98,55,21,255,68,42,17, +-255,77,46,18,255,129,72,22,255,174,89,21,255,83,47,18,255,11,9,6, +-221,0,28,6,6,5,28,16,14,11,195,108,76,35,255,210,141,59,255,218, +-162,81,255,167,118,54,255,16,14,11,221,5,5,5,14,0,12,15,13,10, +-170,211,149,76,255,224,168,87,255,223,154,80,255,31,25,16,255,0,20,6, +-6,5,57,34,27,17,255,203,122,36,255,208,124,41,255,109,76,34,255,13, +-12,10,142,0,32,13,11,8,170,176,91,23,255,202,93,21,255,196,99,21, +-255,28,19,9,170,0,8,11,9,6,85,132,71,21,255,195,99,22,255,103, +-59,20,255,11,10,6,170,3,3,2,25,6,6,5,110,55,35,16,255,198, +-113,29,255,212,134,51,255,41,32,20,210,0,68,21,19,14,215,217,163,86, +-255,49,38,24,255,0,12,11,10,8,82,54,43,27,255,200,135,59,255,210, +-137,59,255,207,131,50,255,205,127,44,255,199,117,36,255,195,111,28,255,187, +-101,24,255,93,54,22,255,19,15,10,227,7,6,6,28,0,8,10,9,7, +-170,195,109,32,255,218,138,53,255,224,158,81,255,223,173,95,255,219,167,94, +-255,217,169,94,255,218,171,97,255,217,166,92,255,208,136,59,255,110,68,27, +-255,19,15,10,227,6,6,5,28,0,12,12,11,7,170,61,42,20,255,188, +-106,33,255,208,134,55,255,215,163,82,255,217,166,92,255,216,167,88,255,216, +-167,89,255,211,150,70,255,146,94,39,255,26,21,15,229,9,8,6,28,0, +-12,12,10,7,170,51,32,14,255,151,80,22,255,169,91,22,255,173,86,22, +-255,169,88,22,255,173,86,22,255,180,92,21,255,194,98,21,255,196,95,21, +-255,192,97,21,255,31,21,10,170,0,12,12,10,7,170,57,37,18,255,189, +-107,34,255,212,149,67,255,217,166,92,255,217,166,92,255,218,171,97,255,215, +-163,82,255,205,126,48,255,116,72,29,255,20,16,11,227,6,6,5,28,0, +-8,11,9,6,68,126,68,21,255,191,98,22,255,194,98,21,255,192,97,21, +-255,192,97,21,255,191,98,22,255,177,91,22,255,26,19,9,142,0,12,12, +-10,7,170,58,37,17,255,185,107,30,255,208,134,55,255,216,167,88,255,218, +-171,97,255,217,166,92,255,213,148,72,255,204,130,51,255,209,141,60,255,211, +-159,76,255,30,25,17,170,0,8,10,10,7,167,210,155,77,255,228,178,99, +-255,224,165,81,255,221,165,86,255,217,166,92,255,218,169,93,255,217,166,92, +-255,214,156,81,255,206,135,51,255,116,72,29,255,20,16,11,227,6,6,5, +-28,0,8,13,10,6,57,115,62,20,255,169,91,22,255,165,86,22,255,24, +-18,9,167,0,24,12,10,7,88,117,63,20,255,186,100,23,255,191,107,32, +-255,35,27,16,144,0,8,10,10,7,170,210,155,77,255,228,178,99,255,221, +-152,70,255,24,19,13,255,0,8,12,10,7,170,58,36,15,255,157,79,22, +-255,151,80,22,255,58,35,15,255,11,9,6,57,0,8,12,10,7,85,157, +-81,20,255,197,99,20,255,192,97,21,255,28,20,9,170,0,8,11,9,6, +-57,115,62,20,255,189,94,24,255,198,117,37,255,213,157,76,255,218,171,97, +-255,217,169,94,255,214,161,85,255,213,157,76,255,212,149,67,255,208,134,55, +-255,205,126,48,255,143,96,40,255,28,26,19,229,8,8,7,28,0,8,13, +-12,8,85,141,74,24,255,190,94,23,255,183,95,24,255,183,95,24,255,187, +-93,24,255,189,97,22,255,181,93,22,255,177,91,22,255,169,88,22,255,89, +-52,20,255,21,18,12,227,9,9,8,28,0,12,18,17,13,181,103,74,40, +-255,207,146,74,255,214,156,81,255,210,144,67,255,208,138,55,255,207,129,52, +-255,205,133,48,255,205,126,48,255,151,101,42,255,28,26,19,232,9,8,8, +-28,0,8,13,12,10,110,186,127,63,255,214,156,81,255,213,158,80,255,213, +-155,80,255,214,156,81,255,214,153,75,255,213,148,72,255,213,148,72,255,211, +-150,70,255,159,111,54,255,28,25,19,241,9,8,8,31,0,12,18,17,13, +-181,103,74,40,255,208,156,81,255,214,156,81,255,208,138,55,255,209,137,60, +-255,213,158,80,255,213,155,80,255,213,160,84,255,215,160,88,255,213,163,84, +-255,30,24,17,178,0,8,12,11,9,93,178,121,53,255,213,158,80,255,210, +-143,65,255,211,146,62,255,213,148,72,255,215,163,82,255,213,158,80,255,212, +-149,67,255,209,141,60,255,153,106,49,255,28,25,19,235,9,9,8,31,0, +-12,18,15,11,173,66,43,21,255,187,101,32,255,207,132,52,255,210,144,67, +-255,213,148,72,255,214,156,81,255,216,167,88,255,214,156,81,255,176,128,65, +-255,46,39,27,255,0,12,15,14,10,85,181,111,42,255,215,136,52,255,213, +-125,40,255,211,122,36,255,212,123,37,255,210,123,39,255,202,122,37,255,31, +-24,14,170,0,8,12,11,9,88,164,89,29,255,203,122,36,255,199,117,36, +-255,30,23,15,212,0,12,15,13,10,127,187,133,62,255,213,148,72,255,208, +-138,55,255,31,24,16,170,0,8,13,12,10,85,172,104,37,255,209,134,54, +-255,206,135,51,255,32,25,17,212,0,12,15,13,10,127,181,116,46,255,211, +-143,62,255,210,153,71,255,29,24,16,178,0,8,13,12,10,91,178,121,53, +-255,213,154,70,255,208,134,55,255,31,25,16,210,0,20,15,14,10,125,179, +-110,42,255,210,135,55,255,208,139,65,255,26,21,15,184,0,8,14,13,9, +-85,179,117,44,255,217,165,82,255,213,163,84,255,27,23,16,221,0,12,14, +-12,9,136,174,103,39,255,206,127,43,255,199,117,36,255,31,24,14,170,0, +-8,12,11,9,88,164,89,29,255,202,118,35,255,196,114,33,255,29,22,14, +-210,0,12,14,12,9,125,169,95,30,255,202,119,37,255,199,119,39,255,24, +-19,13,190,0,8,14,12,9,85,170,95,29,255,198,113,29,255,199,116,34, +-255,204,128,47,255,206,135,51,255,204,129,49,255,204,129,49,255,208,134,55, +-255,211,149,76,255,192,140,73,255,95,74,39,255,17,15,12,85,0,16,14, +-12,9,198,211,150,70,255,206,152,81,255,31,26,20,255,7,7,6,48,0, +-16,15,13,10,170,211,149,76,255,226,170,91,255,226,172,95,255,35,28,18, +-255,0,20,15,14,12,218,171,120,60,255,219,154,70,255,41,31,20,255,4, +-4,3,28,0,104,17,16,12,170,219,179,116,255,232,193,137,255,232,199,135, +-255,40,33,23,255,0,12,10,10,9,76,62,50,31,255,20,18,13,167,0, +-12,11,10,8,76,58,46,29,255,20,18,13,167,0,16,13,12,10,170,210, +-150,71,255,223,147,72,255,221,150,66,255,26,21,15,210,0,4,11,10,8, +-119,211,159,84,255,229,184,114,255,230,186,123,255,30,26,19,255,0,16,12, +-11,9,93,137,90,40,255,223,167,94,255,228,180,111,255,167,133,80,255,17, +-16,14,227,11,11,10,170,12,11,9,170,12,11,9,170,12,11,9,119,7, +-7,6,57,0,36,7,7,6,62,21,18,12,227,157,92,28,255,203,105,26, +-255,197,106,26,255,82,48,21,255,14,12,7,173,5,5,4,8,0,16,8, +-7,5,28,26,19,11,227,103,68,25,255,158,96,29,255,57,41,22,255,13, +-12,10,241,33,26,16,255,146,88,31,255,66,47,23,255,12,10,9,201,6, +-5,5,14,0,32,8,7,5,57,30,22,11,255,15,12,8,96,0,8,10, +-10,7,130,190,104,27,255,209,118,30,255,211,117,34,255,27,21,14,255,0, +-24,13,12,10,170,199,122,39,255,218,130,51,255,223,146,70,255,30,24,17, +-255,0,12,23,22,18,139,30,27,21,170,16,15,11,255,89,59,26,255,203, +-110,28,255,196,113,31,255,122,81,33,255,186,117,43,255,216,129,51,255,184, +-126,57,255,38,34,25,255,24,22,19,221,33,30,24,170,15,15,12,28,0, +-12,24,22,19,142,32,31,25,170,21,20,16,198,90,71,45,255,223,179,110, +-255,226,172,95,255,221,150,66,255,143,100,44,255,22,21,17,227,28,27,21, +-170,29,28,22,170,13,13,12,42,0,36,8,8,8,11,25,24,20,142,39, +-35,28,170,30,28,23,170,29,27,22,170,29,27,22,170,29,27,22,170,29, +-27,22,170,29,27,20,170,23,21,16,170,14,13,11,34,0,52,13,12,10, +-159,142,86,31,255,208,116,35,255,201,119,38,255,32,26,17,255,5,5,4, +-28,0,12,14,13,11,170,216,167,97,255,231,184,124,255,231,193,128,255,181, +-146,92,255,52,44,33,255,90,71,45,255,201,155,88,255,223,173,102,255,228, +-179,115,255,230,183,123,255,230,184,119,255,39,32,22,255,0,24,12,12,11, +-170,206,139,61,255,226,164,91,255,228,174,103,255,39,32,22,255,0,48,6, +-6,5,28,9,9,8,142,56,46,31,255,222,180,113,255,230,187,119,255,222, +-180,113,255,23,21,16,255,0,36,15,14,12,164,79,59,30,255,209,128,42, +-255,211,127,44,255,171,117,46,255,18,15,11,170,0,16,9,9,8,116,33, +-28,16,255,161,94,28,255,199,107,26,255,65,40,18,255,8,7,5,255,25, +-20,12,255,198,113,29,255,210,120,33,255,217,133,50,255,27,23,16,255,0, +-8,7,7,6,23,34,28,19,198,46,36,25,255,39,31,22,255,41,33,22, +-255,59,46,28,255,51,40,26,255,61,47,28,255,180,133,71,255,227,175,100, +-255,226,175,103,255,181,143,88,255,17,16,12,142,0,8,11,11,10,170,214, +-166,97,255,229,179,114,255,228,185,111,255,161,121,68,255,23,21,16,227,23, +-22,18,170,22,21,17,170,16,15,13,170,11,11,8,147,8,8,7,85,0, +-40,14,13,11,170,181,143,88,255,228,185,123,255,218,168,97,255,70,54,35, +-255,9,9,8,113,0,12,11,10,8,85,120,87,45,255,223,183,120,255,231, +-190,132,255,167,135,80,255,24,22,19,227,19,18,16,170,19,18,16,198,95, +-80,46,255,226,193,129,255,228,187,129,255,186,148,87,255,15,14,12,170,0, +-8,10,10,9,85,155,113,64,255,229,196,132,255,232,191,133,255,179,142,90, +-255,27,25,20,227,18,18,15,170,19,18,16,198,90,71,45,255,222,175,101, +-255,227,174,98,255,228,185,111,255,28,25,19,255,0,8,7,7,6,23,34, +-28,19,198,49,35,22,255,39,29,18,227,12,11,9,85,0,8,8,7,7, +-28,33,26,16,198,52,39,23,255,47,35,22,227,13,12,8,85,0,8,8, +-8,7,28,33,30,24,227,201,157,100,255,230,186,123,255,181,137,74,255,16, +-15,11,207,6,6,5,23,0,24,11,10,8,28,27,21,12,193,26,19,11, +-255,23,18,10,255,23,18,10,255,24,18,11,255,24,18,11,255,26,20,11, +-255,35,27,16,255,42,31,19,241,17,14,10,85,0,28,9,9,8,144,91, +-67,36,255,217,154,72,255,211,150,70,255,69,55,34,255,15,14,12,85,0, +-28,6,6,5,11,11,11,10,142,24,22,19,255,167,135,80,255,225,172,104, +-255,224,166,83,255,193,126,54,255,16,14,11,170,0,8,13,12,8,85,185, +-97,26,255,207,112,28,255,204,110,27,255,71,46,22,255,8,8,7,255,28, +-22,13,255,198,107,27,255,193,111,30,255,126,78,31,255,199,139,62,255,226, +-184,111,255,27,24,18,255,0,8,11,10,8,170,214,166,97,255,230,187,119, +-255,228,179,103,255,143,102,48,255,17,16,12,227,12,12,9,170,13,12,10, +-198,46,33,17,255,199,112,28,255,206,111,27,255,204,110,27,255,32,23,13, +-176,0,8,12,11,9,136,204,134,59,255,226,172,95,255,228,181,107,255,162, +-125,73,255,24,22,19,227,19,18,16,170,19,18,16,198,95,80,46,255,224, +-179,109,255,223,173,95,255,173,117,50,255,15,13,10,156,0,8,12,11,7, +-99,185,97,26,255,208,112,27,255,204,110,27,255,22,18,11,255,0,40,16, +-15,13,170,219,179,116,255,232,194,133,255,231,193,128,255,40,33,23,255,0, +-12,16,15,13,170,219,177,112,255,230,187,119,255,224,159,83,255,24,21,15, +-255,0,8,11,10,8,164,211,158,82,255,229,184,114,255,230,191,123,255,166, +-127,77,255,22,21,17,227,22,21,17,170,20,19,13,170,14,13,11,28,0, +-16,12,11,9,170,195,112,30,255,209,106,30,255,206,111,27,255,101,63,26, +-255,16,14,11,227,23,21,16,170,29,27,22,170,13,13,12,42,0,16,16, +-15,13,170,216,167,97,255,224,158,87,255,216,125,45,255,24,20,13,255,0, +-40,17,16,12,170,219,177,112,255,232,195,137,255,231,189,128,255,162,125,73, +-255,22,21,17,227,14,14,11,170,13,12,10,198,50,35,19,255,199,112,28, +-255,206,111,27,255,204,110,27,255,32,24,13,170,0,8,13,12,8,93,194, +-109,33,255,219,139,54,255,224,158,81,255,39,32,22,255,0,40,11,10,8, +-170,190,104,27,255,208,112,27,255,204,110,27,255,32,24,13,170,0,8,13, +-12,8,85,184,96,25,255,207,112,28,255,204,102,27,255,129,78,28,255,31, +-26,16,255,127,84,34,255,219,147,70,255,173,122,62,255,15,14,12,212,6, +-6,5,25,0,16,16,15,13,170,213,155,80,255,221,144,68,255,217,130,52, +-255,31,25,16,255,0,32,10,9,7,170,189,99,26,255,208,112,27,255,204, +-110,27,255,155,87,26,255,72,46,21,255,179,103,36,255,223,156,76,255,216, +-170,97,255,134,96,47,255,174,127,71,255,221,167,90,255,223,147,72,255,222, +-158,75,255,23,19,14,252,0,8,11,10,8,170,214,166,97,255,231,187,124, +-255,230,191,123,255,228,182,117,255,222,175,101,255,64,50,33,255,7,7,6, +-229,26,23,19,255,220,175,105,255,228,183,113,255,228,188,117,255,25,21,16, +-255,0,8,11,10,8,170,217,176,112,255,232,197,137,255,232,199,135,255,37, +-31,22,255,0,12,13,12,10,170,198,117,37,255,215,127,42,255,217,130,52, +-255,21,19,14,255,0,8,11,10,8,167,215,172,104,255,232,191,133,255,231, +-190,132,255,166,127,77,255,23,21,16,227,18,17,15,170,17,16,12,198,74, +-52,27,255,204,117,33,255,211,111,30,255,173,93,28,255,15,12,8,164,0, +-8,13,12,8,88,185,97,26,255,208,112,27,255,204,110,27,255,19,16,10, +-255,0,12,10,9,7,170,190,104,27,255,212,118,35,255,216,136,51,255,21, +-19,14,252,0,8,11,10,8,167,215,172,104,255,232,194,127,255,231,193,128, +-255,166,129,77,255,23,21,16,227,19,18,16,170,19,18,14,198,81,59,34, +-255,213,144,62,255,215,140,60,255,165,108,40,255,13,12,10,167,0,8,8, +-8,7,85,101,63,26,255,206,114,33,255,212,121,33,255,155,92,36,255,23, +-21,16,227,22,21,17,170,28,26,21,170,21,20,18,170,13,13,12,164,10, +-10,9,85,6,6,6,6,0,28,12,11,9,170,194,112,31,255,212,119,37, +-255,216,134,45,255,35,28,18,255,0,24,16,15,13,170,217,171,106,255,231, +-187,124,255,228,181,107,255,39,32,22,255,0,12,16,15,11,170,208,134,55, +-255,223,156,70,255,221,148,70,255,23,20,14,238,0,8,11,10,8,170,204, +-136,55,255,223,156,70,255,222,158,75,255,34,28,19,255,0,12,14,13,11, +-170,217,171,106,255,232,189,127,255,230,186,123,255,25,22,16,255,0,8,10, +-10,9,167,210,155,77,255,226,172,95,255,224,165,81,255,31,26,18,255,0, +-20,15,13,12,170,217,173,104,255,232,191,133,255,231,195,132,255,40,33,23, +-255,0,20,10,9,9,133,73,58,36,255,225,184,120,255,231,193,128,255,228, +-180,111,255,147,102,48,255,15,13,10,227,8,7,7,28,0,24,12,11,7, +-198,100,59,23,255,169,93,26,255,156,91,27,255,174,96,27,255,180,99,27, +-255,168,97,27,255,105,62,24,255,18,15,9,255,7,6,6,48,0,24,7, +-7,7,28,15,15,12,227,144,114,67,255,219,177,112,255,223,176,102,255,153, +-113,62,255,17,16,12,227,7,7,6,28,0,16,16,15,13,170,213,155,80, +-255,223,146,70,255,217,129,50,255,27,22,14,255,0,24,12,10,9,195,161, +-94,28,255,207,114,32,255,193,114,36,255,23,20,16,255,0,32,12,11,9, +-170,191,105,28,255,207,100,28,255,204,110,27,255,26,20,11,204,0,8,6, +-5,5,3,26,19,9,198,24,18,9,246,15,12,8,142,0,12,15,13,10, +-91,31,24,16,244,51,39,24,255,21,19,14,91,0,68,10,10,9,76,61, +-49,30,255,20,18,13,156,0,16,17,15,12,142,27,22,14,232,30,22,13, +-255,25,20,12,255,22,18,11,238,21,16,10,255,99,58,22,255,203,113,26, +-255,205,111,28,255,131,80,30,255,12,11,9,142,0,8,11,10,8,170,212, +-160,85,255,232,191,127,255,231,195,132,255,196,155,91,255,81,59,34,255,41, +-32,20,255,54,43,27,255,180,133,71,255,216,144,59,255,208,115,33,255,129, +-78,28,255,12,11,7,142,0,8,8,7,7,57,72,52,29,255,215,155,78, +-255,227,174,98,255,207,158,94,255,85,63,34,255,36,29,19,255,57,43,26, +-255,189,130,66,255,219,149,66,255,212,121,41,255,172,105,33,255,17,15,10, +-147,0,8,7,6,6,54,58,40,21,255,198,113,29,255,206,103,27,255,165, +-87,24,255,42,28,13,255,21,16,8,255,27,20,10,255,95,60,22,255,202, +-105,27,255,206,100,29,255,204,110,27,255,35,24,12,170,0,8,7,7,6, +-54,70,50,27,255,212,145,65,255,227,174,98,255,201,155,88,255,59,44,28, +-255,23,20,14,255,34,28,19,255,157,104,48,255,211,126,42,255,208,115,33, +-255,132,82,29,255,13,11,8,142,0,12,24,18,9,221,108,61,23,255,201, +-112,26,255,207,112,28,255,204,110,27,255,158,91,25,255,46,29,13,249,11, +-10,6,57,0,8,8,8,7,57,70,50,27,255,212,142,59,255,226,172,95, +-255,207,158,94,255,85,63,34,255,41,32,20,255,57,43,26,255,174,124,59, +-255,224,170,93,255,229,184,114,255,231,196,128,255,28,25,19,255,0,8,10, +-10,9,167,215,169,102,255,232,191,127,255,231,193,128,255,196,154,87,255,77, +-59,34,255,41,31,20,255,54,43,27,255,168,113,49,255,212,121,41,255,206, +-114,33,255,132,82,29,255,12,11,9,130,0,8,12,11,7,110,188,98,25, +-255,206,111,27,255,206,106,25,255,26,19,11,255,0,24,14,12,9,170,199, +-117,36,255,221,148,62,255,227,174,98,255,28,26,19,255,0,8,10,10,9, +-167,212,161,89,255,224,166,83,255,217,129,50,255,32,24,15,255,5,5,4, +-31,7,7,6,136,65,44,22,255,192,106,29,255,203,108,24,255,114,66,23, +-255,17,13,8,221,0,12,10,9,7,139,185,97,26,255,208,112,27,255,208, +-117,29,255,32,24,13,170,0,8,15,13,8,91,189,99,26,255,215,123,42, +-255,226,172,95,255,198,152,87,255,81,58,34,255,176,133,71,255,224,168,95, +-255,197,138,62,255,65,47,26,255,133,81,30,255,208,121,37,255,212,115,37, +-255,152,98,35,255,12,11,9,142,0,8,10,9,7,147,190,107,25,255,206, +-111,27,255,206,106,25,255,158,91,25,255,42,28,13,255,21,15,8,255,26, +-19,9,255,114,66,23,255,204,113,25,255,208,115,33,255,173,122,62,255,16, +-15,13,150,0,8,8,8,7,71,110,87,51,255,222,180,113,255,224,166,83, +-255,209,137,60,255,133,84,32,255,77,50,24,255,89,59,26,255,181,109,32, +-255,210,121,35,255,212,121,41,255,171,116,52,255,15,14,12,142,0,8,14, +-13,11,170,219,177,112,255,231,187,124,255,228,180,111,255,205,158,90,255,79, +-58,32,255,38,29,19,255,49,35,22,255,167,114,46,255,217,146,62,255,219, +-154,70,255,169,117,56,255,15,13,12,156,0,8,8,8,7,71,104,80,45, +-255,224,183,119,255,232,191,127,255,210,166,97,255,81,60,32,255,39,30,18, +-255,52,40,25,255,175,128,66,255,225,173,98,255,228,180,105,255,226,175,95, +-255,29,25,18,255,0,8,12,12,11,170,208,138,55,255,222,145,63,255,220, +-139,59,255,193,121,50,255,68,50,29,255,38,28,19,255,48,35,23,255,175, +-112,44,255,217,142,54,255,217,144,66,255,191,137,66,255,19,16,12,170,0, +-8,9,8,8,74,111,82,40,255,216,155,75,255,226,172,95,255,200,151,81, +-255,57,41,26,255,27,23,16,255,35,28,18,255,41,32,20,255,39,30,20, +-255,25,22,16,227,15,14,10,142,0,12,10,9,7,28,33,24,14,227,135, +-81,28,255,206,117,31,255,210,108,33,255,208,110,31,255,171,92,28,255,49, +-33,16,252,13,11,8,68,0,8,11,10,8,170,195,108,30,255,212,118,35, +-255,217,137,52,255,42,33,23,255,0,12,20,18,15,170,214,156,81,255,221, +-148,62,255,214,127,43,255,23,19,12,238,0,8,10,10,7,159,196,109,31, +-255,213,119,36,255,212,123,37,255,31,24,14,255,0,12,15,14,10,170,209, +-137,60,255,228,172,99,255,230,189,119,255,28,26,19,255,0,8,12,12,11, +-170,208,134,55,255,218,137,51,255,214,127,43,255,35,27,16,255,0,20,16, +-14,11,170,199,116,34,255,217,132,48,255,224,166,83,255,32,26,19,255,0, +-8,10,10,7,34,81,58,34,255,224,178,105,255,226,172,95,255,129,92,40, +-255,9,9,8,170,6,6,6,85,6,6,5,113,35,27,16,255,204,117,33, +-255,208,117,29,255,110,69,25,255,14,12,7,108,0,8,10,10,7,170,195, +-112,30,255,211,115,30,255,211,115,30,255,30,23,13,255,0,12,14,12,9, +-170,196,113,31,255,211,120,32,255,214,126,41,255,33,26,18,255,0,8,9, +-8,6,28,44,33,19,212,60,42,23,255,46,35,21,255,74,53,31,255,156, +-109,53,255,216,167,97,255,228,179,109,255,229,177,110,255,227,184,108,255,168, +-123,69,255,23,21,16,227,9,8,8,28,0,12,17,16,14,170,134,98,51, +-255,223,166,92,255,132,100,53,255,9,9,8,133,0,20,16,15,13,170,219, +-177,112,255,232,191,133,255,231,195,132,255,40,33,23,255,0,20,6,6,5, +-45,39,32,22,255,210,129,49,255,172,106,35,255,20,17,13,227,11,11,8, +-28,0,100,17,17,14,170,221,189,132,255,235,205,154,255,234,205,155,255,42, +-39,29,255,0,16,9,9,8,25,0,20,9,8,8,25,0,20,14,14,11, +-170,208,141,61,255,224,168,87,255,228,174,103,255,31,26,20,221,0,4,13, +-12,12,130,218,185,127,255,234,202,147,255,232,198,139,255,40,33,25,255,0, +-20,17,17,14,176,140,115,71,255,230,202,147,255,232,202,149,255,218,170,101, +-255,200,124,43,255,198,117,37,255,198,117,37,255,196,116,37,255,72,52,27, +-255,12,11,9,170,0,28,8,8,7,85,37,31,20,255,174,110,41,255,210, +-123,39,255,204,120,37,255,130,87,31,255,15,13,10,190,0,28,5,5,4, +-113,28,26,19,255,210,143,65,255,220,163,81,255,217,166,92,255,222,173,97, +-255,225,176,98,255,42,37,25,255,4,4,4,74,0,56,13,12,10,170,208, +-141,61,255,226,172,95,255,228,183,111,255,40,34,25,255,0,24,17,16,14, +-170,219,177,112,255,232,194,133,255,233,202,148,255,27,24,20,255,0,8,16, +-15,13,85,199,161,102,255,220,166,89,255,211,143,62,255,217,154,72,255,223, +-161,80,255,224,169,91,255,225,185,114,255,229,188,124,255,231,190,132,255,231, +-200,143,255,227,195,140,255,227,196,138,255,225,195,136,255,44,37,27,170,0, +-8,17,16,14,85,200,165,109,255,227,198,142,255,225,191,132,255,227,195,134, +-255,231,199,136,255,231,197,132,255,231,194,124,255,229,191,130,255,225,195,136, +-255,225,195,136,255,225,191,132,255,49,42,30,198,0,36,18,17,13,105,193, +-135,66,255,221,175,102,255,222,186,123,255,223,190,132,255,224,192,135,255,223, +-190,132,255,222,186,123,255,221,178,110,255,218,172,105,255,46,39,27,195,0, +-48,6,6,6,28,27,26,20,255,216,170,97,255,225,178,104,255,176,136,83, +-255,16,15,13,198,0,16,17,17,14,170,221,188,130,255,235,205,154,255,234, +-205,155,255,232,204,149,255,228,199,143,255,171,144,96,255,64,57,41,255,154, +-126,81,255,227,189,122,255,230,184,119,255,227,171,98,255,34,30,21,255,0, +-24,17,16,14,170,221,186,126,255,234,202,147,255,232,192,135,255,44,39,27, +-255,0,44,9,9,8,142,25,24,20,255,114,95,53,255,207,169,102,255,227, +-187,118,255,226,188,123,255,178,148,95,255,19,18,16,170,0,32,24,22,19, +-85,197,145,84,255,227,187,118,255,231,194,124,255,207,173,114,255,61,55,38, +-255,8,8,8,136,0,12,10,10,9,108,45,36,21,255,195,116,38,255,207, +-122,38,255,139,90,32,255,13,12,8,170,0,4,10,10,9,198,208,140,59, +-255,226,170,91,255,231,193,128,255,40,35,27,255,0,36,4,4,3,28,18, +-17,13,227,222,189,131,255,234,201,143,255,229,191,130,255,34,30,23,204,0, +-8,11,11,10,170,211,158,82,255,226,170,91,255,224,165,81,255,219,154,70, +-255,208,132,51,255,206,128,45,255,204,122,41,255,201,120,40,255,196,116,37, +-255,111,74,30,255,20,18,13,227,8,8,7,28,0,28,6,6,6,28,28, +-26,21,255,222,186,123,255,229,196,132,255,181,144,92,255,16,15,13,212,0, +-16,6,6,6,85,25,24,20,255,180,149,101,255,231,205,154,255,232,204,149, +-255,227,198,142,255,223,192,138,255,223,193,136,255,230,199,139,255,232,197,141, +-255,211,176,122,255,64,57,41,255,8,8,7,113,0,8,6,6,5,14,33, +-31,24,227,186,155,107,255,232,204,149,255,233,205,152,255,227,197,140,255,221, +-189,132,255,224,192,135,255,228,198,141,255,232,201,141,255,232,192,135,255,231, +-197,132,255,41,35,26,255,0,64,17,16,14,139,211,178,120,255,233,202,148, +-255,233,202,148,255,56,48,33,255,4,4,4,85,0,104,11,11,10,255,216, +-164,89,255,230,191,123,255,227,195,134,255,40,35,27,227,0,28,16,15,13, +-227,126,105,69,255,217,176,112,255,225,175,104,255,223,159,76,255,189,124,49, +-255,43,35,20,255,9,8,8,57,0,8,10,10,9,133,194,109,33,255,215, +-125,38,255,212,124,39,255,144,93,33,255,29,24,16,255,68,53,29,255,186, +-123,49,255,128,95,47,255,25,24,20,255,143,119,78,255,230,201,145,255,33, +-30,24,255,0,8,11,11,10,170,217,176,112,255,228,182,109,255,222,158,75, +-255,212,134,51,255,204,122,41,255,198,117,37,255,200,118,37,255,208,123,39, +-255,212,123,37,255,214,121,39,255,217,133,50,255,24,21,15,244,0,8,11, +-11,10,170,218,185,127,255,235,203,148,255,233,202,148,255,230,201,145,255,227, +-197,140,255,221,187,128,255,221,184,120,255,224,178,105,255,224,164,85,255,189, +-129,58,255,39,32,20,255,7,7,6,85,0,8,11,10,8,125,194,109,33, +-255,215,125,38,255,213,125,40,255,29,24,16,255,0,40,17,17,14,170,221, +-188,130,255,235,201,152,255,232,201,141,255,42,36,27,255,0,12,17,17,14, +-170,219,179,116,255,231,187,124,255,228,183,111,255,24,22,17,255,0,8,11, +-11,10,170,218,185,127,255,232,197,137,255,227,179,104,255,219,155,72,255,208, +-132,51,255,204,122,41,255,202,120,39,255,38,31,19,170,0,16,12,11,9, +-170,196,110,33,255,215,113,38,255,213,122,42,255,215,143,58,255,217,166,92, +-255,222,186,123,255,225,195,136,255,52,44,33,198,0,16,17,16,14,170,211, +-150,70,255,219,140,56,255,213,126,42,255,25,21,14,255,0,40,17,17,14, +-170,221,187,128,255,232,199,141,255,228,180,111,255,219,155,72,255,207,128,44, +-255,199,119,39,255,200,118,37,255,208,123,39,255,212,123,37,255,214,125,39, +-255,212,124,39,255,34,26,15,181,0,8,11,10,10,161,215,172,104,255,234, +-201,143,255,234,206,151,255,42,39,29,255,0,40,12,11,9,170,196,110,33, +-255,215,125,38,255,212,124,39,255,36,28,17,170,0,8,15,14,10,85,194, +-109,33,255,215,125,38,255,212,124,39,255,210,128,41,255,211,135,54,255,225, +-176,98,255,231,197,132,255,56,48,33,255,4,4,4,85,0,20,17,16,14, +-170,206,135,51,255,217,133,50,255,213,122,42,255,25,21,14,255,0,32,12, +-11,9,170,196,110,33,255,215,125,38,255,213,122,42,255,67,51,28,255,6, +-6,5,255,40,34,25,255,226,190,127,255,138,110,69,255,7,7,7,255,25, +-24,20,255,221,179,112,255,232,191,127,255,232,201,141,255,26,23,19,255,0, +-8,11,11,10,170,214,168,101,255,230,187,119,255,228,188,117,255,212,173,105, +-255,150,118,67,255,102,86,47,255,111,90,50,255,185,145,88,255,227,187,118, +-255,231,195,132,255,232,201,141,255,26,23,19,255,0,8,11,11,10,170,219, +-184,128,255,235,205,154,255,234,206,151,255,42,36,27,255,0,12,15,15,12, +-170,213,158,80,255,228,182,109,255,230,191,123,255,27,23,18,255,0,8,11, +-11,10,170,219,189,132,255,235,205,154,255,232,197,141,255,225,185,114,255,215, +-155,78,255,206,135,51,255,205,126,42,255,209,128,42,255,212,121,41,255,181, +-111,36,255,39,30,18,255,8,8,7,57,0,8,10,10,9,136,194,109,33, +-255,215,125,38,255,212,124,39,255,24,20,13,255,0,12,15,14,12,170,210, +-146,71,255,229,183,110,255,231,197,132,255,26,23,19,255,0,8,11,11,10, +-170,218,189,127,255,234,199,143,255,231,197,132,255,225,176,106,255,214,153,75, +-255,208,138,55,255,205,133,48,255,210,127,45,255,214,134,49,255,179,119,42, +-255,37,30,18,255,7,7,6,85,0,12,23,20,14,227,161,115,50,255,222, +-167,89,255,227,186,114,255,225,190,130,255,223,198,136,255,227,198,142,255,224, +-196,141,255,221,191,134,255,161,130,86,255,33,30,24,229,10,10,9,42,0, +-24,15,15,12,170,211,149,76,255,228,182,109,255,231,189,128,255,44,39,27, +-255,0,24,17,17,14,170,216,170,97,255,226,172,95,255,224,165,81,255,31, +-26,18,255,0,12,13,12,10,170,201,120,40,255,217,133,50,255,216,125,45, +-255,25,21,14,212,0,8,11,10,8,144,203,130,52,255,224,166,83,255,228, +-174,103,255,40,34,25,255,0,12,17,16,14,170,221,187,128,255,234,201,143, +-255,230,191,123,255,28,25,19,244,0,8,10,10,9,164,203,122,50,255,220, +-148,63,255,217,141,52,255,23,20,14,255,0,8,14,13,11,108,10,10,9, +-28,0,4,13,13,12,170,221,189,134,255,235,205,154,255,234,206,151,255,42, +-37,27,255,0,24,11,11,10,255,222,189,131,255,232,195,131,255,224,162,81, +-255,36,29,19,255,4,4,4,54,0,28,7,7,6,28,19,17,12,232,93, +-66,30,255,183,112,36,255,209,122,38,255,212,120,39,255,159,102,34,255,22, +-19,13,255,7,7,6,85,0,24,6,6,5,28,17,16,14,227,149,122,84, +-255,227,195,140,255,227,191,134,255,179,142,90,255,17,16,14,227,5,5,4, +-25,0,20,15,14,12,170,204,129,49,255,218,141,51,255,213,126,42,255,25, +-21,14,255,0,24,8,7,7,91,68,48,25,255,205,127,44,255,220,153,75, +-255,99,78,44,255,8,8,7,113,0,28,12,11,9,170,196,110,33,255,215, +-125,38,255,212,124,39,255,24,20,13,255,0,124,9,9,8,25,0,40,2, +-2,1,23,9,8,6,255,199,116,34,255,215,125,38,255,212,128,45,255,27, +-24,16,207,0,8,11,11,10,170,219,184,128,255,235,205,154,255,234,205,155, +-255,58,49,35,255,5,5,4,85,0,4,4,4,3,28,16,15,11,227,204, +-122,41,255,215,126,40,255,210,123,39,255,32,25,15,170,0,8,13,13,12, +-122,208,168,99,255,234,199,143,255,234,204,151,255,63,54,38,255,5,5,4, +-85,0,4,4,4,3,28,18,17,13,215,204,127,45,255,214,125,39,255,212, +-121,41,255,34,27,15,170,0,8,13,12,10,85,185,112,34,255,215,125,38, +-255,212,123,37,255,35,28,16,255,4,4,3,85,0,4,3,3,2,28,12, +-10,9,224,198,117,37,255,215,125,38,255,212,124,39,255,34,27,15,178,0, +-8,14,13,11,113,206,162,94,255,232,199,141,255,234,207,155,255,63,53,36, +-255,4,4,3,113,0,4,3,3,3,28,10,10,9,255,200,118,37,255,215, +-125,38,255,210,123,39,255,27,22,14,227,0,12,3,3,2,6,13,11,8, +-221,199,116,34,255,215,125,38,255,212,124,39,255,35,27,16,255,5,4,4, +-57,0,12,15,14,12,147,206,154,87,255,232,195,137,255,234,204,151,255,63, +-54,38,255,5,5,4,85,0,4,4,4,3,28,18,16,13,227,222,189,131, +-255,235,205,152,255,234,205,155,255,27,24,20,255,0,8,11,11,10,170,219, +-184,130,255,235,205,152,255,234,205,155,255,58,49,35,255,5,5,4,85,0, +-4,4,4,3,28,14,12,9,227,199,117,36,255,215,113,38,255,210,123,39, +-255,32,25,15,170,0,8,12,12,9,102,194,109,33,255,215,125,38,255,212, +-124,39,255,27,22,14,255,0,24,18,16,13,170,217,176,110,255,234,196,143, +-255,234,204,151,255,27,24,20,255,0,8,11,10,10,170,204,134,59,255,219, +-136,54,255,213,122,42,255,72,50,27,255,8,8,7,255,25,22,14,255,195, +-116,38,255,208,123,39,255,142,91,31,255,16,14,9,193,4,4,3,17,0, +-12,11,11,8,170,198,117,37,255,219,133,56,255,221,152,70,255,27,23,16, +-221,0,8,13,12,10,99,193,113,34,255,223,156,70,255,231,193,128,255,40, +-34,25,255,4,3,3,113,17,16,12,227,208,136,59,255,45,36,21,255,4, +-3,3,113,10,9,7,207,196,110,33,255,215,125,38,255,210,128,41,255,32, +-25,15,170,0,8,12,11,9,108,194,109,33,255,215,125,38,255,212,124,39, +-255,35,27,16,255,4,4,3,85,0,4,3,3,2,28,12,11,9,227,199, +-117,36,255,221,150,66,255,229,191,126,255,32,29,23,210,0,8,13,13,12, +-122,204,150,79,255,223,159,76,255,217,141,52,255,84,57,29,255,9,8,6, +-170,5,5,4,85,6,6,5,113,27,22,14,255,207,128,44,255,223,147,72, +-255,227,187,118,255,34,30,23,207,0,8,12,11,11,170,218,180,119,255,229, +-184,114,255,224,167,85,255,50,40,25,255,5,5,4,85,0,4,4,4,3, +-28,14,12,9,227,203,125,42,255,217,128,48,255,213,128,45,255,35,27,16, +-173,0,8,12,12,11,130,209,163,98,255,235,203,148,255,233,202,148,255,63, +-54,36,255,5,5,4,85,0,4,4,4,3,28,15,15,12,227,209,137,60, +-255,221,151,68,255,219,147,62,255,23,20,14,238,0,8,10,10,9,150,196, +-121,41,255,217,128,48,255,215,133,44,255,40,31,19,255,5,5,5,85,0, +-4,4,4,3,28,16,14,11,207,201,120,40,255,217,133,50,255,221,161,76, +-255,57,44,28,170,0,8,15,14,12,105,211,165,98,255,232,197,137,255,232, +-199,141,255,58,49,35,255,4,4,3,113,0,40,3,3,2,17,12,11,9, +-227,199,116,34,255,215,125,38,255,212,124,39,255,35,27,16,255,4,4,3, +-62,0,12,12,11,9,170,200,120,41,255,223,159,76,255,230,191,123,255,44, +-37,27,255,0,12,18,17,15,170,208,140,59,255,217,133,50,255,213,125,40, +-255,27,23,14,195,0,8,12,11,9,108,194,109,33,255,215,125,38,255,212, +-124,39,255,25,21,14,255,0,12,17,16,14,170,219,179,116,255,235,201,152, +-255,234,204,151,255,27,24,20,255,0,8,10,10,9,170,198,122,41,255,215, +-127,42,255,213,125,40,255,27,22,14,255,0,20,12,11,9,170,201,120,40, +-255,224,156,83,255,231,190,132,255,40,33,25,255,0,12,10,10,9,85,52, +-42,29,255,200,142,59,255,183,119,44,255,72,52,27,255,39,30,18,255,49, +-37,22,255,150,99,33,255,196,116,37,255,77,50,24,255,10,9,7,144,0, +-12,10,10,9,170,196,115,35,255,215,125,38,255,212,124,39,255,25,21,14, +-255,0,12,12,11,9,170,196,110,33,255,214,127,43,255,222,158,75,255,41, +-34,24,255,0,24,5,5,4,85,11,11,10,255,130,101,59,255,223,176,102, +-255,224,176,101,255,177,137,74,255,18,17,13,227,6,5,5,28,0,12,20, +-19,15,85,186,120,49,255,217,142,62,255,217,139,56,255,34,29,19,255,4, +-4,3,17,0,20,17,17,14,170,221,188,130,255,235,205,152,255,234,205,155, +-255,42,39,29,255,0,24,13,13,10,181,199,119,39,255,212,121,41,255,203, +-121,40,255,35,29,17,170,0,100,20,18,15,170,222,186,123,255,234,201,143, +-255,232,197,135,255,47,40,28,255,0,64,14,13,11,170,213,160,84,255,230, +-187,119,255,231,197,132,255,35,30,22,198,0,4,14,13,11,108,217,176,112, +-255,232,193,137,255,231,197,132,255,33,28,22,255,0,24,12,12,11,113,31, +-29,22,210,40,35,27,255,41,34,24,255,29,24,16,255,32,26,17,255,146, +-92,35,255,214,134,49,255,212,128,45,255,123,81,36,255,15,13,10,142,0, +-20,7,7,6,85,28,26,19,252,194,140,71,255,212,127,43,255,202,118,35, +-255,97,66,30,255,15,14,10,207,6,6,5,25,0,24,6,6,5,8,15, +-13,12,227,111,86,50,255,209,168,102,255,176,136,83,255,85,67,44,255,163, +-129,80,255,221,186,126,255,83,69,44,255,7,7,6,170,5,5,5,8,0, +-4,9,9,8,108,20,18,13,170,13,12,10,51,0,36,16,15,13,170,217, +-176,110,255,232,194,133,255,232,198,139,255,36,33,25,255,0,24,15,15,12, +-170,219,179,116,255,232,193,137,255,232,199,135,255,31,26,20,255,0,8,11, +-11,10,28,56,48,33,227,98,76,45,255,104,80,45,255,195,154,96,255,227, +-186,114,255,226,189,125,255,207,173,114,255,222,188,123,255,231,190,132,255,217, +-188,124,255,137,109,70,255,99,86,54,255,78,64,43,255,21,20,16,85,0, +-8,12,12,11,28,54,48,35,227,86,72,47,255,74,63,43,255,171,137,84, +-255,229,191,130,255,230,191,123,255,230,186,123,255,202,164,105,255,97,80,50, +-255,75,64,44,255,72,61,39,255,22,21,17,102,0,36,12,11,11,45,55, +-45,30,227,90,71,45,255,78,63,41,255,72,61,39,255,74,63,43,255,72, +-61,39,255,72,61,39,255,91,74,46,255,78,63,41,255,22,20,17,102,0, +-48,12,12,11,176,132,106,61,255,228,188,125,255,210,172,113,255,42,37,29, +-255,9,9,8,62,0,16,17,16,14,170,221,186,124,255,234,199,143,255,232, +-201,141,255,232,201,141,255,221,189,134,255,52,46,33,255,6,7,6,227,24, +-23,17,255,208,132,51,255,215,133,44,255,212,124,39,255,24,20,13,255,0, +-24,17,16,12,170,219,177,112,255,231,187,124,255,228,182,109,255,40,33,23, +-255,0,36,9,9,8,74,17,15,12,227,67,51,28,255,162,107,43,255,200, +-142,67,255,204,157,91,255,177,140,86,255,74,63,43,255,19,17,16,198,9, +-9,8,28,0,32,14,14,11,31,56,46,31,227,192,157,103,255,229,194,128, +-255,225,188,124,255,146,112,67,255,11,10,8,164,0,8,7,7,6,28,34, +-27,17,255,190,107,33,255,210,121,35,255,146,95,35,255,16,14,11,187,0, +-8,9,9,8,170,214,164,93,255,232,194,127,255,231,195,132,255,40,34,25, +-255,0,40,13,13,10,170,213,157,84,255,224,166,83,255,221,150,66,255,23, +-20,14,246,0,8,12,11,9,113,194,109,33,255,212,119,37,255,210,113,35, +-255,168,103,33,255,56,42,23,255,27,23,14,255,38,31,19,255,149,92,30, +-255,207,118,32,255,207,113,30,255,124,75,27,255,13,11,8,161,0,28,12, +-12,11,176,130,99,59,255,229,191,126,255,211,174,116,255,43,37,28,255,9, +-9,8,59,0,16,8,8,7,85,68,58,37,255,214,177,119,255,231,196,136, +-255,207,171,114,255,97,80,50,255,54,47,35,255,66,59,41,255,178,148,95, +-255,228,189,121,255,224,187,123,255,146,112,67,255,12,12,11,170,0,12,10, +-10,9,28,16,15,13,147,29,28,22,221,48,42,31,255,70,61,41,255,66, +-57,39,255,70,61,41,255,171,140,92,255,224,170,101,255,224,168,87,255,224, +-165,81,255,39,32,22,255,0,64,14,13,11,57,100,82,51,255,222,186,123, +-255,226,172,95,255,113,82,38,255,9,8,8,127,0,32,11,9,6,102,11, +-10,6,170,11,10,8,170,12,11,9,170,15,13,10,170,15,13,10,170,15, +-14,10,170,18,15,11,170,18,15,11,156,12,11,9,28,0,28,6,6,5, +-65,40,34,25,255,224,183,119,255,229,195,136,255,171,140,92,255,21,20,18, +-142,0,24,11,10,8,102,131,92,46,255,213,145,56,255,214,119,43,255,210, +-128,41,255,151,94,32,255,23,21,14,255,10,10,9,85,0,12,10,9,7, +-170,191,106,30,255,211,115,30,255,208,114,31,255,141,87,30,255,36,31,19, +-255,121,90,42,255,217,168,92,255,205,163,102,255,132,102,59,255,213,172,108, +-255,231,193,128,255,35,30,22,255,0,8,11,11,10,164,203,129,50,255,215, +-127,42,255,211,117,34,255,166,97,29,255,54,40,21,255,29,23,14,255,38, +-31,19,255,120,78,29,255,206,118,33,255,214,127,43,255,224,155,81,255,23, +-21,16,255,0,8,11,10,10,170,217,183,116,255,234,201,143,255,232,198,139, +-255,202,166,109,255,97,78,50,255,52,46,33,255,58,50,33,255,150,96,39, +-255,208,121,37,255,195,112,30,255,83,53,24,255,9,8,6,113,0,8,13, +-12,8,96,189,104,28,255,210,120,33,255,214,132,45,255,34,29,19,255,0, +-40,17,16,12,170,217,172,102,255,228,180,105,255,228,181,107,255,40,33,23, +-255,0,12,17,15,12,170,216,171,101,255,232,191,127,255,231,197,132,255,24, +-22,17,255,0,8,11,11,10,167,209,146,72,255,221,151,68,255,213,126,42, +-255,172,106,35,255,57,41,22,255,42,32,19,255,43,33,20,252,18,15,11, +-85,0,16,11,10,8,170,193,111,30,255,215,113,38,255,220,144,63,255,197, +-145,84,255,91,71,44,255,75,62,42,255,75,64,44,255,22,21,17,99,0, +-16,14,13,11,170,196,110,33,255,210,115,31,255,210,115,31,255,22,19,11, +-227,0,8,16,13,9,113,24,21,15,170,17,15,12,170,18,15,13,170,19, +-17,12,142,9,8,8,28,0,8,14,13,11,170,210,146,71,255,220,142,59, +-255,213,125,40,255,168,103,33,255,54,40,21,255,29,23,14,255,38,31,19, +-255,119,78,30,255,204,116,31,255,210,119,31,255,210,115,31,255,26,20,13, +-210,0,8,11,11,10,170,217,179,120,255,234,202,147,255,232,201,141,255,40, +-35,25,255,0,40,11,10,8,170,193,111,30,255,211,115,30,255,210,115,31, +-255,36,25,13,170,0,8,14,12,9,85,190,105,29,255,210,107,31,255,208, +-114,31,255,187,124,42,255,143,111,56,255,210,171,109,255,229,187,128,255,131, +-99,54,255,8,8,7,156,0,20,13,12,10,170,194,112,31,255,210,107,31, +-255,210,115,31,255,22,19,11,255,0,32,11,10,8,170,193,111,30,255,215, +-125,38,255,218,141,59,255,39,33,22,255,5,5,5,28,12,12,11,170,156, +-126,83,255,27,24,20,227,5,5,5,23,14,13,11,198,219,177,112,255,232, +-191,127,255,230,191,123,255,25,22,16,249,0,8,11,10,8,153,200,120,41, +-255,214,127,43,255,213,126,42,255,93,66,32,255,11,11,10,255,34,31,23, +-255,206,152,81,255,226,179,111,255,231,189,128,255,232,192,135,255,232,201,141, +-255,25,22,18,255,0,8,11,10,10,170,215,171,102,255,228,174,105,255,222, +-158,75,255,27,24,16,255,0,12,15,15,12,170,219,177,112,255,232,193,137, +-255,232,201,141,255,25,22,18,255,0,8,11,10,10,170,215,172,104,255,228, +-182,109,255,221,155,70,255,177,114,46,255,55,42,24,255,35,28,18,255,41, +-31,18,255,35,28,17,255,27,22,14,255,17,16,12,187,9,9,8,79,0, +-12,10,9,7,170,191,106,30,255,211,115,30,255,210,115,31,255,33,25,14, +-255,0,12,21,20,16,170,221,180,116,255,232,193,137,255,232,201,141,255,25, +-22,18,255,0,8,11,11,10,170,212,160,85,255,224,156,83,255,218,141,59, +-255,175,115,44,255,55,42,24,255,31,25,16,255,38,30,19,255,127,82,30, +-255,204,116,31,255,195,112,30,255,82,55,25,255,11,10,8,150,0,12,9, +-9,8,28,15,14,12,142,28,25,19,221,46,40,29,255,71,60,38,255,66, +-57,39,255,70,61,41,255,193,159,106,255,227,184,108,255,221,153,72,255,155, +-98,36,255,13,12,10,170,0,24,17,15,12,170,219,180,112,255,232,197,137, +-255,232,201,141,255,40,35,25,255,0,24,14,13,11,170,198,117,37,255,213, +-124,38,255,210,121,35,255,23,19,12,255,0,12,11,10,8,170,193,111,30, +-255,211,115,30,255,208,114,31,255,23,19,12,207,0,8,14,13,11,85,181, +-132,68,255,228,185,117,255,231,193,128,255,54,46,31,255,5,5,4,8,0, +-8,21,20,16,178,215,160,88,255,223,147,72,255,206,135,51,255,23,20,14, +-170,0,8,12,11,9,102,192,111,31,255,210,108,33,255,208,114,31,255,22, +-18,11,255,0,4,10,10,9,113,79,61,38,255,17,16,12,198,0,4,16, +-15,13,170,219,179,116,255,231,187,124,255,224,169,91,255,33,28,20,255,0, +-20,9,8,8,85,39,33,24,255,217,166,92,255,219,140,56,255,210,121,35, +-255,66,44,21,255,7,7,6,133,0,32,6,6,5,74,19,18,12,255,183, +-102,30,255,207,105,30,255,210,111,31,255,73,51,24,255,8,8,7,116,0, +-24,6,6,6,28,15,13,12,227,144,112,61,255,221,180,116,255,224,178,113, +-255,152,116,65,255,18,17,13,221,8,8,7,28,0,24,12,10,9,170,193, +-111,30,255,210,107,31,255,210,115,31,255,22,19,11,255,0,28,16,15,13, +-227,164,122,63,255,225,185,114,255,192,153,97,255,21,19,16,232,7,7,6, +-28,0,24,11,10,8,170,193,111,30,255,211,115,30,255,210,115,31,255,23, +-19,12,255,0,148,6,6,5,51,11,9,6,85,12,10,7,102,10,8,5, +-156,10,8,5,127,8,7,5,184,27,22,12,255,198,105,29,255,211,122,36, +-255,220,136,61,255,25,22,16,255,0,8,10,10,9,170,218,181,123,255,234, +-202,147,255,232,197,141,255,30,27,21,255,0,12,9,8,6,170,191,106,30, +-255,211,115,30,255,210,111,31,255,39,27,14,170,0,8,12,11,11,170,218, +-180,119,255,234,196,143,255,232,201,141,255,29,26,20,255,0,12,7,7,6, +-28,27,22,14,156,25,22,14,255,32,25,15,210,22,18,11,28,0,8,10, +-9,7,150,195,112,30,255,211,115,30,255,210,115,31,255,19,15,10,252,0, +-12,9,9,8,170,191,106,30,255,211,111,30,255,208,114,31,255,25,20,12, +-204,0,8,12,11,11,170,218,180,119,255,234,202,147,255,232,201,141,255,142, +-111,63,255,14,12,9,227,10,9,7,127,8,7,5,181,35,25,14,255,199, +-112,28,255,209,118,30,255,209,117,28,255,30,22,13,255,0,16,9,8,6, +-167,191,106,30,255,211,115,30,255,210,115,31,255,19,15,10,252,0,16,21, +-19,16,170,220,178,113,255,232,197,137,255,232,201,141,255,26,23,19,255,0, +-12,11,11,10,170,218,181,123,255,234,201,143,255,231,197,132,255,24,22,17, +-255,0,8,11,10,10,170,218,181,123,255,234,201,143,255,231,197,132,255,30, +-26,21,255,0,12,9,8,6,167,191,106,30,255,211,115,30,255,210,111,31, +-255,39,27,14,170,0,8,13,12,8,85,190,105,29,255,213,119,36,255,214, +-132,45,255,32,26,17,255,0,24,17,16,14,170,221,186,124,255,234,202,147, +-255,232,199,135,255,25,22,18,252,0,8,11,10,8,127,192,111,31,255,210, +-107,31,255,208,114,31,255,161,94,28,255,65,43,20,255,145,85,26,255,207, +-117,30,255,122,75,29,255,15,14,10,170,5,5,4,8,0,16,11,10,8, +-170,196,115,35,255,223,146,70,255,228,183,111,255,25,22,16,252,0,8,14, +-12,9,85,190,105,29,255,215,125,38,255,218,141,59,255,30,24,17,195,0, +-4,10,10,7,170,193,111,30,255,20,17,11,252,0,4,11,10,8,85,188, +-103,27,255,211,115,30,255,209,106,30,255,39,27,14,170,0,8,13,12,8, +-85,190,105,29,255,211,115,30,255,210,115,31,255,19,15,10,255,0,12,9, +-8,6,167,192,111,31,255,218,137,51,255,227,175,100,255,27,24,18,255,0, +-8,11,10,8,147,196,106,33,255,210,108,33,255,210,115,31,255,30,23,13, +-255,4,4,3,14,0,8,15,14,12,195,211,149,76,255,229,184,114,255,232, +-199,135,255,28,25,19,255,0,8,11,10,8,167,203,129,50,255,215,127,42, +-255,210,121,35,255,20,17,11,232,0,12,9,8,6,139,190,105,29,255,211, +-111,30,255,209,114,30,255,30,22,13,198,0,8,13,12,10,170,217,173,104, +-255,232,193,137,255,232,194,139,255,25,22,18,255,0,12,9,8,8,156,192, +-111,31,255,210,108,33,255,210,115,31,255,32,24,13,173,0,8,13,12,8, +-88,190,105,29,255,211,115,30,255,208,114,31,255,19,15,10,255,0,12,7, +-7,6,28,27,22,14,198,45,36,21,255,52,43,29,244,14,13,11,85,0, +-8,13,13,12,88,177,143,90,255,230,194,131,255,226,172,95,255,137,91,36, +-255,10,9,7,227,8,8,5,161,10,9,7,167,10,9,7,136,13,10,6, +-85,7,6,6,74,0,24,9,8,6,167,191,106,30,255,211,115,30,255,210, +-115,31,255,19,15,10,252,0,16,12,11,9,170,208,141,61,255,230,187,119, +-255,232,201,141,255,40,34,25,255,0,12,14,12,9,170,196,109,31,255,210, +-107,31,255,210,115,31,255,36,25,13,170,0,8,10,9,7,85,155,91,28, +-255,208,114,31,255,209,106,30,255,30,22,13,255,0,12,22,21,17,176,222, +-186,123,255,234,199,143,255,226,195,135,255,35,29,22,178,0,8,12,11,9, +-105,190,105,29,255,211,115,30,255,208,114,31,255,23,19,12,210,0,8,15, +-12,8,59,7,6,4,3,0,4,9,9,8,159,204,134,59,255,230,182,119, +-255,232,198,139,255,39,33,24,255,0,16,10,10,9,34,15,14,10,198,52, +-40,21,255,165,96,28,255,198,113,29,255,185,102,28,255,80,53,25,255,19, +-17,12,227,10,9,7,76,0,16,11,10,8,170,195,112,30,255,211,115,30, +-255,210,115,31,255,20,16,11,255,0,12,10,9,7,170,192,111,31,255,215, +-125,38,255,224,159,83,255,41,33,24,255,0,24,7,7,6,108,24,20,13, +-255,146,88,31,255,195,127,38,255,113,77,34,255,15,14,12,210,7,7,6, +-28,0,16,12,12,11,28,37,30,18,227,168,99,31,255,206,114,33,255,51, +-34,18,255,6,5,5,71,0,20,17,16,14,170,221,186,124,255,234,202,147, +-255,232,201,141,255,40,35,25,255,0,24,17,15,10,227,198,105,29,255,194, +-109,33,255,62,44,23,255,16,14,11,85,0,100,19,17,12,142,214,171,97, +-255,228,183,113,255,227,186,108,255,50,40,25,227,0,64,12,11,9,198,214, +-158,85,255,229,183,110,255,228,181,107,255,21,19,14,249,2,2,1,20,8, +-8,7,181,210,156,79,255,226,169,95,255,224,155,81,255,33,26,18,255,4, +-4,4,28,0,40,3,3,2,28,11,10,8,255,209,138,62,255,223,154,72, +-255,221,164,82,255,27,23,16,249,0,16,7,7,6,79,46,38,25,255,197, +-151,84,255,222,161,89,255,209,128,42,255,141,91,32,255,15,13,10,218,5, +-5,5,11,0,28,15,13,10,139,191,131,60,255,220,168,93,255,168,123,69, +-255,14,13,11,227,5,5,5,85,9,9,8,170,105,78,40,255,162,116,61, +-255,88,66,37,255,23,21,16,255,11,11,10,255,78,58,35,255,208,150,75, +-255,61,46,28,181,0,36,15,13,10,170,216,170,97,255,230,187,119,255,228, +-178,113,255,34,28,19,255,0,24,15,13,10,170,215,167,92,255,229,179,114, +-255,228,181,107,255,32,27,19,255,0,16,6,6,6,25,5,5,4,198,52, +-42,27,255,220,169,97,255,189,142,76,255,35,31,22,255,134,96,51,255,225, +-176,106,255,140,106,53,255,6,6,5,255,6,6,6,51,0,28,5,5,5, +-28,15,13,10,227,208,136,59,255,218,138,53,255,213,122,42,255,43,31,18, +-255,5,5,4,85,0,136,9,8,8,57,57,47,30,255,212,163,93,255,224, +-157,85,255,124,90,45,255,10,10,9,147,0,20,15,13,10,170,216,170,97, +-255,228,181,107,255,224,165,81,255,194,136,61,255,58,46,29,255,12,12,11, +-85,0,4,10,9,7,156,174,91,23,255,202,103,23,255,202,102,21,255,20, +-16,9,255,0,24,15,13,10,170,213,155,80,255,227,175,100,255,227,171,98, +-255,35,29,20,255,0,32,7,7,6,85,49,33,18,255,183,108,34,255,209, +-128,42,255,209,137,60,255,186,134,67,255,95,74,39,255,22,20,15,229,8, +-8,7,105,0,44,5,4,4,28,17,15,12,227,216,167,89,255,228,181,107, +-255,223,176,102,255,34,28,19,184,0,8,12,11,9,108,180,106,33,255,214, +-125,39,255,217,141,52,255,42,33,21,255,4,4,4,85,0,8,11,10,8, +-198,211,149,76,255,224,160,77,255,220,144,63,255,34,27,17,255,0,40,12, +-10,7,170,189,99,26,255,206,102,25,255,203,100,24,255,30,21,11,176,0, +-8,12,10,7,85,167,87,22,255,202,103,23,255,202,102,21,255,27,20,10, +-255,4,4,3,68,0,4,4,4,4,28,12,10,7,215,176,91,23,255,203, +-104,24,255,202,105,27,255,28,21,13,249,0,24,9,8,8,57,57,47,30, +-255,213,167,94,255,228,184,115,255,126,92,47,255,9,9,8,147,0,20,13, +-12,10,167,199,131,58,255,220,148,63,255,219,147,62,255,49,38,24,255,6, +-6,6,85,0,4,5,5,5,28,15,14,12,227,217,169,94,255,228,183,111, +-255,225,174,102,255,31,25,18,241,0,36,5,5,5,28,15,13,10,227,204, +-127,45,255,219,133,56,255,221,150,66,255,35,28,18,255,0,68,10,9,9, +-85,45,34,21,255,201,110,30,255,192,100,25,255,57,35,16,255,12,10,7, +-85,0,24,13,11,6,79,126,68,21,255,191,100,26,255,198,117,37,255,208, +-139,65,255,213,155,80,255,214,161,85,255,215,167,92,255,216,167,89,255,215, +-160,88,255,49,38,24,170,0,24,7,7,6,76,45,36,24,249,207,164,90, +-255,228,183,111,255,143,111,56,255,13,12,10,170,0,28,13,12,8,142,182, +-99,25,255,203,108,24,255,202,102,21,255,112,65,23,255,15,13,8,227,6, +-6,5,45,0,16,10,8,7,170,171,89,22,255,202,95,23,255,202,103,23, +-255,103,64,26,255,20,18,13,255,79,61,36,255,222,173,97,255,227,179,104, +-255,224,172,97,255,226,171,99,255,224,176,93,255,36,29,19,207,0,8,12, +-10,7,113,176,91,23,255,202,95,23,255,202,102,21,255,27,20,10,255,4, +-4,3,74,0,4,4,4,4,28,11,9,6,215,187,101,24,255,216,134,45, +-255,226,172,95,255,23,21,16,241,0,8,10,10,9,161,212,160,85,255,226, +-172,95,255,222,158,75,255,51,39,24,255,6,6,6,85,0,4,4,4,3, +-28,11,10,6,215,176,91,23,255,202,102,21,255,191,102,22,255,22,17,9, +-170,0,8,12,10,7,85,167,87,22,255,204,105,25,255,217,133,50,255,35, +-28,18,255,0,40,15,13,10,170,199,116,34,255,212,114,35,255,218,139,55, +-255,33,27,18,255,0,12,15,13,10,170,213,160,84,255,227,175,100,255,224, +-165,81,255,25,21,14,235,0,8,13,11,8,108,184,96,25,255,203,96,24, +-255,202,95,23,255,27,20,10,255,4,4,3,71,0,28,10,9,7,170,187, +-101,24,255,216,134,45,255,224,167,85,255,54,42,27,255,6,6,6,85,0, +-28,10,9,7,170,171,89,22,255,202,103,23,255,202,102,21,255,29,21,10, +-170,0,4,11,9,6,42,137,77,24,255,211,136,56,255,215,167,92,255,216, +-166,95,255,213,163,84,255,33,28,18,161,0,8,11,10,8,130,184,100,25, +-255,203,100,24,255,202,102,21,255,27,20,10,255,4,4,3,74,0,4,4, +-4,4,28,11,9,6,215,176,91,23,255,202,103,23,255,202,95,23,255,28, +-21,11,190,0,8,10,10,9,161,212,161,89,255,228,174,105,255,223,161,80, +-255,33,28,18,255,0,40,10,9,7,167,171,89,22,255,202,103,23,255,202, +-102,21,255,29,21,10,170,0,8,12,10,7,85,167,87,22,255,202,103,23, +-255,203,108,24,255,68,47,25,255,6,6,5,255,31,26,20,255,220,168,93, +-255,220,177,101,255,110,80,41,255,12,11,9,150,0,16,10,9,7,170,171, +-89,22,255,202,103,23,255,202,102,21,255,20,16,9,255,0,32,10,9,7, +-170,193,111,30,255,219,136,54,255,224,165,81,255,27,24,16,255,0,4,7, +-7,7,28,21,20,16,181,10,10,9,85,0,4,12,11,9,170,204,130,51, +-255,218,141,51,255,211,122,36,255,32,23,13,187,0,8,13,11,8,85,167, +-87,22,255,203,100,24,255,208,105,29,255,23,19,12,255,4,4,3,28,11, +-10,8,181,211,158,82,255,229,183,110,255,228,183,111,255,228,183,113,255,228, +-181,107,255,27,23,16,229,0,8,10,10,9,150,192,111,31,255,208,112,27, +-255,203,108,24,255,21,17,10,255,0,12,15,13,10,170,216,170,97,255,229, +-183,110,255,228,181,107,255,25,21,16,235,0,8,11,10,8,142,194,116,33, +-255,209,106,30,255,203,108,24,255,27,20,10,255,4,4,3,74,0,36,10, +-8,7,170,171,89,22,255,202,103,23,255,202,102,21,255,42,28,13,255,6, +-5,5,48,0,4,6,6,6,28,21,19,14,255,221,175,102,255,229,179,114, +-255,228,181,107,255,24,20,15,246,0,8,12,11,9,127,190,104,27,255,206, +-106,25,255,202,103,23,255,27,20,10,255,4,4,3,74,0,4,4,4,4, +-28,11,10,6,215,176,91,23,255,204,105,25,255,207,122,38,255,28,22,15, +-238,0,36,5,5,5,28,15,13,10,227,195,111,28,255,204,105,25,255,197, +-100,22,255,22,17,9,224,0,24,15,13,10,170,216,170,97,255,229,184,114, +-255,228,181,107,255,34,28,19,255,0,24,10,9,7,170,174,91,23,255,202, +-103,23,255,202,102,21,255,20,16,9,252,0,12,10,9,7,170,171,89,22, +-255,202,107,23,255,206,111,27,255,22,17,11,252,0,8,8,7,7,45,73, +-59,36,255,218,174,105,255,228,178,107,255,89,67,36,255,7,7,6,113,0, +-4,5,5,4,28,20,18,13,255,199,110,30,255,202,105,27,255,88,54,23, +-255,10,9,7,113,0,8,13,11,6,85,167,87,22,255,202,95,23,255,202, +-90,23,255,32,24,13,255,4,4,3,178,19,16,12,238,212,163,93,255,66, +-52,31,255,5,5,5,184,14,13,11,255,205,133,48,255,212,114,35,255,208, +-117,29,255,29,22,14,255,0,16,12,11,9,85,101,74,38,255,189,121,49, +-255,185,104,32,255,180,98,25,255,180,93,23,255,154,82,23,255,75,44,18, +-255,11,9,6,144,0,32,10,9,7,170,157,79,22,255,202,102,21,255,202, +-102,21,255,22,17,9,255,0,28,14,13,11,224,136,98,53,255,217,165,82, +-255,213,145,56,255,150,92,35,255,19,16,12,173,5,5,5,8,0,28,10, +-8,7,170,171,89,22,255,202,103,23,255,202,102,21,255,20,16,9,252,0, +-28,7,7,6,59,43,35,24,255,221,175,102,255,223,178,106,255,134,98,51, +-255,14,13,11,142,0,24,10,9,7,167,171,89,22,255,202,103,23,255,202, +-102,21,255,20,16,9,255,0,144,12,10,7,170,46,29,13,255,140,74,21, +-255,165,86,22,255,167,87,22,255,165,86,22,255,167,87,22,255,185,95,22, +-255,198,97,23,255,206,111,27,255,221,146,66,255,23,19,14,249,0,8,10, +-10,9,153,212,161,89,255,229,183,110,255,224,165,81,255,28,23,15,255,0, +-12,10,8,7,156,171,89,22,255,202,103,23,255,202,102,21,255,31,21,10, +-170,0,8,10,10,9,167,212,160,85,255,228,177,105,255,222,158,75,255,27, +-23,16,255,0,40,10,8,7,170,167,87,22,255,202,103,23,255,202,102,21, +-255,20,16,9,238,0,12,10,8,7,164,171,89,22,255,202,103,23,255,203, +-100,24,255,22,18,11,235,0,8,10,10,9,167,214,164,93,255,228,182,109, +-255,223,154,80,255,207,120,36,255,189,94,24,255,167,87,22,255,167,87,22, +-255,187,96,22,255,198,93,23,255,202,93,21,255,198,96,21,255,26,19,9, +-227,0,16,10,8,7,167,171,89,22,255,202,103,23,255,202,102,21,255,20, +-15,9,252,0,16,17,15,12,170,216,170,97,255,229,183,110,255,224,164,85, +-255,29,24,16,255,3,3,2,28,0,8,12,11,9,198,211,149,76,255,221, +-151,68,255,219,146,60,255,22,19,13,246,0,8,10,10,9,161,210,155,77, +-255,223,147,72,255,213,122,42,255,23,18,12,255,0,12,10,8,7,167,171, +-89,22,255,202,103,23,255,202,102,21,255,29,21,10,170,0,8,12,10,7, +-85,166,87,23,255,209,118,30,255,218,139,55,255,33,27,18,255,0,24,15, +-13,10,170,215,159,92,255,226,169,95,255,218,141,59,255,34,26,15,190,0, +-8,13,10,6,85,167,87,22,255,202,103,23,255,198,96,21,255,197,96,22, +-255,189,97,22,255,198,96,21,255,198,96,21,255,25,19,10,255,4,4,3, +-28,0,20,10,9,7,170,178,92,23,255,210,107,31,255,215,128,44,255,33, +-24,14,193,0,8,12,10,7,85,167,87,22,255,202,95,23,255,202,103,23, +-255,32,22,11,170,0,4,10,8,7,170,171,89,22,255,24,17,9,249,0, +-4,12,10,7,85,163,82,22,255,202,103,23,255,202,102,21,255,29,21,10, +-170,0,8,12,10,7,85,166,87,23,255,202,103,23,255,202,102,21,255,20, +-15,9,255,0,12,10,8,7,167,170,89,23,255,206,106,25,255,208,115,33, +-255,28,21,13,207,0,8,13,10,6,85,167,87,22,255,202,95,23,255,202, +-102,21,255,20,16,9,255,0,12,15,13,10,170,214,158,85,255,229,183,110, +-255,228,185,111,255,24,20,15,249,0,8,12,11,9,108,176,91,23,255,202, +-95,23,255,202,102,21,255,18,15,9,255,2,2,1,8,0,8,8,7,5, +-184,171,89,22,255,202,95,23,255,202,102,21,255,34,23,11,173,0,8,12, +-11,9,136,212,160,85,255,228,180,105,255,225,165,88,255,31,25,18,255,3, +-3,2,28,0,8,8,7,5,178,171,89,22,255,202,103,23,255,202,102,21, +-255,30,21,11,170,0,8,12,10,7,85,167,87,22,255,202,103,23,255,202, +-102,21,255,20,15,9,255,0,40,7,7,6,28,30,27,21,238,167,111,50, +-255,206,110,33,255,199,102,24,255,175,90,22,255,165,86,22,255,167,87,22, +-255,167,87,22,255,161,87,22,255,84,48,19,255,18,15,9,227,8,7,5, +-28,0,16,10,8,7,167,171,89,22,255,202,103,23,255,202,102,21,255,20, +-15,9,252,0,16,15,13,10,170,211,159,76,255,229,180,110,255,228,182,109, +-255,34,28,19,255,0,12,10,9,7,170,171,89,22,255,202,103,23,255,202, +-102,21,255,31,22,10,170,0,8,7,6,6,28,48,31,15,255,189,93,22, +-255,202,102,21,255,45,29,14,255,5,5,4,113,0,4,5,5,4,28,22, +-20,15,255,220,169,97,255,226,178,103,255,167,118,54,255,15,13,10,133,0, +-8,13,11,6,85,167,87,22,255,202,103,23,255,202,102,21,255,19,15,8, +-215,0,4,11,9,6,105,121,65,20,255,26,18,9,190,0,4,9,9,8, +-167,208,150,75,255,229,183,110,255,228,181,113,255,37,29,20,255,0,24,8, +-8,5,218,167,87,22,255,202,93,21,255,198,104,21,255,23,18,10,255,3, +-3,2,51,0,20,10,9,7,153,171,89,22,255,202,95,23,255,202,102,21, +-255,20,15,9,255,2,2,1,17,0,8,8,7,5,181,184,100,25,255,215, +-119,42,255,224,160,85,255,34,28,19,255,0,20,9,8,6,85,31,22,12, +-255,166,87,23,255,189,97,22,255,99,60,22,255,15,13,8,170,0,28,4, +-3,3,23,13,11,8,227,182,94,23,255,149,87,26,255,19,17,12,227,7, +-7,7,23,0,16,15,13,10,170,216,170,97,255,229,179,114,255,228,182,109, +-255,34,28,19,255,0,20,9,8,6,130,69,42,18,255,195,95,22,255,35, +-24,12,255,5,5,4,76,0,104,10,9,7,28,27,24,16,184,32,27,19, +-255,39,29,20,212,13,12,10,85,0,60,13,11,8,170,81,54,28,255,216, +-148,67,255,223,161,72,255,220,147,61,255,117,76,32,255,13,11,8,255,44, +-33,19,255,207,123,40,255,217,136,50,255,218,142,53,255,156,100,39,255,18, +-15,11,227,10,8,7,28,0,12,15,13,8,125,19,14,10,170,14,11,7, +-170,10,8,7,170,11,9,6,122,13,10,8,85,8,7,5,153,46,33,21, +-255,212,138,51,255,221,151,68,255,191,132,62,255,19,17,12,176,0,12,7, +-7,6,76,26,22,15,241,189,129,58,255,219,152,72,255,217,154,72,255,133, +-87,38,255,15,13,10,221,6,6,5,28,0,8,15,12,8,113,20,16,11, +-170,17,14,10,142,7,6,6,28,0,8,19,16,12,170,200,117,35,255,212, +-123,37,255,115,74,30,255,9,8,6,113,0,8,12,11,9,178,104,73,37, +-255,206,147,63,255,178,121,53,255,58,46,29,255,46,36,25,255,40,32,21, +-252,19,17,12,85,0,36,12,10,9,164,191,131,60,255,223,161,80,255,221, +-151,68,255,46,34,21,255,4,4,3,3,0,20,19,16,12,173,208,134,55, +-255,223,156,70,255,216,160,81,255,21,19,14,255,0,16,6,5,5,25,17, +-14,10,227,67,48,28,255,94,67,35,255,20,17,13,227,6,6,5,113,12, +-11,9,198,67,51,30,255,85,62,32,255,25,20,14,255,9,8,6,82,0, +-32,10,8,5,170,161,87,22,255,195,90,20,255,187,91,20,255,19,14,8, +-255,0,28,15,12,8,119,20,16,11,170,17,14,10,156,10,8,7,28,0, +-64,15,12,8,122,18,15,11,170,17,14,10,144,10,8,7,28,0,16,13, +-12,10,170,157,96,36,255,211,123,38,255,199,116,34,255,31,24,16,255,6, +-6,6,28,0,20,16,13,11,170,197,110,32,255,209,110,30,255,202,103,23, +-255,58,36,15,255,8,7,5,113,0,8,10,8,5,85,137,68,18,255,185, +-86,20,255,174,88,19,255,18,13,7,255,0,24,12,10,9,170,204,129,49, +-255,220,144,63,255,217,133,50,255,26,20,13,255,0,28,7,6,6,76,23, +-19,12,244,185,113,36,255,207,129,52,255,173,117,50,255,59,46,28,255,18, +-15,13,198,9,9,8,113,6,6,6,11,0,24,15,12,8,133,22,17,11, +-170,17,14,10,142,8,7,5,28,0,12,9,8,6,170,202,128,49,255,220, +-148,63,255,219,140,56,255,22,19,13,255,0,8,12,10,9,170,200,125,37, +-255,218,141,51,255,220,147,61,255,138,86,35,255,13,10,8,227,11,9,6, +-170,13,11,8,198,61,41,22,255,202,111,31,255,204,105,25,255,200,105,21, +-255,22,17,9,221,0,12,11,9,6,108,14,11,7,170,11,9,6,139,6, +-5,3,17,0,12,9,7,6,133,144,75,19,255,185,86,20,255,178,86,19, +-255,27,18,8,170,0,8,11,9,6,85,134,70,19,255,181,88,20,255,180, +-87,19,255,24,15,7,178,0,12,10,8,5,99,165,86,22,255,206,111,27, +-255,213,124,38,255,36,27,17,255,0,24,10,10,9,133,167,112,48,255,222, +-166,77,255,223,157,72,255,54,39,23,255,5,5,4,37,0,20,13,11,8, +-170,181,93,22,255,206,111,27,255,214,127,43,255,20,16,11,255,0,12,9, +-8,8,170,203,129,50,255,222,145,63,255,220,147,61,255,33,26,16,255,0, +-12,12,10,7,113,15,12,8,170,13,10,8,122,0,16,10,8,7,170,200, +-120,41,255,220,142,59,255,219,146,60,255,27,21,14,255,0,12,13,11,8, +-113,18,15,11,170,17,14,10,142,8,7,5,28,0,12,14,12,9,113,20, +-15,11,170,17,14,10,153,10,8,7,28,0,16,9,8,6,85,29,21,10, +-255,119,62,20,255,153,79,20,255,40,25,11,255,9,8,6,85,0,20,10, +-8,7,28,32,24,13,218,68,47,25,255,61,43,24,255,61,46,28,255,61, +-47,28,255,61,47,28,255,66,50,29,255,73,55,32,255,66,48,29,255,24, +-20,15,85,0,20,7,6,6,79,32,26,17,244,199,132,54,255,208,150,75, +-255,122,87,41,255,17,15,10,170,0,32,10,9,7,28,32,23,11,227,53, +-33,14,255,34,23,11,255,12,10,7,190,6,5,5,28,0,20,9,7,4, +-170,146,76,19,255,197,99,20,255,204,110,27,255,59,41,22,255,6,6,6, +-170,10,9,9,113,31,26,18,184,30,25,17,255,29,25,18,255,34,27,19, +-255,37,28,18,221,13,11,8,57,0,8,13,10,6,88,144,75,19,255,185, +-86,20,255,178,90,19,255,20,14,7,212,0,12,9,7,4,125,157,81,20, +-255,212,117,33,255,220,148,63,255,27,21,14,218,0,8,12,10,9,127,192, +-111,31,255,208,112,27,255,202,103,23,255,22,16,9,204,0,12,10,8,5, +-93,137,68,18,255,185,94,20,255,180,91,19,255,30,20,9,170,0,8,11, +-9,6,85,140,67,19,255,202,106,21,255,214,125,39,255,25,20,14,255,0, +-12,6,6,5,28,13,11,8,139,20,16,11,170,19,15,10,142,8,7,5, +-28,0,8,10,9,5,142,153,79,20,255,195,90,20,255,206,111,27,255,24, +-20,13,255,0,12,12,10,9,170,195,113,32,255,211,115,30,255,203,108,24, +-255,31,21,10,173,0,8,11,9,6,85,140,70,19,255,185,86,20,255,180, +-87,19,255,24,15,7,181,0,32,9,8,6,170,174,91,23,255,215,123,42, +-255,221,150,66,255,25,20,14,255,0,32,9,7,4,170,148,77,19,255,181, +-92,20,255,180,87,19,255,25,17,8,170,0,8,34,24,13,170,161,102,38, +-255,219,154,70,255,220,142,59,255,213,124,38,255,32,24,13,198,0,8,11, +-9,6,85,140,70,19,255,185,86,20,255,178,90,19,255,20,14,7,212,0, +-12,8,7,5,127,144,78,19,255,185,86,20,255,180,87,19,255,29,19,10, +-170,0,8,13,11,8,116,194,116,33,255,209,110,30,255,202,95,23,255,22, +-17,9,221,0,12,10,8,5,85,12,9,5,170,10,8,5,130,6,5,3, +-8,0,12,10,8,5,110,144,78,19,255,185,86,20,255,178,86,19,255,27, +-18,8,170,0,8,11,8,6,85,137,68,18,255,185,86,20,255,200,105,21, +-255,29,21,12,255,4,4,4,25,10,9,7,139,154,100,47,255,215,148,70, +-255,198,131,45,255,46,34,19,255,11,9,6,88,0,12,10,8,5,119,144, +-78,19,255,185,86,20,255,180,87,19,255,21,15,8,210,0,32,13,11,8, +-170,199,119,39,255,220,144,63,255,221,155,70,255,27,21,14,255,0,20,10, +-9,7,170,171,89,22,255,195,98,20,255,183,89,19,255,29,20,8,170,0, +-8,11,9,6,85,139,70,20,255,202,103,23,255,211,118,36,255,28,21,13, +-201,0,4,8,8,7,57,118,84,39,255,215,159,86,255,219,149,66,255,216, +-129,45,255,211,121,34,255,34,25,13,178,0,8,11,10,6,88,146,76,19, +-255,185,94,20,255,178,90,19,255,24,18,9,255,0,12,18,15,11,170,203, +-122,42,255,215,126,40,255,209,106,30,255,32,22,13,184,0,8,12,10,7, +-85,143,72,20,255,185,94,20,255,178,90,19,255,20,14,7,210,0,40,9, +-7,4,170,148,77,19,255,180,87,19,255,178,86,19,255,30,21,9,255,5, +-5,4,37,8,7,5,28,20,17,13,227,133,89,38,255,215,142,56,255,216, +-129,45,255,209,115,32,255,26,19,11,210,0,8,11,9,6,85,142,74,19, +-255,185,86,20,255,178,90,19,255,20,14,7,210,0,12,9,7,4,122,143, +-75,20,255,203,108,24,255,216,129,45,255,30,23,15,255,0,12,12,10,7, +-110,16,13,9,170,13,10,8,122,0,16,9,8,6,105,142,74,19,255,185, +-86,20,255,180,87,19,255,23,16,8,255,0,24,15,13,10,170,203,122,42, +-255,215,126,40,255,209,118,30,255,24,17,11,255,0,24,9,8,4,170,148, +-77,19,255,181,92,20,255,180,87,19,255,23,16,8,198,0,12,9,7,6, +-139,159,82,20,255,203,100,24,255,212,121,33,255,28,21,13,255,0,12,12, +-11,9,119,81,59,34,255,216,153,71,255,173,117,50,255,21,18,14,255,10, +-10,9,244,11,10,8,255,60,35,15,255,173,85,20,255,84,49,17,255,13, +-10,6,170,0,12,10,8,5,130,146,79,19,255,193,89,20,255,203,104,24, +-255,120,77,31,255,19,17,12,255,117,80,36,255,219,154,70,255,178,121,53, +-255,20,17,13,255,45,33,18,255,184,94,21,255,195,90,20,255,205,106,26, +-255,30,22,13,255,0,12,7,7,6,82,35,28,18,255,196,114,33,255,148, +-80,25,255,32,22,11,255,20,15,9,255,26,18,9,255,88,49,17,255,149, +-78,20,255,40,26,11,255,9,7,4,85,0,28,9,7,4,127,140,70,19, +-255,181,88,20,255,180,87,19,255,18,13,7,235,0,24,10,9,7,93,104, +-69,35,255,201,131,48,255,194,109,33,255,65,42,20,255,12,10,7,170,0, +-36,9,7,4,170,146,79,19,255,181,88,20,255,180,87,19,255,23,16,8, +-198,0,32,15,14,10,198,188,133,61,255,219,149,66,255,194,115,37,255,17, +-15,10,244,0,24,10,8,5,113,144,78,19,255,185,86,20,255,180,87,19, +-255,18,13,7,255,0,140,7,6,4,65,53,31,12,255,162,83,19,255,185, +-94,20,255,130,70,21,255,31,22,10,255,25,19,10,198,22,17,9,246,70, +-40,15,255,169,87,20,255,200,105,21,255,212,123,37,255,28,21,13,221,0, +-8,12,10,9,133,200,127,41,255,210,120,33,255,202,95,23,255,19,14,8, +-238,0,12,10,8,5,110,144,78,19,255,185,86,20,255,178,86,19,255,28, +-19,9,170,0,8,12,10,9,133,194,112,31,255,209,110,30,255,202,102,21, +-255,21,15,8,235,0,16,9,7,4,57,12,10,5,88,10,8,5,85,0, +-12,10,8,5,125,146,79,19,255,181,88,20,255,180,87,19,255,25,17,8, +-195,0,12,10,8,5,119,144,78,19,255,185,94,20,255,200,105,21,255,23, +-18,10,221,0,8,11,9,8,153,200,123,41,255,212,117,33,255,202,103,23, +-255,111,63,20,255,27,20,10,255,20,16,9,246,22,17,9,249,28,20,9, +-198,30,21,9,170,24,17,9,215,28,20,9,201,10,8,5,85,0,16,9, +-7,4,170,146,79,19,255,181,88,20,255,180,87,19,255,18,13,7,255,0, +-16,11,10,8,113,152,104,47,255,214,134,49,255,204,105,25,255,98,54,19, +-255,18,13,9,227,13,10,8,170,14,12,9,198,60,41,21,255,199,112,28, +-255,202,102,21,255,202,103,23,255,26,19,11,204,0,8,12,11,9,116,187, +-101,24,255,202,93,21,255,187,91,20,255,18,13,7,255,0,12,9,7,4, +-170,146,79,19,255,181,88,20,255,178,90,19,255,27,17,8,170,0,8,11, +-9,6,85,139,70,20,255,202,103,23,255,212,123,37,255,32,24,15,255,0, +-24,13,12,10,170,196,114,33,255,206,106,25,255,196,99,21,255,28,19,9, +-170,0,8,11,8,6,85,137,68,18,255,181,88,20,255,178,86,19,255,164, +-85,21,255,138,73,21,255,175,93,20,255,178,86,19,255,46,28,11,255,6, +-5,3,108,0,20,9,7,4,170,146,76,19,255,189,88,20,255,189,88,20, +-255,28,19,9,170,0,8,11,9,6,85,137,68,18,255,185,86,20,255,178, +-90,19,255,27,17,8,170,0,4,9,7,4,167,146,79,19,255,20,14,7, +-252,0,4,11,9,6,85,137,68,18,255,185,94,20,255,178,90,19,255,27, +-17,8,170,0,8,11,9,6,85,137,68,18,255,185,86,20,255,180,87,19, +-255,18,13,7,255,0,12,9,7,4,170,146,79,19,255,185,94,20,255,183, +-85,19,255,27,19,8,170,0,8,11,9,6,85,140,73,19,255,181,88,20, +-255,178,90,19,255,20,15,7,255,0,12,16,14,11,170,208,143,59,255,223, +-156,70,255,216,135,49,255,28,22,13,210,0,8,11,9,6,85,140,70,19, +-255,185,94,20,255,178,90,19,255,72,39,13,255,10,8,5,218,8,6,3, +-170,9,7,4,193,39,24,10,255,160,82,19,255,185,94,20,255,144,74,23, +-255,16,13,9,170,0,8,10,9,7,85,145,101,48,255,218,149,67,255,210, +-115,31,255,99,57,19,255,10,8,5,227,8,6,3,170,9,7,4,190,30, +-20,9,255,158,81,19,255,185,94,20,255,178,90,19,255,27,17,8,170,0, +-8,11,8,6,85,137,68,18,255,185,86,20,255,180,87,19,255,18,13,7, +-255,0,44,9,9,8,28,13,12,8,142,27,20,10,170,29,21,10,193,24, +-17,9,252,22,17,9,232,22,17,9,255,87,49,18,255,181,88,20,255,178, +-90,19,255,100,54,17,255,11,10,6,150,0,16,9,7,4,170,146,79,19, +-255,181,88,20,255,180,87,19,255,18,13,7,255,0,16,15,13,10,170,208, +-141,55,255,223,156,70,255,217,133,50,255,23,19,12,255,0,12,10,8,5, +-122,144,78,19,255,185,86,20,255,180,87,19,255,30,20,9,176,0,12,12, +-10,7,85,39,26,12,255,155,80,20,255,99,55,19,255,19,16,12,255,12, +-11,9,255,18,15,11,255,119,84,38,255,209,137,60,255,138,86,35,255,18, +-15,11,178,0,12,10,8,5,130,144,78,19,255,181,92,20,255,178,90,19, +-255,39,24,10,255,6,5,3,210,29,20,8,255,169,87,20,255,97,53,18, +-255,8,7,5,255,26,21,15,255,212,142,59,255,221,151,68,255,218,142,53, +-255,34,25,15,255,0,20,5,5,4,82,16,12,7,255,160,82,19,255,185, +-86,20,255,185,86,20,255,52,29,11,255,7,6,4,170,0,20,8,7,5, +-85,83,46,16,255,181,92,20,255,178,86,19,255,87,47,14,255,10,8,5, +-224,8,6,3,170,9,7,4,190,29,20,8,255,195,104,24,255,217,136,50, +-255,221,155,70,255,30,23,15,255,0,16,8,7,5,85,26,18,9,255,107, +-59,20,255,151,80,22,255,60,34,15,255,11,9,6,170,0,36,8,7,5, +-170,159,82,20,255,202,118,35,255,66,51,29,255,9,9,8,96,0,16,15, +-13,10,170,208,140,59,255,223,156,70,255,215,133,44,255,27,20,12,255,0, +-20,14,12,7,244,131,67,20,255,176,89,19,255,17,12,6,255,0,184,17, +-14,10,85,171,95,28,255,206,123,33,255,208,123,31,255,207,112,28,255,202, +-107,23,255,191,98,22,255,170,91,21,255,195,107,22,255,209,123,30,255,212, +-132,37,255,214,134,39,255,211,133,40,255,202,121,35,255,29,21,12,164,0, +-8,12,10,7,82,168,98,29,255,202,121,35,255,196,120,31,255,194,115,31, +-255,190,115,27,255,185,101,26,255,184,100,25,255,199,107,26,255,208,123,31, +-255,168,105,37,255,25,21,14,227,9,8,8,28,0,8,8,8,7,28,39, +-30,18,249,183,122,42,255,211,133,40,255,210,133,43,255,161,106,41,255,15, +-13,10,221,5,4,4,17,0,8,14,11,7,113,148,83,25,255,193,108,24, +-255,180,93,23,255,27,18,10,153,0,8,12,9,7,122,144,78,19,255,180, +-91,19,255,83,46,16,255,7,6,4,184,0,8,4,4,3,85,28,21,13, +-255,202,121,35,255,209,132,42,255,131,87,36,255,10,9,7,255,5,5,5, +-28,0,40,10,9,7,68,86,62,31,255,206,131,43,255,214,130,39,255,76, +-50,25,255,7,6,6,113,0,16,5,5,4,28,21,17,12,255,202,121,35, +-255,210,135,37,255,157,100,38,255,18,15,11,150,0,16,18,15,9,91,161, +-88,24,255,105,64,28,255,11,10,8,170,0,12,8,7,7,85,40,28,17, +-255,174,91,23,255,42,27,13,173,0,32,10,8,5,116,133,66,16,255,161, +-85,17,255,161,78,17,255,25,16,8,221,0,24,15,12,8,119,170,99,29, +-255,203,126,36,255,199,127,34,255,27,20,12,210,0,60,13,11,8,122,170, +-99,29,255,204,127,37,255,199,119,34,255,27,20,12,198,0,12,4,4,3, +-11,18,13,9,255,154,79,19,255,174,88,19,255,92,51,17,255,12,10,7, +-198,0,24,11,9,6,147,142,74,19,255,171,90,18,255,159,81,18,255,17, +-12,6,255,0,12,8,7,5,142,133,66,16,255,161,85,17,255,161,85,17, +-255,21,14,6,215,0,24,10,9,7,198,190,107,25,255,203,104,24,255,196, +-99,21,255,21,15,8,255,2,2,1,14,0,20,9,8,6,37,35,28,18, +-255,183,112,36,255,212,132,37,255,178,118,41,255,27,23,16,255,5,5,4, +-198,0,32,15,12,8,105,142,79,23,255,189,97,22,255,160,83,21,255,18, +-13,7,218,0,12,10,8,7,198,196,114,33,255,214,129,37,255,212,132,37, +-255,27,21,12,210,0,8,13,11,8,116,192,114,31,255,210,125,33,255,209, +-123,30,255,203,113,26,255,177,91,22,255,159,82,20,255,160,83,21,255,165, +-85,20,255,168,89,19,255,163,86,18,255,161,78,17,255,23,15,6,170,0, +-8,9,7,4,57,99,48,14,255,142,73,17,255,133,66,16,255,19,13,6, +-190,0,12,7,6,4,164,135,66,16,255,161,85,17,255,161,85,17,255,25, +-16,6,170,0,8,10,8,5,85,131,65,16,255,161,85,17,255,161,85,17, +-255,19,13,6,227,0,12,10,8,5,176,190,107,25,255,212,127,35,255,214, +-134,39,255,30,21,13,255,0,24,12,10,7,170,194,109,33,255,213,132,36, +-255,208,122,29,255,28,20,11,255,0,24,9,7,4,147,136,70,17,255,202, +-98,21,255,211,126,34,255,27,20,12,255,3,3,2,28,0,8,10,8,7, +-195,180,93,23,255,202,102,21,255,202,102,21,255,25,17,10,221,0,8,13, +-11,8,65,129,70,22,255,172,88,21,255,144,78,19,255,22,15,7,176,0, +-12,10,8,7,198,198,124,37,255,215,136,42,255,214,134,39,255,27,21,12, +-212,0,8,12,10,7,79,151,88,26,255,198,116,29,255,192,109,27,255,25, +-18,10,167,0,8,12,9,7,82,119,62,20,255,174,89,21,255,154,79,19, +-255,22,15,7,181,0,20,5,5,4,68,20,14,7,249,142,73,17,255,143, +-74,18,255,45,26,10,255,10,8,5,85,0,76,7,6,6,85,39,30,18, +-255,196,121,41,255,213,135,42,255,115,72,30,255,10,9,7,170,0,40,5, +-5,4,17,6,5,5,85,5,5,4,45,0,28,9,7,4,142,146,79,19, +-255,204,108,23,255,212,126,33,255,30,22,13,255,3,3,3,40,0,36,10, +-8,5,125,133,66,16,255,161,85,17,255,161,85,17,255,19,13,6,212,0, +-12,10,8,5,127,136,70,17,255,193,97,20,255,203,108,24,255,30,21,11, +-193,0,8,13,10,6,85,134,70,19,255,171,90,18,255,159,81,18,255,17, +-12,6,238,0,12,8,6,5,144,135,66,16,255,161,85,17,255,161,85,17, +-255,23,15,6,170,0,8,10,7,5,85,133,66,16,255,185,94,20,255,209, +-123,30,255,23,18,12,255,3,3,2,28,0,4,5,5,4,28,18,15,11, +-227,134,72,21,255,158,81,19,255,143,74,18,255,22,15,7,142,0,8,10, +-8,5,85,131,65,16,255,163,79,18,255,178,90,19,255,22,16,9,255,3, +-2,2,20,0,8,9,7,6,176,144,78,19,255,175,88,18,255,163,79,18, +-255,26,16,7,170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161, +-78,17,255,19,13,6,229,0,32,8,7,5,156,144,78,19,255,202,102,21, +-255,206,111,27,255,27,20,12,255,0,32,10,8,5,133,135,66,16,255,161, +-85,17,255,161,85,17,255,19,13,6,227,0,12,8,7,5,255,172,85,21, +-255,189,92,20,255,172,87,19,255,24,16,7,170,0,8,10,8,5,85,129, +-64,16,255,161,85,17,255,161,85,17,255,19,13,6,212,0,12,10,8,5, +-127,135,66,16,255,161,85,17,255,161,85,17,255,26,16,7,170,0,8,11, +-9,6,85,134,70,19,255,171,90,18,255,159,78,18,255,23,15,6,170,0, +-8,9,7,4,57,98,49,13,255,139,71,16,255,133,66,16,255,19,13,6, +-193,0,12,7,6,4,176,133,66,16,255,161,85,17,255,161,85,17,255,23, +-15,6,170,0,8,10,8,5,85,129,64,16,255,165,87,18,255,180,91,19, +-255,20,15,9,255,0,4,5,5,4,17,26,21,15,227,126,75,25,255,178, +-95,21,255,142,74,19,255,46,28,11,255,10,8,5,57,0,8,10,8,5, +-85,131,65,16,255,161,85,17,255,161,85,17,255,17,12,6,252,2,1,1, +-8,0,28,13,11,8,170,199,119,34,255,215,136,42,255,214,139,41,255,28, +-20,13,255,0,20,8,7,5,170,135,66,16,255,161,85,17,255,161,85,17, +-255,23,15,6,170,0,8,10,8,5,85,131,67,16,255,202,102,21,255,211, +-127,36,255,22,17,11,249,0,8,16,14,11,201,101,67,28,255,191,98,22, +-255,185,94,20,255,172,87,19,255,26,17,7,170,0,8,10,8,5,85,129, +-64,16,255,161,85,17,255,161,85,17,255,31,20,8,255,5,5,4,102,0, +-4,5,4,4,28,16,13,9,255,164,85,21,255,180,91,19,255,165,87,18, +-255,26,17,7,170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161, +-85,17,255,19,13,6,212,0,40,10,8,5,133,135,66,16,255,161,85,17, +-255,161,85,17,255,26,17,7,255,3,3,2,136,9,7,4,227,131,67,20, +-255,197,104,22,255,198,104,21,255,183,93,19,255,172,87,19,255,26,17,7, +-170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,19, +-13,6,212,0,12,10,8,5,127,135,66,16,255,193,97,20,255,209,123,30, +-255,19,15,10,252,0,8,13,11,8,65,125,68,22,255,174,86,21,255,146, +-76,19,255,22,14,7,178,0,12,8,6,5,144,135,66,16,255,161,85,17, +-255,161,85,17,255,19,14,6,238,0,24,13,11,8,170,163,87,20,255,180, +-91,19,255,165,87,18,255,17,12,6,255,0,24,9,7,4,139,135,66,16, +-255,161,85,17,255,161,85,17,255,15,11,6,246,0,12,9,7,6,184,180, +-93,23,255,211,115,30,255,213,133,38,255,28,20,13,255,0,16,12,11,9, +-170,152,91,31,255,188,105,31,255,115,66,22,255,91,50,16,255,84,46,15, +-255,116,59,17,255,118,62,17,255,15,11,6,221,0,16,10,8,5,116,146, +-79,19,255,202,103,23,255,209,128,32,255,200,127,41,255,167,106,40,255,197, +-122,42,255,210,130,35,255,186,106,27,255,88,51,19,255,102,55,17,255,157, +-83,18,255,189,92,20,255,209,123,30,255,29,21,12,224,0,8,7,6,6, +-28,41,31,18,235,160,84,23,255,170,87,19,255,45,26,10,255,5,5,4, +-170,4,4,4,8,4,4,3,99,15,12,6,255,140,72,17,255,138,71,17, +-255,45,26,10,255,10,8,5,85,0,24,8,7,5,142,133,66,16,255,161, +-85,17,255,161,85,17,255,19,13,6,229,0,24,13,11,8,170,160,86,21, +-255,185,90,20,255,91,50,16,255,7,6,4,255,0,40,8,7,5,150,133, +-66,16,255,161,85,17,255,161,85,17,255,15,11,6,246,0,32,8,8,7, +-110,74,52,27,255,191,103,24,255,176,89,19,255,34,22,9,255,6,5,3, +-57,0,20,8,6,5,161,133,66,16,255,161,85,17,255,161,78,17,255,15, +-11,6,252,0,140,12,10,5,85,123,61,16,255,161,85,17,255,161,85,17, +-255,22,15,7,255,2,2,1,85,0,8,7,6,4,244,133,66,16,255,167, +-88,18,255,189,92,20,255,27,19,10,195,0,8,12,10,7,110,160,83,21, +-255,177,85,18,255,161,78,17,255,15,11,6,252,0,12,7,6,4,161,133, +-66,16,255,161,85,17,255,161,85,17,255,23,15,6,170,0,8,11,9,6, +-85,134,70,19,255,171,90,18,255,159,78,18,255,15,11,6,249,0,12,10, +-8,5,85,98,49,13,255,135,72,16,255,133,66,16,255,19,13,6,139,0, +-8,10,8,5,85,131,65,16,255,161,85,17,255,161,85,17,255,15,11,6, +-246,0,12,7,6,4,164,133,66,16,255,165,87,18,255,178,90,19,255,24, +-17,9,212,0,8,13,11,8,105,165,86,22,255,180,91,19,255,159,81,18, +-255,19,14,6,255,2,2,1,79,0,44,8,6,5,167,133,66,16,255,161, +-85,17,255,161,85,17,255,15,11,6,252,0,16,7,6,6,28,24,19,13, +-227,103,59,20,255,157,83,18,255,154,78,17,255,150,81,19,255,154,79,19, +-255,158,81,19,255,162,83,19,255,161,85,17,255,159,81,18,255,163,86,18, +-255,27,18,8,170,0,8,11,9,6,85,131,67,16,255,165,87,18,255,161, +-85,17,255,15,11,6,252,0,12,8,6,5,167,133,66,16,255,161,85,17, +-255,161,85,17,255,23,15,6,170,0,8,10,8,5,85,131,65,16,255,175, +-88,18,255,191,96,20,255,25,18,10,255,0,24,11,9,6,170,148,77,19, +-255,169,82,18,255,161,85,17,255,23,15,6,170,0,8,10,8,5,85,129, +-64,16,255,161,85,17,255,161,85,17,255,87,47,14,255,23,17,8,255,65, +-34,12,255,150,76,17,255,132,68,17,255,41,25,10,255,10,8,5,85,0, +-16,8,7,5,150,133,66,16,255,161,85,17,255,161,78,17,255,23,15,6, +-170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,23, +-15,6,170,0,4,8,7,5,153,133,66,16,255,19,13,6,238,0,4,10, +-8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,23,15,6,170,0, +-8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,15,11,6, +-252,0,12,8,6,5,167,133,66,16,255,161,85,17,255,161,85,17,255,23, +-15,6,170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17, +-255,31,20,8,255,5,4,4,85,0,4,5,4,4,40,17,14,10,255,200, +-120,35,255,207,112,28,255,195,98,20,255,29,20,8,170,0,8,10,8,5, +-85,131,65,16,255,163,86,18,255,159,81,18,255,150,76,17,255,137,70,16, +-255,135,72,16,255,135,66,16,255,146,75,17,255,159,81,18,255,131,67,20, +-255,42,31,17,255,10,9,7,62,0,8,5,5,4,8,26,21,15,227,137, +-79,28,255,174,88,19,255,158,83,17,255,137,70,16,255,135,72,16,255,135, +-66,16,255,146,75,17,255,159,81,18,255,161,85,17,255,161,85,17,255,23, +-15,6,170,0,8,10,8,5,85,131,67,16,255,163,86,18,255,159,81,18, +-255,17,12,6,255,0,68,2,1,1,8,7,6,4,249,137,67,16,255,165, +-80,18,255,154,78,17,255,27,18,8,170,0,16,8,6,5,167,133,66,16, +-255,161,85,17,255,161,85,17,255,15,11,6,252,0,16,13,11,8,170,199, +-124,36,255,211,125,32,255,200,105,21,255,18,13,7,255,0,12,7,6,4, +-164,133,66,16,255,161,85,17,255,161,78,17,255,19,13,6,227,0,16,8, +-7,5,122,68,38,13,255,150,83,23,255,174,107,35,255,181,112,38,255,190, +-117,39,255,193,114,36,255,143,84,26,255,15,12,8,212,4,4,3,6,0, +-12,10,8,5,108,135,66,16,255,161,85,17,255,161,85,17,255,125,65,16, +-255,90,47,13,255,121,60,16,255,164,84,19,255,189,97,22,255,177,104,32, +-255,194,123,39,255,212,134,41,255,210,124,31,255,200,105,21,255,23,17,8, +-218,0,16,10,8,5,167,56,31,11,255,110,55,15,255,118,62,17,255,115, +-58,16,255,115,58,16,255,120,63,17,255,95,46,14,255,17,13,6,227,7, +-6,4,28,0,16,14,12,7,227,87,43,14,255,154,78,17,255,152,77,17, +-255,139,71,16,255,135,72,16,255,135,66,16,255,146,75,17,255,200,105,21, +-255,211,127,36,255,214,134,39,255,23,18,12,255,0,12,7,6,4,85,26, +-16,7,255,131,67,16,255,145,75,18,255,78,43,15,255,7,6,4,255,0, +-40,10,8,5,136,157,81,20,255,210,129,33,255,139,89,36,255,10,9,7, +-198,0,16,13,11,8,170,196,113,31,255,206,114,25,255,189,92,20,255,18, +-13,7,244,0,16,5,4,4,88,27,19,8,255,141,73,18,255,161,85,17, +-255,21,14,6,218,0,112,12,9,7,99,11,8,6,170,10,8,5,91,0, +-60,11,10,8,28,32,23,13,227,108,57,19,255,153,82,18,255,154,78,17, +-255,146,75,17,255,97,47,14,255,36,24,11,255,108,64,25,255,203,111,30, +-255,207,118,32,255,207,118,32,255,189,110,32,255,63,41,20,255,15,12,8, +-76,0,8,9,8,6,28,38,27,15,218,51,33,18,255,48,32,17,255,131, +-74,24,255,182,97,21,255,176,89,19,255,170,87,19,255,134,72,21,255,37, +-25,14,255,15,13,8,144,7,7,6,28,0,12,11,9,8,127,171,99,28, +-255,208,123,31,255,203,124,30,255,104,63,27,255,15,13,10,212,7,6,6, +-28,0,12,14,11,7,170,142,74,19,255,161,85,17,255,159,81,18,255,27, +-18,8,184,0,8,6,5,3,28,27,17,8,227,92,46,13,255,111,55,14, +-255,31,20,8,255,8,6,3,198,9,7,4,170,10,8,5,227,22,16,9, +-255,61,39,18,255,107,64,26,255,108,66,25,255,32,22,11,255,9,7,6, +-170,0,44,10,9,7,156,56,36,19,255,191,114,32,255,175,98,30,255,41, +-27,16,255,11,9,6,57,0,12,21,15,10,227,100,56,21,255,160,83,21, +-255,80,44,17,255,14,12,7,190,7,6,6,28,0,16,13,10,6,28,29, +-20,10,212,21,15,10,144,0,20,12,9,7,85,39,24,10,173,16,12,7, +-85,0,32,6,5,3,20,19,13,6,173,21,14,6,255,21,15,6,215,10, +-8,5,85,0,24,15,12,8,170,190,98,23,255,203,108,24,255,202,111,23, +-255,23,17,10,255,0,60,17,13,10,170,195,112,30,255,211,124,30,255,205, +-106,26,255,31,21,12,255,0,12,8,6,5,139,44,25,9,255,135,72,16, +-255,104,54,13,255,15,11,6,249,7,6,4,28,0,24,7,6,4,57,44, +-25,9,255,137,73,16,255,143,70,16,255,49,25,8,255,8,6,3,184,8, +-6,3,85,8,6,3,142,23,16,6,255,130,66,15,255,145,77,16,255,87, +-44,12,255,10,8,5,142,0,20,11,9,8,164,53,31,14,255,150,74,19, +-255,154,78,17,255,148,76,17,255,65,33,10,255,10,8,5,184,6,5,5, +-28,0,16,11,9,6,142,175,102,30,255,207,123,32,255,208,114,31,255,196, +-114,33,255,89,56,26,255,17,13,10,255,11,8,6,170,9,7,6,170,11, +-8,6,170,15,11,8,170,18,13,9,142,8,6,5,28,0,8,10,8,5, +-93,102,53,17,255,159,81,18,255,154,78,17,255,72,37,11,255,11,8,6, +-227,9,7,6,170,11,8,6,198,61,36,20,255,196,107,27,255,204,114,27, +-255,182,102,31,255,19,14,10,170,0,8,6,6,5,20,26,19,11,198,28, +-20,11,255,22,16,9,255,23,16,8,255,27,18,8,255,24,16,7,255,24, +-16,7,255,74,39,11,255,139,68,16,255,143,70,16,255,143,70,16,255,20, +-13,5,170,0,8,7,6,4,74,87,44,12,255,155,79,18,255,151,73,16, +-255,67,34,10,255,9,7,4,198,9,7,4,96,8,6,5,159,27,17,8, +-255,137,67,16,255,158,80,17,255,112,56,15,255,10,8,5,167,0,8,7, +-5,4,85,74,36,11,255,150,83,17,255,145,77,16,255,55,29,10,255,8, +-6,3,198,8,6,3,88,7,6,4,153,39,24,12,255,199,112,28,255,210, +-115,31,255,184,108,33,255,17,14,10,198,0,24,11,9,6,170,139,69,18, +-255,168,86,19,255,154,78,17,255,17,12,6,235,0,24,7,6,4,85,64, +-32,11,255,162,80,19,255,198,96,21,255,109,63,26,255,15,11,8,227,10, +-8,7,170,8,7,5,195,29,18,8,255,137,67,16,255,154,78,17,255,114, +-59,15,255,11,10,6,164,0,8,9,7,6,85,97,50,16,255,159,81,18, +-255,152,77,17,255,74,36,11,255,10,8,5,198,7,6,4,125,10,8,5, +-198,61,36,20,255,200,105,29,255,209,122,28,255,180,104,29,255,16,12,9, +-170,0,8,12,10,7,170,160,83,21,255,183,89,19,255,174,88,19,255,28, +-19,9,187,0,8,14,10,7,85,143,75,20,255,195,98,20,255,189,92,20, +-255,21,15,8,224,0,24,7,6,4,85,26,16,7,255,111,55,14,255,132, +-67,15,255,39,23,8,255,8,6,3,113,0,68,9,7,6,85,32,22,13, +-255,188,112,31,255,193,114,30,255,94,57,25,255,17,13,10,170,0,44,9, +-7,4,142,10,8,5,255,10,8,5,198,6,5,3,28,0,24,8,7,5, +-85,88,48,19,255,204,114,27,255,208,118,31,255,111,62,26,255,11,8,6, +-227,8,7,5,150,10,8,5,116,10,8,5,88,9,7,4,85,6,5,3, +-74,0,16,10,8,5,99,114,56,13,255,143,70,16,255,143,70,16,255,18, +-12,5,215,0,12,8,7,3,130,118,60,13,255,148,76,17,255,150,76,17, +-255,24,16,7,170,0,8,9,7,4,85,114,56,13,255,145,74,16,255,143, +-70,16,255,52,28,9,255,8,6,3,198,8,6,3,88,8,6,3,144,23, +-15,6,255,130,66,15,255,151,80,16,255,111,55,14,255,10,8,5,144,0, +-8,6,5,3,59,59,32,10,255,157,83,18,255,185,90,20,255,97,54,22, +-255,14,10,7,227,13,10,6,170,13,10,6,255,84,41,13,255,148,76,17, +-255,155,82,18,255,135,66,16,255,14,10,5,159,0,8,9,7,4,85,114, +-56,13,255,145,77,16,255,145,74,16,255,55,28,10,255,9,7,4,198,8, +-6,3,93,8,6,3,147,25,16,6,255,130,64,15,255,151,80,16,255,111, +-55,14,255,10,8,5,142,0,8,9,7,4,85,114,56,13,255,145,77,16, +-255,143,70,16,255,52,28,9,255,8,6,3,198,8,6,3,102,8,6,3, +-139,8,6,3,170,9,8,4,113,0,12,10,8,5,91,114,56,13,255,150, +-76,17,255,150,76,17,255,17,12,6,252,0,32,7,6,4,85,64,33,11, +-255,145,77,16,255,143,70,16,255,56,29,9,255,8,6,3,198,8,6,3, +-85,6,5,3,119,14,11,5,255,128,66,15,255,151,73,16,255,143,76,16, +-255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143,70,16,255,143, +-70,16,255,18,12,5,215,0,12,8,7,3,130,114,56,13,255,143,70,16, +-255,143,70,16,255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143, +-70,16,255,143,70,16,255,20,13,5,170,0,8,7,6,4,71,87,44,12, +-255,158,87,17,255,161,85,17,255,103,53,20,255,15,11,8,227,10,8,7, +-170,10,8,7,195,33,20,10,255,137,67,16,255,151,73,16,255,111,55,14, +-255,10,8,5,142,0,8,9,7,4,85,114,56,13,255,143,70,16,255,146, +-75,17,255,18,13,7,255,0,8,7,6,6,74,24,16,7,255,132,67,15, +-255,145,77,16,255,135,72,16,255,14,10,5,170,0,8,9,7,4,85,114, +-56,13,255,145,77,16,255,143,70,16,255,58,31,11,255,11,8,6,227,11, +-9,6,170,11,8,6,170,10,7,5,170,9,8,4,113,0,12,11,9,6, +-161,175,92,24,255,203,108,24,255,198,101,23,255,25,18,10,255,0,20,8, +-6,3,147,114,56,13,255,143,70,16,255,143,70,16,255,20,13,5,170,0, +-8,9,7,4,85,114,56,13,255,170,87,19,255,199,106,24,255,24,17,11, +-255,0,8,6,6,5,28,15,12,6,255,128,66,15,255,145,74,16,255,143, +-70,16,255,20,13,5,170,0,8,6,5,3,57,57,31,10,255,145,77,16, +-255,143,70,16,255,90,44,13,255,19,13,6,255,10,8,5,255,13,10,6, +-255,62,33,11,255,135,72,16,255,151,73,16,255,108,53,13,255,10,8,5, +-142,0,8,9,7,4,85,114,56,13,255,143,70,16,255,143,70,16,255,18, +-12,5,215,0,40,7,6,4,85,64,33,11,255,145,77,16,255,143,70,16, +-255,67,34,10,255,14,10,5,255,49,27,9,255,140,72,17,255,160,85,19, +-255,160,85,19,255,110,55,15,255,31,20,8,255,9,7,4,57,0,8,9, +-8,4,85,114,56,13,255,143,70,16,255,143,70,16,255,18,12,5,215,0, +-12,8,7,3,136,118,60,13,255,154,75,17,255,172,87,19,255,24,17,9, +-204,0,8,8,7,5,85,95,49,16,255,161,85,17,255,152,77,17,255,71, +-34,10,255,9,7,4,198,8,6,3,88,8,6,3,142,23,15,6,255,130, +-66,15,255,151,80,16,255,111,55,14,255,14,10,5,170,0,24,9,7,4, +-164,118,56,15,255,145,74,16,255,143,70,16,255,16,12,5,224,0,24,9, +-7,4,85,85,43,12,255,151,80,16,255,143,70,16,255,55,29,10,255,8, +-6,3,198,8,6,3,93,8,6,5,173,45,27,14,255,199,112,28,255,210, +-124,31,255,199,119,34,255,19,15,10,221,0,20,13,11,8,170,46,28,11, +-255,131,65,16,255,145,74,16,255,137,67,16,255,70,35,11,255,12,10,5, +-224,7,6,4,28,0,16,8,6,5,34,37,25,14,255,181,100,28,255,206, +-113,31,255,207,123,32,255,199,119,34,255,107,67,28,255,28,20,11,255,28, +-19,9,255,84,41,13,255,141,75,16,255,145,74,16,255,159,82,20,255,88, +-53,25,255,13,11,8,99,0,8,13,10,6,85,114,60,17,255,148,76,17, +-255,143,70,16,255,21,14,6,255,0,12,10,8,5,170,119,61,14,255,145, +-77,16,255,135,72,16,255,19,13,6,170,0,24,8,7,3,142,114,56,13, +-255,143,70,16,255,143,70,16,255,16,12,5,218,0,24,11,8,6,170,126, +-62,15,255,151,80,16,255,112,57,13,255,19,13,6,255,8,6,3,144,8, +-6,3,85,9,7,4,113,8,6,3,167,8,6,3,170,8,6,3,170,9, +-8,4,113,0,12,10,8,5,91,114,56,13,255,145,74,16,255,143,70,16, +-255,61,32,10,255,9,8,4,170,0,32,12,10,7,207,74,36,11,255,139, +-74,16,255,79,40,12,255,10,8,5,210,0,16,9,7,4,85,27,17,6, +-255,130,66,15,255,143,70,16,255,143,76,16,255,16,12,5,221,0,140,8, +-6,3,85,74,39,11,255,145,77,16,255,143,70,16,255,41,23,8,255,7, +-6,4,173,5,5,2,85,6,5,3,113,14,10,5,255,129,65,14,255,145, +-74,16,255,145,74,16,255,24,16,7,170,0,8,10,8,5,85,112,57,13, +-255,145,77,16,255,143,70,16,255,52,28,9,255,8,6,3,198,8,6,3, +-88,8,6,3,144,23,15,6,255,130,66,15,255,151,80,16,255,111,55,14, +-255,10,8,5,144,0,8,6,5,3,59,63,34,10,255,145,77,16,255,143, +-70,16,255,55,29,10,255,8,6,3,198,8,6,3,85,8,6,3,144,32, +-19,7,255,139,74,16,255,155,79,18,255,135,66,16,255,14,10,5,170,0, +-8,6,5,3,57,57,31,10,255,145,77,16,255,143,70,16,255,55,29,10, +-255,8,6,3,198,8,6,3,88,8,6,3,144,21,15,6,255,130,66,15, +-255,143,76,16,255,146,75,17,255,24,15,7,184,0,8,7,6,4,71,66, +-33,11,255,148,79,17,255,143,70,16,255,45,25,8,255,7,5,4,176,7, +-5,4,85,8,6,3,85,9,7,4,85,8,6,3,82,0,28,8,7,3, +-136,114,56,13,255,143,70,16,255,143,70,16,255,16,12,5,221,0,20,7, +-6,4,28,10,8,5,130,19,13,6,170,29,19,8,173,24,16,7,212,27, +-18,8,193,20,13,7,246,55,29,10,255,139,74,16,255,143,70,16,255,143, +-70,16,255,18,13,5,170,0,8,9,7,4,85,115,54,14,255,143,70,16, +-255,143,70,16,255,16,12,5,221,0,12,8,7,3,136,114,56,13,255,143, +-70,16,255,143,70,16,255,20,13,5,170,0,8,9,7,4,85,114,56,13, +-255,145,74,16,255,145,74,16,255,17,11,6,252,0,24,10,8,5,170,119, +-61,14,255,145,74,16,255,143,70,16,255,18,13,5,170,0,8,9,7,4, +-85,114,56,13,255,143,70,16,255,143,70,16,255,33,20,8,255,5,4,4, +-195,8,6,5,198,46,26,9,255,126,62,15,255,132,67,15,255,35,22,8, +-255,9,7,4,93,0,12,10,8,5,93,114,56,13,255,143,70,16,255,143, +-70,16,255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143,70,16, +-255,143,70,16,255,20,13,5,170,0,4,9,7,4,125,114,56,13,255,21, +-13,6,210,0,4,9,7,4,85,114,56,13,255,143,70,16,255,143,70,16, +-255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143,70,16,255,143, +-70,16,255,16,12,5,221,0,12,8,7,3,136,114,56,13,255,143,70,16, +-255,143,70,16,255,20,13,5,170,0,8,6,5,3,57,57,31,10,255,145, +-77,16,255,143,70,16,255,90,44,13,255,17,12,6,255,12,9,5,255,20, +-15,9,255,97,51,20,255,169,87,20,255,161,85,17,255,112,54,15,255,10, +-8,5,142,0,8,9,7,4,85,121,60,16,255,174,88,19,255,176,89,19, +-255,112,59,17,255,37,23,10,255,26,16,7,255,25,18,8,255,24,15,7, +-255,23,16,8,255,18,13,9,198,10,9,7,99,0,16,9,8,6,34,12, +-10,7,167,20,14,7,210,21,15,6,255,26,17,7,255,24,16,7,255,26, +-17,7,255,70,35,11,255,142,73,17,255,148,76,17,255,152,77,17,255,24, +-15,7,170,0,8,13,10,6,96,129,65,18,255,170,87,19,255,170,87,19, +-255,24,16,9,255,0,48,5,4,2,76,8,6,3,85,8,6,3,85,8, +-6,3,85,7,5,4,85,6,5,3,119,16,11,5,255,129,65,14,255,151, +-73,16,255,118,61,15,255,14,10,5,170,0,16,8,7,3,136,114,56,13, +-255,143,70,16,255,143,70,16,255,16,12,5,221,0,16,10,8,7,113,109, +-67,26,255,184,90,21,255,148,76,17,255,52,28,9,255,8,6,3,198,8, +-6,3,88,8,6,3,144,21,15,6,255,130,66,15,255,143,76,16,255,143, +-76,16,255,16,12,5,227,0,20,9,8,6,170,67,42,20,255,202,124,31, +-255,208,128,33,255,205,106,26,255,104,58,21,255,14,11,7,218,6,5,5, +-28,0,16,7,6,4,28,27,17,8,229,102,51,13,255,139,68,16,255,143, +-73,16,255,145,74,16,255,71,37,12,255,26,18,9,255,80,50,23,255,204, +-122,33,255,208,115,33,255,202,104,25,255,149,78,20,255,52,30,11,255,10, +-8,5,85,0,12,14,10,5,170,85,43,12,255,137,73,16,255,77,39,12, +-255,14,10,5,227,10,8,5,170,10,8,5,198,46,26,9,255,137,73,16, +-255,115,59,14,255,25,16,6,232,8,6,3,31,0,12,6,5,3,28,10, +-8,5,119,19,13,6,170,29,19,8,173,26,16,7,210,27,18,8,187,17, +-12,6,246,58,30,11,255,151,77,18,255,192,97,21,255,192,97,21,255,24, +-16,9,207,0,8,4,4,3,3,25,16,6,235,115,59,14,255,143,73,16, +-255,145,77,16,255,108,53,13,255,21,14,6,255,7,6,4,164,10,7,5, +-85,8,7,5,147,9,7,4,136,8,6,5,76,0,20,8,6,5,57,58, +-33,13,255,188,107,27,255,192,111,31,255,85,51,24,255,18,13,9,187,6, +-5,5,20,0,8,11,9,6,156,139,69,18,255,158,83,17,255,148,76,17, +-255,23,15,6,170,0,12,9,7,4,85,19,13,6,255,102,51,13,255,128, +-66,15,255,81,41,12,255,12,9,5,142,0,108,13,10,8,85,115,60,24, +-255,162,75,23,255,121,60,20,255,23,15,8,142,0,60,3,3,2,6,10, +-8,5,170,93,48,12,255,123,65,14,255,123,60,14,255,14,10,5,227,3, +-3,2,85,12,10,7,170,163,83,24,255,199,99,26,255,193,96,24,255,41, +-26,14,227,6,6,5,45,0,24,3,3,2,28,11,8,6,170,106,50,13, +-255,129,63,14,255,129,63,14,255,29,18,8,227,6,5,5,31,0,20,13, +-10,8,136,144,73,21,255,182,89,21,255,99,55,19,255,14,11,7,187,4, +-4,3,3,0,16,9,7,4,113,93,46,12,255,131,66,14,255,121,62,14, +-255,16,11,5,170,0,12,7,6,4,28,14,10,5,227,100,50,13,255,110, +-59,13,255,103,52,14,255,121,59,18,255,134,69,21,255,32,21,11,255,6, +-5,5,198,10,8,7,227,46,28,13,255,104,51,15,255,96,46,13,255,14, +-10,5,139,0,44,10,8,7,108,63,37,18,255,176,88,23,255,160,80,21, +-255,20,14,9,170,0,8,8,6,5,79,85,41,12,255,131,65,16,255,66, +-34,11,255,10,8,5,170,0,144,9,7,4,167,115,56,16,255,165,85,20, +-255,112,65,23,255,18,13,9,142,0,60,13,10,8,142,132,68,21,255,162, +-80,19,255,141,70,18,255,17,12,6,181,0,12,17,12,6,255,103,54,14, +-255,130,66,15,255,31,20,8,255,6,5,3,113,0,32,8,6,3,156,35, +-22,8,255,114,58,13,255,110,59,13,255,88,45,11,255,88,42,11,255,92, +-47,11,255,104,54,13,255,119,58,14,255,61,32,10,255,10,8,5,224,5, +-4,4,20,0,16,11,8,6,85,113,58,22,255,180,90,23,255,140,69,17, +-255,123,63,14,255,123,60,14,255,119,56,14,255,120,61,17,255,24,15,9, +-167,0,16,12,10,7,133,180,88,27,255,203,107,30,255,199,100,28,255,197, +-104,28,255,191,93,28,255,167,78,24,255,132,68,21,255,121,62,18,255,117, +-60,18,255,118,57,17,255,108,50,15,255,17,12,6,113,0,12,14,10,5, +-227,65,33,10,255,115,59,14,255,115,59,14,255,109,52,14,255,116,57,17, +-255,121,59,18,255,139,68,20,255,154,73,19,255,115,62,20,255,33,23,12, +-255,9,8,6,71,0,36,2,2,1,8,8,6,3,170,93,50,12,255,125, +-64,14,255,123,60,14,255,14,10,5,159,0,12,14,10,5,224,65,33,10, +-255,115,59,14,255,115,59,14,255,109,52,14,255,119,61,18,255,129,66,20, +-255,148,75,21,255,170,84,21,255,129,67,22,255,37,25,14,255,8,7,5, +-57,0,8,5,5,4,23,24,17,9,255,103,54,18,255,132,63,17,255,120, +-62,15,255,98,49,13,255,90,45,11,255,94,45,13,255,124,60,17,255,172, +-81,21,255,150,78,25,255,44,29,17,255,9,8,6,91,0,24,8,7,3, +-102,93,46,12,255,125,64,14,255,121,62,14,255,18,12,5,170,0,28,12, +-10,5,227,64,33,11,255,132,66,17,255,158,79,21,255,151,70,22,255,130, +-67,21,255,110,53,15,255,108,53,13,255,118,60,13,255,85,43,12,255,21, +-14,6,255,7,6,4,57,0,12,14,10,5,227,65,33,10,255,131,65,16, +-255,149,72,20,255,133,68,20,255,111,54,16,255,110,53,15,255,138,72,19, +-255,163,81,20,255,112,58,19,255,28,20,9,255,8,7,5,57,0,8,9, +-7,4,91,96,48,13,255,132,70,15,255,123,60,14,255,14,10,5,161,0, +-8,13,10,6,85,148,73,23,255,202,101,27,255,129,67,26,255,18,13,9, +-142,0,28,6,5,3,48,17,12,6,227,108,55,13,255,112,55,13,255,35, +-22,8,255,9,7,4,57,0,64,32,22,13,255,137,68,22,255,154,73,19, +-255,45,26,10,255,8,6,5,144,0,44,8,6,3,68,67,34,10,255,115, +-56,16,255,109,52,14,255,16,11,5,147,0,24,5,4,4,11,22,17,11, +-227,129,76,28,255,195,95,28,255,186,84,23,255,121,59,18,255,107,51,14, +-255,96,46,13,255,90,45,11,255,88,45,11,255,41,24,8,255,12,10,5, +-176,0,12,8,6,3,76,88,44,11,255,125,66,14,255,123,60,14,255,18, +-12,5,170,0,12,9,7,4,85,92,47,11,255,125,64,14,255,123,60,14, +-255,16,11,5,150,0,8,8,6,3,62,88,45,11,255,125,64,14,255,123, +-60,14,255,114,58,13,255,93,50,12,255,88,44,11,255,92,47,11,255,104, +-54,13,255,119,58,14,255,85,43,12,255,21,15,6,255,7,6,4,51,0, +-12,12,10,5,221,61,32,10,255,120,62,15,255,123,61,16,255,109,52,14, +-255,96,46,13,255,102,51,13,255,115,59,14,255,123,65,14,255,85,43,12, +-255,25,16,6,255,7,6,4,51,0,8,8,6,3,74,88,45,11,255,125, +-64,14,255,123,60,14,255,114,58,13,255,93,50,12,255,88,45,11,255,92, +-47,11,255,104,52,13,255,118,60,13,255,85,43,12,255,21,15,6,255,7, +-5,4,40,0,8,8,6,3,74,88,45,11,255,125,64,14,255,123,60,14, +-255,114,58,13,255,93,50,12,255,88,45,11,255,92,43,11,255,93,50,12, +-255,93,50,12,255,20,13,5,85,0,8,8,6,3,65,88,45,11,255,125, +-64,14,255,121,62,14,255,18,13,5,170,0,36,12,10,5,227,59,31,10, +-255,115,62,14,255,114,58,13,255,93,50,12,255,88,44,11,255,88,44,11, +-255,104,54,13,255,118,60,13,255,123,60,14,255,123,60,14,255,14,10,5, +-150,0,8,8,6,3,65,88,45,11,255,125,66,14,255,123,60,14,255,18, +-12,5,170,0,12,9,7,4,85,92,47,11,255,125,66,14,255,123,65,14, +-255,14,10,5,150,0,8,8,6,3,65,88,45,11,255,125,66,14,255,123, +-65,14,255,14,10,5,159,0,12,14,10,5,221,70,35,11,255,155,74,20, +-255,193,89,26,255,185,91,28,255,172,85,27,255,165,80,24,255,155,78,22, +-255,132,66,17,255,90,44,13,255,21,15,6,255,7,5,4,40,0,8,8, +-6,3,74,88,45,11,255,125,64,14,255,121,62,14,255,19,13,6,176,0, +-12,9,6,4,133,93,50,12,255,131,66,14,255,123,65,14,255,14,11,5, +-150,0,8,8,6,3,62,88,45,11,255,125,64,14,255,123,60,14,255,118, +-56,15,255,120,61,17,255,136,67,21,255,118,57,17,255,96,48,13,255,92, +-47,11,255,18,12,5,85,0,8,9,7,4,79,104,51,15,255,140,66,17, +-255,135,66,16,255,17,12,6,198,0,20,9,7,4,85,92,47,11,255,125, +-66,14,255,123,65,14,255,14,10,5,150,0,8,8,6,3,65,88,45,11, +-255,135,66,16,255,136,67,17,255,22,14,7,198,0,12,8,6,3,119,88, +-45,11,255,125,64,14,255,123,60,14,255,14,10,5,159,0,12,12,10,5, +-210,59,31,10,255,115,62,14,255,118,60,13,255,104,54,13,255,100,50,13, +-255,100,50,13,255,114,58,13,255,119,63,14,255,85,43,12,255,21,15,6, +-255,7,5,4,40,0,8,8,6,3,74,88,45,11,255,125,66,14,255,123, +-60,14,255,18,12,5,170,0,44,12,10,5,227,59,31,10,255,115,62,14, +-255,114,58,13,255,100,50,13,255,114,56,13,255,133,66,16,255,160,80,21, +-255,176,83,21,255,45,27,12,255,6,5,3,170,0,12,8,6,3,82,88, +-45,11,255,125,66,14,255,123,60,14,255,18,12,5,170,0,12,9,7,4, +-85,92,47,11,255,131,61,14,255,126,62,15,255,17,11,6,170,0,12,14, +-10,5,227,65,33,10,255,115,59,14,255,115,62,14,255,93,50,12,255,88, +-44,11,255,92,47,11,255,104,54,13,255,119,58,14,255,85,43,12,255,21, +-15,6,255,7,6,4,57,0,24,9,7,4,85,92,47,11,255,125,66,14, +-255,123,60,14,255,18,12,5,170,0,24,5,5,4,28,19,13,6,255,84, +-42,11,255,115,62,14,255,110,59,13,255,93,50,12,255,84,44,11,255,106, +-54,15,255,176,84,23,255,199,100,28,255,188,101,31,255,90,54,25,255,13, +-10,8,142,0,24,8,6,3,164,72,37,11,255,131,66,14,255,110,54,13, +-255,12,9,5,224,3,3,2,17,0,24,7,6,6,85,30,20,13,255,190, +-96,27,255,199,98,24,255,121,69,22,255,13,10,6,190,4,3,3,28,5, +-4,2,105,27,17,6,255,114,56,13,255,125,64,14,255,45,26,10,255,8, +-7,5,153,0,12,10,7,5,85,96,48,13,255,125,64,14,255,123,60,14, +-255,16,11,5,195,0,12,8,6,3,110,92,47,11,255,131,66,14,255,123, +-65,14,255,18,13,5,170,0,24,9,7,4,85,92,47,11,255,125,66,14, +-255,123,60,14,255,18,12,5,170,0,24,8,7,3,99,93,50,12,255,125, +-66,14,255,115,59,14,255,104,54,13,255,88,45,11,255,88,44,11,255,92, +-43,11,255,92,43,11,255,92,43,11,255,93,50,12,255,93,50,12,255,20, +-13,5,85,0,8,8,6,3,65,88,45,11,255,125,64,14,255,123,60,14, +-255,115,62,14,255,93,46,12,255,16,11,5,127,0,28,5,4,4,28,12, +-10,5,246,104,54,13,255,115,59,14,255,39,23,8,255,8,6,3,82,0, +-12,58,31,9,255,114,58,13,255,119,63,14,255,123,60,14,255,123,65,14, +-255,18,12,5,170,0,144,14,10,5,227,59,31,10,255,115,62,14,255,110, +-59,13,255,88,44,11,255,80,42,11,255,88,44,11,255,104,54,13,255,115, +-59,14,255,123,60,14,255,123,60,14,255,16,11,5,150,0,8,8,6,3, +-65,88,44,11,255,125,64,14,255,123,60,14,255,114,58,13,255,93,50,12, +-255,88,44,11,255,92,47,11,255,104,54,13,255,119,58,14,255,85,43,12, +-255,21,15,6,255,7,6,4,51,0,12,12,9,5,224,63,32,10,255,115, +-62,14,255,114,56,13,255,93,50,12,255,88,44,11,255,88,45,11,255,110, +-59,13,255,119,61,14,255,85,43,12,255,25,16,6,255,7,6,4,57,0, +-12,12,10,5,221,59,31,10,255,115,62,14,255,114,56,13,255,93,50,12, +-255,88,44,11,255,92,47,11,255,104,54,13,255,115,59,14,255,123,60,14, +-255,121,62,14,255,16,11,5,167,0,12,12,10,5,218,59,31,10,255,115, +-62,14,255,110,59,13,255,88,44,11,255,80,42,11,255,88,44,11,255,88, +-45,11,255,88,44,11,255,16,11,5,105,0,24,9,7,4,85,92,47,11, +-255,125,66,14,255,123,60,14,255,18,12,5,170,0,48,7,5,4,198,93, +-50,12,255,125,66,14,255,123,60,14,255,12,10,5,170,0,8,8,6,3, +-65,88,45,11,255,125,66,14,255,123,65,14,255,18,12,5,170,0,12,9, +-7,4,85,92,47,11,255,125,66,14,255,123,65,14,255,14,10,5,150,0, +-8,8,6,3,65,88,45,11,255,125,66,14,255,123,60,14,255,18,13,5, +-170,0,20,3,3,2,11,9,7,4,227,100,50,13,255,123,60,14,255,123, +-60,14,255,12,10,5,170,0,8,8,6,3,62,88,45,11,255,125,66,14, +-255,123,60,14,255,14,10,5,198,0,8,8,6,3,170,35,22,8,255,115, +-59,14,255,112,55,13,255,33,21,8,255,8,6,3,37,0,8,8,6,3, +-74,88,45,11,255,125,66,14,255,123,65,14,255,14,10,5,150,0,8,8, +-6,3,65,88,45,11,255,125,66,14,255,123,65,14,255,14,11,5,147,0, +-4,9,7,4,85,92,47,11,255,20,13,5,170,0,4,8,6,3,62,88, +-45,11,255,125,66,14,255,123,65,14,255,14,10,5,150,0,8,8,6,3, +-65,88,45,11,255,125,66,14,255,123,60,14,255,18,12,5,170,0,12,9, +-7,4,85,92,47,11,255,125,66,14,255,123,60,14,255,14,10,5,159,0, +-12,12,10,5,210,59,31,10,255,115,59,14,255,118,60,13,255,104,54,13, +-255,102,51,13,255,112,53,13,255,122,63,15,255,123,58,14,255,85,43,12, +-255,21,15,6,255,7,5,4,45,0,8,8,6,3,85,113,55,16,255,196, +-92,23,255,195,96,24,255,25,17,10,255,4,3,3,79,0,64,3,2,2, +-28,10,8,5,227,138,71,21,255,177,87,20,255,174,86,21,255,24,16,9, +-170,0,8,13,10,8,85,142,73,23,255,195,96,24,255,194,91,23,255,24, +-17,11,227,0,44,12,9,5,150,35,22,8,255,80,42,11,255,84,44,11, +-255,88,44,11,255,80,42,11,255,88,44,11,255,97,50,12,255,118,60,13, +-255,85,43,12,255,21,15,6,255,8,6,3,57,0,16,9,7,4,85,92, +-47,11,255,125,66,14,255,123,60,14,255,18,12,5,170,0,16,6,5,5, +-28,17,13,8,227,68,34,11,255,115,59,14,255,110,59,13,255,93,50,12, +-255,88,44,11,255,92,47,11,255,104,54,13,255,115,59,14,255,123,60,14, +-255,123,65,14,255,18,12,5,170,0,24,12,9,7,170,131,69,24,255,191, +-90,22,255,136,71,19,255,15,11,6,227,4,3,3,17,0,24,7,6,4, +-31,16,11,5,227,104,52,13,255,131,66,14,255,98,49,13,255,10,8,5, +-193,3,2,2,68,8,7,5,170,121,66,26,255,195,96,24,255,156,74,19, +-255,34,21,9,255,9,7,4,85,0,12,8,6,3,51,69,35,10,255,121, +-62,14,255,123,60,14,255,16,11,5,227,4,3,3,28,0,8,8,6,3, +-170,92,47,11,255,125,64,14,255,108,55,13,255,14,10,5,164,0,40,7, +-5,4,198,96,48,13,255,134,65,15,255,133,66,16,255,15,11,6,170,0, +-8,7,5,4,85,78,39,11,255,130,64,15,255,130,64,15,255,134,65,15, +-255,136,67,17,255,124,62,17,255,114,56,17,255,113,55,16,255,118,60,17, +-255,107,55,20,255,48,29,15,255,12,10,7,85,0,20,9,8,6,170,45, +-27,12,255,139,70,20,255,131,66,18,255,107,53,14,255,19,13,6,99,0, +-8,8,6,5,85,92,46,13,255,131,61,14,255,125,64,14,255,14,10,5, +-170,0,12,58,31,9,255,110,59,13,255,115,59,14,255,56,29,9,255,10, +-8,5,227,5,4,4,23,0,108,10,8,7,28,28,18,11,212,49,28,16, +-255,35,21,12,241,13,10,6,85,0,68,14,10,5,142,20,14,5,170,16, +-12,5,164,8,6,3,28,0,8,24,16,9,142,21,15,8,252,23,15,8, +-184,11,8,6,34,0,36,14,10,5,142,20,14,5,170,16,11,5,170,10, +-8,5,28,0,24,7,6,4,25,20,13,7,147,22,15,7,170,10,8,5, +-142,5,4,4,3,0,24,14,10,5,142,20,13,5,170,16,11,5,170,9, +-7,4,28,0,16,7,5,4,28,14,10,5,156,14,10,5,229,24,15,9, +-255,32,20,11,255,28,18,11,244,12,9,7,108,0,8,10,8,5,142,19, +-13,8,235,24,15,7,227,10,8,5,59,0,48,10,8,5,93,23,15,8, +-170,28,18,9,173,15,11,6,28,0,12,18,12,5,142,21,14,6,170,9, +-7,4,133,0,148,8,6,5,113,89,44,14,255,100,51,21,255,13,10,8, +-227,6,5,5,28,0,60,6,5,5,8,17,12,6,142,26,16,7,170,18, +-12,5,170,9,7,4,28,0,8,6,5,3,85,54,28,11,255,136,66,19, +-255,121,59,18,255,15,10,6,241,0,40,8,6,3,57,12,9,5,170,18, +-13,5,178,14,10,5,241,14,10,5,255,14,10,5,252,16,11,5,195,16, +-11,5,170,8,6,3,113,0,24,8,6,5,28,24,16,9,204,24,17,9, +-255,17,12,6,210,14,10,5,170,16,11,5,170,17,11,6,246,27,17,10, +-246,14,10,7,85,0,16,8,6,5,28,21,14,10,195,22,15,11,255,18, +-13,9,255,18,13,9,255,22,15,9,255,19,13,8,255,17,12,6,255,17, +-11,6,255,15,11,6,255,17,12,6,255,19,13,6,204,12,9,5,28,0, +-12,5,4,2,25,8,6,3,122,14,10,5,170,18,13,5,176,14,10,5, +-235,15,11,6,255,15,11,6,255,19,12,6,204,19,13,6,170,10,8,5, +-170,8,6,5,57,0,48,14,10,5,142,21,13,6,170,16,11,5,170,9, +-7,4,28,0,12,5,4,2,25,8,6,3,125,14,10,5,170,14,10,5, +-210,23,15,8,255,30,20,11,255,30,20,11,255,23,17,10,255,20,14,9, +-244,16,12,9,170,9,8,6,79,0,16,9,7,6,65,15,11,8,170,17, +-12,8,232,21,14,8,255,26,16,9,255,23,15,8,255,21,14,8,255,15, +-11,6,255,22,15,7,178,11,9,6,170,10,8,7,57,0,32,12,10,5, +-142,20,13,5,170,16,11,5,170,9,7,4,28,0,28,5,5,4,28,8, +-6,3,133,15,11,6,193,20,15,9,255,28,18,11,255,30,20,11,255,26, +-16,9,255,14,10,5,238,16,11,5,170,9,7,4,153,7,5,4,57,0, +-16,5,4,2,28,8,6,3,142,18,12,7,207,22,15,9,255,28,18,11, +-255,27,18,10,255,18,13,7,255,15,11,6,227,21,13,6,170,10,7,5, +-164,7,6,4,57,0,16,14,10,5,142,20,13,5,170,16,12,5,170,9, +-7,4,28,0,8,10,8,7,119,149,64,26,255,131,63,26,255,14,11,7, +-227,6,5,5,28,0,32,7,5,4,28,14,10,5,156,20,13,5,170,12, +-9,5,142,6,5,3,6,0,64,12,10,7,142,24,15,7,170,21,13,6, +-170,8,6,3,76,0,48,9,7,6,85,83,43,16,255,176,88,23,255,130, +-62,21,255,16,11,7,170,0,28,9,8,6,28,13,10,8,164,23,16,10, +-190,16,11,7,252,15,11,6,255,14,10,5,255,14,10,5,255,14,10,5, +-255,16,11,5,232,14,10,5,170,8,6,3,85,0,16,14,10,5,142,21, +-13,6,170,16,11,5,170,9,7,4,28,0,16,14,10,5,142,20,13,5, +-170,16,11,5,170,9,7,4,28,0,12,14,10,5,136,16,12,5,170,16, +-11,5,170,18,12,5,170,16,11,5,210,14,10,5,255,14,10,5,249,16, +-12,5,193,16,11,5,170,9,7,4,153,7,5,4,57,0,16,5,5,4, +-28,8,6,3,125,14,10,5,170,18,12,5,176,14,10,5,238,14,10,5, +-246,16,12,5,195,18,13,5,170,16,11,5,170,9,7,4,150,7,5,4, +-54,0,16,14,10,5,142,16,12,5,170,16,11,5,170,18,12,5,170,16, +-11,5,210,14,10,5,255,14,10,5,249,16,12,5,193,16,11,5,170,9, +-7,4,153,7,6,4,57,0,16,14,10,5,142,16,12,5,170,16,11,5, +-170,18,12,5,170,16,11,5,210,14,10,5,252,12,9,5,255,16,11,5, +-255,20,13,5,201,11,9,4,28,0,12,14,10,5,139,20,13,5,170,16, +-11,5,170,9,7,4,28,0,36,5,5,4,28,8,6,3,125,14,10,5, +-170,18,13,5,176,14,10,5,238,14,10,5,255,16,11,5,235,18,13,5, +-173,16,11,5,170,16,12,5,170,16,11,5,164,9,7,4,28,0,12,12, +-9,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,16,14,10,5, +-142,20,13,5,170,16,11,5,170,9,7,4,28,0,12,12,9,5,142,21, +-13,6,170,16,11,5,170,9,7,4,28,0,12,6,5,3,28,8,7,5, +-139,19,13,8,193,21,15,10,255,31,21,12,255,32,21,13,255,31,20,12, +-255,23,17,10,255,18,12,7,212,10,8,5,159,7,6,4,57,0,16,14, +-10,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,16,14,10,5, +-142,21,13,6,170,16,12,5,170,9,7,4,28,0,12,14,10,5,136,16, +-12,5,170,16,11,5,170,18,12,5,176,17,12,6,252,21,14,8,255,17, +-12,6,255,16,11,5,255,20,13,5,204,11,9,4,28,0,12,14,10,5, +-142,21,14,6,170,18,12,5,170,9,8,4,28,0,24,14,10,5,142,20, +-13,5,170,16,11,5,170,9,7,4,28,0,12,12,9,5,142,21,13,6, +-170,16,12,5,170,10,8,5,28,0,16,12,9,5,142,20,13,5,170,16, +-11,5,170,9,7,4,28,0,12,5,5,4,28,8,6,3,125,14,10,5, +-170,18,12,5,170,20,14,5,173,16,12,5,193,20,13,5,178,20,13,5, +-170,16,11,5,170,9,7,4,153,7,6,4,57,0,16,14,10,5,142,21, +-13,6,170,16,11,5,170,9,7,4,28,0,44,5,5,4,28,8,6,3, +-125,14,10,5,170,18,13,5,170,20,14,5,170,18,12,5,170,13,10,6, +-227,72,38,19,255,185,86,32,255,144,64,29,255,20,15,11,232,8,7,7, +-28,0,12,14,10,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0, +-16,14,10,5,142,20,13,5,170,16,11,5,170,9,7,4,28,0,12,5, +-4,2,25,8,6,3,122,14,10,5,170,18,13,5,176,14,10,5,238,14, +-10,5,255,14,10,5,249,16,12,5,193,16,11,5,170,9,7,4,153,7, +-5,4,57,0,32,14,10,5,142,21,13,6,170,16,11,5,170,9,7,4, +-28,0,28,8,6,3,57,9,7,4,164,14,10,5,170,18,13,5,173,14, +-10,5,229,14,10,5,255,17,12,6,255,22,15,9,255,20,14,9,252,21, +-15,10,176,11,9,6,139,0,32,11,8,4,122,18,12,5,170,14,10,5, +-150,7,5,4,28,0,32,8,7,7,57,24,16,11,173,26,18,9,190,13, +-10,6,142,5,4,4,11,0,8,8,7,3,68,14,10,5,170,16,11,5, +-170,9,7,4,74,0,20,14,10,5,142,20,14,5,170,16,11,5,170,9, +-7,4,28,0,16,14,10,5,142,20,14,5,170,16,11,5,170,9,8,4, +-28,0,28,14,10,5,142,20,13,5,170,16,11,5,170,9,7,4,28,0, +-28,14,10,5,142,18,13,5,170,16,12,5,170,18,13,5,173,14,10,5, +-227,14,10,5,255,14,10,5,252,12,9,5,255,12,9,5,255,16,11,5, +-255,20,13,5,201,11,9,4,28,0,12,12,10,5,136,16,12,5,170,16, +-11,5,170,16,11,5,193,21,15,6,184,14,10,5,31,0,32,8,6,3, +-139,54,30,9,255,107,50,12,255,78,39,11,255,9,7,4,161,0,12,20, +-13,5,142,18,12,5,210,16,11,5,170,16,11,5,170,16,11,5,170,9, +-7,4,28,0,64,13,10,8,57,9,7,6,159,8,6,5,159,10,8,7, +-130,10,8,7,119,9,7,6,133,9,7,6,167,10,8,7,170,11,9,8, +-113,0,44,5,4,2,28,8,6,3,125,14,10,5,170,18,13,5,176,14, +-10,5,238,14,10,5,255,16,11,5,235,18,13,5,173,16,11,5,170,16, +-12,5,170,16,11,5,164,9,7,4,28,0,12,14,10,5,136,16,12,5, +-170,16,11,5,170,18,12,5,170,16,11,5,210,14,10,5,255,14,10,5, +-249,16,12,5,193,16,11,5,170,9,7,4,153,7,5,4,57,0,16,5, +-5,4,28,8,6,3,125,14,10,5,170,18,13,5,176,14,10,5,238,14, +-10,5,255,14,10,5,249,16,11,5,193,16,11,5,170,9,7,4,150,7, +-5,4,57,0,16,5,5,4,28,8,6,3,125,14,10,5,170,18,13,5, +-176,14,10,5,238,14,10,5,255,14,10,5,235,18,13,5,173,16,11,5, +-170,16,12,5,170,16,11,5,170,9,7,4,28,0,12,5,5,4,28,8, +-6,3,125,14,10,5,170,18,13,5,176,14,10,5,235,14,10,5,255,14, +-10,5,255,16,11,5,255,20,13,5,207,12,9,5,34,0,28,14,10,5, +-142,20,13,5,170,16,11,5,170,9,7,4,28,0,28,6,5,3,85,7, +-5,4,85,6,5,3,85,5,4,4,85,5,4,4,105,9,8,4,241,72, +-37,11,255,110,54,13,255,67,34,10,255,8,6,3,144,0,12,14,10,5, +-142,21,14,6,170,16,12,5,170,9,8,4,28,0,16,14,10,5,142,21, +-13,6,170,16,11,5,170,9,7,4,28,0,12,12,9,5,142,21,13,6, +-170,16,11,5,170,9,7,4,28,0,12,7,5,2,37,8,6,3,142,8, +-6,3,227,25,15,6,255,75,36,10,255,99,51,12,255,66,33,9,255,8, +-6,3,130,0,12,14,10,5,139,21,13,6,170,16,11,5,170,9,7,4, +-28,0,12,8,6,3,79,14,10,5,170,18,13,5,170,12,9,5,142,0, +-16,14,10,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,12,12, +-9,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,8,20,13,5, +-85,11,8,4,28,0,8,12,9,5,142,21,13,6,170,16,11,5,170,9, +-7,4,28,0,12,12,9,5,142,21,13,6,170,16,11,5,170,9,7,4, +-28,0,16,14,10,5,142,20,13,5,170,16,11,5,170,9,7,4,28,0, +-12,5,5,4,28,8,6,3,125,14,10,5,170,18,12,5,170,20,14,5, +-173,16,12,5,193,20,13,5,178,20,13,5,170,16,11,5,170,9,7,4, +-161,7,6,4,57,0,12,8,6,3,85,84,40,13,255,164,73,23,255,184, +-79,27,255,15,11,8,246,0,72,11,10,10,170,176,83,37,255,196,87,33, +-255,192,88,31,255,22,15,11,193,0,12,21,15,10,159,26,17,11,255,24, +-17,11,221,10,8,7,85,0,44,8,7,3,59,12,9,5,170,16,11,5, +-210,14,10,5,255,14,10,5,255,14,10,5,255,14,10,5,246,16,12,5, +-193,16,11,5,170,9,7,4,153,6,5,3,57,0,24,14,10,5,142,20, +-13,5,170,16,11,5,170,9,7,4,28,0,20,6,5,3,28,8,6,3, +-127,14,10,5,170,18,13,5,176,14,10,5,238,14,10,5,255,14,10,5, +-235,18,13,5,173,16,11,5,170,16,12,5,170,16,11,5,170,9,7,4, +-28,0,28,14,11,7,142,29,19,8,170,17,11,6,159,8,6,3,28,0, +-32,7,5,4,28,14,10,5,150,20,13,5,170,12,9,5,142,5,4,2, +-14,0,8,15,11,8,142,26,18,9,178,19,13,6,170,8,6,3,68,0, +-20,18,12,5,142,16,11,5,238,16,11,5,170,9,7,4,28,0,16,12, +-9,5,142,16,11,5,215,18,13,5,187,11,9,4,28,0,16,4,4,3, +-6,5,4,2,82,5,4,2,85,5,4,2,85,5,4,2,85,5,4,2, +-99,9,7,4,241,72,37,11,255,112,53,13,255,77,39,12,255,10,8,5, +-170,0,12,19,13,8,184,20,14,9,255,16,11,7,255,14,11,7,255,17, +-12,8,255,22,15,9,255,27,17,10,255,30,19,11,255,28,18,11,255,21, +-15,10,255,15,12,8,198,9,7,6,28,0,24,8,6,5,91,15,11,6, +-170,14,11,5,238,19,13,6,198,12,9,5,28,0,8,6,5,3,85,54, +-29,9,255,100,48,13,255,109,52,14,255,15,11,6,170,0,12,19,13,6, +-144,14,10,5,255,16,11,5,178,8,6,3,119,0,255,0,255,0,174,12, +-9,7,88,99,44,20,255,26,16,11,232,5,4,4,28,0,92,6,5,3, +-57,60,28,11,255,158,67,23,255,88,44,23,255,11,9,6,142,0,255,0, +-255,0,150,12,9,7,110,126,51,25,255,25,17,12,232,5,4,4,28,0, +-184,6,5,5,28,19,14,10,227,52,29,17,255,30,20,13,255,9,8,6, +-82,0,255,0,255,0,255,0,255,0,8,12,10,9,170,172,81,49,255,213, +-125,94,255,185,88,58,255,23,16,14,159,0,255,0,255,0,106,5,4,2, +-28,16,11,5,244,68,34,9,255,62,33,9,255,9,8,4,139,0,96,10, +-8,7,48,71,33,18,255,108,47,23,255,107,48,22,255,113,51,24,255,109, +-50,24,255,104,45,21,255,104,45,21,255,113,49,24,255,115,50,24,255,18, +-13,9,136,0,255,0,129,9,7,6,34,18,13,9,244,66,31,15,255,84, +-37,17,255,83,36,16,255,75,34,14,255,73,35,14,255,91,41,16,255,110, +-47,19,255,79,40,16,255,24,16,9,255,8,6,5,57,0,100,22,14,5, +-244,40,23,7,255,42,23,7,255,54,28,9,255,60,31,9,255,36,22,7, +-255,12,9,5,244,6,5,3,28,0,255,0,29,9,7,6,85,72,34,13, +-255,126,56,21,255,148,63,25,255,25,17,14,190,0,72,15,12,12,133,178, +-86,57,255,200,89,55,255,194,82,47,255,30,20,17,187,0,255,0,169,9, +-7,4,99,17,12,6,255,42,22,9,255,49,25,9,255,54,26,11,255,52, +-26,11,255,59,28,12,255,82,37,15,255,111,49,18,255,84,39,17,255,25, +-17,10,255,8,7,5,57,0,112,6,5,3,57,38,22,7,255,85,39,12, +-255,124,52,21,255,20,13,9,170,0,255,0,255,0,202,8,6,5,28,26, +-16,11,170,11,8,6,85,0,100,12,8,5,119,20,14,9,170,12,9,7, +-142,0,255,0,255,0,154,9,7,6,28,27,17,12,170,11,9,8,85,0, +-192,7,6,6,28,8,7,5,85,8,6,5,57,0,255,0,255,0,255,0, +-255,0,16,25,17,16,161,41,27,26,255,40,26,23,235,14,12,11,82,0, +-255,0,255,0,110,8,6,3,37,9,7,4,142,9,7,4,136,6,5,3, +-6,0,100,23,15,10,153,19,13,10,255,16,11,9,255,16,11,9,255,16, +-11,9,255,16,11,9,255,16,11,9,255,18,13,9,255,24,16,11,204,16, +-11,9,31,0,255,0,133,10,8,7,142,18,12,9,207,18,13,9,255,16, +-11,9,255,15,11,8,255,15,11,8,252,18,13,9,195,18,12,9,170,11, +-8,6,167,8,7,5,57,0,104,9,8,4,142,14,10,5,170,13,10,6, +-170,13,9,6,170,11,8,6,170,7,6,4,130,6,5,3,28,0,255,0, +-37,14,10,7,142,21,14,10,170,19,13,10,170,14,11,9,31,0,72,8, +-7,8,14,25,17,16,142,27,18,16,193,26,18,15,170,15,11,10,34,0, +-255,0,169,9,7,4,28,11,8,6,170,14,10,7,232,15,10,8,255,15, +-10,8,255,15,10,8,255,15,10,8,252,18,12,9,195,18,12,9,170,11, +-8,6,167,9,7,6,57,0,120,9,7,4,91,16,11,7,170,20,13,9, +-170,13,10,8,28,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, +-255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, +-255,0,255,0,255}}; +- /* Created by MiniCompress.. an iOS RLE compressor. +- * Compress Rate : 46.36 % +- */ +diff -Naur /home/d4rk/goom2k4-0/src/gfontrle.h /src/gfontrle.h +--- /home/d4rk/goom2k4-0/src/gfontrle.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/gfontrle.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,7 +0,0 @@ +-extern const struct { +- unsigned int width; +- unsigned int height; +- unsigned int bytes_per_pixel; +- unsigned int rle_size; +- unsigned char rle_pixel [49725]; +-} the_font ; +diff -Naur /home/d4rk/goom2k4-0/src/goom_config.h /src/goom_config.h +--- /home/d4rk/goom2k4-0/src/goom_config.h 2008-08-03 19:23:12.000000000 -0600 ++++ /src/goom_config.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,28 +0,0 @@ +-#if WORDS_BIGENDIAN +-#define COLOR_ARGB +-#else +-#define COLOR_BGRA +-#endif +- +-#if 1 +-/* ndef COLOR_BGRA */ +-/** position des composantes **/ +- #define BLEU 2 +- #define VERT 1 +- #define ROUGE 0 +- #define ALPHA 3 +-#else +- #define ROUGE 1 +- #define BLEU 3 +- #define VERT 2 +- #define ALPHA 0 +-#endif +- +-#ifndef guint32 +-#define guint8 unsigned char +-#define guin16 unsigned short +-#define guint32 unsigned int +-#define gint8 signed char +-#define gint16 signed short int +-#define gint32 signed int +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/goom_config_param.h /src/goom_config_param.h +--- /home/d4rk/goom2k4-0/src/goom_config_param.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goom_config_param.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,115 +0,0 @@ +-#ifndef _CONFIG_PARAM_H +-#define _CONFIG_PARAM_H +- +-#include <stdlib.h> +- +-/** +- * File created on 2003-05-24 by Jeko. +- * (c)2003, JC Hoelt for iOS-software. +- * +- * LGPL Licence. +- */ +- +-typedef enum { +- PARAM_INTVAL, +- PARAM_FLOATVAL, +- PARAM_BOOLVAL, +- PARAM_STRVAL, +- PARAM_LISTVAL, +-} ParamType; +- +-struct IntVal { +- int value; +- int min; +- int max; +- int step; +-}; +-struct FloatVal { +- float value; +- float min; +- float max; +- float step; +-}; +-struct StrVal { +- char *value; +-}; +-struct ListVal { +- char *value; +- int nbChoices; +- char **choices; +-}; +-struct BoolVal { +- int value; +-}; +- +- +-typedef struct _PARAM { +- char *name; +- char *desc; +- char rw; +- ParamType type; +- union { +- struct IntVal ival; +- struct FloatVal fval; +- struct StrVal sval; +- struct ListVal slist; +- struct BoolVal bval; +- } param; +- +- /* used by the core to inform the GUI of a change */ +- void (*change_listener)(struct _PARAM *_this); +- +- /* used by the GUI to inform the core of a change */ +- void (*changed)(struct _PARAM *_this); +- +- void *user_data; /* can be used by the GUI */ +-} PluginParam; +- +-#define IVAL(p) ((p).param.ival.value) +-#define SVAL(p) ((p).param.sval.value) +-#define FVAL(p) ((p).param.fval.value) +-#define BVAL(p) ((p).param.bval.value) +-#define LVAL(p) ((p).param.slist.value) +- +-#define FMIN(p) ((p).param.fval.min) +-#define FMAX(p) ((p).param.fval.max) +-#define FSTEP(p) ((p).param.fval.step) +- +-#define IMIN(p) ((p).param.ival.min) +-#define IMAX(p) ((p).param.ival.max) +-#define ISTEP(p) ((p).param.ival.step) +- +-PluginParam goom_secure_param(void); +- +-PluginParam goom_secure_f_param(char *name); +-PluginParam goom_secure_i_param(char *name); +-PluginParam goom_secure_b_param(char *name, int value); +-PluginParam goom_secure_s_param(char *name); +- +-PluginParam goom_secure_f_feedback(char *name); +-PluginParam goom_secure_i_feedback(char *name); +- +-void goom_set_str_param_value(PluginParam *p, const char *str); +-void goom_set_list_param_value(PluginParam *p, const char *str); +- +-typedef struct _PARAMETERS { +- char *name; +- char *desc; +- int nbParams; +- PluginParam **params; +-} PluginParameters; +- +-PluginParameters goom_plugin_parameters(const char *name, int nb); +- +-#define secure_param goom_secure_param +-#define secure_f_param goom_secure_f_param +-#define secure_i_param goom_secure_i_param +-#define secure_b_param goom_secure_b_param +-#define secure_s_param goom_secure_s_param +-#define secure_f_feedback goom_secure_f_feedback +-#define secure_i_feedback goom_secure_i_feedback +-#define set_list_param_value goom_set_list_param_value +-#define set_str_param_value goom_set_str_param_value +-#define plugin_parameters goom_plugin_parameters +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/goom_core.c /src/goom_core.c +--- /home/d4rk/goom2k4-0/src/goom_core.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goom_core.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,886 +0,0 @@ +-/** +-* file: goom_core.c +- * author: Jean-Christophe Hoelt (which is not so proud of it) +- * +- * Contains the core of goom's work. +- * +- * (c)2000-2003, by iOS-software. +- */ +- +-#include <math.h> +-#include <stdio.h> +-#include <stdlib.h> +-#include <string.h> +-#include <inttypes.h> +- +-#include "goom.h" +-#include "goom_tools.h" +-#include "goom_filters.h" +-#include "lines.h" +-#include "ifs.h" +-#include "tentacle3d.h" +-#include "gfontlib.h" +- +-#include "sound_tester.h" +-#include "goom_plugin_info.h" +-#include "goom_fx.h" +-#include "goomsl.h" +- +-/* #define VERBOSE */ +- +-#define STOP_SPEED 128 +-/* TODO: put that as variable in PluginInfo */ +-#define TIME_BTW_CHG 300 +- +-static void choose_a_goom_line (PluginInfo *goomInfo, float *param1, float *param2, int *couleur, +- int *mode, float *amplitude, int far); +- +-static void update_message (PluginInfo *goomInfo, char *message); +- +-static void init_buffers(PluginInfo *goomInfo, int buffsize) +-{ +- goomInfo->pixel = (guint32 *) malloc (buffsize * sizeof (guint32) + 128); +- bzero (goomInfo->pixel, buffsize * sizeof (guint32) + 128); +- goomInfo->back = (guint32 *) malloc (buffsize * sizeof (guint32) + 128); +- bzero (goomInfo->back, buffsize * sizeof (guint32) + 128); +- goomInfo->conv = (Pixel *) malloc (buffsize * sizeof (guint32) + 128); +- bzero (goomInfo->conv, buffsize * sizeof (guint32) + 128); +- +- goomInfo->outputBuf = goomInfo->conv; +- +- goomInfo->p1 = (Pixel *) ((1 + ((uintptr_t) (goomInfo->pixel)) / 128) * 128); +- goomInfo->p2 = (Pixel *) ((1 + ((uintptr_t) (goomInfo->back)) / 128) * 128); +-} +- +-/************************** +-* INIT * +-**************************/ +-PluginInfo *goom_init (guint32 resx, guint32 resy) +-{ +- PluginInfo *goomInfo = (PluginInfo*)malloc(sizeof(PluginInfo)); +- +-#ifdef VERBOSE +- printf ("GOOM: init (%d, %d);\n", resx, resy); +-#endif +- +- plugin_info_init(goomInfo,4); +- +- goomInfo->star_fx = flying_star_create(); +- goomInfo->star_fx.init(&goomInfo->star_fx, goomInfo); +- +- goomInfo->zoomFilter_fx = zoomFilterVisualFXWrapper_create (); +- goomInfo->zoomFilter_fx.init(&goomInfo->zoomFilter_fx, goomInfo); +- +- goomInfo->tentacles_fx = tentacle_fx_create(); +- goomInfo->tentacles_fx.init(&goomInfo->tentacles_fx, goomInfo); +- +- goomInfo->convolve_fx = convolve_create(); +- goomInfo->convolve_fx.init(&goomInfo->convolve_fx, goomInfo); +- +- plugin_info_add_visual (goomInfo, 0, &goomInfo->zoomFilter_fx); +- plugin_info_add_visual (goomInfo, 1, &goomInfo->tentacles_fx); +- plugin_info_add_visual (goomInfo, 2, &goomInfo->star_fx); +- plugin_info_add_visual (goomInfo, 3, &goomInfo->convolve_fx); +- +- goomInfo->screen.width = resx; +- goomInfo->screen.height = resy; +- goomInfo->screen.size = resx * resy; +- +- init_buffers(goomInfo, goomInfo->screen.size); +- goomInfo->gRandom = goom_random_init((uintptr_t)goomInfo->pixel); +- +- goomInfo->cycle = 0; +- +- goomInfo->ifs_fx = ifs_visualfx_create(); +- goomInfo->ifs_fx.init(&goomInfo->ifs_fx, goomInfo); +- +- goomInfo->gmline1 = goom_lines_init (goomInfo, resx, goomInfo->screen.height, +- GML_HLINE, goomInfo->screen.height, GML_BLACK, +- GML_CIRCLE, 0.4f * (float) goomInfo->screen.height, GML_VERT); +- goomInfo->gmline2 = goom_lines_init (goomInfo, resx, goomInfo->screen.height, +- GML_HLINE, 0, GML_BLACK, +- GML_CIRCLE, 0.2f * (float) goomInfo->screen.height, GML_RED); +- +- gfont_load (); +- +- /* goom_set_main_script(goomInfo, goomInfo->main_script_str); */ +- +- return goomInfo; +-} +- +- +- +-void goom_set_resolution (PluginInfo *goomInfo, guint32 resx, guint32 resy) +-{ +- free (goomInfo->pixel); +- free (goomInfo->back); +- free (goomInfo->conv); +- +- goomInfo->screen.width = resx; +- goomInfo->screen.height = resy; +- goomInfo->screen.size = resx * resy; +- +- init_buffers(goomInfo, goomInfo->screen.size); +- +- /* init_ifs (goomInfo, resx, goomInfo->screen.height); */ +- goomInfo->ifs_fx.free(&goomInfo->ifs_fx); +- goomInfo->ifs_fx.init(&goomInfo->ifs_fx, goomInfo); +- +- goom_lines_set_res (goomInfo->gmline1, resx, goomInfo->screen.height); +- goom_lines_set_res (goomInfo->gmline2, resx, goomInfo->screen.height); +-} +- +-int goom_set_screenbuffer(PluginInfo *goomInfo, void *buffer) +-{ +- goomInfo->outputBuf = (Pixel*)buffer; +- return 1; +-} +- +-/******************************************** +-* UPDATE * +-******************************************** +- +-* WARNING: this is a 600 lines function ! (21-11-2003) +-*/ +-guint32 *goom_update (PluginInfo *goomInfo, gint16 data[2][512], +- int forceMode, float fps, char *songTitle, char *message) +-{ +- Pixel *return_val; +- guint32 pointWidth; +- guint32 pointHeight; +- int i; +- float largfactor; /* elargissement de l'intervalle d'évolution des points */ +- Pixel *tmp; +- +- ZoomFilterData *pzfd; +- +- /* test if the config has changed, update it if so */ +- pointWidth = (goomInfo->screen.width * 2) / 5; +- pointHeight = ((goomInfo->screen.height) * 2) / 5; +- +- /* ! etude du signal ... */ +- evaluate_sound (data, &(goomInfo->sound)); +- +- /* goom_execute_main_script(goomInfo); */ +- +- /* ! calcul du deplacement des petits points ... */ +- largfactor = goomInfo->sound.speedvar / 150.0f + goomInfo->sound.volume / 1.5f; +- +- if (largfactor > 1.5f) +- largfactor = 1.5f; +- +- goomInfo->update.decay_ifs--; +- if (goomInfo->update.decay_ifs > 0) +- goomInfo->update.ifs_incr += 2; +- if (goomInfo->update.decay_ifs == 0) +- goomInfo->update.ifs_incr = 0; +- +- if (goomInfo->update.recay_ifs) { +- goomInfo->update.ifs_incr -= 2; +- goomInfo->update.recay_ifs--; +- if ((goomInfo->update.recay_ifs == 0)&&(goomInfo->update.ifs_incr<=0)) +- goomInfo->update.ifs_incr = 1; +- } +- +- if (goomInfo->update.ifs_incr > 0) +- goomInfo->ifs_fx.apply(&goomInfo->ifs_fx, goomInfo->p2, goomInfo->p1, goomInfo); +- +- if (goomInfo->curGState->drawPoints) { +- for (i = 1; i * 15 <= goomInfo->sound.speedvar*80.0f + 15; i++) { +- goomInfo->update.loopvar += goomInfo->sound.speedvar*50 + 1; +- +- pointFilter (goomInfo, goomInfo->p1, +- YELLOW, +- ((pointWidth - 6.0f) * largfactor + 5.0f), +- ((pointHeight - 6.0f) * largfactor + 5.0f), +- i * 152.0f, 128.0f, goomInfo->update.loopvar + i * 2032); +- pointFilter (goomInfo, goomInfo->p1, ORANGE, +- ((pointWidth / 2) * largfactor) / i + 10.0f * i, +- ((pointHeight / 2) * largfactor) / i + 10.0f * i, +- 96.0f, i * 80.0f, goomInfo->update.loopvar / i); +- pointFilter (goomInfo, goomInfo->p1, VIOLET, +- ((pointHeight / 3 + 5.0f) * largfactor) / i + 10.0f * i, +- ((pointHeight / 3 + 5.0f) * largfactor) / i + 10.0f * i, +- i + 122.0f, 134.0f, goomInfo->update.loopvar / i); +- pointFilter (goomInfo, goomInfo->p1, BLACK, +- ((pointHeight / 3) * largfactor + 20.0f), +- ((pointHeight / 3) * largfactor + 20.0f), +- 58.0f, i * 66.0f, goomInfo->update.loopvar / i); +- pointFilter (goomInfo, goomInfo->p1, WHITE, +- (pointHeight * largfactor + 10.0f * i) / i, +- (pointHeight * largfactor + 10.0f * i) / i, +- 66.0f, 74.0f, goomInfo->update.loopvar + i * 500); +- } +- } +- +- /* par défaut pas de changement de zoom */ +- pzfd = NULL; +- +- /* +- * Test forceMode +- */ +-#ifdef VERBOSE +- if (forceMode != 0) { +- printf ("forcemode = %d\n", forceMode); +- } +-#endif +- +- +- /* 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 plugin juste apres un autre changement d'etat. oki */ +- if (--goomInfo->update.lockvar < 0) +- goomInfo->update.lockvar = 0; +- +- /* on verifie qu'il ne se pas un truc interressant avec le son. */ +- if ((goomInfo->sound.timeSinceLastGoom == 0) +- || (forceMode > 0) +- || (goomInfo->update.cyclesSinceLastChange > TIME_BTW_CHG)) { +- +- /* changement eventuel de mode */ +- if (goom_irand(goomInfo->gRandom,16) == 0) +- switch (goom_irand(goomInfo->gRandom,34)) { +- case 0: +- case 10: +- goomInfo->update.zoomFilterData.hypercosEffect = goom_irand(goomInfo->gRandom,2); +- case 13: +- case 20: +- case 21: +- goomInfo->update.zoomFilterData.mode = WAVE_MODE; +- goomInfo->update.zoomFilterData.reverse = 0; +- goomInfo->update.zoomFilterData.waveEffect = (goom_irand(goomInfo->gRandom,3) == 0); +- if (goom_irand(goomInfo->gRandom,2)) +- goomInfo->update.zoomFilterData.vitesse = (goomInfo->update.zoomFilterData.vitesse + 127) >> 1; +- break; +- case 1: +- case 11: +- goomInfo->update.zoomFilterData.mode = CRYSTAL_BALL_MODE; +- goomInfo->update.zoomFilterData.waveEffect = 0; +- goomInfo->update.zoomFilterData.hypercosEffect = 0; +- break; +- case 2: +- case 12: +- goomInfo->update.zoomFilterData.mode = AMULETTE_MODE; +- goomInfo->update.zoomFilterData.waveEffect = 0; +- goomInfo->update.zoomFilterData.hypercosEffect = 0; +- break; +- case 3: +- goomInfo->update.zoomFilterData.mode = WATER_MODE; +- goomInfo->update.zoomFilterData.waveEffect = 0; +- goomInfo->update.zoomFilterData.hypercosEffect = 0; +- break; +- case 4: +- case 14: +- goomInfo->update.zoomFilterData.mode = SCRUNCH_MODE; +- goomInfo->update.zoomFilterData.waveEffect = 0; +- goomInfo->update.zoomFilterData.hypercosEffect = 0; +- break; +- case 5: +- case 15: +- case 22: +- goomInfo->update.zoomFilterData.mode = HYPERCOS1_MODE; +- goomInfo->update.zoomFilterData.waveEffect = 0; +- goomInfo->update.zoomFilterData.hypercosEffect = (goom_irand(goomInfo->gRandom,3) == 0); +- break; +- case 6: +- case 16: +- goomInfo->update.zoomFilterData.mode = HYPERCOS2_MODE; +- goomInfo->update.zoomFilterData.waveEffect = 0; +- goomInfo->update.zoomFilterData.hypercosEffect = 0; +- break; +- case 7: +- case 17: +- goomInfo->update.zoomFilterData.mode = CRYSTAL_BALL_MODE; +- goomInfo->update.zoomFilterData.waveEffect = (goom_irand(goomInfo->gRandom,4) == 0); +- goomInfo->update.zoomFilterData.hypercosEffect = goom_irand(goomInfo->gRandom,2); +- break; +- case 8: +- case 18: +- case 19: +- goomInfo->update.zoomFilterData.mode = SCRUNCH_MODE; +- goomInfo->update.zoomFilterData.waveEffect = 1; +- goomInfo->update.zoomFilterData.hypercosEffect = 1; +- break; +- case 29: +- case 30: +- goomInfo->update.zoomFilterData.mode = YONLY_MODE; +- break; +- case 31: +- case 32: +- case 33: +- goomInfo->update.zoomFilterData.mode = SPEEDWAY_MODE; +- break; +- default: +- goomInfo->update.zoomFilterData.mode = NORMAL_MODE; +- goomInfo->update.zoomFilterData.waveEffect = 0; +- goomInfo->update.zoomFilterData.hypercosEffect = 0; +- } +- } +- +- /* tout ceci ne sera fait qu'en cas de non-blocage */ +- if (goomInfo->update.lockvar == 0) { +- /* reperage de goom (acceleration forte de l'acceleration du volume) */ +- /* -> coup de boost de la vitesse si besoin.. */ +- if (goomInfo->sound.timeSinceLastGoom == 0) { +- +- int i; +- goomInfo->update.goomvar++; +- +- /* SELECTION OF THE GOOM STATE */ +- if ((!goomInfo->update.stateSelectionBlocker)&&(goom_irand(goomInfo->gRandom,3))) { +- goomInfo->update.stateSelectionRnd = goom_irand(goomInfo->gRandom,goomInfo->statesRangeMax); +- goomInfo->update.stateSelectionBlocker = 3; +- } +- else if (goomInfo->update.stateSelectionBlocker) goomInfo->update.stateSelectionBlocker--; +- +- for (i=0;i<goomInfo->statesNumber;i++) +- if ((goomInfo->update.stateSelectionRnd >= goomInfo->states[i].rangemin) +- && (goomInfo->update.stateSelectionRnd <= goomInfo->states[i].rangemax)) +- goomInfo->curGState = &(goomInfo->states[i]); +- +- if ((goomInfo->curGState->drawIFS) && (goomInfo->update.ifs_incr<=0)) { +- goomInfo->update.recay_ifs = 5; +- goomInfo->update.ifs_incr = 11; +- } +- +- if ((!goomInfo->curGState->drawIFS) && (goomInfo->update.ifs_incr>0) && (goomInfo->update.decay_ifs<=0)) +- goomInfo->update.decay_ifs = 100; +- +- if (!goomInfo->curGState->drawScope) +- goomInfo->update.stop_lines = 0xf000 & 5; +- +- if (!goomInfo->curGState->drawScope) { +- goomInfo->update.stop_lines = 0; +- goomInfo->update.lineMode = goomInfo->update.drawLinesDuration; +- } +- +- /* if (goomInfo->update.goomvar % 1 == 0) */ +- { +- guint32 vtmp; +- guint32 newvit; +- +- goomInfo->update.lockvar = 50; +- newvit = STOP_SPEED + 1 - ((float)3.5f * log10(goomInfo->sound.speedvar * 60 + 1)); +- /* retablir le zoom avant.. */ +- if ((goomInfo->update.zoomFilterData.reverse) && (!(goomInfo->cycle % 13)) && (rand () % 5 == 0)) { +- goomInfo->update.zoomFilterData.reverse = 0; +- goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - 2; +- goomInfo->update.lockvar = 75; +- } +- if (goom_irand(goomInfo->gRandom,10) == 0) { +- goomInfo->update.zoomFilterData.reverse = 1; +- goomInfo->update.lockvar = 100; +- } +- +- if (goom_irand(goomInfo->gRandom,10) == 0) +- goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - 1; +- if (goom_irand(goomInfo->gRandom,12) == 0) +- goomInfo->update.zoomFilterData.vitesse = STOP_SPEED + 1; +- +- /* changement de milieu.. */ +- switch (goom_irand(goomInfo->gRandom,25)) { +- case 0: +- case 3: +- case 6: +- goomInfo->update.zoomFilterData.middleY = goomInfo->screen.height - 1; +- goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width / 2; +- break; +- case 1: +- case 4: +- goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width - 1; +- break; +- case 2: +- case 5: +- goomInfo->update.zoomFilterData.middleX = 1; +- break; +- default: +- goomInfo->update.zoomFilterData.middleY = goomInfo->screen.height / 2; +- goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width / 2; +- } +- +- if ((goomInfo->update.zoomFilterData.mode == WATER_MODE) +- || (goomInfo->update.zoomFilterData.mode == YONLY_MODE) +- || (goomInfo->update.zoomFilterData.mode == AMULETTE_MODE)) { +- goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width / 2; +- goomInfo->update.zoomFilterData.middleY = goomInfo->screen.height / 2; +- } +- +- switch (vtmp = (goom_irand(goomInfo->gRandom,15))) { +- case 0: +- goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand(goomInfo->gRandom,3) +- - goom_irand(goomInfo->gRandom,3); +- goomInfo->update.zoomFilterData.hPlaneEffect = goom_irand(goomInfo->gRandom,3) +- - goom_irand(goomInfo->gRandom,3); +- break; +- case 3: +- goomInfo->update.zoomFilterData.vPlaneEffect = 0; +- goomInfo->update.zoomFilterData.hPlaneEffect = goom_irand(goomInfo->gRandom,8) +- - goom_irand(goomInfo->gRandom,8); +- break; +- case 4: +- case 5: +- case 6: +- case 7: +- goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand(goomInfo->gRandom,5) +- - goom_irand(goomInfo->gRandom,5); +- goomInfo->update.zoomFilterData.hPlaneEffect = -goomInfo->update.zoomFilterData.vPlaneEffect; +- break; +- case 8: +- goomInfo->update.zoomFilterData.hPlaneEffect = 5 + goom_irand(goomInfo->gRandom,8); +- goomInfo->update.zoomFilterData.vPlaneEffect = -goomInfo->update.zoomFilterData.hPlaneEffect; +- break; +- case 9: +- goomInfo->update.zoomFilterData.vPlaneEffect = 5 + goom_irand(goomInfo->gRandom,8); +- goomInfo->update.zoomFilterData.hPlaneEffect = -goomInfo->update.zoomFilterData.hPlaneEffect; +- break; +- case 13: +- goomInfo->update.zoomFilterData.hPlaneEffect = 0; +- goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand(goomInfo->gRandom,10) +- - goom_irand(goomInfo->gRandom,10); +- break; +- case 14: +- goomInfo->update.zoomFilterData.hPlaneEffect = goom_irand(goomInfo->gRandom,10) +- - goom_irand(goomInfo->gRandom,10); +- goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand(goomInfo->gRandom,10) +- - goom_irand(goomInfo->gRandom,10); +- break; +- default: +- if (vtmp < 10) { +- goomInfo->update.zoomFilterData.vPlaneEffect = 0; +- goomInfo->update.zoomFilterData.hPlaneEffect = 0; +- } +- } +- +- if (goom_irand(goomInfo->gRandom,5) != 0) +- goomInfo->update.zoomFilterData.noisify = 0; +- else { +- goomInfo->update.zoomFilterData.noisify = goom_irand(goomInfo->gRandom,2) + 1; +- goomInfo->update.lockvar *= 2; +- } +- +- if (goomInfo->update.zoomFilterData.mode == AMULETTE_MODE) { +- goomInfo->update.zoomFilterData.vPlaneEffect = 0; +- goomInfo->update.zoomFilterData.hPlaneEffect = 0; +- goomInfo->update.zoomFilterData.noisify = 0; +- } +- +- if ((goomInfo->update.zoomFilterData.middleX == 1) || (goomInfo->update.zoomFilterData.middleX == (signed int)goomInfo->screen.width - 1)) { +- goomInfo->update.zoomFilterData.vPlaneEffect = 0; +- if (goom_irand(goomInfo->gRandom,2)) +- goomInfo->update.zoomFilterData.hPlaneEffect = 0; +- } +- +- if ((signed int)newvit < goomInfo->update.zoomFilterData.vitesse) /* on accelere */ +- { +- pzfd = &goomInfo->update.zoomFilterData; +- if (((newvit < STOP_SPEED - 7) && +- (goomInfo->update.zoomFilterData.vitesse < STOP_SPEED - 6) && +- (goomInfo->cycle % 3 == 0)) || (goom_irand(goomInfo->gRandom,40) == 0)) { +- goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - goom_irand(goomInfo->gRandom,2) +- + goom_irand(goomInfo->gRandom,2); +- goomInfo->update.zoomFilterData.reverse = !goomInfo->update.zoomFilterData.reverse; +- } +- else { +- goomInfo->update.zoomFilterData.vitesse = (newvit + goomInfo->update.zoomFilterData.vitesse * 7) / 8; +- } +- goomInfo->update.lockvar += 50; +- } +- } +- +- if (goomInfo->update.lockvar > 150) { +- goomInfo->update.switchIncr = goomInfo->update.switchIncrAmount; +- goomInfo->update.switchMult = 1.0f; +- } +- } +- /* mode mega-lent */ +- if (goom_irand(goomInfo->gRandom,700) == 0) { +- /* +- * printf ("coup du sort...\n") ; +- */ +- pzfd = &goomInfo->update.zoomFilterData; +- goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - 1; +- goomInfo->update.zoomFilterData.pertedec = 8; +- goomInfo->update.zoomFilterData.sqrtperte = 16; +- goomInfo->update.goomvar = 1; +- goomInfo->update.lockvar += 50; +- goomInfo->update.switchIncr = goomInfo->update.switchIncrAmount; +- goomInfo->update.switchMult = 1.0f; +- } +- } +- +- /* +- * gros frein si la musique est calme +- */ +- if ((goomInfo->sound.speedvar < 0.01f) +- && (goomInfo->update.zoomFilterData.vitesse < STOP_SPEED - 4) +- && (goomInfo->cycle % 16 == 0)) { +- pzfd = &goomInfo->update.zoomFilterData; +- goomInfo->update.zoomFilterData.vitesse += 3; +- goomInfo->update.zoomFilterData.pertedec = 8; +- goomInfo->update.zoomFilterData.sqrtperte = 16; +- goomInfo->update.goomvar = 0; +- } +- +- /* +- * baisser regulierement la vitesse... +- */ +- if ((goomInfo->cycle % 73 == 0) && (goomInfo->update.zoomFilterData.vitesse < STOP_SPEED - 5)) { +- pzfd = &goomInfo->update.zoomFilterData; +- goomInfo->update.zoomFilterData.vitesse++; +- } +- +- /* +- * arreter de decrémenter au bout d'un certain temps +- */ +- if ((goomInfo->cycle % 101 == 0) && (goomInfo->update.zoomFilterData.pertedec == 7)) { +- pzfd = &goomInfo->update.zoomFilterData; +- goomInfo->update.zoomFilterData.pertedec = 8; +- goomInfo->update.zoomFilterData.sqrtperte = 16; +- } +- +- /* +- * Permet de forcer un effet. +- */ +- if ((forceMode > 0) && (forceMode <= NB_FX)) { +- pzfd = &goomInfo->update.zoomFilterData; +- pzfd->mode = forceMode - 1; +- } +- +- if (forceMode == -1) { +- pzfd = NULL; +- } +- +- /* +- * Changement d'effet de zoom ! +- */ +- if (pzfd != NULL) { +- int dif; +- +- goomInfo->update.cyclesSinceLastChange = 0; +- +- goomInfo->update.switchIncr = goomInfo->update.switchIncrAmount; +- +- dif = goomInfo->update.zoomFilterData.vitesse - goomInfo->update.previousZoomSpeed; +- if (dif < 0) +- dif = -dif; +- +- if (dif > 2) { +- goomInfo->update.switchIncr *= (dif + 2) / 2; +- } +- goomInfo->update.previousZoomSpeed = goomInfo->update.zoomFilterData.vitesse; +- goomInfo->update.switchMult = 1.0f; +- +- if (((goomInfo->sound.timeSinceLastGoom == 0) +- && (goomInfo->sound.totalgoom < 2)) || (forceMode > 0)) { +- goomInfo->update.switchIncr = 0; +- goomInfo->update.switchMult = goomInfo->update.switchMultAmount; +- } +- } +- else { +- if (goomInfo->update.cyclesSinceLastChange > TIME_BTW_CHG) { +- pzfd = &goomInfo->update.zoomFilterData; +- goomInfo->update.cyclesSinceLastChange = 0; +- } +- else +- goomInfo->update.cyclesSinceLastChange++; +- } +- +-#ifdef VERBOSE +- if (pzfd) { +- printf ("GOOM: pzfd->mode = %d\n", pzfd->mode); +- } +-#endif +- +- /* Zoom here ! */ +- zoomFilterFastRGB (goomInfo, goomInfo->p1, goomInfo->p2, pzfd, goomInfo->screen.width, goomInfo->screen.height, +- goomInfo->update.switchIncr, goomInfo->update.switchMult); +- +- /* +- * Affichage tentacule +- */ +- +- goomInfo->tentacles_fx.apply(&goomInfo->tentacles_fx, goomInfo->p1, goomInfo->p2, goomInfo); +- goomInfo->star_fx.apply (&goomInfo->star_fx,goomInfo->p2,goomInfo->p1,goomInfo); +- +- /* +- * Affichage de texte +- */ +- { +- /*char title[1024];*/ +- char text[64]; +- +- /* +- * Le message +- */ +- update_message (goomInfo, message); +- +- if (fps > 0) { +- sprintf (text, "%2.0f fps", fps); +- goom_draw_text (goomInfo->p1,goomInfo->screen.width,goomInfo->screen.height, +- 10, 24, text, 1, 0); +- } +- +- /* +- * Le titre +- */ +- if (songTitle != NULL) { +- strncpy (goomInfo->update.titleText, songTitle, 1023); +- goomInfo->update.titleText[1023]=0; +- goomInfo->update.timeOfTitleDisplay = 200; +- } +- +- if (goomInfo->update.timeOfTitleDisplay) { +- goom_draw_text (goomInfo->p1,goomInfo->screen.width,goomInfo->screen.height, +- goomInfo->screen.width / 2, goomInfo->screen.height / 2 + 7, goomInfo->update.titleText, +- ((float) (190 - goomInfo->update.timeOfTitleDisplay) / 10.0f), 1); +- goomInfo->update.timeOfTitleDisplay--; +- if (goomInfo->update.timeOfTitleDisplay < 4) +- goom_draw_text (goomInfo->p2,goomInfo->screen.width,goomInfo->screen.height, +- goomInfo->screen.width / 2, goomInfo->screen.height / 2 + 7, goomInfo->update.titleText, +- ((float) (190 - goomInfo->update.timeOfTitleDisplay) / 10.0f), 1); +- } +- } +- +- /* +- * Gestion du Scope +- */ +- +- /* +- * arret demande +- */ +- if ((goomInfo->update.stop_lines & 0xf000)||(!goomInfo->curGState->drawScope)) { +- float param1, param2, amplitude; +- int couleur; +- int mode; +- +- choose_a_goom_line (goomInfo, ¶m1, ¶m2, &couleur, &mode, &litude,1); +- couleur = GML_BLACK; +- +- goom_lines_switch_to (goomInfo->gmline1, mode, param1, amplitude, couleur); +- goom_lines_switch_to (goomInfo->gmline2, mode, param2, amplitude, couleur); +- goomInfo->update.stop_lines &= 0x0fff; +- } +- +- /* +- * arret aleatore.. changement de mode de ligne.. +- */ +- if (goomInfo->update.lineMode != goomInfo->update.drawLinesDuration) { +- goomInfo->update.lineMode--; +- if (goomInfo->update.lineMode == -1) +- goomInfo->update.lineMode = 0; +- } +- else +- if ((goomInfo->cycle%80==0)&&(goom_irand(goomInfo->gRandom,5)==0)&&goomInfo->update.lineMode) +- goomInfo->update.lineMode--; +- +- if ((goomInfo->cycle % 120 == 0) +- && (goom_irand(goomInfo->gRandom,4) == 0) +- && (goomInfo->curGState->drawScope)) { +- if (goomInfo->update.lineMode == 0) +- goomInfo->update.lineMode = goomInfo->update.drawLinesDuration; +- else if (goomInfo->update.lineMode == goomInfo->update.drawLinesDuration) { +- float param1, param2, amplitude; +- int couleur1,couleur2; +- int mode; +- +- goomInfo->update.lineMode--; +- choose_a_goom_line (goomInfo, ¶m1, ¶m2, &couleur1, +- &mode, &litude,goomInfo->update.stop_lines); +- +- couleur2 = 5-couleur1; +- if (goomInfo->update.stop_lines) { +- goomInfo->update.stop_lines--; +- if (goom_irand(goomInfo->gRandom,2)) +- couleur2=couleur1 = GML_BLACK; +- } +- +- goom_lines_switch_to (goomInfo->gmline1, mode, param1, amplitude, couleur1); +- goom_lines_switch_to (goomInfo->gmline2, mode, param2, amplitude, couleur2); +- } +- } +- +- /* +- * si on est dans un goom : afficher les lignes... +- */ +- if ((goomInfo->update.lineMode != 0) || (goomInfo->sound.timeSinceLastGoom < 5)) { +- goomInfo->gmline2->power = goomInfo->gmline1->power; +- +- goom_lines_draw (goomInfo, goomInfo->gmline1, data[0], goomInfo->p2); +- goom_lines_draw (goomInfo, goomInfo->gmline2, data[1], goomInfo->p2); +- +- if (((goomInfo->cycle % 121) == 9) && (goom_irand(goomInfo->gRandom,3) == 1) +- && ((goomInfo->update.lineMode == 0) || (goomInfo->update.lineMode == goomInfo->update.drawLinesDuration))) { +- float param1, param2, amplitude; +- int couleur1,couleur2; +- int mode; +- +- choose_a_goom_line (goomInfo, ¶m1, ¶m2, &couleur1, +- &mode, &litude, goomInfo->update.stop_lines); +- couleur2 = 5-couleur1; +- +- if (goomInfo->update.stop_lines) { +- goomInfo->update.stop_lines--; +- if (goom_irand(goomInfo->gRandom,2)) +- couleur2=couleur1 = GML_BLACK; +- } +- goom_lines_switch_to (goomInfo->gmline1, mode, param1, amplitude, couleur1); +- goom_lines_switch_to (goomInfo->gmline2, mode, param2, amplitude, couleur2); +- } +- } +- +- return_val = goomInfo->p1; +- tmp = goomInfo->p1; +- goomInfo->p1 = goomInfo->p2; +- goomInfo->p2 = tmp; +- +- /* affichage et swappage des buffers.. */ +- goomInfo->cycle++; +- +- goomInfo->convolve_fx.apply(&goomInfo->convolve_fx,return_val,goomInfo->outputBuf,goomInfo); +- +- return (guint32*)goomInfo->outputBuf; +-} +- +-/**************************************** +-* CLOSE * +-****************************************/ +-void goom_close (PluginInfo *goomInfo) +-{ +- if (goomInfo->pixel != NULL) +- free (goomInfo->pixel); +- if (goomInfo->back != NULL) +- free (goomInfo->back); +- if (goomInfo->conv != NULL) +- free (goomInfo->conv); +- +- goomInfo->pixel = goomInfo->back = NULL; +- goomInfo->conv = NULL; +- goom_random_free(goomInfo->gRandom); +- goom_lines_free (&goomInfo->gmline1); +- goom_lines_free (&goomInfo->gmline2); +- +- /* release_ifs (); */ +- goomInfo->ifs_fx.free(&goomInfo->ifs_fx); +- goomInfo->convolve_fx.free(&goomInfo->convolve_fx); +- goomInfo->star_fx.free(&goomInfo->star_fx); +- goomInfo->tentacles_fx.free(&goomInfo->tentacles_fx); +- goomInfo->zoomFilter_fx.free(&goomInfo->zoomFilter_fx); +- +- free(goomInfo); +-} +- +- +-/* *** */ +-void +-choose_a_goom_line (PluginInfo *goomInfo, float *param1, float *param2, int *couleur, int *mode, +- float *amplitude, int far) +-{ +- *mode = goom_irand(goomInfo->gRandom,3); +- *amplitude = 1.0f; +- switch (*mode) { +- case GML_CIRCLE: +- if (far) { +- *param1 = *param2 = 0.47f; +- *amplitude = 0.8f; +- break; +- } +- if (goom_irand(goomInfo->gRandom,3) == 0) { +- *param1 = *param2 = 0; +- *amplitude = 3.0f; +- } +- else if (goom_irand(goomInfo->gRandom,2)) { +- *param1 = 0.40f * goomInfo->screen.height; +- *param2 = 0.22f * goomInfo->screen.height; +- } +- else { +- *param1 = *param2 = goomInfo->screen.height * 0.35; +- } +- break; +- case GML_HLINE: +- if (goom_irand(goomInfo->gRandom,4) || far) { +- *param1 = goomInfo->screen.height / 7; +- *param2 = 6.0f * goomInfo->screen.height / 7.0f; +- } +- else { +- *param1 = *param2 = goomInfo->screen.height / 2.0f; +- *amplitude = 2.0f; +- } +- break; +- case GML_VLINE: +- if (goom_irand(goomInfo->gRandom,3) || far) { +- *param1 = goomInfo->screen.width / 7.0f; +- *param2 = 6.0f * goomInfo->screen.width / 7.0f; +- } +- else { +- *param1 = *param2 = goomInfo->screen.width / 2.0f; +- *amplitude = 1.5f; +- } +- break; +- } +- +- *couleur = goom_irand(goomInfo->gRandom,6); +-} +- +-#define ECART_VARIATION 1.5 +-#define POS_VARIATION 3.0 +-#define SCROLLING_SPEED 80 +- +-/* +- * Met a jour l'affichage du message defilant +- */ +-void update_message (PluginInfo *goomInfo, char *message) { +- +- int fin = 0; +- +- if (message) { +- int i=1,j=0; +- sprintf (goomInfo->update_message.message, message); +- for (j=0;goomInfo->update_message.message[j];j++) +- if (goomInfo->update_message.message[j]=='\n') +- i++; +- goomInfo->update_message.numberOfLinesInMessage = i; +- goomInfo->update_message.affiche = goomInfo->screen.height + goomInfo->update_message.numberOfLinesInMessage * 25 + 105; +- goomInfo->update_message.longueur = strlen(goomInfo->update_message.message); +- } +- if (goomInfo->update_message.affiche) { +- int i = 0; +- char *msg = malloc(goomInfo->update_message.longueur + 1); +- char *ptr = msg; +- int pos; +- float ecart; +- message = msg; +- sprintf (msg, goomInfo->update_message.message); +- +- while (!fin) { +- while (1) { +- if (*ptr == 0) { +- fin = 1; +- break; +- } +- if (*ptr == '\n') { +- *ptr = 0; +- break; +- } +- ++ptr; +- } +- pos = goomInfo->update_message.affiche - (goomInfo->update_message.numberOfLinesInMessage - i)*25; +- pos += POS_VARIATION * (cos((double)pos / 20.0)); +- pos -= SCROLLING_SPEED; +- ecart = (ECART_VARIATION * sin((double)pos / 20.0)); +- if ((fin) && (2 * pos < (int)goomInfo->screen.height)) +- pos = (int)goomInfo->screen.height / 2; +- pos += 7; +- +- goom_draw_text(goomInfo->p1,goomInfo->screen.width,goomInfo->screen.height, +- goomInfo->screen.width/2, pos, +- message, +- ecart, +- 1); +- message = ++ptr; +- i++; +- } +- goomInfo->update_message.affiche --; +- free (msg); +- } +-} +- +diff -Naur /home/d4rk/goom2k4-0/src/goom_filters.h /src/goom_filters.h +--- /home/d4rk/goom2k4-0/src/goom_filters.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goom_filters.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,52 +0,0 @@ +-#ifndef FILTERS_H +-#define FILTERS_H +- +-#include "goom_config.h" +-#include "goom_typedefs.h" +-#include "goom_visual_fx.h" +-#include "goom_graphic.h" +- +-VisualFX zoomFilterVisualFXWrapper_create(void); +- +-struct _ZOOM_FILTER_DATA +-{ +- int vitesse; /* 128 = vitesse nule... * * 256 = en arriere +- * hyper vite.. * * 0 = en avant hype vite. */ +- unsigned char pertedec; +- unsigned char sqrtperte; +- int middleX, middleY; /* milieu de l'effet */ +- char reverse; /* inverse la vitesse */ +- char mode; /* type d'effet à appliquer (cf les #define) */ +- /** @since June 2001 */ +- int hPlaneEffect; /* deviation horitontale */ +- int vPlaneEffect; /* deviation verticale */ +- /** @since April 2002 */ +- int waveEffect; /* applique une "surcouche" de wave effect */ +- int hypercosEffect; /* applique une "surcouche de hypercos effect */ +- +- char noisify; /* ajoute un bruit a la transformation */ +-}; +- +-#define NORMAL_MODE 0 +-#define WAVE_MODE 1 +-#define CRYSTAL_BALL_MODE 2 +-#define SCRUNCH_MODE 3 +-#define AMULETTE_MODE 4 +-#define WATER_MODE 5 +-#define HYPERCOS1_MODE 6 +-#define HYPERCOS2_MODE 7 +-#define YONLY_MODE 8 +-#define SPEEDWAY_MODE 9 +- +-void pointFilter (PluginInfo *goomInfo, Pixel * pix1, Color c, +- float t1, float t2, float t3, float t4, guint32 cycle); +- +-/* filtre de zoom : +- * le contenu de pix1 est copie dans pix2. +- * zf : si non NULL, configure l'effet. +- * resx,resy : taille des buffers. +- */ +-void zoomFilterFastRGB (PluginInfo *goomInfo, Pixel * pix1, Pixel * pix2, ZoomFilterData * zf, guint32 resx, +- guint32 resy, int switchIncr, float switchMult); +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/goom_fx.h /src/goom_fx.h +--- /home/d4rk/goom2k4-0/src/goom_fx.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goom_fx.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,12 +0,0 @@ +-#ifndef _GOOM_FX_H +-#define _GOOM_FX_H +- +-#include "goom_visual_fx.h" +-#include "goom_plugin_info.h" +- +-VisualFX convolve_create (); +-VisualFX flying_star_create (void); +- +-void zoom_filter_c(int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/goom_graphic.h /src/goom_graphic.h +--- /home/d4rk/goom2k4-0/src/goom_graphic.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goom_graphic.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,74 +0,0 @@ +-#ifndef GRAPHIC_H +-#define GRAPHIC_H +- +-typedef unsigned int Uint; +- +-typedef struct +-{ +- unsigned short r, v, b; +-} +-Color; +- +-extern const Color BLACK; +-extern const Color WHITE; +-extern const Color RED; +-extern const Color BLUE; +-extern const Color GREEN; +-extern const Color YELLOW; +-extern const Color ORANGE; +-extern const Color VIOLET; +- +- +-#ifdef COLOR_BGRA +- +-#define B_CHANNEL 0xFF000000 +-#define G_CHANNEL 0x00FF0000 +-#define R_CHANNEL 0x0000FF00 +-#define A_CHANNEL 0x000000FF +-#define B_OFFSET 24 +-#define G_OFFSET 16 +-#define R_OFFSET 8 +-#define A_OFFSET 0 +- +-typedef union _PIXEL { +- struct { +- unsigned char b; +- unsigned char g; +- unsigned char r; +- unsigned char a; +- } channels; +- unsigned int val; +- unsigned char cop[4]; +-} Pixel; +- +-#else +- +-#define A_CHANNEL 0xFF000000 +-#define R_CHANNEL 0x00FF0000 +-#define G_CHANNEL 0x0000FF00 +-#define B_CHANNEL 0x000000FF +-#define A_OFFSET 24 +-#define R_OFFSET 16 +-#define G_OFFSET 8 +-#define B_OFFSET 0 +- +-typedef union _PIXEL { +- struct { +- unsigned char a; +- unsigned char r; +- unsigned char g; +- unsigned char b; +- } channels; +- unsigned int val; +- unsigned char cop[4]; +-} Pixel; +- +-#endif /* COLOR_BGRA */ +- +-/* +-inline void setPixelRGB (Pixel * buffer, Uint x, Uint y, Color c); +-inline void getPixelRGB (Pixel * buffer, Uint x, Uint y, Color * c); +-*/ +- +- +-#endif /* GRAPHIC_H */ +diff -Naur /home/d4rk/goom2k4-0/src/goom.h /src/goom.h +--- /home/d4rk/goom2k4-0/src/goom.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goom.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,30 +0,0 @@ +-#ifndef _GOOMCORE_H +-#define _GOOMCORE_H +- +-#include "goom_config.h" +-#include "goom_plugin_info.h" +-#include "goomsl.h" +- +-#define NB_FX 10 +- +-PluginInfo *goom_init (guint32 resx, guint32 resy); +-void goom_set_resolution (PluginInfo *goomInfo, guint32 resx, guint32 resy); +- +-/* +- * forceMode == 0 : do nothing +- * forceMode == -1 : lock the FX +- * forceMode == 1..NB_FX : force a switch to FX n# forceMode +- * +- * songTitle = pointer to the title of the song... +- * - NULL if it is not the start of the song +- * - only have a value at the start of the song +- */ +-guint32 *goom_update (PluginInfo *goomInfo, gint16 data[2][512], int forceMode, float fps, +- char *songTitle, char *message); +- +-/* returns 0 if the buffer wasn't accepted */ +-int goom_set_screenbuffer(PluginInfo *goomInfo, void *buffer); +- +-void goom_close (PluginInfo *goomInfo); +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/goom_hash.c /src/goom_hash.c +--- /home/d4rk/goom2k4-0/src/goom_hash.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goom_hash.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,100 +0,0 @@ +-#include "goom_hash.h" +-#include <string.h> +-#include <stdlib.h> +- +-static GoomHashEntry *entry_new(const char *key, HashValue value) { +- +- GoomHashEntry *entry = (GoomHashEntry*)malloc(sizeof(GoomHashEntry)); +- +- entry->key = (char *)malloc(strlen(key)+1); +- strcpy(entry->key,key); +- entry->value = value; +- entry->lower = NULL; +- entry->upper = NULL; +- +- return entry; +-} +- +-static void entry_free(GoomHashEntry *entry) { +- if (entry!=NULL) { +- entry_free(entry->lower); +- entry_free(entry->upper); +- free(entry->key); +- free(entry); +- } +-} +- +-static void entry_put(GoomHashEntry *entry, const char *key, HashValue value) { +- int cmp = strcmp(key,entry->key); +- if (cmp==0) { +- entry->value = value; +- } +- else if (cmp > 0) { +- if (entry->upper == NULL) +- entry->upper = entry_new(key,value); +- else +- entry_put(entry->upper, key, value); +- } +- else { +- if (entry->lower == NULL) +- entry->lower = entry_new(key,value); +- else +- entry_put(entry->lower, key, value); +- } +-} +- +-static HashValue *entry_get(GoomHashEntry *entry, const char *key) { +- +- int cmp; +- if (entry==NULL) +- return NULL; +- cmp = strcmp(key,entry->key); +- if (cmp > 0) +- return entry_get(entry->upper, key); +- else if (cmp < 0) +- return entry_get(entry->lower, key); +- else +- return &(entry->value); +-} +- +-GoomHash *goom_hash_new(void) { +- GoomHash *_this = (GoomHash*)malloc(sizeof(GoomHash)); +- _this->root = NULL; +- return _this; +-} +- +-void goom_hash_free(GoomHash *_this) { +- entry_free(_this->root); +- free(_this); +-} +- +-void goom_hash_put(GoomHash *_this, const char *key, HashValue value) { +- if (_this->root == NULL) +- _this->root = entry_new(key,value); +- else +- entry_put(_this->root,key,value); +-} +- +-HashValue *goom_hash_get(GoomHash *_this, const char *key) { +- return entry_get(_this->root,key); +-} +- +-void goom_hash_put_int(GoomHash *_this, const char *key, int i) { +- HashValue value; +- value.i = i; +- goom_hash_put(_this,key,value); +-} +- +-void goom_hash_put_float(GoomHash *_this, const char *key, float f) { +- HashValue value; +- value.f = f; +- goom_hash_put(_this,key,value); +-} +- +-void goom_hash_put_ptr(GoomHash *_this, const char *key, void *ptr) { +- HashValue value; +- value.ptr = ptr; +- goom_hash_put(_this,key,value); +-} +- +- +diff -Naur /home/d4rk/goom2k4-0/src/goom_hash.h /src/goom_hash.h +--- /home/d4rk/goom2k4-0/src/goom_hash.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goom_hash.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,34 +0,0 @@ +-#ifndef _GOOM_HASH_H +-#define _GOOM_HASH_H +- +-typedef struct GOOM_HASH_ENTRY GoomHashEntry; +-typedef struct GOOM_HASH GoomHash; +- +-typedef union { +- void *ptr; +- int i; +- float f; +-} HashValue; +- +-struct GOOM_HASH_ENTRY { +- char *key; +- HashValue value; +- GoomHashEntry *lower; +- GoomHashEntry *upper; +-}; +- +-struct GOOM_HASH { +- GoomHashEntry *root; +-}; +- +-GoomHash *goom_hash_new(void); +-void goom_hash_free(GoomHash *gh); +- +-void goom_hash_put(GoomHash *gh, const char *key, HashValue value); +-HashValue *goom_hash_get(GoomHash *gh, const char *key); +- +-void goom_hash_put_int(GoomHash *_this, const char *key, int i); +-void goom_hash_put_float(GoomHash *_this, const char *key, float f); +-void goom_hash_put_ptr(GoomHash *_this, const char *key, void *ptr); +- +-#endif /* _GOOM_HASH_H */ +diff -Naur /home/d4rk/goom2k4-0/src/goom_plugin_info.h /src/goom_plugin_info.h +--- /home/d4rk/goom2k4-0/src/goom_plugin_info.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goom_plugin_info.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,176 +0,0 @@ +-#ifndef _PLUGIN_INFO_H +-#define _PLUGIN_INFO_H +- +-#include "goom_typedefs.h" +- +-#include "goom_config.h" +- +-#include "goom_graphic.h" +-#include "goom_config_param.h" +-#include "goom_visual_fx.h" +-#include "goom_filters.h" +-#include "goom_tools.h" +-#include "goomsl.h" +- +-typedef struct { +- char drawIFS; +- char drawPoints; +- char drawTentacle; +- +- char drawScope; +- int farScope; +- +- int rangemin; +- int rangemax; +-} GoomState; +- +-#define STATES_MAX_NB 128 +- +-/** +- * Gives informations about the sound. +- */ +-struct _SOUND_INFO { +- +- /* nota : a Goom is just a sound event... */ +- +- int timeSinceLastGoom; /* >= 0 */ +- float goomPower; /* power of the last Goom [0..1] */ +- +- int timeSinceLastBigGoom; /* >= 0 */ +- +- float volume; /* [0..1] */ +- short samples[2][512]; +- +- /* other "internal" datas for the sound_tester */ +- float goom_limit; /* auto-updated limit of goom_detection */ +- float bigGoomLimit; +- float accelvar; /* acceleration of the sound - [0..1] */ +- float speedvar; /* speed of the sound - [0..100] */ +- int allTimesMax; +- int totalgoom; /* number of goom since last reset +- * (a reset every 64 cycles) */ +- +- float prov_max; /* accel max since last reset */ +- +- int cycle; +- +- /* private */ +- PluginParam volume_p; +- PluginParam speed_p; +- PluginParam accel_p; +- PluginParam goom_limit_p; +- PluginParam goom_power_p; +- PluginParam last_goom_p; +- PluginParam last_biggoom_p; +- PluginParam biggoom_speed_limit_p; +- PluginParam biggoom_factor_p; +- +- PluginParameters params; /* contains the previously defined parameters. */ +-}; +- +- +-/** +- * Allows FXs to know the current state of the plugin. +- */ +-struct _PLUGIN_INFO { +- +- /* public datas */ +- +- int nbParams; +- PluginParameters *params; +- +- /* private datas */ +- +- struct _SIZE_TYPE { +- int width; +- int height; +- int size; /* == screen.height * screen.width. */ +- } screen; +- +- SoundInfo sound; +- +- int nbVisuals; +- VisualFX **visuals; /* pointers on all the visual fx */ +- +- /** The known FX */ +- VisualFX convolve_fx; +- VisualFX star_fx; +- VisualFX zoomFilter_fx; +- VisualFX tentacles_fx; +- VisualFX ifs_fx; +- +- /** image buffers */ +- guint32 *pixel; +- guint32 *back; +- Pixel *p1, *p2; +- Pixel *conv; +- Pixel *outputBuf; +- +- /** state of goom */ +- guint32 cycle; +- GoomState states[STATES_MAX_NB]; +- int statesNumber; +- int statesRangeMax; +- +- GoomState *curGState; +- +- /** effet de ligne.. */ +- GMLine *gmline1; +- GMLine *gmline2; +- +- /** sinus table */ +- int sintable[0x10000]; +- +- /* INTERNALS */ +- +- /** goom_update internals. +- * I took all static variables from goom_update and put them here.. for the moment. +- */ +- struct { +- int lockvar; /* pour empecher de nouveaux changements */ +- int goomvar; /* boucle des gooms */ +- int loopvar; /* mouvement des points */ +- int stop_lines; +- int ifs_incr; /* dessiner l'ifs (0 = non: > = increment) */ +- int decay_ifs; /* disparition de l'ifs */ +- int recay_ifs; /* dedisparition de l'ifs */ +- int cyclesSinceLastChange; /* nombre de Cycle Depuis Dernier Changement */ +- int drawLinesDuration; /* duree de la transition entre afficher les lignes ou pas */ +- int lineMode; /* l'effet lineaire a dessiner */ +- float switchMultAmount; /* SWITCHMULT (29.0f/30.0f) */ +- int switchIncrAmount; /* 0x7f */ +- float switchMult; /* 1.0f */ +- int switchIncr; /* = SWITCHINCR; */ +- int stateSelectionRnd; +- int stateSelectionBlocker; +- int previousZoomSpeed; +- int timeOfTitleDisplay; +- char titleText[1024]; +- ZoomFilterData zoomFilterData; +- } update; +- +- struct { +- int numberOfLinesInMessage; +- char message[0x800]; +- int affiche; +- int longueur; +- } update_message; +- +- struct { +- void (*draw_line) (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny); +- void (*zoom_filter) (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); +- } methods; +- +- GoomRandom *gRandom; +- +- GoomSL *scanner; +- GoomSL *main_scanner; +- const char *main_script_str; +-}; +- +-void plugin_info_init(PluginInfo *p, int nbVisual); +- +-/* i = [0..p->nbVisual-1] */ +-void plugin_info_add_visual(PluginInfo *p, int i, VisualFX *visual); +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/goomsl.c /src/goomsl.c +--- /home/d4rk/goom2k4-0/src/goomsl.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goomsl.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,1509 +0,0 @@ +-#include <math.h> +-#include <stdlib.h> +-#include <stdio.h> +-#include <string.h> +-#include "goomsl.h" +-#include "goomsl_private.h" +-#include "goomsl_yacc.h" +- +-/*#define TRACE_SCRIPT*/ +- +- /* {{{ definition of the instructions number */ +-#define INSTR_SETI_VAR_INTEGER 1 +-#define INSTR_SETI_VAR_VAR 2 +-#define INSTR_SETF_VAR_FLOAT 3 +-#define INSTR_SETF_VAR_VAR 4 +-#define INSTR_NOP 5 +-/* #define INSTR_JUMP 6 */ +-#define INSTR_SETP_VAR_PTR 7 +-#define INSTR_SETP_VAR_VAR 8 +-#define INSTR_SUBI_VAR_INTEGER 9 +-#define INSTR_SUBI_VAR_VAR 10 +-#define INSTR_SUBF_VAR_FLOAT 11 +-#define INSTR_SUBF_VAR_VAR 12 +-#define INSTR_ISLOWERF_VAR_VAR 13 +-#define INSTR_ISLOWERF_VAR_FLOAT 14 +-#define INSTR_ISLOWERI_VAR_VAR 15 +-#define INSTR_ISLOWERI_VAR_INTEGER 16 +-#define INSTR_ADDI_VAR_INTEGER 17 +-#define INSTR_ADDI_VAR_VAR 18 +-#define INSTR_ADDF_VAR_FLOAT 19 +-#define INSTR_ADDF_VAR_VAR 20 +-#define INSTR_MULI_VAR_INTEGER 21 +-#define INSTR_MULI_VAR_VAR 22 +-#define INSTR_MULF_VAR_FLOAT 23 +-#define INSTR_MULF_VAR_VAR 24 +-#define INSTR_DIVI_VAR_INTEGER 25 +-#define INSTR_DIVI_VAR_VAR 26 +-#define INSTR_DIVF_VAR_FLOAT 27 +-#define INSTR_DIVF_VAR_VAR 28 +-/* #define INSTR_JZERO 29 */ +-#define INSTR_ISEQUALP_VAR_VAR 30 +-#define INSTR_ISEQUALP_VAR_PTR 31 +-#define INSTR_ISEQUALI_VAR_VAR 32 +-#define INSTR_ISEQUALI_VAR_INTEGER 33 +-#define INSTR_ISEQUALF_VAR_VAR 34 +-#define INSTR_ISEQUALF_VAR_FLOAT 35 +-/* #define INSTR_CALL 36 */ +-/* #define INSTR_RET 37 */ +-/* #define INSTR_EXT_CALL 38 */ +-#define INSTR_NOT_VAR 39 +-/* #define INSTR_JNZERO 40 */ +-#define INSTR_SETS_VAR_VAR 41 +-#define INSTR_ISEQUALS_VAR_VAR 42 +-#define INSTR_ADDS_VAR_VAR 43 +-#define INSTR_SUBS_VAR_VAR 44 +-#define INSTR_MULS_VAR_VAR 45 +-#define INSTR_DIVS_VAR_VAR 46 +- +- /* }}} */ +-/* {{{ definition of the validation error types */ +-static const char *VALIDATE_OK = "ok"; +-#define VALIDATE_ERROR "error while validating " +-#define VALIDATE_TODO "todo" +-#define VALIDATE_SYNTHAX_ERROR "synthax error" +-#define VALIDATE_NO_SUCH_INT "no such integer variable" +-#define VALIDATE_NO_SUCH_VAR "no such variable" +-#define VALIDATE_NO_SUCH_DEST_VAR "no such destination variable" +-#define VALIDATE_NO_SUCH_SRC_VAR "no such src variable" +-/* }}} */ +- +- /***********************************/ +- /* PROTOTYPE OF INTERNAL FUNCTIONS */ +-/***********************************/ +- +-/* {{{ */ +-static void gsl_instr_free(Instruction *_this); +-static const char *gsl_instr_validate(Instruction *_this); +-static void gsl_instr_display(Instruction *_this); +- +-static InstructionFlow *iflow_new(void); +-static void iflow_add_instr(InstructionFlow *_this, Instruction *instr); +-static void iflow_clean(InstructionFlow *_this); +-static void iflow_free(InstructionFlow *_this); +-static void iflow_execute(FastInstructionFlow *_this, GoomSL *gsl); +-/* }}} */ +- +- /************************************/ +- /* DEFINITION OF INTERNAL FUNCTIONS */ +-/************************************/ +- +-void iflow_free(InstructionFlow *_this) +-{ /* {{{ */ +- goom_hash_free(_this->labels); +- free(_this); /*TODO: finir cette fonction */ +-} /* }}} */ +- +-void iflow_clean(InstructionFlow *_this) +-{ /* {{{ */ +- /* TODO: clean chaque instruction du flot */ +- _this->number = 0; +- goom_hash_free(_this->labels); +- _this->labels = goom_hash_new(); +-} /* }}} */ +- +-InstructionFlow *iflow_new(void) +-{ /* {{{ */ +- InstructionFlow *_this = (InstructionFlow*)malloc(sizeof(InstructionFlow)); +- _this->number = 0; +- _this->tabsize = 6; +- _this->instr = (Instruction**)malloc(_this->tabsize * sizeof(Instruction*)); +- _this->labels = goom_hash_new(); +- +- return _this; +-} /* }}} */ +- +-void iflow_add_instr(InstructionFlow *_this, Instruction *instr) +-{ /* {{{ */ +- if (_this->number == _this->tabsize) { +- _this->tabsize *= 2; +- _this->instr = (Instruction**)realloc(_this->instr, _this->tabsize * sizeof(Instruction*)); +- } +- _this->instr[_this->number] = instr; +- instr->address = _this->number; +- _this->number++; +-} /* }}} */ +- +-void gsl_instr_set_namespace(Instruction *_this, GoomHash *ns) +-{ /* {{{ */ +- if (_this->cur_param <= 0) { +- fprintf(stderr, "ERROR: Line %d, No more params to instructions\n", _this->line_number); +- exit(1); +- } +- _this->vnamespace[_this->cur_param-1] = ns; +-} /* }}} */ +- +-void gsl_instr_add_param(Instruction *instr, char *param, int type) +-{ /* {{{ */ +- int len; +- if (instr==NULL) +- return; +- if (instr->cur_param==0) +- return; +- --instr->cur_param; +- len = strlen(param); +- instr->params[instr->cur_param] = (char*)malloc(len+1); +- strcpy(instr->params[instr->cur_param], param); +- instr->types[instr->cur_param] = type; +- if (instr->cur_param == 0) { +- +- const char *result = gsl_instr_validate(instr); +- if (result != VALIDATE_OK) { +- printf("ERROR: Line %d: ", instr->parent->num_lines + 1); +- gsl_instr_display(instr); +- printf("... %s\n", result); +- instr->parent->compilationOK = 0; +- exit(1); +- } +- +-#if USE_JITC_X86 +- iflow_add_instr(instr->parent->iflow, instr); +-#else +- if (instr->id != INSTR_NOP) +- iflow_add_instr(instr->parent->iflow, instr); +- else +- gsl_instr_free(instr); +-#endif +- } +-} /* }}} */ +- +-Instruction *gsl_instr_init(GoomSL *parent, const char *name, int id, int nb_param, int line_number) +-{ /* {{{ */ +- Instruction *instr = (Instruction*)malloc(sizeof(Instruction)); +- instr->params = (char**)malloc(nb_param*sizeof(char*)); +- instr->vnamespace = (GoomHash**)malloc(nb_param*sizeof(GoomHash*)); +- instr->types = (int*)malloc(nb_param*sizeof(int)); +- instr->cur_param = instr->nb_param = nb_param; +- instr->parent = parent; +- instr->id = id; +- instr->name = name; +- instr->jump_label = NULL; +- instr->line_number = line_number; +- return instr; +-} /* }}} */ +- +-void gsl_instr_free(Instruction *_this) +-{ /* {{{ */ +- int i; +- free(_this->types); +- for (i=_this->cur_param; i<_this->nb_param; ++i) +- free(_this->params[i]); +- free(_this->params); +- free(_this); +-} /* }}} */ +- +-void gsl_instr_display(Instruction *_this) +-{ /* {{{ */ +- int i=_this->nb_param-1; +- printf("%s", _this->name); +- while(i>=_this->cur_param) { +- printf(" %s", _this->params[i]); +- --i; +- } +-} /* }}} */ +- +- /****************************************/ +- /* VALIDATION OF INSTRUCTION PARAMETERS */ +-/****************************************/ +- +-static const char *validate_v_v(Instruction *_this) +-{ /* {{{ */ +- HashValue *dest = goom_hash_get(_this->vnamespace[1], _this->params[1]); +- HashValue *src = goom_hash_get(_this->vnamespace[0], _this->params[0]); +- +- if (dest == NULL) { +- return VALIDATE_NO_SUCH_DEST_VAR; +- } +- if (src == NULL) { +- return VALIDATE_NO_SUCH_SRC_VAR; +- } +- _this->data.udest.var = dest->ptr; +- _this->data.usrc.var = src->ptr; +- return VALIDATE_OK; +-} /* }}} */ +- +-static const char *validate_v_i(Instruction *_this) +-{ /* {{{ */ +- HashValue *dest = goom_hash_get(_this->vnamespace[1], _this->params[1]); +- _this->data.usrc.value_int = strtol(_this->params[0],NULL,0); +- +- if (dest == NULL) { +- return VALIDATE_NO_SUCH_INT; +- } +- _this->data.udest.var = dest->ptr; +- return VALIDATE_OK; +-} /* }}} */ +- +-static const char *validate_v_p(Instruction *_this) +-{ /* {{{ */ +- HashValue *dest = goom_hash_get(_this->vnamespace[1], _this->params[1]); +- _this->data.usrc.value_ptr = strtol(_this->params[0],NULL,0); +- +- if (dest == NULL) { +- return VALIDATE_NO_SUCH_INT; +- } +- _this->data.udest.var = dest->ptr; +- return VALIDATE_OK; +-} /* }}} */ +- +-static const char *validate_v_f(Instruction *_this) +-{ /* {{{ */ +- HashValue *dest = goom_hash_get(_this->vnamespace[1], _this->params[1]); +- _this->data.usrc.value_float = atof(_this->params[0]); +- +- if (dest == NULL) { +- return VALIDATE_NO_SUCH_VAR; +- } +- _this->data.udest.var = dest->ptr; +- return VALIDATE_OK; +-} /* }}} */ +- +-static const char *validate(Instruction *_this, +- int vf_f_id, int vf_v_id, +- int vi_i_id, int vi_v_id, +- int vp_p_id, int vp_v_id, +- int vs_v_id) +-{ /* {{{ */ +- if ((_this->types[1] == TYPE_FVAR) && (_this->types[0] == TYPE_FLOAT)) { +- _this->id = vf_f_id; +- return validate_v_f(_this); +- } +- else if ((_this->types[1] == TYPE_FVAR) && (_this->types[0] == TYPE_FVAR)) { +- _this->id = vf_v_id; +- return validate_v_v(_this); +- } +- else if ((_this->types[1] == TYPE_IVAR) && (_this->types[0] == TYPE_INTEGER)) { +- _this->id = vi_i_id; +- return validate_v_i(_this); +- } +- else if ((_this->types[1] == TYPE_IVAR) && (_this->types[0] == TYPE_IVAR)) { +- _this->id = vi_v_id; +- return validate_v_v(_this); +- } +- else if ((_this->types[1] == TYPE_PVAR) && (_this->types[0] == TYPE_PTR)) { +- if (vp_p_id == INSTR_NOP) return VALIDATE_ERROR; +- _this->id = vp_p_id; +- return validate_v_p(_this); +- } +- else if ((_this->types[1] == TYPE_PVAR) && (_this->types[0] == TYPE_PVAR)) { +- _this->id = vp_v_id; +- if (vp_v_id == INSTR_NOP) return VALIDATE_ERROR; +- return validate_v_v(_this); +- } +- else if ((_this->types[1] < FIRST_RESERVED) && (_this->types[1] >= 0) && (_this->types[0] == _this->types[1])) { +- _this->id = vs_v_id; +- if (vs_v_id == INSTR_NOP) return "Impossible operation to perform between two structs"; +- return validate_v_v(_this); +- } +- return VALIDATE_ERROR; +-} /* }}} */ +- +-const char *gsl_instr_validate(Instruction *_this) +-{ /* {{{ */ +- if (_this->id != INSTR_EXT_CALL) { +- int i = _this->nb_param; +- while (i>0) +- { +- i--; +- if (_this->types[i] == TYPE_VAR) { +- int type = gsl_type_of_var(_this->vnamespace[i], _this->params[i]); +- +- if (type == INSTR_INT) +- _this->types[i] = TYPE_IVAR; +- else if (type == INSTR_FLOAT) +- _this->types[i] = TYPE_FVAR; +- else if (type == INSTR_PTR) +- _this->types[i] = TYPE_PVAR; +- else if ((type >= 0) && (type < FIRST_RESERVED)) +- _this->types[i] = type; +- else fprintf(stderr,"WARNING: Line %d, %s has no namespace\n", _this->line_number, _this->params[i]); +- } +- } +- } +- +- switch (_this->id) { +- +- /* set */ +- case INSTR_SET: +- return validate(_this, +- INSTR_SETF_VAR_FLOAT, INSTR_SETF_VAR_VAR, +- INSTR_SETI_VAR_INTEGER, INSTR_SETI_VAR_VAR, +- INSTR_SETP_VAR_PTR, INSTR_SETP_VAR_VAR, +- INSTR_SETS_VAR_VAR); +- +- /* extcall */ +- case INSTR_EXT_CALL: +- if (_this->types[0] == TYPE_VAR) { +- HashValue *fval = goom_hash_get(_this->parent->functions, _this->params[0]); +- if (fval) { +- _this->data.udest.external_function = (struct _ExternalFunctionStruct*)fval->ptr; +- return VALIDATE_OK; +- } +- } +- return VALIDATE_ERROR; +- +- /* call */ +- case INSTR_CALL: +- if (_this->types[0] == TYPE_LABEL) { +- _this->jump_label = _this->params[0]; +- return VALIDATE_OK; +- } +- return VALIDATE_ERROR; +- +- /* ret */ +- case INSTR_RET: +- return VALIDATE_OK; +- +- /* jump */ +- case INSTR_JUMP: +- +- if (_this->types[0] == TYPE_LABEL) { +- _this->jump_label = _this->params[0]; +- return VALIDATE_OK; +- } +- return VALIDATE_ERROR; +- +- /* jzero / jnzero */ +- case INSTR_JZERO: +- case INSTR_JNZERO: +- +- if (_this->types[0] == TYPE_LABEL) { +- _this->jump_label = _this->params[0]; +- return VALIDATE_OK; +- } +- return VALIDATE_ERROR; +- +- /* label */ +- case INSTR_LABEL: +- +- if (_this->types[0] == TYPE_LABEL) { +- _this->id = INSTR_NOP; +- _this->nop_label = _this->params[0]; +- goom_hash_put_int(_this->parent->iflow->labels, _this->params[0], _this->parent->iflow->number); +- return VALIDATE_OK; +- } +- return VALIDATE_ERROR; +- +- /* isequal */ +- case INSTR_ISEQUAL: +- return validate(_this, +- INSTR_ISEQUALF_VAR_FLOAT, INSTR_ISEQUALF_VAR_VAR, +- INSTR_ISEQUALI_VAR_INTEGER, INSTR_ISEQUALI_VAR_VAR, +- INSTR_ISEQUALP_VAR_PTR, INSTR_ISEQUALP_VAR_VAR, +- INSTR_ISEQUALS_VAR_VAR); +- +- /* not */ +- case INSTR_NOT: +- _this->id = INSTR_NOT_VAR; +- return VALIDATE_OK; +- +- /* islower */ +- case INSTR_ISLOWER: +- return validate(_this, +- INSTR_ISLOWERF_VAR_FLOAT, INSTR_ISLOWERF_VAR_VAR, +- INSTR_ISLOWERI_VAR_INTEGER, INSTR_ISLOWERI_VAR_VAR, +- INSTR_NOP, INSTR_NOP, INSTR_NOP); +- +- /* add */ +- case INSTR_ADD: +- return validate(_this, +- INSTR_ADDF_VAR_FLOAT, INSTR_ADDF_VAR_VAR, +- INSTR_ADDI_VAR_INTEGER, INSTR_ADDI_VAR_VAR, +- INSTR_NOP, INSTR_NOP, +- INSTR_ADDS_VAR_VAR); +- +- /* mul */ +- case INSTR_MUL: +- return validate(_this, +- INSTR_MULF_VAR_FLOAT, INSTR_MULF_VAR_VAR, +- INSTR_MULI_VAR_INTEGER, INSTR_MULI_VAR_VAR, +- INSTR_NOP, INSTR_NOP, +- INSTR_MULS_VAR_VAR); +- +- /* sub */ +- case INSTR_SUB: +- return validate(_this, +- INSTR_SUBF_VAR_FLOAT, INSTR_SUBF_VAR_VAR, +- INSTR_SUBI_VAR_INTEGER, INSTR_SUBI_VAR_VAR, +- INSTR_NOP, INSTR_NOP, +- INSTR_SUBS_VAR_VAR); +- +- /* div */ +- case INSTR_DIV: +- return validate(_this, +- INSTR_DIVF_VAR_FLOAT, INSTR_DIVF_VAR_VAR, +- INSTR_DIVI_VAR_INTEGER, INSTR_DIVI_VAR_VAR, +- INSTR_NOP,INSTR_NOP, +- INSTR_DIVS_VAR_VAR); +- +- default: +- return VALIDATE_TODO; +- } +- return VALIDATE_ERROR; +-} /* }}} */ +- +- /*************/ +- /* EXECUTION */ +-/*************/ +-void iflow_execute(FastInstructionFlow *_this, GoomSL *gsl) +-{ /* {{{ */ +- int flag = 0; +- int ip = 0; +- FastInstruction *instr = _this->instr; +- int stack[0x10000]; +- int stack_pointer = 0; +- +- stack[stack_pointer++] = -1; +- +- /* Quelques Macro pour rendre le code plus lisible */ +-#define pSRC_VAR instr[ip].data.usrc.var +-#define SRC_VAR_INT *instr[ip].data.usrc.var_int +-#define SRC_VAR_FLOAT *instr[ip].data.usrc.var_float +-#define SRC_VAR_PTR *instr[ip].data.usrc.var_ptr +- +-#define pDEST_VAR instr[ip].data.udest.var +-#define DEST_VAR_INT *instr[ip].data.udest.var_int +-#define DEST_VAR_FLOAT *instr[ip].data.udest.var_float +-#define DEST_VAR_PTR *instr[ip].data.udest.var_ptr +- +-#define VALUE_INT instr[ip].data.usrc.value_int +-#define VALUE_FLOAT instr[ip].data.usrc.value_float +-#define VALUE_PTR instr[ip].data.usrc.value_ptr +- +-#define JUMP_OFFSET instr[ip].data.udest.jump_offset +- +-#define SRC_STRUCT_ID instr[ip].data.usrc.var_int[-1] +-#define DEST_STRUCT_ID instr[ip].data.udest.var_int[-1] +-#define SRC_STRUCT_IBLOCK(i) gsl->gsl_struct[SRC_STRUCT_ID]->iBlock[i] +-#define SRC_STRUCT_FBLOCK(i) gsl->gsl_struct[SRC_STRUCT_ID]->fBlock[i] +-#define DEST_STRUCT_IBLOCK(i) gsl->gsl_struct[DEST_STRUCT_ID]->iBlock[i] +-#define DEST_STRUCT_FBLOCK(i) gsl->gsl_struct[DEST_STRUCT_ID]->fBlock[i] +-#define DEST_STRUCT_IBLOCK_VAR(i,j) \ +- ((int*)((char*)pDEST_VAR + gsl->gsl_struct[DEST_STRUCT_ID]->iBlock[i].data))[j] +-#define DEST_STRUCT_FBLOCK_VAR(i,j) \ +- ((float*)((char*)pDEST_VAR + gsl->gsl_struct[DEST_STRUCT_ID]->fBlock[i].data))[j] +-#define SRC_STRUCT_IBLOCK_VAR(i,j) \ +- ((int*)((char*)pSRC_VAR + gsl->gsl_struct[SRC_STRUCT_ID]->iBlock[i].data))[j] +-#define SRC_STRUCT_FBLOCK_VAR(i,j) \ +- ((float*)((char*)pSRC_VAR + gsl->gsl_struct[SRC_STRUCT_ID]->fBlock[i].data))[j] +-#define DEST_STRUCT_SIZE gsl->gsl_struct[DEST_STRUCT_ID]->size +- +- while (1) +- { +- int i; +-#ifdef TRACE_SCRIPT +- printf("execute "); gsl_instr_display(instr[ip].proto); printf("\n"); +-#endif +- switch (instr[ip].id) { +- +- /* SET.I */ +- case INSTR_SETI_VAR_INTEGER: +- DEST_VAR_INT = VALUE_INT; +- ++ip; break; +- +- case INSTR_SETI_VAR_VAR: +- DEST_VAR_INT = SRC_VAR_INT; +- ++ip; break; +- +- /* SET.F */ +- case INSTR_SETF_VAR_FLOAT: +- DEST_VAR_FLOAT = VALUE_FLOAT; +- ++ip; break; +- +- case INSTR_SETF_VAR_VAR: +- DEST_VAR_FLOAT = SRC_VAR_FLOAT; +- ++ip; break; +- +- /* SET.P */ +- case INSTR_SETP_VAR_VAR: +- DEST_VAR_PTR = SRC_VAR_PTR; +- ++ip; break; +- +- case INSTR_SETP_VAR_PTR: +- DEST_VAR_PTR = VALUE_PTR; +- ++ip; break; +- +- /* JUMP */ +- case INSTR_JUMP: +- ip += JUMP_OFFSET; break; +- +- /* JZERO */ +- case INSTR_JZERO: +- ip += (flag ? 1 : JUMP_OFFSET); break; +- +- case INSTR_NOP: +- ++ip; break; +- +- /* ISEQUAL.P */ +- case INSTR_ISEQUALP_VAR_VAR: +- flag = (DEST_VAR_PTR == SRC_VAR_PTR); +- ++ip; break; +- +- case INSTR_ISEQUALP_VAR_PTR: +- flag = (DEST_VAR_PTR == VALUE_PTR); +- ++ip; break; +- +- /* ISEQUAL.I */ +- case INSTR_ISEQUALI_VAR_VAR: +- flag = (DEST_VAR_INT == SRC_VAR_INT); +- ++ip; break; +- +- case INSTR_ISEQUALI_VAR_INTEGER: +- flag = (DEST_VAR_INT == VALUE_INT); +- ++ip; break; +- +- /* ISEQUAL.F */ +- case INSTR_ISEQUALF_VAR_VAR: +- flag = (DEST_VAR_FLOAT == SRC_VAR_FLOAT); +- ++ip; break; +- +- case INSTR_ISEQUALF_VAR_FLOAT: +- flag = (DEST_VAR_FLOAT == VALUE_FLOAT); +- ++ip; break; +- +- /* ISLOWER.I */ +- case INSTR_ISLOWERI_VAR_VAR: +- flag = (DEST_VAR_INT < SRC_VAR_INT); +- ++ip; break; +- +- case INSTR_ISLOWERI_VAR_INTEGER: +- flag = (DEST_VAR_INT < VALUE_INT); +- ++ip; break; +- +- /* ISLOWER.F */ +- case INSTR_ISLOWERF_VAR_VAR: +- flag = (DEST_VAR_FLOAT < SRC_VAR_FLOAT); +- ++ip; break; +- +- case INSTR_ISLOWERF_VAR_FLOAT: +- flag = (DEST_VAR_FLOAT < VALUE_FLOAT); +- ++ip; break; +- +- /* ADD.I */ +- case INSTR_ADDI_VAR_VAR: +- DEST_VAR_INT += SRC_VAR_INT; +- ++ip; break; +- +- case INSTR_ADDI_VAR_INTEGER: +- DEST_VAR_INT += VALUE_INT; +- ++ip; break; +- +- /* ADD.F */ +- case INSTR_ADDF_VAR_VAR: +- DEST_VAR_FLOAT += SRC_VAR_FLOAT; +- ++ip; break; +- +- case INSTR_ADDF_VAR_FLOAT: +- DEST_VAR_FLOAT += VALUE_FLOAT; +- ++ip; break; +- +- /* MUL.I */ +- case INSTR_MULI_VAR_VAR: +- DEST_VAR_INT *= SRC_VAR_INT; +- ++ip; break; +- +- case INSTR_MULI_VAR_INTEGER: +- DEST_VAR_INT *= VALUE_INT; +- ++ip; break; +- +- /* MUL.F */ +- case INSTR_MULF_VAR_FLOAT: +- DEST_VAR_FLOAT *= VALUE_FLOAT; +- ++ip; break; +- +- case INSTR_MULF_VAR_VAR: +- DEST_VAR_FLOAT *= SRC_VAR_FLOAT; +- ++ip; break; +- +- /* DIV.I */ +- case INSTR_DIVI_VAR_VAR: +- DEST_VAR_INT /= SRC_VAR_INT; +- ++ip; break; +- +- case INSTR_DIVI_VAR_INTEGER: +- DEST_VAR_INT /= VALUE_INT; +- ++ip; break; +- +- /* DIV.F */ +- case INSTR_DIVF_VAR_FLOAT: +- DEST_VAR_FLOAT /= VALUE_FLOAT; +- ++ip; break; +- +- case INSTR_DIVF_VAR_VAR: +- DEST_VAR_FLOAT /= SRC_VAR_FLOAT; +- ++ip; break; +- +- /* SUB.I */ +- case INSTR_SUBI_VAR_VAR: +- DEST_VAR_INT -= SRC_VAR_INT; +- ++ip; break; +- +- case INSTR_SUBI_VAR_INTEGER: +- DEST_VAR_INT -= VALUE_INT; +- ++ip; break; +- +- /* SUB.F */ +- case INSTR_SUBF_VAR_FLOAT: +- DEST_VAR_FLOAT -= VALUE_FLOAT; +- ++ip; break; +- +- case INSTR_SUBF_VAR_VAR: +- DEST_VAR_FLOAT -= SRC_VAR_FLOAT; +- ++ip; break; +- +- /* CALL */ +- case INSTR_CALL: +- stack[stack_pointer++] = ip + 1; +- ip += JUMP_OFFSET; break; +- +- /* RET */ +- case INSTR_RET: +- ip = stack[--stack_pointer]; +- if (ip<0) return; +- break; +- +- /* EXT_CALL */ +- case INSTR_EXT_CALL: +- instr[ip].data.udest.external_function->function(gsl, gsl->vars, instr[ip].data.udest.external_function->vars); +- ++ip; break; +- +- /* NOT */ +- case INSTR_NOT_VAR: +- flag = !flag; +- ++ip; break; +- +- /* JNZERO */ +- case INSTR_JNZERO: +- ip += (flag ? JUMP_OFFSET : 1); break; +- +- case INSTR_SETS_VAR_VAR: +- memcpy(pDEST_VAR, pSRC_VAR, DEST_STRUCT_SIZE); +- ++ip; break; +- +- case INSTR_ISEQUALS_VAR_VAR: +- break; +- +- case INSTR_ADDS_VAR_VAR: +- /* process integers */ +- i=0; +- while (DEST_STRUCT_IBLOCK(i).size > 0) { +- int j=DEST_STRUCT_IBLOCK(i).size; +- while (j--) { +- DEST_STRUCT_IBLOCK_VAR(i,j) += SRC_STRUCT_IBLOCK_VAR(i,j); +- } +- ++i; +- } +- /* process floats */ +- i=0; +- while (DEST_STRUCT_FBLOCK(i).size > 0) { +- int j=DEST_STRUCT_FBLOCK(i).size; +- while (j--) { +- DEST_STRUCT_FBLOCK_VAR(i,j) += SRC_STRUCT_FBLOCK_VAR(i,j); +- } +- ++i; +- } +- ++ip; break; +- +- case INSTR_SUBS_VAR_VAR: +- /* process integers */ +- i=0; +- while (DEST_STRUCT_IBLOCK(i).size > 0) { +- int j=DEST_STRUCT_IBLOCK(i).size; +- while (j--) { +- DEST_STRUCT_IBLOCK_VAR(i,j) -= SRC_STRUCT_IBLOCK_VAR(i,j); +- } +- ++i; +- } +- /* process floats */ +- i=0; +- while (DEST_STRUCT_FBLOCK(i).size > 0) { +- int j=DEST_STRUCT_FBLOCK(i).size; +- while (j--) { +- DEST_STRUCT_FBLOCK_VAR(i,j) -= SRC_STRUCT_FBLOCK_VAR(i,j); +- } +- ++i; +- } +- ++ip; break; +- +- case INSTR_MULS_VAR_VAR: +- /* process integers */ +- i=0; +- while (DEST_STRUCT_IBLOCK(i).size > 0) { +- int j=DEST_STRUCT_IBLOCK(i).size; +- while (j--) { +- DEST_STRUCT_IBLOCK_VAR(i,j) *= SRC_STRUCT_IBLOCK_VAR(i,j); +- } +- ++i; +- } +- /* process floats */ +- i=0; +- while (DEST_STRUCT_FBLOCK(i).size > 0) { +- int j=DEST_STRUCT_FBLOCK(i).size; +- while (j--) { +- DEST_STRUCT_FBLOCK_VAR(i,j) *= SRC_STRUCT_FBLOCK_VAR(i,j); +- } +- ++i; +- } +- ++ip; break; +- +- case INSTR_DIVS_VAR_VAR: +- /* process integers */ +- i=0; +- while (DEST_STRUCT_IBLOCK(i).size > 0) { +- int j=DEST_STRUCT_IBLOCK(i).size; +- while (j--) { +- DEST_STRUCT_IBLOCK_VAR(i,j) /= SRC_STRUCT_IBLOCK_VAR(i,j); +- } +- ++i; +- } +- /* process floats */ +- i=0; +- while (DEST_STRUCT_FBLOCK(i).size > 0) { +- int j=DEST_STRUCT_FBLOCK(i).size; +- while (j--) { +- DEST_STRUCT_FBLOCK_VAR(i,j) /= SRC_STRUCT_FBLOCK_VAR(i,j); +- } +- ++i; +- } +- ++ip; break; +- +- default: +- printf("NOT IMPLEMENTED : %d\n", instr[ip].id); +- ++ip; +- exit(1); +- } +- } +-} /* }}} */ +- +-int gsl_malloc(GoomSL *_this, int size) +-{ /* {{{ */ +- if (_this->nbPtr >= _this->ptrArraySize) { +- _this->ptrArraySize *= 2; +- _this->ptrArray = (void**)realloc(_this->ptrArray, sizeof(void*) * _this->ptrArraySize); +- } +- _this->ptrArray[_this->nbPtr] = malloc(size); +- return _this->nbPtr++; +-} /* }}} */ +- +-void *gsl_get_ptr(GoomSL *_this, int id) +-{ /* {{{ */ +- if ((id>=0)&&(id<_this->nbPtr)) +- return _this->ptrArray[id]; +- fprintf(stderr,"INVALID GET PTR 0x%08x\n", id); +- return NULL; +-} /* }}} */ +- +-void gsl_free_ptr(GoomSL *_this, int id) +-{ /* {{{ */ +- if ((id>=0)&&(id<_this->nbPtr)) { +- free(_this->ptrArray[id]); +- _this->ptrArray[id] = 0; +- } +-} /* }}} */ +- +-void gsl_enternamespace(const char *name) +-{ /* {{{ */ +- HashValue *val = goom_hash_get(currentGoomSL->functions, name); +- if (val) { +- ExternalFunctionStruct *function = (ExternalFunctionStruct*)val->ptr; +- currentGoomSL->currentNS++; +- currentGoomSL->namespaces[currentGoomSL->currentNS] = function->vars; +- } +- else { +- fprintf(stderr, "ERROR: Line %d, Could not find namespace: %s\n", currentGoomSL->num_lines, name); +- exit(1); +- } +-} /* }}} */ +- +-void gsl_reenternamespace(GoomHash *nsinfo) { +- currentGoomSL->currentNS++; +- currentGoomSL->namespaces[currentGoomSL->currentNS] = nsinfo; +-} +- +-GoomHash *gsl_leavenamespace(void) +-{ /* {{{ */ +- currentGoomSL->currentNS--; +- return currentGoomSL->namespaces[currentGoomSL->currentNS+1]; +-} /* }}} */ +- +-GoomHash *gsl_find_namespace(const char *name) +-{ /* {{{ */ +- int i; +- for (i=currentGoomSL->currentNS;i>=0;--i) { +- if (goom_hash_get(currentGoomSL->namespaces[i], name)) +- return currentGoomSL->namespaces[i]; +- } +- return NULL; +-} /* }}} */ +- +-void gsl_declare_task(const char *name) +-{ /* {{{ */ +- if (goom_hash_get(currentGoomSL->functions, name)) { +- return; +- } +- else { +- ExternalFunctionStruct *gef = (ExternalFunctionStruct*)malloc(sizeof(ExternalFunctionStruct)); +- gef->function = 0; +- gef->vars = goom_hash_new(); +- gef->is_extern = 0; +- goom_hash_put_ptr(currentGoomSL->functions, name, (void*)gef); +- } +-} /* }}} */ +- +-void gsl_declare_external_task(const char *name) +-{ /* {{{ */ +- if (goom_hash_get(currentGoomSL->functions, name)) { +- fprintf(stderr, "ERROR: Line %d, Duplicate declaration of %s\n", currentGoomSL->num_lines, name); +- return; +- } +- else { +- ExternalFunctionStruct *gef = (ExternalFunctionStruct*)malloc(sizeof(ExternalFunctionStruct)); +- gef->function = 0; +- gef->vars = goom_hash_new(); +- gef->is_extern = 1; +- goom_hash_put_ptr(currentGoomSL->functions, name, (void*)gef); +- } +-} /* }}} */ +- +-static void reset_scanner(GoomSL *gss) +-{ /* {{{ */ +- gss->num_lines = 0; +- gss->instr = NULL; +- iflow_clean(gss->iflow); +- +- /* reset variables */ +- goom_hash_free(gss->vars); +- gss->vars = goom_hash_new(); +- gss->currentNS = 0; +- gss->namespaces[0] = gss->vars; +- +- goom_hash_free(gss->structIDS); +- gss->structIDS = goom_hash_new(); +- +- while (gss->nbStructID > 0) { +- int i; +- gss->nbStructID--; +- for(i=0;i<gss->gsl_struct[gss->nbStructID]->nbFields;++i) +- free(gss->gsl_struct[gss->nbStructID]->fields[i]); +- free(gss->gsl_struct[gss->nbStructID]); +- } +- +- gss->compilationOK = 1; +- +- goom_heap_delete(gss->data_heap); +- gss->data_heap = goom_heap_new(); +-} /* }}} */ +- +-static void calculate_labels(InstructionFlow *iflow) +-{ /* {{{ */ +- int i = 0; +- while (i < iflow->number) { +- Instruction *instr = iflow->instr[i]; +- if (instr->jump_label) { +- HashValue *label = goom_hash_get(iflow->labels,instr->jump_label); +- if (label) { +- instr->data.udest.jump_offset = -instr->address + label->i; +- } +- else { +- fprintf(stderr, "ERROR: Line %d, Could not find label %s\n", instr->line_number, instr->jump_label); +- instr->id = INSTR_NOP; +- instr->nop_label = 0; +- exit(1); +- } +- } +- ++i; +- } +-} /* }}} */ +- +-static int powerOfTwo(int i) +-{ +- int b; +- for (b=0;b<31;b++) +- if (i == (1<<b)) +- return b; +- return 0; +-} +- +-/* Cree un flow d'instruction optimise */ +-static void gsl_create_fast_iflow(void) +-{ /* {{{ */ +- int number = currentGoomSL->iflow->number; +- int i; +-#ifdef USE_JITC_X86 +- +- /* pour compatibilite avec les MACROS servant a execution */ +- int ip = 0; +- GoomSL *gsl = currentGoomSL; +- +- JitcX86Env *jitc; +- +- if (currentGoomSL->jitc != NULL) +- jitc_x86_delete(currentGoomSL->jitc); +- jitc = currentGoomSL->jitc = jitc_x86_env_new(0xffff); +- currentGoomSL->jitc_func = jitc_prepare_func(jitc); +- +-#if 0 +-#define SRC_STRUCT_ID instr[ip].data.usrc.var_int[-1] +-#define DEST_STRUCT_ID instr[ip].data.udest.var_int[-1] +-#define SRC_STRUCT_IBLOCK(i) gsl->gsl_struct[SRC_STRUCT_ID]->iBlock[i] +-#define SRC_STRUCT_FBLOCK(i) gsl->gsl_struct[SRC_STRUCT_ID]->fBlock[i] +-#define DEST_STRUCT_IBLOCK(i) gsl->gsl_struct[DEST_STRUCT_ID]->iBlock[i] +-#define DEST_STRUCT_FBLOCK(i) gsl->gsl_struct[DEST_STRUCT_ID]->fBlock[i] +-#define DEST_STRUCT_IBLOCK_VAR(i,j) \ +- ((int*)((char*)pDEST_VAR + gsl->gsl_struct[DEST_STRUCT_ID]->iBlock[i].data))[j] +-#define DEST_STRUCT_FBLOCK_VAR(i,j) \ +- ((float*)((char*)pDEST_VAR + gsl->gsl_struct[DEST_STRUCT_ID]->fBlock[i].data))[j] +-#define SRC_STRUCT_IBLOCK_VAR(i,j) \ +- ((int*)((char*)pSRC_VAR + gsl->gsl_struct[SRC_STRUCT_ID]->iBlock[i].data))[j] +-#define SRC_STRUCT_FBLOCK_VAR(i,j) \ +- ((float*)((char*)pSRC_VAR + gsl->gsl_struct[SRC_STRUCT_ID]->fBlock[i].data))[j] +-#define DEST_STRUCT_SIZE gsl->gsl_struct[DEST_STRUCT_ID]->size +-#endif +- +- JITC_JUMP_LABEL(jitc, "__very_end__"); +- JITC_ADD_LABEL (jitc, "__very_start__"); +- +- for (i=0;i<number;++i) { +- Instruction *instr = currentGoomSL->iflow->instr[i]; +- switch (instr->id) { +- case INSTR_SETI_VAR_INTEGER : +- jitc_add(jitc, "mov [$d], $d", instr->data.udest.var_int, instr->data.usrc.value_int); +- break; +- case INSTR_SETI_VAR_VAR : +- jitc_add(jitc, "mov eax, [$d]", instr->data.usrc.var_int); +- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); +- break; +- /* SET.F */ +- case INSTR_SETF_VAR_FLOAT : +- jitc_add(jitc, "mov [$d], $d", instr->data.udest.var_float, *(int*)(&instr->data.usrc.value_float)); +- break; +- case INSTR_SETF_VAR_VAR : +- jitc_add(jitc, "mov eax, [$d]", instr->data.usrc.var_float); +- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_float); +- break; +- case INSTR_NOP : +- if (instr->nop_label != 0) +- JITC_ADD_LABEL(jitc, instr->nop_label); +- break; +- case INSTR_JUMP : +- JITC_JUMP_LABEL(jitc,instr->jump_label); +- break; +- case INSTR_SETP_VAR_PTR : +- jitc_add(jitc, "mov [$d], $d", instr->data.udest.var_ptr, instr->data.usrc.value_ptr); +- break; +- case INSTR_SETP_VAR_VAR : +- jitc_add(jitc, "mov eax, [$d]", instr->data.usrc.var_ptr); +- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_ptr); +- break; +- case INSTR_SUBI_VAR_INTEGER : +- jitc_add(jitc, "add [$d], $d", instr->data.udest.var_int, -instr->data.usrc.value_int); +- break; +- case INSTR_SUBI_VAR_VAR : +- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); +- jitc_add(jitc, "sub eax, [$d]", instr->data.usrc.var_int); +- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); +- break; +- case INSTR_SUBF_VAR_FLOAT : +- printf("NOT IMPLEMENTED : %d\n", instr->id); +- break; +- case INSTR_SUBF_VAR_VAR : +- printf("NOT IMPLEMENTED : %d\n", instr->id); +- break; +- case INSTR_ISLOWERF_VAR_VAR: +- printf("NOT IMPLEMENTED : %d\n", instr->id); +- break; +- case INSTR_ISLOWERF_VAR_FLOAT: +- printf("NOT IMPLEMENTED : %d\n", instr->id); +- break; +- case INSTR_ISLOWERI_VAR_VAR: +- jitc_add(jitc,"mov edx, [$d]", instr->data.udest.var_int); +- jitc_add(jitc,"sub edx, [$d]", instr->data.usrc.var_int); +- jitc_add(jitc,"shr edx, $d", 31); +- break; +- case INSTR_ISLOWERI_VAR_INTEGER: +- jitc_add(jitc,"mov edx, [$d]", instr->data.udest.var_int); +- jitc_add(jitc,"sub edx, $d", instr->data.usrc.value_int); +- jitc_add(jitc,"shr edx, $d", 31); +- break; +- case INSTR_ADDI_VAR_INTEGER: +- jitc_add(jitc, "add [$d], $d", instr->data.udest.var_int, instr->data.usrc.value_int); +- break; +- case INSTR_ADDI_VAR_VAR: +- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); +- jitc_add(jitc, "add eax, [$d]", instr->data.usrc.var_int); +- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); +- break; +- case INSTR_ADDF_VAR_FLOAT: +- printf("NOT IMPLEMENTED : %d\n", instr->id); +- break; +- case INSTR_ADDF_VAR_VAR: +- printf("NOT IMPLEMENTED : %d\n", instr->id); +- break; +- case INSTR_MULI_VAR_INTEGER: +- if (instr->data.usrc.value_int != 1) +- { +- int po2 = powerOfTwo(instr->data.usrc.value_int); +- if (po2) { +- /* performs (V / 2^n) by doing V >> n */ +- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); +- jitc_add(jitc, "sal eax, $d", po2); +- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); +- } +- else { +- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); +- jitc_add(jitc, "imul eax, $d", instr->data.usrc.value_int); +- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); +- } +- } +- break; +- case INSTR_MULI_VAR_VAR: +- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); +- jitc_add(jitc, "imul eax, [$d]", instr->data.usrc.var_int); +- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); +- break; +- case INSTR_MULF_VAR_FLOAT: +- printf("NOT IMPLEMENTED : %d\n", instr->id); +- break; +- case INSTR_MULF_VAR_VAR: +- printf("NOT IMPLEMENTED : %d\n", instr->id); +- break; +- case INSTR_DIVI_VAR_INTEGER: +- if ((instr->data.usrc.value_int != 1) && (instr->data.usrc.value_int != 0)) +- { +- int po2 = powerOfTwo(instr->data.usrc.value_int); +- if (po2) { +- /* performs (V / 2^n) by doing V >> n */ +- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); +- jitc_add(jitc, "sar eax, $d", po2); +- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); +- } +- else { +- /* performs (V/n) by doing (V*(32^2/n)) */ +- long coef; +- double dcoef = (double)4294967296.0 / (double)instr->data.usrc.value_int; +- if (dcoef < 0.0) dcoef = -dcoef; +- coef = (long)floor(dcoef); +- dcoef -= floor(dcoef); +- if (dcoef < 0.5) coef += 1; +- +- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); +- jitc_add(jitc, "mov edx, $d", coef); +- jitc_add(jitc, "imul edx"); +- if (instr->data.usrc.value_int < 0) +- jitc_add(jitc, "neg edx"); +- jitc_add(jitc, "mov [$d], edx", instr->data.udest.var_int); +- } +- } +- break; +- case INSTR_DIVI_VAR_VAR : +- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); +- jitc_add(jitc, "cdq"); /* sign extend eax into edx */ +- jitc_add(jitc, "idiv [$d]", instr->data.usrc.var_int); +- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); +- break; +- case INSTR_DIVF_VAR_FLOAT: +- printf("NOT IMPLEMENTED : %d\n", instr->id); +- break; +- case INSTR_DIVF_VAR_VAR: +- printf("NOT IMPLEMENTED : %d\n", instr->id); +- break; +- case INSTR_JZERO: +- jitc_add(jitc, "cmp edx, $d", 0); +- jitc_add(jitc, "je $s", instr->jump_label); +- break; +- case INSTR_ISEQUALP_VAR_VAR : +- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_ptr); +- jitc_add(jitc, "mov edx, $d", 0); +- jitc_add(jitc, "cmp eax, [$d]", instr->data.usrc.var_ptr); +- jitc_add(jitc, "jne $d", 1); +- jitc_add(jitc, "inc edx"); +- break; +- case INSTR_ISEQUALP_VAR_PTR : +- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_ptr); +- jitc_add(jitc, "mov edx, $d", 0); +- jitc_add(jitc, "cmp eax, $d", instr->data.usrc.value_ptr); +- jitc_add(jitc, "jne $d", 1); +- jitc_add(jitc, "inc edx"); +- break; +- case INSTR_ISEQUALI_VAR_VAR : +- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); +- jitc_add(jitc, "mov edx, $d", 0); +- jitc_add(jitc, "cmp eax, [$d]", instr->data.usrc.var_int); +- jitc_add(jitc, "jne $d", 1); +- jitc_add(jitc, "inc edx"); +- break; +- case INSTR_ISEQUALI_VAR_INTEGER : +- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); +- jitc_add(jitc, "mov edx, $d", 0); +- jitc_add(jitc, "cmp eax, $d", instr->data.usrc.value_int); +- jitc_add(jitc, "jne $d", 1); +- jitc_add(jitc, "inc edx"); +- break; +- case INSTR_ISEQUALF_VAR_VAR : +- printf("NOT IMPLEMENTED : %d\n", instr->id); +- break; +- case INSTR_ISEQUALF_VAR_FLOAT : +- printf("NOT IMPLEMENTED : %d\n", instr->id); +- break; +- case INSTR_CALL: +- jitc_add(jitc, "call $s", instr->jump_label); +- break; +- case INSTR_RET: +- jitc_add(jitc, "ret"); +- break; +- case INSTR_EXT_CALL: +- jitc_add(jitc, "mov eax, [$d]", &(instr->data.udest.external_function->vars)); +- jitc_add(jitc, "push eax"); +- jitc_add(jitc, "mov edx, [$d]", &(currentGoomSL->vars)); +- jitc_add(jitc, "push edx"); +- jitc_add(jitc, "mov eax, [$d]", &(currentGoomSL)); +- jitc_add(jitc, "push eax"); +- +- jitc_add(jitc, "mov eax, [$d]", &(instr->data.udest.external_function)); +- jitc_add(jitc, "mov eax, [eax]"); +- jitc_add(jitc, "call [eax]"); +- jitc_add(jitc, "add esp, $d", 12); +- break; +- case INSTR_NOT_VAR: +- jitc_add(jitc, "mov eax, edx"); +- jitc_add(jitc, "mov edx, $d", 1); +- jitc_add(jitc, "sub edx, eax"); +- break; +- case INSTR_JNZERO: +- jitc_add(jitc, "cmp edx, $d", 0); +- jitc_add(jitc, "jne $s", instr->jump_label); +- break; +- case INSTR_SETS_VAR_VAR: +- { +- int loop = DEST_STRUCT_SIZE / sizeof(int); +- int dst = (int)pDEST_VAR; +- int src = (int)pSRC_VAR; +- +- while (loop--) { +- jitc_add(jitc,"mov eax, [$d]", src); +- jitc_add(jitc,"mov [$d], eax", dst); +- src += 4; +- dst += 4; +- } +- } +- break; +- case INSTR_ISEQUALS_VAR_VAR: +- break; +- case INSTR_ADDS_VAR_VAR: +- { +- /* process integers */ +- int i=0; +- while (DEST_STRUCT_IBLOCK(i).size > 0) { +- int j=DEST_STRUCT_IBLOCK(i).size; +- while (j--) { /* TODO interlace 2 */ +- jitc_add(jitc, "mov eax, [$d]", &DEST_STRUCT_IBLOCK_VAR(i,j)); +- jitc_add(jitc, "add eax, [$d]", &SRC_STRUCT_IBLOCK_VAR(i,j)); +- jitc_add(jitc, "mov [$d], eax", &DEST_STRUCT_IBLOCK_VAR(i,j)); +- } +- ++i; +- } +- /* process floats */ +- i=0; +- while (DEST_STRUCT_FBLOCK(i).size > 0) { +- int j=DEST_STRUCT_FBLOCK(i).size; +- while (j--) { +- /* DEST_STRUCT_FBLOCK_VAR(i,j) += SRC_STRUCT_FBLOCK_VAR(i,j); */ +- /* TODO */ +- } +- ++i; +- } +- break; +- } +- case INSTR_SUBS_VAR_VAR: +- { +- /* process integers */ +- int i=0; +- while (DEST_STRUCT_IBLOCK(i).size > 0) { +- int j=DEST_STRUCT_IBLOCK(i).size; +- while (j--) { +- jitc_add(jitc, "mov eax, [$d]", &DEST_STRUCT_IBLOCK_VAR(i,j)); +- jitc_add(jitc, "sub eax, [$d]", &SRC_STRUCT_IBLOCK_VAR(i,j)); +- jitc_add(jitc, "mov [$d], eax", &DEST_STRUCT_IBLOCK_VAR(i,j)); +- } +- ++i; +- } +- break; +- } +- case INSTR_MULS_VAR_VAR: +- { +- /* process integers */ +- int i=0; +- while (DEST_STRUCT_IBLOCK(i).size > 0) { +- int j=DEST_STRUCT_IBLOCK(i).size; +- while (j--) { +- jitc_add(jitc, "mov eax, [$d]", &DEST_STRUCT_IBLOCK_VAR(i,j)); +- jitc_add(jitc, "imul eax, [$d]", &SRC_STRUCT_IBLOCK_VAR(i,j)); +- jitc_add(jitc, "mov [$d], eax", &DEST_STRUCT_IBLOCK_VAR(i,j)); +- } +- ++i; +- } +- break; +- } +- case INSTR_DIVS_VAR_VAR: +- { +- /* process integers */ +- int i=0; +- while (DEST_STRUCT_IBLOCK(i).size > 0) { +- int j=DEST_STRUCT_IBLOCK(i).size; +- while (j--) { +- jitc_add(jitc, "mov eax, [$d]", &DEST_STRUCT_IBLOCK_VAR(i,j)); +- jitc_add(jitc, "cdq"); +- jitc_add(jitc, "idiv [$d]", &SRC_STRUCT_IBLOCK_VAR(i,j)); +- jitc_add(jitc, "mov [$d], eax", &DEST_STRUCT_IBLOCK_VAR(i,j)); +- } +- ++i; +- } +- break; +- } +- } +- } +- +- JITC_ADD_LABEL (jitc, "__very_end__"); +- jitc_add(jitc, "call $s", "__very_start__"); +- jitc_add(jitc, "mov eax, $d", 0); +- jitc_validate_func(jitc); +-#else +- InstructionFlow *iflow = currentGoomSL->iflow; +- FastInstructionFlow *fastiflow = (FastInstructionFlow*)malloc(sizeof(FastInstructionFlow)); +- fastiflow->mallocedInstr = calloc(number*16, sizeof(FastInstruction)); +- /* fastiflow->instr = (FastInstruction*)(((int)fastiflow->mallocedInstr) + 16 - (((int)fastiflow->mallocedInstr)%16)); */ +- fastiflow->instr = (FastInstruction*)fastiflow->mallocedInstr; +- fastiflow->number = number; +- for(i=0;i<number;++i) { +- fastiflow->instr[i].id = iflow->instr[i]->id; +- fastiflow->instr[i].data = iflow->instr[i]->data; +- fastiflow->instr[i].proto = iflow->instr[i]; +- } +- currentGoomSL->fastiflow = fastiflow; +-#endif +-} /* }}} */ +- +-void yy_scan_string(const char *str); +-void yyparse(void); +- +-GoomHash *gsl_globals(GoomSL *_this) +-{ +- return _this->vars; +-} +- +- +-/** +- * Some native external functions +- */ +-static void ext_charAt(GoomSL *gsl, GoomHash *global, GoomHash *local) +-{ +- char *string = GSL_LOCAL_PTR(gsl, local, "value"); +- int index = GSL_LOCAL_INT(gsl, local, "index"); +- GSL_GLOBAL_INT(gsl, "charAt") = 0; +- if (string == NULL) { +- return; +- } +- if (index < strlen(string)) +- GSL_GLOBAL_INT(gsl, "charAt") = string[index]; +-} +- +-static void ext_i2f(GoomSL *gsl, GoomHash *global, GoomHash *local) +-{ +- int i = GSL_LOCAL_INT(gsl, local, "value"); +- GSL_GLOBAL_FLOAT(gsl, "i2f") = i; +-} +- +-static void ext_f2i(GoomSL *gsl, GoomHash *global, GoomHash *local) +-{ +- float f = GSL_LOCAL_FLOAT(gsl, local, "value"); +- GSL_GLOBAL_INT(gsl, "f2i") = f; +-} +- +-/** +- * +- */ +-void gsl_compile(GoomSL *_currentGoomSL, const char *script) +-{ /* {{{ */ +- char *script_and_externals; +- static const char *sBinds = +- "external <charAt: string value, int index> : int\n" +- "external <f2i: float value> : int\n" +- "external <i2f: int value> : float\n"; +- +-#ifdef VERBOSE +- printf("\n=== Starting Compilation ===\n"); +-#endif +- +- script_and_externals = malloc(strlen(script) + strlen(sBinds) + 2); +- strcpy(script_and_externals, sBinds); +- strcat(script_and_externals, script); +- +- /* 0- reset */ +- currentGoomSL = _currentGoomSL; +- reset_scanner(currentGoomSL); +- +- /* 1- create the syntaxic tree */ +- yy_scan_string(script_and_externals); +- yyparse(); +- +- /* 2- generate code */ +- gsl_commit_compilation(); +- +- /* 3- resolve symbols */ +- calculate_labels(currentGoomSL->iflow); +- +- /* 4- optimize code */ +- gsl_create_fast_iflow(); +- +- /* 5- bind a few internal functions */ +- gsl_bind_function(currentGoomSL, "charAt", ext_charAt); +- gsl_bind_function(currentGoomSL, "f2i", ext_f2i); +- gsl_bind_function(currentGoomSL, "i2f", ext_i2f); +- free(script_and_externals); +- +-#ifdef VERBOSE +- printf("=== Compilation done. # of lines: %d. # of instr: %d ===\n", currentGoomSL->num_lines, currentGoomSL->iflow->number); +-#endif +-} /* }}} */ +- +-void gsl_execute(GoomSL *scanner) +-{ /* {{{ */ +- if (scanner->compilationOK) { +-#if USE_JITC_X86 +- scanner->jitc_func(); +-#else +- iflow_execute(scanner->fastiflow, scanner); +-#endif +- } +-} /* }}} */ +- +-GoomSL *gsl_new(void) +-{ /* {{{ */ +- GoomSL *gss = (GoomSL*)malloc(sizeof(GoomSL)); +- +- gss->iflow = iflow_new(); +- gss->vars = goom_hash_new(); +- gss->functions = goom_hash_new(); +- gss->nbStructID = 0; +- gss->structIDS = goom_hash_new(); +- gss->gsl_struct_size = 32; +- gss->gsl_struct = (GSL_Struct**)malloc(gss->gsl_struct_size * sizeof(GSL_Struct*)); +- gss->currentNS = 0; +- gss->namespaces[0] = gss->vars; +- gss->data_heap = goom_heap_new(); +- +- reset_scanner(gss); +- +- gss->compilationOK = 0; +- gss->nbPtr=0; +- gss->ptrArraySize=256; +- gss->ptrArray = (void**)malloc(gss->ptrArraySize * sizeof(void*)); +-#ifdef USE_JITC_X86 +- gss->jitc = NULL; +-#endif +- return gss; +-} /* }}} */ +- +-void gsl_bind_function(GoomSL *gss, const char *fname, GoomSL_ExternalFunction func) +-{ /* {{{ */ +- HashValue *val = goom_hash_get(gss->functions, fname); +- if (val) { +- ExternalFunctionStruct *gef = (ExternalFunctionStruct*)val->ptr; +- gef->function = func; +- } +- else fprintf(stderr, "Unable to bind function %s\n", fname); +-} /* }}} */ +- +-int gsl_is_compiled(GoomSL *gss) +-{ /* {{{ */ +- return gss->compilationOK; +-} /* }}} */ +- +-void gsl_free(GoomSL *gss) +-{ /* {{{ */ +- iflow_free(gss->iflow); +- free(gss->vars); +- free(gss->functions); +- free(gss); +-} /* }}} */ +- +- +-static int gsl_nb_import; +-static char gsl_already_imported[256][256]; +- +-char *gsl_init_buffer(const char *fname) +-{ +- char *fbuffer; +- fbuffer = (char*)malloc(512); +- fbuffer[0]=0; +- gsl_nb_import = 0; +- if (fname) +- gsl_append_file_to_buffer(fname,&fbuffer); +- return fbuffer; +-} +- +-static char *gsl_read_file(const char *fname) +-{ +- FILE *f; +- char *buffer; +- int fsize; +- f = fopen(fname,"rt"); +- if (!f) { +- fprintf(stderr, "ERROR: Could not load file %s\n", fname); +- exit(1); +- } +- fseek(f,0,SEEK_END); +- fsize = ftell(f); +- rewind(f); +- buffer = (char*)malloc(fsize+512); +- fread(buffer,1,fsize,f); +- fclose(f); +- buffer[fsize]=0; +- return buffer; +-} +- +-void gsl_append_file_to_buffer(const char *fname, char **buffer) +-{ +- char *fbuffer; +- int size,fsize,i=0; +- char reset_msg[256]; +- +- /* look if the file have not been already imported */ +- for (i=0;i<gsl_nb_import;++i) { +- if (strcmp(gsl_already_imported[i], fname) == 0) +- return; +- } +- +- /* add fname to the already imported files. */ +- strcpy(gsl_already_imported[gsl_nb_import++], fname); +- +- /* load the file */ +- fbuffer = gsl_read_file(fname); +- fsize = strlen(fbuffer); +- +- /* look for #import */ +- while (fbuffer[i]) { +- if ((fbuffer[i]=='#') && (fbuffer[i+1]=='i')) { +- char impName[256]; +- int j; +- while (fbuffer[i] && (fbuffer[i]!=' ')) +- i++; +- i++; +- j=0; +- while (fbuffer[i] && (fbuffer[i]!='\n')) +- impName[j++] = fbuffer[i++]; +- impName[j++] = 0; +- gsl_append_file_to_buffer(impName, buffer); +- } +- i++; +- } +- +- sprintf(reset_msg, "\n#FILE %s#\n#RST_LINE#\n", fname); +- strcat(*buffer, reset_msg); +- size=strlen(*buffer); +- *buffer = (char*)realloc(*buffer, size+fsize+256); +- strcat((*buffer)+size, fbuffer); +- free(fbuffer); +-} +- +- +diff -Naur /home/d4rk/goom2k4-0/src/goomsl.h /src/goomsl.h +--- /home/d4rk/goom2k4-0/src/goomsl.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goomsl.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,34 +0,0 @@ +-#ifndef _GOOMSL_H +-#define _GOOMSL_H +- +-#include "goomsl_hash.h" +- +-typedef struct _GoomSL GoomSL; +-typedef void (*GoomSL_ExternalFunction)(GoomSL *gsl, GoomHash *global_vars, GoomHash *local_vars); +- +-GoomSL*gsl_new(void); +-void gsl_free(GoomSL *gss); +- +-char *gsl_init_buffer(const char *file_name); +-void gsl_append_file_to_buffer(const char *file_name, char **buffer); +- +-void gsl_compile (GoomSL *scanner, const char *script); +-void gsl_execute (GoomSL *scanner); +-int gsl_is_compiled (GoomSL *gss); +-void gsl_bind_function(GoomSL *gss, const char *fname, GoomSL_ExternalFunction func); +- +-int gsl_malloc (GoomSL *_this, int size); +-void *gsl_get_ptr (GoomSL *_this, int id); +-void gsl_free_ptr(GoomSL *_this, int id); +- +-GoomHash *gsl_globals(GoomSL *_this); +- +-#define GSL_LOCAL_PTR(gsl,local,name) gsl_get_ptr(gsl, *(int*)goom_hash_get(local,name)->ptr) +-#define GSL_LOCAL_INT(gsl,local,name) (*(int*)goom_hash_get(local,name)->ptr) +-#define GSL_LOCAL_FLOAT(gsl,local,name) (*(float*)goom_hash_get(local,name)->ptr) +- +-#define GSL_GLOBAL_PTR(gsl,name) gsl_get_ptr(gsl, *(int*)goom_hash_get(gsl_globals(gsl),name)->ptr) +-#define GSL_GLOBAL_INT(gsl,name) (*(int*)goom_hash_get(gsl_globals(gsl),name)->ptr) +-#define GSL_GLOBAL_FLOAT(gsl,name) (*(float*)goom_hash_get(gsl_globals(gsl),name)->ptr) +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/goomsl_hash.c /src/goomsl_hash.c +--- /home/d4rk/goom2k4-0/src/goomsl_hash.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goomsl_hash.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,120 +0,0 @@ +-#include "goomsl_hash.h" +-#include <string.h> +-#include <stdlib.h> +- +-static GoomHashEntry *entry_new(const char *key, HashValue value) { +- +- int len = strlen(key); +- GoomHashEntry *entry = (GoomHashEntry*)malloc(sizeof(GoomHashEntry)); +- +- entry->key = (char *)malloc(len+1); +- memcpy(entry->key,key,len+1); +- entry->value = value; +- entry->lower = NULL; +- entry->upper = NULL; +- +- return entry; +-} +- +-static void entry_free(GoomHashEntry *entry) { +- if (entry!=NULL) { +- entry_free(entry->lower); +- entry_free(entry->upper); +- free(entry->key); +- free(entry); +- } +-} +- +-static void entry_put(GoomHashEntry *entry, const char *key, HashValue value) { +- int cmp = strcmp(key,entry->key); +- if (cmp==0) { +- entry->value = value; +- } +- else if (cmp > 0) { +- if (entry->upper == NULL) +- entry->upper = entry_new(key,value); +- else +- entry_put(entry->upper, key, value); +- } +- else { +- if (entry->lower == NULL) +- entry->lower = entry_new(key,value); +- else +- entry_put(entry->lower, key, value); +- } +-} +- +-static HashValue *entry_get(GoomHashEntry *entry, const char *key) { +- +- int cmp; +- if (entry==NULL) +- return NULL; +- cmp = strcmp(key,entry->key); +- if (cmp > 0) +- return entry_get(entry->upper, key); +- else if (cmp < 0) +- return entry_get(entry->lower, key); +- else +- return &(entry->value); +-} +- +-GoomHash *goom_hash_new() { +- GoomHash *_this = (GoomHash*)malloc(sizeof(GoomHash)); +- _this->root = NULL; +- _this->number_of_puts = 0; +- return _this; +-} +- +-void goom_hash_free(GoomHash *_this) { +- entry_free(_this->root); +- free(_this); +-} +- +-void goom_hash_put(GoomHash *_this, const char *key, HashValue value) { +- _this->number_of_puts += 1; +- if (_this->root == NULL) +- _this->root = entry_new(key,value); +- else +- entry_put(_this->root,key,value); +-} +- +-HashValue *goom_hash_get(GoomHash *_this, const char *key) { +- if (_this == NULL) return NULL; +- return entry_get(_this->root,key); +-} +- +-void goom_hash_put_int(GoomHash *_this, const char *key, int i) { +- HashValue value; +- value.i = i; +- goom_hash_put(_this,key,value); +-} +- +-void goom_hash_put_float(GoomHash *_this, const char *key, float f) { +- HashValue value; +- value.f = f; +- goom_hash_put(_this,key,value); +-} +- +-void goom_hash_put_ptr(GoomHash *_this, const char *key, void *ptr) { +- HashValue value; +- value.ptr = ptr; +- goom_hash_put(_this,key,value); +-} +- +-/* FOR EACH */ +- +-static void _goom_hash_for_each(GoomHash *_this, GoomHashEntry *entry, GH_Func func) +-{ +- if (entry == NULL) return; +- func(_this, entry->key, &(entry->value)); +- _goom_hash_for_each(_this, entry->lower, func); +- _goom_hash_for_each(_this, entry->upper, func); +-} +- +-void goom_hash_for_each(GoomHash *_this, GH_Func func) { +- _goom_hash_for_each(_this, _this->root, func); +-} +- +-int goom_hash_number_of_puts(GoomHash *_this) { +- return _this->number_of_puts; +-} +diff -Naur /home/d4rk/goom2k4-0/src/goomsl_hash.h /src/goomsl_hash.h +--- /home/d4rk/goom2k4-0/src/goomsl_hash.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goomsl_hash.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,40 +0,0 @@ +-#ifndef _GOOMSL_HASH_H +-#define _GOOMSL_HASH_H +- +-typedef struct GOOM_HASH_ENTRY GoomHashEntry; +-typedef struct GOOM_HASH GoomHash; +- +-typedef union { +- void *ptr; +- int i; +- float f; +-} HashValue; +- +-struct GOOM_HASH_ENTRY { +- char *key; +- HashValue value; +- GoomHashEntry *lower; +- GoomHashEntry *upper; +-}; +- +-struct GOOM_HASH { +- GoomHashEntry *root; +- int number_of_puts; +-}; +- +-GoomHash *goom_hash_new(); +-void goom_hash_free(GoomHash *gh); +- +-void goom_hash_put(GoomHash *gh, const char *key, HashValue value); +-HashValue *goom_hash_get(GoomHash *gh, const char *key); +- +-void goom_hash_put_int (GoomHash *_this, const char *key, int i); +-void goom_hash_put_float(GoomHash *_this, const char *key, float f); +-void goom_hash_put_ptr (GoomHash *_this, const char *key, void *ptr); +- +-typedef void (*GH_Func)(GoomHash *caller, const char *key, HashValue *value); +- +-void goom_hash_for_each(GoomHash *_this, GH_Func func); +-int goom_hash_number_of_puts(GoomHash *_this); +- +-#endif /* _GOOM_HASH_H */ +diff -Naur /home/d4rk/goom2k4-0/src/goomsl_heap.c /src/goomsl_heap.c +--- /home/d4rk/goom2k4-0/src/goomsl_heap.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goomsl_heap.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,105 +0,0 @@ +-#include "goomsl_heap.h" +-#include <stdlib.h> +- +-struct _GOOM_HEAP { +- void **arrays; +- int number_of_arrays; +- int size_of_each_array; +- int consumed_in_last_array; +-}; +- +-/* Constructors / Destructor */ +-GoomHeap *goom_heap_new(void) +-{ +- return goom_heap_new_with_granularity(4096); +-} +- +-GoomHeap *goom_heap_new_with_granularity(int granularity) +-{ +- GoomHeap *_this; +- _this = (GoomHeap*)malloc(sizeof(GoomHeap)); +- _this->number_of_arrays = 0; +- _this->size_of_each_array = granularity; +- _this->consumed_in_last_array = 0; +- _this->arrays = (void**)malloc(sizeof(void*)); +- return _this; +-} +- +-void goom_heap_delete(GoomHeap *_this) +-{ +- int i; +- for (i=0;i<_this->number_of_arrays;++i) { +- free(_this->arrays[i]); +- } +- free(_this->arrays); +- free(_this); +-} +- +-static void align_it(GoomHeap *_this, int alignment) +-{ +- if ((alignment > 1) && (_this->number_of_arrays>0)) { +- void *last_array = _this->arrays[_this->number_of_arrays - 1]; +- int last_address = (int)last_array + _this->consumed_in_last_array; +- int decal = (last_address % alignment); +- if (decal != 0) { +- _this->consumed_in_last_array += alignment - decal; +- } +- } +-} +- +-void *goom_heap_malloc_with_alignment_prefixed(GoomHeap *_this, int nb_bytes, +- int alignment, int prefix_bytes) +-{ +- void *retval = NULL; +- +- /* d'abord on gere les problemes d'alignement */ +- _this->consumed_in_last_array += prefix_bytes; +- align_it(_this, alignment); +- +- /* ensuite on verifie que la quantite de memoire demandee tient dans le buffer */ +- if ((_this->consumed_in_last_array + nb_bytes >= _this->size_of_each_array) +- || (_this->number_of_arrays == 0)) { +- +- if (prefix_bytes + nb_bytes + alignment >= _this->size_of_each_array) { +- +- /* Si la zone demandee est plus grosse que la granularitee */ +- /* On alloue un buffer plus gros que les autres */ +- _this->arrays = (void**)realloc(_this->arrays, sizeof(void*) * (_this->number_of_arrays+2)); +- +- _this->number_of_arrays += 1; +- _this->consumed_in_last_array = prefix_bytes; +- +- _this->arrays[_this->number_of_arrays - 1] = malloc(prefix_bytes + nb_bytes + alignment); +- align_it(_this,alignment); +- retval = (void*)((char*)_this->arrays[_this->number_of_arrays - 1] + _this->consumed_in_last_array); +- +- /* puis on repart sur un nouveau buffer vide */ +- _this->number_of_arrays += 1; +- _this->consumed_in_last_array = 0; +- _this->arrays[_this->number_of_arrays - 1] = malloc(_this->size_of_each_array); +- return retval; +- } +- else { +- _this->number_of_arrays += 1; +- _this->consumed_in_last_array = prefix_bytes; +- _this->arrays = (void**)realloc(_this->arrays, sizeof(void*) * _this->number_of_arrays); +- +- _this->arrays[_this->number_of_arrays - 1] = malloc(_this->size_of_each_array); +- align_it(_this,alignment); +- } +- } +- retval = (void*)((char*)_this->arrays[_this->number_of_arrays - 1] + _this->consumed_in_last_array); +- _this->consumed_in_last_array += nb_bytes; +- return retval; +-} +- +-void *goom_heap_malloc_with_alignment(GoomHeap *_this, int nb_bytes, int alignment) +-{ +- return goom_heap_malloc_with_alignment_prefixed(_this, nb_bytes, alignment, 0); +-} +- +-void *goom_heap_malloc(GoomHeap *_this, int nb_bytes) +-{ +- return goom_heap_malloc_with_alignment(_this,nb_bytes,1); +-} +- +diff -Naur /home/d4rk/goom2k4-0/src/goomsl_heap.h /src/goomsl_heap.h +--- /home/d4rk/goom2k4-0/src/goomsl_heap.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goomsl_heap.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,29 +0,0 @@ +-#ifndef GOOMSL_HEAP +-#define GOOMSL_HEAP +- +-/** +- * Resizable Array that guarranty that resizes don't change address of +- * the stored datas. +- * +- * This is implemented as an array of arrays... granularity is the size +- * of each arrays. +- */ +- +-typedef struct _GOOM_HEAP GoomHeap; +- +-/* Constructors / Destructor */ +-GoomHeap *goom_heap_new(void); +-GoomHeap *goom_heap_new_with_granularity(int granularity); +-void goom_heap_delete(GoomHeap *_this); +- +-/* This method behaves like malloc. */ +-void *goom_heap_malloc(GoomHeap *_this, int nb_bytes); +-/* This adds an alignment constraint. */ +-void *goom_heap_malloc_with_alignment(GoomHeap *_this, int nb_bytes, int alignment); +- +-/* Returns a pointeur on the bytes... prefix is before */ +-void *goom_heap_malloc_with_alignment_prefixed(GoomHeap *_this, int nb_bytes, +- int alignment, int prefix_bytes); +- +-#endif +- +diff -Naur /home/d4rk/goom2k4-0/src/goomsl_lex.c /src/goomsl_lex.c +--- /home/d4rk/goom2k4-0/src/goomsl_lex.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goomsl_lex.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,2108 +0,0 @@ +-#line 2 "goomsl_lex.c" +- +-#line 4 "goomsl_lex.c" +- +-#define YY_INT_ALIGNED short int +- +-/* A lexical scanner generated by flex */ +- +-#define FLEX_SCANNER +-#define YY_FLEX_MAJOR_VERSION 2 +-#define YY_FLEX_MINOR_VERSION 5 +-#define YY_FLEX_SUBMINOR_VERSION 31 +-#if YY_FLEX_SUBMINOR_VERSION > 0 +-#define FLEX_BETA +-#endif +- +-/* First, we deal with platform-specific or compiler-specific issues. */ +- +-/* begin standard C headers. */ +-#include <stdio.h> +-#include <string.h> +-#include <errno.h> +-#include <stdlib.h> +- +-/* end standard C headers. */ +- +-/* flex integer type definitions */ +- +-#ifndef FLEXINT_H +-#define FLEXINT_H +- +-/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */ +- +-#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L +-#include <inttypes.h> +-typedef int8_t flex_int8_t; +-typedef uint8_t flex_uint8_t; +-typedef int16_t flex_int16_t; +-typedef uint16_t flex_uint16_t; +-typedef int32_t flex_int32_t; +-typedef uint32_t flex_uint32_t; +-#else +-typedef signed char flex_int8_t; +-typedef short int flex_int16_t; +-typedef int flex_int32_t; +-typedef unsigned char flex_uint8_t; +-typedef unsigned short int flex_uint16_t; +-typedef unsigned int flex_uint32_t; +-#endif /* ! C99 */ +- +-/* Limits of integral types. */ +-#ifndef INT8_MIN +-#define INT8_MIN (-128) +-#endif +-#ifndef INT16_MIN +-#define INT16_MIN (-32767-1) +-#endif +-#ifndef INT32_MIN +-#define INT32_MIN (-2147483647-1) +-#endif +-#ifndef INT8_MAX +-#define INT8_MAX (127) +-#endif +-#ifndef INT16_MAX +-#define INT16_MAX (32767) +-#endif +-#ifndef INT32_MAX +-#define INT32_MAX (2147483647) +-#endif +-#ifndef UINT8_MAX +-#define UINT8_MAX (255U) +-#endif +-#ifndef UINT16_MAX +-#define UINT16_MAX (65535U) +-#endif +-#ifndef UINT32_MAX +-#define UINT32_MAX (4294967295U) +-#endif +- +-#endif /* ! FLEXINT_H */ +- +-#ifdef __cplusplus +- +-/* The "const" storage-class-modifier is valid. */ +-#define YY_USE_CONST +- +-#else /* ! __cplusplus */ +- +-#if __STDC__ +- +-#define YY_USE_CONST +- +-#endif /* __STDC__ */ +-#endif /* ! __cplusplus */ +- +-#ifdef YY_USE_CONST +-#define yyconst const +-#else +-#define yyconst +-#endif +- +-/* Returned upon end-of-file. */ +-#define YY_NULL 0 +- +-/* Promotes a possibly negative, possibly signed char to an unsigned +- * integer for use as an array index. If the signed char is negative, +- * we want to instead treat it as an 8-bit unsigned char, hence the +- * double cast. +- */ +-#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) +- +-/* Enter a start condition. This macro really ought to take a parameter, +- * but we do it the disgusting crufty way forced on us by the ()-less +- * definition of BEGIN. +- */ +-#define BEGIN (yy_start) = 1 + 2 * +- +-/* Translate the current start state into a value that can be later handed +- * to BEGIN to return to the state. The YYSTATE alias is for lex +- * compatibility. +- */ +-#define YY_START (((yy_start) - 1) / 2) +-#define YYSTATE YY_START +- +-/* Action number for EOF rule of a given start state. */ +-#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) +- +-/* Special action meaning "start processing a new file". */ +-#define YY_NEW_FILE yyrestart(yyin ) +- +-#define YY_END_OF_BUFFER_CHAR 0 +- +-/* Size of default input buffer. */ +-#ifndef YY_BUF_SIZE +-#define YY_BUF_SIZE 16384 +-#endif +- +-#ifndef YY_TYPEDEF_YY_BUFFER_STATE +-#define YY_TYPEDEF_YY_BUFFER_STATE +-typedef struct yy_buffer_state *YY_BUFFER_STATE; +-#endif +- +-extern int yyleng; +- +-extern FILE *yyin, *yyout; +- +-#define EOB_ACT_CONTINUE_SCAN 0 +-#define EOB_ACT_END_OF_FILE 1 +-#define EOB_ACT_LAST_MATCH 2 +- +- /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires +- * access to the local variable yy_act. Since yyless() is a macro, it would break +- * existing scanners that call yyless() from OUTSIDE yylex. +- * One obvious solution it to make yy_act a global. I tried that, and saw +- * a 5% performance hit in a non-yylineno scanner, because yy_act is +- * normally declared as a register variable-- so it is not worth it. +- */ +- #define YY_LESS_LINENO(n) \ +- do { \ +- int yyl;\ +- for ( yyl = n; yyl < yyleng; ++yyl )\ +- if ( yytext[yyl] == '\n' )\ +- --yylineno;\ +- }while(0) +- +-/* Return all but the first "n" matched characters back to the input stream. */ +-#define yyless(n) \ +- do \ +- { \ +- /* Undo effects of setting up yytext. */ \ +- int yyless_macro_arg = (n); \ +- YY_LESS_LINENO(yyless_macro_arg);\ +- *yy_cp = (yy_hold_char); \ +- YY_RESTORE_YY_MORE_OFFSET \ +- (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ +- YY_DO_BEFORE_ACTION; /* set up yytext again */ \ +- } \ +- while ( 0 ) +- +-#define unput(c) yyunput( c, (yytext_ptr) ) +- +-/* The following is because we cannot portably get our hands on size_t +- * (without autoconf's help, which isn't available because we want +- * flex-generated scanners to compile on their own). +- */ +- +-#ifndef YY_TYPEDEF_YY_SIZE_T +-#define YY_TYPEDEF_YY_SIZE_T +-typedef unsigned int yy_size_t; +-#endif +- +-#ifndef YY_STRUCT_YY_BUFFER_STATE +-#define YY_STRUCT_YY_BUFFER_STATE +-struct yy_buffer_state +- { +- FILE *yy_input_file; +- +- char *yy_ch_buf; /* input buffer */ +- char *yy_buf_pos; /* current position in input buffer */ +- +- /* Size of input buffer in bytes, not including room for EOB +- * characters. +- */ +- yy_size_t yy_buf_size; +- +- /* Number of characters read into yy_ch_buf, not including EOB +- * characters. +- */ +- int yy_n_chars; +- +- /* Whether we "own" the buffer - i.e., we know we created it, +- * and can realloc() it to grow it, and should free() it to +- * delete it. +- */ +- int yy_is_our_buffer; +- +- /* Whether this is an "interactive" input source; if so, and +- * if we're using stdio for input, then we want to use getc() +- * instead of fread(), to make sure we stop fetching input after +- * each newline. +- */ +- int yy_is_interactive; +- +- /* Whether we're considered to be at the beginning of a line. +- * If so, '^' rules will be active on the next match, otherwise +- * not. +- */ +- int yy_at_bol; +- +- int yy_bs_lineno; /**< The line count. */ +- int yy_bs_column; /**< The column count. */ +- +- /* Whether to try to fill the input buffer when we reach the +- * end of it. +- */ +- int yy_fill_buffer; +- +- int yy_buffer_status; +- +-#define YY_BUFFER_NEW 0 +-#define YY_BUFFER_NORMAL 1 +- /* When an EOF's been seen but there's still some text to process +- * then we mark the buffer as YY_EOF_PENDING, to indicate that we +- * shouldn't try reading from the input source any more. We might +- * still have a bunch of tokens to match, though, because of +- * possible backing-up. +- * +- * When we actually see the EOF, we change the status to "new" +- * (via yyrestart()), so that the user can continue scanning by +- * just pointing yyin at a new input file. +- */ +-#define YY_BUFFER_EOF_PENDING 2 +- +- }; +-#endif /* !YY_STRUCT_YY_BUFFER_STATE */ +- +-/* Stack of input buffers. */ +-static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ +-static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ +-static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ +- +-/* We provide macros for accessing buffer states in case in the +- * future we want to put the buffer states in a more general +- * "scanner state". +- * +- * Returns the top of the stack, or NULL. +- */ +-#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ +- ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ +- : NULL) +- +-/* Same as previous macro, but useful when we know that the buffer stack is not +- * NULL or when we need an lvalue. For internal use only. +- */ +-#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] +- +-/* yy_hold_char holds the character lost when yytext is formed. */ +-static char yy_hold_char; +-static int yy_n_chars; /* number of characters read into yy_ch_buf */ +-int yyleng; +- +-/* Points to current character in buffer. */ +-static char *yy_c_buf_p = (char *) 0; +-static int yy_init = 1; /* whether we need to initialize */ +-static int yy_start = 0; /* start state number */ +- +-/* Flag which is used to allow yywrap()'s to do buffer switches +- * instead of setting up a fresh yyin. A bit of a hack ... +- */ +-static int yy_did_buffer_switch_on_eof; +- +-void yyrestart (FILE *input_file ); +-void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ); +-YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ); +-void yy_delete_buffer (YY_BUFFER_STATE b ); +-void yy_flush_buffer (YY_BUFFER_STATE b ); +-void yypush_buffer_state (YY_BUFFER_STATE new_buffer ); +-void yypop_buffer_state (void ); +- +-static void yyensure_buffer_stack (void ); +-static void yy_load_buffer_state (void ); +-static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); +- +-#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ) +- +-YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ); +-YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ); +-YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len ); +- +-void *yyalloc (yy_size_t ); +-void *yyrealloc (void *,yy_size_t ); +-void yyfree (void * ); +- +-#define yy_new_buffer yy_create_buffer +- +-#define yy_set_interactive(is_interactive) \ +- { \ +- if ( ! YY_CURRENT_BUFFER ){ \ +- yyensure_buffer_stack (); \ +- YY_CURRENT_BUFFER_LVALUE = \ +- yy_create_buffer(yyin,YY_BUF_SIZE ); \ +- } \ +- YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ +- } +- +-#define yy_set_bol(at_bol) \ +- { \ +- if ( ! YY_CURRENT_BUFFER ){\ +- yyensure_buffer_stack (); \ +- YY_CURRENT_BUFFER_LVALUE = \ +- yy_create_buffer(yyin,YY_BUF_SIZE ); \ +- } \ +- YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ +- } +- +-#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) +- +-/* Begin user sect3 */ +- +-typedef unsigned char YY_CHAR; +- +-FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; +- +-typedef int yy_state_type; +- +-#define YY_FLEX_LEX_COMPAT +-extern int yylineno; +- +-int yylineno = 1; +- +-extern char yytext[]; +- +-static yy_state_type yy_get_previous_state (void ); +-static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); +-static int yy_get_next_buffer (void ); +-static void yy_fatal_error (yyconst char msg[] ); +- +-/* Done after the current pattern has been matched and before the +- * corresponding action - sets up yytext. +- */ +-#define YY_DO_BEFORE_ACTION \ +- (yytext_ptr) = yy_bp; \ +- yyleng = (size_t) (yy_cp - yy_bp); \ +- (yy_hold_char) = *yy_cp; \ +- *yy_cp = '\0'; \ +- if ( yyleng + (yy_more_offset) >= YYLMAX ) \ +- YY_FATAL_ERROR( "token too large, exceeds YYLMAX" ); \ +- yy_flex_strncpy( &yytext[(yy_more_offset)], (yytext_ptr), yyleng + 1 ); \ +- yyleng += (yy_more_offset); \ +- (yy_prev_more_offset) = (yy_more_offset); \ +- (yy_more_offset) = 0; \ +- (yy_c_buf_p) = yy_cp; +- +-#define YY_NUM_RULES 49 +-#define YY_END_OF_BUFFER 50 +-/* This struct is not used in this scanner, +- but its presence is necessary. */ +-struct yy_trans_info +- { +- flex_int32_t yy_verify; +- flex_int32_t yy_nxt; +- }; +-static yyconst flex_int16_t yy_acclist[214] = +- { 0, +- 50, 48, 49, 47, 48, 49, 4, 49, 48, 49, +- 13, 48, 49, 10, 48, 49, 33, 48, 49, 48, +- 49, 48, 49, 48, 49, 48, 49, 48, 49, 34, +- 48, 49, 34, 48, 49, 48, 49, 48, 49, 33, +- 48, 49, 33, 48, 49, 33, 48, 49, 33, 48, +- 49, 33, 48, 49, 33, 48, 49, 33, 48, 49, +- 33, 48, 49, 33, 48, 49, 33, 48, 49, 47, +- 48, 49, 1, 4, 49, 48, 49, 7, 49, 6, +- 49, 7, 49, 7, 49, 1, 6, 49, 7, 49, +- 3, 49, 1, 3, 49, 17, 49, 49, 16, 17, +- +- 49, 17, 49, 47, 45, 10, 10, 10, 33, 40, +- 39, 41, 11, 12, 42, 38, 37, 34, 43, 46, +- 44, 33, 33, 28, 33, 33, 33, 33, 33, 30, +- 33, 33, 33, 33, 33, 33, 47, 1, 12, 5, +- 15, 14, 10, 10, 35, 37, 36, 33, 33, 33, +- 33, 33, 29, 33, 19, 33, 26, 33, 21, 33, +- 33, 33, 33, 2, 10, 10, 33, 33, 33, 33, +- 33, 33, 33, 31, 33, 33, 10, 10, 33, 33, +- 33, 32, 33, 18, 33, 33, 33, 27, 33, 10, +- 10, 33, 33, 33, 22, 33, 25, 33, 10, 9, +- +- 10, 10, 20, 33, 23, 33, 33, 10, 24, 33, +- 10, 8, 10 +- } ; +- +-static yyconst flex_int16_t yy_accept[152] = +- { 0, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, +- 4, 7, 9, 11, 14, 17, 20, 22, 24, 26, +- 28, 30, 33, 36, 38, 40, 43, 46, 49, 52, +- 55, 58, 61, 64, 67, 70, 73, 76, 78, 80, +- 82, 84, 86, 89, 91, 93, 96, 98, 99, 102, +- 104, 105, 106, 107, 108, 109, 110, 110, 111, 112, +- 113, 114, 115, 116, 117, 118, 119, 119, 120, 121, +- 122, 123, 124, 126, 127, 128, 129, 130, 132, 133, +- 134, 135, 136, 137, 138, 139, 139, 140, 141, 141, +- 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, +- +- 151, 152, 153, 155, 157, 159, 161, 162, 163, 164, +- 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, +- 174, 176, 177, 178, 179, 180, 181, 182, 184, 186, +- 187, 188, 190, 191, 192, 193, 194, 195, 197, 199, +- 200, 202, 203, 205, 207, 208, 209, 211, 212, 214, +- 214 +- } ; +- +-static yyconst flex_int32_t yy_ec[256] = +- { 0, +- 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 4, 5, 6, 7, 1, 8, 9, 10, 1, +- 1, 11, 12, 1, 13, 14, 15, 16, 17, 17, +- 17, 17, 17, 17, 17, 17, 17, 1, 1, 18, +- 19, 20, 1, 9, 21, 21, 21, 21, 22, 23, +- 21, 21, 24, 21, 21, 25, 21, 26, 21, 21, +- 21, 27, 28, 29, 21, 21, 21, 21, 21, 21, +- 1, 30, 1, 1, 31, 1, 32, 33, 34, 35, +- +- 36, 37, 38, 39, 40, 21, 21, 41, 21, 42, +- 43, 44, 21, 45, 46, 47, 48, 21, 49, 50, +- 21, 21, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1 +- } ; +- +-static yyconst flex_int32_t yy_meta[51] = +- { 0, +- 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 3, 1, 4, 4, 1, 1, 1, +- 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, +- 3, 4, 4, 4, 4, 4, 4, 3, 3, 3, +- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 +- } ; +- +-static yyconst flex_int16_t yy_base[159] = +- { 0, +- 0, 49, 51, 54, 221, 57, 60, 64, 223, 225, +- 69, 225, 203, 225, 51, 0, 0, 202, 201, 200, +- 64, 68, 72, 72, 199, 174, 57, 166, 55, 173, +- 171, 166, 165, 166, 171, 99, 225, 93, 225, 225, +- 194, 107, 225, 193, 225, 225, 225, 225, 225, 71, +- 93, 225, 0, 183, 178, 0, 195, 225, 225, 225, +- 225, 225, 225, 225, 89, 107, 0, 225, 225, 225, +- 161, 169, 0, 155, 160, 157, 154, 151, 150, 151, +- 150, 146, 153, 123, 225, 177, 188, 225, 126, 187, +- 225, 225, 164, 159, 225, 100, 0, 146, 145, 149, +- +- 138, 151, 0, 0, 0, 0, 59, 146, 140, 177, +- 225, 157, 147, 141, 144, 130, 138, 126, 130, 137, +- 0, 134, 165, 143, 133, 112, 109, 0, 0, 102, +- 92, 0, 130, 112, 93, 98, 101, 0, 0, 125, +- 124, 94, 0, 0, 78, 59, 0, 61, 0, 225, +- 141, 145, 149, 151, 155, 51, 159, 163 +- } ; +- +-static yyconst flex_int16_t yy_def[159] = +- { 0, +- 150, 1, 151, 151, 151, 151, 152, 152, 150, 150, +- 150, 150, 150, 150, 153, 154, 155, 150, 150, 150, +- 150, 150, 150, 150, 150, 154, 154, 154, 154, 154, +- 154, 154, 154, 154, 154, 150, 150, 150, 150, 150, +- 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +- 150, 150, 153, 153, 153, 154, 150, 150, 150, 150, +- 150, 150, 150, 150, 150, 150, 156, 150, 150, 150, +- 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, +- 154, 154, 154, 150, 150, 150, 157, 150, 150, 157, +- 150, 150, 153, 153, 150, 150, 156, 154, 154, 154, +- +- 154, 154, 154, 154, 154, 154, 154, 154, 154, 157, +- 150, 153, 153, 154, 154, 154, 154, 154, 154, 154, +- 154, 154, 153, 153, 154, 154, 154, 154, 154, 154, +- 154, 154, 158, 153, 154, 154, 154, 154, 154, 158, +- 158, 153, 154, 154, 154, 153, 154, 153, 153, 0, +- 150, 150, 150, 150, 150, 150, 150, 150 +- } ; +- +-static yyconst flex_int16_t yy_nxt[276] = +- { 0, +- 10, 11, 12, 11, 13, 14, 15, 10, 16, 17, +- 18, 19, 20, 10, 21, 22, 23, 24, 10, 25, +- 16, 16, 16, 16, 16, 16, 16, 16, 16, 10, +- 16, 16, 26, 16, 27, 28, 29, 16, 16, 30, +- 16, 31, 16, 32, 16, 33, 34, 16, 35, 16, +- 36, 37, 36, 40, 97, 42, 43, 42, 42, 46, +- 42, 41, 48, 38, 41, 49, 48, 149, 44, 49, +- 51, 44, 51, 54, 61, 64, 91, 55, 62, 64, +- 148, 65, 63, 66, 66, 65, 75, 66, 66, 50, +- 68, 69, 72, 50, 51, 76, 51, 77, 119, 73, +- +- 84, 85, 84, 61, 96, 96, 120, 87, 89, 85, +- 89, 63, 92, 86, 64, 96, 96, 67, 147, 146, +- 65, 86, 66, 66, 84, 85, 84, 89, 85, 89, +- 141, 141, 145, 144, 143, 142, 141, 86, 139, 138, +- 86, 39, 39, 39, 39, 47, 47, 47, 47, 53, +- 137, 53, 53, 56, 56, 57, 136, 57, 57, 110, +- 110, 110, 110, 140, 135, 140, 140, 134, 133, 132, +- 131, 130, 129, 128, 127, 126, 125, 124, 123, 111, +- 122, 121, 118, 117, 116, 115, 114, 113, 112, 111, +- 111, 90, 109, 108, 107, 106, 105, 104, 103, 102, +- +- 101, 100, 99, 98, 95, 94, 93, 90, 88, 83, +- 82, 81, 80, 79, 78, 74, 71, 70, 60, 59, +- 58, 52, 150, 45, 9, 150, 150, 150, 150, 150, +- 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +- 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +- 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +- 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +- 150, 150, 150, 150, 150 +- } ; +- +-static yyconst flex_int16_t yy_chk[276] = +- { 0, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 2, 2, 2, 3, 156, 4, 4, 4, 6, 6, +- 6, 3, 7, 2, 4, 7, 8, 148, 4, 8, +- 11, 6, 11, 15, 21, 22, 50, 15, 21, 23, +- 146, 22, 21, 22, 22, 23, 29, 23, 23, 7, +- 24, 24, 27, 8, 51, 29, 51, 29, 107, 27, +- +- 36, 36, 36, 38, 65, 65, 107, 38, 42, 42, +- 42, 38, 50, 36, 66, 96, 96, 22, 145, 142, +- 66, 42, 66, 66, 84, 84, 84, 89, 89, 89, +- 141, 140, 137, 136, 135, 134, 133, 84, 131, 130, +- 89, 151, 151, 151, 151, 152, 152, 152, 152, 153, +- 127, 153, 153, 154, 154, 155, 126, 155, 155, 157, +- 157, 157, 157, 158, 125, 158, 158, 124, 123, 122, +- 120, 119, 118, 117, 116, 115, 114, 113, 112, 110, +- 109, 108, 102, 101, 100, 99, 98, 94, 93, 90, +- 87, 86, 83, 82, 81, 80, 79, 78, 77, 76, +- +- 75, 74, 72, 71, 57, 55, 54, 44, 41, 35, +- 34, 33, 32, 31, 30, 28, 26, 25, 20, 19, +- 18, 13, 9, 5, 150, 150, 150, 150, 150, 150, +- 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +- 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +- 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +- 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +- 150, 150, 150, 150, 150 +- } ; +- +-/* Table of booleans, true if rule could match eol. */ +-static yyconst flex_int32_t yy_rule_can_match_eol[50] = +- { 0, +-1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; +- +-extern int yy_flex_debug; +-int yy_flex_debug = 0; +- +-static yy_state_type *yy_state_buf=0, *yy_state_ptr=0; +-static char *yy_full_match; +-static int yy_lp; +-#define REJECT \ +-{ \ +-*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ \ +-yy_cp = (yy_full_match); /* restore poss. backed-over text */ \ +-++(yy_lp); \ +-goto find_rule; \ +-} +- +-static int yy_more_offset = 0; +-static int yy_prev_more_offset = 0; +-#define yymore() ((yy_more_offset) = yy_flex_strlen( yytext )) +-#define YY_NEED_STRLEN +-#define YY_MORE_ADJ 0 +-#define YY_RESTORE_YY_MORE_OFFSET \ +- { \ +- (yy_more_offset) = (yy_prev_more_offset); \ +- yyleng -= (yy_more_offset); \ +- } +-#ifndef YYLMAX +-#define YYLMAX 8192 +-#endif +- +-char yytext[YYLMAX]; +-char *yytext_ptr; +-#line 1 "goomsl_lex.l" +-#line 2 "goomsl_lex.l" +- +-#include <math.h> +-#include <stdlib.h> +-#include <string.h> +-#include "goomsl.h" +-#include "goomsl_private.h" +-#include "goomsl_yacc.h" +-void yyerror(char *); +-void yyparse(void); +- +-GoomSL *currentGoomSL; +-static int string_size; +-static char string[1024]; +- +- +- +-#line 639 "goomsl_lex.c" +- +-#define INITIAL 0 +-#define C_COMMENT 1 +-#define LINE_COMMENT 2 +-#define STRING 3 +- +-/* Special case for "unistd.h", since it is non-ANSI. We include it way +- * down here because we want the user's section 1 to have been scanned first. +- * The user has a chance to override it with an option. +- */ +-#include <unistd.h> +- +-#ifndef YY_EXTRA_TYPE +-#define YY_EXTRA_TYPE void * +-#endif +- +-/* Macros after this point can all be overridden by user definitions in +- * section 1. +- */ +- +-#ifndef YY_SKIP_YYWRAP +-#ifdef __cplusplus +-extern "C" int yywrap (void ); +-#else +-extern int yywrap (void ); +-#endif +-#endif +- +- static void yyunput (int c,char *buf_ptr ); +- +-#ifndef yytext_ptr +-static void yy_flex_strncpy (char *,yyconst char *,int ); +-#endif +- +-#ifdef YY_NEED_STRLEN +-static int yy_flex_strlen (yyconst char * ); +-#endif +- +-#ifndef YY_NO_INPUT +- +-#ifdef __cplusplus +-static int yyinput (void ); +-#else +-static int input (void ); +-#endif +- +-#endif +- +-/* Amount of stuff to slurp up with each read. */ +-#ifndef YY_READ_BUF_SIZE +-#define YY_READ_BUF_SIZE 8192 +-#endif +- +-/* Copy whatever the last rule matched to the standard output. */ +-#ifndef ECHO +-/* This used to be an fputs(), but since the string might contain NUL's, +- * we now use fwrite(). +- */ +-#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) +-#endif +- +-/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, +- * is returned in "result". +- */ +-#ifndef YY_INPUT +-#define YY_INPUT(buf,result,max_size) \ +- if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ +- { \ +- int c = '*'; \ +- size_t n; \ +- for ( n = 0; n < max_size && \ +- (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ +- buf[n] = (char) c; \ +- if ( c == '\n' ) \ +- buf[n++] = (char) c; \ +- if ( c == EOF && ferror( yyin ) ) \ +- YY_FATAL_ERROR( "input in flex scanner failed" ); \ +- result = n; \ +- } \ +- else \ +- { \ +- errno=0; \ +- while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ +- { \ +- if( errno != EINTR) \ +- { \ +- YY_FATAL_ERROR( "input in flex scanner failed" ); \ +- break; \ +- } \ +- errno=0; \ +- clearerr(yyin); \ +- } \ +- }\ +-\ +- +-#endif +- +-/* No semi-colon after return; correct usage is to write "yyterminate();" - +- * we don't want an extra ';' after the "return" because that will cause +- * some compilers to complain about unreachable statements. +- */ +-#ifndef yyterminate +-#define yyterminate() return YY_NULL +-#endif +- +-/* Number of entries by which start-condition stack grows. */ +-#ifndef YY_START_STACK_INCR +-#define YY_START_STACK_INCR 25 +-#endif +- +-/* Report a fatal error. */ +-#ifndef YY_FATAL_ERROR +-#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +-#endif +- +-/* end tables serialization structures and prototypes */ +- +-/* Default declaration of generated scanner - a define so the user can +- * easily add parameters. +- */ +-#ifndef YY_DECL +-#define YY_DECL_IS_OURS 1 +- +-extern int yylex (void); +- +-#define YY_DECL int yylex (void) +-#endif /* !YY_DECL */ +- +-/* Code executed at the beginning of each rule, after yytext and yyleng +- * have been set up. +- */ +-#ifndef YY_USER_ACTION +-#define YY_USER_ACTION +-#endif +- +-/* Code executed at the end of each rule. */ +-#ifndef YY_BREAK +-#define YY_BREAK break; +-#endif +- +-#define YY_RULE_SETUP \ +- if ( yyleng > 0 ) \ +- YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \ +- (yytext[yyleng - 1] == '\n'); \ +- YY_USER_ACTION +- +-/** The main scanner function which does all the work. +- */ +-YY_DECL +-{ +- register yy_state_type yy_current_state; +- register char *yy_cp, *yy_bp; +- register int yy_act; +- +-#line 25 "goomsl_lex.l" +- +- +-#line 797 "goomsl_lex.c" +- +- if ( (yy_init) ) +- { +- (yy_init) = 0; +- +-#ifdef YY_USER_INIT +- YY_USER_INIT; +-#endif +- +- if ( ! (yy_state_buf) ) +- (yy_state_buf) = (yy_state_type *)yyalloc(YY_BUF_SIZE + 2 ); +- +- if ( ! (yy_start) ) +- (yy_start) = 1; /* first start state */ +- +- if ( ! yyin ) +- yyin = stdin; +- +- if ( ! yyout ) +- yyout = stdout; +- +- if ( ! YY_CURRENT_BUFFER ) { +- yyensure_buffer_stack (); +- YY_CURRENT_BUFFER_LVALUE = +- yy_create_buffer(yyin,YY_BUF_SIZE ); +- } +- +- yy_load_buffer_state( ); +- } +- +- while ( 1 ) /* loops until end-of-file is reached */ +- { +- yy_cp = (yy_c_buf_p); +- +- /* Support of yytext. */ +- *yy_cp = (yy_hold_char); +- +- /* yy_bp points to the position in yy_ch_buf of the start of +- * the current run. +- */ +- yy_bp = yy_cp; +- +- yy_current_state = (yy_start); +- yy_current_state += YY_AT_BOL(); +- +- (yy_state_ptr) = (yy_state_buf); +- *(yy_state_ptr)++ = yy_current_state; +- +-yy_match: +- do +- { +- register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; +- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) +- { +- yy_current_state = (int) yy_def[yy_current_state]; +- if ( yy_current_state >= 151 ) +- yy_c = yy_meta[(unsigned int) yy_c]; +- } +- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; +- *(yy_state_ptr)++ = yy_current_state; +- ++yy_cp; +- } +- while ( yy_base[yy_current_state] != 225 ); +- +-yy_find_action: +- yy_current_state = *--(yy_state_ptr); +- (yy_lp) = yy_accept[yy_current_state]; +-find_rule: /* we branch to this label when backing up */ +- for ( ; ; ) /* until we find what rule we matched */ +- { +- if ( (yy_lp) && (yy_lp) < yy_accept[yy_current_state + 1] ) +- { +- yy_act = yy_acclist[(yy_lp)]; +- { +- (yy_full_match) = yy_cp; +- break; +- } +- } +- --yy_cp; +- yy_current_state = *--(yy_state_ptr); +- (yy_lp) = yy_accept[yy_current_state]; +- } +- +- YY_DO_BEFORE_ACTION; +- +- if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] ) +- { +- int yyl; +- for ( yyl = (yy_prev_more_offset); yyl < yyleng; ++yyl ) +- if ( yytext[yyl] == '\n' ) +- +- yylineno++; +-; +- } +- +-do_action: /* This label is used only to access EOF actions. */ +- +- switch ( yy_act ) +- { /* beginning of action switch */ +-case 1: +-/* rule 1 can match eol */ +-YY_RULE_SETUP +-#line 27 "goomsl_lex.l" +-{ ++currentGoomSL->num_lines; /* Ignore empty lines */ } +- YY_BREAK +-case 2: +-/* rule 2 can match eol */ +-YY_RULE_SETUP +-#line 28 "goomsl_lex.l" +-{ ++currentGoomSL->num_lines; /* Ignore empty lines */ } +- YY_BREAK +-case 3: +-/* rule 3 can match eol */ +-YY_RULE_SETUP +-#line 30 "goomsl_lex.l" +-{ ++currentGoomSL->num_lines; yylval.charValue=*yytext; BEGIN INITIAL; return '\n'; } +- YY_BREAK +-case 4: +-/* rule 4 can match eol */ +-YY_RULE_SETUP +-#line 31 "goomsl_lex.l" +-{ ++currentGoomSL->num_lines; yylval.charValue=*yytext; return '\n'; } +- YY_BREAK +-case 5: +-YY_RULE_SETUP +-#line 33 "goomsl_lex.l" +-{ BEGIN INITIAL; } +- YY_BREAK +-case 6: +-/* rule 6 can match eol */ +-YY_RULE_SETUP +-#line 34 "goomsl_lex.l" +-{ ++currentGoomSL->num_lines; } +- YY_BREAK +-case 7: +-YY_RULE_SETUP +-#line 35 "goomsl_lex.l" +-{ /* eat up comment */ } +- YY_BREAK +-case 8: +-YY_RULE_SETUP +-#line 37 "goomsl_lex.l" +-{ currentGoomSL->num_lines = 0; } +- YY_BREAK +-case 9: +-YY_RULE_SETUP +-#line 38 "goomsl_lex.l" +-{ currentGoomSL->num_lines = 0; printf("%s\n", yytext); } +- YY_BREAK +-case 10: +-YY_RULE_SETUP +-#line 39 "goomsl_lex.l" +-{ /* ignore preprocessor lines */ } +- YY_BREAK +-case 11: +-YY_RULE_SETUP +-#line 41 "goomsl_lex.l" +-{ BEGIN C_COMMENT; } +- YY_BREAK +-case 12: +-YY_RULE_SETUP +-#line 42 "goomsl_lex.l" +-{ BEGIN LINE_COMMENT; } +- YY_BREAK +-case 13: +-YY_RULE_SETUP +-#line 43 "goomsl_lex.l" +-{ BEGIN STRING; string_size=0; } +- YY_BREAK +-case 14: +-YY_RULE_SETUP +-#line 45 "goomsl_lex.l" +-{ string[string_size++] = '\n'; } +- YY_BREAK +-case 15: +-YY_RULE_SETUP +-#line 46 "goomsl_lex.l" +-{ string[string_size++] = '\"'; } +- YY_BREAK +-case 16: +-YY_RULE_SETUP +-#line 47 "goomsl_lex.l" +-{ /* fin de la chaine: on cree le pointeur qui va bien */ +- unsigned int tmp; +- BEGIN INITIAL; +- string[string_size]=0; +- tmp = gsl_malloc(currentGoomSL, string_size+1); +- strcpy((char*)currentGoomSL->ptrArray[tmp],string); +- sprintf(yylval.strValue, "0x%08x", tmp); +- return LTYPE_PTR; +- } +- YY_BREAK +-case 17: +-YY_RULE_SETUP +-#line 56 "goomsl_lex.l" +-{ string[string_size++] = *yytext; } +- YY_BREAK +-case 18: +-YY_RULE_SETUP +-#line 58 "goomsl_lex.l" +-{ return FLOAT_TK; } +- YY_BREAK +-case 19: +-YY_RULE_SETUP +-#line 59 "goomsl_lex.l" +-{ return INT_TK; } +- YY_BREAK +-case 20: +-YY_RULE_SETUP +-#line 60 "goomsl_lex.l" +-{ return INT_TK; } +- YY_BREAK +-case 21: +-YY_RULE_SETUP +-#line 61 "goomsl_lex.l" +-{ return PTR_TK; } +- YY_BREAK +-case 22: +-YY_RULE_SETUP +-#line 62 "goomsl_lex.l" +-{ return PTR_TK; } +- YY_BREAK +-case 23: +-YY_RULE_SETUP +-#line 63 "goomsl_lex.l" +-{ return DECLARE; } +- YY_BREAK +-case 24: +-YY_RULE_SETUP +-#line 64 "goomsl_lex.l" +-{ return EXTERNAL; } +- YY_BREAK +-case 25: +-YY_RULE_SETUP +-#line 65 "goomsl_lex.l" +-{ return STRUCT; } +- YY_BREAK +-case 26: +-YY_RULE_SETUP +-#line 66 "goomsl_lex.l" +-{ return NOT; } +- YY_BREAK +-case 27: +-YY_RULE_SETUP +-#line 67 "goomsl_lex.l" +-{ return WHILE; } +- YY_BREAK +-case 28: +-YY_RULE_SETUP +-#line 68 "goomsl_lex.l" +-{ return DO; } +- YY_BREAK +-case 29: +-YY_RULE_SETUP +-#line 69 "goomsl_lex.l" +-{ return FOR; } +- YY_BREAK +-case 30: +-YY_RULE_SETUP +-#line 70 "goomsl_lex.l" +-{ return IN; } +- YY_BREAK +-case 31: +-YY_RULE_SETUP +-#line 71 "goomsl_lex.l" +-{ strncpy(yylval.strValue, "1", 2047); return LTYPE_INTEGER; } +- YY_BREAK +-case 32: +-YY_RULE_SETUP +-#line 72 "goomsl_lex.l" +-{ strncpy(yylval.strValue, "0", 2047); return LTYPE_INTEGER; } +- YY_BREAK +-case 33: +-YY_RULE_SETUP +-#line 73 "goomsl_lex.l" +-{ strncpy(yylval.strValue, yytext, 2047); return LTYPE_VAR; } +- YY_BREAK +-case 34: +-YY_RULE_SETUP +-#line 74 "goomsl_lex.l" +-{ strncpy(yylval.strValue, yytext, 2047); return LTYPE_INTEGER; } +- YY_BREAK +-case 35: +-YY_RULE_SETUP +-#line 75 "goomsl_lex.l" +-{ sprintf(yylval.strValue, "%d", (int)yytext[1]); return LTYPE_INTEGER; } +- YY_BREAK +-case 36: +-YY_RULE_SETUP +-#line 76 "goomsl_lex.l" +-{ strncpy(yylval.strValue, yytext, 2047); return LTYPE_INTEGER; } +- YY_BREAK +-case 37: +-YY_RULE_SETUP +-#line 77 "goomsl_lex.l" +-{ strncpy(yylval.strValue, yytext, 2047); return LTYPE_FLOAT; } +- YY_BREAK +-case 38: +-YY_RULE_SETUP +-#line 78 "goomsl_lex.l" +-{ sprintf(yylval.strValue, "%3.2f", atof(yytext)/100.0f); return LTYPE_FLOAT; } +- YY_BREAK +-case 39: +-YY_RULE_SETUP +-#line 79 "goomsl_lex.l" +-{ return PLUS_EQ; } +- YY_BREAK +-case 40: +-YY_RULE_SETUP +-#line 80 "goomsl_lex.l" +-{ return MUL_EQ; } +- YY_BREAK +-case 41: +-YY_RULE_SETUP +-#line 81 "goomsl_lex.l" +-{ return SUB_EQ; } +- YY_BREAK +-case 42: +-YY_RULE_SETUP +-#line 82 "goomsl_lex.l" +-{ return DIV_EQ; } +- YY_BREAK +-case 43: +-YY_RULE_SETUP +-#line 83 "goomsl_lex.l" +-{ return LOW_EQ; } +- YY_BREAK +-case 44: +-YY_RULE_SETUP +-#line 84 "goomsl_lex.l" +-{ return SUP_EQ; } +- YY_BREAK +-case 45: +-YY_RULE_SETUP +-#line 85 "goomsl_lex.l" +-{ return NOT_EQ; } +- YY_BREAK +-case 46: +-YY_RULE_SETUP +-#line 86 "goomsl_lex.l" +-{ return NOT_EQ; } +- YY_BREAK +-case 47: +-YY_RULE_SETUP +-#line 87 "goomsl_lex.l" +-/* eat up whitespace */ +- YY_BREAK +-case 48: +-YY_RULE_SETUP +-#line 88 "goomsl_lex.l" +-{ yylval.charValue = *yytext; return *yytext; } +- YY_BREAK +-case 49: +-YY_RULE_SETUP +-#line 90 "goomsl_lex.l" +-ECHO; +- YY_BREAK +-#line 1155 "goomsl_lex.c" +- case YY_STATE_EOF(INITIAL): +- case YY_STATE_EOF(C_COMMENT): +- case YY_STATE_EOF(LINE_COMMENT): +- case YY_STATE_EOF(STRING): +- yyterminate(); +- +- case YY_END_OF_BUFFER: +- { +- /* Amount of text matched not including the EOB char. */ +- int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; +- +- /* Undo the effects of YY_DO_BEFORE_ACTION. */ +- *yy_cp = (yy_hold_char); +- YY_RESTORE_YY_MORE_OFFSET +- +- if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) +- { +- /* We're scanning a new file or input source. It's +- * possible that this happened because the user +- * just pointed yyin at a new source and called +- * yylex(). If so, then we have to assure +- * consistency between YY_CURRENT_BUFFER and our +- * globals. Here is the right place to do so, because +- * this is the first action (other than possibly a +- * back-up) that will match for the new input source. +- */ +- (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; +- YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; +- YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; +- } +- +- /* Note that here we test for yy_c_buf_p "<=" to the position +- * of the first EOB in the buffer, since yy_c_buf_p will +- * already have been incremented past the NUL character +- * (since all states make transitions on EOB to the +- * end-of-buffer state). Contrast this with the test +- * in input(). +- */ +- if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) +- { /* This was really a NUL. */ +- yy_state_type yy_next_state; +- +- (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; +- +- yy_current_state = yy_get_previous_state( ); +- +- /* Okay, we're now positioned to make the NUL +- * transition. We couldn't have +- * yy_get_previous_state() go ahead and do it +- * for us because it doesn't know how to deal +- * with the possibility of jamming (and we don't +- * want to build jamming into it because then it +- * will run more slowly). +- */ +- +- yy_next_state = yy_try_NUL_trans( yy_current_state ); +- +- yy_bp = (yytext_ptr) + YY_MORE_ADJ; +- +- if ( yy_next_state ) +- { +- /* Consume the NUL. */ +- yy_cp = ++(yy_c_buf_p); +- yy_current_state = yy_next_state; +- goto yy_match; +- } +- +- else +- { +- yy_cp = (yy_c_buf_p); +- goto yy_find_action; +- } +- } +- +- else switch ( yy_get_next_buffer( ) ) +- { +- case EOB_ACT_END_OF_FILE: +- { +- (yy_did_buffer_switch_on_eof) = 0; +- +- if ( yywrap( ) ) +- { +- /* Note: because we've taken care in +- * yy_get_next_buffer() to have set up +- * yytext, we can now set up +- * yy_c_buf_p so that if some total +- * hoser (like flex itself) wants to +- * call the scanner after we return the +- * YY_NULL, it'll still work - another +- * YY_NULL will get returned. +- */ +- (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; +- +- yy_act = YY_STATE_EOF(YY_START); +- goto do_action; +- } +- +- else +- { +- if ( ! (yy_did_buffer_switch_on_eof) ) +- YY_NEW_FILE; +- } +- break; +- } +- +- case EOB_ACT_CONTINUE_SCAN: +- (yy_c_buf_p) = +- (yytext_ptr) + yy_amount_of_matched_text; +- +- yy_current_state = yy_get_previous_state( ); +- +- yy_cp = (yy_c_buf_p); +- yy_bp = (yytext_ptr) + YY_MORE_ADJ; +- goto yy_match; +- +- case EOB_ACT_LAST_MATCH: +- (yy_c_buf_p) = +- &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; +- +- yy_current_state = yy_get_previous_state( ); +- +- yy_cp = (yy_c_buf_p); +- yy_bp = (yytext_ptr) + YY_MORE_ADJ; +- goto yy_find_action; +- } +- break; +- } +- +- default: +- YY_FATAL_ERROR( +- "fatal flex scanner internal error--no action found" ); +- } /* end of action switch */ +- } /* end of scanning one token */ +-} /* end of yylex */ +- +-/* yy_get_next_buffer - try to read in a new buffer +- * +- * Returns a code representing an action: +- * EOB_ACT_LAST_MATCH - +- * EOB_ACT_CONTINUE_SCAN - continue scanning from current position +- * EOB_ACT_END_OF_FILE - end of file +- */ +-static int yy_get_next_buffer (void) +-{ +- register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; +- register char *source = (yytext_ptr); +- register int number_to_move, i; +- int ret_val; +- +- if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) +- YY_FATAL_ERROR( +- "fatal flex scanner internal error--end of buffer missed" ); +- +- if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) +- { /* Don't try to fill the buffer, so this is an EOF. */ +- if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) +- { +- /* We matched a single character, the EOB, so +- * treat this as a final EOF. +- */ +- return EOB_ACT_END_OF_FILE; +- } +- +- else +- { +- /* We matched some text prior to the EOB, first +- * process it. +- */ +- return EOB_ACT_LAST_MATCH; +- } +- } +- +- /* Try to read more data. */ +- +- /* First move last chars to start of buffer. */ +- number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; +- +- for ( i = 0; i < number_to_move; ++i ) +- *(dest++) = *(source++); +- +- if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) +- /* don't do the read, it's not guaranteed to return an EOF, +- * just force an EOF +- */ +- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; +- +- else +- { +- size_t num_to_read = +- YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; +- +- while ( num_to_read <= 0 ) +- { /* Not enough room in the buffer - grow it. */ +- +- YY_FATAL_ERROR( +-"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); +- +- } +- +- if ( num_to_read > YY_READ_BUF_SIZE ) +- num_to_read = YY_READ_BUF_SIZE; +- +- /* Read in more data. */ +- YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), +- (yy_n_chars), num_to_read ); +- +- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); +- } +- +- if ( (yy_n_chars) == 0 ) +- { +- if ( number_to_move == YY_MORE_ADJ ) +- { +- ret_val = EOB_ACT_END_OF_FILE; +- yyrestart(yyin ); +- } +- +- else +- { +- ret_val = EOB_ACT_LAST_MATCH; +- YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = +- YY_BUFFER_EOF_PENDING; +- } +- } +- +- else +- ret_val = EOB_ACT_CONTINUE_SCAN; +- +- (yy_n_chars) += number_to_move; +- YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; +- YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; +- +- (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; +- +- return ret_val; +-} +- +-/* yy_get_previous_state - get the state just before the EOB char was reached */ +- +- static yy_state_type yy_get_previous_state (void) +-{ +- register yy_state_type yy_current_state; +- register char *yy_cp; +- +- yy_current_state = (yy_start); +- yy_current_state += YY_AT_BOL(); +- +- (yy_state_ptr) = (yy_state_buf); +- *(yy_state_ptr)++ = yy_current_state; +- +- for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) +- { +- register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); +- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) +- { +- yy_current_state = (int) yy_def[yy_current_state]; +- if ( yy_current_state >= 151 ) +- yy_c = yy_meta[(unsigned int) yy_c]; +- } +- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; +- *(yy_state_ptr)++ = yy_current_state; +- } +- +- return yy_current_state; +-} +- +-/* yy_try_NUL_trans - try to make a transition on the NUL character +- * +- * synopsis +- * next_state = yy_try_NUL_trans( current_state ); +- */ +- static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) +-{ +- register int yy_is_jam; +- +- register YY_CHAR yy_c = 1; +- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) +- { +- yy_current_state = (int) yy_def[yy_current_state]; +- if ( yy_current_state >= 151 ) +- yy_c = yy_meta[(unsigned int) yy_c]; +- } +- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; +- yy_is_jam = (yy_current_state == 150); +- if ( ! yy_is_jam ) +- *(yy_state_ptr)++ = yy_current_state; +- +- return yy_is_jam ? 0 : yy_current_state; +-} +- +- static void yyunput (int c, register char * yy_bp ) +-{ +- register char *yy_cp; +- +- yy_cp = (yy_c_buf_p); +- +- /* undo effects of setting up yytext */ +- *yy_cp = (yy_hold_char); +- +- if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) +- { /* need to shift things up to make room */ +- /* +2 for EOB chars. */ +- register int number_to_move = (yy_n_chars) + 2; +- register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ +- YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; +- register char *source = +- &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; +- +- while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) +- *--dest = *--source; +- +- yy_cp += (int) (dest - source); +- yy_bp += (int) (dest - source); +- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = +- (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; +- +- if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) +- YY_FATAL_ERROR( "flex scanner push-back overflow" ); +- } +- +- *--yy_cp = (char) c; +- +- if ( c == '\n' ){ +- --yylineno; +- } +- +- (yytext_ptr) = yy_bp; +- (yy_hold_char) = *yy_cp; +- (yy_c_buf_p) = yy_cp; +-} +- +-#ifndef YY_NO_INPUT +-#ifdef __cplusplus +- static int yyinput (void) +-#else +- static int input (void) +-#endif +- +-{ +- int c; +- +- *(yy_c_buf_p) = (yy_hold_char); +- +- if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) +- { +- /* yy_c_buf_p now points to the character we want to return. +- * If this occurs *before* the EOB characters, then it's a +- * valid NUL; if not, then we've hit the end of the buffer. +- */ +- if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) +- /* This was really a NUL. */ +- *(yy_c_buf_p) = '\0'; +- +- else +- { /* need more input */ +- int offset = (yy_c_buf_p) - (yytext_ptr); +- ++(yy_c_buf_p); +- +- switch ( yy_get_next_buffer( ) ) +- { +- case EOB_ACT_LAST_MATCH: +- /* This happens because yy_g_n_b() +- * sees that we've accumulated a +- * token and flags that we need to +- * try matching the token before +- * proceeding. But for input(), +- * there's no matching to consider. +- * So convert the EOB_ACT_LAST_MATCH +- * to EOB_ACT_END_OF_FILE. +- */ +- +- /* Reset buffer status. */ +- yyrestart(yyin ); +- +- /*FALLTHROUGH*/ +- +- case EOB_ACT_END_OF_FILE: +- { +- if ( yywrap( ) ) +- return EOF; +- +- if ( ! (yy_did_buffer_switch_on_eof) ) +- YY_NEW_FILE; +-#ifdef __cplusplus +- return yyinput(); +-#else +- return input(); +-#endif +- } +- +- case EOB_ACT_CONTINUE_SCAN: +- (yy_c_buf_p) = (yytext_ptr) + offset; +- break; +- } +- } +- } +- +- c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ +- *(yy_c_buf_p) = '\0'; /* preserve yytext */ +- (yy_hold_char) = *++(yy_c_buf_p); +- +- YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n'); +- if ( YY_CURRENT_BUFFER_LVALUE->yy_at_bol ) +- +- yylineno++; +-; +- +- return c; +-} +-#endif /* ifndef YY_NO_INPUT */ +- +-/** Immediately switch to a different input stream. +- * @param input_file A readable stream. +- * +- * @note This function does not reset the start condition to @c INITIAL . +- */ +- void yyrestart (FILE * input_file ) +-{ +- +- if ( ! YY_CURRENT_BUFFER ){ +- yyensure_buffer_stack (); +- YY_CURRENT_BUFFER_LVALUE = +- yy_create_buffer(yyin,YY_BUF_SIZE ); +- } +- +- yy_init_buffer(YY_CURRENT_BUFFER,input_file ); +- yy_load_buffer_state( ); +-} +- +-/** Switch to a different input buffer. +- * @param new_buffer The new input buffer. +- * +- */ +- void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) +-{ +- +- /* TODO. We should be able to replace this entire function body +- * with +- * yypop_buffer_state(); +- * yypush_buffer_state(new_buffer); +- */ +- yyensure_buffer_stack (); +- if ( YY_CURRENT_BUFFER == new_buffer ) +- return; +- +- if ( YY_CURRENT_BUFFER ) +- { +- /* Flush out information for old buffer. */ +- *(yy_c_buf_p) = (yy_hold_char); +- YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); +- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); +- } +- +- YY_CURRENT_BUFFER_LVALUE = new_buffer; +- yy_load_buffer_state( ); +- +- /* We don't actually know whether we did this switch during +- * EOF (yywrap()) processing, but the only time this flag +- * is looked at is after yywrap() is called, so it's safe +- * to go ahead and always set it. +- */ +- (yy_did_buffer_switch_on_eof) = 1; +-} +- +-static void yy_load_buffer_state (void) +-{ +- (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; +- (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; +- yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; +- (yy_hold_char) = *(yy_c_buf_p); +-} +- +-/** Allocate and initialize an input buffer state. +- * @param file A readable stream. +- * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. +- * +- * @return the allocated buffer state. +- */ +- YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) +-{ +- YY_BUFFER_STATE b; +- +- b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); +- if ( ! b ) +- YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); +- +- b->yy_buf_size = size; +- +- /* yy_ch_buf has to be 2 characters longer than the size given because +- * we need to put in 2 end-of-buffer characters. +- */ +- b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ); +- if ( ! b->yy_ch_buf ) +- YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); +- +- b->yy_is_our_buffer = 1; +- +- yy_init_buffer(b,file ); +- +- return b; +-} +- +-/** Destroy the buffer. +- * @param b a buffer created with yy_create_buffer() +- * +- */ +- void yy_delete_buffer (YY_BUFFER_STATE b ) +-{ +- +- if ( ! b ) +- return; +- +- if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ +- YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; +- +- if ( b->yy_is_our_buffer ) +- yyfree((void *) b->yy_ch_buf ); +- +- yyfree((void *) b ); +-} +- +-#ifndef __cplusplus +-extern int isatty (int ); +-#endif /* __cplusplus */ +- +-/* Initializes or reinitializes a buffer. +- * This function is sometimes called more than once on the same buffer, +- * such as during a yyrestart() or at EOF. +- */ +- static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) +- +-{ +- int oerrno = errno; +- +- yy_flush_buffer(b ); +- +- b->yy_input_file = file; +- b->yy_fill_buffer = 1; +- +- /* If b is the current buffer, then yy_init_buffer was _probably_ +- * called from yyrestart() or through yy_get_next_buffer. +- * In that case, we don't want to reset the lineno or column. +- */ +- if (b != YY_CURRENT_BUFFER){ +- b->yy_bs_lineno = 1; +- b->yy_bs_column = 0; +- } +- +- b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; +- +- errno = oerrno; +-} +- +-/** Discard all buffered characters. On the next scan, YY_INPUT will be called. +- * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. +- * +- */ +- void yy_flush_buffer (YY_BUFFER_STATE b ) +-{ +- if ( ! b ) +- return; +- +- b->yy_n_chars = 0; +- +- /* We always need two end-of-buffer characters. The first causes +- * a transition to the end-of-buffer state. The second causes +- * a jam in that state. +- */ +- b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; +- b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; +- +- b->yy_buf_pos = &b->yy_ch_buf[0]; +- +- b->yy_at_bol = 1; +- b->yy_buffer_status = YY_BUFFER_NEW; +- +- if ( b == YY_CURRENT_BUFFER ) +- yy_load_buffer_state( ); +-} +- +-/** Pushes the new state onto the stack. The new state becomes +- * the current state. This function will allocate the stack +- * if necessary. +- * @param new_buffer The new state. +- * +- */ +-void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) +-{ +- if (new_buffer == NULL) +- return; +- +- yyensure_buffer_stack(); +- +- /* This block is copied from yy_switch_to_buffer. */ +- if ( YY_CURRENT_BUFFER ) +- { +- /* Flush out information for old buffer. */ +- *(yy_c_buf_p) = (yy_hold_char); +- YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); +- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); +- } +- +- /* Only push if top exists. Otherwise, replace top. */ +- if (YY_CURRENT_BUFFER) +- (yy_buffer_stack_top)++; +- YY_CURRENT_BUFFER_LVALUE = new_buffer; +- +- /* copied from yy_switch_to_buffer. */ +- yy_load_buffer_state( ); +- (yy_did_buffer_switch_on_eof) = 1; +-} +- +-/** Removes and deletes the top of the stack, if present. +- * The next element becomes the new top. +- * +- */ +-void yypop_buffer_state (void) +-{ +- if (!YY_CURRENT_BUFFER) +- return; +- +- yy_delete_buffer(YY_CURRENT_BUFFER ); +- YY_CURRENT_BUFFER_LVALUE = NULL; +- if ((yy_buffer_stack_top) > 0) +- --(yy_buffer_stack_top); +- +- if (YY_CURRENT_BUFFER) { +- yy_load_buffer_state( ); +- (yy_did_buffer_switch_on_eof) = 1; +- } +-} +- +-/* Allocates the stack if it does not exist. +- * Guarantees space for at least one push. +- */ +-static void yyensure_buffer_stack (void) +-{ +- int num_to_alloc; +- +- if (!(yy_buffer_stack)) { +- +- /* First allocation is just for 2 elements, since we don't know if this +- * scanner will even need a stack. We use 2 instead of 1 to avoid an +- * immediate realloc on the next call. +- */ +- num_to_alloc = 1; +- (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc +- (num_to_alloc * sizeof(struct yy_buffer_state*) +- ); +- +- memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); +- +- (yy_buffer_stack_max) = num_to_alloc; +- (yy_buffer_stack_top) = 0; +- return; +- } +- +- if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ +- +- /* Increase the buffer to prepare for a possible push. */ +- int grow_size = 8 /* arbitrary grow size */; +- +- num_to_alloc = (yy_buffer_stack_max) + grow_size; +- (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc +- ((yy_buffer_stack), +- num_to_alloc * sizeof(struct yy_buffer_state*) +- ); +- +- /* zero only the new slots.*/ +- memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); +- (yy_buffer_stack_max) = num_to_alloc; +- } +-} +- +-/** Setup the input buffer state to scan directly from a user-specified character buffer. +- * @param base the character buffer +- * @param size the size in bytes of the character buffer +- * +- * @return the newly allocated buffer state object. +- */ +-YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) +-{ +- YY_BUFFER_STATE b; +- +- if ( size < 2 || +- base[size-2] != YY_END_OF_BUFFER_CHAR || +- base[size-1] != YY_END_OF_BUFFER_CHAR ) +- /* They forgot to leave room for the EOB's. */ +- return 0; +- +- b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); +- if ( ! b ) +- YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); +- +- b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ +- b->yy_buf_pos = b->yy_ch_buf = base; +- b->yy_is_our_buffer = 0; +- b->yy_input_file = 0; +- b->yy_n_chars = b->yy_buf_size; +- b->yy_is_interactive = 0; +- b->yy_at_bol = 1; +- b->yy_fill_buffer = 0; +- b->yy_buffer_status = YY_BUFFER_NEW; +- +- yy_switch_to_buffer(b ); +- +- return b; +-} +- +-/** Setup the input buffer state to scan a string. The next call to yylex() will +- * scan from a @e copy of @a str. +- * @param str a NUL-terminated string to scan +- * +- * @return the newly allocated buffer state object. +- * @note If you want to scan bytes that may contain NUL values, then use +- * yy_scan_bytes() instead. +- */ +-YY_BUFFER_STATE yy_scan_string (yyconst char * str ) +-{ +- +- return yy_scan_bytes(str,strlen(str) ); +-} +- +-/** Setup the input buffer state to scan the given bytes. The next call to yylex() will +- * scan from a @e copy of @a bytes. +- * @param bytes the byte buffer to scan +- * @param len the number of bytes in the buffer pointed to by @a bytes. +- * +- * @return the newly allocated buffer state object. +- */ +-YY_BUFFER_STATE yy_scan_bytes (yyconst char * bytes, int len ) +-{ +- YY_BUFFER_STATE b; +- char *buf; +- yy_size_t n; +- int i; +- +- /* Get memory for full buffer, including space for trailing EOB's. */ +- n = len + 2; +- buf = (char *) yyalloc(n ); +- if ( ! buf ) +- YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); +- +- for ( i = 0; i < len; ++i ) +- buf[i] = bytes[i]; +- +- buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; +- +- b = yy_scan_buffer(buf,n ); +- if ( ! b ) +- YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); +- +- /* It's okay to grow etc. this buffer, and we should throw it +- * away when we're done. +- */ +- b->yy_is_our_buffer = 1; +- +- return b; +-} +- +-#ifndef YY_EXIT_FAILURE +-#define YY_EXIT_FAILURE 2 +-#endif +- +-static void yy_fatal_error (yyconst char* msg ) +-{ +- (void) fprintf( stderr, "%s\n", msg ); +- exit( YY_EXIT_FAILURE ); +-} +- +-/* Redefine yyless() so it works in section 3 code. */ +- +-#undef yyless +-#define yyless(n) \ +- do \ +- { \ +- /* Undo effects of setting up yytext. */ \ +- int yyless_macro_arg = (n); \ +- YY_LESS_LINENO(yyless_macro_arg);\ +- yytext[yyleng] = (yy_hold_char); \ +- (yy_c_buf_p) = yytext + yyless_macro_arg; \ +- (yy_hold_char) = *(yy_c_buf_p); \ +- *(yy_c_buf_p) = '\0'; \ +- yyleng = yyless_macro_arg; \ +- } \ +- while ( 0 ) +- +-/* Accessor methods (get/set functions) to struct members. */ +- +-/** Get the current line number. +- * +- */ +-int yyget_lineno (void) +-{ +- +- return yylineno; +-} +- +-/** Get the input stream. +- * +- */ +-FILE *yyget_in (void) +-{ +- return yyin; +-} +- +-/** Get the output stream. +- * +- */ +-FILE *yyget_out (void) +-{ +- return yyout; +-} +- +-/** Get the length of the current token. +- * +- */ +-int yyget_leng (void) +-{ +- return yyleng; +-} +- +-/** Get the current token. +- * +- */ +- +-char *yyget_text (void) +-{ +- return yytext; +-} +- +-/** Set the current line number. +- * @param line_number +- * +- */ +-void yyset_lineno (int line_number ) +-{ +- +- yylineno = line_number; +-} +- +-/** Set the input stream. This does not discard the current +- * input buffer. +- * @param in_str A readable stream. +- * +- * @see yy_switch_to_buffer +- */ +-void yyset_in (FILE * in_str ) +-{ +- yyin = in_str ; +-} +- +-void yyset_out (FILE * out_str ) +-{ +- yyout = out_str ; +-} +- +-int yyget_debug (void) +-{ +- return yy_flex_debug; +-} +- +-void yyset_debug (int bdebug ) +-{ +- yy_flex_debug = bdebug ; +-} +- +-/* yylex_destroy is for both reentrant and non-reentrant scanners. */ +-int yylex_destroy (void) +-{ +- +- /* Pop the buffer stack, destroying each element. */ +- while(YY_CURRENT_BUFFER){ +- yy_delete_buffer(YY_CURRENT_BUFFER ); +- YY_CURRENT_BUFFER_LVALUE = NULL; +- yypop_buffer_state(); +- } +- +- /* Destroy the stack itself. */ +- yyfree((yy_buffer_stack) ); +- (yy_buffer_stack) = NULL; +- +- yyfree ( (yy_state_buf) ); +- +- return 0; +-} +- +-/* +- * Internal utility routines. +- */ +- +-#ifndef yytext_ptr +-static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) +-{ +- register int i; +- for ( i = 0; i < n; ++i ) +- s1[i] = s2[i]; +-} +-#endif +- +-#ifdef YY_NEED_STRLEN +-static int yy_flex_strlen (yyconst char * s ) +-{ +- register int n; +- for ( n = 0; s[n]; ++n ) +- ; +- +- return n; +-} +-#endif +- +-void *yyalloc (yy_size_t size ) +-{ +- return (void *) malloc( size ); +-} +- +-void *yyrealloc (void * ptr, yy_size_t size ) +-{ +- /* The cast to (char *) in the following accommodates both +- * implementations that use char* generic pointers, and those +- * that use void* generic pointers. It works with the latter +- * because both ANSI C and C++ allow castless assignment from +- * any pointer type to void*, and deal with argument conversions +- * as though doing an assignment. +- */ +- return (void *) realloc( (char *) ptr, size ); +-} +- +-void yyfree (void * ptr ) +-{ +- free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ +-} +- +-#define YYTABLES_NAME "yytables" +- +-#undef YY_NEW_FILE +-#undef YY_FLUSH_BUFFER +-#undef yy_set_bol +-#undef yy_new_buffer +-#undef yy_set_interactive +-#undef YY_DO_BEFORE_ACTION +- +-#ifdef YY_DECL_IS_OURS +-#undef YY_DECL_IS_OURS +-#undef YY_DECL +-#endif +-#line 90 "goomsl_lex.l" +- +- +- +- +-int yywrap(void) { return 1; yyunput(0,0); } +- +- +diff -Naur /home/d4rk/goom2k4-0/src/goomsl_lex.l /src/goomsl_lex.l +--- /home/d4rk/goom2k4-0/src/goomsl_lex.l 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goomsl_lex.l 1969-12-31 17:00:00.000000000 -0700 +@@ -1,94 +0,0 @@ +-%{ +- +-#include <math.h> +-#include <stdlib.h> +-#include <string.h> +-#include "goomsl.h" +-#include "goomsl_private.h" +-#include "goomsl_yacc.h" +-void yyerror(char *); +-void yyparse(void); +- +-GoomSL *currentGoomSL; +-static int string_size; +-static char string[1024]; +-%} +- +-DIGIT [0-9] +-XDIGIT [0-9a-f] +-ID [a-zA-Z_@&][a-zA-Z0-9_\.]* +- +-%S C_COMMENT +-%S LINE_COMMENT +-%S STRING +- +-%% +- +-<LINE_COMMENT,C_COMMENT,INITIAL>^[ \t]*\n { ++currentGoomSL->num_lines; /* Ignore empty lines */ } +-<LINE_COMMENT,C_COMMENT,INITIAL>^[ \t]*"//"[^\n]*\n { ++currentGoomSL->num_lines; /* Ignore empty lines */ } +- +-<LINE_COMMENT>\n { ++currentGoomSL->num_lines; yylval.charValue=*yytext; BEGIN INITIAL; return '\n'; } +-<INITIAL>\n { ++currentGoomSL->num_lines; yylval.charValue=*yytext; return '\n'; } +- +-<C_COMMENT>"*/" { BEGIN INITIAL; } +-<C_COMMENT>\n { ++currentGoomSL->num_lines; } +-<C_COMMENT,LINE_COMMENT>. { /* eat up comment */ } +- +-<INITIAL>"#RST_LINE#" { currentGoomSL->num_lines = 0; } +-<INITIAL>"#FILE ".*"#" { currentGoomSL->num_lines = 0; printf("%s\n", yytext); } +-<INITIAL>"#"[^\n]* { /* ignore preprocessor lines */ } +- +-<INITIAL>"/*" { BEGIN C_COMMENT; } +-<INITIAL>"//" { BEGIN LINE_COMMENT; } +-<INITIAL>\" { BEGIN STRING; string_size=0; } +- +-<STRING>"\\n" { string[string_size++] = '\n'; } +-<STRING>"\\\"" { string[string_size++] = '\"'; } +-<STRING>\" { /* fin de la chaine: on cree le pointeur qui va bien */ +- unsigned int tmp; +- BEGIN INITIAL; +- string[string_size]=0; +- tmp = gsl_malloc(currentGoomSL, string_size+1); +- strcpy((char*)currentGoomSL->ptrArray[tmp],string); +- sprintf(yylval.strValue, "0x%08x", tmp); +- return LTYPE_PTR; +- } +-<STRING>. { string[string_size++] = *yytext; } +- +-<INITIAL>"float" { return FLOAT_TK; } +-<INITIAL>"int" { return INT_TK; } +-<INITIAL>"boolean" { return INT_TK; } +-<INITIAL>"ptr" { return PTR_TK; } +-<INITIAL>"string" { return PTR_TK; } +-<INITIAL>"declare" { return DECLARE; } +-<INITIAL>"external" { return EXTERNAL; } +-<INITIAL>"struct" { return STRUCT; } +-<INITIAL>"not" { return NOT; } +-<INITIAL>"while" { return WHILE; } +-<INITIAL>"do" { return DO; } +-<INITIAL>"for" { return FOR; } +-<INITIAL>"in" { return IN; } +-<INITIAL>"true" { strncpy(yylval.strValue, "1", 2047); return LTYPE_INTEGER; } +-<INITIAL>"false" { strncpy(yylval.strValue, "0", 2047); return LTYPE_INTEGER; } +-<INITIAL>{ID} { strncpy(yylval.strValue, yytext, 2047); return LTYPE_VAR; } +-<INITIAL>{DIGIT}+ { strncpy(yylval.strValue, yytext, 2047); return LTYPE_INTEGER; } +-<INITIAL>\'.\' { sprintf(yylval.strValue, "%d", (int)yytext[1]); return LTYPE_INTEGER; } +-<INITIAL>"0x"{XDIGIT}+ { strncpy(yylval.strValue, yytext, 2047); return LTYPE_INTEGER; } +-<INITIAL>{DIGIT}+"."{DIGIT}* { strncpy(yylval.strValue, yytext, 2047); return LTYPE_FLOAT; } +-<INITIAL>{DIGIT}+"%" { sprintf(yylval.strValue, "%3.2f", atof(yytext)/100.0f); return LTYPE_FLOAT; } +-<INITIAL>"+=" { return PLUS_EQ; } +-<INITIAL>"*=" { return MUL_EQ; } +-<INITIAL>"-=" { return SUB_EQ; } +-<INITIAL>"/=" { return DIV_EQ; } +-<INITIAL>"<=" { return LOW_EQ; } +-<INITIAL>">=" { return SUP_EQ; } +-<INITIAL>"!=" { return NOT_EQ; } +-<INITIAL>"<>" { return NOT_EQ; } +-<INITIAL>[ \t]+ /* eat up whitespace */ +-<INITIAL>. { yylval.charValue = *yytext; return *yytext; } +- +-%% +- +- +-int yywrap(void) { return 1; yyunput(0,0); } +- +diff -Naur /home/d4rk/goom2k4-0/src/goomsl_private.h /src/goomsl_private.h +--- /home/d4rk/goom2k4-0/src/goomsl_private.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goomsl_private.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,251 +0,0 @@ +-#ifndef _GSL_PRIVATE_H +-#define _GSL_PRIVATE_H +- +-/* -- internal use -- */ +- +-#include "goomsl.h" +- +-#ifdef USE_JITC_X86 +-#include "jitc_x86.h" +-#endif +- +-#include "goomsl_heap.h" +- +-/* {{{ type of nodes */ +-#define EMPTY_NODE 0 +-#define CONST_INT_NODE 1 +-#define CONST_FLOAT_NODE 2 +-#define CONST_PTR_NODE 3 +-#define VAR_NODE 4 +-#define PARAM_NODE 5 +-#define READ_PARAM_NODE 6 +-#define OPR_NODE 7 +-/* }}} */ +-/* {{{ type of operations */ +-#define OPR_SET 1 +-#define OPR_IF 2 +-#define OPR_WHILE 3 +-#define OPR_BLOCK 4 +-#define OPR_ADD 5 +-#define OPR_MUL 6 +-#define OPR_EQU 7 +-#define OPR_NOT 8 +-#define OPR_LOW 9 +-#define OPR_DIV 10 +-#define OPR_SUB 11 +-#define OPR_FUNC_INTRO 12 +-#define OPR_FUNC_OUTRO 13 +-#define OPR_CALL 14 +-#define OPR_EXT_CALL 15 +-#define OPR_PLUS_EQ 16 +-#define OPR_SUB_EQ 17 +-#define OPR_MUL_EQ 18 +-#define OPR_DIV_EQ 19 +-#define OPR_CALL_EXPR 20 +-#define OPR_AFFECT_LIST 21 +-#define OPR_FOREACH 22 +-#define OPR_VAR_LIST 23 +- +-/* }}} */ +- +-typedef struct _ConstIntNodeType { /* {{{ */ +- int val; +-} ConstIntNodeType; /* }}} */ +-typedef struct _ConstFloatNodeType { /* {{{ */ +- float val; +-} ConstFloatNodeType; /* }}} */ +-typedef struct _ConstPtrNodeType { /* {{{ */ +- int id; +-} ConstPtrNodeType; /* }}} */ +-typedef struct _OprNodeType { /* {{{ */ +- int type; +- int nbOp; +- struct _NODE_TYPE *op[3]; /* maximal number of operand needed */ +- struct _NODE_TYPE *next; +-} OprNodeType; /* }}} */ +-typedef struct _NODE_TYPE { /* {{{ */ +- int type; +- char *str; +- GoomHash *vnamespace; +- int line_number; +- union { +- ConstIntNodeType constInt; +- ConstFloatNodeType constFloat; +- ConstPtrNodeType constPtr; +- OprNodeType opr; +- } unode; +-} NodeType; /* }}} */ +-typedef struct _INSTRUCTION_DATA { /* {{{ */ +- +- union { +- void *var; +- int *var_int; +- int *var_ptr; +- float *var_float; +- int jump_offset; +- struct _ExternalFunctionStruct *external_function; +- } udest; +- +- union { +- void *var; +- int *var_int; +- int *var_ptr; +- float *var_float; +- int value_int; +- int value_ptr; +- float value_float; +- } usrc; +-} InstructionData; +-/* }}} */ +-typedef struct _INSTRUCTION { /* {{{ */ +- +- int id; +- InstructionData data; +- GoomSL *parent; +- const char *name; /* name of the instruction */ +- +- char **params; /* parametres de l'instruction */ +- GoomHash **vnamespace; +- int *types; /* type des parametres de l'instruction */ +- int cur_param; +- int nb_param; +- +- int address; +- char *jump_label; +- char *nop_label; +- +- int line_number; +- +-} Instruction; +-/* }}} */ +-typedef struct _INSTRUCTION_FLOW { /* {{{ */ +- +- Instruction **instr; +- int number; +- int tabsize; +- GoomHash *labels; +-} InstructionFlow; +-/* }}} */ +-typedef struct _FAST_INSTRUCTION { /* {{{ */ +- int id; +- InstructionData data; +- Instruction *proto; +-} FastInstruction; +-/* }}} */ +-typedef struct _FastInstructionFlow { /* {{{ */ +- int number; +- FastInstruction *instr; +- void *mallocedInstr; +-} FastInstructionFlow; +-/* }}} */ +-typedef struct _ExternalFunctionStruct { /* {{{ */ +- GoomSL_ExternalFunction function; +- GoomHash *vars; +- int is_extern; +-} ExternalFunctionStruct; +-/* }}} */ +-typedef struct _Block { +- int data; +- int size; +-} Block; +-typedef struct _GSL_StructField { /* {{{ */ +- int type; +- char name[256]; +- int offsetInStruct; /* Where this field is stored... */ +-} GSL_StructField; +- /* }}} */ +-typedef struct _GSL_Struct { /* {{{ */ +- int nbFields; +- GSL_StructField *fields[64]; +- int size; +- Block iBlock[64]; +- Block fBlock[64]; +-} GSL_Struct; +- /* }}} */ +-struct _GoomSL { /* {{{ */ +- int num_lines; +- Instruction *instr; /* instruction en cours de construction */ +- +- InstructionFlow *iflow; /* flow d'instruction 'normal' */ +- FastInstructionFlow *fastiflow; /* flow d'instruction optimise */ +- +- GoomHash *vars; /* table de variables */ +- int currentNS; +- GoomHash *namespaces[16]; +- +- GoomHash *functions; /* table des fonctions externes */ +- +- GoomHeap *data_heap; /* GSL Heap-like memory space */ +- +- int nbStructID; +- GoomHash *structIDS; +- GSL_Struct **gsl_struct; +- int gsl_struct_size; +- +- int nbPtr; +- int ptrArraySize; +- void **ptrArray; +- +- int compilationOK; +-#ifdef USE_JITC_X86 +- JitcX86Env *jitc; +- JitcFunc jitc_func; +-#endif +-}; /* }}} */ +- +-extern GoomSL *currentGoomSL; +- +-Instruction *gsl_instr_init(GoomSL *parent, const char *name, int id, int nb_param, int line_number); +-void gsl_instr_add_param(Instruction *_this, char *param, int type); +-void gsl_instr_set_namespace(Instruction *_this, GoomHash *ns); +- +-void gsl_declare_task(const char *name); +-void gsl_declare_external_task(const char *name); +- +-int gsl_type_of_var(GoomHash *namespace, const char *name); +- +-void gsl_enternamespace(const char *name); +-void gsl_reenternamespace(GoomHash *ns); +-GoomHash *gsl_leavenamespace(void); +-GoomHash *gsl_find_namespace(const char *name); +- +-void gsl_commit_compilation(void); +- +-/* #define TYPE_PARAM 1 */ +- +-#define FIRST_RESERVED 0x80000 +- +-#define TYPE_INTEGER 0x90001 +-#define TYPE_FLOAT 0x90002 +-#define TYPE_VAR 0x90003 +-#define TYPE_PTR 0x90004 +-#define TYPE_LABEL 0x90005 +- +-#define TYPE_OP_EQUAL 6 +-#define TYPE_IVAR 0xa0001 +-#define TYPE_FVAR 0xa0002 +-#define TYPE_PVAR 0xa0003 +-#define TYPE_SVAR 0xa0004 +- +-#define INSTR_JUMP 6 +-#define INSTR_JZERO 29 +-#define INSTR_CALL 36 +-#define INSTR_RET 37 +-#define INSTR_EXT_CALL 38 +-#define INSTR_JNZERO 40 +- +-#define INSTR_SET 0x80001 +-#define INSTR_INT 0x80002 +-#define INSTR_FLOAT 0x80003 +-#define INSTR_PTR 0x80004 +-#define INSTR_LABEL 0x80005 +-#define INSTR_ISLOWER 0x80006 +-#define INSTR_ADD 0x80007 +-#define INSTR_MUL 0x80008 +-#define INSTR_DIV 0x80009 +-#define INSTR_SUB 0x80010 +-#define INSTR_ISEQUAL 0x80011 +-#define INSTR_NOT 0x80012 +- +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/goomsl_yacc.c /src/goomsl_yacc.c +--- /home/d4rk/goom2k4-0/src/goomsl_yacc.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goomsl_yacc.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,2997 +0,0 @@ +-/* A Bison parser, made by GNU Bison 1.875. */ +- +-/* Skeleton parser for Yacc-like parsing with Bison, +- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc. +- +- 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, 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., 59 Temple Place - Suite 330, +- Boston, MA 02111-1307, USA. */ +- +-/* As a special exception, when this file is copied by Bison into a +- Bison output file, you may use that output file without restriction. +- This special exception was added by the Free Software Foundation +- in version 1.24 of Bison. */ +- +-/* Written by Richard Stallman by simplifying the original so called +- ``semantic'' parser. */ +- +-/* All symbols defined below should begin with yy or YY, to avoid +- infringing on user name space. This should be done even for local +- variables, as they might otherwise be expanded by user macros. +- There are some unavoidable exceptions within include files to +- define necessary library symbols; they are noted "INFRINGES ON +- USER NAME SPACE" below. */ +- +-/* Identify Bison output. */ +-#define YYBISON 1 +- +-/* Skeleton name. */ +-#define YYSKELETON_NAME "yacc.c" +- +-/* Pure parsers. */ +-#define YYPURE 0 +- +-/* Using locations. */ +-#define YYLSP_NEEDED 0 +- +- +- +-/* Tokens. */ +-#ifndef YYTOKENTYPE +-# define YYTOKENTYPE +- /* Put the tokens into the symbol table, so that GDB and other debuggers +- know about them. */ +- enum yytokentype { +- LTYPE_INTEGER = 258, +- LTYPE_FLOAT = 259, +- LTYPE_VAR = 260, +- LTYPE_PTR = 261, +- PTR_TK = 262, +- INT_TK = 263, +- FLOAT_TK = 264, +- DECLARE = 265, +- EXTERNAL = 266, +- WHILE = 267, +- DO = 268, +- NOT = 269, +- PLUS_EQ = 270, +- SUB_EQ = 271, +- DIV_EQ = 272, +- MUL_EQ = 273, +- SUP_EQ = 274, +- LOW_EQ = 275, +- NOT_EQ = 276, +- STRUCT = 277, +- FOR = 278, +- IN = 279 +- }; +-#endif +-#define LTYPE_INTEGER 258 +-#define LTYPE_FLOAT 259 +-#define LTYPE_VAR 260 +-#define LTYPE_PTR 261 +-#define PTR_TK 262 +-#define INT_TK 263 +-#define FLOAT_TK 264 +-#define DECLARE 265 +-#define EXTERNAL 266 +-#define WHILE 267 +-#define DO 268 +-#define NOT 269 +-#define PLUS_EQ 270 +-#define SUB_EQ 271 +-#define DIV_EQ 272 +-#define MUL_EQ 273 +-#define SUP_EQ 274 +-#define LOW_EQ 275 +-#define NOT_EQ 276 +-#define STRUCT 277 +-#define FOR 278 +-#define IN 279 +- +- +- +- +-/* Copy the first part of user declarations. */ +-#line 6 "goomsl_yacc.y" +- +- #include <stdio.h> +- #include <stdlib.h> +- #include <string.h> +- #include "goomsl.h" +- #include "goomsl_private.h" +- +-#define STRUCT_ALIGNMENT 16 +-/* #define VERBOSE */ +- +- int yylex(void); +- void yyerror(char *); +- extern GoomSL *currentGoomSL; +- +- static NodeType *nodeNew(const char *str, int type, int line_number); +- static NodeType *nodeClone(NodeType *node); +- static void nodeFreeInternals(NodeType *node); +- static void nodeFree(NodeType *node); +- +- static void commit_node(NodeType *node, int releaseIfTemp); +- static void precommit_node(NodeType *node); +- +- static NodeType *new_constInt(const char *str, int line_number); +- static NodeType *new_constFloat(const char *str, int line_number); +- static NodeType *new_constPtr(const char *str, int line_number); +- static NodeType *new_var(const char *str, int line_number); +- static NodeType *new_nop(const char *str); +- static NodeType *new_op(const char *str, int type, int nbOp); +- +- static int allocateLabel(); +- static int allocateTemp(); +- static void releaseTemp(int n); +- static void releaseAllTemps(); +- +- static int is_tmp_expr(NodeType *node) { +- if (node->str) { +- return (!strncmp(node->str,"_i_tmp_",7)) +- || (!strncmp(node->str,"_f_tmp_",7)) +- || (!strncmp(node->str,"_p_tmp",7)); +- } +- return 0; +- } +- /* pre: is_tmp_expr(node); */ +- static int get_tmp_id(NodeType *node) { return atoi((node->str)+5); } +- +- static int is_commutative_expr(int itype) +- { /* {{{ */ +- return (itype == INSTR_ADD) +- || (itype == INSTR_MUL) +- || (itype == INSTR_ISEQUAL); +- } /* }}} */ +- +- static void GSL_PUT_LABEL(char *name, int line_number) +- { /* {{{ */ +-#ifdef VERBOSE +- printf("label %s\n", name); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "label", INSTR_LABEL, 1, line_number); +- gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); +- } /* }}} */ +- static void GSL_PUT_JUMP(char *name, int line_number) +- { /* {{{ */ +-#ifdef VERBOSE +- printf("jump %s\n", name); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "jump", INSTR_JUMP, 1, line_number); +- gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); +- } /* }}} */ +- +- static void GSL_PUT_JXXX(char *name, char *iname, int instr_id, int line_number) +- { /* {{{ */ +-#ifdef VERBOSE +- printf("%s %s\n", iname, name); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, iname, instr_id, 1, line_number); +- gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); +- } /* }}} */ +- static void GSL_PUT_JZERO(char *name,int line_number) +- { /* {{{ */ +- GSL_PUT_JXXX(name,"jzero.i",INSTR_JZERO,line_number); +- } /* }}} */ +- static void GSL_PUT_JNZERO(char *name, int line_number) +- { /* {{{ */ +- GSL_PUT_JXXX(name,"jnzero.i",INSTR_JNZERO,line_number); +- } /* }}} */ +- +- /* Structures Management */ +- +-#define ALIGN_ADDR(_addr,_align) {\ +- if (_align>1) {\ +- int _dec = (_addr%_align);\ +- if (_dec != 0) _addr += _align - _dec;\ +- }} +- +- /* */ +- void gsl_prepare_struct(GSL_Struct *s, int s_align, int i_align, int f_align) +- { +- int i; +- int consumed = 0; +- int iblk=0, fblk=0; +- +- s->iBlock[0].size = 0; +- s->iBlock[0].data = 0; +- s->fBlock[0].size = 0; +- s->fBlock[0].data = 0; +- +- /* Prepare sub-struct and calculate space needed for their storage */ +- for (i = 0; i < s->nbFields; ++i) +- { +- if (s->fields[i]->type < FIRST_RESERVED) +- { +- int j=0; +- GSL_Struct *substruct = currentGoomSL->gsl_struct[s->fields[i]->type]; +- consumed += sizeof(int); /* stocke le prefix */ +- ALIGN_ADDR(consumed, s_align); +- s->fields[i]->offsetInStruct = consumed; +- gsl_prepare_struct(substruct, s_align, i_align, f_align); +- for(j=0;substruct->iBlock[j].size>0;++j) { +- s->iBlock[iblk].data = consumed + substruct->iBlock[j].data; +- s->iBlock[iblk].size = substruct->iBlock[j].size; +- iblk++; +- } +- for(j=0;substruct->fBlock[j].size>0;++j) { +- s->fBlock[fblk].data = consumed + substruct->fBlock[j].data; +- s->fBlock[fblk].size = substruct->fBlock[j].size; +- fblk++; +- } +- consumed += substruct->size; +- } +- } +- +- /* Then prepare integers */ +- ALIGN_ADDR(consumed, i_align); +- for (i = 0; i < s->nbFields; ++i) +- { +- if (s->fields[i]->type == INSTR_INT) +- { +- if (s->iBlock[iblk].size == 0) { +- s->iBlock[iblk].size = 1; +- s->iBlock[iblk].data = consumed; +- } else { +- s->iBlock[iblk].size += 1; +- } +- s->fields[i]->offsetInStruct = consumed; +- consumed += sizeof(int); +- } +- } +- +- iblk++; +- s->iBlock[iblk].size = 0; +- s->iBlock[iblk].data = 0; +- +- /* Then prepare floats */ +- ALIGN_ADDR(consumed, f_align); +- for (i = 0; i < s->nbFields; ++i) +- { +- if (s->fields[i]->type == INSTR_FLOAT) +- { +- if (s->fBlock[fblk].size == 0) { +- s->fBlock[fblk].size = 1; +- s->fBlock[fblk].data = consumed; +- } else { +- s->fBlock[fblk].size += 1; +- } +- s->fields[i]->offsetInStruct = consumed; +- consumed += sizeof(int); +- } +- } +- +- fblk++; +- s->fBlock[fblk].size = 0; +- s->fBlock[fblk].data = 0; +- +- /* Finally prepare pointers */ +- ALIGN_ADDR(consumed, i_align); +- for (i = 0; i < s->nbFields; ++i) +- { +- if (s->fields[i]->type == INSTR_PTR) +- { +- s->fields[i]->offsetInStruct = consumed; +- consumed += sizeof(int); +- } +- } +- s->size = consumed; +- } +- +- /* Returns the ID of a struct from its name */ +- int gsl_get_struct_id(const char *name) /* {{{ */ +- { +- HashValue *ret = goom_hash_get(currentGoomSL->structIDS, name); +- if (ret != NULL) return ret->i; +- return -1; +- } /* }}} */ +- +- /* Adds the definition of a struct */ +- void gsl_add_struct(const char *name, GSL_Struct *gsl_struct) /* {{{ */ +- { +- /* Prepare the struct: ie calculate internal storage format */ +- gsl_prepare_struct(gsl_struct, STRUCT_ALIGNMENT, STRUCT_ALIGNMENT, STRUCT_ALIGNMENT); +- +- /* If the struct does not already exists */ +- if (gsl_get_struct_id(name) < 0) +- { +- /* adds it */ +- int id = currentGoomSL->nbStructID++; +- goom_hash_put_int(currentGoomSL->structIDS, name, id); +- if (currentGoomSL->gsl_struct_size <= id) { +- currentGoomSL->gsl_struct_size *= 2; +- currentGoomSL->gsl_struct = (GSL_Struct**)realloc(currentGoomSL->gsl_struct, +- sizeof(GSL_Struct*) * currentGoomSL->gsl_struct_size); +- } +- currentGoomSL->gsl_struct[id] = gsl_struct; +- } +- } /* }}} */ +- +- /* Creates a field for a struct */ +- GSL_StructField *gsl_new_struct_field(const char *name, int type) +- { +- GSL_StructField *field = (GSL_StructField*)malloc(sizeof(GSL_StructField)); +- strcpy(field->name, name); +- field->type = type; +- return field; +- } +- +- /* Create as field for a struct which will be a struct itself */ +- GSL_StructField *gsl_new_struct_field_struct(const char *name, const char *type) +- { +- GSL_StructField *field = gsl_new_struct_field(name, gsl_get_struct_id(type)); +- if (field->type < 0) { +- fprintf(stderr, "ERROR: Line %d, Unknown structure: '%s'\n", +- currentGoomSL->num_lines, type); +- exit(1); +- } +- return field; +- } +- +- /* Creates a Struct */ +- GSL_Struct *gsl_new_struct(GSL_StructField *field) +- { +- GSL_Struct *s = (GSL_Struct*)malloc(sizeof(GSL_Struct)); +- s->nbFields = 1; +- s->fields[0] = field; +- return s; +- } +- +- /* Adds a field to a struct */ +- void gsl_add_struct_field(GSL_Struct *s, GSL_StructField *field) +- { +- s->fields[s->nbFields++] = field; +- } +- +- int gsl_type_of_var(GoomHash *ns, const char *name) +- { +- char type_of[256]; +- HashValue *hv; +- sprintf(type_of, "__type_of_%s", name); +- hv = goom_hash_get(ns, type_of); +- if (hv != NULL) +- return hv->i; +- fprintf(stderr, "ERROR: Unknown variable type: '%s'\n", name); +- return -1; +- } +- +- static void gsl_declare_var(GoomHash *ns, const char *name, int type, void *space) +- { +- char type_of[256]; +- if (name[0] == '@') { ns = currentGoomSL->vars; } +- +- if (space == NULL) { +- switch (type) { +- case INSTR_INT: +- case INSTR_FLOAT: +- case INSTR_PTR: +- space = goom_heap_malloc_with_alignment(currentGoomSL->data_heap, +- sizeof(int), sizeof(int)); +- break; +- case -1: +- fprintf(stderr, "What the fuck!\n"); +- exit(1); +- default: /* On a un struct_id */ +- space = goom_heap_malloc_with_alignment_prefixed(currentGoomSL->data_heap, +- currentGoomSL->gsl_struct[type]->size, STRUCT_ALIGNMENT, sizeof(int)); +- } +- } +- goom_hash_put_ptr(ns, name, (void*)space); +- sprintf(type_of, "__type_of_%s", name); +- goom_hash_put_int(ns, type_of, type); +- +- /* Ensuite le hack: on ajoute les champs en tant que variables. */ +- if (type < FIRST_RESERVED) +- { +- int i; +- GSL_Struct *gsl_struct = currentGoomSL->gsl_struct[type]; +- ((int*)space)[-1] = type; /* stockage du type dans le prefixe de structure */ +- for (i = 0; i < gsl_struct->nbFields; ++i) +- { +- char full_name[256]; +- char *cspace = (char*)space + gsl_struct->fields[i]->offsetInStruct; +- sprintf(full_name, "%s.%s", name, gsl_struct->fields[i]->name); +- gsl_declare_var(ns, full_name, gsl_struct->fields[i]->type, cspace); +- } +- } +- } +- +- /* Declare a variable which will be a struct */ +- static void gsl_struct_decl(GoomHash *namespace, const char *struct_name, const char *name) +- { +- int struct_id = gsl_get_struct_id(struct_name); +- gsl_declare_var(namespace, name, struct_id, NULL); +- } +- +- static void gsl_float_decl_global(const char *name) +- { +- gsl_declare_var(currentGoomSL->vars, name, INSTR_FLOAT, NULL); +- } +- static void gsl_int_decl_global(const char *name) +- { +- gsl_declare_var(currentGoomSL->vars, name, INSTR_INT, NULL); +- } +- static void gsl_ptr_decl_global(const char *name) +- { +- gsl_declare_var(currentGoomSL->vars, name, INSTR_PTR, NULL); +- } +- static void gsl_struct_decl_global_from_id(const char *name, int id) +- { +- gsl_declare_var(currentGoomSL->vars, name, id, NULL); +- } +- +- /* FLOAT */ +- static void gsl_float_decl_local(const char *name) +- { +- gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_FLOAT, NULL); +- } +- /* INT */ +- static void gsl_int_decl_local(const char *name) +- { +- gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_INT, NULL); +- } +- /* PTR */ +- static void gsl_ptr_decl_local(const char *name) +- { +- gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_PTR, NULL); +- } +- /* STRUCT */ +- static void gsl_struct_decl_local(const char *struct_name, const char *name) +- { +- gsl_struct_decl(currentGoomSL->namespaces[currentGoomSL->currentNS],struct_name,name); +- } +- +- +- static void commit_test2(NodeType *set,const char *type, int instr); +- static NodeType *new_call(const char *name, NodeType *affect_list); +- +- /* SETTER */ +- static NodeType *new_set(NodeType *lvalue, NodeType *expression) +- { /* {{{ */ +- NodeType *set = new_op("set", OPR_SET, 2); +- set->unode.opr.op[0] = lvalue; +- set->unode.opr.op[1] = expression; +- return set; +- } /* }}} */ +- static void commit_set(NodeType *set) +- { /* {{{ */ +- commit_test2(set,"set",INSTR_SET); +- } /* }}} */ +- +- /* PLUS_EQ */ +- static NodeType *new_plus_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ +- { +- NodeType *set = new_op("plus_eq", OPR_PLUS_EQ, 2); +- set->unode.opr.op[0] = lvalue; +- set->unode.opr.op[1] = expression; +- return set; +- } +- static void commit_plus_eq(NodeType *set) +- { +- precommit_node(set->unode.opr.op[1]); +-#ifdef VERBOSE +- printf("add %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "add", INSTR_ADD, 2, set->line_number); +- commit_node(set->unode.opr.op[0],0); +- commit_node(set->unode.opr.op[1],1); +- } /* }}} */ +- +- /* SUB_EQ */ +- static NodeType *new_sub_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ +- { +- NodeType *set = new_op("sub_eq", OPR_SUB_EQ, 2); +- set->unode.opr.op[0] = lvalue; +- set->unode.opr.op[1] = expression; +- return set; +- } +- static void commit_sub_eq(NodeType *set) +- { +- precommit_node(set->unode.opr.op[1]); +-#ifdef VERBOSE +- printf("sub %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "sub", INSTR_SUB, 2, set->line_number); +- commit_node(set->unode.opr.op[0],0); +- commit_node(set->unode.opr.op[1],1); +- } /* }}} */ +- +- /* MUL_EQ */ +- static NodeType *new_mul_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ +- { +- NodeType *set = new_op("mul_eq", OPR_MUL_EQ, 2); +- set->unode.opr.op[0] = lvalue; +- set->unode.opr.op[1] = expression; +- return set; +- } +- static void commit_mul_eq(NodeType *set) +- { +- precommit_node(set->unode.opr.op[1]); +-#ifdef VERBOSE +- printf("mul %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "mul", INSTR_MUL, 2, set->line_number); +- commit_node(set->unode.opr.op[0],0); +- commit_node(set->unode.opr.op[1],1); +- } /* }}} */ +- +- /* DIV_EQ */ +- static NodeType *new_div_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ +- { +- NodeType *set = new_op("div_eq", OPR_DIV_EQ, 2); +- set->unode.opr.op[0] = lvalue; +- set->unode.opr.op[1] = expression; +- return set; +- } +- static void commit_div_eq(NodeType *set) +- { +- precommit_node(set->unode.opr.op[1]); +-#ifdef VERBOSE +- printf("div %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "div", INSTR_DIV, 2, set->line_number); +- commit_node(set->unode.opr.op[0],0); +- commit_node(set->unode.opr.op[1],1); +- } /* }}} */ +- +- /* commodity method for add, mult, ... */ +- +- static void precommit_expr(NodeType *expr, const char *type, int instr_id) +- { /* {{{ */ +- NodeType *tmp, *tmpcpy; +- int toAdd; +- +- /* compute "left" and "right" */ +- switch (expr->unode.opr.nbOp) { +- case 2: +- precommit_node(expr->unode.opr.op[1]); +- case 1: +- precommit_node(expr->unode.opr.op[0]); +- } +- +- if (is_tmp_expr(expr->unode.opr.op[0])) { +- tmp = expr->unode.opr.op[0]; +- toAdd = 1; +- } +- else if (is_commutative_expr(instr_id) && (expr->unode.opr.nbOp==2) && is_tmp_expr(expr->unode.opr.op[1])) { +- tmp = expr->unode.opr.op[1]; +- toAdd = 0; +- } +- else { +- char stmp[256]; +- /* declare a temporary variable to store the result */ +- if (expr->unode.opr.op[0]->type == CONST_INT_NODE) { +- sprintf(stmp,"_i_tmp_%i",allocateTemp()); +- gsl_int_decl_global(stmp); +- } +- else if (expr->unode.opr.op[0]->type == CONST_FLOAT_NODE) { +- sprintf(stmp,"_f_tmp%i",allocateTemp()); +- gsl_float_decl_global(stmp); +- } +- else if (expr->unode.opr.op[0]->type == CONST_PTR_NODE) { +- sprintf(stmp,"_p_tmp%i",allocateTemp()); +- gsl_ptr_decl_global(stmp); +- } +- else { +- int type = gsl_type_of_var(expr->unode.opr.op[0]->vnamespace, expr->unode.opr.op[0]->str); +- if (type == INSTR_FLOAT) { +- sprintf(stmp,"_f_tmp_%i",allocateTemp()); +- gsl_float_decl_global(stmp); +- } +- else if (type == INSTR_PTR) { +- sprintf(stmp,"_p_tmp_%i",allocateTemp()); +- gsl_ptr_decl_global(stmp); +- } +- else if (type == INSTR_INT) { +- sprintf(stmp,"_i_tmp_%i",allocateTemp()); +- gsl_int_decl_global(stmp); +- } +- else if (type == -1) { +- fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", +- expr->line_number, expr->unode.opr.op[0]->str); +- exit(1); +- } +- else { /* type is a struct_id */ +- sprintf(stmp,"_s_tmp_%i",allocateTemp()); +- gsl_struct_decl_global_from_id(stmp,type); +- } +- } +- tmp = new_var(stmp,expr->line_number); +- +- /* set the tmp to the value of "op1" */ +- tmpcpy = nodeClone(tmp); +- commit_node(new_set(tmp,expr->unode.opr.op[0]),0); +- toAdd = 1; +- +- tmp = tmpcpy; +- } +- +- /* add op2 to tmp */ +-#ifdef VERBOSE +- if (expr->unode.opr.nbOp == 2) +- printf("%s %s %s\n", type, tmp->str, expr->unode.opr.op[toAdd]->str); +- else +- printf("%s %s\n", type, tmp->str); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, type, instr_id, expr->unode.opr.nbOp, expr->line_number); +- tmpcpy = nodeClone(tmp); +- commit_node(tmp,0); +- if (expr->unode.opr.nbOp == 2) { +- commit_node(expr->unode.opr.op[toAdd],1); +- } +- +- /* redefine the ADD node now as the computed variable */ +- nodeFreeInternals(expr); +- *expr = *tmpcpy; +- free(tmpcpy); +- } /* }}} */ +- +- static NodeType *new_expr1(const char *name, int id, NodeType *expr1) +- { /* {{{ */ +- NodeType *add = new_op(name, id, 1); +- add->unode.opr.op[0] = expr1; +- return add; +- } /* }}} */ +- +- static NodeType *new_expr2(const char *name, int id, NodeType *expr1, NodeType *expr2) +- { /* {{{ */ +- NodeType *add = new_op(name, id, 2); +- add->unode.opr.op[0] = expr1; +- add->unode.opr.op[1] = expr2; +- return add; +- } /* }}} */ +- +- /* ADD */ +- static NodeType *new_add(NodeType *expr1, NodeType *expr2) { /* {{{ */ +- return new_expr2("add", OPR_ADD, expr1, expr2); +- } +- static void precommit_add(NodeType *add) { +- precommit_expr(add,"add",INSTR_ADD); +- } /* }}} */ +- +- /* SUB */ +- static NodeType *new_sub(NodeType *expr1, NodeType *expr2) { /* {{{ */ +- return new_expr2("sub", OPR_SUB, expr1, expr2); +- } +- static void precommit_sub(NodeType *sub) { +- precommit_expr(sub,"sub",INSTR_SUB); +- } /* }}} */ +- +- /* NEG */ +- static NodeType *new_neg(NodeType *expr) { /* {{{ */ +- NodeType *zeroConst = NULL; +- if (expr->type == CONST_INT_NODE) +- zeroConst = new_constInt("0", currentGoomSL->num_lines); +- else if (expr->type == CONST_FLOAT_NODE) +- zeroConst = new_constFloat("0.0", currentGoomSL->num_lines); +- else if (expr->type == CONST_PTR_NODE) { +- fprintf(stderr, "ERROR: Line %d, Could not negate const pointer.\n", +- currentGoomSL->num_lines); +- exit(1); +- } +- else { +- int type = gsl_type_of_var(expr->vnamespace, expr->str); +- if (type == INSTR_FLOAT) +- zeroConst = new_constFloat("0.0", currentGoomSL->num_lines); +- else if (type == INSTR_PTR) { +- fprintf(stderr, "ERROR: Line %d, Could not negate pointer.\n", +- currentGoomSL->num_lines); +- exit(1); +- } +- else if (type == INSTR_INT) +- zeroConst = new_constInt("0", currentGoomSL->num_lines); +- else if (type == -1) { +- fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", +- expr->line_number, expr->unode.opr.op[0]->str); +- exit(1); +- } +- else { /* type is a struct_id */ +- fprintf(stderr, "ERROR: Line %d, Could not negate struct '%s'\n", +- expr->line_number, expr->str); +- exit(1); +- } +- } +- return new_expr2("sub", OPR_SUB, zeroConst, expr); +- } +- /* }}} */ +- +- /* MUL */ +- static NodeType *new_mul(NodeType *expr1, NodeType *expr2) { /* {{{ */ +- return new_expr2("mul", OPR_MUL, expr1, expr2); +- } +- static void precommit_mul(NodeType *mul) { +- precommit_expr(mul,"mul",INSTR_MUL); +- } /* }}} */ +- +- /* DIV */ +- static NodeType *new_div(NodeType *expr1, NodeType *expr2) { /* {{{ */ +- return new_expr2("div", OPR_DIV, expr1, expr2); +- } +- static void precommit_div(NodeType *mul) { +- precommit_expr(mul,"div",INSTR_DIV); +- } /* }}} */ +- +- /* CALL EXPRESSION */ +- static NodeType *new_call_expr(const char *name, NodeType *affect_list) { /* {{{ */ +- NodeType *call = new_call(name,affect_list); +- NodeType *node = new_expr1(name, OPR_CALL_EXPR, call); +- node->vnamespace = gsl_find_namespace(name); +- if (node->vnamespace == NULL) +- fprintf(stderr, "ERROR: Line %d, No return type for: '%s'\n", currentGoomSL->num_lines, name); +- return node; +- } +- static void precommit_call_expr(NodeType *call) { +- char stmp[256]; +- NodeType *tmp,*tmpcpy; +- int type = gsl_type_of_var(call->vnamespace, call->str); +- if (type == INSTR_FLOAT) { +- sprintf(stmp,"_f_tmp_%i",allocateTemp()); +- gsl_float_decl_global(stmp); +- } +- else if (type == INSTR_PTR) { +- sprintf(stmp,"_p_tmp_%i",allocateTemp()); +- gsl_ptr_decl_global(stmp); +- } +- else if (type == INSTR_INT) { +- sprintf(stmp,"_i_tmp_%i",allocateTemp()); +- gsl_int_decl_global(stmp); +- } +- else if (type == -1) { +- fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", +- call->line_number, call->str); +- exit(1); +- } +- else { /* type is a struct_id */ +- sprintf(stmp,"_s_tmp_%i",allocateTemp()); +- gsl_struct_decl_global_from_id(stmp,type); +- } +- tmp = new_var(stmp,call->line_number); +- commit_node(call->unode.opr.op[0],0); +- tmpcpy = nodeClone(tmp); +- commit_node(new_set(tmp,new_var(call->str,call->line_number)),0); +- +- nodeFreeInternals(call); +- *call = *tmpcpy; +- free(tmpcpy); +- } /* }}} */ +- +- static void commit_test2(NodeType *set,const char *type, int instr) +- { /* {{{ */ +- NodeType *tmp; +- char stmp[256]; +- precommit_node(set->unode.opr.op[0]); +- precommit_node(set->unode.opr.op[1]); +- tmp = set->unode.opr.op[0]; +- +- stmp[0] = 0; +- if (set->unode.opr.op[0]->type == CONST_INT_NODE) { +- sprintf(stmp,"_i_tmp_%i",allocateTemp()); +- gsl_int_decl_global(stmp); +- } +- else if (set->unode.opr.op[0]->type == CONST_FLOAT_NODE) { +- sprintf(stmp,"_f_tmp%i",allocateTemp()); +- gsl_float_decl_global(stmp); +- } +- else if (set->unode.opr.op[0]->type == CONST_PTR_NODE) { +- sprintf(stmp,"_p_tmp%i",allocateTemp()); +- gsl_ptr_decl_global(stmp); +- } +- if (stmp[0]) { +- NodeType *tmpcpy; +- tmp = new_var(stmp, set->line_number); +- tmpcpy = nodeClone(tmp); +- commit_node(new_set(tmp,set->unode.opr.op[0]),0); +- tmp = tmpcpy; +- } +- +-#ifdef VERBOSE +- printf("%s %s %s\n", type, tmp->str, set->unode.opr.op[1]->str); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, type, instr, 2, set->line_number); +- commit_node(tmp,instr!=INSTR_SET); +- commit_node(set->unode.opr.op[1],1); +- } /* }}} */ +- +- /* NOT */ +- static NodeType *new_not(NodeType *expr1) { /* {{{ */ +- return new_expr1("not", OPR_NOT, expr1); +- } +- static void commit_not(NodeType *set) +- { +- commit_node(set->unode.opr.op[0],0); +-#ifdef VERBOSE +- printf("not\n"); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "not", INSTR_NOT, 1, set->line_number); +- gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); +- } /* }}} */ +- +- /* EQU */ +- static NodeType *new_equ(NodeType *expr1, NodeType *expr2) { /* {{{ */ +- return new_expr2("isequal", OPR_EQU, expr1, expr2); +- } +- static void commit_equ(NodeType *mul) { +- commit_test2(mul,"isequal",INSTR_ISEQUAL); +- } /* }}} */ +- +- /* INF */ +- static NodeType *new_low(NodeType *expr1, NodeType *expr2) { /* {{{ */ +- return new_expr2("islower", OPR_LOW, expr1, expr2); +- } +- static void commit_low(NodeType *mul) { +- commit_test2(mul,"islower",INSTR_ISLOWER); +- } /* }}} */ +- +- /* WHILE */ +- static NodeType *new_while(NodeType *expression, NodeType *instr) { /* {{{ */ +- NodeType *node = new_op("while", OPR_WHILE, 2); +- node->unode.opr.op[0] = expression; +- node->unode.opr.op[1] = instr; +- return node; +- } +- +- static void commit_while(NodeType *node) +- { +- int lbl = allocateLabel(); +- char start_while[1024], test_while[1024]; +- sprintf(start_while, "|start_while_%d|", lbl); +- sprintf(test_while, "|test_while_%d|", lbl); +- +- GSL_PUT_JUMP(test_while,node->line_number); +- GSL_PUT_LABEL(start_while,node->line_number); +- +- /* code */ +- commit_node(node->unode.opr.op[1],0); +- +- GSL_PUT_LABEL(test_while,node->line_number); +- commit_node(node->unode.opr.op[0],0); +- GSL_PUT_JNZERO(start_while,node->line_number); +- } /* }}} */ +- +- /* FOR EACH */ +- static NodeType *new_static_foreach(NodeType *var, NodeType *var_list, NodeType *instr) { /* {{{ */ +- NodeType *node = new_op("for", OPR_FOREACH, 3); +- node->unode.opr.op[0] = var; +- node->unode.opr.op[1] = var_list; +- node->unode.opr.op[2] = instr; +- node->line_number = currentGoomSL->num_lines; +- return node; +- } +- static void commit_foreach(NodeType *node) +- { +- NodeType *cur = node->unode.opr.op[1]; +- char tmp_func[256], tmp_loop[256]; +- int lbl = allocateLabel(); +- sprintf(tmp_func, "|foreach_func_%d|", lbl); +- sprintf(tmp_loop, "|foreach_loop_%d|", lbl); +- +- GSL_PUT_JUMP(tmp_loop, node->line_number); +- GSL_PUT_LABEL(tmp_func, node->line_number); +- +- precommit_node(node->unode.opr.op[2]); +- commit_node(node->unode.opr.op[2], 0); +- +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "ret", INSTR_RET, 1, node->line_number); +- gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); +-#ifdef VERBOSE +- printf("ret\n"); +-#endif +- +- GSL_PUT_LABEL(tmp_loop, node->line_number); +- +- while (cur != NULL) +- { +- NodeType *x, *var; +- +- /* 1: x=var */ +- x = nodeClone(node->unode.opr.op[0]); +- var = nodeClone(cur->unode.opr.op[0]); +- commit_node(new_set(x, var),0); +- +- /* 2: instr */ +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "call", INSTR_CALL, 1, node->line_number); +- gsl_instr_add_param(currentGoomSL->instr, tmp_func, TYPE_LABEL); +-#ifdef VERBOSE +- printf("call %s\n", tmp_func); +-#endif +- +- /* 3: var=x */ +- x = nodeClone(node->unode.opr.op[0]); +- var = cur->unode.opr.op[0]; +- commit_node(new_set(var, x),0); +- cur = cur->unode.opr.op[1]; +- } +- nodeFree(node->unode.opr.op[0]); +- } /* }}} */ +- +- /* IF */ +- static NodeType *new_if(NodeType *expression, NodeType *instr) { /* {{{ */ +- NodeType *node = new_op("if", OPR_IF, 2); +- node->unode.opr.op[0] = expression; +- node->unode.opr.op[1] = instr; +- return node; +- } +- static void commit_if(NodeType *node) { +- +- char slab[1024]; +- sprintf(slab, "|eif%d|", allocateLabel()); +- commit_node(node->unode.opr.op[0],0); +- GSL_PUT_JZERO(slab,node->line_number); +- /* code */ +- commit_node(node->unode.opr.op[1],0); +- GSL_PUT_LABEL(slab,node->line_number); +- } /* }}} */ +- +- /* BLOCK */ +- static NodeType *new_block(NodeType *lastNode) { /* {{{ */ +- NodeType *blk = new_op("block", OPR_BLOCK, 2); +- blk->unode.opr.op[0] = new_nop("start_of_block"); +- blk->unode.opr.op[1] = lastNode; +- return blk; +- } +- static void commit_block(NodeType *node) { +- commit_node(node->unode.opr.op[0]->unode.opr.next,0); +- } /* }}} */ +- +- /* FUNCTION INTRO */ +- static NodeType *new_function_intro(const char *name) { /* {{{ */ +- char stmp[256]; +- if (strlen(name) < 200) { +- sprintf(stmp, "|__func_%s|", name); +- } +- return new_op(stmp, OPR_FUNC_INTRO, 0); +- } +- static void commit_function_intro(NodeType *node) { +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "label", INSTR_LABEL, 1, node->line_number); +- gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_LABEL); +-#ifdef VERBOSE +- printf("label %s\n", node->str); +-#endif +- } /* }}} */ +- +- /* FUNCTION OUTRO */ +- static NodeType *new_function_outro() { /* {{{ */ +- return new_op("ret", OPR_FUNC_OUTRO, 0); +- } +- static void commit_function_outro(NodeType *node) { +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "ret", INSTR_RET, 1, node->line_number); +- gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); +- releaseAllTemps(); +-#ifdef VERBOSE +- printf("ret\n"); +-#endif +- } /* }}} */ +- +- /* AFFECTATION LIST */ +- static NodeType *new_affec_list(NodeType *set, NodeType *next) /* {{{ */ +- { +- NodeType *node = new_op("affect_list", OPR_AFFECT_LIST, 2); +- node->unode.opr.op[0] = set; +- node->unode.opr.op[1] = next; +- return node; +- } +- static NodeType *new_affect_list_after(NodeType *affect_list) +- { +- NodeType *ret = NULL; +- NodeType *cur = affect_list; +- while(cur != NULL) { +- NodeType *set = cur->unode.opr.op[0]; +- NodeType *next = cur->unode.opr.op[1]; +- NodeType *lvalue = set->unode.opr.op[0]; +- NodeType *expression = set->unode.opr.op[1]; +- if ((lvalue->str[0] == '&') && (expression->type == VAR_NODE)) { +- NodeType *nset = new_set(nodeClone(expression), nodeClone(lvalue)); +- ret = new_affec_list(nset, ret); +- } +- cur = next; +- } +- return ret; +- } +- static void commit_affect_list(NodeType *node) +- { +- NodeType *cur = node; +- while(cur != NULL) { +- NodeType *set = cur->unode.opr.op[0]; +- precommit_node(set->unode.opr.op[0]); +- precommit_node(set->unode.opr.op[1]); +- cur = cur->unode.opr.op[1]; +- } +- cur = node; +- while(cur != NULL) { +- NodeType *set = cur->unode.opr.op[0]; +- commit_node(set,0); +- cur = cur->unode.opr.op[1]; +- } +- } /* }}} */ +- +- /* VAR LIST */ +- static NodeType *new_var_list(NodeType *var, NodeType *next) /* {{{ */ +- { +- NodeType *node = new_op("var_list", OPR_VAR_LIST, 2); +- node->unode.opr.op[0] = var; +- node->unode.opr.op[1] = next; +- return node; +- } +- static void commit_var_list(NodeType *node) +- { +- } /* }}} */ +- +- /* FUNCTION CALL */ +- static NodeType *new_call(const char *name, NodeType *affect_list) { /* {{{ */ +- HashValue *fval; +- fval = goom_hash_get(currentGoomSL->functions, name); +- if (!fval) { +- gsl_declare_task(name); +- fval = goom_hash_get(currentGoomSL->functions, name); +- } +- if (!fval) { +- fprintf(stderr, "ERROR: Line %d, Could not find function %s\n", currentGoomSL->num_lines, name); +- exit(1); +- return NULL; +- } +- else { +- ExternalFunctionStruct *gef = (ExternalFunctionStruct*)fval->ptr; +- if (gef->is_extern) { +- NodeType *node = new_op(name, OPR_EXT_CALL, 1); +- node->unode.opr.op[0] = affect_list; +- return node; +- } +- else { +- NodeType *node; +- char stmp[256]; +- if (strlen(name) < 200) { +- sprintf(stmp, "|__func_%s|", name); +- } +- node = new_op(stmp, OPR_CALL, 1); +- node->unode.opr.op[0] = affect_list; +- return node; +- } +- } +- } +- static void commit_ext_call(NodeType *node) { +- NodeType *alafter = new_affect_list_after(node->unode.opr.op[0]); +- commit_node(node->unode.opr.op[0],0); +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "extcall", INSTR_EXT_CALL, 1, node->line_number); +- gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_VAR); +-#ifdef VERBOSE +- printf("extcall %s\n", node->str); +-#endif +- commit_node(alafter,0); +- } +- static void commit_call(NodeType *node) { +- NodeType *alafter = new_affect_list_after(node->unode.opr.op[0]); +- commit_node(node->unode.opr.op[0],0); +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "call", INSTR_CALL, 1, node->line_number); +- gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_LABEL); +-#ifdef VERBOSE +- printf("call %s\n", node->str); +-#endif +- commit_node(alafter,0); +- } /* }}} */ +- +- /** **/ +- +- static NodeType *rootNode = 0; /* TODO: reinitialiser a chaque compilation. */ +- static NodeType *lastNode = 0; +- static NodeType *gsl_append(NodeType *curNode) { +- if (curNode == 0) return 0; /* {{{ */ +- if (lastNode) +- lastNode->unode.opr.next = curNode; +- lastNode = curNode; +- while(lastNode->unode.opr.next) lastNode = lastNode->unode.opr.next; +- if (rootNode == 0) +- rootNode = curNode; +- return curNode; +- } /* }}} */ +- +-#if 1 +- int allocateTemp() { +- return allocateLabel(); +- } +- void releaseAllTemps() {} +- void releaseTemp(int n) {} +-#else +- static int nbTemp = 0; +- static int *tempArray = 0; +- static int tempArraySize = 0; +- int allocateTemp() { /* TODO: allocateITemp, allocateFTemp */ +- int i = 0; /* {{{ */ +- if (tempArray == 0) { +- tempArraySize = 256; +- tempArray = (int*)malloc(tempArraySize * sizeof(int)); +- } +- while (1) { +- int j; +- for (j=0;j<nbTemp;++j) { +- if (tempArray[j] == i) break; +- } +- if (j == nbTemp) { +- if (nbTemp == tempArraySize) { +- tempArraySize *= 2; +- tempArray = (int*)realloc(tempArray,tempArraySize * sizeof(int)); +- } +- tempArray[nbTemp++] = i; +- return i; +- } +- i++; +- } +- } /* }}} */ +- void releaseAllTemps() { +- nbTemp = 0; /* {{{ */ +- } /* }}} */ +- void releaseTemp(int n) { +- int j; /* {{{ */ +- for (j=0;j<nbTemp;++j) { +- if (tempArray[j] == n) { +- tempArray[j] = tempArray[--nbTemp]; +- break; +- } +- } +- } /* }}} */ +-#endif +- +- static int lastLabel = 0; +- int allocateLabel() { +- return ++lastLabel; /* {{{ */ +- } /* }}} */ +- +- void gsl_commit_compilation() +- { /* {{{ */ +- commit_node(rootNode,0); +- rootNode = 0; +- lastNode = 0; +- } /* }}} */ +- +- void precommit_node(NodeType *node) +- { /* {{{ */ +- /* do here stuff for expression.. for exemple */ +- if (node->type == OPR_NODE) +- switch(node->unode.opr.type) { +- case OPR_ADD: precommit_add(node); break; +- case OPR_SUB: precommit_sub(node); break; +- case OPR_MUL: precommit_mul(node); break; +- case OPR_DIV: precommit_div(node); break; +- case OPR_CALL_EXPR: precommit_call_expr(node); break; +- } +- } /* }}} */ +- +- void commit_node(NodeType *node, int releaseIfTmp) +- { /* {{{ */ +- if (node == 0) return; +- +- switch(node->type) { +- case OPR_NODE: +- switch(node->unode.opr.type) { +- case OPR_SET: commit_set(node); break; +- case OPR_PLUS_EQ: commit_plus_eq(node); break; +- case OPR_SUB_EQ: commit_sub_eq(node); break; +- case OPR_MUL_EQ: commit_mul_eq(node); break; +- case OPR_DIV_EQ: commit_div_eq(node); break; +- case OPR_IF: commit_if(node); break; +- case OPR_WHILE: commit_while(node); break; +- case OPR_BLOCK: commit_block(node); break; +- case OPR_FUNC_INTRO: commit_function_intro(node); break; +- case OPR_FUNC_OUTRO: commit_function_outro(node); break; +- case OPR_CALL: commit_call(node); break; +- case OPR_EXT_CALL: commit_ext_call(node); break; +- case OPR_EQU: commit_equ(node); break; +- case OPR_LOW: commit_low(node); break; +- case OPR_NOT: commit_not(node); break; +- case OPR_AFFECT_LIST: commit_affect_list(node); break; +- case OPR_FOREACH: commit_foreach(node); break; +- case OPR_VAR_LIST: commit_var_list(node); break; +-#ifdef VERBOSE +- case EMPTY_NODE: printf("NOP\n"); break; +-#endif +- } +- +- commit_node(node->unode.opr.next,0); /* recursive for the moment, maybe better to do something iterative? */ +- break; +- +- case VAR_NODE: gsl_instr_set_namespace(currentGoomSL->instr, node->vnamespace); +- gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_VAR); break; +- case CONST_INT_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_INTEGER); break; +- case CONST_FLOAT_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_FLOAT); break; +- case CONST_PTR_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_PTR); break; +- } +- if (releaseIfTmp && is_tmp_expr(node)) +- releaseTemp(get_tmp_id(node)); +- +- nodeFree(node); +- } /* }}} */ +- +- NodeType *nodeNew(const char *str, int type, int line_number) { +- NodeType *node = (NodeType*)malloc(sizeof(NodeType)); /* {{{ */ +- node->type = type; +- node->str = (char*)malloc(strlen(str)+1); +- node->vnamespace = NULL; +- node->line_number = line_number; +- strcpy(node->str, str); +- return node; +- } /* }}} */ +- static NodeType *nodeClone(NodeType *node) { +- NodeType *ret = nodeNew(node->str, node->type, node->line_number); /* {{{ */ +- ret->vnamespace = node->vnamespace; +- ret->unode = node->unode; +- return ret; +- } /* }}} */ +- +- void nodeFreeInternals(NodeType *node) { +- free(node->str); /* {{{ */ +- } /* }}} */ +- +- void nodeFree(NodeType *node) { +- nodeFreeInternals(node); /* {{{ */ +- free(node); +- } /* }}} */ +- +- NodeType *new_constInt(const char *str, int line_number) { +- NodeType *node = nodeNew(str, CONST_INT_NODE, line_number); /* {{{ */ +- node->unode.constInt.val = atoi(str); +- return node; +- } /* }}} */ +- +- NodeType *new_constPtr(const char *str, int line_number) { +- NodeType *node = nodeNew(str, CONST_PTR_NODE, line_number); /* {{{ */ +- node->unode.constPtr.id = strtol(str,NULL,0); +- return node; +- } /* }}} */ +- +- NodeType *new_constFloat(const char *str, int line_number) { +- NodeType *node = nodeNew(str, CONST_FLOAT_NODE, line_number); /* {{{ */ +- node->unode.constFloat.val = atof(str); +- return node; +- } /* }}} */ +- +- NodeType *new_var(const char *str, int line_number) { +- NodeType *node = nodeNew(str, VAR_NODE, line_number); /* {{{ */ +- node->vnamespace = gsl_find_namespace(str); +- if (node->vnamespace == 0) { +- fprintf(stderr, "ERROR: Line %d, Variable not found: '%s'\n", line_number, str); +- exit(1); +- } +- return node; +- } /* }}} */ +- +- NodeType *new_nop(const char *str) { +- NodeType *node = new_op(str, EMPTY_NODE, 0); /* {{{ */ +- return node; +- } /* }}} */ +- +- NodeType *new_op(const char *str, int type, int nbOp) { +- int i; /* {{{ */ +- NodeType *node = nodeNew(str, OPR_NODE, currentGoomSL->num_lines); +- node->unode.opr.next = 0; +- node->unode.opr.type = type; +- node->unode.opr.nbOp = nbOp; +- for (i=0;i<nbOp;++i) node->unode.opr.op[i] = 0; +- return node; +- } /* }}} */ +- +- +- void gsl_declare_global_variable(int type, char *name) { +- switch(type){ +- case -1: break; +- case FLOAT_TK:gsl_float_decl_global(name);break; +- case INT_TK: gsl_int_decl_global(name);break; +- case PTR_TK: gsl_ptr_decl_global(name);break; +- default: +- { +- int id = type - 1000; +- gsl_struct_decl_global_from_id(name,id); +- } +- } +- } +- +- +- +-/* Enabling traces. */ +-#ifndef YYDEBUG +-# define YYDEBUG 0 +-#endif +- +-/* Enabling verbose error messages. */ +-#ifdef YYERROR_VERBOSE +-# undef YYERROR_VERBOSE +-# define YYERROR_VERBOSE 1 +-#else +-# define YYERROR_VERBOSE 0 +-#endif +- +-#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) +-#line 1199 "goomsl_yacc.y" +-typedef union YYSTYPE { +- int intValue; +- float floatValue; +- char charValue; +- char strValue[2048]; +- NodeType *nPtr; +- GoomHash *namespace; +- GSL_Struct *gsl_struct; +- GSL_StructField *gsl_struct_field; +- } YYSTYPE; +-/* Line 191 of yacc.c. */ +-#line 1327 "goomsl_yacc.c" +-# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +-# define YYSTYPE_IS_DECLARED 1 +-# define YYSTYPE_IS_TRIVIAL 1 +-#endif +- +- +- +-/* Copy the second part of user declarations. */ +- +- +-/* Line 214 of yacc.c. */ +-#line 1339 "goomsl_yacc.c" +- +-#if ! defined (yyoverflow) || YYERROR_VERBOSE +- +-/* The parser invokes alloca or malloc; define the necessary symbols. */ +- +-# if YYSTACK_USE_ALLOCA +-# define YYSTACK_ALLOC alloca +-# else +-# ifndef YYSTACK_USE_ALLOCA +-# if defined (alloca) || defined (_ALLOCA_H) +-# define YYSTACK_ALLOC alloca +-# else +-# ifdef __GNUC__ +-# define YYSTACK_ALLOC __builtin_alloca +-# endif +-# endif +-# endif +-# endif +- +-# ifdef YYSTACK_ALLOC +- /* Pacify GCC's `empty if-body' warning. */ +-# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) +-# else +-# if defined (__STDC__) || defined (__cplusplus) +-# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ +-# define YYSIZE_T size_t +-# endif +-# define YYSTACK_ALLOC malloc +-# define YYSTACK_FREE free +-# endif +-#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ +- +- +-#if (! defined (yyoverflow) \ +- && (! defined (__cplusplus) \ +- || (YYSTYPE_IS_TRIVIAL))) +- +-/* A type that is properly aligned for any stack member. */ +-union yyalloc +-{ +- short yyss; +- YYSTYPE yyvs; +- }; +- +-/* The size of the maximum gap between one aligned stack and the next. */ +-# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) +- +-/* The size of an array large to enough to hold all stacks, each with +- N elements. */ +-# define YYSTACK_BYTES(N) \ +- ((N) * (sizeof (short) + sizeof (YYSTYPE)) \ +- + YYSTACK_GAP_MAXIMUM) +- +-/* Copy COUNT objects from FROM to TO. The source and destination do +- not overlap. */ +-# ifndef YYCOPY +-# if 1 < __GNUC__ +-# define YYCOPY(To, From, Count) \ +- __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +-# else +-# define YYCOPY(To, From, Count) \ +- do \ +- { \ +- register YYSIZE_T yyi; \ +- for (yyi = 0; yyi < (Count); yyi++) \ +- (To)[yyi] = (From)[yyi]; \ +- } \ +- while (0) +-# endif +-# endif +- +-/* Relocate STACK from its old location to the new one. The +- local variables YYSIZE and YYSTACKSIZE give the old and new number of +- elements in the stack, and YYPTR gives the new location of the +- stack. Advance YYPTR to a properly aligned location for the next +- stack. */ +-# define YYSTACK_RELOCATE(Stack) \ +- do \ +- { \ +- YYSIZE_T yynewbytes; \ +- YYCOPY (&yyptr->Stack, Stack, yysize); \ +- Stack = &yyptr->Stack; \ +- yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ +- yyptr += yynewbytes / sizeof (*yyptr); \ +- } \ +- while (0) +- +-#endif +- +-#if defined (__STDC__) || defined (__cplusplus) +- typedef signed char yysigned_char; +-#else +- typedef short yysigned_char; +-#endif +- +-/* YYFINAL -- State number of the termination state. */ +-#define YYFINAL 3 +-/* YYLAST -- Last index in YYTABLE. */ +-#define YYLAST 229 +- +-/* YYNTOKENS -- Number of terminals. */ +-#define YYNTOKENS 42 +-/* YYNNTS -- Number of nonterminals. */ +-#define YYNNTS 30 +-/* YYNRULES -- Number of rules. */ +-#define YYNRULES 89 +-/* YYNRULES -- Number of states. */ +-#define YYNSTATES 217 +- +-/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +-#define YYUNDEFTOK 2 +-#define YYMAXUTOK 279 +- +-#define YYTRANSLATE(YYX) \ +- ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) +- +-/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +-static const unsigned char yytranslate[] = +-{ +- 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 25, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 35, 36, 32, 29, 34, 30, 2, 31, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 33, 2, +- 27, 26, 28, 37, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 40, 2, 41, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 38, 2, 39, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, +- 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, +- 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 +-}; +- +-#if YYDEBUG +-/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in +- YYRHS. */ +-static const unsigned short yyprhs[] = +-{ +- 0, 0, 3, 7, 10, 19, 30, 39, 50, 53, +- 56, 57, 65, 68, 73, 76, 79, 82, 85, 87, +- 89, 90, 93, 96, 99, 102, 104, 108, 111, 112, +- 116, 122, 130, 131, 132, 137, 142, 147, 152, 154, +- 157, 160, 163, 166, 169, 172, 179, 186, 193, 195, +- 199, 203, 207, 211, 218, 222, 224, 227, 231, 232, +- 234, 236, 240, 244, 248, 252, 255, 259, 261, 265, +- 269, 273, 277, 281, 285, 288, 290, 292, 294, 298, +- 304, 310, 318, 323, 330, 333, 335, 340, 344, 346 +-}; +- +-/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +-static const yysigned_char yyrhs[] = +-{ +- 43, 0, -1, 44, 55, 52, -1, 44, 59, -1, +- 44, 11, 27, 48, 28, 50, 25, 56, -1, 44, +- 11, 27, 48, 33, 51, 28, 50, 25, 56, -1, +- 44, 10, 27, 49, 28, 50, 25, 56, -1, 44, +- 10, 27, 49, 33, 51, 28, 50, 25, 56, -1, +- 44, 45, -1, 44, 25, -1, -1, 22, 27, 5, +- 33, 46, 28, 25, -1, 71, 47, -1, 46, 34, +- 71, 47, -1, 8, 5, -1, 9, 5, -1, 7, +- 5, -1, 5, 5, -1, 5, -1, 5, -1, -1, +- 33, 8, -1, 33, 9, -1, 33, 7, -1, 33, +- 5, -1, 58, -1, 58, 34, 51, -1, 52, 53, +- -1, -1, 54, 44, 55, -1, 27, 49, 28, 50, +- 25, -1, 27, 49, 33, 51, 28, 50, 25, -1, +- -1, -1, 9, 5, 26, 64, -1, 8, 5, 26, +- 64, -1, 7, 5, 26, 64, -1, 5, 5, 26, +- 64, -1, 58, -1, 9, 5, -1, 8, 5, -1, +- 7, 5, -1, 5, 5, -1, 62, 25, -1, 57, +- 25, -1, 35, 65, 36, 37, 71, 59, -1, 12, +- 65, 71, 13, 71, 59, -1, 38, 25, 63, 44, +- 39, 25, -1, 67, -1, 5, 15, 64, -1, 5, +- 16, 64, -1, 5, 18, 64, -1, 5, 17, 64, +- -1, 23, 5, 24, 60, 13, 59, -1, 35, 61, +- 36, -1, 5, -1, 5, 61, -1, 5, 26, 64, +- -1, -1, 5, -1, 66, -1, 64, 32, 64, -1, +- 64, 31, 64, -1, 64, 29, 64, -1, 64, 30, +- 64, -1, 30, 64, -1, 35, 64, 36, -1, 68, +- -1, 64, 26, 64, -1, 64, 27, 64, -1, 64, +- 28, 64, -1, 64, 19, 64, -1, 64, 20, 64, +- -1, 64, 21, 64, -1, 14, 65, -1, 4, -1, +- 3, -1, 6, -1, 49, 25, 56, -1, 49, 33, +- 69, 25, 56, -1, 40, 49, 41, 25, 56, -1, +- 40, 49, 33, 69, 41, 25, 56, -1, 40, 49, +- 56, 41, -1, 40, 49, 33, 69, 41, 56, -1, +- 70, 69, -1, 70, -1, 5, 26, 56, 64, -1, +- 33, 56, 64, -1, 25, -1, -1 +-}; +- +-/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +-static const unsigned short yyrline[] = +-{ +- 0, 1236, 1236, 1238, 1239, 1240, 1241, 1242, 1243, 1244, +- 1245, 1250, 1253, 1254, 1257, 1258, 1259, 1260, 1265, 1267, +- 1270, 1271, 1272, 1273, 1274, 1277, 1278, 1283, 1284, 1287, +- 1289, 1291, 1294, 1296, 1300, 1301, 1302, 1303, 1304, 1307, +- 1308, 1309, 1310, 1315, 1316, 1317, 1318, 1319, 1320, 1321, +- 1322, 1323, 1324, 1325, 1328, 1330, 1331, 1334, 1336, 1339, +- 1340, 1341, 1342, 1343, 1344, 1345, 1346, 1347, 1350, 1351, +- 1352, 1353, 1354, 1355, 1356, 1359, 1360, 1361, 1366, 1367, +- 1368, 1369, 1373, 1374, 1377, 1378, 1380, 1384, 1393, 1393 +-}; +-#endif +- +-#if YYDEBUG || YYERROR_VERBOSE +-/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. +- First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +-static const char *const yytname[] = +-{ +- "$end", "error", "$undefined", "LTYPE_INTEGER", "LTYPE_FLOAT", +- "LTYPE_VAR", "LTYPE_PTR", "PTR_TK", "INT_TK", "FLOAT_TK", "DECLARE", +- "EXTERNAL", "WHILE", "DO", "NOT", "PLUS_EQ", "SUB_EQ", "DIV_EQ", +- "MUL_EQ", "SUP_EQ", "LOW_EQ", "NOT_EQ", "STRUCT", "FOR", "IN", "'\\n'", +- "'='", "'<'", "'>'", "'+'", "'-'", "'/'", "'*'", "':'", "','", "'('", +- "')'", "'?'", "'{'", "'}'", "'['", "']'", "$accept", "gsl", "gsl_code", +- "struct_declaration", "struct_members", "struct_member", +- "ext_task_name", "task_name", "return_type", "arglist", +- "gsl_def_functions", "function", "function_intro", "function_outro", +- "leave_namespace", "declaration", "empty_declaration", "instruction", +- "var_list", "var_list_content", "affectation", "start_block", +- "expression", "test", "constValue", "func_call", "func_call_expression", +- "affectation_list", "affectation_in_list", "opt_nl", 0 +-}; +-#endif +- +-# ifdef YYPRINT +-/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to +- token YYLEX-NUM. */ +-static const unsigned short yytoknum[] = +-{ +- 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, +- 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, +- 275, 276, 277, 278, 279, 10, 61, 60, 62, 43, +- 45, 47, 42, 58, 44, 40, 41, 63, 123, 125, +- 91, 93 +-}; +-# endif +- +-/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +-static const unsigned char yyr1[] = +-{ +- 0, 42, 43, 44, 44, 44, 44, 44, 44, 44, +- 44, 45, 46, 46, 47, 47, 47, 47, 48, 49, +- 50, 50, 50, 50, 50, 51, 51, 52, 52, 53, +- 54, 54, 55, 56, 57, 57, 57, 57, 57, 58, +- 58, 58, 58, 59, 59, 59, 59, 59, 59, 59, +- 59, 59, 59, 59, 60, 61, 61, 62, 63, 64, +- 64, 64, 64, 64, 64, 64, 64, 64, 65, 65, +- 65, 65, 65, 65, 65, 66, 66, 66, 67, 67, +- 67, 67, 68, 68, 69, 69, 70, 70, 71, 71 +-}; +- +-/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +-static const unsigned char yyr2[] = +-{ +- 0, 2, 3, 2, 8, 10, 8, 10, 2, 2, +- 0, 7, 2, 4, 2, 2, 2, 2, 1, 1, +- 0, 2, 2, 2, 2, 1, 3, 2, 0, 3, +- 5, 7, 0, 0, 4, 4, 4, 4, 1, 2, +- 2, 2, 2, 2, 2, 6, 6, 6, 1, 3, +- 3, 3, 3, 6, 3, 1, 2, 3, 0, 1, +- 1, 3, 3, 3, 3, 2, 3, 1, 3, 3, +- 3, 3, 3, 3, 2, 1, 1, 1, 3, 5, +- 5, 7, 4, 6, 2, 1, 4, 3, 1, 0 +-}; +- +-/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state +- STATE-NUM when YYTABLE doesn't specify something else to do. Zero +- means the default is an error. */ +-static const unsigned char yydefact[] = +-{ +- 10, 0, 32, 1, 19, 0, 0, 0, 0, 0, +- 0, 0, 0, 9, 0, 0, 0, 8, 0, 28, +- 0, 38, 3, 0, 48, 42, 0, 0, 0, 0, +- 0, 41, 40, 39, 0, 0, 76, 75, 59, 77, +- 0, 0, 0, 0, 0, 89, 60, 67, 0, 0, +- 0, 58, 19, 0, 33, 0, 2, 44, 43, 0, +- 49, 50, 52, 51, 57, 0, 0, 0, 0, 18, +- 0, 74, 65, 0, 33, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, +- 10, 0, 0, 78, 0, 33, 0, 85, 0, 27, +- 10, 37, 36, 35, 34, 20, 0, 20, 0, 66, +- 0, 0, 71, 72, 73, 68, 69, 70, 63, 64, +- 62, 61, 89, 89, 0, 0, 89, 0, 0, 33, +- 33, 0, 33, 84, 0, 32, 0, 0, 0, 0, +- 0, 0, 0, 25, 0, 0, 0, 82, 0, 0, +- 0, 55, 0, 0, 0, 0, 0, 80, 0, 87, +- 79, 20, 0, 29, 24, 23, 21, 22, 33, 42, +- 41, 40, 39, 20, 0, 33, 20, 33, 46, 0, +- 89, 0, 0, 0, 0, 12, 56, 54, 53, 45, +- 47, 33, 86, 0, 0, 6, 0, 26, 4, 0, +- 83, 11, 0, 17, 16, 14, 15, 81, 30, 20, +- 33, 33, 13, 0, 7, 5, 31 +-}; +- +-/* YYDEFGOTO[NTERM-NUM]. */ +-static const short yydefgoto[] = +-{ +- -1, 1, 2, 17, 149, 185, 70, 18, 137, 142, +- 56, 99, 100, 19, 93, 20, 21, 22, 125, 152, +- 23, 90, 44, 45, 46, 24, 47, 96, 97, 86 +-}; +- +-/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing +- STATE-NUM. */ +-#define YYPACT_NINF -116 +-static const short yypact[] = +-{ +- -116, 40, 136, -116, 103, 39, 66, 68, 61, 65, +- 1, 77, 101, -116, 1, 84, 109, -116, 12, -116, +- 91, -116, -116, 97, -116, 98, 72, 72, 72, 72, +- 72, 99, 104, 113, 109, 130, -116, -116, -116, -116, +- 1, 72, 72, 109, 166, 115, -116, -116, 145, 131, +- 118, -116, -116, -24, -116, -3, 138, -116, -116, 72, +- 159, 159, 159, 159, 159, 72, 72, 72, 14, -116, +- 51, -116, 22, 102, 124, 72, 72, 72, 72, 72, +- 72, 72, 72, 72, 72, -116, 160, 139, 140, 141, +- -116, -3, 152, -116, 154, -116, 156, -3, 109, -116, +- -116, 159, 159, 159, 159, 150, 82, 150, 82, -116, +- -3, 158, 159, 159, 159, 159, 159, 159, 22, 22, +- -116, -116, 115, 115, 195, 188, 115, 88, 162, -116, +- -116, 72, -116, -116, 52, 136, 155, 177, 199, 200, +- 201, 202, 180, 175, 185, 183, 171, -116, 144, 18, +- 161, 195, 178, 144, 144, 190, 191, -116, 72, 159, +- -116, 150, 82, -116, -116, -116, -116, -116, -116, -116, +- -116, -116, -116, 150, 82, -116, 150, -116, -116, 192, +- 115, 208, 213, 214, 215, -116, -116, -116, -116, -116, +- -116, -116, 159, 196, 194, -116, 198, -116, -116, 203, +- -116, -116, 161, -116, -116, -116, -116, -116, -116, 150, +- -116, -116, -116, 204, -116, -116, -116 +-}; +- +-/* YYPGOTO[NTERM-NUM]. */ +-static const yysigned_char yypgoto[] = +-{ +- -116, -116, -68, -116, -116, 23, -116, -15, -104, -92, +- -116, -116, -116, 89, -74, -116, -88, -115, -116, 75, +- -116, -116, -16, -6, -116, -116, -116, -62, -116, -99 +-}; +- +-/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If +- positive, shift that token. If negative, reduce the rule which +- number is the opposite. If zero, do what YYDEFACT says. +- If YYTABLE_NINF, syntax error. */ +-#define YYTABLE_NINF -1 +-static const unsigned char yytable[] = +-{ +- 111, 53, 94, 144, 36, 37, 38, 39, 50, 91, +- 60, 61, 62, 63, 64, 40, 145, 92, 143, 68, +- 143, 131, 127, 148, 150, 72, 73, 154, 74, 128, +- 95, 41, 135, 178, 71, 133, 42, 54, 188, 189, +- 3, 43, 105, 101, 31, 55, 179, 106, 146, 102, +- 103, 104, 180, 83, 84, 157, 158, 193, 160, 112, +- 113, 114, 115, 116, 117, 118, 119, 120, 121, 196, +- 194, 32, 199, 33, 143, 36, 37, 38, 39, 107, +- 161, 202, 197, 134, 108, 162, 143, 138, 34, 139, +- 140, 141, 35, 4, 195, 5, 6, 7, 8, 9, +- 10, 198, 41, 200, 48, 213, 49, 42, 25, 51, +- 11, 12, 43, 13, 52, 159, 57, 207, 26, 27, +- 28, 29, 58, 14, 59, 65, 15, 155, 16, 30, +- 66, 81, 82, 83, 84, 69, 214, 215, 109, 67, +- 85, 4, 192, 5, 6, 7, 8, 9, 10, 4, +- 87, 5, 6, 7, 89, 88, 10, 110, 11, 12, +- 164, 13, 165, 166, 167, 98, 181, 12, 182, 183, +- 184, 14, 123, 122, 15, 124, 16, 129, 126, 14, +- 130, 132, 15, 136, 16, 75, 76, 77, 81, 82, +- 83, 84, 78, 79, 80, 81, 82, 83, 84, 147, +- 151, 153, 168, 156, 169, 170, 171, 172, 173, 174, +- 175, 176, 177, 203, 187, 190, 191, 201, 204, 205, +- 206, 208, 209, 210, 163, 212, 186, 0, 211, 216 +-}; +- +-static const short yycheck[] = +-{ +- 74, 16, 5, 107, 3, 4, 5, 6, 14, 33, +- 26, 27, 28, 29, 30, 14, 108, 41, 106, 34, +- 108, 95, 90, 122, 123, 41, 42, 126, 43, 91, +- 33, 30, 100, 148, 40, 97, 35, 25, 153, 154, +- 0, 40, 28, 59, 5, 33, 28, 33, 110, 65, +- 66, 67, 34, 31, 32, 129, 130, 161, 132, 75, +- 76, 77, 78, 79, 80, 81, 82, 83, 84, 173, +- 162, 5, 176, 5, 162, 3, 4, 5, 6, 28, +- 28, 180, 174, 98, 33, 33, 174, 5, 27, 7, +- 8, 9, 27, 5, 168, 7, 8, 9, 10, 11, +- 12, 175, 30, 177, 27, 209, 5, 35, 5, 25, +- 22, 23, 40, 25, 5, 131, 25, 191, 15, 16, +- 17, 18, 25, 35, 26, 26, 38, 39, 40, 26, +- 26, 29, 30, 31, 32, 5, 210, 211, 36, 26, +- 25, 5, 158, 7, 8, 9, 10, 11, 12, 5, +- 5, 7, 8, 9, 36, 24, 12, 33, 22, 23, +- 5, 25, 7, 8, 9, 27, 5, 23, 7, 8, +- 9, 35, 33, 13, 38, 35, 40, 25, 37, 35, +- 26, 25, 38, 33, 40, 19, 20, 21, 29, 30, +- 31, 32, 26, 27, 28, 29, 30, 31, 32, 41, +- 5, 13, 25, 41, 5, 5, 5, 5, 28, 34, +- 25, 28, 41, 5, 36, 25, 25, 25, 5, 5, +- 5, 25, 28, 25, 135, 202, 151, -1, 25, 25 +-}; +- +-/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing +- symbol of state STATE-NUM. */ +-static const unsigned char yystos[] = +-{ +- 0, 43, 44, 0, 5, 7, 8, 9, 10, 11, +- 12, 22, 23, 25, 35, 38, 40, 45, 49, 55, +- 57, 58, 59, 62, 67, 5, 15, 16, 17, 18, +- 26, 5, 5, 5, 27, 27, 3, 4, 5, 6, +- 14, 30, 35, 40, 64, 65, 66, 68, 27, 5, +- 65, 25, 5, 49, 25, 33, 52, 25, 25, 26, +- 64, 64, 64, 64, 64, 26, 26, 26, 49, 5, +- 48, 65, 64, 64, 49, 19, 20, 21, 26, 27, +- 28, 29, 30, 31, 32, 25, 71, 5, 24, 36, +- 63, 33, 41, 56, 5, 33, 69, 70, 27, 53, +- 54, 64, 64, 64, 64, 28, 33, 28, 33, 36, +- 33, 56, 64, 64, 64, 64, 64, 64, 64, 64, +- 64, 64, 13, 33, 35, 60, 37, 44, 69, 25, +- 26, 56, 25, 69, 49, 44, 33, 50, 5, 7, +- 8, 9, 51, 58, 50, 51, 69, 41, 71, 46, +- 71, 5, 61, 13, 71, 39, 41, 56, 56, 64, +- 56, 28, 33, 55, 5, 7, 8, 9, 25, 5, +- 5, 5, 5, 28, 34, 25, 28, 41, 59, 28, +- 34, 5, 7, 8, 9, 47, 61, 36, 59, 59, +- 25, 25, 64, 50, 51, 56, 50, 51, 56, 50, +- 56, 25, 71, 5, 5, 5, 5, 56, 25, 28, +- 25, 25, 47, 50, 56, 56, 25 +-}; +- +-#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) +-# define YYSIZE_T __SIZE_TYPE__ +-#endif +-#if ! defined (YYSIZE_T) && defined (size_t) +-# define YYSIZE_T size_t +-#endif +-#if ! defined (YYSIZE_T) +-# if defined (__STDC__) || defined (__cplusplus) +-# include <stddef.h> /* INFRINGES ON USER NAME SPACE */ +-# define YYSIZE_T size_t +-# endif +-#endif +-#if ! defined (YYSIZE_T) +-# define YYSIZE_T unsigned int +-#endif +- +-#define yyerrok (yyerrstatus = 0) +-#define yyclearin (yychar = YYEMPTY) +-#define YYEMPTY (-2) +-#define YYEOF 0 +- +-#define YYACCEPT goto yyacceptlab +-#define YYABORT goto yyabortlab +-#define YYERROR goto yyerrlab1 +- +- +-/* Like YYERROR except do call yyerror. This remains here temporarily +- to ease the transition to the new meaning of YYERROR, for GCC. +- Once GCC version 2 has supplanted version 1, this can go. */ +- +-#define YYFAIL goto yyerrlab +- +-#define YYRECOVERING() (!!yyerrstatus) +- +-#define YYBACKUP(Token, Value) \ +-do \ +- if (yychar == YYEMPTY && yylen == 1) \ +- { \ +- yychar = (Token); \ +- yylval = (Value); \ +- yytoken = YYTRANSLATE (yychar); \ +- YYPOPSTACK; \ +- goto yybackup; \ +- } \ +- else \ +- { \ +- yyerror ("syntax error: cannot back up");\ +- YYERROR; \ +- } \ +-while (0) +- +-#define YYTERROR 1 +-#define YYERRCODE 256 +- +-/* YYLLOC_DEFAULT -- Compute the default location (before the actions +- are run). */ +- +-#ifndef YYLLOC_DEFAULT +-# define YYLLOC_DEFAULT(Current, Rhs, N) \ +- Current.first_line = Rhs[1].first_line; \ +- Current.first_column = Rhs[1].first_column; \ +- Current.last_line = Rhs[N].last_line; \ +- Current.last_column = Rhs[N].last_column; +-#endif +- +-/* YYLEX -- calling `yylex' with the right arguments. */ +- +-#ifdef YYLEX_PARAM +-# define YYLEX yylex (YYLEX_PARAM) +-#else +-# define YYLEX yylex () +-#endif +- +-/* Enable debugging if requested. */ +-#if YYDEBUG +- +-# ifndef YYFPRINTF +-# include <stdio.h> /* INFRINGES ON USER NAME SPACE */ +-# define YYFPRINTF fprintf +-# endif +- +-# define YYDPRINTF(Args) \ +-do { \ +- if (yydebug) \ +- YYFPRINTF Args; \ +-} while (0) +- +-# define YYDSYMPRINT(Args) \ +-do { \ +- if (yydebug) \ +- yysymprint Args; \ +-} while (0) +- +-# define YYDSYMPRINTF(Title, Token, Value, Location) \ +-do { \ +- if (yydebug) \ +- { \ +- YYFPRINTF (stderr, "%s ", Title); \ +- yysymprint (stderr, \ +- Token, Value); \ +- YYFPRINTF (stderr, "\n"); \ +- } \ +-} while (0) +- +-/*------------------------------------------------------------------. +-| yy_stack_print -- Print the state stack from its BOTTOM up to its | +-| TOP (cinluded). | +-`------------------------------------------------------------------*/ +- +-#if defined (__STDC__) || defined (__cplusplus) +-static void +-yy_stack_print (short *bottom, short *top) +-#else +-static void +-yy_stack_print (bottom, top) +- short *bottom; +- short *top; +-#endif +-{ +- YYFPRINTF (stderr, "Stack now"); +- for (/* Nothing. */; bottom <= top; ++bottom) +- YYFPRINTF (stderr, " %d", *bottom); +- YYFPRINTF (stderr, "\n"); +-} +- +-# define YY_STACK_PRINT(Bottom, Top) \ +-do { \ +- if (yydebug) \ +- yy_stack_print ((Bottom), (Top)); \ +-} while (0) +- +- +-/*------------------------------------------------. +-| Report that the YYRULE is going to be reduced. | +-`------------------------------------------------*/ +- +-#if defined (__STDC__) || defined (__cplusplus) +-static void +-yy_reduce_print (int yyrule) +-#else +-static void +-yy_reduce_print (yyrule) +- int yyrule; +-#endif +-{ +- int yyi; +- unsigned int yylineno = yyrline[yyrule]; +- YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ", +- yyrule - 1, yylineno); +- /* Print the symbols being reduced, and their result. */ +- for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++) +- YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]); +- YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]); +-} +- +-# define YY_REDUCE_PRINT(Rule) \ +-do { \ +- if (yydebug) \ +- yy_reduce_print (Rule); \ +-} while (0) +- +-/* Nonzero means print parse trace. It is left uninitialized so that +- multiple parsers can coexist. */ +-int yydebug; +-#else /* !YYDEBUG */ +-# define YYDPRINTF(Args) +-# define YYDSYMPRINT(Args) +-# define YYDSYMPRINTF(Title, Token, Value, Location) +-# define YY_STACK_PRINT(Bottom, Top) +-# define YY_REDUCE_PRINT(Rule) +-#endif /* !YYDEBUG */ +- +- +-/* YYINITDEPTH -- initial size of the parser's stacks. */ +-#ifndef YYINITDEPTH +-# define YYINITDEPTH 200 +-#endif +- +-/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only +- if the built-in stack extension method is used). +- +- Do not make this value too large; the results are undefined if +- SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH) +- evaluated with infinite-precision integer arithmetic. */ +- +-#if YYMAXDEPTH == 0 +-# undef YYMAXDEPTH +-#endif +- +-#ifndef YYMAXDEPTH +-# define YYMAXDEPTH 10000 +-#endif +- +- +- +-#if YYERROR_VERBOSE +- +-# ifndef yystrlen +-# if defined (__GLIBC__) && defined (_STRING_H) +-# define yystrlen strlen +-# else +-/* Return the length of YYSTR. */ +-static YYSIZE_T +-# if defined (__STDC__) || defined (__cplusplus) +-yystrlen (const char *yystr) +-# else +-yystrlen (yystr) +- const char *yystr; +-# endif +-{ +- register const char *yys = yystr; +- +- while (*yys++ != '\0') +- continue; +- +- return yys - yystr - 1; +-} +-# endif +-# endif +- +-# ifndef yystpcpy +-# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) +-# define yystpcpy stpcpy +-# else +-/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in +- YYDEST. */ +-static char * +-# if defined (__STDC__) || defined (__cplusplus) +-yystpcpy (char *yydest, const char *yysrc) +-# else +-yystpcpy (yydest, yysrc) +- char *yydest; +- const char *yysrc; +-# endif +-{ +- register char *yyd = yydest; +- register const char *yys = yysrc; +- +- while ((*yyd++ = *yys++) != '\0') +- continue; +- +- return yyd - 1; +-} +-# endif +-# endif +- +-#endif /* !YYERROR_VERBOSE */ +- +- +- +-#if YYDEBUG +-/*--------------------------------. +-| Print this symbol on YYOUTPUT. | +-`--------------------------------*/ +- +-#if defined (__STDC__) || defined (__cplusplus) +-static void +-yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep) +-#else +-static void +-yysymprint (yyoutput, yytype, yyvaluep) +- FILE *yyoutput; +- int yytype; +- YYSTYPE *yyvaluep; +-#endif +-{ +- /* Pacify ``unused variable'' warnings. */ +- (void) yyvaluep; +- +- if (yytype < YYNTOKENS) +- { +- YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); +-# ifdef YYPRINT +- YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +-# endif +- } +- else +- YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); +- +- switch (yytype) +- { +- default: +- break; +- } +- YYFPRINTF (yyoutput, ")"); +-} +- +-#endif /* ! YYDEBUG */ +-/*-----------------------------------------------. +-| Release the memory associated to this symbol. | +-`-----------------------------------------------*/ +- +-#if defined (__STDC__) || defined (__cplusplus) +-static void +-yydestruct (int yytype, YYSTYPE *yyvaluep) +-#else +-static void +-yydestruct (yytype, yyvaluep) +- int yytype; +- YYSTYPE *yyvaluep; +-#endif +-{ +- /* Pacify ``unused variable'' warnings. */ +- (void) yyvaluep; +- +- switch (yytype) +- { +- +- default: +- break; +- } +-} +- +- +-/* Prevent warnings from -Wmissing-prototypes. */ +- +-#ifdef YYPARSE_PARAM +-# if defined (__STDC__) || defined (__cplusplus) +-int yyparse (void *YYPARSE_PARAM); +-# else +-int yyparse (); +-# endif +-#else /* ! YYPARSE_PARAM */ +-#if defined (__STDC__) || defined (__cplusplus) +-int yyparse (void); +-#else +-int yyparse (); +-#endif +-#endif /* ! YYPARSE_PARAM */ +- +- +- +-/* The lookahead symbol. */ +-int yychar; +- +-/* The semantic value of the lookahead symbol. */ +-YYSTYPE yylval; +- +-/* Number of syntax errors so far. */ +-int yynerrs; +- +- +- +-/*----------. +-| yyparse. | +-`----------*/ +- +-#ifdef YYPARSE_PARAM +-# if defined (__STDC__) || defined (__cplusplus) +-int yyparse (void *YYPARSE_PARAM) +-# else +-int yyparse (YYPARSE_PARAM) +- void *YYPARSE_PARAM; +-# endif +-#else /* ! YYPARSE_PARAM */ +-#if defined (__STDC__) || defined (__cplusplus) +-int +-yyparse (void) +-#else +-int +-yyparse () +- +-#endif +-#endif +-{ +- +- register int yystate; +- register int yyn; +- int yyresult; +- /* Number of tokens to shift before error messages enabled. */ +- int yyerrstatus; +- /* Lookahead token as an internal (translated) token number. */ +- int yytoken = 0; +- +- /* Three stacks and their tools: +- `yyss': related to states, +- `yyvs': related to semantic values, +- `yyls': related to locations. +- +- Refer to the stacks thru separate pointers, to allow yyoverflow +- to reallocate them elsewhere. */ +- +- /* The state stack. */ +- short yyssa[YYINITDEPTH]; +- short *yyss = yyssa; +- register short *yyssp; +- +- /* The semantic value stack. */ +- YYSTYPE yyvsa[YYINITDEPTH]; +- YYSTYPE *yyvs = yyvsa; +- register YYSTYPE *yyvsp; +- +- +- +-#define YYPOPSTACK (yyvsp--, yyssp--) +- +- YYSIZE_T yystacksize = YYINITDEPTH; +- +- /* The variables used to return semantic value and location from the +- action routines. */ +- YYSTYPE yyval; +- +- +- /* When reducing, the number of symbols on the RHS of the reduced +- rule. */ +- int yylen; +- +- YYDPRINTF ((stderr, "Starting parse\n")); +- +- yystate = 0; +- yyerrstatus = 0; +- yynerrs = 0; +- yychar = YYEMPTY; /* Cause a token to be read. */ +- +- /* Initialize stack pointers. +- Waste one element of value and location stack +- so that they stay on the same level as the state stack. +- The wasted elements are never initialized. */ +- +- yyssp = yyss; +- yyvsp = yyvs; +- +- goto yysetstate; +- +-/*------------------------------------------------------------. +-| yynewstate -- Push a new state, which is found in yystate. | +-`------------------------------------------------------------*/ +- yynewstate: +- /* In all cases, when you get here, the value and location stacks +- have just been pushed. so pushing a state here evens the stacks. +- */ +- yyssp++; +- +- yysetstate: +- *yyssp = yystate; +- +- if (yyss + yystacksize - 1 <= yyssp) +- { +- /* Get the current used size of the three stacks, in elements. */ +- YYSIZE_T yysize = yyssp - yyss + 1; +- +-#ifdef yyoverflow +- { +- /* Give user a chance to reallocate the stack. Use copies of +- these so that the &'s don't force the real ones into +- memory. */ +- YYSTYPE *yyvs1 = yyvs; +- short *yyss1 = yyss; +- +- +- /* Each stack pointer address is followed by the size of the +- data in use in that stack, in bytes. This used to be a +- conditional around just the two extra args, but that might +- be undefined if yyoverflow is a macro. */ +- yyoverflow ("parser stack overflow", +- &yyss1, yysize * sizeof (*yyssp), +- &yyvs1, yysize * sizeof (*yyvsp), +- +- &yystacksize); +- +- yyss = yyss1; +- yyvs = yyvs1; +- } +-#else /* no yyoverflow */ +-# ifndef YYSTACK_RELOCATE +- goto yyoverflowlab; +-# else +- /* Extend the stack our own way. */ +- if (YYMAXDEPTH <= yystacksize) +- goto yyoverflowlab; +- yystacksize *= 2; +- if (YYMAXDEPTH < yystacksize) +- yystacksize = YYMAXDEPTH; +- +- { +- short *yyss1 = yyss; +- union yyalloc *yyptr = +- (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); +- if (! yyptr) +- goto yyoverflowlab; +- YYSTACK_RELOCATE (yyss); +- YYSTACK_RELOCATE (yyvs); +- +-# undef YYSTACK_RELOCATE +- if (yyss1 != yyssa) +- YYSTACK_FREE (yyss1); +- } +-# endif +-#endif /* no yyoverflow */ +- +- yyssp = yyss + yysize - 1; +- yyvsp = yyvs + yysize - 1; +- +- +- YYDPRINTF ((stderr, "Stack size increased to %lu\n", +- (unsigned long int) yystacksize)); +- +- if (yyss + yystacksize - 1 <= yyssp) +- YYABORT; +- } +- +- YYDPRINTF ((stderr, "Entering state %d\n", yystate)); +- +- goto yybackup; +- +-/*-----------. +-| yybackup. | +-`-----------*/ +-yybackup: +- +-/* Do appropriate processing given the current state. */ +-/* Read a lookahead token if we need one and don't already have one. */ +-/* yyresume: */ +- +- /* First try to decide what to do without reference to lookahead token. */ +- +- yyn = yypact[yystate]; +- if (yyn == YYPACT_NINF) +- goto yydefault; +- +- /* Not known => get a lookahead token if don't already have one. */ +- +- /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ +- if (yychar == YYEMPTY) +- { +- YYDPRINTF ((stderr, "Reading a token: ")); +- yychar = YYLEX; +- } +- +- if (yychar <= YYEOF) +- { +- yychar = yytoken = YYEOF; +- YYDPRINTF ((stderr, "Now at end of input.\n")); +- } +- else +- { +- yytoken = YYTRANSLATE (yychar); +- YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc); +- } +- +- /* If the proper action on seeing token YYTOKEN is to reduce or to +- detect an error, take that action. */ +- yyn += yytoken; +- if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) +- goto yydefault; +- yyn = yytable[yyn]; +- if (yyn <= 0) +- { +- if (yyn == 0 || yyn == YYTABLE_NINF) +- goto yyerrlab; +- yyn = -yyn; +- goto yyreduce; +- } +- +- if (yyn == YYFINAL) +- YYACCEPT; +- +- /* Shift the lookahead token. */ +- YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken])); +- +- /* Discard the token being shifted unless it is eof. */ +- if (yychar != YYEOF) +- yychar = YYEMPTY; +- +- *++yyvsp = yylval; +- +- +- /* Count tokens shifted since error; after three, turn off error +- status. */ +- if (yyerrstatus) +- yyerrstatus--; +- +- yystate = yyn; +- goto yynewstate; +- +- +-/*-----------------------------------------------------------. +-| yydefault -- do the default action for the current state. | +-`-----------------------------------------------------------*/ +-yydefault: +- yyn = yydefact[yystate]; +- if (yyn == 0) +- goto yyerrlab; +- goto yyreduce; +- +- +-/*-----------------------------. +-| yyreduce -- Do a reduction. | +-`-----------------------------*/ +-yyreduce: +- /* yyn is the number of a rule to reduce with. */ +- yylen = yyr2[yyn]; +- +- /* If YYLEN is nonzero, implement the default value of the action: +- `$$ = $1'. +- +- Otherwise, the following line sets YYVAL to garbage. +- This behavior is undocumented and Bison +- users should not rely upon it. Assigning to YYVAL +- unconditionally makes the parser a bit smaller, and it avoids a +- GCC warning that YYVAL may be used uninitialized. */ +- yyval = yyvsp[1-yylen]; +- +- +- YY_REDUCE_PRINT (yyn); +- switch (yyn) +- { +- case 3: +-#line 1238 "goomsl_yacc.y" +- { gsl_append(yyvsp[0].nPtr); } +- break; +- +- case 4: +-#line 1239 "goomsl_yacc.y" +- { gsl_declare_global_variable(yyvsp[-2].intValue,yyvsp[-4].strValue); } +- break; +- +- case 5: +-#line 1240 "goomsl_yacc.y" +- { gsl_declare_global_variable(yyvsp[-2].intValue,yyvsp[-6].strValue); } +- break; +- +- case 6: +-#line 1241 "goomsl_yacc.y" +- { gsl_declare_global_variable(yyvsp[-2].intValue,yyvsp[-4].strValue); } +- break; +- +- case 7: +-#line 1242 "goomsl_yacc.y" +- { gsl_declare_global_variable(yyvsp[-2].intValue,yyvsp[-6].strValue); } +- break; +- +- case 11: +-#line 1250 "goomsl_yacc.y" +- { gsl_add_struct(yyvsp[-4].strValue, yyvsp[-2].gsl_struct); } +- break; +- +- case 12: +-#line 1253 "goomsl_yacc.y" +- { yyval.gsl_struct = gsl_new_struct(yyvsp[0].gsl_struct_field); } +- break; +- +- case 13: +-#line 1254 "goomsl_yacc.y" +- { yyval.gsl_struct = yyvsp[-3].gsl_struct; gsl_add_struct_field(yyvsp[-3].gsl_struct, yyvsp[0].gsl_struct_field); } +- break; +- +- case 14: +-#line 1257 "goomsl_yacc.y" +- { yyval.gsl_struct_field = gsl_new_struct_field(yyvsp[0].strValue, INSTR_INT); } +- break; +- +- case 15: +-#line 1258 "goomsl_yacc.y" +- { yyval.gsl_struct_field = gsl_new_struct_field(yyvsp[0].strValue, INSTR_FLOAT); } +- break; +- +- case 16: +-#line 1259 "goomsl_yacc.y" +- { yyval.gsl_struct_field = gsl_new_struct_field(yyvsp[0].strValue, INSTR_PTR); } +- break; +- +- case 17: +-#line 1260 "goomsl_yacc.y" +- { yyval.gsl_struct_field = gsl_new_struct_field_struct(yyvsp[0].strValue, yyvsp[-1].strValue); } +- break; +- +- case 18: +-#line 1265 "goomsl_yacc.y" +- { gsl_declare_external_task(yyvsp[0].strValue); gsl_enternamespace(yyvsp[0].strValue); strcpy(yyval.strValue,yyvsp[0].strValue); } +- break; +- +- case 19: +-#line 1267 "goomsl_yacc.y" +- { gsl_declare_task(yyvsp[0].strValue); gsl_enternamespace(yyvsp[0].strValue); strcpy(yyval.strValue,yyvsp[0].strValue); strcpy(yyval.strValue,yyvsp[0].strValue); } +- break; +- +- case 20: +-#line 1270 "goomsl_yacc.y" +- { yyval.intValue=-1; } +- break; +- +- case 21: +-#line 1271 "goomsl_yacc.y" +- { yyval.intValue=INT_TK; } +- break; +- +- case 22: +-#line 1272 "goomsl_yacc.y" +- { yyval.intValue=FLOAT_TK; } +- break; +- +- case 23: +-#line 1273 "goomsl_yacc.y" +- { yyval.intValue=PTR_TK; } +- break; +- +- case 24: +-#line 1274 "goomsl_yacc.y" +- { yyval.intValue= 1000 + gsl_get_struct_id(yyvsp[0].strValue); } +- break; +- +- case 29: +-#line 1287 "goomsl_yacc.y" +- { gsl_leavenamespace(); } +- break; +- +- case 30: +-#line 1289 "goomsl_yacc.y" +- { gsl_append(new_function_intro(yyvsp[-3].strValue)); +- gsl_declare_global_variable(yyvsp[-1].intValue,yyvsp[-3].strValue); } +- break; +- +- case 31: +-#line 1291 "goomsl_yacc.y" +- { gsl_append(new_function_intro(yyvsp[-5].strValue)); +- gsl_declare_global_variable(yyvsp[-1].intValue,yyvsp[-5].strValue); } +- break; +- +- case 32: +-#line 1294 "goomsl_yacc.y" +- { gsl_append(new_function_outro()); } +- break; +- +- case 33: +-#line 1296 "goomsl_yacc.y" +- { yyval.namespace = gsl_leavenamespace(); } +- break; +- +- case 34: +-#line 1300 "goomsl_yacc.y" +- { gsl_float_decl_local(yyvsp[-2].strValue); yyval.nPtr = new_set(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines), yyvsp[0].nPtr); } +- break; +- +- case 35: +-#line 1301 "goomsl_yacc.y" +- { gsl_int_decl_local(yyvsp[-2].strValue); yyval.nPtr = new_set(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines), yyvsp[0].nPtr); } +- break; +- +- case 36: +-#line 1302 "goomsl_yacc.y" +- { gsl_ptr_decl_local(yyvsp[-2].strValue); yyval.nPtr = new_set(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines), yyvsp[0].nPtr); } +- break; +- +- case 37: +-#line 1303 "goomsl_yacc.y" +- { gsl_struct_decl_local(yyvsp[-3].strValue,yyvsp[-2].strValue); yyval.nPtr = new_set(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines), yyvsp[0].nPtr); } +- break; +- +- case 38: +-#line 1304 "goomsl_yacc.y" +- { yyval.nPtr = 0; } +- break; +- +- case 39: +-#line 1307 "goomsl_yacc.y" +- { gsl_float_decl_local(yyvsp[0].strValue); } +- break; +- +- case 40: +-#line 1308 "goomsl_yacc.y" +- { gsl_int_decl_local(yyvsp[0].strValue); } +- break; +- +- case 41: +-#line 1309 "goomsl_yacc.y" +- { gsl_ptr_decl_local(yyvsp[0].strValue); } +- break; +- +- case 42: +-#line 1310 "goomsl_yacc.y" +- { gsl_struct_decl_local(yyvsp[-1].strValue,yyvsp[0].strValue); } +- break; +- +- case 43: +-#line 1315 "goomsl_yacc.y" +- { yyval.nPtr = yyvsp[-1].nPtr; } +- break; +- +- case 44: +-#line 1316 "goomsl_yacc.y" +- { yyval.nPtr = yyvsp[-1].nPtr; } +- break; +- +- case 45: +-#line 1317 "goomsl_yacc.y" +- { yyval.nPtr = new_if(yyvsp[-4].nPtr,yyvsp[0].nPtr); } +- break; +- +- case 46: +-#line 1318 "goomsl_yacc.y" +- { yyval.nPtr = new_while(yyvsp[-4].nPtr,yyvsp[0].nPtr); } +- break; +- +- case 47: +-#line 1319 "goomsl_yacc.y" +- { lastNode = yyvsp[-3].nPtr->unode.opr.op[1]; yyval.nPtr=yyvsp[-3].nPtr; } +- break; +- +- case 48: +-#line 1320 "goomsl_yacc.y" +- { yyval.nPtr = yyvsp[0].nPtr; } +- break; +- +- case 49: +-#line 1321 "goomsl_yacc.y" +- { yyval.nPtr = new_plus_eq(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); } +- break; +- +- case 50: +-#line 1322 "goomsl_yacc.y" +- { yyval.nPtr = new_sub_eq(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); } +- break; +- +- case 51: +-#line 1323 "goomsl_yacc.y" +- { yyval.nPtr = new_mul_eq(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); } +- break; +- +- case 52: +-#line 1324 "goomsl_yacc.y" +- { yyval.nPtr = new_div_eq(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); } +- break; +- +- case 53: +-#line 1325 "goomsl_yacc.y" +- { yyval.nPtr = new_static_foreach(new_var(yyvsp[-4].strValue, currentGoomSL->num_lines), yyvsp[-2].nPtr, yyvsp[0].nPtr); } +- break; +- +- case 54: +-#line 1328 "goomsl_yacc.y" +- { yyval.nPtr = yyvsp[-1].nPtr; } +- break; +- +- case 55: +-#line 1330 "goomsl_yacc.y" +- { yyval.nPtr = new_var_list(new_var(yyvsp[0].strValue,currentGoomSL->num_lines), NULL); } +- break; +- +- case 56: +-#line 1331 "goomsl_yacc.y" +- { yyval.nPtr = new_var_list(new_var(yyvsp[-1].strValue,currentGoomSL->num_lines), yyvsp[0].nPtr); } +- break; +- +- case 57: +-#line 1334 "goomsl_yacc.y" +- { yyval.nPtr = new_set(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); } +- break; +- +- case 58: +-#line 1336 "goomsl_yacc.y" +- { yyval.nPtr = new_block(lastNode); lastNode = yyval.nPtr->unode.opr.op[0]; } +- break; +- +- case 59: +-#line 1339 "goomsl_yacc.y" +- { yyval.nPtr = new_var(yyvsp[0].strValue,currentGoomSL->num_lines); } +- break; +- +- case 60: +-#line 1340 "goomsl_yacc.y" +- { yyval.nPtr = yyvsp[0].nPtr; } +- break; +- +- case 61: +-#line 1341 "goomsl_yacc.y" +- { yyval.nPtr = new_mul(yyvsp[-2].nPtr,yyvsp[0].nPtr); } +- break; +- +- case 62: +-#line 1342 "goomsl_yacc.y" +- { yyval.nPtr = new_div(yyvsp[-2].nPtr,yyvsp[0].nPtr); } +- break; +- +- case 63: +-#line 1343 "goomsl_yacc.y" +- { yyval.nPtr = new_add(yyvsp[-2].nPtr,yyvsp[0].nPtr); } +- break; +- +- case 64: +-#line 1344 "goomsl_yacc.y" +- { yyval.nPtr = new_sub(yyvsp[-2].nPtr,yyvsp[0].nPtr); } +- break; +- +- case 65: +-#line 1345 "goomsl_yacc.y" +- { yyval.nPtr = new_neg(yyvsp[0].nPtr); } +- break; +- +- case 66: +-#line 1346 "goomsl_yacc.y" +- { yyval.nPtr = yyvsp[-1].nPtr; } +- break; +- +- case 67: +-#line 1347 "goomsl_yacc.y" +- { yyval.nPtr = yyvsp[0].nPtr; } +- break; +- +- case 68: +-#line 1350 "goomsl_yacc.y" +- { yyval.nPtr = new_equ(yyvsp[-2].nPtr,yyvsp[0].nPtr); } +- break; +- +- case 69: +-#line 1351 "goomsl_yacc.y" +- { yyval.nPtr = new_low(yyvsp[-2].nPtr,yyvsp[0].nPtr); } +- break; +- +- case 70: +-#line 1352 "goomsl_yacc.y" +- { yyval.nPtr = new_low(yyvsp[0].nPtr,yyvsp[-2].nPtr); } +- break; +- +- case 71: +-#line 1353 "goomsl_yacc.y" +- { yyval.nPtr = new_not(new_low(yyvsp[-2].nPtr,yyvsp[0].nPtr)); } +- break; +- +- case 72: +-#line 1354 "goomsl_yacc.y" +- { yyval.nPtr = new_not(new_low(yyvsp[0].nPtr,yyvsp[-2].nPtr)); } +- break; +- +- case 73: +-#line 1355 "goomsl_yacc.y" +- { yyval.nPtr = new_not(new_equ(yyvsp[-2].nPtr,yyvsp[0].nPtr)); } +- break; +- +- case 74: +-#line 1356 "goomsl_yacc.y" +- { yyval.nPtr = new_not(yyvsp[0].nPtr); } +- break; +- +- case 75: +-#line 1359 "goomsl_yacc.y" +- { yyval.nPtr = new_constFloat(yyvsp[0].strValue,currentGoomSL->num_lines); } +- break; +- +- case 76: +-#line 1360 "goomsl_yacc.y" +- { yyval.nPtr = new_constInt(yyvsp[0].strValue,currentGoomSL->num_lines); } +- break; +- +- case 77: +-#line 1361 "goomsl_yacc.y" +- { yyval.nPtr = new_constPtr(yyvsp[0].strValue,currentGoomSL->num_lines); } +- break; +- +- case 78: +-#line 1366 "goomsl_yacc.y" +- { yyval.nPtr = new_call(yyvsp[-2].strValue,NULL); } +- break; +- +- case 79: +-#line 1367 "goomsl_yacc.y" +- { yyval.nPtr = new_call(yyvsp[-4].strValue,yyvsp[-2].nPtr); } +- break; +- +- case 80: +-#line 1368 "goomsl_yacc.y" +- { yyval.nPtr = new_call(yyvsp[-3].strValue,NULL); } +- break; +- +- case 81: +-#line 1369 "goomsl_yacc.y" +- { yyval.nPtr = new_call(yyvsp[-5].strValue,yyvsp[-3].nPtr); } +- break; +- +- case 82: +-#line 1373 "goomsl_yacc.y" +- { yyval.nPtr = new_call_expr(yyvsp[-2].strValue,NULL); } +- break; +- +- case 83: +-#line 1374 "goomsl_yacc.y" +- { yyval.nPtr = new_call_expr(yyvsp[-4].strValue,yyvsp[-2].nPtr); } +- break; +- +- case 84: +-#line 1377 "goomsl_yacc.y" +- { yyval.nPtr = new_affec_list(yyvsp[-1].nPtr,yyvsp[0].nPtr); } +- break; +- +- case 85: +-#line 1378 "goomsl_yacc.y" +- { yyval.nPtr = new_affec_list(yyvsp[0].nPtr,NULL); } +- break; +- +- case 86: +-#line 1380 "goomsl_yacc.y" +- { +- gsl_reenternamespace(yyvsp[-1].namespace); +- yyval.nPtr = new_set(new_var(yyvsp[-3].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); +- } +- break; +- +- case 87: +-#line 1384 "goomsl_yacc.y" +- { +- gsl_reenternamespace(yyvsp[-1].namespace); +- yyval.nPtr = new_set(new_var("&this", currentGoomSL->num_lines),yyvsp[0].nPtr); +- } +- break; +- +- +- } +- +-/* Line 999 of yacc.c. */ +-#line 2792 "goomsl_yacc.c" +- +- yyvsp -= yylen; +- yyssp -= yylen; +- +- +- YY_STACK_PRINT (yyss, yyssp); +- +- *++yyvsp = yyval; +- +- +- /* Now `shift' the result of the reduction. Determine what state +- that goes to, based on the state we popped back to and the rule +- number reduced by. */ +- +- yyn = yyr1[yyn]; +- +- yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; +- if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) +- yystate = yytable[yystate]; +- else +- yystate = yydefgoto[yyn - YYNTOKENS]; +- +- goto yynewstate; +- +- +-/*------------------------------------. +-| yyerrlab -- here on detecting error | +-`------------------------------------*/ +-yyerrlab: +- /* If not already recovering from an error, report this error. */ +- if (!yyerrstatus) +- { +- ++yynerrs; +-#if YYERROR_VERBOSE +- yyn = yypact[yystate]; +- +- if (YYPACT_NINF < yyn && yyn < YYLAST) +- { +- YYSIZE_T yysize = 0; +- int yytype = YYTRANSLATE (yychar); +- char *yymsg; +- int yyx, yycount; +- +- yycount = 0; +- /* Start YYX at -YYN if negative to avoid negative indexes in +- YYCHECK. */ +- for (yyx = yyn < 0 ? -yyn : 0; +- yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++) +- if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) +- yysize += yystrlen (yytname[yyx]) + 15, yycount++; +- yysize += yystrlen ("syntax error, unexpected ") + 1; +- yysize += yystrlen (yytname[yytype]); +- yymsg = (char *) YYSTACK_ALLOC (yysize); +- if (yymsg != 0) +- { +- char *yyp = yystpcpy (yymsg, "syntax error, unexpected "); +- yyp = yystpcpy (yyp, yytname[yytype]); +- +- if (yycount < 5) +- { +- yycount = 0; +- for (yyx = yyn < 0 ? -yyn : 0; +- yyx < (int) (sizeof (yytname) / sizeof (char *)); +- yyx++) +- if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) +- { +- const char *yyq = ! yycount ? ", expecting " : " or "; +- yyp = yystpcpy (yyp, yyq); +- yyp = yystpcpy (yyp, yytname[yyx]); +- yycount++; +- } +- } +- yyerror (yymsg); +- YYSTACK_FREE (yymsg); +- } +- else +- yyerror ("syntax error; also virtual memory exhausted"); +- } +- else +-#endif /* YYERROR_VERBOSE */ +- yyerror ("syntax error"); +- } +- +- +- +- if (yyerrstatus == 3) +- { +- /* If just tried and failed to reuse lookahead token after an +- error, discard it. */ +- +- /* Return failure if at end of input. */ +- if (yychar == YYEOF) +- { +- /* Pop the error token. */ +- YYPOPSTACK; +- /* Pop the rest of the stack. */ +- while (yyss < yyssp) +- { +- YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); +- yydestruct (yystos[*yyssp], yyvsp); +- YYPOPSTACK; +- } +- YYABORT; +- } +- +- YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc); +- yydestruct (yytoken, &yylval); +- yychar = YYEMPTY; +- +- } +- +- /* Else will try to reuse lookahead token after shifting the error +- token. */ +- goto yyerrlab1; +- +- +-/*----------------------------------------------------. +-| yyerrlab1 -- error raised explicitly by an action. | +-`----------------------------------------------------*/ +-yyerrlab1: +- yyerrstatus = 3; /* Each real token shifted decrements this. */ +- +- for (;;) +- { +- yyn = yypact[yystate]; +- if (yyn != YYPACT_NINF) +- { +- yyn += YYTERROR; +- if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) +- { +- yyn = yytable[yyn]; +- if (0 < yyn) +- break; +- } +- } +- +- /* Pop the current state because it cannot handle the error token. */ +- if (yyssp == yyss) +- YYABORT; +- +- YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); +- yydestruct (yystos[yystate], yyvsp); +- yyvsp--; +- yystate = *--yyssp; +- +- YY_STACK_PRINT (yyss, yyssp); +- } +- +- if (yyn == YYFINAL) +- YYACCEPT; +- +- YYDPRINTF ((stderr, "Shifting error token, ")); +- +- *++yyvsp = yylval; +- +- +- yystate = yyn; +- goto yynewstate; +- +- +-/*-------------------------------------. +-| yyacceptlab -- YYACCEPT comes here. | +-`-------------------------------------*/ +-yyacceptlab: +- yyresult = 0; +- goto yyreturn; +- +-/*-----------------------------------. +-| yyabortlab -- YYABORT comes here. | +-`-----------------------------------*/ +-yyabortlab: +- yyresult = 1; +- goto yyreturn; +- +-#ifndef yyoverflow +-/*----------------------------------------------. +-| yyoverflowlab -- parser overflow comes here. | +-`----------------------------------------------*/ +-yyoverflowlab: +- yyerror ("parser stack overflow"); +- yyresult = 2; +- /* Fall through. */ +-#endif +- +-yyreturn: +-#ifndef yyoverflow +- if (yyss != yyssa) +- YYSTACK_FREE (yyss); +-#endif +- return yyresult; +-} +- +- +-#line 1396 "goomsl_yacc.y" +- +- +- +-void yyerror(char *str) +-{ /* {{{ */ +- fprintf(stderr, "ERROR: Line %d, %s\n", currentGoomSL->num_lines, str); +- currentGoomSL->compilationOK = 0; +- exit(1); +-} /* }}} */ +- +- +diff -Naur /home/d4rk/goom2k4-0/src/goomsl_yacc.h /src/goomsl_yacc.h +--- /home/d4rk/goom2k4-0/src/goomsl_yacc.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goomsl_yacc.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,104 +0,0 @@ +-/* A Bison parser, made by GNU Bison 1.875. */ +- +-/* Skeleton parser for Yacc-like parsing with Bison, +- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc. +- +- 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, 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., 59 Temple Place - Suite 330, +- Boston, MA 02111-1307, USA. */ +- +-/* As a special exception, when this file is copied by Bison into a +- Bison output file, you may use that output file without restriction. +- This special exception was added by the Free Software Foundation +- in version 1.24 of Bison. */ +- +-/* Tokens. */ +-#ifndef YYTOKENTYPE +-# define YYTOKENTYPE +- /* Put the tokens into the symbol table, so that GDB and other debuggers +- know about them. */ +- enum yytokentype { +- LTYPE_INTEGER = 258, +- LTYPE_FLOAT = 259, +- LTYPE_VAR = 260, +- LTYPE_PTR = 261, +- PTR_TK = 262, +- INT_TK = 263, +- FLOAT_TK = 264, +- DECLARE = 265, +- EXTERNAL = 266, +- WHILE = 267, +- DO = 268, +- NOT = 269, +- PLUS_EQ = 270, +- SUB_EQ = 271, +- DIV_EQ = 272, +- MUL_EQ = 273, +- SUP_EQ = 274, +- LOW_EQ = 275, +- NOT_EQ = 276, +- STRUCT = 277, +- FOR = 278, +- IN = 279 +- }; +-#endif +-#define LTYPE_INTEGER 258 +-#define LTYPE_FLOAT 259 +-#define LTYPE_VAR 260 +-#define LTYPE_PTR 261 +-#define PTR_TK 262 +-#define INT_TK 263 +-#define FLOAT_TK 264 +-#define DECLARE 265 +-#define EXTERNAL 266 +-#define WHILE 267 +-#define DO 268 +-#define NOT 269 +-#define PLUS_EQ 270 +-#define SUB_EQ 271 +-#define DIV_EQ 272 +-#define MUL_EQ 273 +-#define SUP_EQ 274 +-#define LOW_EQ 275 +-#define NOT_EQ 276 +-#define STRUCT 277 +-#define FOR 278 +-#define IN 279 +- +- +- +- +-#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) +-#line 1199 "goomsl_yacc.y" +-typedef union YYSTYPE { +- int intValue; +- float floatValue; +- char charValue; +- char strValue[2048]; +- NodeType *nPtr; +- GoomHash *namespace; +- GSL_Struct *gsl_struct; +- GSL_StructField *gsl_struct_field; +- } YYSTYPE; +-/* Line 1240 of yacc.c. */ +-#line 95 "goomsl_yacc.h" +-# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +-# define YYSTYPE_IS_DECLARED 1 +-# define YYSTYPE_IS_TRIVIAL 1 +-#endif +- +-extern YYSTYPE yylval; +- +- +- +diff -Naur /home/d4rk/goom2k4-0/src/goomsl_yacc.y /src/goomsl_yacc.y +--- /home/d4rk/goom2k4-0/src/goomsl_yacc.y 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goomsl_yacc.y 1969-12-31 17:00:00.000000000 -0700 +@@ -1,1405 +0,0 @@ +-/** +- * copyright 2004, Jean-Christophe Hoelt <jeko@ios-software.com> +- * +- * This program is released under the terms of the GNU Lesser General Public Licence. +- */ +-%{ +- #include <stdio.h> +- #include <stdlib.h> +- #include <string.h> +- #include "goomsl.h" +- #include "goomsl_private.h" +- +-#define STRUCT_ALIGNMENT 16 +-/* #define VERBOSE */ +- +- int yylex(void); +- void yyerror(char *); +- extern GoomSL *currentGoomSL; +- +- static NodeType *nodeNew(const char *str, int type, int line_number); +- static NodeType *nodeClone(NodeType *node); +- static void nodeFreeInternals(NodeType *node); +- static void nodeFree(NodeType *node); +- +- static void commit_node(NodeType *node, int releaseIfTemp); +- static void precommit_node(NodeType *node); +- +- static NodeType *new_constInt(const char *str, int line_number); +- static NodeType *new_constFloat(const char *str, int line_number); +- static NodeType *new_constPtr(const char *str, int line_number); +- static NodeType *new_var(const char *str, int line_number); +- static NodeType *new_nop(const char *str); +- static NodeType *new_op(const char *str, int type, int nbOp); +- +- static int allocateLabel(); +- static int allocateTemp(); +- static void releaseTemp(int n); +- static void releaseAllTemps(); +- +- static int is_tmp_expr(NodeType *node) { +- if (node->str) { +- return (!strncmp(node->str,"_i_tmp_",7)) +- || (!strncmp(node->str,"_f_tmp_",7)) +- || (!strncmp(node->str,"_p_tmp",7)); +- } +- return 0; +- } +- /* pre: is_tmp_expr(node); */ +- static int get_tmp_id(NodeType *node) { return atoi((node->str)+5); } +- +- static int is_commutative_expr(int itype) +- { /* {{{ */ +- return (itype == INSTR_ADD) +- || (itype == INSTR_MUL) +- || (itype == INSTR_ISEQUAL); +- } /* }}} */ +- +- static void GSL_PUT_LABEL(char *name, int line_number) +- { /* {{{ */ +-#ifdef VERBOSE +- printf("label %s\n", name); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "label", INSTR_LABEL, 1, line_number); +- gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); +- } /* }}} */ +- static void GSL_PUT_JUMP(char *name, int line_number) +- { /* {{{ */ +-#ifdef VERBOSE +- printf("jump %s\n", name); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "jump", INSTR_JUMP, 1, line_number); +- gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); +- } /* }}} */ +- +- static void GSL_PUT_JXXX(char *name, char *iname, int instr_id, int line_number) +- { /* {{{ */ +-#ifdef VERBOSE +- printf("%s %s\n", iname, name); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, iname, instr_id, 1, line_number); +- gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); +- } /* }}} */ +- static void GSL_PUT_JZERO(char *name,int line_number) +- { /* {{{ */ +- GSL_PUT_JXXX(name,"jzero.i",INSTR_JZERO,line_number); +- } /* }}} */ +- static void GSL_PUT_JNZERO(char *name, int line_number) +- { /* {{{ */ +- GSL_PUT_JXXX(name,"jnzero.i",INSTR_JNZERO,line_number); +- } /* }}} */ +- +- /* Structures Management */ +- +-#define ALIGN_ADDR(_addr,_align) {\ +- if (_align>1) {\ +- int _dec = (_addr%_align);\ +- if (_dec != 0) _addr += _align - _dec;\ +- }} +- +- /* */ +- void gsl_prepare_struct(GSL_Struct *s, int s_align, int i_align, int f_align) +- { +- int i; +- int consumed = 0; +- int iblk=0, fblk=0; +- +- s->iBlock[0].size = 0; +- s->iBlock[0].data = 0; +- s->fBlock[0].size = 0; +- s->fBlock[0].data = 0; +- +- /* Prepare sub-struct and calculate space needed for their storage */ +- for (i = 0; i < s->nbFields; ++i) +- { +- if (s->fields[i]->type < FIRST_RESERVED) +- { +- int j=0; +- GSL_Struct *substruct = currentGoomSL->gsl_struct[s->fields[i]->type]; +- consumed += sizeof(int); /* stocke le prefix */ +- ALIGN_ADDR(consumed, s_align); +- s->fields[i]->offsetInStruct = consumed; +- gsl_prepare_struct(substruct, s_align, i_align, f_align); +- for(j=0;substruct->iBlock[j].size>0;++j) { +- s->iBlock[iblk].data = consumed + substruct->iBlock[j].data; +- s->iBlock[iblk].size = substruct->iBlock[j].size; +- iblk++; +- } +- for(j=0;substruct->fBlock[j].size>0;++j) { +- s->fBlock[fblk].data = consumed + substruct->fBlock[j].data; +- s->fBlock[fblk].size = substruct->fBlock[j].size; +- fblk++; +- } +- consumed += substruct->size; +- } +- } +- +- /* Then prepare integers */ +- ALIGN_ADDR(consumed, i_align); +- for (i = 0; i < s->nbFields; ++i) +- { +- if (s->fields[i]->type == INSTR_INT) +- { +- if (s->iBlock[iblk].size == 0) { +- s->iBlock[iblk].size = 1; +- s->iBlock[iblk].data = consumed; +- } else { +- s->iBlock[iblk].size += 1; +- } +- s->fields[i]->offsetInStruct = consumed; +- consumed += sizeof(int); +- } +- } +- +- iblk++; +- s->iBlock[iblk].size = 0; +- s->iBlock[iblk].data = 0; +- +- /* Then prepare floats */ +- ALIGN_ADDR(consumed, f_align); +- for (i = 0; i < s->nbFields; ++i) +- { +- if (s->fields[i]->type == INSTR_FLOAT) +- { +- if (s->fBlock[fblk].size == 0) { +- s->fBlock[fblk].size = 1; +- s->fBlock[fblk].data = consumed; +- } else { +- s->fBlock[fblk].size += 1; +- } +- s->fields[i]->offsetInStruct = consumed; +- consumed += sizeof(int); +- } +- } +- +- fblk++; +- s->fBlock[fblk].size = 0; +- s->fBlock[fblk].data = 0; +- +- /* Finally prepare pointers */ +- ALIGN_ADDR(consumed, i_align); +- for (i = 0; i < s->nbFields; ++i) +- { +- if (s->fields[i]->type == INSTR_PTR) +- { +- s->fields[i]->offsetInStruct = consumed; +- consumed += sizeof(int); +- } +- } +- s->size = consumed; +- } +- +- /* Returns the ID of a struct from its name */ +- int gsl_get_struct_id(const char *name) /* {{{ */ +- { +- HashValue *ret = goom_hash_get(currentGoomSL->structIDS, name); +- if (ret != NULL) return ret->i; +- return -1; +- } /* }}} */ +- +- /* Adds the definition of a struct */ +- void gsl_add_struct(const char *name, GSL_Struct *gsl_struct) /* {{{ */ +- { +- /* Prepare the struct: ie calculate internal storage format */ +- gsl_prepare_struct(gsl_struct, STRUCT_ALIGNMENT, STRUCT_ALIGNMENT, STRUCT_ALIGNMENT); +- +- /* If the struct does not already exists */ +- if (gsl_get_struct_id(name) < 0) +- { +- /* adds it */ +- int id = currentGoomSL->nbStructID++; +- goom_hash_put_int(currentGoomSL->structIDS, name, id); +- if (currentGoomSL->gsl_struct_size <= id) { +- currentGoomSL->gsl_struct_size *= 2; +- currentGoomSL->gsl_struct = (GSL_Struct**)realloc(currentGoomSL->gsl_struct, +- sizeof(GSL_Struct*) * currentGoomSL->gsl_struct_size); +- } +- currentGoomSL->gsl_struct[id] = gsl_struct; +- } +- } /* }}} */ +- +- /* Creates a field for a struct */ +- GSL_StructField *gsl_new_struct_field(const char *name, int type) +- { +- GSL_StructField *field = (GSL_StructField*)malloc(sizeof(GSL_StructField)); +- strcpy(field->name, name); +- field->type = type; +- return field; +- } +- +- /* Create as field for a struct which will be a struct itself */ +- GSL_StructField *gsl_new_struct_field_struct(const char *name, const char *type) +- { +- GSL_StructField *field = gsl_new_struct_field(name, gsl_get_struct_id(type)); +- if (field->type < 0) { +- fprintf(stderr, "ERROR: Line %d, Unknown structure: '%s'\n", +- currentGoomSL->num_lines, type); +- exit(1); +- } +- return field; +- } +- +- /* Creates a Struct */ +- GSL_Struct *gsl_new_struct(GSL_StructField *field) +- { +- GSL_Struct *s = (GSL_Struct*)malloc(sizeof(GSL_Struct)); +- s->nbFields = 1; +- s->fields[0] = field; +- return s; +- } +- +- /* Adds a field to a struct */ +- void gsl_add_struct_field(GSL_Struct *s, GSL_StructField *field) +- { +- s->fields[s->nbFields++] = field; +- } +- +- int gsl_type_of_var(GoomHash *ns, const char *name) +- { +- char type_of[256]; +- HashValue *hv; +- sprintf(type_of, "__type_of_%s", name); +- hv = goom_hash_get(ns, type_of); +- if (hv != NULL) +- return hv->i; +- fprintf(stderr, "ERROR: Unknown variable type: '%s'\n", name); +- return -1; +- } +- +- static void gsl_declare_var(GoomHash *ns, const char *name, int type, void *space) +- { +- char type_of[256]; +- if (name[0] == '@') { ns = currentGoomSL->vars; } +- +- if (space == NULL) { +- switch (type) { +- case INSTR_INT: +- case INSTR_FLOAT: +- case INSTR_PTR: +- space = goom_heap_malloc_with_alignment(currentGoomSL->data_heap, +- sizeof(int), sizeof(int)); +- break; +- case -1: +- fprintf(stderr, "What the fuck!\n"); +- exit(1); +- default: /* On a un struct_id */ +- space = goom_heap_malloc_with_alignment_prefixed(currentGoomSL->data_heap, +- currentGoomSL->gsl_struct[type]->size, STRUCT_ALIGNMENT, sizeof(int)); +- } +- } +- goom_hash_put_ptr(ns, name, (void*)space); +- sprintf(type_of, "__type_of_%s", name); +- goom_hash_put_int(ns, type_of, type); +- +- /* Ensuite le hack: on ajoute les champs en tant que variables. */ +- if (type < FIRST_RESERVED) +- { +- int i; +- GSL_Struct *gsl_struct = currentGoomSL->gsl_struct[type]; +- ((int*)space)[-1] = type; /* stockage du type dans le prefixe de structure */ +- for (i = 0; i < gsl_struct->nbFields; ++i) +- { +- char full_name[256]; +- char *cspace = (char*)space + gsl_struct->fields[i]->offsetInStruct; +- sprintf(full_name, "%s.%s", name, gsl_struct->fields[i]->name); +- gsl_declare_var(ns, full_name, gsl_struct->fields[i]->type, cspace); +- } +- } +- } +- +- /* Declare a variable which will be a struct */ +- static void gsl_struct_decl(GoomHash *namespace, const char *struct_name, const char *name) +- { +- int struct_id = gsl_get_struct_id(struct_name); +- gsl_declare_var(namespace, name, struct_id, NULL); +- } +- +- static void gsl_float_decl_global(const char *name) +- { +- gsl_declare_var(currentGoomSL->vars, name, INSTR_FLOAT, NULL); +- } +- static void gsl_int_decl_global(const char *name) +- { +- gsl_declare_var(currentGoomSL->vars, name, INSTR_INT, NULL); +- } +- static void gsl_ptr_decl_global(const char *name) +- { +- gsl_declare_var(currentGoomSL->vars, name, INSTR_PTR, NULL); +- } +- static void gsl_struct_decl_global_from_id(const char *name, int id) +- { +- gsl_declare_var(currentGoomSL->vars, name, id, NULL); +- } +- +- /* FLOAT */ +- static void gsl_float_decl_local(const char *name) +- { +- gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_FLOAT, NULL); +- } +- /* INT */ +- static void gsl_int_decl_local(const char *name) +- { +- gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_INT, NULL); +- } +- /* PTR */ +- static void gsl_ptr_decl_local(const char *name) +- { +- gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_PTR, NULL); +- } +- /* STRUCT */ +- static void gsl_struct_decl_local(const char *struct_name, const char *name) +- { +- gsl_struct_decl(currentGoomSL->namespaces[currentGoomSL->currentNS],struct_name,name); +- } +- +- +- static void commit_test2(NodeType *set,const char *type, int instr); +- static NodeType *new_call(const char *name, NodeType *affect_list); +- +- /* SETTER */ +- static NodeType *new_set(NodeType *lvalue, NodeType *expression) +- { /* {{{ */ +- NodeType *set = new_op("set", OPR_SET, 2); +- set->unode.opr.op[0] = lvalue; +- set->unode.opr.op[1] = expression; +- return set; +- } /* }}} */ +- static void commit_set(NodeType *set) +- { /* {{{ */ +- commit_test2(set,"set",INSTR_SET); +- } /* }}} */ +- +- /* PLUS_EQ */ +- static NodeType *new_plus_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ +- { +- NodeType *set = new_op("plus_eq", OPR_PLUS_EQ, 2); +- set->unode.opr.op[0] = lvalue; +- set->unode.opr.op[1] = expression; +- return set; +- } +- static void commit_plus_eq(NodeType *set) +- { +- precommit_node(set->unode.opr.op[1]); +-#ifdef VERBOSE +- printf("add %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "add", INSTR_ADD, 2, set->line_number); +- commit_node(set->unode.opr.op[0],0); +- commit_node(set->unode.opr.op[1],1); +- } /* }}} */ +- +- /* SUB_EQ */ +- static NodeType *new_sub_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ +- { +- NodeType *set = new_op("sub_eq", OPR_SUB_EQ, 2); +- set->unode.opr.op[0] = lvalue; +- set->unode.opr.op[1] = expression; +- return set; +- } +- static void commit_sub_eq(NodeType *set) +- { +- precommit_node(set->unode.opr.op[1]); +-#ifdef VERBOSE +- printf("sub %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "sub", INSTR_SUB, 2, set->line_number); +- commit_node(set->unode.opr.op[0],0); +- commit_node(set->unode.opr.op[1],1); +- } /* }}} */ +- +- /* MUL_EQ */ +- static NodeType *new_mul_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ +- { +- NodeType *set = new_op("mul_eq", OPR_MUL_EQ, 2); +- set->unode.opr.op[0] = lvalue; +- set->unode.opr.op[1] = expression; +- return set; +- } +- static void commit_mul_eq(NodeType *set) +- { +- precommit_node(set->unode.opr.op[1]); +-#ifdef VERBOSE +- printf("mul %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "mul", INSTR_MUL, 2, set->line_number); +- commit_node(set->unode.opr.op[0],0); +- commit_node(set->unode.opr.op[1],1); +- } /* }}} */ +- +- /* DIV_EQ */ +- static NodeType *new_div_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ +- { +- NodeType *set = new_op("div_eq", OPR_DIV_EQ, 2); +- set->unode.opr.op[0] = lvalue; +- set->unode.opr.op[1] = expression; +- return set; +- } +- static void commit_div_eq(NodeType *set) +- { +- precommit_node(set->unode.opr.op[1]); +-#ifdef VERBOSE +- printf("div %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "div", INSTR_DIV, 2, set->line_number); +- commit_node(set->unode.opr.op[0],0); +- commit_node(set->unode.opr.op[1],1); +- } /* }}} */ +- +- /* commodity method for add, mult, ... */ +- +- static void precommit_expr(NodeType *expr, const char *type, int instr_id) +- { /* {{{ */ +- NodeType *tmp, *tmpcpy; +- int toAdd; +- +- /* compute "left" and "right" */ +- switch (expr->unode.opr.nbOp) { +- case 2: +- precommit_node(expr->unode.opr.op[1]); +- case 1: +- precommit_node(expr->unode.opr.op[0]); +- } +- +- if (is_tmp_expr(expr->unode.opr.op[0])) { +- tmp = expr->unode.opr.op[0]; +- toAdd = 1; +- } +- else if (is_commutative_expr(instr_id) && (expr->unode.opr.nbOp==2) && is_tmp_expr(expr->unode.opr.op[1])) { +- tmp = expr->unode.opr.op[1]; +- toAdd = 0; +- } +- else { +- char stmp[256]; +- /* declare a temporary variable to store the result */ +- if (expr->unode.opr.op[0]->type == CONST_INT_NODE) { +- sprintf(stmp,"_i_tmp_%i",allocateTemp()); +- gsl_int_decl_global(stmp); +- } +- else if (expr->unode.opr.op[0]->type == CONST_FLOAT_NODE) { +- sprintf(stmp,"_f_tmp%i",allocateTemp()); +- gsl_float_decl_global(stmp); +- } +- else if (expr->unode.opr.op[0]->type == CONST_PTR_NODE) { +- sprintf(stmp,"_p_tmp%i",allocateTemp()); +- gsl_ptr_decl_global(stmp); +- } +- else { +- int type = gsl_type_of_var(expr->unode.opr.op[0]->vnamespace, expr->unode.opr.op[0]->str); +- if (type == INSTR_FLOAT) { +- sprintf(stmp,"_f_tmp_%i",allocateTemp()); +- gsl_float_decl_global(stmp); +- } +- else if (type == INSTR_PTR) { +- sprintf(stmp,"_p_tmp_%i",allocateTemp()); +- gsl_ptr_decl_global(stmp); +- } +- else if (type == INSTR_INT) { +- sprintf(stmp,"_i_tmp_%i",allocateTemp()); +- gsl_int_decl_global(stmp); +- } +- else if (type == -1) { +- fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", +- expr->line_number, expr->unode.opr.op[0]->str); +- exit(1); +- } +- else { /* type is a struct_id */ +- sprintf(stmp,"_s_tmp_%i",allocateTemp()); +- gsl_struct_decl_global_from_id(stmp,type); +- } +- } +- tmp = new_var(stmp,expr->line_number); +- +- /* set the tmp to the value of "op1" */ +- tmpcpy = nodeClone(tmp); +- commit_node(new_set(tmp,expr->unode.opr.op[0]),0); +- toAdd = 1; +- +- tmp = tmpcpy; +- } +- +- /* add op2 to tmp */ +-#ifdef VERBOSE +- if (expr->unode.opr.nbOp == 2) +- printf("%s %s %s\n", type, tmp->str, expr->unode.opr.op[toAdd]->str); +- else +- printf("%s %s\n", type, tmp->str); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, type, instr_id, expr->unode.opr.nbOp, expr->line_number); +- tmpcpy = nodeClone(tmp); +- commit_node(tmp,0); +- if (expr->unode.opr.nbOp == 2) { +- commit_node(expr->unode.opr.op[toAdd],1); +- } +- +- /* redefine the ADD node now as the computed variable */ +- nodeFreeInternals(expr); +- *expr = *tmpcpy; +- free(tmpcpy); +- } /* }}} */ +- +- static NodeType *new_expr1(const char *name, int id, NodeType *expr1) +- { /* {{{ */ +- NodeType *add = new_op(name, id, 1); +- add->unode.opr.op[0] = expr1; +- return add; +- } /* }}} */ +- +- static NodeType *new_expr2(const char *name, int id, NodeType *expr1, NodeType *expr2) +- { /* {{{ */ +- NodeType *add = new_op(name, id, 2); +- add->unode.opr.op[0] = expr1; +- add->unode.opr.op[1] = expr2; +- return add; +- } /* }}} */ +- +- /* ADD */ +- static NodeType *new_add(NodeType *expr1, NodeType *expr2) { /* {{{ */ +- return new_expr2("add", OPR_ADD, expr1, expr2); +- } +- static void precommit_add(NodeType *add) { +- precommit_expr(add,"add",INSTR_ADD); +- } /* }}} */ +- +- /* SUB */ +- static NodeType *new_sub(NodeType *expr1, NodeType *expr2) { /* {{{ */ +- return new_expr2("sub", OPR_SUB, expr1, expr2); +- } +- static void precommit_sub(NodeType *sub) { +- precommit_expr(sub,"sub",INSTR_SUB); +- } /* }}} */ +- +- /* NEG */ +- static NodeType *new_neg(NodeType *expr) { /* {{{ */ +- NodeType *zeroConst = NULL; +- if (expr->type == CONST_INT_NODE) +- zeroConst = new_constInt("0", currentGoomSL->num_lines); +- else if (expr->type == CONST_FLOAT_NODE) +- zeroConst = new_constFloat("0.0", currentGoomSL->num_lines); +- else if (expr->type == CONST_PTR_NODE) { +- fprintf(stderr, "ERROR: Line %d, Could not negate const pointer.\n", +- currentGoomSL->num_lines); +- exit(1); +- } +- else { +- int type = gsl_type_of_var(expr->vnamespace, expr->str); +- if (type == INSTR_FLOAT) +- zeroConst = new_constFloat("0.0", currentGoomSL->num_lines); +- else if (type == INSTR_PTR) { +- fprintf(stderr, "ERROR: Line %d, Could not negate pointer.\n", +- currentGoomSL->num_lines); +- exit(1); +- } +- else if (type == INSTR_INT) +- zeroConst = new_constInt("0", currentGoomSL->num_lines); +- else if (type == -1) { +- fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", +- expr->line_number, expr->unode.opr.op[0]->str); +- exit(1); +- } +- else { /* type is a struct_id */ +- fprintf(stderr, "ERROR: Line %d, Could not negate struct '%s'\n", +- expr->line_number, expr->str); +- exit(1); +- } +- } +- return new_expr2("sub", OPR_SUB, zeroConst, expr); +- } +- /* }}} */ +- +- /* MUL */ +- static NodeType *new_mul(NodeType *expr1, NodeType *expr2) { /* {{{ */ +- return new_expr2("mul", OPR_MUL, expr1, expr2); +- } +- static void precommit_mul(NodeType *mul) { +- precommit_expr(mul,"mul",INSTR_MUL); +- } /* }}} */ +- +- /* DIV */ +- static NodeType *new_div(NodeType *expr1, NodeType *expr2) { /* {{{ */ +- return new_expr2("div", OPR_DIV, expr1, expr2); +- } +- static void precommit_div(NodeType *mul) { +- precommit_expr(mul,"div",INSTR_DIV); +- } /* }}} */ +- +- /* CALL EXPRESSION */ +- static NodeType *new_call_expr(const char *name, NodeType *affect_list) { /* {{{ */ +- NodeType *call = new_call(name,affect_list); +- NodeType *node = new_expr1(name, OPR_CALL_EXPR, call); +- node->vnamespace = gsl_find_namespace(name); +- if (node->vnamespace == NULL) +- fprintf(stderr, "ERROR: Line %d, No return type for: '%s'\n", currentGoomSL->num_lines, name); +- return node; +- } +- static void precommit_call_expr(NodeType *call) { +- char stmp[256]; +- NodeType *tmp,*tmpcpy; +- int type = gsl_type_of_var(call->vnamespace, call->str); +- if (type == INSTR_FLOAT) { +- sprintf(stmp,"_f_tmp_%i",allocateTemp()); +- gsl_float_decl_global(stmp); +- } +- else if (type == INSTR_PTR) { +- sprintf(stmp,"_p_tmp_%i",allocateTemp()); +- gsl_ptr_decl_global(stmp); +- } +- else if (type == INSTR_INT) { +- sprintf(stmp,"_i_tmp_%i",allocateTemp()); +- gsl_int_decl_global(stmp); +- } +- else if (type == -1) { +- fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", +- call->line_number, call->str); +- exit(1); +- } +- else { /* type is a struct_id */ +- sprintf(stmp,"_s_tmp_%i",allocateTemp()); +- gsl_struct_decl_global_from_id(stmp,type); +- } +- tmp = new_var(stmp,call->line_number); +- commit_node(call->unode.opr.op[0],0); +- tmpcpy = nodeClone(tmp); +- commit_node(new_set(tmp,new_var(call->str,call->line_number)),0); +- +- nodeFreeInternals(call); +- *call = *tmpcpy; +- free(tmpcpy); +- } /* }}} */ +- +- static void commit_test2(NodeType *set,const char *type, int instr) +- { /* {{{ */ +- NodeType *tmp; +- char stmp[256]; +- precommit_node(set->unode.opr.op[0]); +- precommit_node(set->unode.opr.op[1]); +- tmp = set->unode.opr.op[0]; +- +- stmp[0] = 0; +- if (set->unode.opr.op[0]->type == CONST_INT_NODE) { +- sprintf(stmp,"_i_tmp_%i",allocateTemp()); +- gsl_int_decl_global(stmp); +- } +- else if (set->unode.opr.op[0]->type == CONST_FLOAT_NODE) { +- sprintf(stmp,"_f_tmp%i",allocateTemp()); +- gsl_float_decl_global(stmp); +- } +- else if (set->unode.opr.op[0]->type == CONST_PTR_NODE) { +- sprintf(stmp,"_p_tmp%i",allocateTemp()); +- gsl_ptr_decl_global(stmp); +- } +- if (stmp[0]) { +- NodeType *tmpcpy; +- tmp = new_var(stmp, set->line_number); +- tmpcpy = nodeClone(tmp); +- commit_node(new_set(tmp,set->unode.opr.op[0]),0); +- tmp = tmpcpy; +- } +- +-#ifdef VERBOSE +- printf("%s %s %s\n", type, tmp->str, set->unode.opr.op[1]->str); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, type, instr, 2, set->line_number); +- commit_node(tmp,instr!=INSTR_SET); +- commit_node(set->unode.opr.op[1],1); +- } /* }}} */ +- +- /* NOT */ +- static NodeType *new_not(NodeType *expr1) { /* {{{ */ +- return new_expr1("not", OPR_NOT, expr1); +- } +- static void commit_not(NodeType *set) +- { +- commit_node(set->unode.opr.op[0],0); +-#ifdef VERBOSE +- printf("not\n"); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "not", INSTR_NOT, 1, set->line_number); +- gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); +- } /* }}} */ +- +- /* EQU */ +- static NodeType *new_equ(NodeType *expr1, NodeType *expr2) { /* {{{ */ +- return new_expr2("isequal", OPR_EQU, expr1, expr2); +- } +- static void commit_equ(NodeType *mul) { +- commit_test2(mul,"isequal",INSTR_ISEQUAL); +- } /* }}} */ +- +- /* INF */ +- static NodeType *new_low(NodeType *expr1, NodeType *expr2) { /* {{{ */ +- return new_expr2("islower", OPR_LOW, expr1, expr2); +- } +- static void commit_low(NodeType *mul) { +- commit_test2(mul,"islower",INSTR_ISLOWER); +- } /* }}} */ +- +- /* WHILE */ +- static NodeType *new_while(NodeType *expression, NodeType *instr) { /* {{{ */ +- NodeType *node = new_op("while", OPR_WHILE, 2); +- node->unode.opr.op[0] = expression; +- node->unode.opr.op[1] = instr; +- return node; +- } +- +- static void commit_while(NodeType *node) +- { +- int lbl = allocateLabel(); +- char start_while[1024], test_while[1024]; +- sprintf(start_while, "|start_while_%d|", lbl); +- sprintf(test_while, "|test_while_%d|", lbl); +- +- GSL_PUT_JUMP(test_while,node->line_number); +- GSL_PUT_LABEL(start_while,node->line_number); +- +- /* code */ +- commit_node(node->unode.opr.op[1],0); +- +- GSL_PUT_LABEL(test_while,node->line_number); +- commit_node(node->unode.opr.op[0],0); +- GSL_PUT_JNZERO(start_while,node->line_number); +- } /* }}} */ +- +- /* FOR EACH */ +- static NodeType *new_static_foreach(NodeType *var, NodeType *var_list, NodeType *instr) { /* {{{ */ +- NodeType *node = new_op("for", OPR_FOREACH, 3); +- node->unode.opr.op[0] = var; +- node->unode.opr.op[1] = var_list; +- node->unode.opr.op[2] = instr; +- node->line_number = currentGoomSL->num_lines; +- return node; +- } +- static void commit_foreach(NodeType *node) +- { +- NodeType *cur = node->unode.opr.op[1]; +- char tmp_func[256], tmp_loop[256]; +- int lbl = allocateLabel(); +- sprintf(tmp_func, "|foreach_func_%d|", lbl); +- sprintf(tmp_loop, "|foreach_loop_%d|", lbl); +- +- GSL_PUT_JUMP(tmp_loop, node->line_number); +- GSL_PUT_LABEL(tmp_func, node->line_number); +- +- precommit_node(node->unode.opr.op[2]); +- commit_node(node->unode.opr.op[2], 0); +- +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "ret", INSTR_RET, 1, node->line_number); +- gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); +-#ifdef VERBOSE +- printf("ret\n"); +-#endif +- +- GSL_PUT_LABEL(tmp_loop, node->line_number); +- +- while (cur != NULL) +- { +- NodeType *x, *var; +- +- /* 1: x=var */ +- x = nodeClone(node->unode.opr.op[0]); +- var = nodeClone(cur->unode.opr.op[0]); +- commit_node(new_set(x, var),0); +- +- /* 2: instr */ +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "call", INSTR_CALL, 1, node->line_number); +- gsl_instr_add_param(currentGoomSL->instr, tmp_func, TYPE_LABEL); +-#ifdef VERBOSE +- printf("call %s\n", tmp_func); +-#endif +- +- /* 3: var=x */ +- x = nodeClone(node->unode.opr.op[0]); +- var = cur->unode.opr.op[0]; +- commit_node(new_set(var, x),0); +- cur = cur->unode.opr.op[1]; +- } +- nodeFree(node->unode.opr.op[0]); +- } /* }}} */ +- +- /* IF */ +- static NodeType *new_if(NodeType *expression, NodeType *instr) { /* {{{ */ +- NodeType *node = new_op("if", OPR_IF, 2); +- node->unode.opr.op[0] = expression; +- node->unode.opr.op[1] = instr; +- return node; +- } +- static void commit_if(NodeType *node) { +- +- char slab[1024]; +- sprintf(slab, "|eif%d|", allocateLabel()); +- commit_node(node->unode.opr.op[0],0); +- GSL_PUT_JZERO(slab,node->line_number); +- /* code */ +- commit_node(node->unode.opr.op[1],0); +- GSL_PUT_LABEL(slab,node->line_number); +- } /* }}} */ +- +- /* BLOCK */ +- static NodeType *new_block(NodeType *lastNode) { /* {{{ */ +- NodeType *blk = new_op("block", OPR_BLOCK, 2); +- blk->unode.opr.op[0] = new_nop("start_of_block"); +- blk->unode.opr.op[1] = lastNode; +- return blk; +- } +- static void commit_block(NodeType *node) { +- commit_node(node->unode.opr.op[0]->unode.opr.next,0); +- } /* }}} */ +- +- /* FUNCTION INTRO */ +- static NodeType *new_function_intro(const char *name) { /* {{{ */ +- char stmp[256]; +- if (strlen(name) < 200) { +- sprintf(stmp, "|__func_%s|", name); +- } +- return new_op(stmp, OPR_FUNC_INTRO, 0); +- } +- static void commit_function_intro(NodeType *node) { +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "label", INSTR_LABEL, 1, node->line_number); +- gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_LABEL); +-#ifdef VERBOSE +- printf("label %s\n", node->str); +-#endif +- } /* }}} */ +- +- /* FUNCTION OUTRO */ +- static NodeType *new_function_outro() { /* {{{ */ +- return new_op("ret", OPR_FUNC_OUTRO, 0); +- } +- static void commit_function_outro(NodeType *node) { +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "ret", INSTR_RET, 1, node->line_number); +- gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); +- releaseAllTemps(); +-#ifdef VERBOSE +- printf("ret\n"); +-#endif +- } /* }}} */ +- +- /* AFFECTATION LIST */ +- static NodeType *new_affec_list(NodeType *set, NodeType *next) /* {{{ */ +- { +- NodeType *node = new_op("affect_list", OPR_AFFECT_LIST, 2); +- node->unode.opr.op[0] = set; +- node->unode.opr.op[1] = next; +- return node; +- } +- static NodeType *new_affect_list_after(NodeType *affect_list) +- { +- NodeType *ret = NULL; +- NodeType *cur = affect_list; +- while(cur != NULL) { +- NodeType *set = cur->unode.opr.op[0]; +- NodeType *next = cur->unode.opr.op[1]; +- NodeType *lvalue = set->unode.opr.op[0]; +- NodeType *expression = set->unode.opr.op[1]; +- if ((lvalue->str[0] == '&') && (expression->type == VAR_NODE)) { +- NodeType *nset = new_set(nodeClone(expression), nodeClone(lvalue)); +- ret = new_affec_list(nset, ret); +- } +- cur = next; +- } +- return ret; +- } +- static void commit_affect_list(NodeType *node) +- { +- NodeType *cur = node; +- while(cur != NULL) { +- NodeType *set = cur->unode.opr.op[0]; +- precommit_node(set->unode.opr.op[0]); +- precommit_node(set->unode.opr.op[1]); +- cur = cur->unode.opr.op[1]; +- } +- cur = node; +- while(cur != NULL) { +- NodeType *set = cur->unode.opr.op[0]; +- commit_node(set,0); +- cur = cur->unode.opr.op[1]; +- } +- } /* }}} */ +- +- /* VAR LIST */ +- static NodeType *new_var_list(NodeType *var, NodeType *next) /* {{{ */ +- { +- NodeType *node = new_op("var_list", OPR_VAR_LIST, 2); +- node->unode.opr.op[0] = var; +- node->unode.opr.op[1] = next; +- return node; +- } +- static void commit_var_list(NodeType *node) +- { +- } /* }}} */ +- +- /* FUNCTION CALL */ +- static NodeType *new_call(const char *name, NodeType *affect_list) { /* {{{ */ +- HashValue *fval; +- fval = goom_hash_get(currentGoomSL->functions, name); +- if (!fval) { +- gsl_declare_task(name); +- fval = goom_hash_get(currentGoomSL->functions, name); +- } +- if (!fval) { +- fprintf(stderr, "ERROR: Line %d, Could not find function %s\n", currentGoomSL->num_lines, name); +- exit(1); +- return NULL; +- } +- else { +- ExternalFunctionStruct *gef = (ExternalFunctionStruct*)fval->ptr; +- if (gef->is_extern) { +- NodeType *node = new_op(name, OPR_EXT_CALL, 1); +- node->unode.opr.op[0] = affect_list; +- return node; +- } +- else { +- NodeType *node; +- char stmp[256]; +- if (strlen(name) < 200) { +- sprintf(stmp, "|__func_%s|", name); +- } +- node = new_op(stmp, OPR_CALL, 1); +- node->unode.opr.op[0] = affect_list; +- return node; +- } +- } +- } +- static void commit_ext_call(NodeType *node) { +- NodeType *alafter = new_affect_list_after(node->unode.opr.op[0]); +- commit_node(node->unode.opr.op[0],0); +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "extcall", INSTR_EXT_CALL, 1, node->line_number); +- gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_VAR); +-#ifdef VERBOSE +- printf("extcall %s\n", node->str); +-#endif +- commit_node(alafter,0); +- } +- static void commit_call(NodeType *node) { +- NodeType *alafter = new_affect_list_after(node->unode.opr.op[0]); +- commit_node(node->unode.opr.op[0],0); +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "call", INSTR_CALL, 1, node->line_number); +- gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_LABEL); +-#ifdef VERBOSE +- printf("call %s\n", node->str); +-#endif +- commit_node(alafter,0); +- } /* }}} */ +- +- /** **/ +- +- static NodeType *rootNode = 0; /* TODO: reinitialiser a chaque compilation. */ +- static NodeType *lastNode = 0; +- static NodeType *gsl_append(NodeType *curNode) { +- if (curNode == 0) return 0; /* {{{ */ +- if (lastNode) +- lastNode->unode.opr.next = curNode; +- lastNode = curNode; +- while(lastNode->unode.opr.next) lastNode = lastNode->unode.opr.next; +- if (rootNode == 0) +- rootNode = curNode; +- return curNode; +- } /* }}} */ +- +-#if 1 +- int allocateTemp() { +- return allocateLabel(); +- } +- void releaseAllTemps() {} +- void releaseTemp(int n) {} +-#else +- static int nbTemp = 0; +- static int *tempArray = 0; +- static int tempArraySize = 0; +- int allocateTemp() { /* TODO: allocateITemp, allocateFTemp */ +- int i = 0; /* {{{ */ +- if (tempArray == 0) { +- tempArraySize = 256; +- tempArray = (int*)malloc(tempArraySize * sizeof(int)); +- } +- while (1) { +- int j; +- for (j=0;j<nbTemp;++j) { +- if (tempArray[j] == i) break; +- } +- if (j == nbTemp) { +- if (nbTemp == tempArraySize) { +- tempArraySize *= 2; +- tempArray = (int*)realloc(tempArray,tempArraySize * sizeof(int)); +- } +- tempArray[nbTemp++] = i; +- return i; +- } +- i++; +- } +- } /* }}} */ +- void releaseAllTemps() { +- nbTemp = 0; /* {{{ */ +- } /* }}} */ +- void releaseTemp(int n) { +- int j; /* {{{ */ +- for (j=0;j<nbTemp;++j) { +- if (tempArray[j] == n) { +- tempArray[j] = tempArray[--nbTemp]; +- break; +- } +- } +- } /* }}} */ +-#endif +- +- static int lastLabel = 0; +- int allocateLabel() { +- return ++lastLabel; /* {{{ */ +- } /* }}} */ +- +- void gsl_commit_compilation() +- { /* {{{ */ +- commit_node(rootNode,0); +- rootNode = 0; +- lastNode = 0; +- } /* }}} */ +- +- void precommit_node(NodeType *node) +- { /* {{{ */ +- /* do here stuff for expression.. for exemple */ +- if (node->type == OPR_NODE) +- switch(node->unode.opr.type) { +- case OPR_ADD: precommit_add(node); break; +- case OPR_SUB: precommit_sub(node); break; +- case OPR_MUL: precommit_mul(node); break; +- case OPR_DIV: precommit_div(node); break; +- case OPR_CALL_EXPR: precommit_call_expr(node); break; +- } +- } /* }}} */ +- +- void commit_node(NodeType *node, int releaseIfTmp) +- { /* {{{ */ +- if (node == 0) return; +- +- switch(node->type) { +- case OPR_NODE: +- switch(node->unode.opr.type) { +- case OPR_SET: commit_set(node); break; +- case OPR_PLUS_EQ: commit_plus_eq(node); break; +- case OPR_SUB_EQ: commit_sub_eq(node); break; +- case OPR_MUL_EQ: commit_mul_eq(node); break; +- case OPR_DIV_EQ: commit_div_eq(node); break; +- case OPR_IF: commit_if(node); break; +- case OPR_WHILE: commit_while(node); break; +- case OPR_BLOCK: commit_block(node); break; +- case OPR_FUNC_INTRO: commit_function_intro(node); break; +- case OPR_FUNC_OUTRO: commit_function_outro(node); break; +- case OPR_CALL: commit_call(node); break; +- case OPR_EXT_CALL: commit_ext_call(node); break; +- case OPR_EQU: commit_equ(node); break; +- case OPR_LOW: commit_low(node); break; +- case OPR_NOT: commit_not(node); break; +- case OPR_AFFECT_LIST: commit_affect_list(node); break; +- case OPR_FOREACH: commit_foreach(node); break; +- case OPR_VAR_LIST: commit_var_list(node); break; +-#ifdef VERBOSE +- case EMPTY_NODE: printf("NOP\n"); break; +-#endif +- } +- +- commit_node(node->unode.opr.next,0); /* recursive for the moment, maybe better to do something iterative? */ +- break; +- +- case VAR_NODE: gsl_instr_set_namespace(currentGoomSL->instr, node->vnamespace); +- gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_VAR); break; +- case CONST_INT_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_INTEGER); break; +- case CONST_FLOAT_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_FLOAT); break; +- case CONST_PTR_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_PTR); break; +- } +- if (releaseIfTmp && is_tmp_expr(node)) +- releaseTemp(get_tmp_id(node)); +- +- nodeFree(node); +- } /* }}} */ +- +- NodeType *nodeNew(const char *str, int type, int line_number) { +- NodeType *node = (NodeType*)malloc(sizeof(NodeType)); /* {{{ */ +- node->type = type; +- node->str = (char*)malloc(strlen(str)+1); +- node->vnamespace = NULL; +- node->line_number = line_number; +- strcpy(node->str, str); +- return node; +- } /* }}} */ +- static NodeType *nodeClone(NodeType *node) { +- NodeType *ret = nodeNew(node->str, node->type, node->line_number); /* {{{ */ +- ret->vnamespace = node->vnamespace; +- ret->unode = node->unode; +- return ret; +- } /* }}} */ +- +- void nodeFreeInternals(NodeType *node) { +- free(node->str); /* {{{ */ +- } /* }}} */ +- +- void nodeFree(NodeType *node) { +- nodeFreeInternals(node); /* {{{ */ +- free(node); +- } /* }}} */ +- +- NodeType *new_constInt(const char *str, int line_number) { +- NodeType *node = nodeNew(str, CONST_INT_NODE, line_number); /* {{{ */ +- node->unode.constInt.val = atoi(str); +- return node; +- } /* }}} */ +- +- NodeType *new_constPtr(const char *str, int line_number) { +- NodeType *node = nodeNew(str, CONST_PTR_NODE, line_number); /* {{{ */ +- node->unode.constPtr.id = strtol(str,NULL,0); +- return node; +- } /* }}} */ +- +- NodeType *new_constFloat(const char *str, int line_number) { +- NodeType *node = nodeNew(str, CONST_FLOAT_NODE, line_number); /* {{{ */ +- node->unode.constFloat.val = atof(str); +- return node; +- } /* }}} */ +- +- NodeType *new_var(const char *str, int line_number) { +- NodeType *node = nodeNew(str, VAR_NODE, line_number); /* {{{ */ +- node->vnamespace = gsl_find_namespace(str); +- if (node->vnamespace == 0) { +- fprintf(stderr, "ERROR: Line %d, Variable not found: '%s'\n", line_number, str); +- exit(1); +- } +- return node; +- } /* }}} */ +- +- NodeType *new_nop(const char *str) { +- NodeType *node = new_op(str, EMPTY_NODE, 0); /* {{{ */ +- return node; +- } /* }}} */ +- +- NodeType *new_op(const char *str, int type, int nbOp) { +- int i; /* {{{ */ +- NodeType *node = nodeNew(str, OPR_NODE, currentGoomSL->num_lines); +- node->unode.opr.next = 0; +- node->unode.opr.type = type; +- node->unode.opr.nbOp = nbOp; +- for (i=0;i<nbOp;++i) node->unode.opr.op[i] = 0; +- return node; +- } /* }}} */ +- +- +- void gsl_declare_global_variable(int type, char *name) { +- switch(type){ +- case -1: break; +- case FLOAT_TK:gsl_float_decl_global(name);break; +- case INT_TK: gsl_int_decl_global(name);break; +- case PTR_TK: gsl_ptr_decl_global(name);break; +- default: +- { +- int id = type - 1000; +- gsl_struct_decl_global_from_id(name,id); +- } +- } +- } +- +-%} +- +-%union { +- int intValue; +- float floatValue; +- char charValue; +- char strValue[2048]; +- NodeType *nPtr; +- GoomHash *namespace; +- GSL_Struct *gsl_struct; +- GSL_StructField *gsl_struct_field; +- }; +- +-%token <strValue> LTYPE_INTEGER +-%token <strValue> LTYPE_FLOAT +-%token <strValue> LTYPE_VAR +-%token <strValue> LTYPE_PTR +- +-%token PTR_TK INT_TK FLOAT_TK DECLARE EXTERNAL WHILE DO NOT PLUS_EQ SUB_EQ DIV_EQ MUL_EQ SUP_EQ LOW_EQ NOT_EQ STRUCT FOR IN +- +-%type <intValue> return_type +-%type <nPtr> expression constValue instruction test func_call func_call_expression +-%type <nPtr> start_block affectation_list affectation_in_list affectation declaration +-%type <nPtr> var_list_content var_list +-%type <strValue> task_name ext_task_name +-%type <namespace> leave_namespace +-%type <gsl_struct> struct_members +-%type <gsl_struct_field> struct_member +-%left '\n' +-%left PLUS_EQ SUB_EQ MUL_EQ DIV_EQ +-%left NOT +-%left '=' '<' '>' +-%left '+' '-' +-%left '/' '*' +- +-%% +- +-/* -------------- Global architechture of a GSL program ------------*/ +- +-gsl: gsl_code function_outro gsl_def_functions ; +- +-gsl_code: gsl_code instruction { gsl_append($2); } +- | gsl_code EXTERNAL '<' ext_task_name '>' return_type '\n' leave_namespace { gsl_declare_global_variable($6,$4); } +- | gsl_code EXTERNAL '<' ext_task_name ':' arglist '>' return_type '\n' leave_namespace { gsl_declare_global_variable($8,$4); } +- | gsl_code DECLARE '<' task_name '>' return_type '\n' leave_namespace { gsl_declare_global_variable($6,$4); } +- | gsl_code DECLARE '<' task_name ':' arglist '>' return_type '\n' leave_namespace { gsl_declare_global_variable($8,$4); } +- | gsl_code struct_declaration +- | gsl_code '\n' +- | +- ; +- +-/* ------------- Declaration of a structure ------------ */ +- +-struct_declaration: STRUCT '<' LTYPE_VAR ':' struct_members '>' '\n' { gsl_add_struct($3, $5); } +- ; +- +-struct_members: opt_nl struct_member { $$ = gsl_new_struct($2); } +- | struct_members ',' opt_nl struct_member { $$ = $1; gsl_add_struct_field($1, $4); } +- ; +- +-struct_member: INT_TK LTYPE_VAR { $$ = gsl_new_struct_field($2, INSTR_INT); } +- | FLOAT_TK LTYPE_VAR { $$ = gsl_new_struct_field($2, INSTR_FLOAT); } +- | PTR_TK LTYPE_VAR { $$ = gsl_new_struct_field($2, INSTR_PTR); } +- | LTYPE_VAR LTYPE_VAR { $$ = gsl_new_struct_field_struct($2, $1); } +- ; +- +-/* ------------- Fonction declarations -------------- */ +- +-ext_task_name: LTYPE_VAR { gsl_declare_external_task($1); gsl_enternamespace($1); strcpy($$,$1); } +- ; +-task_name: LTYPE_VAR { gsl_declare_task($1); gsl_enternamespace($1); strcpy($$,$1); strcpy($$,$1); } +- ; +- +-return_type: { $$=-1; } +- | ':' INT_TK { $$=INT_TK; } +- | ':' FLOAT_TK { $$=FLOAT_TK; } +- | ':' PTR_TK { $$=PTR_TK; } +- | ':' LTYPE_VAR { $$= 1000 + gsl_get_struct_id($2); } +- ; +- +-arglist: empty_declaration +- | empty_declaration ',' arglist +- ; +- +-/* ------------- Fonction definition -------------- */ +- +-gsl_def_functions: gsl_def_functions function +- | +- ; +- +-function: function_intro gsl_code function_outro { gsl_leavenamespace(); } +- +-function_intro: '<' task_name '>' return_type '\n' { gsl_append(new_function_intro($2)); +- gsl_declare_global_variable($4,$2); } +- | '<' task_name ':' arglist '>' return_type '\n' { gsl_append(new_function_intro($2)); +- gsl_declare_global_variable($6,$2); } +- ; +-function_outro: { gsl_append(new_function_outro()); } ; +- +-leave_namespace: { $$ = gsl_leavenamespace(); }; +- +-/* ------------ Variable declaration ---------------- */ +- +-declaration: FLOAT_TK LTYPE_VAR '=' expression { gsl_float_decl_local($2); $$ = new_set(new_var($2,currentGoomSL->num_lines), $4); } +- | INT_TK LTYPE_VAR '=' expression { gsl_int_decl_local($2); $$ = new_set(new_var($2,currentGoomSL->num_lines), $4); } +- | PTR_TK LTYPE_VAR '=' expression { gsl_ptr_decl_local($2); $$ = new_set(new_var($2,currentGoomSL->num_lines), $4); } +- | LTYPE_VAR LTYPE_VAR '=' expression { gsl_struct_decl_local($1,$2); $$ = new_set(new_var($2,currentGoomSL->num_lines), $4); } +- | empty_declaration { $$ = 0; } +- ; +- +-empty_declaration: FLOAT_TK LTYPE_VAR { gsl_float_decl_local($2); } +- | INT_TK LTYPE_VAR { gsl_int_decl_local($2); } +- | PTR_TK LTYPE_VAR { gsl_ptr_decl_local($2); } +- | LTYPE_VAR LTYPE_VAR { gsl_struct_decl_local($1,$2); } +- ; +- +-/* -------------- Instructions and Expressions ------------------ */ +- +-instruction: affectation '\n' { $$ = $1; } +- | declaration '\n' { $$ = $1; } +- | '(' test ')' '?' opt_nl instruction { $$ = new_if($2,$6); } +- | WHILE test opt_nl DO opt_nl instruction { $$ = new_while($2,$6); } +- | '{' '\n' start_block gsl_code '}' '\n' { lastNode = $3->unode.opr.op[1]; $$=$3; } +- | func_call { $$ = $1; } +- | LTYPE_VAR PLUS_EQ expression { $$ = new_plus_eq(new_var($1,currentGoomSL->num_lines),$3); } +- | LTYPE_VAR SUB_EQ expression { $$ = new_sub_eq(new_var($1,currentGoomSL->num_lines),$3); } +- | LTYPE_VAR MUL_EQ expression { $$ = new_mul_eq(new_var($1,currentGoomSL->num_lines),$3); } +- | LTYPE_VAR DIV_EQ expression { $$ = new_div_eq(new_var($1,currentGoomSL->num_lines),$3); } +- | FOR LTYPE_VAR IN var_list DO instruction { $$ = new_static_foreach(new_var($2, currentGoomSL->num_lines), $4, $6); } +- ; +- +-var_list: '(' var_list_content ')' { $$ = $2; } +- ; +-var_list_content: LTYPE_VAR { $$ = new_var_list(new_var($1,currentGoomSL->num_lines), NULL); } +- | LTYPE_VAR var_list_content { $$ = new_var_list(new_var($1,currentGoomSL->num_lines), $2); } +- ; +- +-affectation: LTYPE_VAR '=' expression { $$ = new_set(new_var($1,currentGoomSL->num_lines),$3); } ; +- +-start_block: { $$ = new_block(lastNode); lastNode = $$->unode.opr.op[0]; } +- ; +- +-expression: LTYPE_VAR { $$ = new_var($1,currentGoomSL->num_lines); } +- | constValue { $$ = $1; } +- | expression '*' expression { $$ = new_mul($1,$3); } +- | expression '/' expression { $$ = new_div($1,$3); } +- | expression '+' expression { $$ = new_add($1,$3); } +- | expression '-' expression { $$ = new_sub($1,$3); } +- | '-' expression { $$ = new_neg($2); } +- | '(' expression ')' { $$ = $2; } +- | func_call_expression { $$ = $1; } +- ; +- +-test: expression '=' expression { $$ = new_equ($1,$3); } +- | expression '<' expression { $$ = new_low($1,$3); } +- | expression '>' expression { $$ = new_low($3,$1); } +- | expression SUP_EQ expression { $$ = new_not(new_low($1,$3)); } +- | expression LOW_EQ expression { $$ = new_not(new_low($3,$1)); } +- | expression NOT_EQ expression { $$ = new_not(new_equ($1,$3)); } +- | NOT test { $$ = new_not($2); } +- ; +- +-constValue: LTYPE_FLOAT { $$ = new_constFloat($1,currentGoomSL->num_lines); } +- | LTYPE_INTEGER { $$ = new_constInt($1,currentGoomSL->num_lines); } +- | LTYPE_PTR { $$ = new_constPtr($1,currentGoomSL->num_lines); } +- ; +- +-/* ---------------- Function Calls ------------------ */ +- +-func_call: task_name '\n' leave_namespace { $$ = new_call($1,NULL); } +- | task_name ':' affectation_list '\n' leave_namespace { $$ = new_call($1,$3); } +- | '[' task_name ']' '\n' leave_namespace { $$ = new_call($2,NULL); } +- | '[' task_name ':' affectation_list ']' '\n' leave_namespace { $$ = new_call($2,$4); } +- ; +- +-func_call_expression: +- '[' task_name leave_namespace ']' { $$ = new_call_expr($2,NULL); } +- | '[' task_name ':' affectation_list ']' leave_namespace { $$ = new_call_expr($2,$4); } +- ; +- +-affectation_list: affectation_in_list affectation_list { $$ = new_affec_list($1,$2); } +- | affectation_in_list { $$ = new_affec_list($1,NULL); } +- +-affectation_in_list: LTYPE_VAR '=' leave_namespace expression { +- gsl_reenternamespace($3); +- $$ = new_set(new_var($1,currentGoomSL->num_lines),$4); +- } +- | ':' leave_namespace expression { +- gsl_reenternamespace($2); +- $$ = new_set(new_var("&this", currentGoomSL->num_lines),$3); +- } +- ; +- +- +-/* ------------ Misc ---------- */ +- +-opt_nl: '\n' | ; +- +- +-%% +- +- +-void yyerror(char *str) +-{ /* {{{ */ +- fprintf(stderr, "ERROR: Line %d, %s\n", currentGoomSL->num_lines, str); +- currentGoomSL->compilationOK = 0; +- exit(1); +-} /* }}} */ +- +diff -Naur /home/d4rk/goom2k4-0/src/goom_tools.c /src/goom_tools.c +--- /home/d4rk/goom2k4-0/src/goom_tools.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goom_tools.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,25 +0,0 @@ +-#include "goom_tools.h" +-#include <stdlib.h> +- +-GoomRandom *goom_random_init(int i) { +- GoomRandom *grandom = (GoomRandom*)malloc(sizeof(GoomRandom)); +- srand (i); +- grandom->pos = 1; +- goom_random_update_array(grandom, GOOM_NB_RAND); +- return grandom; +-} +- +-void goom_random_free(GoomRandom *grandom) { +- free(grandom); +-} +- +-void goom_random_update_array(GoomRandom *grandom, int numberOfValuesToChange) { +- while (numberOfValuesToChange > 0) { +-#if RAND_MAX < 0x10000 +- grandom->array[grandom->pos++] = ((rand()<<16)+rand()) / 127; +-#else +- grandom->array[grandom->pos++] = rand() / 127; +-#endif +- numberOfValuesToChange--; +- } +-} +diff -Naur /home/d4rk/goom2k4-0/src/goom_tools.h /src/goom_tools.h +--- /home/d4rk/goom2k4-0/src/goom_tools.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goom_tools.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,33 +0,0 @@ +-#ifndef _GOOMTOOLS_H +-#define _GOOMTOOLS_H +- +-/** +- * Random number generator wrapper for faster random number. +- */ +- +-#define GOOM_NB_RAND 0x10000 +- +-typedef struct _GOOM_RANDOM { +- int array[GOOM_NB_RAND]; +- unsigned short pos; +-} GoomRandom; +- +-GoomRandom *goom_random_init(int i); +-void goom_random_free(GoomRandom *grandom); +- +-inline static int goom_random(GoomRandom *grandom) { +- +- grandom->pos++; /* works because pos is an unsigned short */ +- return grandom->array[grandom->pos]; +-} +- +-inline static int goom_irand(GoomRandom *grandom, int i) { +- +- grandom->pos++; +- return grandom->array[grandom->pos] % i; +-} +- +-/* called to change the specified number of value in the array, so that the array does not remain the same*/ +-void goom_random_update_array(GoomRandom *grandom, int numberOfValuesToChange); +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/goom_typedefs.h /src/goom_typedefs.h +--- /home/d4rk/goom2k4-0/src/goom_typedefs.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goom_typedefs.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,11 +0,0 @@ +-#ifndef _GOOM_TYPEDEFS_H +-#define _GOOM_TYPEDEFS_H +- +-typedef struct _PLUGIN_INFO PluginInfo; +-typedef struct _SOUND_INFO SoundInfo; +-typedef struct _GMLINE GMLine; +-typedef struct _GMUNITPOINTER GMUnitPointer; +-typedef struct _ZOOM_FILTER_DATA ZoomFilterData; +-typedef struct _VISUAL_FX VisualFX; +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/goom_visual_fx.h /src/goom_visual_fx.h +--- /home/d4rk/goom2k4-0/src/goom_visual_fx.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goom_visual_fx.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,26 +0,0 @@ +-#ifndef _VISUAL_FX_H +-#define _VISUAL_FX_H +- +-/** +- * File created on 2003-05-21 by Jeko. +- * (c)2003, JC Hoelt for iOS-software. +- * +- * LGPL Licence. +- * If you use this file on a visual program, +- * please make my name being visible on it. +- */ +- +-#include "goom_config_param.h" +-#include "goom_graphic.h" +-#include "goom_typedefs.h" +- +-struct _VISUAL_FX { +- void (*init) (struct _VISUAL_FX *_this, PluginInfo *info); +- void (*free) (struct _VISUAL_FX *_this); +- void (*apply) (struct _VISUAL_FX *_this, Pixel *src, Pixel *dest, PluginInfo *info); +- void *fx_data; +- +- PluginParameters *params; +-}; +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/graphic.c /src/graphic.c +--- /home/d4rk/goom2k4-0/src/graphic.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/graphic.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,10 +0,0 @@ +-#include "goom_graphic.h" +- +-const Color BLACK = { 0, 0, 0 }; +-const Color WHITE = { 0xff, 0xff, 0xff }; +-const Color RED = { 0xff, 0x05, 0x05 }; +-const Color GREEN = { 0x05, 0xff, 0x05 }; +-const Color BLUE = { 0x05, 0x05, 0xff }; +-const Color YELLOW = { 0xff, 0xff, 0x33 }; +-const Color ORANGE = { 0xff, 0xcc, 0x05 }; +-const Color VIOLET = { 0x55, 0x05, 0xff }; +diff -Naur /home/d4rk/goom2k4-0/src/ifs.c /src/ifs.c +--- /home/d4rk/goom2k4-0/src/ifs.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/ifs.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,763 +0,0 @@ +-/* +- * ifs.c --- modified iterated functions system for goom. +- */ +- +-/*- +- * Copyright (c) 1997 by Massimino Pascal <Pascal.Massimon@ens.fr> +- * +- * Permission to use, copy, modify, and distribute this software and its +- * documentation for any purpose and without fee is hereby granted, +- * provided that the above copyright notice appear in all copies and that +- * both that copyright notice and this permission notice appear in +- * supporting documentation. +- * +- * This file is provided AS IS with no warranties of any kind. The author +- * shall have no liability with respect to the infringement of copyrights, +- * trade secrets or any patents by this file or any part thereof. In no +- * event will the author be liable for any lost revenue or profits or +- * other special, indirect and consequential damages. +- * +- * If this mode is weird and you have an old MetroX server, it is buggy. +- * There is a free SuSE-enhanced MetroX X server that is fine. +- * +- * When shown ifs, Diana Rose (4 years old) said, "It looks like dancing." +- * +- * Revision History: +- * 13-Dec-2003: Added some goom specific stuffs (to make ifs a VisualFX). +- * 11-Apr-2002: jeko@ios-software.com: Make ifs.c system-indendant. (ifs.h added) +- * 01-Nov-2000: Allocation checks +- * 10-May-1997: jwz@jwz.org: turned into a standalone program. +- * Made it render into an offscreen bitmap and then copy +- * that onto the screen, to reduce flicker. +- */ +- +-/* #ifdef STANDALONE */ +- +-#include <math.h> +-#include <stdlib.h> +-#include <stdio.h> +- +-#include "goom_config.h" +- +-#ifdef HAVE_MMX +-#include "mmx.h" +-#endif +- +-#include "goom_graphic.h" +-#include "ifs.h" +-#include "goom_tools.h" +- +-typedef struct _ifsPoint +-{ +- gint32 x, y; +-} +-IFSPoint; +- +- +-#define MODE_ifs +- +-#define PROGCLASS "IFS" +- +-#define HACK_INIT init_ifs +-#define HACK_DRAW draw_ifs +- +-#define ifs_opts xlockmore_opts +- +-#define DEFAULTS "*delay: 20000 \n" \ +-"*ncolors: 100 \n" +- +-#define SMOOTH_COLORS +- +-#define LRAND() ((long) (goom_random(goomInfo->gRandom) & 0x7fffffff)) +-#define NRAND(n) ((int) (LRAND() % (n))) +- +-#if RAND_MAX < 0x10000 +-#define MAXRAND (((float)(RAND_MAX<16)+((float)RAND_MAX)+1.0f)/127.0f) +-#else +-#define MAXRAND (2147483648.0/127.0) /* unsigned 1<<31 / 127.0 (cf goom_tools) as a float */ +-#endif +- +-/*****************************************************/ +- +-typedef float DBL; +-typedef int F_PT; +- +-/* typedef float F_PT; */ +- +-/*****************************************************/ +- +-#define FIX 12 +-#define UNIT ( 1<<FIX ) +-#define MAX_SIMI 6 +- +-#define MAX_DEPTH_2 10 +-#define MAX_DEPTH_3 6 +-#define MAX_DEPTH_4 4 +-#define MAX_DEPTH_5 2 +- +-/* PREVIOUS VALUE +-#define MAX_SIMI 6 +- +- * settings for a PC 120Mhz... * +-#define MAX_DEPTH_2 10 +-#define MAX_DEPTH_3 6 +-#define MAX_DEPTH_4 4 +-#define MAX_DEPTH_5 3 +-*/ +- +-#define DBL_To_F_PT(x) (F_PT)( (DBL)(UNIT)*(x) ) +- +-typedef struct Similitude_Struct SIMI; +-typedef struct Fractal_Struct FRACTAL; +- +-struct Similitude_Struct +-{ +- +- DBL c_x, c_y; +- DBL r, r2, A, A2; +- F_PT Ct, St, Ct2, St2; +- F_PT Cx, Cy; +- F_PT R, R2; +-}; +- +- +-struct Fractal_Struct +-{ +- +- int Nb_Simi; +- SIMI Components[5 * MAX_SIMI]; +- int Depth, Col; +- int Count, Speed; +- int Width, Height, Lx, Ly; +- DBL r_mean, dr_mean, dr2_mean; +- int Cur_Pt, Max_Pt; +- +- IFSPoint *Buffer1, *Buffer2; +-}; +- +-typedef struct _IFS_DATA { +- FRACTAL *Root; +- FRACTAL *Cur_F; +- +- /* Used by the Trace recursive method */ +- IFSPoint *Buf; +- int Cur_Pt; +- int initalized; +-} IfsData; +- +- +-/*****************************************************/ +- +-static DBL +-Gauss_Rand (PluginInfo *goomInfo, DBL c, DBL A, DBL S) +-{ +- DBL y; +- +- y = (DBL) LRAND () / MAXRAND; +- y = A * (1.0 - exp (-y * y * S)) / (1.0 - exp (-S)); +- if (NRAND (2)) +- return (c + y); +- return (c - y); +-} +- +-static DBL +-Half_Gauss_Rand (PluginInfo *goomInfo, DBL c, DBL A, DBL S) +-{ +- DBL y; +- +- y = (DBL) LRAND () / MAXRAND; +- y = A * (1.0 - exp (-y * y * S)) / (1.0 - exp (-S)); +- return (c + y); +-} +- +-static void +-Random_Simis (PluginInfo *goomInfo, FRACTAL * F, SIMI * Cur, int i) +-{ +- while (i--) { +- Cur->c_x = Gauss_Rand (goomInfo, 0.0, .8, 4.0); +- Cur->c_y = Gauss_Rand (goomInfo, 0.0, .8, 4.0); +- Cur->r = Gauss_Rand (goomInfo, F->r_mean, F->dr_mean, 3.0); +- Cur->r2 = Half_Gauss_Rand (goomInfo, 0.0, F->dr2_mean, 2.0); +- Cur->A = Gauss_Rand (goomInfo, 0.0, 360.0, 4.0) * (M_PI / 180.0); +- Cur->A2 = Gauss_Rand (goomInfo, 0.0, 360.0, 4.0) * (M_PI / 180.0); +- Cur++; +- } +-} +- +-static void +-free_ifs_buffers (FRACTAL * Fractal) +-{ +- if (Fractal->Buffer1 != NULL) { +- (void) free ((void *) Fractal->Buffer1); +- Fractal->Buffer1 = (IFSPoint *) NULL; +- } +- if (Fractal->Buffer2 != NULL) { +- (void) free ((void *) Fractal->Buffer2); +- Fractal->Buffer2 = (IFSPoint *) NULL; +- } +-} +- +- +-static void +-free_ifs (FRACTAL * Fractal) +-{ +- free_ifs_buffers (Fractal); +-} +- +-/***************************************************************/ +- +-static void +-init_ifs (PluginInfo *goomInfo, IfsData *data) +-{ +- int i; +- FRACTAL *Fractal; +- int width = goomInfo->screen.width; +- int height = goomInfo->screen.height; +- +- if (data->Root == NULL) { +- data->Root = (FRACTAL *) malloc (sizeof (FRACTAL)); +- if (data->Root == NULL) +- return; +- data->Root->Buffer1 = (IFSPoint *) NULL; +- data->Root->Buffer2 = (IFSPoint *) NULL; +- } +- Fractal = data->Root; +- +- free_ifs_buffers (Fractal); +- +- i = (NRAND (4)) + 2; /* Number of centers */ +- switch (i) { +- case 3: +- Fractal->Depth = MAX_DEPTH_3; +- Fractal->r_mean = .6; +- Fractal->dr_mean = .4; +- Fractal->dr2_mean = .3; +- break; +- +- case 4: +- Fractal->Depth = MAX_DEPTH_4; +- Fractal->r_mean = .5; +- Fractal->dr_mean = .4; +- Fractal->dr2_mean = .3; +- break; +- +- case 5: +- Fractal->Depth = MAX_DEPTH_5; +- Fractal->r_mean = .5; +- Fractal->dr_mean = .4; +- Fractal->dr2_mean = .3; +- break; +- +- default: +- case 2: +- Fractal->Depth = MAX_DEPTH_2; +- Fractal->r_mean = .7; +- Fractal->dr_mean = .3; +- Fractal->dr2_mean = .4; +- break; +- } +- Fractal->Nb_Simi = i; +- Fractal->Max_Pt = Fractal->Nb_Simi - 1; +- for (i = 0; i <= Fractal->Depth + 2; ++i) +- Fractal->Max_Pt *= Fractal->Nb_Simi; +- +- if ((Fractal->Buffer1 = (IFSPoint *) calloc (Fractal->Max_Pt, +- sizeof (IFSPoint))) == NULL) { +- free_ifs (Fractal); +- return; +- } +- if ((Fractal->Buffer2 = (IFSPoint *) calloc (Fractal->Max_Pt, +- sizeof (IFSPoint))) == NULL) { +- free_ifs (Fractal); +- return; +- } +- +- Fractal->Speed = 6; +- Fractal->Width = width; /* modif by JeKo */ +- Fractal->Height = height; /* modif by JeKo */ +- Fractal->Cur_Pt = 0; +- Fractal->Count = 0; +- Fractal->Lx = (Fractal->Width - 1) / 2; +- Fractal->Ly = (Fractal->Height - 1) / 2; +- Fractal->Col = rand () % (width * height); /* modif by JeKo */ +- +- Random_Simis (goomInfo, Fractal, Fractal->Components, 5 * MAX_SIMI); +-} +- +- +-/***************************************************************/ +- +-static inline void +-Transform (SIMI * Simi, F_PT xo, F_PT yo, F_PT * x, F_PT * y) +-{ +- F_PT xx, yy; +- +- xo = xo - Simi->Cx; +- xo = (xo * Simi->R) >> FIX; /* / UNIT; */ +- yo = yo - Simi->Cy; +- yo = (yo * Simi->R) >> FIX; /* / UNIT; */ +- +- xx = xo - Simi->Cx; +- xx = (xx * Simi->R2) >> FIX; /* / UNIT; */ +- yy = -yo - Simi->Cy; +- yy = (yy * Simi->R2) >> FIX; /* / UNIT; */ +- +- *x = +- ((xo * Simi->Ct - yo * Simi->St + xx * Simi->Ct2 - yy * Simi->St2) +- >> FIX /* / UNIT */ ) + Simi->Cx; +- *y = +- ((xo * Simi->St + yo * Simi->Ct + xx * Simi->St2 + yy * Simi->Ct2) +- >> FIX /* / UNIT */ ) + Simi->Cy; +-} +- +-/***************************************************************/ +- +-static void +-Trace (FRACTAL * F, F_PT xo, F_PT yo, IfsData *data) +-{ +- F_PT x, y, i; +- SIMI *Cur; +- +- Cur = data->Cur_F->Components; +- for (i = data->Cur_F->Nb_Simi; i; --i, Cur++) { +- Transform (Cur, xo, yo, &x, &y); +- +- data->Buf->x = F->Lx + ((x * F->Lx) >> (FIX+1) /* /(UNIT*2) */ ); +- data->Buf->y = F->Ly - ((y * F->Ly) >> (FIX+1) /* /(UNIT*2) */ ); +- data->Buf++; +- +- data->Cur_Pt++; +- +- if (F->Depth && ((x - xo) >> 4) && ((y - yo) >> 4)) { +- F->Depth--; +- Trace (F, x, y, data); +- F->Depth++; +- } +- } +-} +- +-static void +-Draw_Fractal (IfsData *data) +-{ +- FRACTAL *F = data->Root; +- int i, j; +- F_PT x, y, xo, yo; +- SIMI *Cur, *Simi; +- +- for (Cur = F->Components, i = F->Nb_Simi; i; --i, Cur++) { +- Cur->Cx = DBL_To_F_PT (Cur->c_x); +- Cur->Cy = DBL_To_F_PT (Cur->c_y); +- +- Cur->Ct = DBL_To_F_PT (cos (Cur->A)); +- Cur->St = DBL_To_F_PT (sin (Cur->A)); +- Cur->Ct2 = DBL_To_F_PT (cos (Cur->A2)); +- Cur->St2 = DBL_To_F_PT (sin (Cur->A2)); +- +- Cur->R = DBL_To_F_PT (Cur->r); +- Cur->R2 = DBL_To_F_PT (Cur->r2); +- } +- +- +- data->Cur_Pt = 0; +- data->Cur_F = F; +- data->Buf = F->Buffer2; +- for (Cur = F->Components, i = F->Nb_Simi; i; --i, Cur++) { +- xo = Cur->Cx; +- yo = Cur->Cy; +- for (Simi = F->Components, j = F->Nb_Simi; j; --j, Simi++) { +- if (Simi == Cur) +- continue; +- Transform (Simi, xo, yo, &x, &y); +- Trace (F, x, y, data); +- } +- } +- +- /* Erase previous */ +- +- F->Cur_Pt = data->Cur_Pt; +- data->Buf = F->Buffer1; +- F->Buffer1 = F->Buffer2; +- F->Buffer2 = data->Buf; +-} +- +- +-static IFSPoint * +-draw_ifs (PluginInfo *goomInfo, int *nbpt, IfsData *data) +-{ +- int i; +- DBL u, uu, v, vv, u0, u1, u2, u3; +- SIMI *S, *S1, *S2, *S3, *S4; +- FRACTAL *F; +- +- if (data->Root == NULL) +- return NULL; +- F = data->Root; +- if (F->Buffer1 == NULL) +- return NULL; +- +- u = (DBL) (F->Count) * (DBL) (F->Speed) / 1000.0; +- uu = u * u; +- v = 1.0 - u; +- vv = v * v; +- u0 = vv * v; +- u1 = 3.0 * vv * u; +- u2 = 3.0 * v * uu; +- u3 = u * uu; +- +- S = F->Components; +- S1 = S + F->Nb_Simi; +- S2 = S1 + F->Nb_Simi; +- S3 = S2 + F->Nb_Simi; +- S4 = S3 + F->Nb_Simi; +- +- for (i = F->Nb_Simi; i; --i, S++, S1++, S2++, S3++, S4++) { +- S->c_x = u0 * S1->c_x + u1 * S2->c_x + u2 * S3->c_x + u3 * S4->c_x; +- S->c_y = u0 * S1->c_y + u1 * S2->c_y + u2 * S3->c_y + u3 * S4->c_y; +- S->r = u0 * S1->r + u1 * S2->r + u2 * S3->r + u3 * S4->r; +- S->r2 = u0 * S1->r2 + u1 * S2->r2 + u2 * S3->r2 + u3 * S4->r2; +- S->A = u0 * S1->A + u1 * S2->A + u2 * S3->A + u3 * S4->A; +- S->A2 = u0 * S1->A2 + u1 * S2->A2 + u2 * S3->A2 + u3 * S4->A2; +- } +- +- Draw_Fractal (data); +- +- if (F->Count >= 1000 / F->Speed) { +- S = F->Components; +- S1 = S + F->Nb_Simi; +- S2 = S1 + F->Nb_Simi; +- S3 = S2 + F->Nb_Simi; +- S4 = S3 + F->Nb_Simi; +- +- for (i = F->Nb_Simi; i; --i, S++, S1++, S2++, S3++, S4++) { +- S2->c_x = 2.0 * S4->c_x - S3->c_x; +- S2->c_y = 2.0 * S4->c_y - S3->c_y; +- S2->r = 2.0 * S4->r - S3->r; +- S2->r2 = 2.0 * S4->r2 - S3->r2; +- S2->A = 2.0 * S4->A - S3->A; +- S2->A2 = 2.0 * S4->A2 - S3->A2; +- +- *S1 = *S4; +- } +- Random_Simis (goomInfo, F, F->Components + 3 * F->Nb_Simi, F->Nb_Simi); +- +- Random_Simis (goomInfo, F, F->Components + 4 * F->Nb_Simi, F->Nb_Simi); +- +- F->Count = 0; +- } +- else +- F->Count++; +- +- F->Col++; +- +- (*nbpt) = data->Cur_Pt; +- return F->Buffer2; +-} +- +- +-/***************************************************************/ +- +-static void release_ifs (IfsData *data) +-{ +- if (data->Root != NULL) { +- free_ifs (data->Root); +- (void) free ((void *) data->Root); +- data->Root = (FRACTAL *) NULL; +- } +-} +- +-#define RAND() goom_random(goomInfo->gRandom) +- +-static void ifs_update (PluginInfo *goomInfo, Pixel * data, Pixel * back, int increment, IfsData *fx_data) +-{ +- static int couleur = 0xc0c0c0c0; +- static int v[4] = { 2, 4, 3, 2 }; +- static int col[4] = { 2, 4, 3, 2 }; +- +-#define MOD_MER 0 +-#define MOD_FEU 1 +-#define MOD_MERVER 2 +- static int mode = MOD_MERVER; +- static int justChanged = 0; +- static int cycle = 0; +- int cycle10; +- +- int nbpt; +- IFSPoint *points; +- int i; +- +- int couleursl = couleur; +- int width = goomInfo->screen.width; +- int height = goomInfo->screen.height; +- +- cycle++; +- if (cycle >= 80) +- cycle = 0; +- +- if (cycle < 40) +- cycle10 = cycle / 10; +- else +- cycle10 = 7 - cycle / 10; +- +- { +- unsigned char *tmp = (unsigned char *) &couleursl; +- +- for (i = 0; i < 4; i++) { +- *tmp = (*tmp) >> cycle10; +- tmp++; +- } +- } +- +- points = draw_ifs (goomInfo, &nbpt, fx_data); +- nbpt--; +- +-#ifdef HAVE_MMX +- movd_m2r (couleursl, mm1); +- punpckldq_r2r (mm1, mm1); +- for (i = 0; i < nbpt; i += increment) { +- int x = points[i].x; +- int y = points[i].y; +- +- if ((x < width) && (y < height) && (x > 0) && (y > 0)) { +- int pos = x + (y * width); +- movd_m2r (back[pos], mm0); +- paddusb_r2r (mm1, mm0); +- movd_r2m (mm0, data[pos]); +- } +- } +- emms();/*__asm__ __volatile__ ("emms");*/ +-#else +- for (i = 0; i < nbpt; i += increment) { +- int x = (int) points[i].x & 0x7fffffff; +- int y = (int) points[i].y & 0x7fffffff; +- +- if ((x < width) && (y < height)) { +- int pos = x + (int) (y * width); +- int tra = 0, i = 0; +- unsigned char *bra = (unsigned char *) &back[pos]; +- unsigned char *dra = (unsigned char *) &data[pos]; +- unsigned char *cra = (unsigned char *) &couleursl; +- +- for (; i < 4; i++) { +- tra = *cra; +- tra += *bra; +- if (tra > 255) +- tra = 255; +- *dra = tra; +- ++dra; +- ++cra; +- ++bra; +- } +- } +- } +-#endif /*MMX*/ +- justChanged--; +- +- col[ALPHA] = couleur >> (ALPHA * 8) & 0xff; +- col[BLEU] = couleur >> (BLEU * 8) & 0xff; +- col[VERT] = couleur >> (VERT * 8) & 0xff; +- col[ROUGE] = couleur >> (ROUGE * 8) & 0xff; +- +- if (mode == MOD_MER) { +- col[BLEU] += v[BLEU]; +- if (col[BLEU] > 255) { +- col[BLEU] = 255; +- v[BLEU] = -(RAND() % 4) - 1; +- } +- if (col[BLEU] < 32) { +- col[BLEU] = 32; +- v[BLEU] = (RAND() % 4) + 1; +- } +- +- col[VERT] += v[VERT]; +- if (col[VERT] > 200) { +- col[VERT] = 200; +- v[VERT] = -(RAND() % 3) - 2; +- } +- if (col[VERT] > col[BLEU]) { +- col[VERT] = col[BLEU]; +- v[VERT] = v[BLEU]; +- } +- if (col[VERT] < 32) { +- col[VERT] = 32; +- v[VERT] = (RAND() % 3) + 2; +- } +- +- col[ROUGE] += v[ROUGE]; +- if (col[ROUGE] > 64) { +- col[ROUGE] = 64; +- v[ROUGE] = -(RAND () % 4) - 1; +- } +- if (col[ROUGE] < 0) { +- col[ROUGE] = 0; +- v[ROUGE] = (RAND () % 4) + 1; +- } +- +- col[ALPHA] += v[ALPHA]; +- if (col[ALPHA] > 0) { +- col[ALPHA] = 0; +- v[ALPHA] = -(RAND () % 4) - 1; +- } +- if (col[ALPHA] < 0) { +- col[ALPHA] = 0; +- v[ALPHA] = (RAND () % 4) + 1; +- } +- +- if (((col[VERT] > 32) && (col[ROUGE] < col[VERT] + 40) +- && (col[VERT] < col[ROUGE] + 20) && (col[BLEU] < 64) +- && (RAND () % 20 == 0)) && (justChanged < 0)) { +- mode = RAND () % 3 ? MOD_FEU : MOD_MERVER; +- justChanged = 250; +- } +- } +- else if (mode == MOD_MERVER) { +- col[BLEU] += v[BLEU]; +- if (col[BLEU] > 128) { +- col[BLEU] = 128; +- v[BLEU] = -(RAND () % 4) - 1; +- } +- if (col[BLEU] < 16) { +- col[BLEU] = 16; +- v[BLEU] = (RAND () % 4) + 1; +- } +- +- col[VERT] += v[VERT]; +- if (col[VERT] > 200) { +- col[VERT] = 200; +- v[VERT] = -(RAND () % 3) - 2; +- } +- if (col[VERT] > col[ALPHA]) { +- col[VERT] = col[ALPHA]; +- v[VERT] = v[ALPHA]; +- } +- if (col[VERT] < 32) { +- col[VERT] = 32; +- v[VERT] = (RAND () % 3) + 2; +- } +- +- col[ROUGE] += v[ROUGE]; +- if (col[ROUGE] > 128) { +- col[ROUGE] = 128; +- v[ROUGE] = -(RAND () % 4) - 1; +- } +- if (col[ROUGE] < 0) { +- col[ROUGE] = 0; +- v[ROUGE] = (RAND () % 4) + 1; +- } +- +- col[ALPHA] += v[ALPHA]; +- if (col[ALPHA] > 255) { +- col[ALPHA] = 255; +- v[ALPHA] = -(RAND () % 4) - 1; +- } +- if (col[ALPHA] < 0) { +- col[ALPHA] = 0; +- v[ALPHA] = (RAND () % 4) + 1; +- } +- +- if (((col[VERT] > 32) && (col[ROUGE] < col[VERT] + 40) +- && (col[VERT] < col[ROUGE] + 20) && (col[BLEU] < 64) +- && (RAND () % 20 == 0)) && (justChanged < 0)) { +- mode = RAND () % 3 ? MOD_FEU : MOD_MER; +- justChanged = 250; +- } +- } +- else if (mode == MOD_FEU) { +- +- col[BLEU] += v[BLEU]; +- if (col[BLEU] > 64) { +- col[BLEU] = 64; +- v[BLEU] = -(RAND () % 4) - 1; +- } +- if (col[BLEU] < 0) { +- col[BLEU] = 0; +- v[BLEU] = (RAND () % 4) + 1; +- } +- +- col[VERT] += v[VERT]; +- if (col[VERT] > 200) { +- col[VERT] = 200; +- v[VERT] = -(RAND () % 3) - 2; +- } +- if (col[VERT] > col[ROUGE] + 20) { +- col[VERT] = col[ROUGE] + 20; +- v[VERT] = -(RAND () % 3) - 2; +- v[ROUGE] = (RAND () % 4) + 1; +- v[BLEU] = (RAND () % 4) + 1; +- } +- if (col[VERT] < 0) { +- col[VERT] = 0; +- v[VERT] = (RAND () % 3) + 2; +- } +- +- col[ROUGE] += v[ROUGE]; +- if (col[ROUGE] > 255) { +- col[ROUGE] = 255; +- v[ROUGE] = -(RAND () % 4) - 1; +- } +- if (col[ROUGE] > col[VERT] + 40) { +- col[ROUGE] = col[VERT] + 40; +- v[ROUGE] = -(RAND () % 4) - 1; +- } +- if (col[ROUGE] < 0) { +- col[ROUGE] = 0; +- v[ROUGE] = (RAND () % 4) + 1; +- } +- +- col[ALPHA] += v[ALPHA]; +- if (col[ALPHA] > 0) { +- col[ALPHA] = 0; +- v[ALPHA] = -(RAND () % 4) - 1; +- } +- if (col[ALPHA] < 0) { +- col[ALPHA] = 0; +- v[ALPHA] = (RAND () % 4) + 1; +- } +- +- if (((col[ROUGE] < 64) && (col[VERT] > 32) && (col[VERT] < col[BLEU]) +- && (col[BLEU] > 32) +- && (RAND () % 20 == 0)) && (justChanged < 0)) { +- mode = RAND () % 2 ? MOD_MER : MOD_MERVER; +- justChanged = 250; +- } +- } +- +- couleur = (col[ALPHA] << (ALPHA * 8)) +- | (col[BLEU] << (BLEU * 8)) +- | (col[VERT] << (VERT * 8)) +- | (col[ROUGE] << (ROUGE * 8)); +-} +- +-/** VISUAL_FX WRAPPER FOR IFS */ +- +-static void ifs_vfx_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *goomInfo) { +- +- IfsData *data = (IfsData*)_this->fx_data; +- if (!data->initalized) { +- data->initalized = 1; +- init_ifs(goomInfo, data); +- } +- ifs_update (goomInfo, dest, src, goomInfo->update.ifs_incr, data); +- /*TODO: trouver meilleur soluce pour increment (mettre le code de gestion de l'ifs dans ce fichier: ifs_vfx_apply) */ +-} +- +-static void ifs_vfx_init(VisualFX *_this, PluginInfo *info) { +- +- IfsData *data = (IfsData*)malloc(sizeof(IfsData)); +- data->Root = (FRACTAL*)NULL; +- data->initalized = 0; +- _this->fx_data = data; +-} +- +-static void ifs_vfx_free(VisualFX *_this) { +- IfsData *data = (IfsData*)_this->fx_data; +- release_ifs(data); +- free(data); +-} +- +-VisualFX ifs_visualfx_create(void) { +- VisualFX vfx; +- vfx.init = ifs_vfx_init; +- vfx.free = ifs_vfx_free; +- vfx.apply = ifs_vfx_apply; +- return vfx; +-} +diff -Naur /home/d4rk/goom2k4-0/src/ifs.h /src/ifs.h +--- /home/d4rk/goom2k4-0/src/ifs.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/ifs.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,27 +0,0 @@ +-/* +- * File created 11 april 2002 by JeKo <jeko@free.fr> +- */ +- +-#ifndef IFS_H +-#define IFS_H +- +-#include "goom_config.h" +-#include "goom_graphic.h" +-#include "goom_plugin_info.h" +-#include "goom_visual_fx.h" +- +-VisualFX ifs_visualfx_create(void); +- +-/* init ifs for a (width)x(height) output. * / +-void init_ifs (PluginInfo *goomInfo, int width, int height); +- +-/ * draw an ifs on the buffer (which size is width * height) +- increment means that we draw 1/increment of the ifs's points * / +-void ifs_update (PluginInfo *goomInfo, Pixel * buffer, Pixel * back, int width, int height, int increment); +- +-/ * free all ifs's data. * / +-void release_ifs (void); +-*/ +- +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/jitc_test.c /src/jitc_test.c +--- /home/d4rk/goom2k4-0/src/jitc_test.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/jitc_test.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,38 +0,0 @@ +-#include "jitc_x86.h" +-#include <stdio.h> +- +-int main(int c, char **v) +-{ +- int i; +- int j; +- JitcX86Env *jitc = jitc_x86_env_new(0xffff); +- JitcFunc func = jitc_prepare_func(jitc); +- +- jitc_add(jitc, "mov edx, $d", 0xffffffff); +- jitc_add(jitc, "mov eax, $d", 40); +- jitc_add(jitc, "mov ebx, $d", 2); +- jitc_add(jitc, "idiv ebx"); +- jitc_add(jitc, "mov eax, [$d]", 0xdeadbeaf); +- +- jitc_add(jitc, "sal edx, $d", 7); +- jitc_add(jitc, "imul ecx"); +- jitc_add(jitc, "idiv ecx"); +- jitc_add(jitc, "imul $d[ecx]", 2); +- jitc_add(jitc, "imul ecx, [ecx]"); +- jitc_add(jitc, "mov ecx, $d", (char*)(&i)-12); +- jitc_add(jitc, "dec $d[ecx]", 2); +- jitc_add(jitc, "add ecx, $d", 12); +- jitc_add(jitc, "dec [ecx]"); +- jitc_add(jitc, "dec ecx"); +- +- JITC_FLD_pIMM32(jitc,&i); +- JITC_FSTP_pIMM32(jitc,&j); +- +- jitc_validate_func(jitc); +- func(); +- +- printf("i = 0x%08x\n", i); +- +- jitc_x86_delete(jitc); +- return 0; +-} +diff -Naur /home/d4rk/goom2k4-0/src/jitc_x86.c /src/jitc_x86.c +--- /home/d4rk/goom2k4-0/src/jitc_x86.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/jitc_x86.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,530 +0,0 @@ +-#include "jitc_x86.h" +- +-#include <stdio.h> +-#include <stdlib.h> +-#include <stdarg.h> +- +-#define PARAM_INT 1 +-#define PARAM_FLOAT 2 +-#define PARAM_REG 3 +-#define PARAM_dispREG 4 +-#define PARAM_DISP32 5 +-#define PARAM_LABEL 6 +-#define PARAM_NONE 666 +- +-typedef struct { +- int id; +- int i; +- double f; +- int reg; +- int disp; +- char label[256]; +-} IParam; +- +-struct { +- char *name; +- int reg; +-} RegsName[] = { +- {"eax",EAX}, {"ebx",EBX}, {"ecx",ECX}, {"edx",EDX}, +- {"edi",EDI}, {"esi",ESI}, {"ebp",EBP}, {"esp",ESP}, +- {"st0",0}, {"st1",1}, {"st2",2}, {"st3",3}, +- {"st4",4}, {"st5",5}, {"st6",6}, {"st7",7}, +- {"mm0",0}, {"mm1",1}, {"mm2",2}, {"mm3",3}, +- {"mm4",4}, {"mm5",5}, {"mm6",6}, {"mm7",7}, {NULL,0} +-}; +- +-void modrm(JitcX86Env *jitc, int opcode, IParam *iparam) +-{ +- int dest = 0; +- int src = 1; +- int direction = 0x0; +- unsigned int byte = 666; +- unsigned int int32 = 0; +- unsigned int need32 = 0; +- +- if ((iparam[0].id == PARAM_REG) && (iparam[1].id != PARAM_REG)) { +- dest = 1; +- src = 0; +- direction = 0x02; +- } +- +- if (iparam[src].id != PARAM_REG) { +- fprintf(stderr, "JITC_x86: Invalid Instruction Parameters: %d %d.\n", iparam[0].id, iparam[1].id); +- exit(1); +- } +- +- if (iparam[dest].id == PARAM_REG) { +- byte = ((int)JITC_MOD_REG_REG << 6) | (iparam[src].reg << 3) | (iparam[0].reg); +- } +- +- else if (iparam[dest].id == PARAM_dispREG) +- { +- if (iparam[dest].disp == 0) +- byte = ((int)JITC_MOD_pREG_REG << 6) | (iparam[src].reg << 3) | (iparam[dest].reg); +- } +- +- else if (iparam[dest].id == PARAM_DISP32) +- { +- byte = ((int)JITC_MOD_pREG_REG << 6) | (iparam[src].reg << 3) | JITC_RM_DISP32; +- need32 = 1; +- int32 = iparam[dest].disp; +- } +- +- if (byte == 666) { +- fprintf(stderr, "JITC_x86: Invalid Instruction Parameters: %d %d.\n", iparam[0].id, iparam[1].id); +- exit(1); +- } +- else { +- if (opcode < 0x100) +- JITC_ADD_UCHAR(jitc, opcode + direction); +- else { +- JITC_ADD_UCHAR(jitc, (opcode>>8)&0xff); +- JITC_ADD_UCHAR(jitc, (opcode&0xff)/* + direction*/); +- } +- JITC_ADD_UCHAR(jitc, byte); +- if (need32) +- JITC_ADD_UINT(jitc, int32); +- } +-} +- +-static void imul_like_modrm_1param(JitcX86Env *jitc, int opcode, int digit, IParam *iparam) +-{ +- if (iparam[0].id == PARAM_REG) +- { +- JITC_ADD_UCHAR(jitc, opcode); +- JITC_MODRM(jitc, 0x03, digit, iparam[0].reg); +- return; +- } +- if (iparam[0].id == PARAM_dispREG) { +- JITC_ADD_UCHAR(jitc, opcode); +- if (iparam[0].disp == 0) +- { +- JITC_MODRM(jitc, 0x00, digit, iparam[0].reg); +- } +- else if ((iparam[0].disp & 0xff) == iparam[0].disp) +- { +- JITC_MODRM(jitc, 0x01, digit, iparam[0].reg); +- JITC_ADD_UCHAR(jitc, iparam[0].disp); +- } +- else +- { +- JITC_MODRM(jitc, 0x02, digit, iparam[0].reg); +- JITC_ADD_UINT(jitc, iparam[0].disp); +- } +- return; +- } +- if (iparam[0].id == PARAM_DISP32) { +- JITC_ADD_UCHAR(jitc, opcode); +- JITC_MODRM(jitc, JITC_MOD_pREG_REG, digit, JITC_RM_DISP32); +- JITC_ADD_UINT(jitc, iparam[0].disp); +- return; +- } +-} +- +-/* 1 byte encoded opcode including register... imm32 parameter */ +-#define INSTR_1bReg_IMM32(opcode,dest,src) { \ +- JITC_ADD_UCHAR(jitc, opcode + iparam[dest].reg); \ +- JITC_ADD_UINT (jitc, (int)iparam[src].i); } +- +-typedef struct { +- char *name; +- int opcode; +- int opcode_reg_int; +- int digit_reg_int; +- int opcode_eax_int; +-} AddLikeInstr; +- +-static AddLikeInstr addLike[] = { +- { "add", 0x01, 0x81, 0x00, 0x05 }, +- { "and", 0x21, 0x81, 0x04, 0x25 }, +- { "or", 0x0B, 0x81, 0x01, 0x0D }, +- { "cmp", 0x39, 0x81, 0x07, 0x3D }, +- { "imul", 0x0FAF, 0x69, 0x00, 0x10000 }, +- { "sub", 0x29, 0x81, 0x05, 0X2D }, +- { NULL, -1, -1, -1, -1 } +-}; +- +-int checkAddLike(JitcX86Env *jitc, char *op, IParam *iparam, int nbParams) +-{ +- int i; +- for (i=0;addLike[i].name;++i) +- { +- if (strcmp(op,addLike[i].name) == 0) +- { +- if ((iparam[0].id == PARAM_REG) && (iparam[1].id == PARAM_INT)) { +- if ((iparam[0].reg == EAX) && (addLike[i].opcode_eax_int != 0x10000)) { +- JITC_ADD_UCHAR(jitc, addLike[i].opcode_eax_int); +- JITC_ADD_UINT(jitc, iparam[1].i); +- return 1; +- } +- else { +- JITC_ADD_UCHAR(jitc, addLike[i].opcode_reg_int); +- JITC_MODRM(jitc, 0x03, addLike[i].digit_reg_int, iparam[0].reg); +- JITC_ADD_UINT(jitc, iparam[1].i); +- return 1; +- } +- } +- else if ((iparam[0].id == PARAM_dispREG) && (iparam[1].id == PARAM_INT)) { +- JITC_ADD_UCHAR(jitc, addLike[i].opcode_reg_int); +- if ((iparam[0].disp & 0xff) == iparam[0].disp) +- { +- JITC_MODRM(jitc, 0x01, addLike[i].digit_reg_int, iparam[0].reg); +- JITC_ADD_UCHAR(jitc, iparam[0].disp); +- } +- else +- { +- JITC_MODRM(jitc, 0x00, addLike[i].digit_reg_int, iparam[0].reg); +- JITC_ADD_UINT(jitc, iparam[0].disp); +- } +- JITC_ADD_UINT(jitc, iparam[1].i); +- return 1; +- } +- else if ((iparam[0].id == PARAM_DISP32) && (iparam[1].id == PARAM_INT)) { +- JITC_ADD_UCHAR(jitc, addLike[i].opcode_reg_int); +- JITC_MODRM(jitc, 0x00, addLike[i].digit_reg_int, 0x05); +- JITC_ADD_UINT(jitc, iparam[0].disp); +- JITC_ADD_UINT(jitc, iparam[1].i); +- return 1; +- } +- else { +- modrm(jitc, addLike[i].opcode, iparam); +- return 1; +- } +- } +- } +- return 0; +-} +- +-/** +- * Check all kind of known instruction... perform special optimisations.. +- */ +-static void jitc_add_op(JitcX86Env *jitc, char *op, IParam *iparam, int nbParams) +-{ +- /* MOV */ +- if (strcmp(op,"mov") == 0) +- { +- if ((iparam[0].id == PARAM_REG) && (iparam[1].id == PARAM_INT)) { +- INSTR_1bReg_IMM32(0xb8,0,1); +- } +- else if ((iparam[0].id == PARAM_DISP32) && (iparam[1].id == PARAM_INT)) { +- JITC_ADD_UCHAR(jitc, 0xc7); +- JITC_MODRM(jitc, 0x00, 0x00, 0x05); +- JITC_ADD_UINT(jitc, iparam[0].disp); +- JITC_ADD_UINT(jitc, iparam[1].i); +- } +- else +- modrm(jitc, 0x89, iparam); +- return; +- } +- +-#define IMUL_LIKE(_OP,_opcode,_digit)\ +- if (strcmp(op, _OP) == 0) { \ +- if (nbParams == 1) { \ +- imul_like_modrm_1param(jitc, _opcode, _digit, iparam); \ +- return; }} +- +-#define SHIFT_LIKE(_name,_op1,_op2,_digit) \ +- if (strcmp(op, _name) == 0) { \ +- if (iparam[1].id == PARAM_INT) { \ +- if (iparam[1].i == 1) \ +- imul_like_modrm_1param(jitc, _op1, _digit, iparam); \ +- else { \ +- imul_like_modrm_1param(jitc, _op2, _digit, iparam); \ +- JITC_ADD_UCHAR(jitc, iparam[1].i); \ +- } \ +- return; \ +- } \ +- } +- +-#define POP_LIKE(_OP,_opcode) \ +- if (strcmp(op, _OP) == 0) { \ +- if (iparam[0].id == PARAM_REG) { \ +- JITC_ADD_UCHAR(jitc, _opcode + iparam[0].reg); \ +- return; } } +- +- IMUL_LIKE("neg", 0xf7, 0x03); +- IMUL_LIKE("imul", 0xf7, 0x05); +- IMUL_LIKE("idiv", 0xf7, 0x07); +- +- POP_LIKE("pop", 0x58); +- POP_LIKE("push", 0x50); +- +- SHIFT_LIKE("sal", 0xd1, 0xc1, 0x04); +- SHIFT_LIKE("sar", 0xd1, 0xc1, 0x07); +- SHIFT_LIKE("shl", 0xd1, 0xc1, 0x04); +- SHIFT_LIKE("shr", 0xd1, 0xc1, 0x05); +- +- /* INC */ +- if (strcmp(op, "inc") == 0) { +- if (iparam[0].id == PARAM_REG) { +- JITC_ADD_UCHAR(jitc, 0x40 + iparam[0].reg); +- return; +- } +- imul_like_modrm_1param(jitc, 0xff, 0x00, iparam); +- return; +- } +- +- /* DEC */ +- if (strcmp(op, "dec") == 0) { +- if (iparam[0].id == PARAM_REG) { +- JITC_ADD_UCHAR(jitc, 0x48 + iparam[0].reg); +- return; +- } +- imul_like_modrm_1param(jitc, 0xff, 0x01, iparam); +- return; +- } +- +- if (strcmp(op, "call") == 0) +- { +- if (iparam[0].id == PARAM_LABEL) { +- jitc_add_used_label(jitc,iparam[0].label,jitc->used+1); +- JITC_CALL(jitc,0); +- return; +- } +- if (iparam[0].id == PARAM_INT) { +- JITC_CALL(jitc,iparam[0].i); +- return; +- } +- if (iparam[0].id == PARAM_dispREG) { +- JITC_ADD_UCHAR(jitc,0xff); +- JITC_ADD_UCHAR(jitc,0xd0+iparam[0].reg); +- return; +- } +- } +- +-#define MONOBYTE_INSTR(_OP,_opcode) \ +- if (strcmp(op, _OP) == 0) { \ +- JITC_ADD_UCHAR(jitc, _opcode); \ +- return; } +- +- MONOBYTE_INSTR("ret", 0xc3); +- MONOBYTE_INSTR("leave", 0xc9); +- MONOBYTE_INSTR("cdq", 0x99); +- +- /* JNE */ +- if (strcmp(op, "jne") == 0) { +- if (iparam[0].id == PARAM_LABEL) { +- JITC_JUMP_COND_LABEL(jitc,COND_NOT_EQUAL,iparam[0].label); +- return; +- } +- if (iparam[0].id == PARAM_INT) { +- JITC_JUMP_COND(jitc,COND_NOT_EQUAL,iparam[0].i); +- return; +- } +- } +- +- /* JE */ +- if (strcmp(op, "je") == 0) { +- if (iparam[0].id == PARAM_LABEL) { +- JITC_JUMP_COND_LABEL(jitc,COND_EQUAL,iparam[0].label); +- return; +- } +- if (iparam[0].id == PARAM_INT) { +- JITC_JUMP_COND(jitc,COND_EQUAL,iparam[0].i); +- return; +- } +- } +- +- /* ADD LIKE */ +- if (checkAddLike(jitc, op, iparam, nbParams)) return; +- +- /* BSWAP : 0F C8+rd */ +- +- fprintf(stderr, "JITC_x86: Invalid Operation '%s'\n", op); +- exit(1); +-} +- +-/** +- * Adds a new instruction to the just in time compiled function +- */ +-void jitc_add(JitcX86Env *jitc, const char *_instr, ...) +-{ +- char instr[256]; +- char *op; +- char *sparam[16]; int nbParam=0; int i; +- IParam iparam[16]; +- va_list ap; +- strcpy(instr,_instr); +- +-#ifdef DISPLAY_GENCODE +- printf("|"); +-#endif +- +- op = strtok(instr, " ,"); +- if (!op) return; +- +- /* decoupage en tokens */ +- while ((sparam[nbParam] = strtok(NULL, " ,")) != NULL) if (strlen(sparam[nbParam])>0) nbParam++; +- +- /* Reconnaissance des parametres */ +- va_start(ap, _instr); +- for (i=0;i<nbParam;++i) +- { +- int r; +- char regname[256]; +- iparam[i].id = PARAM_NONE; +- if (strcmp(sparam[i], "$d") == 0) { +- iparam[i].id = PARAM_INT; +- iparam[i].i = va_arg(ap, int); +- } +- else if (strcmp(sparam[i], "$f") == 0) { +- iparam[i].id = PARAM_FLOAT; +- iparam[i].f = va_arg(ap, double); +- } +- else if (strcmp(sparam[i], "[$d]") == 0) { +- iparam[i].id = PARAM_DISP32; +- iparam[i].disp = va_arg(ap, int); +- } +- else if (strcmp(sparam[i], "$s") == 0) { +- iparam[i].id = PARAM_LABEL; +- strcpy(iparam[i].label, va_arg(ap, char*)); +- } +- else +- for (r=0;RegsName[r].name;r++) { +- if (strcmp(sparam[i], RegsName[r].name) == 0) { +- iparam[i].id = PARAM_REG; +- iparam[i].reg = RegsName[r].reg; +- } +- else +- { +- if (sscanf(sparam[i], "$d[%3s]", regname) > 0) { +- if (strcmp(regname, RegsName[r].name) == 0) { +- iparam[i].id = PARAM_dispREG; +- iparam[i].reg = RegsName[r].reg; +- iparam[i].disp = va_arg(ap, int); +- } +- } +- if (sscanf(sparam[i], "[%3s]", regname) > 0) { +- if (strcmp(regname, RegsName[r].name) == 0) { +- iparam[i].id = PARAM_dispREG; +- iparam[i].reg = RegsName[r].reg; +- iparam[i].disp = 0; +- } +- } +- } +- } +- if (iparam[i].id == PARAM_NONE) { +- fprintf(stderr, "JITC_x86: Unrecognized parameter '%s'\n", sparam[i]); +- exit(1); +- } +- } +- va_end(ap); +- +- jitc_add_op(jitc, op, &(iparam[0]), nbParam); +-#ifdef DISPLAY_GENCODE +- printf(" ;;; %s", op); +- for (i=0;i<nbParam;++i) +- { +- if (iparam[i].id == PARAM_INT) +- printf(" 0x%x", iparam[i].i); +- else if (iparam[i].id == PARAM_DISP32) +- printf(" [0x%x]", iparam[i].disp); +- else if (iparam[i].id == PARAM_LABEL) +- printf(" %s", iparam[i].label); +- else +- printf(" %s", sparam[i]); +- } +- printf("\n"); +- +-#endif +-} +- +-JitcX86Env *jitc_x86_env_new(int memory_size) { +- +- JitcX86Env *jitc = (JitcX86Env*)malloc(sizeof(JitcX86Env)); +- jitc->_memory = (unsigned char*)malloc(memory_size); +- jitc->used = 0; +- jitc->memory = (unsigned char*)((int)jitc->_memory + (32-((int)jitc->_memory)%32)%32); +- +- jitc->nbUsedLabel = 0; +- jitc->nbKnownLabel = 0; +- +- jitc->usedLabel = (LabelAddr*)malloc(sizeof(LabelAddr) * JITC_MAXLABEL); +- jitc->knownLabel = (LabelAddr*)malloc(sizeof(LabelAddr) * JITC_MAXLABEL); +- +- return jitc; +-} +- +-void jitc_x86_delete(JitcX86Env *jitc) { +- +- free(jitc->usedLabel); +- free(jitc->knownLabel); +- free(jitc->_memory); +- free(jitc); +-} +- +-JitcFunc jitc_prepare_func(JitcX86Env *jitc) { +- +- JitcFunc ptr = 0; +- jitc->used = (32 - jitc->used%32)%32; +- ptr = (JitcFunc)&(jitc->memory[jitc->used]); +- +-#ifdef DISPLAY_GENCODE +- printf("\n------------------------------------------\n"); +- printf("-- Function Intro --\n"); +- printf("------------------------------------------\n"); +-#endif +- +- /* save the state */ +- jitc_add(jitc,"push ebp"); +- jitc_add(jitc,"mov ebp, esp"); +- jitc_add(jitc,"sub esp, $d", 8); +- JITC_PUSH_ALL(jitc); +-#ifdef DISPLAY_GENCODE +- printf("\n------------------------------------------\n"); +-#endif +- return ptr; +-} +- +-void jitc_validate_func(JitcX86Env *jitc) { +- +-#ifdef DISPLAY_GENCODE +- printf("\n------------------------------------------\n"); +- printf("-- Function Outro --\n"); +- printf("------------------------------------------\n"); +-#endif +- /* restore the state */ +- JITC_POP_ALL(jitc); +- jitc_add(jitc, "leave"); +- jitc_add(jitc, "ret"); +- jitc_resolve_labels(jitc); +-#ifdef DISPLAY_GENCODE +- printf("\n------------------------------------------\n"); +-#endif +-} +- +-void jitc_add_used_label(JitcX86Env *jitc, char *label, int where) { +- +- strncpy(jitc->usedLabel[jitc->nbUsedLabel].label, label, JITC_LABEL_SIZE); +- jitc->usedLabel[jitc->nbUsedLabel].address = where; +- jitc->nbUsedLabel++; +-} +- +-void jitc_add_known_label(JitcX86Env *jitc, char *label, int where) { +- +-#ifdef DISPLAY_GENCODE +- printf("%s:\n", label); +-#endif +- strncpy(jitc->knownLabel[jitc->nbKnownLabel].label, label, JITC_LABEL_SIZE); +- jitc->knownLabel[jitc->nbKnownLabel].address = where; +- jitc->nbKnownLabel++; +-} +- +-void jitc_resolve_labels(JitcX86Env *jitc) { +- +- int i,j; +- for (i=jitc->nbUsedLabel;i-->0;) { +- +- LabelAddr used = jitc->usedLabel[i]; +- for (j=jitc->nbKnownLabel;j-->0;) { +- +- LabelAddr known = jitc->knownLabel[j]; +- if (strcmp(known.label, used.label) == 0) { +- int *offset = (int*)&(jitc->memory[used.address]); +- *offset = known.address - used.address - 4; /* always using long offset */ +- break; +- } +- } +- } +- jitc->nbUsedLabel = jitc->nbKnownLabel = 0; +-} +diff -Naur /home/d4rk/goom2k4-0/src/jitc_x86.h /src/jitc_x86.h +--- /home/d4rk/goom2k4-0/src/jitc_x86.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/jitc_x86.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,214 +0,0 @@ +-/** +- * Copyright (c)2004 Jean-Christophe Hoelt <jeko@ios-software.com> +- */ +- +-#include <stdlib.h> +-#include <string.h> +- +-#define JITC_MAXLABEL 1024 +-#define JITC_LABEL_SIZE 64 +- +-/** +- * low level macros +- */ +- +- /* {{{ Registres Generaux */ +-#define EAX 0 +-#define ECX 1 +-#define EDX 2 +-#define EBX 3 +-#define ESP 4 +-#define EBP 5 +-#define ESI 6 +-#define EDI 7 +- /* }}} */ +- /* {{{ Registres MMX */ +-#define MM0 0 +-#define MM1 1 +-#define MM2 2 +-#define MM3 3 +-#define MM4 4 +-#define MM5 5 +-#define MM6 6 +-#define MM7 7 +- /* }}} */ +- /* {{{ Registres SSE*/ +-#define XMM0 0 +-#define XMM1 1 +-#define XMM2 2 +-#define XMM3 3 +-#define XMM4 4 +-#define XMM5 5 +-#define XMM6 6 +-#define XMM7 7 +- /* }}} */ +- /* {{{ Alias aux registres */ +-#define R0 0 +-#define R1 1 +-#define R2 2 +-#define R3 3 +-#define R4 4 +-#define R5 5 +-#define R6 6 +-#define R7 7 +- /* }}} */ +- +- /* {{{ Conditions */ +-#define COND_OVERFLOW 0 +-#define COND_NO_OVERFLOW 1 +-#define COND_BELOW 2 +-#define COND_NOT_BELOW 3 +-#define COND_EQUAL 4 +-#define COND_ZERO 4 +-#define COND_NOT_EQUAL 5 +-#define COND_NOT_ZERO 5 +-#define COND_NOT_ABOVE 6 +-#define COND_ABOVE 7 +-#define COND_SIGN 8 +-#define COND_NOT_SIGN 9 +-#define COND_EVEN 10 +-#define COND_ODD 11 +-#define COND_LESS_THAN 12 +-#define COND_GREATER_EQUAL 13 +-#define COND_LESS_EQUAL 14 +-#define COND_GREATER_THAN 15 +- /* }}} */ +- +-typedef int (*JitcFunc)(void); +- +-typedef struct _LABEL_ADDR { +- char label[JITC_LABEL_SIZE]; +- int address; +-} LabelAddr; +- +-typedef struct _JITC_X86_ENV { +- unsigned char *_memory; +- unsigned char *memory; +- unsigned int used; +- +- int nbUsedLabel; +- int nbKnownLabel; +- LabelAddr *usedLabel; +- LabelAddr *knownLabel; +-} JitcX86Env; +- +-#define DISPLAY_GENCODE +-/*#define DISPLAY_GENCODE_HEXA*/ +- +-#ifdef DISPLAY_GENCODE_HEXA +- #define JITC_ADD_UCHAR(jitc,op) printf(" 0x%02x", op) && (jitc->memory[jitc->used++]=op) +-#else +- #define JITC_ADD_UCHAR(jitc,op) (jitc->memory[jitc->used++]=op) +-#endif +- +-#define JITC_ADD_USHORT(jitc,i) { JITC_ADD_UCHAR(jitc,i&0xff); JITC_ADD_UCHAR(jitc,(i>>8)&0xff); } +-#define JITC_ADD_UINT(jitc,i) { \ +- JITC_ADD_UCHAR(jitc,i&0xff); \ +- JITC_ADD_UCHAR(jitc,(i>>8)&0xff); \ +- JITC_ADD_UCHAR(jitc,(i>>16)&0xff); \ +- JITC_ADD_UCHAR(jitc,(i>>24)&0xff); \ +-} +-#define JITC_ADD_2UCHAR(jitc,op1,op2) {JITC_ADD_UCHAR(jitc,op1); JITC_ADD_UCHAR(jitc,op2);} +- +-#define JITC_MODRM(jitc,mod,reg,rm) { JITC_ADD_UCHAR(jitc,((int)mod<<6)|((int)reg<<3)|((int)rm)); } +- +-/* special values for R/M */ +-#define JITC_RM_DISP32 0x05 +- +-#define JITC_MOD_pREG_REG 0x00 +-#define JITC_MOD_disp8REG_REG 0x01 +-#define JITC_MOD_disp32REG_REG 0x02 +-#define JITC_MOD_REG_REG 0x03 +-/* cf 24319101 p.27 */ +- +-#define JITC_OP_REG_REG(jitc,op,dest,src) { JITC_ADD_UCHAR(jitc,op); JITC_ADD_UCHAR(jitc,0xc0+(src<<3)+dest); } +-#define JITC_OP_REG_pREG(jitc,op,dest,src) { JITC_ADD_UCHAR(jitc,op); JITC_ADD_UCHAR(jitc,(dest<<3)+src); } +-#define JITC_OP_pREG_REG(jitc,op,dest,src) { JITC_ADD_UCHAR(jitc,op); JITC_ADD_UCHAR(jitc,(src<<3)+dest); } +- +-/** +- * "high" level macro +- */ +- +-#define JITC_LOAD_REG_IMM32(jitc,reg,imm32) { JITC_ADD_UCHAR (jitc,0xb8+reg); JITC_ADD_UINT(jitc,(int)(imm32)); } +-#define JITC_LOAD_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x89,dest,src); } +- +-#define JITC_LOAD_REG_pREG(jitc,dest,src) { JITC_OP_REG_pREG(jitc,0x8b,dest,src); } +-#define JITC_LOAD_pREG_REG(jitc,dest,src) { JITC_OP_pREG_REG(jitc,0x89,dest,src); } +- +-#define JITC_DEC_REG(jitc,reg) { JITC_ADD_UCHAR (jitc,0x48+reg); } +-#define JITC_INC_REG(jitc,reg) { JITC_ADD_UCHAR (jitc,0x40+reg); } +- +-#define JITC_ADD_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x01,dest,src); } +-#define JITC_ADD_REG_IMM32(jitc,reg,imm32) { JITC_ADD_UCHAR (jitc,0x81);\ +- JITC_ADD_UCHAR (jitc,0xc0+reg);\ +- JITC_ADD_UINT (jitc,(int)imm32); } +- +-#define JITC_AND_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x21,dest,src); } +-#define JITC_CMP_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x39,dest,src); } +-#define JITC_CMP_REG_IMM32(jitc,reg,imm32) { JITC_ADD_2UCHAR (jitc,0x81,0xf8+reg); \ +- JITC_ADD_UINT (jitc,(int)imm32); } +- +-#define JITC_IDIV_EAX_REG(jitc,reg) { JITC_ADD_2UCHAR(jitc, 0xf7, 0xf8+reg); } +-#define JITC_IMUL_EAX_REG(jitc,reg) { JITC_ADD_2UCHAR(jitc, 0xf7, 0xe8+reg); } +- +-/*#define JITC_SUB_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x29,dest,src); } +-#define JITC_SUB_EAX_IMM32(jitc,imm32) { JITC_ADD_UCHAR (jitc,0x2d); JITC_ADD_UINT(jitc,(int)imm32); } +-#define JITC_SUB_REG_IMM32(jitc,reg,imm32) { JITC_ADD_2UCHAR (jitc,0x81, 0xe8+reg);\ +- JITC_ADD_UINT (jitc,(int)imm32); }*/ +-#define JITC_SUB_REG_IMM8(jitc,reg,imm8) { JITC_ADD_2UCHAR (jitc,0x83, 0xe8+reg);\ +- JITC_ADD_UCHAR(jitc,imm8); } +- +-/* Floating points */ +- +-#define JITC_FLD_pIMM32(jitc,address) { JITC_ADD_UCHAR (jitc, 0xD9); \ +- JITC_MODRM (jitc, 0x00, 0x00,JITC_RM_DISP32); \ +- JITC_ADD_UINT(jitc,(int)(address)); } +-#define JITC_FLD_STi(jict,reg) { JITC_ADD_2UCHAR (jitc, 0xD9, 0xC0+reg); } +- +-#define JITC_FST_pIMM32(jitc,address) { JITC_ADD_UCHAR (jitc, 0xD9); \ +- JITC_MODRM (jitc, 0x00, 0x02,JITC_RM_DISP32); \ +- JITC_ADD_UINT(jitc,(int)(ADDRess)); } +-#define JITC_FST_STi(jict,reg) { JITC_ADD_2UCHAR (jitc, 0xDD, 0xD0+reg); } +- +-#define JITC_FSTP_pIMM32(jitc,address) { JITC_ADD_UCHAR (jitc, 0xD9); \ +- JITC_MODRM (jitc, 0x00, 0x03, JITC_RM_DISP32); \ +- JITC_ADD_UINT(jitc,(int)(address)); } +-#define JITC_FSTP_STi(jict,reg) { JITC_ADD_2UCHAR (jitc, 0xDD, 0xD8+reg); } +- +-#define JITC_FADD +- +-/* Jumps */ +- +-#define JITC_ADD_LABEL(jitc,label) { jitc_add_known_label(jitc,label,jitc->used); } +- +-#define JITC_JUMP(jitc,offset) { JITC_ADD_UCHAR(jitc,0xe9); JITC_ADD_UINT(jitc,offset); } +-#define JITC_JUMP_LABEL(jitc,label) { jitc_add_used_label(jitc,label,jitc->used+1); JITC_JUMP(jitc,0); } +-#define JITC_JUMP_COND(jitc,cond,offset) { JITC_ADD_UCHAR(jitc,0x0f);\ +- JITC_ADD_UCHAR(jitc,0x80+cond);\ +- JITC_ADD_UINT(jitc,offset); } +-#define JITC_JUMP_COND_LABEL(jitc,cond,label) { jitc_add_used_label(jitc,label,jitc->used+2); JITC_JUMP_COND(jitc,cond,0); } +-#define JITC_CALL(jitc,function) { int __offset__ = (int)function - (int)(&jitc->memory[jitc->used+5]);\ +- JITC_ADD_UCHAR(jitc,0xe8); JITC_ADD_UINT(jitc,__offset__); } +-/*#define JITC_CALL_pREG(jitc,reg) { JITC_ADD_UCHAR(jitc,0xff); JITC_ADD_UCHAR(jitc,0xd0+reg); } +-#define JITC_CALL_LABEL(jitc,label) { jitc_add_used_label(jitc,label,jitc->used+1); JITC_CALL(jitc,0); }*/ +- +-/* save all registers (except EAX,ESP,EBP) */ +-#define JITC_PUSH_ALL(jitc) { jitc_add(jitc,"push ecx"); jitc_add(jitc,"push edx"); jitc_add(jitc,"push ebx"); \ +- jitc_add(jitc,"push esi"); jitc_add(jitc,"push edi"); } +- +-/* restore all registers (except EAX,ESP,EBP) */ +-#define JITC_POP_ALL(jitc) { jitc_add(jitc,"pop edi"); jitc_add(jitc,"pop esi"); jitc_add(jitc,"pop ebx"); \ +- jitc_add(jitc,"pop edx"); jitc_add(jitc,"pop ecx"); } +- +-/* public methods */ +-JitcX86Env *jitc_x86_env_new(int memory_size); +-JitcFunc jitc_prepare_func(JitcX86Env *jitc); +-void jitc_add(JitcX86Env *jitc, const char *instr, ...); +-void jitc_validate_func(JitcX86Env *jitc); +-void jitc_x86_delete(JitcX86Env *jitc); +- +- +-/* private methods */ +-void jitc_add_used_label(JitcX86Env *jitc, char *label, int where); +-void jitc_add_known_label(JitcX86Env *jitc, char *label, int where); +-void jitc_resolve_labels(JitcX86Env *jitc); +diff -Naur /home/d4rk/goom2k4-0/src/lines.c /src/lines.c +--- /home/d4rk/goom2k4-0/src/lines.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/lines.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,238 +0,0 @@ +-/* +- * lines.c +- */ +- +-#include "lines.h" +-#include <math.h> +-#include <stdlib.h> +-#include <stdio.h> +-#include "goom_tools.h" +-#include "drawmethods.h" +-#include "goom_plugin_info.h" +- +-static inline unsigned char lighten (unsigned char value, float power) +-{ +- int val = value; +- float t = (float) val * log10(power) / 2.0; +- +- if (t > 0) { +- val = (int) t; /* (32.0f * log (t)); */ +- if (val > 255) +- val = 255; +- if (val < 0) +- val = 0; +- return val; +- } +- else { +- return 0; +- } +-} +- +-static void lightencolor (guint32 *col, float power) +-{ +- unsigned char *color; +- +- color = (unsigned char *) col; +- *color = lighten (*color, power); +- color++; +- *color = lighten (*color, power); +- color++; +- *color = lighten (*color, power); +- color++; +- *color = lighten (*color, power); +-} +- +- +- +-static void +-genline (int id, float param, GMUnitPointer * l, int rx, int ry) +-{ +- int i; +- +- switch (id) { +- case GML_HLINE: +- for (i = 0; i < 512; i++) { +- l[i].x = ((float) i * rx) / 512.0f; +- l[i].y = param; +- l[i].angle = M_PI / 2.0f; +- } +- return; +- case GML_VLINE: +- for (i = 0; i < 512; i++) { +- l[i].y = ((float) i * ry) / 512.0f; +- l[i].x = param; +- l[i].angle = 0.0f; +- } +- return; +- case GML_CIRCLE: +- for (i = 0; i < 512; i++) { +- float cosa, sina; +- +- l[i].angle = 2.0f * M_PI * (float) i / 512.0f; +- cosa = param * cos (l[i].angle); +- sina = param * sin (l[i].angle); +- l[i].x = ((float) rx / 2.0f) + cosa; +- l[i].y = (float) ry / 2.0f + sina; +- } +- return; +- } +-} +- +-static guint32 getcouleur (int mode) +-{ +- switch (mode) { +- case GML_RED: +- return (230 << (ROUGE * 8)) | (120 << (VERT * 8)) | (18 << (BLEU * 8)); +- case GML_ORANGE_J: +- return (120 << (VERT * 8)) | (252 << (ROUGE * 8)) | (18 << (BLEU * 8)); +- case GML_ORANGE_V: +- return (160 << (VERT * 8)) | (236 << (ROUGE * 8)) | (40 << (BLEU * 8)); +- case GML_BLEUBLANC: +- return (40 << (BLEU * 8)) | (220 << (ROUGE * 8)) | (140 << (VERT * 8)); +- case GML_VERT: +- return (200 << (VERT * 8)) | (80 << (ROUGE * 8)) | (18 << (BLEU * 8)); +- case GML_BLEU: +- return (250 << (BLEU * 8)) | (30 << (VERT * 8)) | (80 << (ROUGE * 8)); +- case GML_BLACK: +- return (16 << (BLEU * 8)) | (16 << (VERT * 8)) | (16 << (ROUGE * 8)); +- } +- return 0; +-} +- +-void +-goom_lines_set_res (GMLine * gml, int rx, int ry) +-{ +- if (gml != NULL) { +- gml->screenX = rx; +- gml->screenY = ry; +- +- genline (gml->IDdest, gml->param, gml->points2, rx, ry); +- } +-} +- +- +-static void +-goom_lines_move (GMLine * l) +-{ +- int i; +- unsigned char *c1, *c2; +- +- for (i = 0; i < 512; i++) { +- l->points[i].x = (l->points2[i].x + 39.0f * l->points[i].x) / 40.0f; +- l->points[i].y = (l->points2[i].y + 39.0f * l->points[i].y) / 40.0f; +- l->points[i].angle = +- (l->points2[i].angle + 39.0f * l->points[i].angle) / 40.0f; +- } +- +- c1 = (unsigned char *) &l->color; +- c2 = (unsigned char *) &l->color2; +- for (i = 0; i < 4; i++) { +- int cc1, cc2; +- +- cc1 = *c1; +- cc2 = *c2; +- *c1 = (unsigned char) ((cc1 * 63 + cc2) >> 6); +- ++c1; +- ++c2; +- } +- +- l->power += l->powinc; +- if (l->power < 1.1f) { +- l->power = 1.1f; +- l->powinc = (float) (goom_irand(l->goomInfo->gRandom,20) + 10) / 300.0f; +- } +- if (l->power > 17.5f) { +- l->power = 17.5f; +- l->powinc = -(float) (goom_irand(l->goomInfo->gRandom,20) + 10) / 300.0f; +- } +- +- l->amplitude = (99.0f * l->amplitude + l->amplitudeF) / 100.0f; +-} +- +-void +-goom_lines_switch_to (GMLine * gml, int IDdest, +- float param, float amplitude, int col) +-{ +- genline (IDdest, param, gml->points2, gml->screenX, gml->screenY); +- gml->IDdest = IDdest; +- gml->param = param; +- gml->amplitudeF = amplitude; +- gml->color2 = getcouleur (col); +-} +- +-GMLine * +-goom_lines_init (PluginInfo *goomInfo, int rx, int ry, +- int IDsrc, float paramS, int coulS, +- int IDdest, float paramD, int coulD) +-{ +- GMLine *l = (GMLine *) malloc (sizeof (GMLine)); +- +- l->goomInfo = goomInfo; +- +- l->points = (GMUnitPointer *) malloc (512 * sizeof (GMUnitPointer)); +- l->points2 = (GMUnitPointer *) malloc (512 * sizeof (GMUnitPointer)); +- l->nbPoints = 512; +- +- l->IDdest = IDdest; +- l->param = paramD; +- +- l->amplitude = l->amplitudeF = 1.0f; +- +- genline (IDsrc, paramS, l->points, rx, ry); +- genline (IDdest, paramD, l->points2, rx, ry); +- +- l->color = getcouleur (coulS); +- l->color2 = getcouleur (coulD); +- +- l->screenX = rx; +- l->screenY = ry; +- +- l->power = 0.0f; +- l->powinc = 0.01f; +- +- goom_lines_switch_to (l, IDdest, paramD, 1.0f, coulD); +- +- return l; +-} +- +-void +-goom_lines_free (GMLine ** l) +-{ +- free ((*l)->points); +- free (*l); +- l = NULL; +-} +- +-void goom_lines_draw (PluginInfo *plug, GMLine * line, gint16 data[512], Pixel *p) +-{ +- if (line != NULL) { +- int i, x1, y1; +- guint32 color = line->color; +- GMUnitPointer *pt = &(line->points[0]); +- +- float cosa = cos (pt->angle) / 1000.0f; +- float sina = sin (pt->angle) / 1000.0f; +- +- lightencolor (&color, line->power); +- +- x1 = (int) (pt->x + cosa * line->amplitude * data[0]); +- y1 = (int) (pt->y + sina * line->amplitude * data[0]); +- +- for (i = 1; i < 512; i++) { +- int x2, y2; +- GMUnitPointer *pt = &(line->points[i]); +- +- float cosa = cos (pt->angle) / 1000.0f; +- float sina = sin (pt->angle) / 1000.0f; +- +- x2 = (int) (pt->x + cosa * line->amplitude * data[i]); +- y2 = (int) (pt->y + sina * line->amplitude * data[i]); +- +- plug->methods.draw_line (p, x1, y1, x2, y2, color, line->screenX, line->screenY); +- +- x1 = x2; +- y1 = y2; +- } +- goom_lines_move (line); +- } +-} +diff -Naur /home/d4rk/goom2k4-0/src/lines.h /src/lines.h +--- /home/d4rk/goom2k4-0/src/lines.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/lines.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,81 +0,0 @@ +-#ifndef _LINES_H +-#define _LINES_H +- +-/* +- * lines.h +- * Goom +- * Copyright (c) 2000-2003 iOS-software. All rights reserved. +- */ +- +-#include "goom_typedefs.h" +-#include "goom_graphic.h" +-#include "goom_config.h" +- +-struct _GMUNITPOINTER +-{ +- float x; +- float y; +- float angle; +-}; +- +-/* tableau de points */ +-struct _GMLINE +-{ +- +- GMUnitPointer *points; +- GMUnitPointer *points2; +- int IDdest; +- float param; +- float amplitudeF; +- float amplitude; +- +- int nbPoints; +- guint32 color; /* pour l'instant je stocke la couleur a terme, on stockera le mode couleur et l'on animera */ +- guint32 color2; +- +- int screenX; +- int screenY; +- +- float power; +- float powinc; +- +- PluginInfo *goomInfo; +-}; +- +-/* les ID possibles */ +- +-#define GML_CIRCLE 0 +-/* (param = radius) */ +- +-#define GML_HLINE 1 +-/* (param = y) */ +- +-#define GML_VLINE 2 +-/* (param = x) */ +- +-/* les modes couleur possible (si tu mets un autre c'est noir) */ +- +-#define GML_BLEUBLANC 0 +-#define GML_RED 1 +-#define GML_ORANGE_V 2 +-#define GML_ORANGE_J 3 +-#define GML_VERT 4 +-#define GML_BLEU 5 +-#define GML_BLACK 6 +- +-/* construit un effet de line (une ligne horitontale pour commencer) */ +-GMLine *goom_lines_init (PluginInfo *goomInfo, int rx, int ry, +- int IDsrc, float paramS, int modeCoulSrc, +- int IDdest, float paramD, int modeCoulDest); +- +-void goom_lines_switch_to (GMLine * gml, int IDdest, float param, +- float amplitude, +- int modeCoul); +- +-void goom_lines_set_res (GMLine * gml, int rx, int ry); +- +-void goom_lines_free (GMLine ** gml); +- +-void goom_lines_draw (PluginInfo *plugInfo, GMLine * gml, gint16 data[512], Pixel *p); +- +-#endif /* _LINES_H */ +diff -Naur /home/d4rk/goom2k4-0/src/Makefile.am /src/Makefile.am +--- /home/d4rk/goom2k4-0/src/Makefile.am 2005-02-07 06:46:41.000000000 -0700 ++++ /src/Makefile.am 1969-12-31 17:00:00.000000000 -0700 +@@ -1,34 +0,0 @@ +-# libgoom2 +- +-if HAVE_MMX +-MMX_FILES=mmx.c xmmx.c +-else +-MMX_FILES= +-endif +- +-if HAVE_PPC +-PPC_FILES=ppc_zoom_ultimate.s ppc_drawings.s +-else +-PPC_FILES= +-endif +- +-goom2_lib_LTLIBRARIES = libgoom2.la +-goom2_libdir = $(libdir) +- +-goom2_library_includedir=$(includedir)/goom +-goom2_library_include_HEADERS = goom.h goom_plugin_info.h goom_typedefs.h goom_graphic.h goom_config_param.h goom_visual_fx.h goom_filters.h goom_tools.h goomsl.h goomsl_hash.h goomsl_heap.h goom_tools.h goom_config.h +-libgoom2_la_LDFLAGS = -export-dynamic -export-symbols-regex "goom.*" +-libgoom2_la_SOURCES = \ +- goomsl_yacc.y goomsl_lex.l goomsl.c goomsl_hash.c goomsl_heap.c \ +- goom_tools.c $(MMX_FILES) $(PPC_FILES) \ +- config_param.c convolve_fx.c filters.c \ +- flying_stars_fx.c gfontlib.c gfontrle.c \ +- goom_core.c graphic.c ifs.c lines.c \ +- mathtools.c sound_tester.c surf3d.c \ +- tentacle3d.c plugin_info.c \ +- v3d.c drawmethods.c \ +- cpu_info.c +- +-AM_YFLAGS=-d +- +-noinst_HEADERS = mmx.h +diff -Naur /home/d4rk/goom2k4-0/src/Makefile.in /src/Makefile.in +--- /home/d4rk/goom2k4-0/src/Makefile.in 2005-02-07 06:49:26.000000000 -0700 ++++ /src/Makefile.in 1969-12-31 17:00:00.000000000 -0700 +@@ -1,621 +0,0 @@ +-# Makefile.in generated by automake 1.9.4 from Makefile.am. +-# @configure_input@ +- +-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. +-# This Makefile.in is free software; the Free Software Foundation +-# gives unlimited permission to copy and/or distribute it, +-# with or without modifications, as long as this notice is preserved. +- +-# This program is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +-# PARTICULAR PURPOSE. +- +-@SET_MAKE@ +- +-# libgoom2 +- +- +-SOURCES = $(libgoom2_la_SOURCES) +- +-srcdir = @srcdir@ +-top_srcdir = @top_srcdir@ +-VPATH = @srcdir@ +-pkgdatadir = $(datadir)/@PACKAGE@ +-pkglibdir = $(libdir)/@PACKAGE@ +-pkgincludedir = $(includedir)/@PACKAGE@ +-top_builddir = .. +-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +-INSTALL = @INSTALL@ +-install_sh_DATA = $(install_sh) -c -m 644 +-install_sh_PROGRAM = $(install_sh) -c +-install_sh_SCRIPT = $(install_sh) -c +-INSTALL_HEADER = $(INSTALL_DATA) +-transform = $(program_transform_name) +-NORMAL_INSTALL = : +-PRE_INSTALL = : +-POST_INSTALL = : +-NORMAL_UNINSTALL = : +-PRE_UNINSTALL = : +-POST_UNINSTALL = : +-build_triplet = @build@ +-host_triplet = @host@ +-subdir = src +-DIST_COMMON = $(goom2_library_include_HEADERS) $(noinst_HEADERS) \ +- $(srcdir)/Makefile.am $(srcdir)/Makefile.in TODO goomsl_lex.c \ +- goomsl_yacc.c goomsl_yacc.h +-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +-am__aclocal_m4_deps = $(top_srcdir)/m4/sdl.m4 $(top_srcdir)/m4/xmms.m4 \ +- $(top_srcdir)/configure.in +-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ +- $(ACLOCAL_M4) +-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +-CONFIG_CLEAN_FILES = +-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +-am__vpath_adj = case $$p in \ +- $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ +- *) f=$$p;; \ +- esac; +-am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +-am__installdirs = "$(DESTDIR)$(goom2_libdir)" \ +- "$(DESTDIR)$(goom2_library_includedir)" +-goom2_libLTLIBRARIES_INSTALL = $(INSTALL) +-LTLIBRARIES = $(goom2_lib_LTLIBRARIES) +-libgoom2_la_LIBADD = +-am__libgoom2_la_SOURCES_DIST = goomsl_yacc.y goomsl_lex.l goomsl.c \ +- goomsl_hash.c goomsl_heap.c goom_tools.c mmx.c xmmx.c \ +- ppc_zoom_ultimate.s ppc_drawings.s config_param.c \ +- convolve_fx.c filters.c flying_stars_fx.c gfontlib.c \ +- gfontrle.c goom_core.c graphic.c ifs.c lines.c mathtools.c \ +- sound_tester.c surf3d.c tentacle3d.c plugin_info.c v3d.c \ +- drawmethods.c cpu_info.c +-@HAVE_MMX_TRUE@am__objects_1 = mmx.lo xmmx.lo +-@HAVE_PPC_TRUE@am__objects_2 = ppc_zoom_ultimate.lo ppc_drawings.lo +-am_libgoom2_la_OBJECTS = goomsl_yacc.lo goomsl_lex.lo goomsl.lo \ +- goomsl_hash.lo goomsl_heap.lo goom_tools.lo $(am__objects_1) \ +- $(am__objects_2) config_param.lo convolve_fx.lo filters.lo \ +- flying_stars_fx.lo gfontlib.lo gfontrle.lo goom_core.lo \ +- graphic.lo ifs.lo lines.lo mathtools.lo sound_tester.lo \ +- surf3d.lo tentacle3d.lo plugin_info.lo v3d.lo drawmethods.lo \ +- cpu_info.lo +-libgoom2_la_OBJECTS = $(am_libgoom2_la_OBJECTS) +-DEFAULT_INCLUDES = -I. -I$(srcdir) +-depcomp = $(SHELL) $(top_srcdir)/depcomp +-am__depfiles_maybe = depfiles +-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ +- $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +-LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ +- $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ +- $(AM_CFLAGS) $(CFLAGS) +-CCLD = $(CC) +-LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ +- $(AM_LDFLAGS) $(LDFLAGS) -o $@ +-LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS) +-LTLEXCOMPILE = $(LIBTOOL) --mode=compile $(LEX) $(LFLAGS) $(AM_LFLAGS) +-CCASCOMPILE = $(CCAS) $(AM_CCASFLAGS) $(CCASFLAGS) +-LTCCASCOMPILE = $(LIBTOOL) --mode=compile $(CCAS) $(AM_CCASFLAGS) \ +- $(CCASFLAGS) +-YACCCOMPILE = $(YACC) $(YFLAGS) $(AM_YFLAGS) +-LTYACCCOMPILE = $(LIBTOOL) --mode=compile $(YACC) $(YFLAGS) \ +- $(AM_YFLAGS) +-SOURCES = $(libgoom2_la_SOURCES) +-DIST_SOURCES = $(am__libgoom2_la_SOURCES_DIST) +-goom2_library_includeHEADERS_INSTALL = $(INSTALL_HEADER) +-HEADERS = $(goom2_library_include_HEADERS) $(noinst_HEADERS) +-ETAGS = etags +-CTAGS = ctags +-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +-ACLOCAL = @ACLOCAL@ +-AMDEP_FALSE = @AMDEP_FALSE@ +-AMDEP_TRUE = @AMDEP_TRUE@ +-AMTAR = @AMTAR@ +-AR = @AR@ +-AUTOCONF = @AUTOCONF@ +-AUTOHEADER = @AUTOHEADER@ +-AUTOMAKE = @AUTOMAKE@ +-AWK = @AWK@ +-CC = @CC@ +-CCAS = @CCAS@ +-CCASFLAGS = @CCASFLAGS@ +-CCDEPMODE = @CCDEPMODE@ +-CFLAGS = @CFLAGS@ +-CPP = @CPP@ +-CPPFLAGS = @CPPFLAGS@ +-CXX = @CXX@ +-CXXCPP = @CXXCPP@ +-CXXDEPMODE = @CXXDEPMODE@ +-CXXFLAGS = @CXXFLAGS@ +-CYGPATH_W = @CYGPATH_W@ +-DEFS = @DEFS@ +-DEPDIR = @DEPDIR@ +-ECHO = @ECHO@ +-ECHO_C = @ECHO_C@ +-ECHO_N = @ECHO_N@ +-ECHO_T = @ECHO_T@ +-EGREP = @EGREP@ +-EXEEXT = @EXEEXT@ +-F77 = @F77@ +-FFLAGS = @FFLAGS@ +-HAVE_MMX_FALSE = @HAVE_MMX_FALSE@ +-HAVE_MMX_TRUE = @HAVE_MMX_TRUE@ +-HAVE_PPC_FALSE = @HAVE_PPC_FALSE@ +-HAVE_PPC_TRUE = @HAVE_PPC_TRUE@ +-HAVE_SDL_FALSE = @HAVE_SDL_FALSE@ +-HAVE_SDL_TRUE = @HAVE_SDL_TRUE@ +-HAVE_XMMS_FALSE = @HAVE_XMMS_FALSE@ +-HAVE_XMMS_TRUE = @HAVE_XMMS_TRUE@ +-INSTALL_DATA = @INSTALL_DATA@ +-INSTALL_PROGRAM = @INSTALL_PROGRAM@ +-INSTALL_SCRIPT = @INSTALL_SCRIPT@ +-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +-LDFLAGS = @LDFLAGS@ +-LEX = @LEX@ +-LEXLIB = @LEXLIB@ +-LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +-LIBOBJS = @LIBOBJS@ +-LIBS = @LIBS@ +-LIBTOOL = @LIBTOOL@ +-LN_S = @LN_S@ +-LTLIBOBJS = @LTLIBOBJS@ +-MACFOLDER = @MACFOLDER@ +-MACTARGET_FALSE = @MACTARGET_FALSE@ +-MACTARGET_TRUE = @MACTARGET_TRUE@ +-MAKEINFO = @MAKEINFO@ +-OBJEXT = @OBJEXT@ +-PACKAGE = @PACKAGE@ +-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +-PACKAGE_NAME = @PACKAGE_NAME@ +-PACKAGE_STRING = @PACKAGE_STRING@ +-PACKAGE_TARNAME = @PACKAGE_TARNAME@ +-PACKAGE_VERSION = @PACKAGE_VERSION@ +-PATH_SEPARATOR = @PATH_SEPARATOR@ +-PTHREAD_LIBS = @PTHREAD_LIBS@ +-RANLIB = @RANLIB@ +-SDL_CFLAGS = @SDL_CFLAGS@ +-SDL_CONFIG = @SDL_CONFIG@ +-SDL_LIBS = @SDL_LIBS@ +-SET_MAKE = @SET_MAKE@ +-SHELL = @SHELL@ +-STRIP = @STRIP@ +-VERSION = @VERSION@ +-XMMS_CFLAGS = @XMMS_CFLAGS@ +-XMMS_CONFIG = @XMMS_CONFIG@ +-XMMS_DATA_DIR = @XMMS_DATA_DIR@ +-XMMS_EFFECT_PLUGIN_DIR = @XMMS_EFFECT_PLUGIN_DIR@ +-XMMS_GENERAL_PLUGIN_DIR = @XMMS_GENERAL_PLUGIN_DIR@ +-XMMS_INPUT_PLUGIN_DIR = @XMMS_INPUT_PLUGIN_DIR@ +-XMMS_LIBS = @XMMS_LIBS@ +-XMMS_OUTPUT_PLUGIN_DIR = @XMMS_OUTPUT_PLUGIN_DIR@ +-XMMS_PLUGIN_DIR = @XMMS_PLUGIN_DIR@ +-XMMS_VERSION = @XMMS_VERSION@ +-XMMS_VISUALIZATION_PLUGIN_DIR = @XMMS_VISUALIZATION_PLUGIN_DIR@ +-YACC = @YACC@ +-ac_ct_AR = @ac_ct_AR@ +-ac_ct_CC = @ac_ct_CC@ +-ac_ct_CXX = @ac_ct_CXX@ +-ac_ct_F77 = @ac_ct_F77@ +-ac_ct_RANLIB = @ac_ct_RANLIB@ +-ac_ct_STRIP = @ac_ct_STRIP@ +-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +-am__include = @am__include@ +-am__leading_dot = @am__leading_dot@ +-am__quote = @am__quote@ +-am__tar = @am__tar@ +-am__untar = @am__untar@ +-bindir = @bindir@ +-build = @build@ +-build_alias = @build_alias@ +-build_cpu = @build_cpu@ +-build_os = @build_os@ +-build_vendor = @build_vendor@ +-datadir = @datadir@ +-exec_prefix = @exec_prefix@ +-host = @host@ +-host_alias = @host_alias@ +-host_cpu = @host_cpu@ +-host_os = @host_os@ +-host_vendor = @host_vendor@ +-includedir = @includedir@ +-infodir = @infodir@ +-install_sh = @install_sh@ +-libdir = @libdir@ +-libexecdir = @libexecdir@ +-localstatedir = @localstatedir@ +-mandir = @mandir@ +-mkdir_p = @mkdir_p@ +-oldincludedir = @oldincludedir@ +-prefix = @prefix@ +-program_transform_name = @program_transform_name@ +-sbindir = @sbindir@ +-sharedstatedir = @sharedstatedir@ +-sysconfdir = @sysconfdir@ +-target_alias = @target_alias@ +-@HAVE_MMX_FALSE@MMX_FILES = +-@HAVE_MMX_TRUE@MMX_FILES = mmx.c xmmx.c +-@HAVE_PPC_FALSE@PPC_FILES = +-@HAVE_PPC_TRUE@PPC_FILES = ppc_zoom_ultimate.s ppc_drawings.s +-goom2_lib_LTLIBRARIES = libgoom2.la +-goom2_libdir = $(libdir) +-goom2_library_includedir = $(includedir)/goom +-goom2_library_include_HEADERS = goom.h goom_plugin_info.h goom_typedefs.h goom_graphic.h goom_config_param.h goom_visual_fx.h goom_filters.h goom_tools.h goomsl.h goomsl_hash.h goomsl_heap.h goom_tools.h goom_config.h +-libgoom2_la_LDFLAGS = -export-dynamic -export-symbols-regex "goom.*" +-libgoom2_la_SOURCES = \ +- goomsl_yacc.y goomsl_lex.l goomsl.c goomsl_hash.c goomsl_heap.c \ +- goom_tools.c $(MMX_FILES) $(PPC_FILES) \ +- config_param.c convolve_fx.c filters.c \ +- flying_stars_fx.c gfontlib.c gfontrle.c \ +- goom_core.c graphic.c ifs.c lines.c \ +- mathtools.c sound_tester.c surf3d.c \ +- tentacle3d.c plugin_info.c \ +- v3d.c drawmethods.c \ +- cpu_info.c +- +-AM_YFLAGS = -d +-noinst_HEADERS = mmx.h +-all: all-am +- +-.SUFFIXES: +-.SUFFIXES: .c .l .lo .o .obj .s .y +-$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) +- @for dep in $?; do \ +- case '$(am__configure_deps)' in \ +- *$$dep*) \ +- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ +- && exit 0; \ +- exit 1;; \ +- esac; \ +- done; \ +- echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ +- cd $(top_srcdir) && \ +- $(AUTOMAKE) --foreign src/Makefile +-.PRECIOUS: Makefile +-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status +- @case '$?' in \ +- *config.status*) \ +- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ +- *) \ +- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ +- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ +- esac; +- +-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) +- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +- +-$(top_srcdir)/configure: $(am__configure_deps) +- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +-$(ACLOCAL_M4): $(am__aclocal_m4_deps) +- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +-install-goom2_libLTLIBRARIES: $(goom2_lib_LTLIBRARIES) +- @$(NORMAL_INSTALL) +- test -z "$(goom2_libdir)" || $(mkdir_p) "$(DESTDIR)$(goom2_libdir)" +- @list='$(goom2_lib_LTLIBRARIES)'; for p in $$list; do \ +- if test -f $$p; then \ +- f=$(am__strip_dir) \ +- echo " $(LIBTOOL) --mode=install $(goom2_libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(goom2_libdir)/$$f'"; \ +- $(LIBTOOL) --mode=install $(goom2_libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(goom2_libdir)/$$f"; \ +- else :; fi; \ +- done +- +-uninstall-goom2_libLTLIBRARIES: +- @$(NORMAL_UNINSTALL) +- @set -x; list='$(goom2_lib_LTLIBRARIES)'; for p in $$list; do \ +- p=$(am__strip_dir) \ +- echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(goom2_libdir)/$$p'"; \ +- $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(goom2_libdir)/$$p"; \ +- done +- +-clean-goom2_libLTLIBRARIES: +- -test -z "$(goom2_lib_LTLIBRARIES)" || rm -f $(goom2_lib_LTLIBRARIES) +- @list='$(goom2_lib_LTLIBRARIES)'; for p in $$list; do \ +- dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ +- test "$$dir" != "$$p" || dir=.; \ +- echo "rm -f \"$${dir}/so_locations\""; \ +- rm -f "$${dir}/so_locations"; \ +- done +-goomsl_yacc.h: goomsl_yacc.c +- @if test ! -f $@; then \ +- rm -f goomsl_yacc.c; \ +- $(MAKE) goomsl_yacc.c; \ +- else :; fi +-libgoom2.la: $(libgoom2_la_OBJECTS) $(libgoom2_la_DEPENDENCIES) +- $(LINK) -rpath $(goom2_libdir) $(libgoom2_la_LDFLAGS) $(libgoom2_la_OBJECTS) $(libgoom2_la_LIBADD) $(LIBS) +- +-mostlyclean-compile: +- -rm -f *.$(OBJEXT) +- +-distclean-compile: +- -rm -f *.tab.c +- +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/config_param.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/convolve_fx.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu_info.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/drawmethods.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filters.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flying_stars_fx.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gfontlib.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gfontrle.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/goom_core.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/goom_tools.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/goomsl.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/goomsl_hash.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/goomsl_heap.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/goomsl_lex.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/goomsl_yacc.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/graphic.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ifs.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lines.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mathtools.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mmx.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plugin_info.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sound_tester.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/surf3d.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tentacle3d.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/v3d.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmmx.Plo@am__quote@ +- +-.c.o: +-@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +-@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +-@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +-@am__fastdepCC_FALSE@ $(COMPILE) -c $< +- +-.c.obj: +-@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +-@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +-@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +-@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +- +-.c.lo: +-@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +-@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +-@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +-@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +- +-.l.c: +- $(LEXCOMPILE) $< +- sed '/^#/ s|$(LEX_OUTPUT_ROOT)\.c|$@|' $(LEX_OUTPUT_ROOT).c >$@ +- rm -f $(LEX_OUTPUT_ROOT).c +- +-.s.o: +- $(CCASCOMPILE) -c $< +- +-.s.obj: +- $(CCASCOMPILE) -c `$(CYGPATH_W) '$<'` +- +-.s.lo: +- $(LTCCASCOMPILE) -c -o $@ $< +- +-.y.c: +- $(YACCCOMPILE) $< +- if test -f y.tab.h; then \ +- to=`echo "$*_H" | sed \ +- -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \ +- -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'`; \ +- sed -e "/^#/!b" -e "s/Y_TAB_H/$$to/g" -e "s|y\.tab\.h|$*.h|" \ +- y.tab.h >$*.ht; \ +- rm -f y.tab.h; \ +- if cmp -s $*.ht $*.h; then \ +- rm -f $*.ht ;\ +- else \ +- mv $*.ht $*.h; \ +- fi; \ +- fi +- if test -f y.output; then \ +- mv y.output $*.output; \ +- fi +- sed '/^#/ s|y\.tab\.c|$@|' y.tab.c >$@t && mv $@t $@ +- rm -f y.tab.c +- +-mostlyclean-libtool: +- -rm -f *.lo +- +-clean-libtool: +- -rm -rf .libs _libs +- +-distclean-libtool: +- -rm -f libtool +-uninstall-info-am: +-install-goom2_library_includeHEADERS: $(goom2_library_include_HEADERS) +- @$(NORMAL_INSTALL) +- test -z "$(goom2_library_includedir)" || $(mkdir_p) "$(DESTDIR)$(goom2_library_includedir)" +- @list='$(goom2_library_include_HEADERS)'; for p in $$list; do \ +- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ +- f=$(am__strip_dir) \ +- echo " $(goom2_library_includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(goom2_library_includedir)/$$f'"; \ +- $(goom2_library_includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(goom2_library_includedir)/$$f"; \ +- done +- +-uninstall-goom2_library_includeHEADERS: +- @$(NORMAL_UNINSTALL) +- @list='$(goom2_library_include_HEADERS)'; for p in $$list; do \ +- f=$(am__strip_dir) \ +- echo " rm -f '$(DESTDIR)$(goom2_library_includedir)/$$f'"; \ +- rm -f "$(DESTDIR)$(goom2_library_includedir)/$$f"; \ +- done +- +-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) +- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ +- unique=`for i in $$list; do \ +- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ +- done | \ +- $(AWK) ' { files[$$0] = 1; } \ +- END { for (i in files) print i; }'`; \ +- mkid -fID $$unique +-tags: TAGS +- +-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ +- $(TAGS_FILES) $(LISP) +- tags=; \ +- here=`pwd`; \ +- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ +- unique=`for i in $$list; do \ +- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ +- done | \ +- $(AWK) ' { files[$$0] = 1; } \ +- END { for (i in files) print i; }'`; \ +- if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ +- test -n "$$unique" || unique=$$empty_fix; \ +- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ +- $$tags $$unique; \ +- fi +-ctags: CTAGS +-CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ +- $(TAGS_FILES) $(LISP) +- tags=; \ +- here=`pwd`; \ +- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ +- unique=`for i in $$list; do \ +- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ +- done | \ +- $(AWK) ' { files[$$0] = 1; } \ +- END { for (i in files) print i; }'`; \ +- test -z "$(CTAGS_ARGS)$$tags$$unique" \ +- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ +- $$tags $$unique +- +-GTAGS: +- here=`$(am__cd) $(top_builddir) && pwd` \ +- && cd $(top_srcdir) \ +- && gtags -i $(GTAGS_ARGS) $$here +- +-distclean-tags: +- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags +- +-distdir: $(DISTFILES) +- @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ +- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ +- list='$(DISTFILES)'; for file in $$list; do \ +- case $$file in \ +- $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ +- $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ +- esac; \ +- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ +- dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ +- if test "$$dir" != "$$file" && test "$$dir" != "."; then \ +- dir="/$$dir"; \ +- $(mkdir_p) "$(distdir)$$dir"; \ +- else \ +- dir=''; \ +- fi; \ +- if test -d $$d/$$file; then \ +- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ +- cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ +- fi; \ +- cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ +- else \ +- test -f $(distdir)/$$file \ +- || cp -p $$d/$$file $(distdir)/$$file \ +- || exit 1; \ +- fi; \ +- done +-check-am: all-am +-check: check-am +-all-am: Makefile $(LTLIBRARIES) $(HEADERS) +-installdirs: +- for dir in "$(DESTDIR)$(goom2_libdir)" "$(DESTDIR)$(goom2_library_includedir)"; do \ +- test -z "$$dir" || $(mkdir_p) "$$dir"; \ +- done +-install: install-am +-install-exec: install-exec-am +-install-data: install-data-am +-uninstall: uninstall-am +- +-install-am: all-am +- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +- +-installcheck: installcheck-am +-install-strip: +- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ +- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ +- `test -z '$(STRIP)' || \ +- echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +-mostlyclean-generic: +- +-clean-generic: +- +-distclean-generic: +- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) +- +-maintainer-clean-generic: +- @echo "This command is intended for maintainers to use" +- @echo "it deletes files that may require special tools to rebuild." +- -rm -f goomsl_lex.c +- -rm -f goomsl_yacc.c +- -rm -f goomsl_yacc.h +-clean: clean-am +- +-clean-am: clean-generic clean-goom2_libLTLIBRARIES clean-libtool \ +- mostlyclean-am +- +-distclean: distclean-am +- -rm -rf ./$(DEPDIR) +- -rm -f Makefile +-distclean-am: clean-am distclean-compile distclean-generic \ +- distclean-libtool distclean-tags +- +-dvi: dvi-am +- +-dvi-am: +- +-html: html-am +- +-info: info-am +- +-info-am: +- +-install-data-am: install-goom2_libLTLIBRARIES \ +- install-goom2_library_includeHEADERS +- +-install-exec-am: +- +-install-info: install-info-am +- +-install-man: +- +-installcheck-am: +- +-maintainer-clean: maintainer-clean-am +- -rm -rf ./$(DEPDIR) +- -rm -f Makefile +-maintainer-clean-am: distclean-am maintainer-clean-generic +- +-mostlyclean: mostlyclean-am +- +-mostlyclean-am: mostlyclean-compile mostlyclean-generic \ +- mostlyclean-libtool +- +-pdf: pdf-am +- +-pdf-am: +- +-ps: ps-am +- +-ps-am: +- +-uninstall-am: uninstall-goom2_libLTLIBRARIES \ +- uninstall-goom2_library_includeHEADERS uninstall-info-am +- +-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ +- clean-goom2_libLTLIBRARIES clean-libtool ctags distclean \ +- distclean-compile distclean-generic distclean-libtool \ +- distclean-tags distdir dvi dvi-am html html-am info info-am \ +- install install-am install-data install-data-am install-exec \ +- install-exec-am install-goom2_libLTLIBRARIES \ +- install-goom2_library_includeHEADERS install-info \ +- install-info-am install-man install-strip installcheck \ +- installcheck-am installdirs maintainer-clean \ +- maintainer-clean-generic mostlyclean mostlyclean-compile \ +- mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ +- tags uninstall uninstall-am uninstall-goom2_libLTLIBRARIES \ +- uninstall-goom2_library_includeHEADERS uninstall-info-am +- +-# Tell versions [3.59,3.63) of GNU make to not export all variables. +-# Otherwise a system limit (for SysV at least) may be exceeded. +-.NOEXPORT: +diff -Naur /home/d4rk/goom2k4-0/src/mathtools.c /src/mathtools.c +--- /home/d4rk/goom2k4-0/src/mathtools.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/mathtools.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,84 +0,0 @@ +-/*---------------------------------------------------------------------------*/ +-/* +-** mathtools.c +-** Goom Project +-** +-** Created by Jeko on Sun Jul 20 2003 +- ** Copyright (c) 2003 iOS. All rights reserved. +-*/ +-/*---------------------------------------------------------------------------*/ +- +-#include "mathtools.h" +- +-float sin256[256] = { +- 0,0.0245412,0.0490677,0.0735646,0.0980171,0.122411,0.14673,0.170962 +- ,0.19509,0.219101,0.24298,0.266713,0.290285,0.313682,0.33689,0.359895 +- ,0.382683,0.405241,0.427555,0.449611,0.471397,0.492898,0.514103,0.534998 +- ,0.55557,0.575808,0.595699,0.615232,0.634393,0.653173,0.671559,0.689541 +- ,0.707107,0.724247,0.740951,0.757209,0.77301,0.788346,0.803208,0.817585 +- ,0.83147,0.844854,0.857729,0.870087,0.881921,0.893224,0.903989,0.91421 +- ,0.92388,0.932993,0.941544,0.949528,0.95694,0.963776,0.970031,0.975702 +- ,0.980785,0.985278,0.989177,0.99248,0.995185,0.99729,0.998795,0.999699 +- ,1,0.999699,0.998795,0.99729,0.995185,0.99248,0.989177,0.985278 +- ,0.980785,0.975702,0.970031,0.963776,0.95694,0.949528,0.941544,0.932993 +- ,0.92388,0.91421,0.903989,0.893224,0.881921,0.870087,0.857729,0.844854 +- ,0.83147,0.817585,0.803208,0.788346,0.77301,0.757209,0.740951,0.724247 +- ,0.707107,0.689541,0.671559,0.653173,0.634393,0.615232,0.595699,0.575808 +- ,0.55557,0.534998,0.514103,0.492898,0.471397,0.449611,0.427555,0.405241 +- ,0.382683,0.359895,0.33689,0.313682,0.290285,0.266713,0.24298,0.219101 +- ,0.19509,0.170962,0.14673,0.122411,0.0980171,0.0735646,0.0490677,0.0245412 +- ,1.22465e-16,-0.0245412,-0.0490677,-0.0735646,-0.0980171,-0.122411,-0.14673,-0.170962 +- ,-0.19509,-0.219101,-0.24298,-0.266713,-0.290285,-0.313682,-0.33689,-0.359895 +- ,-0.382683,-0.405241,-0.427555,-0.449611,-0.471397,-0.492898,-0.514103,-0.534998 +- ,-0.55557,-0.575808,-0.595699,-0.615232,-0.634393,-0.653173,-0.671559,-0.689541 +- ,-0.707107,-0.724247,-0.740951,-0.757209,-0.77301,-0.788346,-0.803208,-0.817585 +- ,-0.83147,-0.844854,-0.857729,-0.870087,-0.881921,-0.893224,-0.903989,-0.91421 +- ,-0.92388,-0.932993,-0.941544,-0.949528,-0.95694,-0.963776,-0.970031,-0.975702 +- ,-0.980785,-0.985278,-0.989177,-0.99248,-0.995185,-0.99729,-0.998795,-0.999699 +- ,-1,-0.999699,-0.998795,-0.99729,-0.995185,-0.99248,-0.989177,-0.985278 +- ,-0.980785,-0.975702,-0.970031,-0.963776,-0.95694,-0.949528,-0.941544,-0.932993 +- ,-0.92388,-0.91421,-0.903989,-0.893224,-0.881921,-0.870087,-0.857729,-0.844854 +- ,-0.83147,-0.817585,-0.803208,-0.788346,-0.77301,-0.757209,-0.740951,-0.724247 +- ,-0.707107,-0.689541,-0.671559,-0.653173,-0.634393,-0.615232,-0.595699,-0.575808 +- ,-0.55557,-0.534998,-0.514103,-0.492898,-0.471397,-0.449611,-0.427555,-0.405241 +- ,-0.382683,-0.359895,-0.33689,-0.313682,-0.290285,-0.266713,-0.24298,-0.219101 +- ,-0.19509,-0.170962,-0.14673,-0.122411,-0.0980171,-0.0735646,-0.0490677,-0.0245412 +- +-}; +- +-float cos256[256] = { +- 0,0.999699,0.998795,0.99729,0.995185,0.99248,0.989177,0.985278 +- ,0.980785,0.975702,0.970031,0.963776,0.95694,0.949528,0.941544,0.932993 +- ,0.92388,0.91421,0.903989,0.893224,0.881921,0.870087,0.857729,0.844854 +- ,0.83147,0.817585,0.803208,0.788346,0.77301,0.757209,0.740951,0.724247 +- ,0.707107,0.689541,0.671559,0.653173,0.634393,0.615232,0.595699,0.575808 +- ,0.55557,0.534998,0.514103,0.492898,0.471397,0.449611,0.427555,0.405241 +- ,0.382683,0.359895,0.33689,0.313682,0.290285,0.266713,0.24298,0.219101 +- ,0.19509,0.170962,0.14673,0.122411,0.0980171,0.0735646,0.0490677,0.0245412 +- ,6.12323e-17,-0.0245412,-0.0490677,-0.0735646,-0.0980171,-0.122411,-0.14673,-0.170962 +- ,-0.19509,-0.219101,-0.24298,-0.266713,-0.290285,-0.313682,-0.33689,-0.359895 +- ,-0.382683,-0.405241,-0.427555,-0.449611,-0.471397,-0.492898,-0.514103,-0.534998 +- ,-0.55557,-0.575808,-0.595699,-0.615232,-0.634393,-0.653173,-0.671559,-0.689541 +- ,-0.707107,-0.724247,-0.740951,-0.757209,-0.77301,-0.788346,-0.803208,-0.817585 +- ,-0.83147,-0.844854,-0.857729,-0.870087,-0.881921,-0.893224,-0.903989,-0.91421 +- ,-0.92388,-0.932993,-0.941544,-0.949528,-0.95694,-0.963776,-0.970031,-0.975702 +- ,-0.980785,-0.985278,-0.989177,-0.99248,-0.995185,-0.99729,-0.998795,-0.999699 +- ,-1,-0.999699,-0.998795,-0.99729,-0.995185,-0.99248,-0.989177,-0.985278 +- ,-0.980785,-0.975702,-0.970031,-0.963776,-0.95694,-0.949528,-0.941544,-0.932993 +- ,-0.92388,-0.91421,-0.903989,-0.893224,-0.881921,-0.870087,-0.857729,-0.844854 +- ,-0.83147,-0.817585,-0.803208,-0.788346,-0.77301,-0.757209,-0.740951,-0.724247 +- ,-0.707107,-0.689541,-0.671559,-0.653173,-0.634393,-0.615232,-0.595699,-0.575808 +- ,-0.55557,-0.534998,-0.514103,-0.492898,-0.471397,-0.449611,-0.427555,-0.405241 +- ,-0.382683,-0.359895,-0.33689,-0.313682,-0.290285,-0.266713,-0.24298,-0.219101 +- ,-0.19509,-0.170962,-0.14673,-0.122411,-0.0980171,-0.0735646,-0.0490677,-0.0245412 +- ,-1.83697e-16,0.0245412,0.0490677,0.0735646,0.0980171,0.122411,0.14673,0.170962 +- ,0.19509,0.219101,0.24298,0.266713,0.290285,0.313682,0.33689,0.359895 +- ,0.382683,0.405241,0.427555,0.449611,0.471397,0.492898,0.514103,0.534998 +- ,0.55557,0.575808,0.595699,0.615232,0.634393,0.653173,0.671559,0.689541 +- ,0.707107,0.724247,0.740951,0.757209,0.77301,0.788346,0.803208,0.817585 +- ,0.83147,0.844854,0.857729,0.870087,0.881921,0.893224,0.903989,0.91421 +- ,0.92388,0.932993,0.941544,0.949528,0.95694,0.963776,0.970031,0.975702 +- ,0.980785,0.985278,0.989177,0.99248,0.995185,0.99729,0.998795,0.999699 +- +-}; +- +diff -Naur /home/d4rk/goom2k4-0/src/mathtools.h /src/mathtools.h +--- /home/d4rk/goom2k4-0/src/mathtools.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/mathtools.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,36 +0,0 @@ +-#ifndef MATHTOOLS_H +-#define MATHTOOLS_H +- +- +-#define _double2fixmagic (68719476736.0*1.5) +-/* 2^36 * 1.5, (52-_shiftamt=36) uses limited precisicion to floor */ +-#define _shiftamt 16 +-/* 16.16 fixed point representation */ +- +-#if BigEndian_ +-#define iexp_ 0 +-#define iman_ 1 +-#else +-#define iexp_ 1 +-#define iman_ 0 +-#endif /* BigEndian_ */ +- +-/* TODO: this optimization is very efficient: put it again when all works +-#ifdef HAVE_MMX +-#define F2I(dbl,i) {double d = dbl + _double2fixmagic; i = ((int*)&d)[iman_] >> _shiftamt;} +-#else*/ +-#define F2I(dbl,i) i=(int)dbl; +-/*#endif*/ +- +-#if 0 +-#define SINCOS(f,s,c) \ +- __asm__ __volatile__ ("fsincos" : "=t" (c), "=u" (s) : "0" (f)) +-#else +-#define SINCOS(f,s,c) {s=sin(f);c=cos(f);} +-#endif +- +-extern float sin256[256]; +-extern float cos256[256]; +- +-#endif +- +diff -Naur /home/d4rk/goom2k4-0/src/mmx.c /src/mmx.c +--- /home/d4rk/goom2k4-0/src/mmx.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/mmx.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,275 +0,0 @@ +-#ifdef HAVE_MMX +- +-#define BUFFPOINTNB 16 +-#define BUFFPOINTMASK 0xffff +-#define BUFFINCR 0xff +- +-#include "mmx.h" +-#include "goom_graphic.h" +- +-#define sqrtperte 16 +-// faire : a % sqrtperte <=> a & pertemask +-#define PERTEMASK 0xf +-// faire : a / sqrtperte <=> a >> PERTEDEC +-#define PERTEDEC 4 +- +-int mmx_supported (void) { +- return (mm_support()&0x1); +-} +- +-void zoom_filter_mmx (int prevX, int prevY, +- Pixel *expix1, Pixel *expix2, +- int *brutS, int *brutD, int buffratio, +- int precalCoef[16][16]) +-{ +- unsigned int ax = (prevX-1)<<PERTEDEC, ay = (prevY-1)<<PERTEDEC; +- +- int bufsize = prevX * prevY; +- int loop; +- +- __asm__ __volatile__ ("pxor %mm7,%mm7"); +- +- for (loop=0; loop<bufsize; loop++) +- { +- /* int couleur; */ +- int px,py; +- int pos; +- int coeffs; +- +- int myPos = loop << 1, +- myPos2 = myPos + 1; +- int brutSmypos = brutS[myPos]; +- +- px = brutSmypos + (((brutD[myPos] - brutSmypos)*buffratio) >> BUFFPOINTNB); +- brutSmypos = brutS[myPos2]; +- py = brutSmypos + (((brutD[myPos2] - brutSmypos)*buffratio) >> BUFFPOINTNB); +- +- if ((py>=ay) || (px>=ax)) { +- pos=coeffs=0; +- } +- else { +- pos = ((px >> PERTEDEC) + prevX * (py >> PERTEDEC)); +- // coef en modulo 15 +- coeffs = precalCoef [px & PERTEMASK][py & PERTEMASK]; +- } +- +- __asm__ __volatile__ ( +- "movd %2, %%mm6 \n\t" +- +- /* recuperation des deux premiers pixels dans mm0 et mm1 */ +- "movq (%3,%1,4), %%mm0 \n\t" /* b1-v1-r1-a1-b2-v2-r2-a2 */ +- "movq %%mm0, %%mm1 \n\t" /* b1-v1-r1-a1-b2-v2-r2-a2 */ +- +- /* depackage du premier pixel */ +- "punpcklbw %%mm7, %%mm0 \n\t" /* 00-b2-00-v2-00-r2-00-a2 */ +- +- "movq %%mm6, %%mm5 \n\t" /* ??-??-??-??-c4-c3-c2-c1 */ +- /* depackage du 2ieme pixel */ +- "punpckhbw %%mm7, %%mm1 \n\t" /* 00-b1-00-v1-00-r1-00-a1 */ +- +- /* extraction des coefficients... */ +- "punpcklbw %%mm5, %%mm6 \n\t" /* c4-c4-c3-c3-c2-c2-c1-c1 */ +- "movq %%mm6, %%mm4 \n\t" /* c4-c4-c3-c3-c2-c2-c1-c1 */ +- "movq %%mm6, %%mm5 \n\t" /* c4-c4-c3-c3-c2-c2-c1-c1 */ +- +- "punpcklbw %%mm5, %%mm6 \n\t" /* c2-c2-c2-c2-c1-c1-c1-c1 */ +- "punpckhbw %%mm5, %%mm4 \n\t" /* c4-c4-c4-c4-c3-c3-c3-c3 */ +- +- "movq %%mm6, %%mm3 \n\t" /* c2-c2-c2-c2-c1-c1-c1-c1 */ +- +- "punpcklbw %%mm7, %%mm6 \n\t" /* 00-c1-00-c1-00-c1-00-c1 */ +- "punpckhbw %%mm7, %%mm3 \n\t" /* 00-c2-00-c2-00-c2-00-c2 */ +- +- /* multiplication des pixels par les coefficients */ +- "pmullw %%mm6, %%mm0 \n\t" /* c1*b2-c1*v2-c1*r2-c1*a2 */ +- "pmullw %%mm3, %%mm1 \n\t" /* c2*b1-c2*v1-c2*r1-c2*a1 */ +- "paddw %%mm1, %%mm0 \n\t" +- +- /* ...extraction des 2 derniers coefficients */ +- "movq %%mm4, %%mm5 \n\t" /* c4-c4-c4-c4-c3-c3-c3-c3 */ +- "punpcklbw %%mm7, %%mm4 \n\t" /* 00-c3-00-c3-00-c3-00-c3 */ +- "punpckhbw %%mm7, %%mm5 \n\t" /* 00-c4-00-c4-00-c4-00-c4 */ +- +- /* ajouter la longueur de ligne a esi */ +- "addl 8(%%ebp),%1 \n\t" +- +- /* recuperation des 2 derniers pixels */ +- "movq (%3,%1,4), %%mm1 \n\t" +- "movq %%mm1, %%mm2 \n\t" +- +- /* depackage des pixels */ +- "punpcklbw %%mm7, %%mm1 \n\t" +- "punpckhbw %%mm7, %%mm2 \n\t" +- +- /* multiplication pas les coeffs */ +- "pmullw %%mm4, %%mm1 \n\t" +- "pmullw %%mm5, %%mm2 \n\t" +- +- /* ajout des valeurs obtenues à la valeur finale */ +- "paddw %%mm1, %%mm0 \n\t" +- "paddw %%mm2, %%mm0 \n\t" +- +- /* division par 256 = 16+16+16+16, puis repackage du pixel final */ +- "psrlw $8, %%mm0 \n\t" +- "packuswb %%mm7, %%mm0 \n\t" +- +- "movd %%mm0,%0 \n\t" +- :"=g"(expix2[loop]) +- :"r"(pos),"r"(coeffs),"r"(expix1) +- +- ); +- +- emms(); +- } +-} +- +-#define DRAWMETHOD_PLUS_MMX(_out,_backbuf,_col) \ +-{ \ +- movd_m2r(_backbuf, mm0); \ +- paddusb_m2r(_col, mm0); \ +- movd_r2m(mm0, _out); \ +-} +- +-#define DRAWMETHOD DRAWMETHOD_PLUS_MMX(*p,*p,col) +- +-void draw_line_mmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny) +-{ +- int x, y, dx, dy, yy, xx; +- Pixel *p; +- +- if ((y1 < 0) || (y2 < 0) || (x1 < 0) || (x2 < 0) || (y1 >= screeny) || (y2 >= screeny) || (x1 >= screenx) || (x2 >= screenx)) +- goto end_of_line; +- +- dx = x2 - x1; +- dy = y2 - y1; +- if (x1 >= x2) { +- int tmp; +- +- tmp = x1; +- x1 = x2; +- x2 = tmp; +- tmp = y1; +- y1 = y2; +- y2 = tmp; +- dx = x2 - x1; +- dy = y2 - y1; +- } +- +- /* vertical line */ +- if (dx == 0) { +- if (y1 < y2) { +- p = &(data[(screenx * y1) + x1]); +- for (y = y1; y <= y2; y++) { +- DRAWMETHOD; +- p += screenx; +- } +- } +- else { +- p = &(data[(screenx * y2) + x1]); +- for (y = y2; y <= y1; y++) { +- DRAWMETHOD; +- p += screenx; +- } +- } +- goto end_of_line; +- } +- /* horizontal line */ +- if (dy == 0) { +- if (x1 < x2) { +- p = &(data[(screenx * y1) + x1]); +- for (x = x1; x <= x2; x++) { +- DRAWMETHOD; +- p++; +- } +- goto end_of_line; +- } +- else { +- p = &(data[(screenx * y1) + x2]); +- for (x = x2; x <= x1; x++) { +- DRAWMETHOD; +- p++; +- } +- goto end_of_line; +- } +- } +- /* 1 */ +- /* \ */ +- /* \ */ +- /* 2 */ +- if (y2 > y1) { +- /* steep */ +- if (dy > dx) { +- dx = ((dx << 16) / dy); +- x = x1 << 16; +- for (y = y1; y <= y2; y++) { +- xx = x >> 16; +- p = &(data[(screenx * y) + xx]); +- DRAWMETHOD; +- if (xx < (screenx - 1)) { +- p++; +- /* DRAWMETHOD; */ +- } +- x += dx; +- } +- goto end_of_line; +- } +- /* shallow */ +- else { +- dy = ((dy << 16) / dx); +- y = y1 << 16; +- for (x = x1; x <= x2; x++) { +- yy = y >> 16; +- p = &(data[(screenx * yy) + x]); +- DRAWMETHOD; +- if (yy < (screeny - 1)) { +- p += screeny; +- /* DRAWMETHOD; */ +- } +- y += dy; +- } +- } +- } +- /* 2 */ +- /* / */ +- /* / */ +- /* 1 */ +- else { +- /* steep */ +- if (-dy > dx) { +- dx = ((dx << 16) / -dy); +- x = (x1 + 1) << 16; +- for (y = y1; y >= y2; y--) { +- xx = x >> 16; +- p = &(data[(screenx * y) + xx]); +- DRAWMETHOD; +- if (xx < (screenx - 1)) { +- p--; +- /* DRAWMETHOD; */ +- } +- x += dx; +- } +- goto end_of_line; +- } +- /* shallow */ +- else { +- dy = ((dy << 16) / dx); +- y = y1 << 16; +- for (x = x1; x <= x2; x++) { +- yy = y >> 16; +- p = &(data[(screenx * yy) + x]); +- DRAWMETHOD; +- if (yy < (screeny - 1)) { +- p += screeny; +- /* DRAWMETHOD; */ +- } +- y += dy; +- } +- goto end_of_line; +- } +- } +-end_of_line: +- emms(); +- /* __asm__ __volatile__ ("emms"); */ +-} +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/mmx.h /src/mmx.h +--- /home/d4rk/goom2k4-0/src/mmx.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/mmx.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,729 +0,0 @@ +-/* mmx.h +- +- MultiMedia eXtensions GCC interface library for IA32. +- +- To use this library, simply include this header file +- and compile with GCC. You MUST have inlining enabled +- in order for mmx_ok() to work; this can be done by +- simply using -O on the GCC command line. +- +- Compiling with -DMMX_TRACE will cause detailed trace +- output to be sent to stderr for each mmx operation. +- This adds lots of code, and obviously slows execution to +- a crawl, but can be very useful for debugging. +- +- THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY +- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT +- LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY +- AND FITNESS FOR ANY PARTICULAR PURPOSE. +- +- 1997-99 by H. Dietz and R. Fisher +- +- Notes: +- It appears that the latest gas has the pand problem fixed, therefore +- I'll undefine BROKEN_PAND by default. +-*/ +- +-#ifndef _MMX_H +-#define _MMX_H +- +-#include "goom_graphic.h" +- +-/* Warning: at this writing, the version of GAS packaged +- with most Linux distributions does not handle the +- parallel AND operation mnemonic correctly. If the +- symbol BROKEN_PAND is defined, a slower alternative +- coding will be used. If execution of mmxtest results +- in an illegal instruction fault, define this symbol. +-*/ +-#undef BROKEN_PAND +- +- +-/* The type of an value that fits in an MMX register +- (note that long long constant values MUST be suffixed +- by LL and unsigned long long values by ULL, lest +- they be truncated by the compiler) +-*/ +-typedef union { +- long long q; /* Quadword (64-bit) value */ +- unsigned long long uq; /* Unsigned Quadword */ +- int d[2]; /* 2 Doubleword (32-bit) values */ +- unsigned int ud[2]; /* 2 Unsigned Doubleword */ +- short w[4]; /* 4 Word (16-bit) values */ +- unsigned short uw[4]; /* 4 Unsigned Word */ +- char b[8]; /* 8 Byte (8-bit) values */ +- unsigned char ub[8]; /* 8 Unsigned Byte */ +- float s[2]; /* Single-precision (32-bit) value */ +-} __attribute__ ((aligned (8))) mmx_t; /* On an 8-byte (64-bit) boundary */ +- +- +- +-/* Function to test if multimedia instructions are supported... +-*/ +-static int +-mm_support(void) +-{ +- /* Returns 1 if MMX instructions are supported, +- 3 if Cyrix MMX and Extended MMX instructions are supported +- 5 if AMD MMX and 3DNow! instructions are supported +- 13 if AMD Extended MMX, &3dNow supported +- 0 if hardware does not support any of these +- */ +- register int rval = 0; +- +- __asm__ __volatile__ ( +- /* See if CPUID instruction is supported ... */ +- /* ... Get copies of EFLAGS into eax and ecx */ +- "pushl %%ebx\n\t" +- "pushf\n\t" +- "popl %%eax\n\t" +- "movl %%eax, %%ecx\n\t" +- +- /* ... Toggle the ID bit in one copy and store */ +- /* to the EFLAGS reg */ +- "xorl $0x200000, %%eax\n\t" +- "push %%eax\n\t" +- "popf\n\t" +- +- /* ... Get the (hopefully modified) EFLAGS */ +- "pushf\n\t" +- "popl %%eax\n\t" +- +- /* ... Compare and test result */ +- "xorl %%eax, %%ecx\n\t" +- "testl $0x200000, %%ecx\n\t" +- "jz NotSupported1\n\t" /* CPUID not supported */ +- +- +- /* Get standard CPUID information, and +- go to a specific vendor section */ +- "movl $0, %%eax\n\t" +- "cpuid\n\t" +- +- /* Check for Intel */ +- "cmpl $0x756e6547, %%ebx\n\t" +- "jne TryAMD\n\t" +- "cmpl $0x49656e69, %%edx\n\t" +- "jne TryAMD\n\t" +- "cmpl $0x6c65746e, %%ecx\n" +- "jne TryAMD\n\t" +- "jmp Intel\n\t" +- +- /* Check for AMD */ +- "\nTryAMD:\n\t" +- "cmpl $0x68747541, %%ebx\n\t" +- "jne TryCyrix\n\t" +- "cmpl $0x69746e65, %%edx\n\t" +- "jne TryCyrix\n\t" +- "cmpl $0x444d4163, %%ecx\n" +- "jne TryCyrix\n\t" +- "jmp AMD\n\t" +- +- /* Check for Cyrix */ +- "\nTryCyrix:\n\t" +- "cmpl $0x69727943, %%ebx\n\t" +- "jne NotSupported2\n\t" +- "cmpl $0x736e4978, %%edx\n\t" +- "jne NotSupported3\n\t" +- "cmpl $0x64616574, %%ecx\n\t" +- "jne NotSupported4\n\t" +- /* Drop through to Cyrix... */ +- +- +- /* Cyrix Section */ +- /* See if extended CPUID level 80000001 is supported */ +- /* The value of CPUID/80000001 for the 6x86MX is undefined +- according to the Cyrix CPU Detection Guide (Preliminary +- Rev. 1.01 table 1), so we'll check the value of eax for +- CPUID/0 to see if standard CPUID level 2 is supported. +- According to the table, the only CPU which supports level +- 2 is also the only one which supports extended CPUID levels. +- */ +- "cmpl $0x2, %%eax\n\t" +- "jne MMXtest\n\t" /* Use standard CPUID instead */ +- +- /* Extended CPUID supported (in theory), so get extended +- features */ +- "movl $0x80000001, %%eax\n\t" +- "cpuid\n\t" +- "testl $0x00800000, %%eax\n\t" /* Test for MMX */ +- "jz NotSupported5\n\t" /* MMX not supported */ +- "testl $0x01000000, %%eax\n\t" /* Test for Ext'd MMX */ +- "jnz EMMXSupported\n\t" +- "movl $1, %0\n\n\t" /* MMX Supported */ +- "jmp Return\n\n" +- "EMMXSupported:\n\t" +- "movl $3, %0\n\n\t" /* EMMX and MMX Supported */ +- "jmp Return\n\t" +- +- +- /* AMD Section */ +- "AMD:\n\t" +- +- /* See if extended CPUID is supported */ +- "movl $0x80000000, %%eax\n\t" +- "cpuid\n\t" +- "cmpl $0x80000000, %%eax\n\t" +- "jl MMXtest\n\t" /* Use standard CPUID instead */ +- +- /* Extended CPUID supported, so get extended features */ +- "movl $0x80000001, %%eax\n\t" +- "cpuid\n\t" +- "testl $0x00800000, %%edx\n\t" /* Test for MMX */ +- "jz NotSupported6\n\t" /* MMX not supported */ +- "testl $0x80000000, %%edx\n\t" /* Test for 3DNow! */ +- "jnz ThreeDNowSupported\n\t" +- "movl $1, %0\n\n\t" /* MMX Supported */ +- "jmp Return\n\n" +- "ThreeDNowSupported:\n\t" +- "testl $0x40000000, %%edx\n\t" /* Test AMD Extended MMX */ +- "jnz AMDXMMXSupported\n\t" +- "movl $5, %0\n\n\t" /* 3DNow! and MMX Supported */ +- "jmp Return\n\t" +- "AMDXMMXSupported:\n\t" +- "movl $13, %0\n\n\t" /* XMMX, 3DNow! and MMX Supported */ +- "jmp Return\n\t" +- +- +- /* Intel Section */ +- "Intel:\n\t" +- +- /* Check for MMX */ +- "MMXtest:\n\t" +- "movl $1, %%eax\n\t" +- "cpuid\n\t" +- "testl $0x00800000, %%edx\n\t" /* Test for MMX */ +- "jz NotSupported7\n\t" /* MMX Not supported */ +- "movl $1, %0\n\n\t" /* MMX Supported */ +- "jmp Return\n\t" +- +- /* Nothing supported */ +- "\nNotSupported1:\n\t" +- "#movl $101, %0\n\n\t" +- "\nNotSupported2:\n\t" +- "#movl $102, %0\n\n\t" +- "\nNotSupported3:\n\t" +- "#movl $103, %0\n\n\t" +- "\nNotSupported4:\n\t" +- "#movl $104, %0\n\n\t" +- "\nNotSupported5:\n\t" +- "#movl $105, %0\n\n\t" +- "\nNotSupported6:\n\t" +- "#movl $106, %0\n\n\t" +- "\nNotSupported7:\n\t" +- "#movl $107, %0\n\n\t" +- "movl $0, %0\n\n\t" +- +- "Return:\n\t" +- "popl %%ebx\n\t" +- : "=X" (rval) +- : /* no input */ +- : "eax", "ecx", "edx" +- ); +- +- /* Return */ +- return(rval); +-} +- +-/* Function to test if mmx instructions are supported... +-*/ +-static inline int +-mmx_ok(void) +-{ +- /* Returns 1 if MMX instructions are supported, 0 otherwise */ +- return ( mm_support() & 0x1 ); +-} +- +-int mmx_supported (void); +-int xmmx_supported (void); +- +- +-/* MMX optimized implementations */ +-void draw_line_mmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny); +-void draw_line_xmmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny); +-void zoom_filter_mmx (int prevX, int prevY, Pixel *expix1, Pixel *expix2, +- int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); +-void zoom_filter_xmmx (int prevX, int prevY, Pixel *expix1, Pixel *expix2, +- int *lbruS, int *lbruD, int buffratio, int precalCoef[16][16]); +- +- +-/* Helper functions for the instruction macros that follow... +- (note that memory-to-register, m2r, instructions are nearly +- as efficient as register-to-register, r2r, instructions; +- however, memory-to-memory instructions are really simulated +- as a convenience, and are only 1/3 as efficient) +-*/ +-#ifdef MMX_TRACE +- +-/* Include the stuff for printing a trace to stderr... +-*/ +- +-#include <stdio.h> +- +-#define mmx_i2r(op, imm, reg) \ +- { \ +- mmx_t mmx_trace; \ +- mmx_trace.uq = (imm); \ +- printf(#op "_i2r(" #imm "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#reg "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ (#op " %0, %%" #reg \ +- : /* nothing */ \ +- : "X" (imm)); \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#reg "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#define mmx_m2r(op, mem, reg) \ +- { \ +- mmx_t mmx_trace; \ +- mmx_trace = (mem); \ +- printf(#op "_m2r(" #mem "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#reg "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ (#op " %0, %%" #reg \ +- : /* nothing */ \ +- : "m" (mem)); \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#reg "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#define mmx_r2m(op, reg, mem) \ +- { \ +- mmx_t mmx_trace; \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#op "_r2m(" #reg "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- mmx_trace = (mem); \ +- printf(#mem "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ (#op " %%" #reg ", %0" \ +- : "=m" (mem) \ +- : /* nothing */ ); \ +- mmx_trace = (mem); \ +- printf(#mem "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#define mmx_r2r(op, regs, regd) \ +- { \ +- mmx_t mmx_trace; \ +- __asm__ __volatile__ ("movq %%" #regs ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#op "_r2r(" #regs "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ ("movq %%" #regd ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#regd "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ (#op " %" #regs ", %" #regd); \ +- __asm__ __volatile__ ("movq %%" #regd ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#regd "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#define mmx_m2m(op, mems, memd) \ +- { \ +- mmx_t mmx_trace; \ +- mmx_trace = (mems); \ +- printf(#op "_m2m(" #mems "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- mmx_trace = (memd); \ +- printf(#memd "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ +- #op " %1, %%mm0\n\t" \ +- "movq %%mm0, %0" \ +- : "=m" (memd) \ +- : "m" (mems)); \ +- mmx_trace = (memd); \ +- printf(#memd "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#else +- +-/* These macros are a lot simpler without the tracing... +-*/ +- +-#define mmx_i2r(op, imm, reg) \ +- __asm__ __volatile__ (#op " %0, %%" #reg \ +- : /* nothing */ \ +- : "X" (imm) ) +- +-#define mmx_m2r(op, mem, reg) \ +- __asm__ __volatile__ (#op " %0, %%" #reg \ +- : /* nothing */ \ +- : "m" (mem)) +- +-#define mmx_r2m(op, reg, mem) \ +- __asm__ __volatile__ (#op " %%" #reg ", %0" \ +- : "=m" (mem) \ +- : /* nothing */ ) +- +-#define mmx_r2r(op, regs, regd) \ +- __asm__ __volatile__ (#op " %" #regs ", %" #regd) +- +-#define mmx_m2m(op, mems, memd) \ +- __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ +- #op " %1, %%mm0\n\t" \ +- "movq %%mm0, %0" \ +- : "=m" (memd) \ +- : "m" (mems)) +- +-#endif +- +- +-/* 1x64 MOVe Quadword +- (this is both a load and a store... +- in fact, it is the only way to store) +-*/ +-#define movq_m2r(var, reg) mmx_m2r(movq, var, reg) +-#define movq_r2m(reg, var) mmx_r2m(movq, reg, var) +-#define movq_r2r(regs, regd) mmx_r2r(movq, regs, regd) +-#define movq(vars, vard) \ +- __asm__ __volatile__ ("movq %1, %%mm0\n\t" \ +- "movq %%mm0, %0" \ +- : "=X" (vard) \ +- : "X" (vars)) +- +- +-/* 1x32 MOVe Doubleword +- (like movq, this is both load and store... +- but is most useful for moving things between +- mmx registers and ordinary registers) +-*/ +-#define movd_m2r(var, reg) mmx_m2r(movd, var, reg) +-#define movd_r2m(reg, var) mmx_r2m(movd, reg, var) +-#define movd_r2r(regs, regd) mmx_r2r(movd, regs, regd) +-#define movd(vars, vard) \ +- __asm__ __volatile__ ("movd %1, %%mm0\n\t" \ +- "movd %%mm0, %0" \ +- : "=X" (vard) \ +- : "X" (vars)) +- +- +-/* 2x32, 4x16, and 8x8 Parallel ADDs +-*/ +-#define paddd_m2r(var, reg) mmx_m2r(paddd, var, reg) +-#define paddd_r2r(regs, regd) mmx_r2r(paddd, regs, regd) +-#define paddd(vars, vard) mmx_m2m(paddd, vars, vard) +- +-#define paddw_m2r(var, reg) mmx_m2r(paddw, var, reg) +-#define paddw_r2r(regs, regd) mmx_r2r(paddw, regs, regd) +-#define paddw(vars, vard) mmx_m2m(paddw, vars, vard) +- +-#define paddb_m2r(var, reg) mmx_m2r(paddb, var, reg) +-#define paddb_r2r(regs, regd) mmx_r2r(paddb, regs, regd) +-#define paddb(vars, vard) mmx_m2m(paddb, vars, vard) +- +- +-/* 4x16 and 8x8 Parallel ADDs using Saturation arithmetic +-*/ +-#define paddsw_m2r(var, reg) mmx_m2r(paddsw, var, reg) +-#define paddsw_r2r(regs, regd) mmx_r2r(paddsw, regs, regd) +-#define paddsw(vars, vard) mmx_m2m(paddsw, vars, vard) +- +-#define paddsb_m2r(var, reg) mmx_m2r(paddsb, var, reg) +-#define paddsb_r2r(regs, regd) mmx_r2r(paddsb, regs, regd) +-#define paddsb(vars, vard) mmx_m2m(paddsb, vars, vard) +- +- +-/* 4x16 and 8x8 Parallel ADDs using Unsigned Saturation arithmetic +-*/ +-#define paddusw_m2r(var, reg) mmx_m2r(paddusw, var, reg) +-#define paddusw_r2r(regs, regd) mmx_r2r(paddusw, regs, regd) +-#define paddusw(vars, vard) mmx_m2m(paddusw, vars, vard) +- +-#define paddusb_m2r(var, reg) mmx_m2r(paddusb, var, reg) +-#define paddusb_r2r(regs, regd) mmx_r2r(paddusb, regs, regd) +-#define paddusb(vars, vard) mmx_m2m(paddusb, vars, vard) +- +- +-/* 2x32, 4x16, and 8x8 Parallel SUBs +-*/ +-#define psubd_m2r(var, reg) mmx_m2r(psubd, var, reg) +-#define psubd_r2r(regs, regd) mmx_r2r(psubd, regs, regd) +-#define psubd(vars, vard) mmx_m2m(psubd, vars, vard) +- +-#define psubw_m2r(var, reg) mmx_m2r(psubw, var, reg) +-#define psubw_r2r(regs, regd) mmx_r2r(psubw, regs, regd) +-#define psubw(vars, vard) mmx_m2m(psubw, vars, vard) +- +-#define psubb_m2r(var, reg) mmx_m2r(psubb, var, reg) +-#define psubb_r2r(regs, regd) mmx_r2r(psubb, regs, regd) +-#define psubb(vars, vard) mmx_m2m(psubb, vars, vard) +- +- +-/* 4x16 and 8x8 Parallel SUBs using Saturation arithmetic +-*/ +-#define psubsw_m2r(var, reg) mmx_m2r(psubsw, var, reg) +-#define psubsw_r2r(regs, regd) mmx_r2r(psubsw, regs, regd) +-#define psubsw(vars, vard) mmx_m2m(psubsw, vars, vard) +- +-#define psubsb_m2r(var, reg) mmx_m2r(psubsb, var, reg) +-#define psubsb_r2r(regs, regd) mmx_r2r(psubsb, regs, regd) +-#define psubsb(vars, vard) mmx_m2m(psubsb, vars, vard) +- +- +-/* 4x16 and 8x8 Parallel SUBs using Unsigned Saturation arithmetic +-*/ +-#define psubusw_m2r(var, reg) mmx_m2r(psubusw, var, reg) +-#define psubusw_r2r(regs, regd) mmx_r2r(psubusw, regs, regd) +-#define psubusw(vars, vard) mmx_m2m(psubusw, vars, vard) +- +-#define psubusb_m2r(var, reg) mmx_m2r(psubusb, var, reg) +-#define psubusb_r2r(regs, regd) mmx_r2r(psubusb, regs, regd) +-#define psubusb(vars, vard) mmx_m2m(psubusb, vars, vard) +- +- +-/* 4x16 Parallel MULs giving Low 4x16 portions of results +-*/ +-#define pmullw_m2r(var, reg) mmx_m2r(pmullw, var, reg) +-#define pmullw_r2r(regs, regd) mmx_r2r(pmullw, regs, regd) +-#define pmullw(vars, vard) mmx_m2m(pmullw, vars, vard) +- +- +-/* 4x16 Parallel MULs giving High 4x16 portions of results +-*/ +-#define pmulhw_m2r(var, reg) mmx_m2r(pmulhw, var, reg) +-#define pmulhw_r2r(regs, regd) mmx_r2r(pmulhw, regs, regd) +-#define pmulhw(vars, vard) mmx_m2m(pmulhw, vars, vard) +- +- +-/* 4x16->2x32 Parallel Mul-ADD +- (muls like pmullw, then adds adjacent 16-bit fields +- in the multiply result to make the final 2x32 result) +-*/ +-#define pmaddwd_m2r(var, reg) mmx_m2r(pmaddwd, var, reg) +-#define pmaddwd_r2r(regs, regd) mmx_r2r(pmaddwd, regs, regd) +-#define pmaddwd(vars, vard) mmx_m2m(pmaddwd, vars, vard) +- +- +-/* 1x64 bitwise AND +-*/ +-#ifdef BROKEN_PAND +-#define pand_m2r(var, reg) \ +- { \ +- mmx_m2r(pandn, (mmx_t) -1LL, reg); \ +- mmx_m2r(pandn, var, reg); \ +- } +-#define pand_r2r(regs, regd) \ +- { \ +- mmx_m2r(pandn, (mmx_t) -1LL, regd); \ +- mmx_r2r(pandn, regs, regd) \ +- } +-#define pand(vars, vard) \ +- { \ +- movq_m2r(vard, mm0); \ +- mmx_m2r(pandn, (mmx_t) -1LL, mm0); \ +- mmx_m2r(pandn, vars, mm0); \ +- movq_r2m(mm0, vard); \ +- } +-#else +-#define pand_m2r(var, reg) mmx_m2r(pand, var, reg) +-#define pand_r2r(regs, regd) mmx_r2r(pand, regs, regd) +-#define pand(vars, vard) mmx_m2m(pand, vars, vard) +-#endif +- +- +-/* 1x64 bitwise AND with Not the destination +-*/ +-#define pandn_m2r(var, reg) mmx_m2r(pandn, var, reg) +-#define pandn_r2r(regs, regd) mmx_r2r(pandn, regs, regd) +-#define pandn(vars, vard) mmx_m2m(pandn, vars, vard) +- +- +-/* 1x64 bitwise OR +-*/ +-#define por_m2r(var, reg) mmx_m2r(por, var, reg) +-#define por_r2r(regs, regd) mmx_r2r(por, regs, regd) +-#define por(vars, vard) mmx_m2m(por, vars, vard) +- +- +-/* 1x64 bitwise eXclusive OR +-*/ +-#define pxor_m2r(var, reg) mmx_m2r(pxor, var, reg) +-#define pxor_r2r(regs, regd) mmx_r2r(pxor, regs, regd) +-#define pxor(vars, vard) mmx_m2m(pxor, vars, vard) +- +- +-/* 2x32, 4x16, and 8x8 Parallel CoMPare for EQuality +- (resulting fields are either 0 or -1) +-*/ +-#define pcmpeqd_m2r(var, reg) mmx_m2r(pcmpeqd, var, reg) +-#define pcmpeqd_r2r(regs, regd) mmx_r2r(pcmpeqd, regs, regd) +-#define pcmpeqd(vars, vard) mmx_m2m(pcmpeqd, vars, vard) +- +-#define pcmpeqw_m2r(var, reg) mmx_m2r(pcmpeqw, var, reg) +-#define pcmpeqw_r2r(regs, regd) mmx_r2r(pcmpeqw, regs, regd) +-#define pcmpeqw(vars, vard) mmx_m2m(pcmpeqw, vars, vard) +- +-#define pcmpeqb_m2r(var, reg) mmx_m2r(pcmpeqb, var, reg) +-#define pcmpeqb_r2r(regs, regd) mmx_r2r(pcmpeqb, regs, regd) +-#define pcmpeqb(vars, vard) mmx_m2m(pcmpeqb, vars, vard) +- +- +-/* 2x32, 4x16, and 8x8 Parallel CoMPare for Greater Than +- (resulting fields are either 0 or -1) +-*/ +-#define pcmpgtd_m2r(var, reg) mmx_m2r(pcmpgtd, var, reg) +-#define pcmpgtd_r2r(regs, regd) mmx_r2r(pcmpgtd, regs, regd) +-#define pcmpgtd(vars, vard) mmx_m2m(pcmpgtd, vars, vard) +- +-#define pcmpgtw_m2r(var, reg) mmx_m2r(pcmpgtw, var, reg) +-#define pcmpgtw_r2r(regs, regd) mmx_r2r(pcmpgtw, regs, regd) +-#define pcmpgtw(vars, vard) mmx_m2m(pcmpgtw, vars, vard) +- +-#define pcmpgtb_m2r(var, reg) mmx_m2r(pcmpgtb, var, reg) +-#define pcmpgtb_r2r(regs, regd) mmx_r2r(pcmpgtb, regs, regd) +-#define pcmpgtb(vars, vard) mmx_m2m(pcmpgtb, vars, vard) +- +- +-/* 1x64, 2x32, and 4x16 Parallel Shift Left Logical +-*/ +-#define psllq_i2r(imm, reg) mmx_i2r(psllq, imm, reg) +-#define psllq_m2r(var, reg) mmx_m2r(psllq, var, reg) +-#define psllq_r2r(regs, regd) mmx_r2r(psllq, regs, regd) +-#define psllq(vars, vard) mmx_m2m(psllq, vars, vard) +- +-#define pslld_i2r(imm, reg) mmx_i2r(pslld, imm, reg) +-#define pslld_m2r(var, reg) mmx_m2r(pslld, var, reg) +-#define pslld_r2r(regs, regd) mmx_r2r(pslld, regs, regd) +-#define pslld(vars, vard) mmx_m2m(pslld, vars, vard) +- +-#define psllw_i2r(imm, reg) mmx_i2r(psllw, imm, reg) +-#define psllw_m2r(var, reg) mmx_m2r(psllw, var, reg) +-#define psllw_r2r(regs, regd) mmx_r2r(psllw, regs, regd) +-#define psllw(vars, vard) mmx_m2m(psllw, vars, vard) +- +- +-/* 1x64, 2x32, and 4x16 Parallel Shift Right Logical +-*/ +-#define psrlq_i2r(imm, reg) mmx_i2r(psrlq, imm, reg) +-#define psrlq_m2r(var, reg) mmx_m2r(psrlq, var, reg) +-#define psrlq_r2r(regs, regd) mmx_r2r(psrlq, regs, regd) +-#define psrlq(vars, vard) mmx_m2m(psrlq, vars, vard) +- +-#define psrld_i2r(imm, reg) mmx_i2r(psrld, imm, reg) +-#define psrld_m2r(var, reg) mmx_m2r(psrld, var, reg) +-#define psrld_r2r(regs, regd) mmx_r2r(psrld, regs, regd) +-#define psrld(vars, vard) mmx_m2m(psrld, vars, vard) +- +-#define psrlw_i2r(imm, reg) mmx_i2r(psrlw, imm, reg) +-#define psrlw_m2r(var, reg) mmx_m2r(psrlw, var, reg) +-#define psrlw_r2r(regs, regd) mmx_r2r(psrlw, regs, regd) +-#define psrlw(vars, vard) mmx_m2m(psrlw, vars, vard) +- +- +-/* 2x32 and 4x16 Parallel Shift Right Arithmetic +-*/ +-#define psrad_i2r(imm, reg) mmx_i2r(psrad, imm, reg) +-#define psrad_m2r(var, reg) mmx_m2r(psrad, var, reg) +-#define psrad_r2r(regs, regd) mmx_r2r(psrad, regs, regd) +-#define psrad(vars, vard) mmx_m2m(psrad, vars, vard) +- +-#define psraw_i2r(imm, reg) mmx_i2r(psraw, imm, reg) +-#define psraw_m2r(var, reg) mmx_m2r(psraw, var, reg) +-#define psraw_r2r(regs, regd) mmx_r2r(psraw, regs, regd) +-#define psraw(vars, vard) mmx_m2m(psraw, vars, vard) +- +- +-/* 2x32->4x16 and 4x16->8x8 PACK and Signed Saturate +- (packs source and dest fields into dest in that order) +-*/ +-#define packssdw_m2r(var, reg) mmx_m2r(packssdw, var, reg) +-#define packssdw_r2r(regs, regd) mmx_r2r(packssdw, regs, regd) +-#define packssdw(vars, vard) mmx_m2m(packssdw, vars, vard) +- +-#define packsswb_m2r(var, reg) mmx_m2r(packsswb, var, reg) +-#define packsswb_r2r(regs, regd) mmx_r2r(packsswb, regs, regd) +-#define packsswb(vars, vard) mmx_m2m(packsswb, vars, vard) +- +- +-/* 4x16->8x8 PACK and Unsigned Saturate +- (packs source and dest fields into dest in that order) +-*/ +-#define packuswb_m2r(var, reg) mmx_m2r(packuswb, var, reg) +-#define packuswb_r2r(regs, regd) mmx_r2r(packuswb, regs, regd) +-#define packuswb(vars, vard) mmx_m2m(packuswb, vars, vard) +- +- +-/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK Low +- (interleaves low half of dest with low half of source +- as padding in each result field) +-*/ +-#define punpckldq_m2r(var, reg) mmx_m2r(punpckldq, var, reg) +-#define punpckldq_r2r(regs, regd) mmx_r2r(punpckldq, regs, regd) +-#define punpckldq(vars, vard) mmx_m2m(punpckldq, vars, vard) +- +-#define punpcklwd_m2r(var, reg) mmx_m2r(punpcklwd, var, reg) +-#define punpcklwd_r2r(regs, regd) mmx_r2r(punpcklwd, regs, regd) +-#define punpcklwd(vars, vard) mmx_m2m(punpcklwd, vars, vard) +- +-#define punpcklbw_m2r(var, reg) mmx_m2r(punpcklbw, var, reg) +-#define punpcklbw_r2r(regs, regd) mmx_r2r(punpcklbw, regs, regd) +-#define punpcklbw(vars, vard) mmx_m2m(punpcklbw, vars, vard) +- +- +-/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK High +- (interleaves high half of dest with high half of source +- as padding in each result field) +-*/ +-#define punpckhdq_m2r(var, reg) mmx_m2r(punpckhdq, var, reg) +-#define punpckhdq_r2r(regs, regd) mmx_r2r(punpckhdq, regs, regd) +-#define punpckhdq(vars, vard) mmx_m2m(punpckhdq, vars, vard) +- +-#define punpckhwd_m2r(var, reg) mmx_m2r(punpckhwd, var, reg) +-#define punpckhwd_r2r(regs, regd) mmx_r2r(punpckhwd, regs, regd) +-#define punpckhwd(vars, vard) mmx_m2m(punpckhwd, vars, vard) +- +-#define punpckhbw_m2r(var, reg) mmx_m2r(punpckhbw, var, reg) +-#define punpckhbw_r2r(regs, regd) mmx_r2r(punpckhbw, regs, regd) +-#define punpckhbw(vars, vard) mmx_m2m(punpckhbw, vars, vard) +- +- +-/* Empty MMx State +- (used to clean-up when going from mmx to float use +- of the registers that are shared by both; note that +- there is no float-to-mmx operation needed, because +- only the float tag word info is corruptible) +-*/ +-#ifdef MMX_TRACE +- +-#define emms() \ +- { \ +- printf("emms()\n"); \ +- __asm__ __volatile__ ("emms" \ +- "st(1)","st(2)","st(3)","st(4)","st(5)","st(6)","st(7)"); \ +- } +- +-#else +- +-#define emms() __asm__ __volatile__ ("emms"::: \ +- "st(1)","st(2)","st(3)","st(4)","st(5)","st(6)","st(7)") +- +-#endif +- +-#endif +- +diff -Naur /home/d4rk/goom2k4-0/src/motif_goom1.h /src/motif_goom1.h +--- /home/d4rk/goom2k4-0/src/motif_goom1.h 2005-02-07 06:46:42.000000000 -0700 ++++ /src/motif_goom1.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,1026 +0,0 @@ +-static Motif CONV_MOTIF1 = { +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,14,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,13,9,9,7,2,2,9,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,11, +- 11,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,12,7,4,0,0,0,2,0,0,3,14,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,12,10,9,9,4,1,0, +- 1,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,10,3,0,0,0,1,1,3,5,0,0,1,14,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,14,6,3,1,1,4,9,1, +- 1,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 10,3,0,0,2,7,13,14,14,14,7,0,0,2,14,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,12,1,9,15,15,15,15,3, +- 0,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,4, +- 0,0,2,10,15,15,15,15,15,15,1,0,0,10,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,9,0,2,14,15,15,15,7, +- 0,9,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,14,6,0,0, +- 2,9,15,15,15,15,15,15,15,13,0,0,3,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,11,0,0,10,15,15,15,9, +- 0,9,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,13,3,0,1,5, +- 5,4,4,4,6,12,15,15,15,13,0,0,7,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,14,0,0,5,15,15,15,10, +- 0,7,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,11,1,0,3,3,1, +- 0,0,0,0,0,0,5,13,15,12,0,0,13,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,13,14,15, +- 15,15,15,15,15,15,15,15,14,0,0,1,15,15,15,12, +- 0,3,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,10,1,2,4,0,0,1, +- 9,12,12,12,9,3,0,2,14,5,0,7,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,14,7,4,4,1,1,12, +- 15,15,15,15,15,15,15,15,14,1,0,0,12,15,15,15, +- 1,0,12,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,10,0,3,2,0,0,3,12, +- 15,15,15,15,15,14,2,1,13,2,0,12,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,14,3,0,0,0,0,0,2, +- 13,15,15,15,15,15,15,15,14,1,0,0,8,15,15,15, +- 1,0,9,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,12,2,1,0,0,0,9,14,15, +- 15,15,15,15,15,14,1,1,11,0,3,14,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,7,4,11,12,10,1,0, +- 3,12,15,15,15,15,15,15,13,1,1,0,4,15,15,15, +- 2,0,10,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,14,2,1,0,0,3,12,15,15,15, +- 15,15,15,15,15,11,0,5,9,1,12,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,5,1,13,15,15,12,1, +- 0,1,9,15,15,15,15,15,14,2,5,0,1,14,15,15, +- 2,0,7,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,14,3,0,0,0,7,14,15,15,15,15, +- 15,15,15,15,15,9,0,8,7,4,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,7,0,7,8,11,15,13, +- 2,0,0,3,10,15,15,15,15,5,11,0,0,11,15,15, +- 6,0,2,14,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,6,0,0,0,8,15,15,15,15,15,15, +- 15,15,15,15,15,6,0,4,0,6,15,15,15,15,15,15, +- 14,9,14,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,11,0,3,3,0,8,15, +- 14,5,0,0,0,4,12,15,15,5,13,2,0,6,15,15, +- 12,0,0,11,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,10,0,0,0,8,15,15,15,15,15,15,15, +- 15,15,15,15,10,1,7,6,4,13,15,15,15,15,13,11, +- 6,0,8,11,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,1,1,11,2,0,5, +- 14,15,8,0,0,0,0,7,15,5,14,6,0,2,15,15, +- 15,3,0,5,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,13,1,0,0,7,15,15,15,15,15,15,15,15, +- 15,15,15,15,7,9,15,15,15,15,15,15,12,6,2,1, +- 1,1,8,6,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,4,0,6,12,1,0, +- 3,13,15,11,2,0,0,0,8,4,14,10,0,0,13,15, +- 15,7,0,1,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,5,0,0,5,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,13,15,15,15,15,14,8,3,1,2,7,11, +- 5,4,5,6,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,8,0,1,14,11,0, +- 0,1,9,15,14,5,0,0,2,4,14,13,0,0,10,15, +- 15,12,0,0,12,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,10,0,0,1,14,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,14,13,7,2,0,5,9,15,15,15, +- 5,3,6,9,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,13,0,0,9,15,12, +- 2,0,0,4,13,14,4,0,3,2,12,15,1,0,5,15, +- 15,14,1,0,8,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,2,0,0,9,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,12,11,6,1,0,2,3,10,15,15,15,15,7, +- 1,2,4,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,5,0,3,14,15, +- 9,2,0,0,1,6,12,13,13,1,9,12,0,0,2,14, +- 15,15,4,0,4,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,10,0,0,2,14,15,15,15,15,15,15,15,15,15,15, +- 13,9,6,0,1,2,9,10,15,15,15,15,14,7,1,0, +- 6,2,4,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,11,0,0,9,15, +- 4,4,11,6,1,0,0,1,1,0,10,4,0,0,0,12, +- 15,15,9,0,1,14,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,3,0,0,8,15,15,15,15,15,15,15,13,12,4,4, +- 1,1,3,10,12,15,15,15,15,15,9,2,1,0,1,6, +- 6,0,10,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,4,0,3,14, +- 4,3,15,15,14,9,7,9,1,0,0,0,0,1,0,7, +- 15,15,13,0,0,9,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 13,0,0,1,14,15,15,15,15,15,12,9,1,0,1,4, +- 7,15,15,15,15,15,15,14,8,2,0,0,0,2,13,9, +- 0,4,14,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,11,0,0,9, +- 3,0,8,14,15,15,15,15,10,5,4,4,7,4,0,3, +- 15,15,15,4,0,3,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 5,0,0,5,15,15,15,15,14,8,7,8,10,12,14,15, +- 15,15,15,15,15,15,11,1,0,0,0,5,11,15,13,1, +- 1,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,3,0,4, +- 4,0,0,2,6,10,15,15,15,15,15,15,15,10,0,0, +- 12,15,15,9,0,0,12,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 1,0,0,10,15,15,15,15,15,13,14,15,15,15,15,15, +- 15,15,15,15,14,7,1,0,0,3,12,15,15,15,6,0, +- 7,15,15,15,12,10,9,10,12,14,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,9,0,0, +- 8,3,1,4,1,0,1,12,15,15,15,15,15,14,2,0, +- 6,15,15,15,2,0,6,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 0,0,1,14,15,15,15,15,14,5,15,15,15,15,15,15, +- 15,15,15,7,2,0,0,1,8,15,15,15,15,12,0,2, +- 14,15,12,4,0,0,0,0,0,1,5,10,14,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,14,0,0, +- 5,4,1,14,15,10,7,13,15,15,15,15,15,15,8,0, +- 1,14,15,15,7,0,1,14,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, +- 0,0,4,15,15,15,15,15,13,2,13,15,15,15,15,15, +- 12,7,0,0,0,0,5,12,15,15,15,15,14,3,0,9, +- 11,1,0,0,1,1,0,1,0,0,0,0,2,12,15,15, +- 15,15,15,15,15,15,15,14,15,15,15,15,15,15,2,0, +- 5,2,1,14,15,14,13,15,15,15,15,15,15,15,12,0, +- 0,10,15,15,13,0,0,9,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12, +- 0,0,4,15,15,15,15,15,12,0,12,15,15,15,12,6, +- 0,0,0,0,6,14,15,15,15,15,15,15,7,0,0,12, +- 1,0,0,2,2,1,1,7,12,8,3,0,0,1,13,15, +- 15,15,15,15,15,8,4,8,12,15,15,15,15,15,8,0, +- 4,2,0,14,15,11,9,15,15,15,15,15,15,15,15,3, +- 0,5,15,15,15,5,0,3,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12, +- 0,0,4,15,15,15,15,15,12,0,12,15,13,3,1,0, +- 0,0,5,12,15,15,15,15,15,15,15,12,0,0,7,7, +- 0,0,0,0,0,0,0,1,12,15,15,12,3,0,5,15, +- 15,15,15,14,5,0,0,0,0,2,2,3,7,14,9,8, +- 14,2,1,14,15,2,12,13,15,15,15,15,15,15,15,9, +- 0,0,13,15,15,10,0,0,12,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, +- 0,0,5,15,15,15,15,15,12,0,11,10,1,0,0,1, +- 5,14,15,15,15,15,15,15,15,15,15,6,0,2,7,0, +- 0,0,0,1,2,7,4,0,3,14,15,15,14,2,0,12, +- 15,15,15,9,0,1,2,1,0,0,0,0,0,1,3,7, +- 15,3,0,14,15,4,12,15,15,15,15,15,15,15,15,14, +- 1,0,8,15,15,14,1,0,8,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, +- 0,0,4,15,15,15,15,15,12,0,2,0,0,1,10,15, +- 15,15,15,15,15,15,15,15,15,15,12,0,0,6,0,0, +- 0,1,10,14,15,15,11,1,0,9,15,15,15,8,0,9, +- 15,15,12,4,8,14,15,8,1,0,0,0,0,0,1,9, +- 15,2,0,13,15,1,9,15,15,15,15,15,15,15,15,15, +- 6,0,1,14,15,14,1,0,3,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, +- 1,0,1,14,15,15,15,15,12,1,3,7,9,13,15,15, +- 15,15,15,15,15,15,15,15,15,15,3,0,2,3,0,4, +- 0,8,15,15,15,15,15,13,1,2,14,15,15,10,0,6, +- 15,14,2,6,15,15,15,1,3,7,3,0,0,0,0,1, +- 11,1,0,11,12,0,12,15,15,15,15,15,15,15,15,15, +- 11,0,0,9,15,15,4,0,0,12,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 6,0,0,9,15,15,15,15,15,12,14,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,11,0,0,3,0,8,14, +- 2,5,15,15,15,15,15,15,5,0,8,15,15,12,0,4, +- 15,5,2,14,15,15,10,0,13,15,13,2,4,5,5,0, +- 9,1,0,10,9,1,14,15,15,15,15,15,15,15,15,15, +- 13,0,0,3,15,15,9,0,0,8,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 12,0,0,3,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,3,0,1,1,5,14,15, +- 11,0,12,15,15,15,15,15,14,1,1,14,15,12,0,4, +- 10,0,9,15,15,11,1,8,15,15,8,1,14,15,14,2, +- 5,0,0,10,6,2,15,15,15,15,15,15,15,15,15,15, +- 15,3,0,0,12,15,13,0,0,2,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,3,0,0,10,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,10,0,0,1,0,11,15,15, +- 15,2,6,15,15,15,15,15,15,6,0,9,15,13,0,6, +- 3,0,13,15,14,2,6,15,15,13,1,8,15,15,15,4, +- 3,1,0,10,7,2,15,15,15,15,15,15,15,15,15,15, +- 15,9,0,0,6,15,15,3,0,0,13,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,9,0,0,2,14,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,11,10,2,0,3,0,3,15,15,15, +- 15,8,1,14,15,15,15,15,15,13,0,2,15,9,1,10, +- 0,3,15,15,6,2,14,15,14,3,1,14,15,15,15,2, +- 4,0,0,12,5,3,15,15,15,15,15,15,15,15,15,15, +- 15,14,1,0,1,14,15,5,0,0,12,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,4,0,0,6,15,15,15,15,15,15,15,15,14,12, +- 12,9,5,4,4,3,0,0,0,0,4,0,8,15,15,15, +- 15,13,1,10,15,15,15,15,15,15,2,0,11,3,5,10, +- 0,7,15,9,1,11,15,15,8,0,6,15,15,15,10,0, +- 3,0,0,13,3,6,15,15,15,15,15,15,15,15,15,15, +- 15,15,6,0,0,12,15,5,0,0,7,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,13,1,0,0,8,14,15,15,13,6,4,4,1,0, +- 0,0,0,0,0,0,2,0,0,4,3,0,12,15,15,15, +- 15,15,5,3,15,15,15,15,14,8,0,0,1,1,12,9, +- 0,9,10,0,6,15,15,15,2,2,14,15,15,13,2,0, +- 4,0,1,13,0,10,15,15,15,15,15,15,15,15,15,15, +- 15,15,13,1,0,10,15,10,0,0,5,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,9,0,0,0,3,2,2,1,0,0,0,1,4, +- 4,5,10,12,12,12,11,0,0,11,4,0,12,15,15,15, +- 15,15,12,0,7,13,15,15,5,0,0,0,1,6,15,9, +- 0,3,0,0,1,6,14,10,0,12,15,15,11,2,0,2, +- 3,0,3,12,1,11,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,3,0,6,8,7,0,0,5,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,9,1,0,0,0,2,6,10,12,12,14,15, +- 15,15,15,15,11,5,4,0,2,14,4,0,12,15,15,15, +- 15,15,15,4,0,3,13,6,0,0,0,1,2,14,15,12, +- 0,0,0,0,0,0,2,2,6,15,14,8,0,0,0,7, +- 4,0,4,12,0,12,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,12,0,0,0,0,0,0,1,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,12,2,0,0,0,1,6,11,15,15,15, +- 15,15,15,15,2,1,0,0,9,15,6,0,7,15,15,15, +- 15,15,15,13,2,0,0,0,0,0,0,1,12,15,15,15, +- 4,0,0,0,0,0,0,6,13,6,1,0,0,4,13,15, +- 6,0,6,12,0,12,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,14,5,0,0,0,0,0,5,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,14,5,0,0,0,0,0,2,4,5, +- 7,3,6,3,0,2,0,2,15,15,11,0,0,9,15,15, +- 15,15,15,15,11,0,0,0,0,0,2,11,15,15,15,15, +- 12,1,0,0,1,4,6,10,2,0,0,0,7,14,15,15, +- 9,0,9,9,0,12,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,13,9,8,9,7,13,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,12,6,1,0,0,0,0,0, +- 0,0,0,2,8,0,0,9,15,15,14,4,0,0,3,10, +- 14,15,15,15,15,13,3,0,0,4,14,15,15,15,15,15, +- 15,11,2,0,0,1,1,0,0,0,1,11,15,15,15,15, +- 9,0,10,5,3,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,14,12,10,5,4,6, +- 2,4,10,14,8,0,1,14,15,15,15,14,5,0,0,0, +- 1,2,4,4,4,3,1,2,9,14,15,15,15,15,15,15, +- 15,15,15,11,11,13,10,9,9,11,15,15,15,15,15,15, +- 10,0,8,2,4,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 2,7,15,14,1,0,6,15,15,15,15,15,15,10,6,4, +- 2,2,4,4,4,3,9,14,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 11,0,3,1,4,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,11, +- 1,10,15,9,0,0,13,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 11,0,11,11,11,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,2, +- 5,15,14,2,0,5,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 14,1,13,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,10,1, +- 13,15,11,0,0,12,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,5,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,8,1, +- 15,15,5,0,3,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,10,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,12,2,3, +- 15,14,1,0,7,15,15,15,15,15,13,15,15,15,15,14, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,13,12,12,11,9,4,7,14,15, +- 14,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,12,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,14,3,0,10, +- 15,9,0,0,8,7,4,2,2,1,0,3,4,3,4,9, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,14,13,11,7,4,2,0,0,0,0,0,0,1,12,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,14,13,11,7,4,2,2,13,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,12,0,3,11, +- 7,1,0,0,0,0,0,1,4,9,11,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,14,12,11,9,7,4, +- 3,1,0,0,0,0,0,0,0,0,0,2,11,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,13,11,8, +- 4,3,1,0,0,0,0,3,8,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,14,11,3,0,0,0, +- 0,0,0,2,6,9,12,14,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,13,9,6,3,1,0,0,0,0,0,0, +- 0,0,0,0,1,4,7,11,12,12,12,14,15,15,15,15, +- 15,15,15,15,15,15,15,14,12,11,7,4,2,0,0,0, +- 0,0,0,1,5,10,13,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,14,12,7,3,1,0,0,0,2,5, +- 2,0,2,14,15,15,15,15,15,15,15,15,15,14,13,12, +- 11,9,6,4,2,0,0,0,0,0,0,0,0,1,2,4, +- 5,9,11,13,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,14,12,11,7,4,3,1,0,0,0,0,0,0,0,1, +- 4,5,10,14,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,13,10,5,1,0,0,0,1,0,0,2,13,14, +- 1,0,8,15,15,14,12,11,9,8,4,3,2,1,0,0, +- 0,0,0,0,1,3,2,3,5,9,10,12,13,14,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,13,11,10,6,4, +- 3,1,0,0,0,0,0,0,0,0,1,4,7,11,13,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,11,4,0,0,0,1,4,9,13,13,1,0,0,1,7, +- 0,0,7,8,5,2,0,0,0,0,0,0,1,2,3,4, +- 5,9,10,12,14,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,14,11,8,4,3,1,0,0,0,0,0, +- 0,0,0,0,1,4,5,9,12,13,15,15,15,15,15,15, +- 15,15,14,12,9,8,8,7,4,2,5,4,5,5,12,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,14,10,5, +- 1,0,1,3,6,11,14,15,15,15,15,13,12,8,3,2, +- 0,0,1,1,3,3,4,5,8,10,12,13,14,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, +- 11,9,6,4,2,1,0,0,0,0,0,0,0,1,2,4, +- 6,10,11,13,15,15,15,15,15,15,15,15,13,11,9,7, +- 4,2,1,0,0,0,0,2,4,7,12,14,14,14,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,10,5,1,1,3, +- 8,12,14,15,15,15,15,15,15,15,15,15,15,15,15,9, +- 3,11,14,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,8,6,9,9,9,9,9,8,5,4,4,3,1,0, +- 0,0,0,0,1,2,3,2,4,5,9,11,12,14,15,15, +- 15,15,15,15,15,15,15,14,12,9,5,2,0,0,0,0, +- 0,1,2,4,7,10,14,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,14,9,4,1,3,9,13,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, +- 11,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,13,3,1,1,1,1,1,1,1,0,0,0,0,2,3, +- 5,8,10,12,14,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,12,5,2,0,0,0,1,3,4,7,10, +- 12,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,13,11,13,13,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,14,12,12,12,13,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,8,1,0,1,4,7,11,13,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,13,7,8,11,14,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15 +- }; +diff -Naur /home/d4rk/goom2k4-0/src/motif_goom2.h /src/motif_goom2.h +--- /home/d4rk/goom2k4-0/src/motif_goom2.h 2005-02-07 06:46:42.000000000 -0700 ++++ /src/motif_goom2.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,1026 +0,0 @@ +-static Motif CONV_MOTIF2 = { +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,12,5,14, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,12,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,10,1,14, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,10,0,12,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,6,0,12, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,7,0,8,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,13,2,0,10, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,6,0,2,14,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,5,0,0,10, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,9,0,0,12,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,14,9,0,0,1,14, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,8,0,0,8,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,14,8,3,0,0,0,9,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,11,0,0,2,14,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,13,9,5,3,4,1,0,0,0,0,7,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,14,4,0,0,4,11,13,13,15,15,14,12,10,8,5, +- 6,4,1,0,0,0,0,0,0,0,0,0,0,14,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,12,1,0,0,0,0,0,0,0,0,0,0,0,0, +- 0,0,0,0,0,0,0,0,0,0,0,0,9,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 13,9,10,13,14,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,12,3,0,0,0,0,0,0,0,0,0,0,0, +- 0,0,0,0,0,2,5,6,0,0,0,0,12,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 5,0,0,0,3,10,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,14,9,2,1,0,0,0,1,4,6,6,1, +- 0,0,0,8,13,15,15,15,12,1,0,2,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, +- 2,0,0,0,0,0,4,12,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,3,0,0,10,15,15,15,10, +- 0,0,4,15,15,15,15,15,15,2,0,6,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,5, +- 3,11,5,0,0,0,0,0,4,11,14,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,7,0,0,13,15,15,15,11, +- 0,0,7,15,15,15,15,15,15,1,0,9,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,9,0, +- 13,15,15,12,5,0,0,0,0,0,1,8,14,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,7,0,1,14,15,15,15,11, +- 0,0,7,15,15,15,15,15,14,0,0,9,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,11,1,10, +- 15,15,15,15,15,11,5,0,0,0,0,0,1,6,13,15, +- 15,15,15,15,14,8,11,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,6,0,2,15,15,15,15,11, +- 0,0,6,15,15,15,15,15,13,0,0,11,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,11,1,6,15, +- 15,15,15,15,15,15,15,14,5,0,0,0,0,0,0,6, +- 14,15,15,15,6,0,4,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,7,0,5,15,15,15,15,11, +- 0,0,5,15,15,15,15,15,12,0,0,12,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,13,2,1,13,15, +- 15,15,15,15,15,15,15,15,15,12,2,0,0,0,0,0, +- 1,6,11,7,0,0,4,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,7,0,7,15,15,15,15,11, +- 0,0,6,15,15,15,15,15,12,0,0,12,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,5,0,7,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,11,5,0,0,0, +- 0,0,0,0,0,1,11,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, +- 0,0,6,15,15,15,15,15,12,0,0,12,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,10,0,4,14,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,13,7,0, +- 0,0,0,0,0,1,6,12,14,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, +- 0,0,7,15,15,15,15,15,12,0,0,12,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,13,1,1,12,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, +- 5,0,0,0,0,0,0,0,3,10,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, +- 0,0,7,15,15,15,15,15,11,0,0,13,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,14,4,0,8,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 13,0,0,0,1,0,0,0,0,1,13,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, +- 0,0,8,15,15,15,15,15,8,0,2,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,9,0,4,14,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, +- 4,0,0,5,13,12,6,2,0,2,13,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, +- 0,0,7,15,15,15,15,15,4,0,4,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,13,1,1,13,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,11, +- 0,0,1,13,15,15,15,14,9,13,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,5,0,6,15,15,15,15,11, +- 0,0,8,15,15,15,15,15,2,0,8,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,5,0,9,15,15,15,15,15,15, +- 15,15,15,15,15,15,14,11,15,15,15,15,15,15,15,9, +- 0,0,10,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,4,0,4,15,15,15,15,11, +- 0,0,7,15,15,15,15,13,0,0,11,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,10,0,3,14,15,15,15,15,15,15, +- 15,15,15,15,15,14,3,0,13,15,15,15,15,15,15,14, +- 9,11,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,4,0,4,15,15,15,15,11, +- 0,0,8,15,15,15,15,12,0,0,12,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,14,2,1,12,15,15,15,15,15,15,15, +- 15,15,15,15,14,3,0,0,9,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,6,0,3,15,15,15,15,13, +- 1,0,8,15,15,15,15,12,0,0,12,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,9,0,5,15,15,15,15,15,15,15,15, +- 15,15,15,14,4,0,0,0,10,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,8,0,2,15,15,15,15,15, +- 3,0,13,15,15,15,15,12,0,0,12,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,13,2,1,12,15,15,15,15,15,15,15,15, +- 15,15,15,7,0,0,0,0,8,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,10,0,1,14,15,15,15,15, +- 11,5,15,15,15,15,15,12,0,0,11,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,6,0,7,15,15,15,15,15,15,15,15,15, +- 15,15,8,0,0,0,0,0,0,9,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,12,0,0,12,15,15,15,15, +- 15,14,15,15,15,15,15,10,0,0,12,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,13,1,2,14,15,15,15,15,15,15,15,15,15, +- 15,10,0,0,0,6,6,0,0,0,5,12,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,12, +- 15,15,15,15,15,15,15,15,13,0,0,11,15,15,15,15, +- 15,15,15,15,15,15,15,9,0,1,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,7,0,8,15,15,15,15,15,15,15,15,15,15, +- 15,9,0,0,4,15,15,8,0,0,0,1,5,13,15,15, +- 15,15,15,15,15,15,15,15,15,15,12,8,7,6,5,3, +- 3,3,4,12,15,15,15,15,15,15,15,15,15,7,0,6, +- 15,15,15,15,15,15,15,15,14,1,0,10,15,15,15,15, +- 15,15,15,15,15,15,15,6,0,3,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,13,1,0,13,15,15,15,15,15,15,15,15,15,15, +- 15,14,7,8,13,15,15,15,11,2,0,0,0,0,5,11, +- 15,15,15,15,15,15,15,15,13,3,0,0,0,0,0,0, +- 0,0,0,5,15,15,15,15,15,15,15,15,12,1,0,0, +- 3,11,15,15,15,15,15,15,13,1,0,10,15,15,15,15, +- 15,15,15,15,15,15,15,3,0,5,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,9,0,5,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,14,8,1,0,0,0,0, +- 4,12,15,15,15,15,15,15,4,0,0,0,0,0,0,0, +- 0,0,0,2,15,15,15,15,15,15,15,14,4,0,0,0, +- 0,0,9,15,15,15,15,15,14,1,0,10,15,15,15,15, +- 15,15,15,15,15,15,15,2,0,9,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,14,4,0,11,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,14,8,2,0,0, +- 0,0,4,10,14,15,15,15,4,0,0,0,0,0,0,0, +- 0,0,0,3,15,15,15,15,15,15,15,6,0,0,0,2, +- 3,0,0,8,15,15,15,15,14,1,0,10,15,15,15,15, +- 15,15,15,15,15,15,15,1,0,9,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 14,5,0,4,14,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,14,9,3, +- 0,0,0,0,2,5,10,15,5,0,1,11,11,12,13,15, +- 11,0,0,7,15,15,15,15,15,15,8,0,0,0,1,12, +- 14,6,0,0,7,14,15,15,14,1,0,9,15,15,15,15, +- 15,15,15,15,15,15,15,2,0,10,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 9,0,1,13,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, +- 10,2,0,0,0,0,1,14,4,0,1,14,15,15,15,15, +- 9,0,0,9,15,15,15,15,15,9,0,0,0,0,9,15, +- 15,15,7,0,0,6,14,15,15,3,0,6,15,15,15,15, +- 15,15,15,15,15,15,15,1,0,9,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,9, +- 0,0,1,10,14,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,13,1,0,0,0,1,14,3,0,0,14,15,15,15,15, +- 5,0,0,11,15,15,15,15,13,1,0,0,0,6,15,15, +- 15,15,15,8,0,0,2,10,15,6,0,3,15,15,15,15, +- 15,15,15,15,15,15,15,2,0,10,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,13,1, +- 0,0,0,0,3,9,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,6,1,0,0,0,8,15,1,0,0,14,15,15,15,15, +- 4,0,0,13,15,15,15,14,4,0,0,0,3,14,15,15, +- 15,15,15,15,5,0,0,1,14,9,0,1,14,15,15,15, +- 15,15,15,15,15,15,15,1,0,9,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,13,1, +- 0,0,0,0,0,0,4,12,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 9,0,0,0,0,7,15,15,1,0,0,14,15,15,15,14, +- 2,0,1,14,15,15,15,12,0,0,0,3,13,15,15,15, +- 15,15,15,9,0,0,0,1,14,12,0,0,12,15,15,15, +- 15,15,15,15,15,15,14,1,0,10,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12, +- 3,0,0,0,0,0,0,1,8,14,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,9, +- 0,0,0,0,7,15,15,15,1,0,0,14,15,15,15,13, +- 0,0,1,15,15,15,15,12,0,0,0,6,14,15,15,15, +- 15,15,12,0,0,0,0,3,14,12,0,0,12,15,15,15, +- 15,15,15,15,15,15,12,0,0,12,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,13,3,0,0,0,0,0,0,1,6,13,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,0, +- 0,0,0,3,15,15,15,12,0,0,0,14,15,15,15,11, +- 0,0,3,15,15,15,15,15,12,7,0,0,4,14,15,15, +- 15,11,1,0,0,0,4,13,15,12,0,0,12,15,15,15, +- 15,15,15,15,15,15,10,0,1,14,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,12,7,0,0,0,0,0,0,0,3,8,12,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,4,0, +- 0,0,1,13,15,15,15,6,0,0,0,14,15,15,15,8, +- 0,0,7,15,15,15,15,15,15,15,8,1,0,2,13,15, +- 14,2,0,0,0,4,14,15,15,13,1,0,10,15,15,15, +- 15,15,15,15,15,15,9,0,2,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,11,6,2,0,0,0,0,0,0,0,1, +- 10,15,15,15,15,15,15,15,15,15,15,15,15,8,0,0, +- 0,0,10,15,15,15,15,4,0,0,1,15,15,15,15,4, +- 0,0,8,15,15,15,15,15,15,15,15,10,1,0,1,8, +- 2,0,0,0,5,15,15,15,15,15,2,0,6,15,15,15, +- 15,15,15,15,15,15,9,0,1,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,9,1,0,0,0,0,0,0, +- 0,1,7,13,14,15,15,15,15,15,15,15,9,0,0,0, +- 0,6,15,15,15,15,15,4,0,0,4,15,15,15,14,1, +- 0,0,9,15,15,15,15,15,15,15,15,15,12,2,0,0, +- 0,0,0,4,14,15,15,15,15,15,4,0,4,15,15,15, +- 15,15,15,15,15,15,7,0,0,14,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,14,11,6,2,0,0,0, +- 0,0,0,0,1,9,12,15,15,15,15,14,3,0,0,0, +- 4,15,15,15,15,15,15,4,0,0,3,6,4,4,2,0, +- 0,0,13,15,15,15,15,15,15,15,15,15,15,12,1,0, +- 0,0,3,14,15,15,15,15,15,15,4,0,4,15,15,15, +- 15,15,15,15,15,15,5,0,0,12,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,8,2,0, +- 0,0,0,0,0,0,0,1,9,15,15,5,0,0,0,0, +- 12,15,15,15,15,15,15,4,0,0,0,0,0,0,0,0, +- 0,3,15,15,15,15,15,15,15,15,15,15,15,14,4,0, +- 0,1,12,15,15,15,15,15,15,15,6,0,1,14,15,15, +- 15,15,15,15,15,15,5,0,0,13,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12, +- 7,1,0,0,0,0,0,0,0,5,7,0,0,0,0,10, +- 15,15,15,15,15,15,15,7,0,0,0,0,0,0,0,0, +- 1,10,15,15,15,15,15,15,15,15,15,15,15,14,3,0, +- 3,12,15,15,15,15,15,15,15,15,12,0,0,12,15,15, +- 15,15,15,15,15,15,5,0,0,1,1,4,11,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,11,6,1,0,0,0,0,0,0,0,0,0,7,15, +- 15,15,15,15,15,15,15,14,7,4,4,4,5,9,12,13, +- 14,15,15,15,15,15,15,15,15,15,15,15,15,15,11,9, +- 14,15,15,14,12,11,11,11,10,9,7,0,0,5,13,15, +- 15,15,15,15,15,12,1,0,0,0,0,0,0,10,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,14,7,1,0,0,0,0,0,3,14,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,13,2,0,0,0,0,0,0,0,0,0,0,0,8, +- 15,15,15,15,15,11,0,0,0,0,0,0,0,9,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,13,5,0,0,0,0,12,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,8,0,0,0,0,0,0,0,0,0,0,0,0,5, +- 15,15,15,15,15,15,10,5,6,7,7,7,9,14,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,8,3,2,2,2,2,5,14,15, +- 15,15,15,15,15,15,15,15,15,10,3,0,6,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,13,3,1,0,1,0,1,1,2,4,4,3,9,14, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,12,4,0,1,6,7,7,4,1,3,13, +- 15,15,15,15,15,15,15,15,15,15,14,10,13,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,11,11,15,15,15,15, +- 15,15,15,14,14,14,14,14,14,14,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,14,2,0,4,13,15,15,15,15,10,0,12, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,14,13,14,12,12,12,12,12,12,12, +- 12,14,15,15,15,15,15,15,15,15,4,14,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,7,1,5,14,15,15,15,15,15,12,1,11, +- 15,15,15,13,12,13,15,15,14,11,13,15,15,15,15,15, +- 15,15,15,11,6,3,1,1,1,0,0,0,0,0,0,0, +- 0,1,4,7,11,14,15,15,15,14,4,15,13,10,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,14,7,4,5, +- 12,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,13,1,1,14,15,15,14,10,12,15,11,1,12, +- 15,15,11,1,0,4,15,15,6,0,2,14,15,15,15,15, +- 15,15,14,8,6,3,3,2,2,1,0,0,0,0,0,0, +- 0,0,0,0,0,3,11,15,15,11,8,15,12,6,15,9, +- 8,15,15,15,15,15,15,15,15,15,15,15,10,4,4,1, +- 4,15,15,15,15,11,6,2,8,14,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,12,0,4,15,15,15,11,2,10,15,9,1,13, +- 15,13,1,7,6,2,14,14,1,2,1,14,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,13,12,12,12,12,12,12, +- 11,11,11,10,9,10,12,15,15,6,7,15,9,4,15,4, +- 1,14,15,15,15,15,15,15,15,15,15,15,2,11,15,4, +- 4,15,15,15,15,3,9,4,0,9,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,12,0,4,15,15,15,5,0,6,6,1,9,15, +- 15,4,1,13,10,1,13,9,2,7,1,14,14,14,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,3,5,15,3,5,14,1, +- 0,12,13,9,14,15,15,15,15,15,15,15,2,2,4,1, +- 6,15,15,15,14,1,5,6,0,9,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,12,0,4,15,15,15,12,4,2,2,10,15,15, +- 11,0,6,15,12,0,10,7,9,10,1,14,7,14,15,15, +- 15,15,15,15,15,15,13,12,11,11,10,9,9,10,11,13, +- 15,15,15,15,15,15,15,15,15,1,9,15,2,7,14,1, +- 0,10,7,0,8,15,15,15,15,15,15,15,11,4,4,4, +- 13,15,15,15,15,10,2,2,4,14,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,12,0,4,15,15,15,15,15,15,15,15,15,15, +- 4,2,14,15,15,1,9,5,14,9,1,14,8,14,15,15, +- 15,15,15,15,15,10,3,0,1,0,0,0,0,0,0,5, +- 15,15,15,15,15,15,15,15,15,1,9,14,1,8,14,1, +- 0,11,13,6,11,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,14,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,12,0,4,15,15,15,15,15,15,15,15,15,11, +- 0,6,15,15,15,1,5,3,13,10,0,6,8,15,15,15, +- 15,15,15,15,15,15,13,12,12,11,10,9,9,10,11,13, +- 15,15,15,15,15,15,15,15,15,1,9,12,1,11,15,4, +- 1,14,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 14,10,4,2,12,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,12,1,3,14,15,15,15,15,15,15,15,15,4, +- 3,14,15,15,15,5,1,8,15,14,5,2,9,15,15,15, +- 15,15,15,15,15,15,15,15,15,11,9,13,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,1,9,12,1,12,15,13, +- 11,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 10,2,9,2,3,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,14,4,0,5,14,15,15,15,15,15,15,11,0, +- 6,15,15,15,15,15,14,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,8,1,0,3,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,1,9,15,11,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 7,1,12,6,1,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,11,1,0,3,8,9,9,10,11,9,5,4, +- 13,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,12,9,13,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,5,11,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 10,3,4,1,5,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,12,2,0,0,0,0,0,0,1,8,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,14,12,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,13,8,8,10,9,10,11,14,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15 +- }; +diff -Naur /home/d4rk/goom2k4-0/src/plugin_info.c /src/plugin_info.c +--- /home/d4rk/goom2k4-0/src/plugin_info.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/plugin_info.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,202 +0,0 @@ +-#include "goom_plugin_info.h" +-#include "goom_fx.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 +-#include "mmx.h" +-#endif /* CPU_X86 */ +- +- +- +-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) != 0) { +-/* p->methods.create_output_with_brightness = ppc_brightness_G5; */ +- p->methods.zoom_filter = ppc_zoom_generic; +- } +- else if ((cpuFlavour & CPU_OPTION_ALTIVEC) != 0) { +-/* 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 = gsl_new(); +- pp->main_scanner = gsl_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); +- } +- } +-} +diff -Naur /home/d4rk/goom2k4-0/src/pngload.c /src/pngload.c +--- /home/d4rk/goom2k4-0/src/pngload.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/pngload.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,141 +0,0 @@ +-#include <png.h> +- +-int +-loadpng (char *file_name, int *w, int *h, unsigned int ***buf) +-{ +- FILE *fp; +- png_uint_32 width, height; +- int bit_depth, +- +- color_type, interlace_type, compression_type, filter_type; +- int rowbytes; +- +- png_structp png_ptr; +- png_infop info_ptr; +- png_infop end_info; +- +- int x, y; +- unsigned int **row_pointers; +- +- /* OUVERTURE DU FICHIER */ +- +- fp = fopen (file_name, "rb"); +- +- if (!fp) { +- // fprintf (stderr, "Couldn't open file\n"); +- return 1; +- } +- +- /* CREATION DES STRUCTURES */ +- png_ptr = png_create_read_struct +- (PNG_LIBPNG_VER_STRING, (png_voidp) NULL, NULL, NULL); +- if (!png_ptr) { +- fprintf (stderr, "Memory error\n"); +- return 1; +- } +- +- info_ptr = png_create_info_struct (png_ptr); +- if (!info_ptr) { +- png_destroy_read_struct (&png_ptr, (png_infopp) NULL, (png_infopp) NULL); +- fprintf (stderr, "Read error 1\n"); +- return 1; +- } +- +- end_info = png_create_info_struct (png_ptr); +- if (!end_info) { +- png_destroy_read_struct (&png_ptr, &info_ptr, (png_infopp) NULL); +- fprintf (stderr, "Read error 2\n"); +- return 1; +- } +- +- /* CHARGEMENT DE L'IMAGE */ +- if (setjmp (png_ptr->jmpbuf)) { +- png_destroy_read_struct (&png_ptr, &info_ptr, &end_info); +- fclose (fp); +- fprintf (stderr, "Erreur de chargement\n"); +- return 1; +- } +- +- png_init_io (png_ptr, fp); +- png_set_read_status_fn (png_ptr, NULL); +- +- png_read_info (png_ptr, info_ptr); +- +- png_get_IHDR (png_ptr, info_ptr, &width, &height, +- &bit_depth, &color_type, &interlace_type, +- &compression_type, &filter_type); +-/* +- printf ("taille : %dx%d\n",width,height); +- printf ("depth : %d\n",bit_depth); +- printf ("color type : "); +- switch (color_type) { +- case PNG_COLOR_TYPE_GRAY: +- printf ("PNG_COLOR_TYPE_GRAY (bit depths 1, 2, 4, 8, 16)\n"); +- break; +- case PNG_COLOR_TYPE_GRAY_ALPHA: +- printf ("PNG_COLOR_TYPE_GRAY_ALPHA (bit depths 8, 16)\n"); +- break; +- case PNG_COLOR_TYPE_PALETTE: +- printf ("PNG_COLOR_TYPE_PALETTE (bit depths 1, 2, 4, 8)\n"); +- break; +- case PNG_COLOR_TYPE_RGB: +- printf ("PNG_COLOR_TYPE_RGB (bit_depths 8, 16)\n"); +- break; +- case PNG_COLOR_TYPE_RGB_ALPHA: +- printf ("PNG_COLOR_TYPE_RGB_ALPHA (bit_depths 8, 16)\n"); +- break; +- } +- */ +- // printf ("PNG_COLOR_MASK_ALPHA : %x\n", PNG_COLOR_MASK_ALPHA); +- // printf ("PNG_COLOR_MASK_COLOR : %x\n", PNG_COLOR_MASK_COLOR); +- // printf ("PNG_COLOR_MASK_PALETTE : %x\n", PNG_COLOR_MASK_PALETTE); +- +- if (color_type == PNG_COLOR_TYPE_PALETTE && bit_depth <= 8) +- png_set_palette_to_rgb (png_ptr); +- +- if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) +- png_set_gray_1_2_4_to_8 (png_ptr); +- else if (color_type == PNG_COLOR_TYPE_GRAY || +- color_type == PNG_COLOR_TYPE_GRAY_ALPHA) +- png_set_gray_to_rgb (png_ptr); +- +- if (png_get_valid (png_ptr, info_ptr, PNG_INFO_tRNS)) +- png_set_tRNS_to_alpha (png_ptr); +- +- png_read_update_info (png_ptr, info_ptr); +- +-// printf ("channels : %d\n", png_get_channels (png_ptr, info_ptr)); +- rowbytes = png_get_rowbytes (png_ptr, info_ptr); +-// printf ("rowbytes : %d\n", rowbytes); +- +- row_pointers = (unsigned int **) malloc (height * sizeof (unsigned int *)); +- +- for (y = 0; y < height; y++) +- row_pointers[y] = (unsigned int *) malloc (4 * width); +- png_read_image (png_ptr, (png_bytepp) row_pointers); +- +- // for (y=0;y<height;y++) { +-// for (x=0;x<width;x++) { +-// if (row_pointers[y][x] & 0xf000) +- // printf ("%x ",(((unsigned int**)row_pointers)[y][x])&0xf); +- // else +-// printf (" "); +- // } +- // printf ("\n"); +- // } +- +- png_read_end (png_ptr, end_info); +- png_destroy_read_struct (&png_ptr, &info_ptr, &end_info); +- +- (*buf) = (unsigned int **) malloc (height * sizeof (void *)); +- +- for (y = 0; y < height; y++) { +- (*buf)[y] = (unsigned int *) malloc (width * 4); +- for (x = 0; x < width; x++) +- (*buf)[y][x] = row_pointers[y][x]; +- } +- *w = width; +- *h = height; +- +- return 0; +-} +diff -Naur /home/d4rk/goom2k4-0/src/powerpc/Copie de ppc_zoom_ultimate.s /src/powerpc/Copie de ppc_zoom_ultimate.s +--- /home/d4rk/goom2k4-0/src/powerpc/Copie de ppc_zoom_ultimate.s 2005-02-07 06:46:41.000000000 -0700 ++++ /src/powerpc/Copie de ppc_zoom_ultimate.s 1969-12-31 17:00:00.000000000 -0700 +@@ -1,305 +0,0 @@ +-; PowerPC optimized zoom for Goom +-; © 2001-2003 Guillaume Borios +-; This Source Code is released under the terms of the General Public License +- +-; Change log : +-; 21 Dec 2003 : Use of altivec is now determined with a parameter +- +-; Section definition : We use a read only section +-.text +- +-; name of the function to call by C program : ppc_zoom +-; We declare this label as a global to extend its scope outside this file +-.globl _ppc_zoom_generic +-.globl _ppc_zoom_G4 +- +-; Description : +-; This routine dynamically computes and applies a zoom filter +- +-; parameters : +-; r3 <=> unsigned int * frompixmap +-; r4 <=> unsigned int * topixmap +-; r5 <=> unsigned int sizeX (in pixels) +-; r6 <=> unsigned int sizeY (in pixels) +-; r7 <=> unsigned int * brutS +-; r8 <=> unsigned int * brutD +-; r9 <=> unsigned int buffratio +-; r10 <=> int [16][16] precalccoeffs +- +-; globals after init +-; r3 <=> frompixmap - 1 byte needed for preincremental fetch (replaces r3) +-; r4 <=> topixmap - 1 byte needed for preincremental fetch (replaces r4) +-; r5 <=> ax = x max in 16th of pixels (replaces old r5) +-; r6 <=> ay = y max in 16th of pixels (replaces old r6) +-; r20 <=> row size in bytes +-; r12 <=> 0xFF00FF (mask for parallel 32 bits pixs computing) +-; r30 <=> brutS - 1 byte needed for preincremental fetch (replaces r7) +-; r31 <=> brutD - 1 byte needed for preincremental fetch (replaces r8) +- +-; ABI notes : +-; r1 is the Stack Pointer (SP) => Do not use +-; r13..r31 are non-volatiles => Do not use +- +-_ppc_zoom_generic: +- +-; Saves the used non volatile registers in the Mach-O stack s Red-Zone +-stmw r18,-56(r1) +- +-; init +-li r18,0 ; Default value if out of range : 0 (Black) +-mr r11,r10 +-lis r12,0xFF +-mullw r2,r5,r6 ; Number of pixels to compute +-subi r30,r8,0 +-slwi r20,r5,2 +-srawi r19,r20,2 +-ori r12,r12,0xFF +-subi r5,r5,1 +-subi r6,r6,1 +-mtspr ctr,r2 ; Init the loop count (one loop per pixel computed) +-subi r31,r7,0 +-subi r4,r4,4 +-slwi r5,r5,4 +-slwi r6,r6,4 +- +-;pre init for loop +-lwz r2,0(r31) ; px +-lwz r29,4(r31) ; py +-lwz r8,0(r30) ; px2 +-lwz r10,4(r30) ; py2 +- +-L1: +- +-; computes dynamically the position to fetch +-sub r8,r8,r2 +-sub r10,r10,r29 +-mullw r8,r8,r9 +-addi r31,r31,8 +-mullw r10,r10,r9 +-addi r30,r30,8 +- +-srawi r8,r8,16 +-srawi r10,r10,16 +-add r2,r2,r8 +-add r29,r29,r10 +- +-; if px>ax or py>ay goto outofrange +-; computes the attenuation coeffs and the original point address +-rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16) +-cmpl cr6,0,r2,r5 +-rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r10%16)*4 | r10) +-cmpl cr7,0,r29,r6 +-srawi r29,r29,4 ; pos computing +-bge- cr6,L4 +-srawi r2,r2,4 ; pos computing +-mullw r29, r29,r19 ; pos computing +-bge- cr7,L4 +- +-; Channels notation : 00112233 (AARRVVBB) +- +-add r2,r2,r29 ; pos computing +-lwzx r10,r11,r10 ; Loads coefs +-slwi r2,r2,2 ; pos computing +-add r2,r2,r3 ; pos computing +-rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011) +-lwz r25,0(r2) ; Loads col1 -> r25 +-lwz r26,4(r2) ; Loads col2 -> r26 +-rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022) +-rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033) +-add r2,r2,r20 ; Adds one line for future load of col3 and col4 +-and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX +-rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044) +-andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00 +-mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3 +- +- +-; computes final pixel color +-and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX +-lwz r27,0(r2) ; Loads col3 -> r27 +-mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3 +-mullw r25,r25,r21 ; Applies coef1 on col1 channel 2 +-andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00 +-mullw r29,r29,r22 ; Applies coef2 on col2 channel 2 +-lwz r28,4(r2) ; Loads col4 -> r28 +-add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3 +-and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX +-add r25,r25,r29 ; Adds col1 & col2 channel 2 +-mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3 +-andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00 +-mullw r29,r29,r23 ; Applies coef3 on col3 channel 2 +-lwz r2,0(r31) ; px +-add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3 +-and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX +-mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3 +-add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2 +-lwz r8,0(r30) ; px2 +-andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00 +-add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3 +-lwz r10,4(r30) ; py2 +-mullw r28,r28,r24 ; Applies coef4 on col4 channel 2 +-srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8 +-lwz r29,4(r31) ; py +-add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2 +-rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF) +-stwu r7,4(r4) ; Stores the computed pixel +-bdnz L1 ; Iterate again if needed +-b L3 ;goto end ; If not, returns from the function +- +- +-; if out of range +-L4: +-stwu r18,4(r4) +-lwz r8,0(r30) ; px2 +-lwz r10,4(r30) ; py2 +-lwz r2,0(r31) ; px +-lwz r29,4(r31) ; py +-bdnz L1 +- +- +-L3: +- +-; Restore saved registers and return +-lmw r18,-56(r1) +-blr +- +- +- +- +- +- +- +- +-_ppc_zoom_G4: +- +-; Saves the used non volatile registers in the Mach-O stack s Red-Zone +-stmw r17,-60(r1) +- +-; init +-li r18,0 ; Default value if out of range : 0 (Black) +-mr r11,r10 +-lis r12,0xFF +-mullw r2,r5,r6 ; Number of pixels to compute +-subi r30,r8,0 +-slwi r20,r5,2 +-srawi r19,r20,2 +-ori r12,r12,0xFF +-subi r5,r5,1 +-subi r6,r6,1 +-mtspr ctr,r2 ; Init the loop count (one loop per pixel computed) +-subi r31,r7,0 +-subi r4,r4,4 +-slwi r5,r5,4 +-slwi r6,r6,4 +- +-;pre init for loop +-lwz r2,0(r31) ; px +-lwz r29,4(r31) ; py +-lwz r8,0(r30) ; px2 +-lwz r10,4(r30) ; py2 +- +-;********************* +-lis r17,0x0F01 +- +-L100: +- +-; computes dynamically the position to fetch +-;mullw r8,r8,r29 +-;mullw r2,r2,r29 +-;add r2,r8,r2 +-;srawi r2,r2,17 +- +-sub r8,r8,r2 +-sub r10,r10,r29 +-mullw r8,r8,r9 +-addi r31,r31,8 +-mullw r10,r10,r9 +-addi r30,r30,8 +- +-dst r30,r17,0 +- +-srawi r8,r8,16 +-srawi r10,r10,16 +-add r2,r2,r8 +-add r29,r29,r10 +- +-dst r31,r17,1 +- +-; if px>ax or py>ay goto outofrange +-; computes the attenuation coeffs and the original point address +-rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16) +-cmpl cr6,0,r2,r5 +-rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r29%16)*4 | r10) +-cmpl cr7,0,r29,r6 +-srawi r29,r29,4 ; pos computing +-bge- cr6,L400 +-srawi r2,r2,4 ; pos computing +-mullw r29, r29,r19 ; pos computing +-bge- cr7,L400 +- +-; Channels notation : 00112233 (AARRVVBB) +- +-add r2,r2,r29 ; pos computing +-lwzx r10,r11,r10 ; Loads coefs +-slwi r2,r2,2 ; pos computing +-add r2,r2,r3 ; pos computing +-rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011) +-lwz r25,0(r2) ; Loads col1 -> r25 +-lwz r26,4(r2) ; Loads col2 -> r26 +-rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022) +-rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033) +-add r2,r2,r20 ; Adds one line for future load of col3 and col4 +-and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX +-rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044) +-dst r2,r17,2 +-andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00 +-mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3 +- +- +-; computes final pixel color +-and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX +-lwz r27,0(r2) ; Loads col3 -> r27 +-mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3 +-mullw r25,r25,r21 ; Applies coef1 on col1 channel 2 +-andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00 +-mullw r29,r29,r22 ; Applies coef2 on col2 channel 2 +-lwz r28,4(r2) ; Loads col4 -> r28 +-add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3 +-and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX +-add r25,r25,r29 ; Adds col1 & col2 channel 2 +-mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3 +-andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00 +-mullw r29,r29,r23 ; Applies coef3 on col3 channel 2 +-lwz r2,0(r31) ; px +-add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3 +-and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX +-mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3 +-add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2 +-lwz r8,0(r30) ; px2 +-andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00 +-add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3 +-lwz r10,4(r30) ; py2 +-mullw r28,r28,r24 ; Applies coef4 on col4 channel 2 +-srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8 +-lwz r29,4(r31) ; py +-add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2 +-rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF) +-stwu r7,4(r4) ; Stores the computed pixel +-bdnz L100 ; Iterate again if needed +-b L300 ;goto end ; If not, returns from the function +- +- +-; if out of range +-L400: +-stwu r18,4(r4) +-lwz r8,0(r30) ; px2 +-lwz r10,4(r30) ; py2 +-lwz r2,0(r31) ; px +-lwz r29,4(r31) ; py +-bdnz L100 +- +- +-L300: +- +-; Restore saved registers and return +-lmw r17,-60(r1) +-blr +diff -Naur /home/d4rk/goom2k4-0/src/powerpc/ppc_doubling.s /src/powerpc/ppc_doubling.s +--- /home/d4rk/goom2k4-0/src/powerpc/ppc_doubling.s 2005-02-07 06:46:41.000000000 -0700 ++++ /src/powerpc/ppc_doubling.s 1969-12-31 17:00:00.000000000 -0700 +@@ -1,50 +0,0 @@ +-.section regular,__TEXT +-.globl _ppc_doubling ; name of the function to call by C program +- +-; width (src width)->r3 +-; myx (src) ->r4 +-; myX (dest) ->r5 +-; myX2 (dest + 1 complete line)->r6 +-; heigth (src height)->r7 +-; inc (increment for next line in dest) ->r8 +- +-_ppc_doubling: +- +-mtspr ctr,r3 +- +-addi r4,r4,-4 +-addi r5,r5,-4 +-addi r6,r6,-4 +- +-1:;boucle: +- +-lwzu r10,4(r4) +-stwu r10,4(r5) +-stwu r10,4(r5) +-stwu r10,4(r6) +-stwu r10,4(r6) +- +-bdnz 1boucle +- +-subi r7,r7,1 +-add r5,r5,r8 +-cmpwi cr1,r7,0 +-add r6,r6,r8 +-mtspr ctr,r3 +-bgt cr1,1boucle +- +-blr +- +-;backup +- +-lwzu r10,4(r4) +-stwu r10,4(r5) +-stwu r10,4(r6) +-stwu r10,4(r5) +-stwu r10,4(r6) +- +-lwzu r10,4(r4) +-stwu r10,4(r5) +-stwu r10,4(r6) +-stwu r10,4(r5) +-stwu r10,4(r6) +diff -Naur /home/d4rk/goom2k4-0/src/ppc_drawings.h /src/ppc_drawings.h +--- /home/d4rk/goom2k4-0/src/ppc_drawings.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/ppc_drawings.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,18 +0,0 @@ +-/* +- * ppc_drawings.h +- * Goom +- * +- * Created by Guillaume Borios on Sun Dec 28 2003. +- * Copyright (c) 2003 iOS. All rights reserved. +- * +- */ +- +-/* Generic PowerPC Code */ +-void ppc_brightness_generic(Pixel *src, Pixel *dest, int size, int coeff); +- +-/* G4 Specific PowerPC Code (Possible use of Altivec and Data Streams) */ +-void ppc_brightness_G4(Pixel *src, Pixel *dest, int size, int coeff); +- +-/* G5 Specific PowerPC Code (Possible use of Altivec) */ +-void ppc_brightness_G5(Pixel *src, Pixel *dest, int size, int coeff); +- +diff -Naur /home/d4rk/goom2k4-0/src/ppc_drawings.s /src/ppc_drawings.s +--- /home/d4rk/goom2k4-0/src/ppc_drawings.s 2005-02-07 06:46:41.000000000 -0700 ++++ /src/ppc_drawings.s 1969-12-31 17:00:00.000000000 -0700 +@@ -1,381 +0,0 @@ +-; PowerPC optimized drawing methods for Goom +-; © 2003 Guillaume Borios +-; This Source Code is released under the terms of the General Public License +- +-; Change log : +-; 30 May 2003 : File creation +- +-; Section definition : We use a read only code section for the whole file +-.section __TEXT,__text,regular,pure_instructions +- +- +-; -------------------------------------------------------------------------------------- +-; Single 32b pixel drawing macros +-; Usage : +-; DRAWMETHOD_XXXX_MACRO *pixelIN, *pixelOUT, COLOR, WR1, WR2, WR3, WR4 +-; Only the work registers (WR) can be touched by the macros +-; +-; Available methods : +-; DRAWMETHOD_DFLT_MACRO : Default drawing method (Actually OVRW) +-; DRAWMETHOD_PLUS_MACRO : RVB Saturated per channel addition (SLOWEST) +-; DRAWMETHOD_HALF_MACRO : 50% Transparency color drawing +-; DRAWMETHOD_OVRW_MACRO : Direct COLOR drawing (FASTEST) +-; DRAWMETHOD_B_OR_MACRO : Bitwise OR +-; DRAWMETHOD_BAND_MACRO : Bitwise AND +-; DRAWMETHOD_BXOR_MACRO : Bitwise XOR +-; DRAWMETHOD_BNOT_MACRO : Bitwise NOT +-; -------------------------------------------------------------------------------------- +- +-.macro DRAWMETHOD_OVRW_MACRO +- stw $2,0($1) ;; *$1 <- $2 +-.endmacro +- +-.macro DRAWMETHOD_B_OR_MACRO +- lwz $3,0($0) ;; $3 <- *$0 +- or $3,$3,$2 ;; $3 <- $3 | $2 +- stw $3,0($1) ;; *$1 <- $3 +-.endmacro +- +-.macro DRAWMETHOD_BAND_MACRO +- lwz $3,0($0) ;; $3 <- *$0 +- and $3,$3,$2 ;; $3 <- $3 & $2 +- stw $3,0($1) ;; *$1 <- $3 +-.endmacro +- +-.macro DRAWMETHOD_BXOR_MACRO +- lwz $3,0($0) ;; $3 <- *$0 +- xor $3,$3,$2 ;; $3 <- $3 ^ $2 +- stw $3,0($1) ;; *$1 <- $3 +-.endmacro +- +-.macro DRAWMETHOD_BNOT_MACRO +- lwz $3,0($0) ;; $3 <- *$0 +- nand $3,$3,$3 ;; $3 <- ~$3 +- stw $3,0($1) ;; *$1 <- $3 +-.endmacro +- +-.macro DRAWMETHOD_PLUS_MACRO +- lwz $4,0($0) ;; $4 <- *$0 +- andi. $3,$4,0xFF00 ;; $3 <- $4 & 0x0000FF00 +- andi. $5,$2,0xFF00 ;; $5 <- $2 & 0x0000FF00 +- add $3,$3,$5 ;; $3 <- $3 + $5 +- rlwinm $5,$3,15,0,0 ;; $5 <- 0 | ($3[15] << 15) +- srawi $5,$5,23 ;; $5 <- $5 >> 23 (algebraic for sign extension) +- or $3,$3,$5 ;; $3 <- $3 | $5 +- lis $5,0xFF ;; $5 <- 0x00FF00FF +- addi $5,$5,0xFF +- and $4,$4,$5 ;; $4 <- $4 & $5 +- and $6,$2,$5 ;; $6 <- $2 & $5 +- add $4,$4,$6 ;; $4 <- $4 + $6 +- rlwinm $6,$4,7,0,0 ;; $6 <- 0 | ($4[7] << 7) +- srawi $6,$6,15 ;; $6 <- $6 >> 15 (algebraic for sign extension) +- rlwinm $5,$4,23,0,0 ;; $5 <- 0 | ($4[23] << 23) +- srawi $5,$5,31 ;; $5 <- $5 >> 31 (algebraic for sign extension) +- rlwimi $6,$5,0,24,31 ;; $6[24..31] <- $5[24..31] +- or $4,$4,$6 ;; $4 <- $4 | $6 +- rlwimi $4,$3,0,16,23 ;; $4[16..23] <- $3[16..23] +- stw $4,0($1) ;; *$1 <- $4 +-.endmacro +- +-.macro DRAWMETHOD_HALF_MACRO +- lwz $4,0($0) ;; $4 <- *$0 +- andi. $3,$4,0xFF00 ;; $3 <- $4 & 0x0000FF00 +- andi. $5,$2,0xFF00 ;; $5 <- $2 & 0x0000FF00 +- add $3,$3,$5 ;; $3 <- $3 + $5 +- lis $5,0xFF ;; $5 <- 0x00FF00FF +- addi $5,$5,0xFF +- and $4,$4,$5 ;; $4 <- $4 & $5 +- and $5,$2,$5 ;; $5 <- $2 & $5 +- add $4,$4,$5 ;; $4 <- $4 + $5 +- srwi $4,$4,1 ;; $4 <- $4 >> 1 +- rlwimi $4,$3,31,16,23 ;; $4[16..23] <- $3[15..22] +- stw $4,0($1) ;; *$1 <- $4 +-.endmacro +- +-.macro DRAWMETHOD_DFLT_MACRO +- DRAWMETHOD_PLUS_MACRO +-.endmacro +- +-; -------------------------------------------------------------------------------------- +- +- +- +-; ************************************************************************************** +-; void DRAWMETHOD_PLUS_PPC(unsigned int * buf, unsigned int _col); +-; void DRAWMETHOD_PLUS_2_PPC(unsigned * in, unsigned int * out, unsigned int _col); +-; ************************************************************************************** +-.globl _DRAWMETHOD_PLUS_2_PPC +-.align 3 +-_DRAWMETHOD_PLUS_2_PPC: +- DRAWMETHOD_PLUS_MACRO r3,r4,r5,r6,r7,r8,r9 +- blr ;; return +- +-.globl _DRAWMETHOD_PLUS_PPC +-.align 3 +-_DRAWMETHOD_PLUS_PPC: +- DRAWMETHOD_PLUS_MACRO r3,r3,r4,r5,r6,r7,r9 +- blr ;; return +- +- +-; ************************************************************************************** +-; void DRAWMETHOD_HALF_PPC(unsigned int * buf, unsigned int _col); +-; void DRAWMETHOD_HALF_2_PPC(unsigned * in, unsigned int * out, unsigned int _col); +-; ************************************************************************************** +-.globl _DRAWMETHOD_HALF_2_PPC +-.align 3 +-_DRAWMETHOD_HALF_2_PPC: +- DRAWMETHOD_HALF_MACRO r3,r4,r5,r6,r7,r8 +- blr ;; return +- +-.globl _DRAWMETHOD_HALF_PPC +-.align 3 +-_DRAWMETHOD_HALF_PPC: +- DRAWMETHOD_HALF_MACRO r3,r3,r4,r5,r6,r7 +- blr ;; return +- +- +-; ************************************************************************************** +-; void DRAW_LINE_PPC(unsigned int *data, int x1, int y1, int x2, int y2, unsigned int col, +-; unsigned int screenx, unsigned int screeny) +-; ************************************************************************************** +-.globl _DRAW_LINE_PPC +-.align 3 +-_DRAW_LINE_PPC: +- ;; NOT IMPLEMENTED YET +- blr ;; return +- +- +-; ************************************************************************************** +-; void _ppc_brightness(Pixel * src, Pixel * dest, unsigned int size, unsigned int coeff) +-; ************************************************************************************** +- +- +-.const +-.align 4 +-vectorZERO: +- .long 0,0,0,0 +- .long 0x10101000, 0x10101001, 0x10101002, 0x10101003 +- .long 0x10101004, 0x10101005, 0x10101006, 0x10101007 +- .long 0x10101008, 0x10101009, 0x1010100A, 0x1010100B +- .long 0x1010100C, 0x1010100D, 0x1010100E, 0x1010100F +- +- +-.section __TEXT,__text,regular,pure_instructions +- +-.globl _ppc_brightness_G4 +-.align 3 +-_ppc_brightness_G4: +- +- +-;; PowerPC Altivec code +- srwi r5,r5,2 +- mtctr r5 +- +-;;vrsave +- mfspr r11,256 +- lis r12,0xCFFC +- mtspr 256,r12 +- +- mflr r0 +- bcl 20,31,"L00000000001$pb" +-"L00000000001$pb": +- mflr r10 +- mtlr r0 +- +- addis r9,r10,ha16(vectorZERO-"L00000000001$pb") +- addi r9,r9,lo16(vectorZERO-"L00000000001$pb") +- +- vxor v0,v0,v0 ;; V0 = NULL vector +- +- addi r9,r9,16 +- lvx v10,0,r9 +- addi r9,r9,16 +- lvx v11,0,r9 +- addi r9,r9,16 +- lvx v12,0,r9 +- addi r9,r9,16 +- lvx v13,0,r9 +- +- addis r9,r10,ha16(vectortmpwork-"L00000000001$pb") +- addi r9,r9,lo16(vectortmpwork-"L00000000001$pb") +- stw r6,0(r9) +- li r6,8 +- stw r6,4(r9) +- lvx v9,0,r9 +- li r9,128 +- vspltw v8,v9,0 +- vspltw v9,v9,1 +- +-;; elt counter +- li r9,0 +- lis r7,0x0F01 +- b L7 +-.align 4 +-L7: +- lvx v1,r9,r3 +- +- vperm v4,v1,v0,v10 +- ;********************* +- add r10,r9,r3 +- ;********************* +- vperm v5,v1,v0,v11 +- vperm v6,v1,v0,v12 +- vperm v7,v1,v0,v13 +- +- vmulouh v4,v4,v8 +- ;********************* +- dst r10,r7,3 +- ;********************* +- vmulouh v5,v5,v8 +- vmulouh v6,v6,v8 +- vmulouh v7,v7,v8 +- vsrw v4,v4,v9 +- vsrw v5,v5,v9 +- vsrw v6,v6,v9 +- vsrw v7,v7,v9 +- +- vpkuwus v4,v4,v5 +- vpkuwus v6,v6,v7 +- vpkuhus v1,v4,v6 +- +- stvx v1,r9,r4 +- addi r9,r9,16 +- +- bdnz L7 +- +- mtspr 256,r11 +- blr +- +- +-.globl _ppc_brightness_G5 +-.align 3 +-_ppc_brightness_G5: +- +-;; PowerPC Altivec G5 code +- srwi r5,r5,2 +- mtctr r5 +- +-;;vrsave +- mfspr r11,256 +- lis r12,0xCFFC +- mtspr 256,r12 +- +- mflr r0 +- bcl 20,31,"L00000000002$pb" +-"L00000000002$pb": +- mflr r10 +- mtlr r0 +- +- addis r9,r10,ha16(vectorZERO-"L00000000002$pb") +- addi r9,r9,lo16(vectorZERO-"L00000000002$pb") +- +- vxor v0,v0,v0 ;; V0 = NULL vector +- +- addi r9,r9,16 +- lvx v10,0,r9 +- addi r9,r9,16 +- lvx v11,0,r9 +- addi r9,r9,16 +- lvx v12,0,r9 +- addi r9,r9,16 +- lvx v13,0,r9 +- +- addis r9,r10,ha16(vectortmpwork-"L00000000002$pb") +- addi r9,r9,lo16(vectortmpwork-"L00000000002$pb") +- stw r6,0(r9) +- li r6,8 +- stw r6,4(r9) +- lvx v9,0,r9 +- li r9,128 +- vspltw v8,v9,0 +- vspltw v9,v9,1 +- +-;; elt counter +- li r9,0 +- lis r7,0x0F01 +- b L6 +-.align 4 +-L6: +- lvx v1,r9,r3 +- +- vperm v4,v1,v0,v10 +- ;********************* +- add r10,r9,r3 +- ;********************* +- vperm v5,v1,v0,v11 +- vperm v6,v1,v0,v12 +- vperm v7,v1,v0,v13 +- +- vmulouh v4,v4,v8 +- vmulouh v5,v5,v8 +- vmulouh v6,v6,v8 +- vmulouh v7,v7,v8 +- vsrw v4,v4,v9 +- vsrw v5,v5,v9 +- vsrw v6,v6,v9 +- vsrw v7,v7,v9 +- +- vpkuwus v4,v4,v5 +- vpkuwus v6,v6,v7 +- vpkuhus v1,v4,v6 +- +- stvx v1,r9,r4 +- addi r9,r9,16 +- +- bdnz L6 +- +- mtspr 256,r11 +- blr +- +- +-.globl _ppc_brightness_generic +-.align 3 +-_ppc_brightness_generic: +- lis r12,0x00FF +- ori r12,r12,0x00FF +- subi r3,r3,4 +- subi r4,r4,4 +- mtctr r5 +- b L1 +-.align 4 +-L1: +- lwzu r7,4(r3) +- +- rlwinm r8,r7,16,24,31 +- rlwinm r9,r7,24,24,31 +- mullw r8,r8,r6 +- rlwinm r10,r7,0,24,31 +- mullw r9,r9,r6 +- srwi r8,r8,8 +- mullw r10,r10,r6 +- srwi r9,r9,8 +- +- rlwinm. r11,r8,0,0,23 +- beq L2 +- li r8,0xFF +-L2: +- srwi r10,r10,8 +- rlwinm. r11,r9,0,0,23 +- beq L3 +- li r9,0xFF +-L3: +- rlwinm r7,r8,16,8,15 +- rlwinm. r11,r10,0,0,23 +- beq L4 +- li r10,0xFF +-L4: +- rlwimi r7,r9,8,16,23 +- rlwimi r7,r10,0,24,31 +- +- stwu r7,4(r4) +- bdnz L1 +- +- blr +- +- +- +-.static_data +-.align 4 +-vectortmpwork: +- .long 0,0,0,0 +- +diff -Naur /home/d4rk/goom2k4-0/src/ppc_zoom_ultimate.h /src/ppc_zoom_ultimate.h +--- /home/d4rk/goom2k4-0/src/ppc_zoom_ultimate.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/ppc_zoom_ultimate.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,14 +0,0 @@ +-/* +- * ppc_zoom_ultimate.h +- * Goom +- * +- * Created by Guillaume Borios on Sun Dec 28 2003. +- * Copyright (c) 2003 iOS. All rights reserved. +- * +- */ +- +-/* Generic PowerPC Code */ +-void ppc_zoom_generic (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); +- +-/* G4 Specific PowerPC Code (Possible use of Altivec and Data Streams) */ +-void ppc_zoom_G4 (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); +\ No newline at end of file +diff -Naur /home/d4rk/goom2k4-0/src/ppc_zoom_ultimate.s /src/ppc_zoom_ultimate.s +--- /home/d4rk/goom2k4-0/src/ppc_zoom_ultimate.s 2005-02-07 06:46:41.000000000 -0700 ++++ /src/ppc_zoom_ultimate.s 1969-12-31 17:00:00.000000000 -0700 +@@ -1,323 +0,0 @@ +-; PowerPC optimized zoom for Goom +-; © 2001-2003 Guillaume Borios +-; This Source Code is released under the terms of the General Public License +- +-; Change log : +-; 21 Dec 2003 : Use of altivec is now determined with a parameter +- +-; Section definition : We use a read only section +-.text +- +-; name of the function to call by C program : ppc_zoom +-; We declare this label as a global to extend its scope outside this file +-.globl _ppc_zoom_generic +-.globl _ppc_zoom_G4 +- +-; Description : +-; This routine dynamically computes and applies a zoom filter +- +-; parameters : +-; r3 <=> unsigned int sizeX (in pixels) +-; r4 <=> unsigned int sizeY (in pixels) +-; r5 <=> unsigned int * frompixmap +-; r6 <=> unsigned int * topixmap +-; r7 <=> unsigned int * brutS +-; r8 <=> unsigned int * brutD +-; r9 <=> unsigned int buffratio +-; r10 <=> int [16][16] precalccoeffs +- +-; globals after init +-; r5 <=> frompixmap - 1 byte needed for preincremental fetch (replaces r5) +-; r6 <=> topixmap - 1 byte needed for preincremental fetch (replaces r6) +-; r3 <=> ax = x max in 16th of pixels (replaces old r3) +-; r4 <=> ay = y max in 16th of pixels (replaces old r4) +-; r20 <=> row size in bytes +-; r12 <=> 0xFF00FF (mask for parallel 32 bits pixs computing) +-; r30 <=> brutS - 1 byte needed for preincremental fetch (replaces r7) +-; r31 <=> brutD - 1 byte needed for preincremental fetch (replaces r8) +- +-; ABI notes : +-; r1 is the Stack Pointer (SP) => Do not use +-; r13..r31 are non-volatiles => Do not use +- +-_ppc_zoom_generic: +- +-; Saves the used non volatile registers in the Mach-O stack s Red-Zone +-stmw r18,-56(r1) +- +-; init +-li r18,0 ; Default value if out of range : 0 (Black) +-mr r11,r10 +-lis r12,0xFF +-mullw r2,r3,r4 ; Number of pixels to compute +-subi r30,r8,0 +-slwi r20,r3,2 +-srawi r19,r20,2 +-ori r12,r12,0xFF +-subi r3,r3,1 +-subi r4,r4,1 +-mtspr ctr,r2 ; Init the loop count (one loop per pixel computed) +-subi r31,r7,0 +-subi r6,r6,4 +-slwi r3,r3,4 +-slwi r4,r4,4 +- +-;pre init for loop +-lwz r2,0(r31) ; px +-lwz r29,4(r31) ; py +-lwz r8,0(r30) ; px2 +-lwz r10,4(r30) ; py2 +- +-b L1 +-.align 5 +-L1: +- +-; computes dynamically the position to fetch +-sub r8,r8,r2 +-sub r10,r10,r29 +-mullw r8,r8,r9 +-addi r31,r31,8 +-mullw r10,r10,r9 +-addi r30,r30,8 +- +-srawi r8,r8,16 +-srawi r10,r10,16 +-add r2,r2,r8 +-add r29,r29,r10 +- +-; if px>ax or py>ay goto outofrange +-; computes the attenuation coeffs and the original point address +-rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16) +-cmpl cr4,0,r2,r3 +-rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r10%16)*4 | r10) +-cmpl cr7,0,r29,r4 +-srawi r29,r29,4 ; pos computing +-bge- cr4,L4 +-srawi r2,r2,4 ; pos computing +-mullw r29, r29,r19 ; pos computing +-bge- cr7,L4 +- +-; Channels notation : 00112233 (AARRVVBB) +- +-add r2,r2,r29 ; pos computing +-lwzx r10,r11,r10 ; Loads coefs +-slwi r2,r2,2 ; pos computing +-add r2,r2,r5 ; pos computing +-rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011) +-lwz r25,0(r2) ; Loads col1 -> r25 +-lwz r26,4(r2) ; Loads col2 -> r26 +-rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022) +-rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033) +-add r2,r2,r20 ; Adds one line for future load of col3 and col4 +-and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX +-rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044) +-andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00 +-mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3 +- +- +-; computes final pixel color +-and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX +-lwz r27,0(r2) ; Loads col3 -> r27 +-mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3 +-mullw r25,r25,r21 ; Applies coef1 on col1 channel 2 +-andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00 +-mullw r29,r29,r22 ; Applies coef2 on col2 channel 2 +-lwz r28,4(r2) ; Loads col4 -> r28 +-add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3 +-and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX +-add r25,r25,r29 ; Adds col1 & col2 channel 2 +-mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3 +-andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00 +-mullw r29,r29,r23 ; Applies coef3 on col3 channel 2 +-lwz r2,0(r31) ; px +-add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3 +-and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX +-mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3 +-add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2 +-lwz r8,0(r30) ; px2 +-andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00 +-add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3 +-lwz r10,4(r30) ; py2 +-mullw r28,r28,r24 ; Applies coef4 on col4 channel 2 +-srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8 +-lwz r29,4(r31) ; py +-add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2 +-rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF) +-stwu r7,4(r6) ; Stores the computed pixel +-bdnz L1 ; Iterate again if needed +-b L3 ;goto end ; If not, returns from the function +- +- +-; if out of range +-L4: +-stwu r18,4(r6) +-lwz r8,0(r30) ; px2 +-lwz r10,4(r30) ; py2 +-lwz r2,0(r31) ; px +-lwz r29,4(r31) ; py +-bdnz L1 +- +- +-L3: +- +-; Restore saved registers and return +-lmw r18,-56(r1) +-blr +- +- +- +- +- +- +- +- +-_ppc_zoom_G4: +- +-; Saves the used non volatile registers in the Mach-O stack s Red-Zone +-stmw r17,-60(r1) +- +-; init +-li r18,0 ; Default value if out of range : 0 (Black) +-mr r11,r10 +-lis r12,0xFF +-mullw r2,r3,r4 ; Number of pixels to compute +-subi r30,r8,0 +-slwi r20,r3,2 +-srawi r19,r20,2 +-ori r12,r12,0xFF +-subi r3,r3,1 +-subi r4,r4,1 +-mtspr ctr,r2 ; Init the loop count (one loop per pixel computed) +-subi r31,r7,0 +-subi r6,r6,4 +-slwi r3,r3,4 +-slwi r4,r4,4 +- +-;pre init for loop +-lwz r2,0(r31) ; px +-lwz r29,4(r31) ; py +-lwz r8,0(r30) ; px2 +-lwz r10,4(r30) ; py2 +- +-;********************* +-lis r17,0x0F01 +- +-b L100 +-.align 5 +-L100: +- +-addi r6,r6,4 +- +-; Optimization to ensure the destination buffer +-; won't be loaded into the data cache +-rlwinm. r0,r6,0,27,31 +-bne+ L500 +-dcbz 0,r6 +-;dcba 0,r6 +-L500: +- +-; computes dynamically the position to fetch +-;mullw r8,r8,r29 +-;mullw r2,r2,r29 +-;add r2,r8,r2 +-;srawi r2,r2,17 +- +-sub r8,r8,r2 +-sub r10,r10,r29 +-mullw r8,r8,r9 +-addi r31,r31,8 +-mullw r10,r10,r9 +-addi r30,r30,8 +- +-dst r30,r17,0 +- +-srawi r8,r8,16 +-srawi r10,r10,16 +-add r2,r2,r8 +-add r29,r29,r10 +- +-dst r31,r17,1 +- +-; if px>ax or py>ay goto outofrange +-; computes the attenuation coeffs and the original point address +-rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16) +-cmpl cr4,0,r2,r3 +-rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r29%16)*4 | r10) +-cmpl cr7,0,r29,r4 +-srawi r29,r29,4 ; pos computing +-bge- cr4,L400 +-srawi r2,r2,4 ; pos computing +-mullw r29, r29,r19 ; pos computing +-bge- cr7,L400 +- +-; Channels notation : 00112233 (AARRVVBB) +- +-add r2,r2,r29 ; pos computing +-lwzx r10,r11,r10 ; Loads coefs +-slwi r2,r2,2 ; pos computing +-add r2,r2,r5 ; pos computing +-rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011) +-lwz r25,0(r2) ; Loads col1 -> r25 +-lwz r26,4(r2) ; Loads col2 -> r26 +-rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022) +-rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033) +-add r2,r2,r20 ; Adds one line for future load of col3 and col4 +-and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX +-rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044) +-dst r2,r17,2 +-rlwinm r25,r25,0,16,23 ; Masks col1 channel 2 : 0x0000XX00 +-;andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00 +-mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3 +- +- +-; computes final pixel color +-and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX +-lwz r27,0(r2) ; Loads col3 -> r27 +-mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3 +-mullw r25,r25,r21 ; Applies coef1 on col1 channel 2 +-rlwinm r29,r26,0,16,23 ; Masks col2 channel 2 : 0x0000XX00 +-;andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00 +-mullw r29,r29,r22 ; Applies coef2 on col2 channel 2 +-lwz r28,4(r2) ; Loads col4 -> r28 +-add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3 +-and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX +-add r25,r25,r29 ; Adds col1 & col2 channel 2 +-mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3 +-rlwinm r29,r27,0,16,23 ; Masks col3 channel 2 : 0x0000XX00 +-;andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00 +-mullw r29,r29,r23 ; Applies coef3 on col3 channel 2 +-lwz r2,0(r31) ; px +-add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3 +-and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX +-mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3 +-add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2 +-lwz r8,0(r30) ; px2 +-rlwinm r28,r28,0,16,23 ; Masks col4 channel 2 : 0x0000XX00 +-;andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00 +-add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3 +-lwz r10,4(r30) ; py2 +-mullw r28,r28,r24 ; Applies coef4 on col4 channel 2 +-srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8 +-lwz r29,4(r31) ; py +-add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2 +-rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF) +-stw r7,0(r6) ; Stores the computed pixel +-bdnz L100 ; Iterate again if needed +-b L300 ;goto end ; If not, returns from the function +- +- +-; if out of range +-L400: +-stw r18,0(r6) +-lwz r8,0(r30) ; px2 +-lwz r10,4(r30) ; py2 +-lwz r2,0(r31) ; px +-lwz r29,4(r31) ; py +-bdnz L100 +- +- +-L300: +- +-; Restore saved registers and return +-lmw r17,-60(r1) +-blr +diff -Naur /home/d4rk/goom2k4-0/src/sound_tester.c /src/sound_tester.c +--- /home/d4rk/goom2k4-0/src/sound_tester.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/sound_tester.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,138 +0,0 @@ +-#include "sound_tester.h" +- +-#include <stdlib.h> +-#include <string.h> +- +-/* some constants */ +-#define BIG_GOOM_DURATION 100 +-#define BIG_GOOM_SPEED_LIMIT 0.1f +- +-#define ACCEL_MULT 0.95f +-#define SPEED_MULT 0.99f +- +- +-void evaluate_sound(gint16 data[2][512], SoundInfo *info) { +- +- int i; +- float difaccel; +- float prevspeed; +- +- /* find the max */ +- int incvar = 0; +- for (i = 0; i < 512; i+=2) { +- if (incvar < data[0][i]) +- incvar = data[0][i]; +- } +- +- if (incvar > info->allTimesMax) +- info->allTimesMax = incvar; +- +- /* volume sonore */ +- info->volume = (float)incvar / (float)info->allTimesMax; +- memcpy(info->samples[0],data[0],512*sizeof(short)); +- memcpy(info->samples[1],data[1],512*sizeof(short)); +- +- difaccel = info->accelvar; +- info->accelvar = info->volume; /* accel entre 0 et 1 */ +- +- /* transformations sur la vitesse du son */ +- if (info->speedvar > 1.0f) +- info->speedvar = 1.0f; +- +- if (info->speedvar < 0.1f) +- info->accelvar *= (1.0f - (float)info->speedvar); +- else if (info->speedvar < 0.3f) +- info->accelvar *= (0.9f - (float)(info->speedvar-0.1f)/2.0f); +- else +- info->accelvar *= (0.8f - (float)(info->speedvar-0.3f)/4.0f); +- +- /* adoucissement de l'acceleration */ +- info->accelvar *= ACCEL_MULT; +- if (info->accelvar < 0) +- info->accelvar = 0; +- +- difaccel = info->accelvar - difaccel; +- if (difaccel < 0) +- difaccel = - difaccel; +- +- /* mise a jour de la vitesse */ +- prevspeed = info->speedvar; +- info->speedvar = (info->speedvar + difaccel * 0.5f) / 2; +- info->speedvar *= SPEED_MULT; +- info->speedvar = (info->speedvar + 3.0f * prevspeed) / 4.0f; +- if (info->speedvar < 0) +- info->speedvar = 0; +- if (info->speedvar > 1) +- info->speedvar = 1; +- +- /* temps du goom */ +- info->timeSinceLastGoom++; +- info->timeSinceLastBigGoom++; +- info->cycle++; +- +- /* detection des nouveaux gooms */ +- if ((info->speedvar > (float)IVAL(info->biggoom_speed_limit_p)/100.0f) +- && (info->accelvar > info->bigGoomLimit) +- && (info->timeSinceLastBigGoom > BIG_GOOM_DURATION)) { +- info->timeSinceLastBigGoom = 0; +- } +- +- if (info->accelvar > info->goom_limit) { +- /* TODO: tester && (info->timeSinceLastGoom > 20)) { */ +- info->totalgoom ++; +- info->timeSinceLastGoom = 0; +- info->goomPower = info->accelvar - info->goom_limit; +- } +- +- if (info->accelvar > info->prov_max) +- info->prov_max = info->accelvar; +- +- if (info->goom_limit>1) +- info->goom_limit=1; +- +- /* toute les 2 secondes : vérifier si le taux de goom est correct +- * et le modifier sinon.. */ +- if (info->cycle % 64 == 0) { +- if (info->speedvar<0.01f) +- info->goom_limit *= 0.91; +- if (info->totalgoom > 4) { +- info->goom_limit+=0.02; +- } +- if (info->totalgoom > 7) { +- info->goom_limit*=1.03f; +- info->goom_limit+=0.03; +- } +- if (info->totalgoom > 16) { +- info->goom_limit*=1.05f; +- info->goom_limit+=0.04; +- } +- if (info->totalgoom == 0) { +- info->goom_limit = info->prov_max - 0.02; +- } +- if ((info->totalgoom == 1) && (info->goom_limit > 0.02)) +- info->goom_limit-=0.01; +- info->totalgoom = 0; +- info->bigGoomLimit = info->goom_limit * (1.0f + (float)IVAL(info->biggoom_factor_p)/500.0f); +- info->prov_max = 0; +- } +- +- /* mise a jour des parametres pour la GUI */ +- FVAL(info->volume_p) = info->volume; +- info->volume_p.change_listener(&info->volume_p); +- FVAL(info->speed_p) = info->speedvar * 4; +- info->speed_p.change_listener(&info->speed_p); +- FVAL(info->accel_p) = info->accelvar; +- info->accel_p.change_listener(&info->accel_p); +- +- FVAL(info->goom_limit_p) = info->goom_limit; +- info->goom_limit_p.change_listener(&info->goom_limit_p); +- FVAL(info->goom_power_p) = info->goomPower; +- info->goom_power_p.change_listener(&info->goom_power_p); +- FVAL(info->last_goom_p) = 1.0-((float)info->timeSinceLastGoom/20.0f); +- info->last_goom_p.change_listener(&info->last_goom_p); +- FVAL(info->last_biggoom_p) = 1.0-((float)info->timeSinceLastBigGoom/40.0f); +- info->last_biggoom_p.change_listener(&info->last_biggoom_p); +- +- /* bigGoomLimit ==goomLimit*9/8+7 ? */ +- } +- +diff -Naur /home/d4rk/goom2k4-0/src/sound_tester.h /src/sound_tester.h +--- /home/d4rk/goom2k4-0/src/sound_tester.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/sound_tester.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,11 +0,0 @@ +-#ifndef _SOUND_TESTER_H +-#define _SOUND_TESTER_H +- +-#include "goom_plugin_info.h" +-#include "goom_config.h" +- +-/** change les donnees du SoundInfo */ +-void evaluate_sound(gint16 data[2][512], SoundInfo *sndInfo); +- +-#endif +- +diff -Naur /home/d4rk/goom2k4-0/src/surf3d.c /src/surf3d.c +--- /home/d4rk/goom2k4-0/src/surf3d.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/surf3d.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,107 +0,0 @@ +-#include "surf3d.h" +-#include "goom_plugin_info.h" +-#include <stdlib.h> +-#include <stdio.h> +-#include <string.h> +- +-grid3d *grid3d_new (int sizex, int defx, int sizez, int defz, v3d center) { +- int x = defx; +- int y = defz; +- grid3d *g = malloc (sizeof(grid3d)); +- surf3d *s = &(g->surf); +- s->nbvertex = x*y; +- s->vertex = malloc (x*y*sizeof(v3d)); +- s->svertex = malloc (x*y*sizeof(v3d)); +- s->center = center; +- +- g->defx=defx; +- g->sizex=sizex; +- g->defz=defz; +- g->sizez=sizez; +- g->mode=0; +- +- while (y) { +- --y; +- x = defx; +- while (x) { +- --x; +- s->vertex[x+defx*y].x = (float)(x-defx/2)*sizex/defx; +- s->vertex[x+defx*y].y = 0; +- s->vertex[x+defx*y].z = (float)(y-defz/2)*sizez/defz; +- } +- } +- return g; +-} +- +-void grid3d_draw (PluginInfo *plug, grid3d *g, int color, int colorlow, +- int dist, Pixel *buf, Pixel *back, int W,int H) { +- +- int x; +- v2d v2,v2x; +- +- v2d *v2_array = malloc(g->surf.nbvertex * sizeof(v2d)); +- v3d_to_v2d(g->surf.svertex, g->surf.nbvertex, W, H, dist, v2_array); +- +- for (x=0;x<g->defx;x++) { +- int z; +- v2x = v2_array[x]; +- +- for (z=1;z<g->defz;z++) { +- v2 = v2_array[z*g->defx + x]; +- if (((v2.x != -666) || (v2.y!=-666)) +- && ((v2x.x != -666) || (v2x.y!=-666))) { +- plug->methods.draw_line (buf,v2x.x,v2x.y,v2.x,v2.y, colorlow, W, H); +- plug->methods.draw_line (back,v2x.x,v2x.y,v2.x,v2.y, color, W, H); +- } +- v2x = v2; +- } +- } +- +- free(v2_array); +-} +- +-void surf3d_rotate (surf3d *s, float angle) { +- int i; +- float cosa; +- float sina; +- SINCOS(angle,sina,cosa); +- for (i=0;i<s->nbvertex;i++) { +- Y_ROTATE_V3D(s->vertex[i],s->svertex[i],cosa,sina); +- } +-} +- +-void surf3d_translate (surf3d *s) { +- int i; +- for (i=0;i<s->nbvertex;i++) { +- TRANSLATE_V3D(s->center,s->svertex[i]); +- } +-} +- +-void grid3d_update (grid3d *g, float angle, float *vals, float dist) { +- int i; +- float cosa; +- float sina; +- surf3d *s = &(g->surf); +- v3d cam = s->center; +- cam.z += dist; +- +- SINCOS((angle/4.3f),sina,cosa); +- cam.y += sina*2.0f; +- SINCOS(angle,sina,cosa); +- +- if (g->mode==0) { +- if (vals) +- for (i=0;i<g->defx;i++) +- s->vertex[i].y = s->vertex[i].y*0.2 + vals[i]*0.8; +- +- for (i=g->defx;i<s->nbvertex;i++) { +- s->vertex[i].y *= 0.255f; +- s->vertex[i].y += (s->vertex[i-g->defx].y * 0.777f); +- } +- } +- +- for (i=0;i<s->nbvertex;i++) { +- Y_ROTATE_V3D(s->vertex[i],s->svertex[i],cosa,sina); +- TRANSLATE_V3D(cam,s->svertex[i]); +- } +-} +diff -Naur /home/d4rk/goom2k4-0/src/surf3d.h /src/surf3d.h +--- /home/d4rk/goom2k4-0/src/surf3d.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/surf3d.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,38 +0,0 @@ +-#ifndef _SURF3D_H +-#define _SURF3D_H +- +-#include "v3d.h" +-#include "goom_graphic.h" +-#include "goom_typedefs.h" +- +-typedef struct { +- v3d *vertex; +- v3d *svertex; +- int nbvertex; +- +- v3d center; +-} surf3d; +- +-typedef struct { +- surf3d surf; +- +- int defx; +- int sizex; +- int defz; +- int sizez; +- int mode; +-} grid3d; +- +-/* hi-level */ +- +-/* works on grid3d */ +-grid3d *grid3d_new (int sizex, int defx, int sizez, int defz, v3d center); +-void grid3d_update (grid3d *s, float angle, float *vals, float dist); +- +-/* low level */ +-void surf3d_draw (surf3d *s, int color, int dist, int *buf, int *back, int W,int H); +-void grid3d_draw (PluginInfo *plug, grid3d *g, int color, int colorlow, int dist, Pixel *buf, Pixel *back, int W,int H); +-void surf3d_rotate (surf3d *s, float angle); +-void surf3d_translate (surf3d *s); +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/surf3d.s /src/surf3d.s +--- /home/d4rk/goom2k4-0/src/surf3d.s 2005-02-07 06:46:41.000000000 -0700 ++++ /src/surf3d.s 1969-12-31 17:00:00.000000000 -0700 +@@ -1,484 +0,0 @@ +- .file "surf3d.c" +- .version "01.01" +-gcc2_compiled.: +-.text +- .align 4 +-.globl grid3d_new +- .type grid3d_new,@function +-grid3d_new: +- pushl %ebp +- movl %esp,%ebp +- subl $44,%esp +- pushl %edi +- pushl %esi +- pushl %ebx +- movl 20(%ebp),%eax +- movl 12(%ebp),%esi +- movl %eax,-8(%ebp) +- addl $-12,%esp +- pushl $44 +- call malloc +- movl %esi,%edx +- imull -8(%ebp),%edx +- movl %eax,%edi +- movl %edx,-12(%ebp) +- leal (%edx,%edx,2),%ebx +- movl %edx,8(%edi) +- addl $-12,%esp +- sall $2,%ebx +- pushl %ebx +- call malloc +- addl $32,%esp +- movl %eax,(%edi) +- addl $-12,%esp +- pushl %ebx +- call malloc +- movl %eax,4(%edi) +- movl 24(%ebp),%eax +- movl %eax,12(%edi) +- movl 28(%ebp),%eax +- movl %eax,16(%edi) +- movl 32(%ebp),%eax +- movl %eax,20(%edi) +- movl 8(%ebp),%eax +- movl %eax,28(%edi) +- movl %esi,24(%edi) +- movl -8(%ebp),%edx +- movl 16(%ebp),%eax +- movl %edx,32(%edi) +- movl %eax,36(%edi) +- movl $0,40(%edi) +- testl %edx,%edx +- je .L480 +- movl %esi,%eax +- movl %esi,-28(%ebp) +- shrl $31,%eax +- addl %eax,%esi +- movl -8(%ebp),%eax +- shrl $31,%eax +- addl -8(%ebp),%eax +- movl -12(%ebp),%edx +- sarl $1,%eax +- movl %edx,-24(%ebp) +- negl -28(%ebp) +- movl %esi,-16(%ebp) +- movl %eax,-20(%ebp) +- .p2align 4,,7 +-.L481: +- movl -28(%ebp),%eax +- addl %eax,-24(%ebp) +- decl -8(%ebp) +- movl 12(%ebp),%esi +- testl %esi,%esi +- je .L479 +- movl -8(%ebp),%eax +- subl -20(%ebp),%eax +- movl %eax,-4(%ebp) +- fildl -4(%ebp) +- movl %esi,-4(%ebp) +- movl -24(%ebp),%edx +- leal (%edx,%esi),%eax +- movl -16(%ebp),%ebx +- fildl 16(%ebp) +- leal (%eax,%eax,2),%eax +- sarl $1,%ebx +- leal 0(,%eax,4),%ecx +- fmulp %st,%st(1) +- fildl 20(%ebp) +- fdivrp %st,%st(1) +- fildl 8(%ebp) +- fildl -4(%ebp) +- jmp .L484 +-.L487: +- fxch %st(2) +- .p2align 4,,7 +-.L484: +- decl %esi +- movl %esi,%eax +- movl (%edi),%edx +- subl %ebx,%eax +- movl %eax,-4(%ebp) +- fildl -4(%ebp) +- addl $-12,%ecx +- fmul %st(2),%st +- fdiv %st(1),%st +- fstps (%edx,%ecx) +- fxch %st(2) +- movl (%edi),%eax +- movl $0,4(%eax,%ecx) +- movl (%edi),%eax +- fsts 8(%eax,%ecx) +- testl %esi,%esi +- jne .L487 +- fstp %st(0) +- fstp %st(0) +- fstp %st(0) +-.L479: +- cmpl $0,-8(%ebp) +- jne .L481 +-.L480: +- leal -56(%ebp),%esp +- popl %ebx +- movl %edi,%eax +- popl %esi +- popl %edi +- leave +- ret +-.Lfe1: +- .size grid3d_new,.Lfe1-grid3d_new +-.section .rodata +- .align 8 +-.LC48: +- .long 0x0,0x3fe00000 +- .align 4 +-.LC49: +- .long 0x3f19999a +- .align 4 +-.LC50: +- .long 0x3ee3d70a +-.text +- .align 4 +-.globl grid3d_update +- .type grid3d_update,@function +-grid3d_update: +- pushl %ebp +- movl %esp,%ebp +- subl $32,%esp +- pushl %esi +- pushl %ebx +- flds 12(%ebp) +- movl 8(%ebp),%ebx +- movl 16(%ebp),%ecx +- fld %st(0) +-#APP +- fsin +-#NO_APP +- fstps -4(%ebp) +- flds -4(%ebp) +- fxch %st(1) +-#APP +- fcos +-#NO_APP +- fstps -4(%ebp) +- flds -4(%ebp) +- cmpl $0,40(%ebx) +- jne .L519 +- testl %ecx,%ecx +- je .L520 +- xorl %esi,%esi +- cmpl 24(%ebx),%esi +- jge .L520 +- fldl .LC48 +- xorl %edx,%edx +- .p2align 4,,7 +-.L524: +- movl (%ebx),%eax +- fld %st(0) +- fld %st(1) +- fxch %st(1) +- fmuls 4(%eax,%edx) +- fxch %st(1) +- fmuls (%ecx,%esi,4) +- faddp %st,%st(1) +- incl %esi +- fstps 4(%eax,%edx) +- addl $12,%edx +- cmpl 24(%ebx),%esi +- jl .L524 +- fstp %st(0) +-.L520: +- movl 24(%ebx),%esi +- cmpl 8(%ebx),%esi +- jge .L519 +- leal (%esi,%esi,2),%eax +- flds .LC49 +- flds .LC50 +- leal 0(,%eax,4),%ecx +- .p2align 4,,7 +-.L529: +- movl (%ebx),%eax +- flds 4(%eax,%ecx) +- fmul %st(2),%st +- fstps 4(%eax,%ecx) +- movl %esi,%eax +- subl 24(%ebx),%eax +- movl (%ebx),%edx +- leal (%eax,%eax,2),%eax +- flds 4(%edx,%eax,4) +- fmul %st(1),%st +- fadds 4(%edx,%ecx) +- incl %esi +- fstps 4(%edx,%ecx) +- addl $12,%ecx +- cmpl 8(%ebx),%esi +- jl .L529 +- fstp %st(0) +- fstp %st(0) +-.L519: +- xorl %esi,%esi +- cmpl 8(%ebx),%esi +- jge .L536 +- xorl %ecx,%ecx +- .p2align 4,,7 +-.L534: +- movl (%ebx),%eax +- flds (%eax,%ecx) +- flds 8(%eax,%ecx) +- fmul %st(2),%st +- fxch %st(1) +- fmul %st(3),%st +- fsubp %st,%st(1) +- movl 4(%ebx),%edx +- incl %esi +- fstps (%edx,%ecx) +- movl (%ebx),%eax +- flds (%eax,%ecx) +- flds 8(%eax,%ecx) +- fxch %st(1) +- fmul %st(2),%st +- fxch %st(1) +- fmul %st(3),%st +- faddp %st,%st(1) +- movl 4(%ebx),%edx +- fstps 8(%edx,%ecx) +- movl (%ebx),%eax +- flds 4(%eax,%ecx) +- movl 4(%ebx),%edx +- fstps 4(%edx,%ecx) +- movl 4(%ebx),%eax +- flds (%eax,%ecx) +- fadds 12(%ebx) +- fstps (%eax,%ecx) +- movl 4(%ebx),%eax +- flds 4(%eax,%ecx) +- fadds 16(%ebx) +- fstps 4(%eax,%ecx) +- movl 4(%ebx),%eax +- flds 8(%eax,%ecx) +- fadds 20(%ebx) +- fstps 8(%eax,%ecx) +- addl $12,%ecx +- cmpl 8(%ebx),%esi +- jl .L534 +-.L536: +- fstp %st(0) +- fstp %st(0) +- popl %ebx +- popl %esi +- leave +- ret +-.Lfe2: +- .size grid3d_update,.Lfe2-grid3d_update +-.section .rodata +- .align 4 +-.LC51: +- .long 0x40000000 +- .align 8 +-.LC52: +- .long 0x0,0x42380000 +-.text +- .align 4 +-.globl surf3d_draw +- .type surf3d_draw,@function +-surf3d_draw: +- pushl %ebp +- movl %esp,%ebp +- subl $60,%esp +- pushl %edi +- pushl %esi +- pushl %ebx +- movl $0,-20(%ebp) +- movl -20(%ebp),%edx +- movl 8(%ebp),%eax +- cmpl 8(%eax),%edx +- jge .L493 +- fldl .LC52 +- flds .LC51 +- xorl %edi,%edi +- .p2align 4,,7 +-.L495: +- movl 8(%ebp),%eax +- movl 4(%eax),%eax +- movl %eax,-36(%ebp) +- fcoms 8(%eax,%edi) +- fnstsw %ax +- andb $69,%ah +- cmpb $1,%ah +- jne .L496 +- fildl 16(%ebp) +- movl -36(%ebp),%edx +- fld %st(0) +- fmuls (%edx,%edi) +- fdivs 8(%edx,%edi) +- fld %st(3) +- faddp %st,%st(1) +- fstpl -32(%ebp) +- movl -32(%ebp),%eax +- movl -28(%ebp),%edx +- movl %eax,-40(%ebp) +- sarl $16,-40(%ebp) +- movl -36(%ebp),%edx +- fmuls 4(%edx,%edi) +- fdivs 8(%edx,%edi) +- movl -40(%ebp),%ecx +- fld %st(2) +- faddp %st,%st(1) +- fstpl -32(%ebp) +- movl -32(%ebp),%eax +- movl -28(%ebp),%edx +- movl %eax,-44(%ebp) +- movl 28(%ebp),%eax +- sarl $1,%eax +- addl %eax,%ecx +- movl 32(%ebp),%eax +- sarl $16,-44(%ebp) +- sarl $1,%eax +- movl %ecx,%ebx +- subl -44(%ebp),%eax +- movl %eax,%esi +- cmpl 28(%ebp),%ebx +- jge .L496 +- testl %ecx,%ecx +- jl .L496 +- cmpl 32(%ebp),%esi +- jge .L496 +- testl %eax,%eax +- jge .L499 +-.L496: +- xorl %esi,%esi +- xorl %ebx,%ebx +-.L499: +- movl 20(%ebp),%eax +- movl %ebx,%edx +- leal (%eax,%edx,4),%edx +- movl 28(%ebp),%eax +- imull %esi,%eax +- leal (%edx,%eax,4),%eax +- testl %ebx,%ebx +- je .L494 +- testl %esi,%esi +- je .L494 +-#APP +- movd (%eax), %mm0 +- paddusb 12(%ebp), %mm0 +- movd %mm0, (%eax) +-#NO_APP +-.L494: +- incl -20(%ebp) +- addl $12,%edi +- movl -20(%ebp),%eax +- movl 8(%ebp),%edx +- cmpl 8(%edx),%eax +- jl .L495 +- fstp %st(0) +- fstp %st(0) +-.L493: +- popl %ebx +- popl %esi +- popl %edi +- leave +- ret +-.Lfe3: +- .size surf3d_draw,.Lfe3-surf3d_draw +- .align 4 +-.globl surf3d_rotate +- .type surf3d_rotate,@function +-surf3d_rotate: +- pushl %ebp +- movl %esp,%ebp +- subl $32,%esp +- pushl %esi +- pushl %ebx +- flds 12(%ebp) +- movl 8(%ebp),%ebx +- fld %st(0) +-#APP +- fsin +-#NO_APP +- fstps -4(%ebp) +- flds -4(%ebp) +- fxch %st(1) +-#APP +- fcos +-#NO_APP +- fstps -4(%ebp) +- xorl %esi,%esi +- flds -4(%ebp) +- cmpl 8(%ebx),%esi +- jge .L537 +- xorl %ecx,%ecx +- .p2align 4,,7 +-.L508: +- movl (%ebx),%eax +- flds (%eax,%ecx) +- flds 8(%eax,%ecx) +- fmul %st(2),%st +- fxch %st(1) +- fmul %st(3),%st +- fsubp %st,%st(1) +- movl 4(%ebx),%edx +- incl %esi +- fstps (%edx,%ecx) +- movl (%ebx),%eax +- flds (%eax,%ecx) +- flds 8(%eax,%ecx) +- fxch %st(1) +- fmul %st(2),%st +- fxch %st(1) +- fmul %st(3),%st +- faddp %st,%st(1) +- movl 4(%ebx),%edx +- fstps 8(%edx,%ecx) +- movl (%ebx),%eax +- flds 4(%eax,%ecx) +- movl 4(%ebx),%edx +- fstps 4(%edx,%ecx) +- addl $12,%ecx +- cmpl 8(%ebx),%esi +- jl .L508 +-.L537: +- fstp %st(0) +- fstp %st(0) +- popl %ebx +- popl %esi +- leave +- ret +-.Lfe4: +- .size surf3d_rotate,.Lfe4-surf3d_rotate +- .align 4 +-.globl surf3d_translate +- .type surf3d_translate,@function +-surf3d_translate: +- pushl %ebp +- movl %esp,%ebp +- pushl %ebx +- movl 8(%ebp),%ecx +- xorl %ebx,%ebx +- cmpl 8(%ecx),%ebx +- jge .L512 +- xorl %edx,%edx +- .p2align 4,,7 +-.L514: +- movl 4(%ecx),%eax +- flds (%eax,%edx) +- fadds 12(%ecx) +- incl %ebx +- fstps (%eax,%edx) +- movl 4(%ecx),%eax +- flds 4(%eax,%edx) +- fadds 16(%ecx) +- fstps 4(%eax,%edx) +- movl 4(%ecx),%eax +- flds 8(%eax,%edx) +- fadds 20(%ecx) +- fstps 8(%eax,%edx) +- addl $12,%edx +- cmpl 8(%ecx),%ebx +- jl .L514 +-.L512: +- popl %ebx +- leave +- ret +-.Lfe5: +- .size surf3d_translate,.Lfe5-surf3d_translate +- .ident "GCC: (GNU) 2.95.3 19991030 (prerelease)" +diff -Naur /home/d4rk/goom2k4-0/src/tentacle3d.c /src/tentacle3d.c +--- /home/d4rk/goom2k4-0/src/tentacle3d.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/tentacle3d.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,290 +0,0 @@ +-#include <stdlib.h> +- +-#include "v3d.h" +-#include "surf3d.h" +-#include "goom_tools.h" +-#include "goom_config.h" +-#include "goom_plugin_info.h" +-#include "tentacle3d.h" +- +-#define D 256.0f +- +-#define nbgrid 6 +-#define definitionx 15 +-#define definitionz 45 +- +-typedef struct _TENTACLE_FX_DATA { +- PluginParam enabled_bp; +- PluginParameters params; +- +- float cycle; +- grid3d *grille[nbgrid]; +- float *vals; +- +-#define NB_TENTACLE_COLORS 4 +- int colors[NB_TENTACLE_COLORS]; +- +- int col; +- int dstcol; +- float lig; +- float ligs; +- +- /* statics from pretty_move */ +- float distt; +- float distt2; +- float rot; /* entre 0 et 2 * M_PI */ +- int happens; +- int rotation; +- int lock; +-} TentacleFXData; +- +-static void tentacle_new (TentacleFXData *data); +-static void tentacle_update(PluginInfo *goomInfo, Pixel *buf, Pixel *back, int W, int H, +- short[2][512], float, int drawit, TentacleFXData *data); +-static void tentacle_free (TentacleFXData *data); +- +-/* +- * VisualFX wrapper for the tentacles +- */ +- +-static void tentacle_fx_init(VisualFX *_this, PluginInfo *info) { +- +- TentacleFXData *data = (TentacleFXData*)malloc(sizeof(TentacleFXData)); +- +- data->enabled_bp = secure_b_param("Enabled", 1); +- data->params = plugin_parameters ("3D Tentacles", 1); +- data->params.params[0] = &data->enabled_bp; +- +- data->cycle = 0.0f; +- data->col = (0x28<<(ROUGE*8))|(0x2c<<(VERT*8))|(0x5f<<(BLEU*8)); +- data->dstcol = 0; +- data->lig = 1.15f; +- data->ligs = 0.1f; +- +- data->distt = 10.0f; +- data->distt2 = 0.0f; +- data->rot = 0.0f; /* entre 0 et 2 * M_PI */ +- data->happens = 0; +- +- data->rotation = 0; +- data->lock = 0; +- data->colors[0] = (0x18<<(ROUGE*8))|(0x4c<<(VERT*8))|(0x2f<<(BLEU*8)); +- data->colors[1] = (0x48<<(ROUGE*8))|(0x2c<<(VERT*8))|(0x6f<<(BLEU*8)); +- data->colors[2] = (0x58<<(ROUGE*8))|(0x3c<<(VERT*8))|(0x0f<<(BLEU*8)); +- data->colors[3] = (0x87<<(ROUGE*8))|(0x55<<(VERT*8))|(0x74<<(BLEU*8)); +- tentacle_new(data); +- +- _this->params = &data->params; +- _this->fx_data = (void*)data; +-} +- +-static void tentacle_fx_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *goomInfo) +-{ +- TentacleFXData *data = (TentacleFXData*)_this->fx_data; +- if (BVAL(data->enabled_bp)) { +- tentacle_update(goomInfo, dest, src, goomInfo->screen.width, +- goomInfo->screen.height, goomInfo->sound.samples, +- (float)goomInfo->sound.accelvar, +- goomInfo->curGState->drawTentacle, data); +- } +-} +- +-static void tentacle_fx_free(VisualFX *_this) { +- tentacle_free((TentacleFXData*)_this->fx_data); +- free(_this->fx_data); +-} +- +-VisualFX tentacle_fx_create(void) { +- VisualFX fx; +- fx.init = tentacle_fx_init; +- fx.apply = tentacle_fx_apply; +- fx.free = tentacle_fx_free; +- return fx; +-} +- +-/* ----- */ +- +-static void tentacle_free (TentacleFXData *data) { +- /* TODO : un vrai FREE GRID!! */ +- free (data->vals); +-} +- +-static void tentacle_new (TentacleFXData *data) { +- int tmp; +- +- v3d center = {0,-17.0,0}; +- data->vals = (float*)malloc ((definitionx+20)*sizeof(float)); +- +- for (tmp=0;tmp<nbgrid;tmp++) { +- int x,z; +- z = 45 + rand() % 30; +- x = 85 + rand() % 5; +- center.z = z; +- data->grille[tmp] = grid3d_new (x, definitionx, z, definitionz + rand() % 10, center); +- center.y += 8; +- } +-} +- +-static inline unsigned char lighten (unsigned char value, float power) +-{ +- int val = value; +- float t = (float) val * log10(power) / 2.0; +- +- if (t > 0) { +- val = (int) t; /* (32.0f * log (t)); */ +- if (val > 255) +- val = 255; +- if (val < 0) +- val = 0; +- return val; +- } +- else { +- return 0; +- } +-} +- +-static void lightencolor (int *col, float power) +-{ +- unsigned char *color; +- +- color = (unsigned char *) col; +- *color = lighten (*color, power); +- color++; +- *color = lighten (*color, power); +- color++; +- *color = lighten (*color, power); +- color++; +- *color = lighten (*color, power); +-} +- +-/* retourne x>>s , en testant le signe de x */ +-#define ShiftRight(_x,_s) ((_x<0) ? -(-_x>>_s) : (_x>>_s)) +- +-static int evolutecolor (unsigned int src,unsigned int dest, +- unsigned int mask, unsigned int incr) { +- +- int color = src & (~mask); +- src &= mask; +- dest &= mask; +- +- if ((src!=mask) +- &&(src<dest)) +- src += incr; +- +- if (src>dest) +- src -= incr; +- return (src&mask)|color; +-} +- +-static void pretty_move (PluginInfo *goomInfo, float cycle, float *dist, float *dist2, float *rotangle, TentacleFXData *fx_data) { +- +- float tmp; +- +- /* many magic numbers here... I don't really like that. */ +- if (fx_data->happens) +- fx_data->happens -= 1; +- else if (fx_data->lock == 0) { +- fx_data->happens = goom_irand(goomInfo->gRandom,200)?0:100+goom_irand(goomInfo->gRandom,60); +- fx_data->lock = fx_data->happens * 3 / 2; +- } +- else fx_data->lock --; +- +- tmp = fx_data->happens?8.0f:0; +- *dist2 = fx_data->distt2 = (tmp + 15.0f*fx_data->distt2)/16.0f; +- +- tmp = 30+D-90.0f*(1.0f+sin(cycle*19/20)); +- if (fx_data->happens) +- tmp *= 0.6f; +- +- *dist = fx_data->distt = (tmp + 3.0f*fx_data->distt)/4.0f; +- +- if (!fx_data->happens){ +- tmp = M_PI*sin(cycle)/32+3*M_PI/2; +- } +- else { +- fx_data->rotation = goom_irand(goomInfo->gRandom,500)?fx_data->rotation:goom_irand(goomInfo->gRandom,2); +- if (fx_data->rotation) +- cycle *= 2.0f*M_PI; +- else +- cycle *= -1.0f*M_PI; +- tmp = cycle - (M_PI*2.0) * floor(cycle/(M_PI*2.0)); +- } +- +- if (abs(tmp-fx_data->rot) > abs(tmp-(fx_data->rot+2.0*M_PI))) { +- fx_data->rot = (tmp + 15.0f*(fx_data->rot+2*M_PI)) / 16.0f; +- if (fx_data->rot>2.0*M_PI) +- fx_data->rot -= 2.0*M_PI; +- *rotangle = fx_data->rot; +- } +- else if (abs(tmp-fx_data->rot) > abs(tmp-(fx_data->rot-2.0*M_PI))) { +- fx_data->rot = (tmp + 15.0f*(fx_data->rot-2.0*M_PI)) / 16.0f; +- if (fx_data->rot<0.0f) +- fx_data->rot += 2.0*M_PI; +- *rotangle = fx_data->rot; +- } +- else +- *rotangle = fx_data->rot = (tmp + 15.0f*fx_data->rot) / 16.0f; +-} +- +-static void tentacle_update(PluginInfo *goomInfo, Pixel *buf, Pixel *back, int W, int H, +- short data[2][512], float rapport, int drawit, TentacleFXData *fx_data) { +- +- int tmp; +- int tmp2; +- +- int color; +- int colorlow; +- +- float dist,dist2,rotangle; +- +- if ((!drawit) && (fx_data->ligs>0.0f)) +- fx_data->ligs = -fx_data->ligs; +- +- fx_data->lig += fx_data->ligs; +- +- if (fx_data->lig > 1.01f) { +- if ((fx_data->lig>10.0f) | (fx_data->lig<1.1f)) fx_data->ligs = -fx_data->ligs; +- +- if ((fx_data->lig<6.3f)&&(goom_irand(goomInfo->gRandom,30)==0)) +- fx_data->dstcol=goom_irand(goomInfo->gRandom,NB_TENTACLE_COLORS); +- +- fx_data->col = evolutecolor(fx_data->col,fx_data->colors[fx_data->dstcol],0xff,0x01); +- fx_data->col = evolutecolor(fx_data->col,fx_data->colors[fx_data->dstcol],0xff00,0x0100); +- fx_data->col = evolutecolor(fx_data->col,fx_data->colors[fx_data->dstcol],0xff0000,0x010000); +- fx_data->col = evolutecolor(fx_data->col,fx_data->colors[fx_data->dstcol],0xff000000,0x01000000); +- +- color = fx_data->col; +- colorlow = fx_data->col; +- +- lightencolor(&color,fx_data->lig * 2.0f + 2.0f); +- lightencolor(&colorlow,(fx_data->lig/3.0f)+0.67f); +- +- rapport = 1.0f + 2.0f * (rapport - 1.0f); +- rapport *= 1.2f; +- if (rapport > 1.12f) +- rapport = 1.12f; +- +- pretty_move (goomInfo, fx_data->cycle, &dist, &dist2, &rotangle, fx_data); +- +- for (tmp=0;tmp<nbgrid;tmp++) { +- for (tmp2=0;tmp2<definitionx;tmp2++) { +- float val = (float)(ShiftRight(data[0][goom_irand(goomInfo->gRandom,511)],10)) * rapport; +- fx_data->vals[tmp2] = val; +- } +- +- grid3d_update (fx_data->grille[tmp], rotangle, fx_data->vals, dist2); +- } +- fx_data->cycle+=0.01f; +- for (tmp=0;tmp<nbgrid;tmp++) +- grid3d_draw (goomInfo, fx_data->grille[tmp],color,colorlow,dist,buf,back,W,H); +- } +- else { +- fx_data->lig = 1.05f; +- if (fx_data->ligs < 0.0f) +- fx_data->ligs = -fx_data->ligs; +- pretty_move (goomInfo, fx_data->cycle, &dist, &dist2, &rotangle, fx_data); +- fx_data->cycle+=0.1f; +- if (fx_data->cycle > 1000) +- fx_data->cycle = 0; +- } +-} +diff -Naur /home/d4rk/goom2k4-0/src/tentacle3d.h /src/tentacle3d.h +--- /home/d4rk/goom2k4-0/src/tentacle3d.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/tentacle3d.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,8 +0,0 @@ +-#ifndef _TENTACLE3D_H +-#define _TENTACLE3D_H +- +-#include "goom_visual_fx.h" +- +-VisualFX tentacle_fx_create(void); +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/TODO /src/TODO +--- /home/d4rk/goom2k4-0/src/TODO 2005-02-07 06:46:41.000000000 -0700 ++++ /src/TODO 1969-12-31 17:00:00.000000000 -0700 +@@ -1,32 +0,0 @@ +-Idees: +- +-- Flash lights (Phosphor) +- --> --> --> +- <-- <-- <-- +- +-- Re-remplir RAND regulierement (1/tour) +- +-- Un effect qui affecte la displacement map: +- +-- Enregistrer l'etat de la config, s'en servir pour definir un etat de goom. +- +-- PluginParam de type Button, avec juste un listener en donnee. +- +-- PluginParam de type TextField. +- +-- Liste des modes possibles pour l'effet de BG. +- +-- Goom lui-meme : liste des effets actifs. +- mode automatique / manuel (plus de changement aleatoires) +- +-- Possibilite d'envoyer des commandes format text au Core. exemples : +-" BRIGHT_FLASH.SCREEN_BRIGHTNESS=200.0 +- if SOUND.GOOM_DETECTION > 0 +- 3D_TENTACLES.ENABLED = 1 +- endif +- CORE.MAIN_SCRIPT="..." +-" +- void goom_execute_script(const char *cmds); +- void goom_set_main_script(const char *script); /// peut retourner un message d'erreur ? +- char *goom_create_state_script(); /* retourne un script permettant de remettre goom dans l'etat actuel */ +- +diff -Naur /home/d4rk/goom2k4-0/src/v3d.c /src/v3d.c +--- /home/d4rk/goom2k4-0/src/v3d.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/v3d.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,15 +0,0 @@ +-#include "v3d.h" +- +-void v3d_to_v2d(v3d *v3, int nbvertex, int width, int height, float distance, v2d *v2) { +- int i; +- for (i=0;i<nbvertex;++i) { +- if (v3[i].z > 2) { +- int Xp, Yp; +- F2I((distance * v3[i].x / v3[i].z),Xp); +- F2I((distance * v3[i].y / v3[i].z),Yp); +- v2[i].x = Xp + (width>>1); +- v2[i].y = -Yp + (height>>1); +- } +- else v2[i].x=v2[i].y=-666; +- } +-} +diff -Naur /home/d4rk/goom2k4-0/src/v3d.h /src/v3d.h +--- /home/d4rk/goom2k4-0/src/v3d.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/v3d.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,65 +0,0 @@ +-#ifndef _V3D_H +-#define _V3D_H +- +-#include <math.h> +-#include <stdlib.h> +-#include <stdio.h> +- +-#include "mathtools.h" +- +-typedef struct { +- float x,y,z; +-} v3d; +- +-typedef struct { +- int x,y; +-} v2d; +- +-typedef struct { +- double x,y; +-} v2g; +- +-/* +- * projete le vertex 3D sur le plan d'affichage +- * retourne (0,0) si le point ne doit pas etre affiche. +- * +- * bonne valeur pour distance : 256 +- */ +-#define V3D_TO_V2D(v3,v2,width,height,distance) \ +-{ \ +- int Xp, Yp; \ +- if (v3.z > 2) { \ +- F2I((distance * v3.x / v3.z),Xp) ; \ +- F2I((distance * v3.y / v3.z),Yp) ; \ +- v2.x = Xp + (width>>1); \ +- v2.y = -Yp + (height>>1); \ +- } \ +- else v2.x=v2.y=-666; \ +-} +- +-void v3d_to_v2d(v3d *src, int nbvertex, int width, int height, float distance, v2d *v2_array); +- +-/* +- * rotation selon Y du v3d vi d'angle a (cosa=cos(a), sina=sin(a)) +- * centerz = centre de rotation en z +- */ +-#define Y_ROTATE_V3D(vi,vf,sina,cosa)\ +-{\ +- vf.x = vi.x * cosa - vi.z * sina;\ +- vf.z = vi.x * sina + vi.z * cosa;\ +- vf.y = vi.y;\ +-} +- +-/* +- * translation +- */ +-#define TRANSLATE_V3D(vsrc,vdest)\ +-{\ +- vdest.x += vsrc.x;\ +- vdest.y += vsrc.y;\ +- vdest.z += vsrc.z;\ +-} +- +-#define MUL_V3D(lf,v) {v.x*=lf;v.y*=lf;v.z*=lf;} +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/xmmx.c /src/xmmx.c +--- /home/d4rk/goom2k4-0/src/xmmx.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/xmmx.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,393 +0,0 @@ +- +-#ifdef HAVE_MMX +- +-/* a definir pour avoir exactement le meme resultat que la fonction C +- * (un chouillat plus lent).. mais la difference est assez peu notable. +- */ +-// #define STRICT_COMPAT +- +-#define BUFFPOINTNB 16 +-#define BUFFPOINTMASK 0xffff +-#define BUFFINCR 0xff +- +-#define sqrtperte 16 +-/* faire : a % sqrtperte <=> a & pertemask*/ +-#define PERTEMASK 0xf +-/* faire : a / sqrtperte <=> a >> PERTEDEC*/ +-#define PERTEDEC 4 +- +- +-/*#define MMX_TRACE*/ +-#include "mmx.h" +-/*#include "xmmx.h"*/ +-#include "goom_graphic.h" +- +-int xmmx_supported (void) { +- return (mm_support()&0x8)>>3; +-} +- +-void zoom_filter_xmmx (int prevX, int prevY, +- Pixel *expix1, Pixel *expix2, +- int *lbruS, int *lbruD, int buffratio, +- int precalCoef[16][16]) +-{ +- int bufsize = prevX * prevY; /* taille du buffer */ +- volatile int loop; /* variable de boucle */ +- +- mmx_t *brutS = (mmx_t*)lbruS; /* buffer de transformation source */ +- mmx_t *brutD = (mmx_t*)lbruD; /* buffer de transformation dest */ +- +- volatile mmx_t prevXY; +- volatile mmx_t ratiox; +- /* volatile mmx_t interpix; */ +- +- expix1[0].val=expix1[prevX-1].val=expix1[prevX*prevY-1].val=expix1[prevX*prevY-prevX].val=0; +- +- prevXY.ud[0] = (prevX-1)<<PERTEDEC; +- prevXY.ud[1] = (prevY-1)<<PERTEDEC; +- +- ratiox.d[0] = buffratio; +- ratiox.d[1] = buffratio; +- +- asm volatile +- ("\n\t movq %[ratio], %%mm6" +- "\n\t pslld $16, %%mm6" /* mm6 = [rat16=buffratio<<16 | rat16=buffratio<<16] */ +- "\n\t pxor %%mm7, %%mm7" /* mm7 = 0 */ +- ::[ratio]"m"(ratiox)); +- +- loop=0; +- +- /* +- * NOTE : mm6 et mm7 ne sont pas modifies dans la boucle. +- */ +- while (loop < bufsize) +- { +- /* Thread #1 +- * pre : mm6 = [rat16|rat16] +- * post : mm0 = S + ((D-S)*rat16 format [X|Y] +- * modified = mm0,mm1,mm2 +- */ +- +- asm volatile +- ("#1 \n\t movq %[brutS], %%mm0" +- "#1 \n\t movq %[brutD], %%mm1" +- "#1 \n\t psubd %%mm0, %%mm1" /* mm1 = D - S */ +- "#1 \n\t movq %%mm1, %%mm2" /* mm2 = D - S */ +- "#1 \n\t pslld $16, %%mm1" +- "#1 \n\t pmullw %%mm6, %%mm2" +- "#1 \n\t pmulhuw %%mm6, %%mm1" +- +- "#1 \n\t pslld $16, %%mm0" +- "#1 \n\t paddd %%mm2, %%mm1" /* mm1 = (D - S) * buffratio >> 16 */ +- +- "#1 \n\t paddd %%mm1, %%mm0" /* mm0 = S + mm1 */ +- "#1 \n\t psrld $16, %%mm0" +- : +- : [brutS]"g"(brutS[loop]) +- , [brutD]"g"(brutD[loop]) +- ); /* mm0 = S */ +- +- /* +- * pre : mm0 : position vector on screen +- * prevXY : coordinate of the lower-right point on screen +- * post : clipped mm0 +- * modified : mm0,mm1,mm2 +- */ +- asm volatile +- ("#1 \n\t movq %[prevXY], %%mm1" +- "#1 \n\t pcmpgtd %%mm0, %%mm1" +- /* mm0 en X contient (idem pour Y) : +- * 1111 si prevXY > px +- * 0000 si prevXY <= px */ +-#ifdef STRICT_COMPAT +- "#1 \n\t movq %%mm1, %%mm2" +- "#1 \n\t punpckhdq %%mm2, %%mm2" +- "#1 \n\t punpckldq %%mm1, %%mm1" +- "#1 \n\t pand %%mm2, %%mm0" +-#endif +- +- "#1 \n\t pand %%mm1, %%mm0" /* on met a zero la partie qui deborde */ +- ::[prevXY]"m"(prevXY)); +- +- /* Thread #2 +- * pre : mm0 : clipped position on screen +- * +- * post : mm3 : coefs for this position +- * mm1 : X vector [0|X] +- * +- * modif : eax,esi +- */ +- __asm__ __volatile__ ( +- "#2 \n\t movd %%mm0,%%esi" +- "#2 \n\t movq %%mm0,%%mm1" +- +- "#2 \n\t andl $15,%%esi" +- "#2 \n\t psrlq $32,%%mm1" +- +- "#2 \n\t shll $6,%%esi" +- "#2 \n\t movd %%mm1,%%eax" +- +- "#2 \n\t addl %[precalCoef],%%esi" +- "#2 \n\t andl $15,%%eax" +- +- "#2 \n\t movd (%%esi,%%eax,4),%%mm3" +- ::[precalCoef]"g"(precalCoef):"eax","esi"); +- +- /* +- * extraction des coefficients... (Thread #3) +- * +- * pre : coef dans mm3 +- * +- * post : coef extraits dans mm3 (c1 & c2) +- * et mm4 (c3 & c4) +- * +- * modif : mm5 +- */ +- +- /* (Thread #4) +- * pre : mm0 : Y pos [*|Y] +- * mm1 : X pos [*|X] +- * +- * post : mm0 : expix1[position] +- * mm2 : expix1[position+largeur] +- * +- * modif : eax, esi +- */ +- __asm__ __volatile__ ( +- "#2 \n\t psrld $4, %%mm0" +- "#2 \n\t psrld $4, %%mm1" /* PERTEDEC = $4 */ +- +- "#4 \n\t movd %%mm1,%%eax" +- "#3 \n\t movq %%mm3,%%mm5" +- +- "#4 \n\t mull %[prevX]" +- "#4 \n\t movd %%mm0,%%esi" +- +- "#3 \n\t punpcklbw %%mm5, %%mm3" +- "#4 \n\t addl %%esi, %%eax" +- +- "#3 \n\t movq %%mm3, %%mm4" +- "#3 \n\t movq %%mm3, %%mm5" +- +- "#4 \n\t movl %[expix1], %%esi" +- "#3 \n\t punpcklbw %%mm5, %%mm3" +- +- "#4 \n\t movq (%%esi,%%eax,4),%%mm0" +- "#3 \n\t punpckhbw %%mm5, %%mm4" +- +- "#4 \n\t addl %[prevX],%%eax" +- "#4 \n\t movq (%%esi,%%eax,4),%%mm2" +- +- : +- : [expix1] "g"(expix1) +- , [prevX] "g"(prevX) +- :"eax","esi" +- ); +- +- /* +- * pre : mm0 : expix1[position] +- * mm2 : expix1[position+largeur] +- * mm3 & mm4 : coefs +- */ +- +- /* recopie des deux premiers pixels dans mm0 et mm1 */ +- movq_r2r (mm0, mm1); /* b1-v1-r1-a1-b2-v2-r2-a2 */ +- +- /* depackage du premier pixel */ +- punpcklbw_r2r (mm7, mm0); /* 00-b2-00-v2-00-r2-00-a2 */ +- +- /* extraction des coefficients... */ +- +- movq_r2r (mm3, mm5); /* c2-c2-c2-c2-c1-c1-c1-c1 */ +- +- /*^en parrallele^*/ /* depackage du 2ieme pixel */ +- /*^*/ punpckhbw_r2r (mm7, mm1); /* 00-b1-00-v1-00-r1-00-a1 */ +- +- punpcklbw_r2r (mm7, mm5); /* 00-c1-00-c1-00-c1-00-c1 */ +- punpckhbw_r2r (mm7, mm3); /* 00-c2-00-c2-00-c2-00-c2 */ +- +- /* multiplication des pixels par les coefficients */ +- pmullw_r2r (mm5, mm0); /* c1*b2-c1*v2-c1*r2-c1*a2 */ +- pmullw_r2r (mm3, mm1); /* c2*b1-c2*v1-c2*r1-c2*a1 */ +- paddw_r2r (mm1, mm0); +- +- /* ...extraction des 2 derniers coefficients */ +- movq_r2r (mm4, mm5); /* c4-c4-c4-c4-c3-c3-c3-c3 */ +- punpcklbw_r2r (mm7, mm4); /* 00-c3-00-c3-00-c3-00-c3 */ +- punpckhbw_r2r (mm7, mm5); /* 00-c4-00-c4-00-c4-00-c4 */ +- +- /* recuperation des 2 derniers pixels */ +- movq_r2r (mm2, mm1); +- +- /* depackage des pixels */ +- punpcklbw_r2r (mm7, mm1); +- punpckhbw_r2r (mm7, mm2); +- +- /* multiplication pas les coeffs */ +- pmullw_r2r (mm4, mm1); +- pmullw_r2r (mm5, mm2); +- +- /* ajout des valeurs obtenues à la valeur finale */ +- paddw_r2r (mm1, mm0); +- paddw_r2r (mm2, mm0); +- +- /* division par 256 = 16+16+16+16, puis repackage du pixel final */ +- psrlw_i2r (8, mm0); +- packuswb_r2r (mm7, mm0); +- +- movd_r2m (mm0,expix2[loop]); +- +- ++loop; +- } +- __asm__ __volatile__ ("femms\n"); +-} +- +-#define DRAWMETHOD_PLUS_XMMX(_out,_backbuf,_col) \ +-{ \ +- movd_m2r(_backbuf, mm0); \ +- paddusb_m2r(_col, mm0); \ +- movd_r2m(mm0, _out); \ +-} +- +-#define DRAWMETHOD DRAWMETHOD_PLUS_XMMX(*p,*p,col) +- +-void draw_line_xmmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny) +-{ +- int x, y, dx, dy, yy, xx; +- Pixel *p; +- +- if ((y1 < 0) || (y2 < 0) || (x1 < 0) || (x2 < 0) || (y1 >= screeny) || (y2 >= screeny) || (x1 >= screenx) || (x2 >= screenx)) +- goto end_of_line; +- +- dx = x2 - x1; +- dy = y2 - y1; +- if (x1 >= x2) { +- int tmp; +- +- tmp = x1; +- x1 = x2; +- x2 = tmp; +- tmp = y1; +- y1 = y2; +- y2 = tmp; +- dx = x2 - x1; +- dy = y2 - y1; +- } +- +- /* vertical line */ +- if (dx == 0) { +- if (y1 < y2) { +- p = &(data[(screenx * y1) + x1]); +- for (y = y1; y <= y2; y++) { +- DRAWMETHOD; +- p += screenx; +- } +- } +- else { +- p = &(data[(screenx * y2) + x1]); +- for (y = y2; y <= y1; y++) { +- DRAWMETHOD; +- p += screenx; +- } +- } +- goto end_of_line; +- } +- /* horizontal line */ +- if (dy == 0) { +- if (x1 < x2) { +- p = &(data[(screenx * y1) + x1]); +- for (x = x1; x <= x2; x++) { +- DRAWMETHOD; +- p++; +- } +- goto end_of_line; +- } +- else { +- p = &(data[(screenx * y1) + x2]); +- for (x = x2; x <= x1; x++) { +- DRAWMETHOD; +- p++; +- } +- goto end_of_line; +- } +- } +- /* 1 */ +- /* \ */ +- /* \ */ +- /* 2 */ +- if (y2 > y1) { +- /* steep */ +- if (dy > dx) { +- dx = ((dx << 16) / dy); +- x = x1 << 16; +- for (y = y1; y <= y2; y++) { +- xx = x >> 16; +- p = &(data[(screenx * y) + xx]); +- DRAWMETHOD; +- if (xx < (screenx - 1)) { +- p++; +- /* DRAWMETHOD; */ +- } +- x += dx; +- } +- goto end_of_line; +- } +- /* shallow */ +- else { +- dy = ((dy << 16) / dx); +- y = y1 << 16; +- for (x = x1; x <= x2; x++) { +- yy = y >> 16; +- p = &(data[(screenx * yy) + x]); +- DRAWMETHOD; +- if (yy < (screeny - 1)) { +- p += screeny; +- /* DRAWMETHOD; */ +- } +- y += dy; +- } +- } +- } +- /* 2 */ +- /* / */ +- /* / */ +- /* 1 */ +- else { +- /* steep */ +- if (-dy > dx) { +- dx = ((dx << 16) / -dy); +- x = (x1 + 1) << 16; +- for (y = y1; y >= y2; y--) { +- xx = x >> 16; +- p = &(data[(screenx * y) + xx]); +- DRAWMETHOD; +- if (xx < (screenx - 1)) { +- p--; +- /* DRAWMETHOD; */ +- } +- x += dx; +- } +- goto end_of_line; +- } +- /* shallow */ +- else { +- dy = ((dy << 16) / dx); +- y = y1 << 16; +- for (x = x1; x <= x2; x++) { +- yy = y >> 16; +- p = &(data[(screenx * yy) + x]); +- DRAWMETHOD; +- if (yy < (screeny - 1)) { +- p += screeny; +- /* DRAWMETHOD; */ +- } +- y += dy; +- } +- goto end_of_line; +- } +- } +-end_of_line: +- __asm__ __volatile__ ("femms\n"); +-} +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/xmmx.h /src/xmmx.h +--- /home/d4rk/goom2k4-0/src/xmmx.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/xmmx.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,537 +0,0 @@ +-/* xmmx.h +- +- eXtended MultiMedia eXtensions GCC interface library for IA32. +- +- To use this library, simply include this header file +- and compile with GCC. You MUST have inlining enabled +- in order for xmmx_ok() to work; this can be done by +- simply using -O on the GCC command line. +- +- Compiling with -DXMMX_TRACE will cause detailed trace +- output to be sent to stderr for each mmx operation. +- This adds lots of code, and obviously slows execution to +- a crawl, but can be very useful for debugging. +- +- THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY +- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT +- LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY +- AND FITNESS FOR ANY PARTICULAR PURPOSE. +- +- 1999 by R. Fisher +- Based on libmmx, 1997-99 by H. Dietz and R. Fisher +- +- Notes: +- It appears that the latest gas has the pand problem fixed, therefore +- I'll undefine BROKEN_PAND by default. +-*/ +- +-#ifndef _XMMX_H +-#define _XMMX_H +- +- +-/* Warning: at this writing, the version of GAS packaged +- with most Linux distributions does not handle the +- parallel AND operation mnemonic correctly. If the +- symbol BROKEN_PAND is defined, a slower alternative +- coding will be used. If execution of mmxtest results +- in an illegal instruction fault, define this symbol. +-*/ +-#undef BROKEN_PAND +- +- +-/* The type of an value that fits in an (Extended) MMX register +- (note that long long constant values MUST be suffixed +- by LL and unsigned long long values by ULL, lest +- they be truncated by the compiler) +-*/ +-#ifndef _MMX_H +-typedef union { +- long long q; /* Quadword (64-bit) value */ +- unsigned long long uq; /* Unsigned Quadword */ +- int d[2]; /* 2 Doubleword (32-bit) values */ +- unsigned int ud[2]; /* 2 Unsigned Doubleword */ +- short w[4]; /* 4 Word (16-bit) values */ +- unsigned short uw[4]; /* 4 Unsigned Word */ +- char b[8]; /* 8 Byte (8-bit) values */ +- unsigned char ub[8]; /* 8 Unsigned Byte */ +- float s[2]; /* Single-precision (32-bit) value */ +-} __attribute__ ((aligned (8))) mmx_t; /* On an 8-byte (64-bit) boundary */ +-#endif +- +- +- +-/* Function to test if multimedia instructions are supported... +-*/ +-static int +-mm_support(void) +-{ +- /* Returns 1 if MMX instructions are supported, +- 3 if Cyrix MMX and Extended MMX instructions are supported +- 5 if AMD MMX and 3DNow! instructions are supported +- 0 if hardware does not support any of these +- */ +- register int rval = 0; +- +- __asm__ __volatile__ ( +- /* See if CPUID instruction is supported ... */ +- /* ... Get copies of EFLAGS into eax and ecx */ +- "pushf\n\t" +- "popl %%eax\n\t" +- "movl %%eax, %%ecx\n\t" +- +- /* ... Toggle the ID bit in one copy and store */ +- /* to the EFLAGS reg */ +- "xorl $0x200000, %%eax\n\t" +- "push %%eax\n\t" +- "popf\n\t" +- +- /* ... Get the (hopefully modified) EFLAGS */ +- "pushf\n\t" +- "popl %%eax\n\t" +- +- /* ... Compare and test result */ +- "xorl %%eax, %%ecx\n\t" +- "testl $0x200000, %%ecx\n\t" +- "jz NotSupported1\n\t" /* CPUID not supported */ +- +- +- /* Get standard CPUID information, and +- go to a specific vendor section */ +- "movl $0, %%eax\n\t" +- "cpuid\n\t" +- +- /* Check for Intel */ +- "cmpl $0x756e6547, %%ebx\n\t" +- "jne TryAMD\n\t" +- "cmpl $0x49656e69, %%edx\n\t" +- "jne TryAMD\n\t" +- "cmpl $0x6c65746e, %%ecx\n" +- "jne TryAMD\n\t" +- "jmp Intel\n\t" +- +- /* Check for AMD */ +- "\nTryAMD:\n\t" +- "cmpl $0x68747541, %%ebx\n\t" +- "jne TryCyrix\n\t" +- "cmpl $0x69746e65, %%edx\n\t" +- "jne TryCyrix\n\t" +- "cmpl $0x444d4163, %%ecx\n" +- "jne TryCyrix\n\t" +- "jmp AMD\n\t" +- +- /* Check for Cyrix */ +- "\nTryCyrix:\n\t" +- "cmpl $0x69727943, %%ebx\n\t" +- "jne NotSupported2\n\t" +- "cmpl $0x736e4978, %%edx\n\t" +- "jne NotSupported3\n\t" +- "cmpl $0x64616574, %%ecx\n\t" +- "jne NotSupported4\n\t" +- /* Drop through to Cyrix... */ +- +- +- /* Cyrix Section */ +- /* See if extended CPUID level 80000001 is supported */ +- /* The value of CPUID/80000001 for the 6x86MX is undefined +- according to the Cyrix CPU Detection Guide (Preliminary +- Rev. 1.01 table 1), so we'll check the value of eax for +- CPUID/0 to see if standard CPUID level 2 is supported. +- According to the table, the only CPU which supports level +- 2 is also the only one which supports extended CPUID levels. +- */ +- "cmpl $0x2, %%eax\n\t" +- "jne MMXtest\n\t" /* Use standard CPUID instead */ +- +- /* Extended CPUID supported (in theory), so get extended +- features */ +- "movl $0x80000001, %%eax\n\t" +- "cpuid\n\t" +- "testl $0x00800000, %%eax\n\t" /* Test for MMX */ +- "jz NotSupported5\n\t" /* MMX not supported */ +- "testl $0x01000000, %%eax\n\t" /* Test for Ext'd MMX */ +- "jnz EMMXSupported\n\t" +- "movl $1, %0:\n\n\t" /* MMX Supported */ +- "jmp Return\n\n" +- "EMMXSupported:\n\t" +- "movl $3, %0:\n\n\t" /* EMMX and MMX Supported */ +- "jmp Return\n\t" +- +- +- /* AMD Section */ +- "AMD:\n\t" +- +- /* See if extended CPUID is supported */ +- "movl $0x80000000, %%eax\n\t" +- "cpuid\n\t" +- "cmpl $0x80000000, %%eax\n\t" +- "jl MMXtest\n\t" /* Use standard CPUID instead */ +- +- /* Extended CPUID supported, so get extended features */ +- "movl $0x80000001, %%eax\n\t" +- "cpuid\n\t" +- "testl $0x00800000, %%edx\n\t" /* Test for MMX */ +- "jz NotSupported6\n\t" /* MMX not supported */ +- "testl $0x80000000, %%edx\n\t" /* Test for 3DNow! */ +- "jnz ThreeDNowSupported\n\t" +- "movl $1, %0:\n\n\t" /* MMX Supported */ +- "jmp Return\n\n" +- "ThreeDNowSupported:\n\t" +- "movl $5, %0:\n\n\t" /* 3DNow! and MMX Supported */ +- "jmp Return\n\t" +- +- +- /* Intel Section */ +- "Intel:\n\t" +- +- /* Check for MMX */ +- "MMXtest:\n\t" +- "movl $1, %%eax\n\t" +- "cpuid\n\t" +- "testl $0x00800000, %%edx\n\t" /* Test for MMX */ +- "jz NotSupported7\n\t" /* MMX Not supported */ +- "movl $1, %0:\n\n\t" /* MMX Supported */ +- "jmp Return\n\t" +- +- /* Nothing supported */ +- "\nNotSupported1:\n\t" +- "#movl $101, %0:\n\n\t" +- "\nNotSupported2:\n\t" +- "#movl $102, %0:\n\n\t" +- "\nNotSupported3:\n\t" +- "#movl $103, %0:\n\n\t" +- "\nNotSupported4:\n\t" +- "#movl $104, %0:\n\n\t" +- "\nNotSupported5:\n\t" +- "#movl $105, %0:\n\n\t" +- "\nNotSupported6:\n\t" +- "#movl $106, %0:\n\n\t" +- "\nNotSupported7:\n\t" +- "#movl $107, %0:\n\n\t" +- "movl $0, %0:\n\n\t" +- +- "Return:\n\t" +- : "=a" (rval) +- : /* no input */ +- : "eax", "ebx", "ecx", "edx" +- ); +- +- /* Return */ +- return(rval); +-} +- +-/* Function to test if mmx instructions are supported... +-*/ +-#ifndef _XMMX_H +-inline extern int +-mmx_ok(void) +-{ +- /* Returns 1 if MMX instructions are supported, 0 otherwise */ +- return ( mm_support() & 0x1 ); +-} +-#endif +- +-/* Function to test if xmmx instructions are supported... +-*/ +-inline extern int +-xmmx_ok(void) +-{ +- /* Returns 1 if Extended MMX instructions are supported, 0 otherwise */ +- return ( (mm_support() & 0x2) >> 1 ); +-} +- +- +-/* Helper functions for the instruction macros that follow... +- (note that memory-to-register, m2r, instructions are nearly +- as efficient as register-to-register, r2r, instructions; +- however, memory-to-memory instructions are really simulated +- as a convenience, and are only 1/3 as efficient) +-*/ +-#ifdef XMMX_TRACE +- +-/* Include the stuff for printing a trace to stderr... +-*/ +- +-#include <stdio.h> +- +-#define mmx_i2r(op, imm, reg) \ +- { \ +- mmx_t mmx_trace; \ +- mmx_trace.uq = (imm); \ +- fprintf(stderr, #op "_i2r(" #imm "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- fprintf(stderr, #reg "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ (#op " %0, %%" #reg \ +- : /* nothing */ \ +- : "X" (imm)); \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- fprintf(stderr, #reg "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#define mmx_m2r(op, mem, reg) \ +- { \ +- mmx_t mmx_trace; \ +- mmx_trace = (mem); \ +- fprintf(stderr, #op "_m2r(" #mem "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- fprintf(stderr, #reg "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ (#op " %0, %%" #reg \ +- : /* nothing */ \ +- : "X" (mem)); \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- fprintf(stderr, #reg "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#define mmx_r2m(op, reg, mem) \ +- { \ +- mmx_t mmx_trace; \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- fprintf(stderr, #op "_r2m(" #reg "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- mmx_trace = (mem); \ +- fprintf(stderr, #mem "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ (#op " %%" #reg ", %0" \ +- : "=X" (mem) \ +- : /* nothing */ ); \ +- mmx_trace = (mem); \ +- fprintf(stderr, #mem "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#define mmx_r2r(op, regs, regd) \ +- { \ +- mmx_t mmx_trace; \ +- __asm__ __volatile__ ("movq %%" #regs ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- fprintf(stderr, #op "_r2r(" #regs "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ ("movq %%" #regd ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- fprintf(stderr, #regd "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ (#op " %" #regs ", %" #regd); \ +- __asm__ __volatile__ ("movq %%" #regd ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- fprintf(stderr, #regd "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#define mmx_m2m(op, mems, memd) \ +- { \ +- mmx_t mmx_trace; \ +- mmx_trace = (mems); \ +- fprintf(stderr, #op "_m2m(" #mems "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- mmx_trace = (memd); \ +- fprintf(stderr, #memd "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ +- #op " %1, %%mm0\n\t" \ +- "movq %%mm0, %0" \ +- : "=X" (memd) \ +- : "X" (mems)); \ +- mmx_trace = (memd); \ +- fprintf(stderr, #memd "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#else +- +-/* These macros are a lot simpler without the tracing... +-*/ +- +-#define mmx_i2r(op, imm, reg) \ +- __asm__ __volatile__ (#op " %0, %%" #reg \ +- : /* nothing */ \ +- : "X" (imm) ) +- +-#define mmx_m2r(op, mem, reg) \ +- __asm__ __volatile__ (#op " %0, %%" #reg \ +- : /* nothing */ \ +- : "X" (mem)) +- +-#define mmx_m2ir(op, mem, rs) \ +- __asm__ __volatile__ (#op " %0, %%" #rs \ +- : /* nothing */ \ +- : "X" (mem) ) +- +-#define mmx_r2m(op, reg, mem) \ +- __asm__ __volatile__ (#op " %%" #reg ", %0" \ +- : "=X" (mem) \ +- : /* nothing */ ) +- +-#define mmx_r2r(op, regs, regd) \ +- __asm__ __volatile__ (#op " %" #regs ", %" #regd) +- +-#define mmx_r2ir(op, rs1, rs2) \ +- __asm__ __volatile__ (#op " %%" #rs1 ", %%" #rs2 \ +- : /* nothing */ \ +- : /* nothing */ ) +- +-#define mmx_m2m(op, mems, memd) \ +- __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ +- #op " %1, %%mm0\n\t" \ +- "movq %%mm0, %0" \ +- : "=X" (memd) \ +- : "X" (mems)) +- +-#endif +- +- +- +-/* 1x64 MOVe Quadword +- (this is both a load and a store... +- in fact, it is the only way to store) +-*/ +-#define movq_m2r(var, reg) mmx_m2r(movq, var, reg) +-#define movq_r2m(reg, var) mmx_r2m(movq, reg, var) +-#define movq_r2r(regs, regd) mmx_r2r(movq, regs, regd) +-#define movq(vars, vard) \ +- __asm__ __volatile__ ("movq %1, %%mm0\n\t" \ +- "movq %%mm0, %0" \ +- : "=X" (vard) \ +- : "X" (vars)) +- +- +-/* 1x32 MOVe Doubleword +- (like movq, this is both load and store... +- but is most useful for moving things between +- mmx registers and ordinary registers) +-*/ +-#define movd_m2r(var, reg) mmx_m2r(movd, var, reg) +-#define movd_r2m(reg, var) mmx_r2m(movd, reg, var) +-#define movd_r2r(regs, regd) mmx_r2r(movd, regs, regd) +-#define movd(vars, vard) \ +- __asm__ __volatile__ ("movd %1, %%mm0\n\t" \ +- "movd %%mm0, %0" \ +- : "=X" (vard) \ +- : "X" (vars)) +- +- +- +-/* 4x16 Parallel MAGnitude +-*/ +-#define pmagw_m2r(var, reg) mmx_m2r(pmagw, var, reg) +-#define pmagw_r2r(regs, regd) mmx_r2r(pmagw, regs, regd) +-#define pmagw(vars, vard) mmx_m2m(pmagw, vars, vard) +- +- +-/* 4x16 Parallel ADDs using Saturation arithmetic +- and Implied destination +-*/ +-#define paddsiw_m2ir(var, rs) mmx_m2ir(paddsiw, var, rs) +-#define paddsiw_r2ir(rs1, rs2) mmx_r2ir(paddsiw, rs1, rs2) +-#define paddsiw(vars, vard) mmx_m2m(paddsiw, vars, vard) +- +- +-/* 4x16 Parallel SUBs using Saturation arithmetic +- and Implied destination +-*/ +-#define psubsiw_m2ir(var, rs) mmx_m2ir(psubsiw, var, rs) +-#define psubsiw_r2ir(rs1, rs2) mmx_r2ir(psubsiw, rs1, rs2) +-#define psubsiw(vars, vard) mmx_m2m(psubsiw, vars, vard) +- +- +-/* 4x16 Parallel MULs giving High 4x16 portions of results +- Rounded with 1/2 bit 15. +-*/ +-#define pmulhrw_m2r(var, reg) mmx_m2r(pmulhrw, var, reg) +-#define pmulhrw_r2r(regs, regd) mmx_r2r(pmulhrw, regs, regd) +-#define pmulhrw(vars, vard) mmx_m2m(pmulhrw, vars, vard) +- +- +-/* 4x16 Parallel MULs giving High 4x16 portions of results +- Rounded with 1/2 bit 15, storing to Implied register +-*/ +-#define pmulhriw_m2ir(var, rs) mmx_m2ir(pmulhriw, var, rs) +-#define pmulhriw_r2ir(rs1, rs2) mmx_r2ir(pmulhriw, rs1, rs2) +-#define pmulhriw(vars, vard) mmx_m2m(pmulhriw, vars, vard) +- +- +-/* 4x16 Parallel Muls (and ACcumulate) giving High 4x16 portions +- of results Rounded with 1/2 bit 15, accumulating with Implied register +-*/ +-#define pmachriw_m2ir(var, rs) mmx_m2ir(pmachriw, var, rs) +-#define pmachriw_r2ir(rs1, rs2) mmx_r2ir(pmachriw, rs1, rs2) +-#define pmachriw(vars, vard) mmx_m2m(pmachriw, vars, vard) +- +- +-/* 8x8u Parallel AVErage +-*/ +-#define paveb_m2r(var, reg) mmx_m2r(paveb, var, reg) +-#define paveb_r2r(regs, regd) mmx_r2r(paveb, regs, regd) +-#define paveb(vars, vard) mmx_m2m(paveb, vars, vard) +- +- +-/* 8x8u Parallel DISTance and accumulate with +- unsigned saturation to Implied register +-*/ +-#define pdistib_m2ir(var, rs) mmx_m2ir(pdistib, var, rs) +-#define pdistib(vars, vard) mmx_m2m(pdistib, vars, vard) +- +- +-/* 8x8 Parallel conditional MoVe +- if implied register field is Zero +-*/ +-#define pmvzb_m2ir(var, rs) mmx_m2ir(pmvzb, var, rs) +- +- +-/* 8x8 Parallel conditional MoVe +- if implied register field is Not Zero +-*/ +-#define pmvnzb_m2ir(var, rs) mmx_m2ir(pmvnzb, var, rs) +- +- +-/* 8x8 Parallel conditional MoVe +- if implied register field is Less than Zero +-*/ +-#define pmvlzb_m2ir(var, rs) mmx_m2ir(pmvlzb, var, rs) +- +- +-/* 8x8 Parallel conditional MoVe +- if implied register field is Greater than or Equal to Zero +-*/ +-#define pmvgezb_m2ir(var, rs) mmx_m2ir(pmvgezb, var, rs) +- +- +-/* Fast Empty MMx State +- (used to clean-up when going from mmx to float use +- of the registers that are shared by both; note that +- there is no float-to-xmmx operation needed, because +- only the float tag word info is corruptible) +-*/ +-#ifdef XMMX_TRACE +- +-#define femms() \ +- { \ +- fprintf(stderr, "femms()\n"); \ +- __asm__ __volatile__ ("femms"); \ +- } +- +-#else +- +-#define femms() __asm__ __volatile__ ("femms") +- +-#endif +- +-#endif +- |