#define RADIUS 2.
#define PART_SIZE 80
#define PARTS_IN_SIDE 8

#define POINTS_IN_SIDE (PARTS_IN_SIDE*PART_SIZE)
#define TOTAL_PARTS (PARTS_IN_SIDE*PARTS_IN_SIDE)
#define TOTAL_POINTS (TOTAL_PARTS*PART_SIZE*PART_SIZE)

#define PART_STEP (2*RADIUS/PARTS_IN_SIDE)
#define BEGIN     (-RADIUS)
#define STEP      (PART_STEP/PART_SIZE)

#define MAX_ITERATION    4096

/* Say TC2C what *complex* is a type */
typedef __complex__ float Complex;

inline Complex f(Complex _z, Complex _param) {
  static const double t = 0.1;
  static const Complex rot = CC(cos(t),sin(t));
  Complex z2, z5;
  _z *= rot;
  z2 = _z * _z;
  z5 = z2 * z2 * _z;
  return _z -
     _param * 0.015 * (z5 * z2 + 1./z5 + _z + .1/_z);

    //0.1*_param * CC(cos(5*RE(_z*_z)), sin(3*IM(_z*_z)));
    //1.3*_param * CC(cos(1*RE(_z*_z*_z*_z)), IM(_z*_z));
    //0.2 * _param * CC(RE(_z*_z*_z*_z), IM(_z*_z*_z));
}

struct part {
  unsigned short iter[PART_SIZE][PART_SIZE];
};

void gtk_draw_part(int, int, struct part const*);
void gtk_init_table();
void gtk_wait();