#ifndef __PATTERN_H__
#define __PATTERN_H__

#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); }



extern int pattern_sin[256];

extern bool pattern_key[256];



class PATTERN_A {
  public: unsigned char buf[256][256];
};

class PATTERN_RGB {
  public: unsigned char buf[256][256][4];
};




void Pattern_Startup();

void Pattern_KeyDown(int key);
void Pattern_KeyUp(int key);
bool Pattern_KeyPressed(int key);

//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);



#endif
