// -*- c++ -*-

// Quick & Dirty Image Loading Routines, so far, only pnm

#ifndef IMAGE_H
#define IMAGE_H

#include <stdio.h>
#include <malloc.h>

class P_Image_Read {
public:
  P_Image_Read(const char *path, int transp):image_loaded(false),data(NULL)
  {
    FILE* const in = fopen(path,"r");
    if ( !in ) return;
    const int MAXLINE = 300;
    char line[MAXLINE];

    fgets(line,MAXLINE,in);
    if( !strcmp(line,"P6") ) {
      fprintf(stderr,"Unexpected first line.\n"); exit(1);
    }

    while ( 1 ) {
      fgets(line,MAXLINE,in);
      if( feof(in) ) {
        fprintf(stderr,"Unexpected end of file.\n"); exit(1);
      }
      if( line[0] != '#' ) break;
    }

    sscanf(line,"%d %d",&width,&height);
    const int num = width * height;
    const int size = num * 4;
    data = (unsigned char*) malloc( size );
    unsigned char *dp = data;
    fread(dp,1,1,in);
    for ( int i = 0; i < num; i++ )
      {
        fread(dp,1,3,in);
        dp[3] = ( ( dp[0] == dp[1] ) && dp[2] == transp ) ? 0 : 255;
        dp += 4;
      }
    fclose(in);
    image_loaded = true;
  };
  ~P_Image_Read() {if ( data ) free(data);  data = NULL;}

  void color_invert()
  {
    const int num = width * height * 4;
    for ( int i = 0; i < num; i+=4 )
      {
        unsigned char* const dp = &data[i];
        dp[0] = 255 - dp[0];
        dp[1] = 255 - dp[1];
        dp[2] = 255 - dp[2];
      }
  }

  void gray_to_alpha()
  {
    const int num = width * height * 4;
    for ( int i = 0; i < num; i+=4 )
      {
        unsigned char* const dp = &data[i];
        const int sum = dp[0] + dp[1] + dp[2];
        dp[3] = (unsigned char)(255 - sum * 0.3333333);
        //  dp[0] = dp[1] = dp[2] = 255;
      }
  }

  bool image_loaded;
  int width, height, maxval;
  unsigned char *data;
private:
};


#endif