/* ep2.5.c */

#include <stdio.h>

#define LMAX 256
#define MMAX 256
#define NMAX 256

void output_eps_header(FILE *fp, int, int);
void output_eps_tail(FILE *fp);

void init_mz(int B[][NMAX+1], int m, int n);
void output_eps_mz(FILE *fp, int B[][NMAX+1], int m, int n);

int main()
{
  FILE *fp;
  char fname[LMAX];

  int n, m, i, j, q;
  int B[MMAX+1][NMAX+1];

  printf( "Nome do arquivo de saida: " );
  if (scanf("%s", fname) != 1 || (fp=fopen(fname,"w")) == NULL ) {
      fprintf(stderr, "Cannot open input file\n" );
      return 1;
  }

  scanf("%d %d %d", &m, &n, &q);
  init_mz(B, m, n);

  for (i = 0; i < m; i++) 
    for (j = 0; j < n; j++) 
      B[i][j] = (i*i + j*j) % q;

  output_eps_header(fp, m, n);
  output_eps_mz(fp, B, m, n);
  output_eps_tail(fp);

  fclose(fp);
  return 0;
}

void init_mz(int B[][NMAX+1], int m, int n)
{
  int i, j;

  for (i=0; i<m; i++)
    for (j=0; j<n; j++)
      B[i][j]=0;
}

void output_eps_mz(FILE *fp, int B[][NMAX+1], int m, int n)
{
  int i, j; 

  for (i = 0; i < m; i++) {
    for (j = 0; j < n; j++) 
      switch (B[i][j]) {
      case 0: fprintf(fp,"ff0000");
	break;
      case 1: fprintf(fp,"0000ff");
	break;
      case 2: fprintf(fp,"00ff00");
	break;
      case 3: fprintf(fp,"c0c000");
	break;
      case 4: fprintf(fp,"c000c0");
	break;
      case 5: fprintf(fp,"00c0c0");
	break;
      case 6: fprintf(fp,"c0c080");
	break;
      case 7: fprintf(fp,"c080c0");
	break;
      case 8: fprintf(fp,"80c0c0");
	break;
      case 9: fprintf(fp,"808080");
	break;
      default: fprintf(fp,"000000");
      }
    fprintf(fp, "\n");
  }
}

void output_eps_tail(FILE *fp)
{ fprintf(fp,"%%EOF\n"); }

void output_eps_header(FILE *fp, int m, int n)
{
  fprintf(fp,"%%!PS-Adobe-3.0 EPSF-3.0\n");
  fprintf(fp,"%%%%BoundingBox: -1 -1 %d %d\n", n+1, m+1);
  fprintf(fp,"%d %d scale\n", n, m);
  fprintf(fp,"%d %d 8 [%d 0 0 -%d 0 %d]\n", n, m, n, m, m);
  fprintf(fp,"{currentfile 3 %d mul string readhexstring pop} bind\n", n); 
  fprintf(fp,"false 3 colorimage\n");
}
