#include "ppmreader.h"

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



/**
 *
 */
ppmImage_t * imageLoad(char * fileName)
{
  /* Allocating a new PPM struct for image */
  ppmImage_t * image = (ppmImage_t *)malloc(sizeof(ppmImage_t));
  if (image == NULL)
    return NULL;


  /* Opening file in read-only mode */
  FILE * imageFile = fopen(fileName, "r");
  if (imageFile == NULL)
    return NULL;


  /* Reading the magic number */
  size_t numberOfReaded = fread((void *) image->magicNumber, 2, 1, imageFile);
  if ((numberOfReaded != 1) ||
      (image->magicNumber[0] != 'P') ||
      (image->magicNumber[1] != '6'))
    {
      free(image);
      return NULL;
    }


  /* Reading width and height */
  numberOfReaded = fscanf(imageFile, "%u%u", &image->width, &image->height);
  if (numberOfReaded != 2)
    {
      free(image);
      return NULL;
    }

  /* Calculating data datadimension */
  image->dataDim = image->width*image->height;


  /* Reading maxval */
  numberOfReaded = fscanf(imageFile, "%u ", &image->maxval);
  if ((numberOfReaded != 1) || (image->maxval > 65535))
    {
      free(image);
      return NULL;
    }

  else
    if (image->maxval > 255) image->componentSize = 2;
    else                     image->componentSize = 1;


  /* Allocating memory for reading data */
  image->data = malloc(image->dataDim*(3*image->componentSize));
  if (image->data == NULL)
    {
      free(image);
      return NULL;
    }


  /* Reading data */
  numberOfReaded =
    fread(image->data, 3*image->componentSize, 3*image->dataDim, imageFile);
  if (numberOfReaded < image->dataDim)
    {
      free(image->data);
      free(image);
      return NULL;
    }


  return image;
}



/**
 *
 */
void imageFree(ppmImage_t * image)
{
  if (image)
    free((*image).data);

  free(image);
}
