
/************************************************************************/
#define OP_NAME      "pgmmean"
#define VERSION      "1.01"
#define DATE         "30.01.98"
#define AUTHOR       "Stefan Diener"
/************************************************************************/

#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <sys/types.h>

#include <STIMP/pgm.c>

struct PGM_Info source, desti;
static int m, n;
static int edge=1;

void Do_It(void)
{
  int i, j, k, l, index;
  unsigned int su, factor;
  unsigned char *src, *dst;

  src=source.Data;
  dst=desti.Data;
  desti.maxval=source.maxval;

  /* Skalierungsfaktor ermitteln */
  factor=(2*edge+1)*(2*edge+1);

  /* Filtermaske anwenden */
  for (i=edge;i<(n-edge);i++)
    for (l=edge;l<(m-edge);l++)
    {
      index=l*n+i;
      su=0;

      for (j=-edge; j<=edge; j++)
        for (k=-edge; k<=edge; k++)
          su+=src[index+j*n+k];

      dst[(l-edge)*(n-2*edge)+(i-edge)]=(unsigned char) (su/factor);
    }
}

int main(int argc,char **argv)
/* Hauptprogramm */
{
  int i;

  /* offizielle Begruessung */
  PrintOpening(argc,argv);

  /* Uebergebene Parameter auswerten */
  for (i=1; i<argc; i++)
  {
    if ((argv[i][0]=='-') && argv[i][1])
    {
      switch (argv[i][1])
      {
        case '3': edge=1;
                      break;

        case '5': edge=2;
                      break;

        case '7': edge=3;
                      break;

        case '9': edge=4;
                      break;

        case 'v': beVerbose=FALSE;
                      break;

        default: PrintMessage("Unknown parameter: %s", argv[i]);
                     Hilfe();
                     exit(-1);
                     break;
      }
    }

    if (argv[i][0]=='+')
    {
      switch (argv[i][1])
      {
        case 'v': beVerbose=TRUE;
                      break;

        default: PrintMessage("Unknown parameter: %s", argv[i]);
                     Hilfe();
                     exit(-1);
                     break;
      }
    }
  }

  /* Mindestzahl der Argumente pruefen */
  if (argc<3)
  {
    PrintMessage("Wrong number of arguments !");
    Hilfe();
    exit(-1);
  }

  /* Anzahl der Dateinamen überprüfen */
  if (FilenameCount(argc, argv)!=2)
  {
    PrintMessage("Wrong number of file names !");
    Hilfe();
    exit(-1);
  }

  if (ReadPGMFile(GetFilename(1,argc,argv), &source)==0)
  {
    m=source.height;
    n=source.width;

    if (CreatePGMArray(m-2*edge, n-2*edge, &desti)==0)
    {
      PrintMessage("Working ...");
      Do_It();

      WritePGMFile(GetFilename(2,argc,argv), &desti);
      FreePGMArray(&desti);
    }

    FreePGMArray(&source);
  }

  PrintClosing();
  exit(0);
}

