/* HAWAII2用, Pixel Alignment用マップ作成プログラム */
/* 2005年11月22日 衛藤茂 */

// 昔作ったmap3のソースが消失したので、思い出して作る
// map2を点対称にしたもの。
// 多分これだけでOK

//  +-------+-------+
//  |     -F|L      |
//  |   1   ||  4  ||
//  |L-     |      F|
//  +-------+-------+
//  |F      |     -L|
//  ||  2  ||   3   |
//  |      L|F-     |
//  +-------+-------+
//
//  F: First Pixle =             0 pixel
//  L: Last Pixel  = 1024*1024 - 1 pixel
//


#include <stdio.h>
#include <stdlib.h>

int main (int argc, char *argv[])
{
  int i, j;
  FILE *fp;
  char mapfile[256];
  
  int *map0, *map;
  int d1, d2, d3, d4;
  
  /* 引数のチェック */
  if((argc-1) < 1){
    fprintf(stderr, "Too few arguments!\n");
    fprintf(stderr, ">%s mapfilename\n", argv[0]);
    exit(1);
  }
  
  /* メモリーの確保 */
  map0 = (int *)malloc(2048*2048 * sizeof(int));
  map = map0;
  
  if(map0 == NULL){
    fprintf(stderr, "Can't alocate memory!\n");
    exit(1);
  }
  
  
  /* マップデータの作成 */ 
  for(i=0; i<1024; i++){
             //   行    :    列
    d1 = 2048* (2047-i) +     1023;
    d2 = 2048*    1023  +        i;
    d3 = 2048*       i  +     1024;
    d4 = 2048*    1024  + (2047-i);

    for(j=0; j<1024; j++){
      if(d1<0 || 4194303<d1) printf("i;%d, j:%d, d1=%d\n", i,j, d1);
      if(d2<0 || 4194303<d2) printf("i;%d, j:%d, d2=%d\n", i,j, d2);
      if(d3<0 || 4194303<d3) printf("i;%d, j:%d, d3=%d\n", i,j, d3);
      if(d4<0 || 4194303<d4) printf("i;%d, j:%d, d4=%d\n", i,j, d4);

      *(map++) = d1;
      *(map++) = d2;
      *(map++) = d3;
      *(map++) = d4;
      
      d1 -= 1;
      d2 -= 2048;
      d3 += 1;
      d4 += 2048;
    }
  }
  
  
  /* ファイルへの書き込み */
  //snprintf(mapfile, 256, "%s", argv[1]);
  sprintf(mapfile, "%s", argv[1]);
  
  
  if((fp=fopen(mapfile, "wb")) == NULL){
    fprintf(stderr, "Can't Open the file: [%s].\n");
    free(map0);
    exit(1);
  }
  
  if(fwrite(map0, sizeof(int), 2048*2048, fp) != 2048*2048){
    fprintf(stderr, "Can't write Map data.\n");
    free(map0);
    exit(1);
  }
  
  fclose(fp);
  free(map0);
  
  exit(0);
}
