#include <windows.h>



#define pattern_var(type, fn, name) static type *name = NULL; if(!name) name = fn();
#define pattern_const(type, fn, name, init) static type *name = NULL; if(!name) { name = fn(); init(name); }



typedef struct _PATTERN_A {
  unsigned char buf[256][256];
} PATTERN_A;

typedef struct _PATTERN_RGB {
  unsigned char buf[256][256][3];
} PATTERN_RGB;


class PATTERN_REAL
{
  double value;
};

class PATTERN_SPEEDO : PATTERN_REAL
{
  int lasttime;
};


void Pattern_Startup();

void Pattern_Display(HDC dc, PATTERN_RGB *rgb);

PATTERN_A *Pattern_Create_A();
PATTERN_RGB *Pattern_Create_RGB();

void Pattern_Fn_A_Plasma1(PATTERN_A *a, int time);
void Pattern_Fn_A_Plasma2(PATTERN_A *a, int time);
void Pattern_Fn_A_Plasma3(PATTERN_A *a, int time);

void Pattern_Fn_RGB_A(PATTERN_RGB *rgb, PATTERN_A *a);
void Pattern_Fn_RGB_A3(PATTERN_RGB *rgb, PATTERN_A *a1, PATTERN_A *a2, PATTERN_A *a3);
void Pattern_Fn_RGB2_A2_Lookup(PATTERN_RGB *rgb1, PATTERN_RGB *rgb2, PATTERN_A *a1, PATTERN_A *a2);
void Pattern_Fn_A2_A2_Lookup(PATTERN_A *aa1, PATTERN_A *aa2, PATTERN_A *a1, PATTERN_A *a2);

void Pattern_Fn_A_Checkers(PATTERN_A *a);
void Pattern_Fn_RGB_Checkers(PATTERN_RGB *rgb);



void Pattern_Main(PATTERN_RGB *result, int time);
