// This sourcefile is created by Peter Jodda / peter@jodda.de
// It is under the Peter Jodda license:
// Everyboy may use it on his own risk. This header must stay in the file!
// If you expand this file, please contact me, that I can integrate the
// enhancemants in the original file.
//

/* jpeg_datei.c
 *
 */
/* include jpeg stuff */
#include <unistd.h>
#include <stdio.h>
#include <string.h>

extern "C"
{
#include <jpeglib.h>
}

#include "jpeg_datei.h"

#define JPEG_FILENAMELENGTH 256


/* struktur fuer das jpeg lesen */

/**************************************************************
 *  Allozieren der jpeg strukturen
 */

JpegInfoType::JpegInfoType()
{

   jpegDatei          =NULL;
   zeilenSchonGelesen =0;
   
}



/**************************************************************
 * freigeben der jpeg strukturen
 */

JpegInfoType::~JpegInfoType()
{
   /* beenden und freigeben der jpeg datenbloecke */

  
   if(zeilenSchonGelesen == jpegInfo.image_height)
   {
      jpeg_finish_decompress(&jpegInfo);
   }
   
   jpeg_destroy_decompress(&jpegInfo);

   if(jpegDatei != NULL)
   {
      fclose(jpegDatei);
      jpegDatei=NULL;
   }

}

/**************************************************************
 *  gibt die bildbreite zurueck
 */

int JpegInfoType::JpegGetBildBreite()
{
   return (int) jpegInfo.image_width;
}

/**************************************************************
 *  gibt ide bildhoehe zurueck
 */

int JpegInfoType::JpegGetBildHoehe()
{
   return (int) jpegInfo.image_height;
}

/**************************************************************
 *   setz den dateinamen und inititaliert die decompression
 */

int JpegInfoType::JpegSetFilename(char *filename)
{

   strncpy(dateiname,filename,JPEG_FILENAMELENGTH);

   jpegInfo.err =jpeg_std_error(&jpegError);
   
   jpeg_create_decompress(&jpegInfo);
     
   jpegDatei = fopen(dateiname,"r");

   jpeg_stdio_src(&jpegInfo,jpegDatei);
   
   /*===================================*/
   
   jpeg_read_header(&jpegInfo,TRUE);
  		

   jpeg_start_decompress(&jpegInfo);

   row_stride = jpegInfo.output_width * jpegInfo.output_components;

   buffer = (*jpegInfo.mem->alloc_sarray)
		((j_common_ptr) &jpegInfo, 
		 JPOOL_IMAGE, 
		 row_stride, 
		 1);


}

/**************************************************************
 *  liest eine zeile, gibt adr auf einen datenpuffer zurueck
 */

unsigned char * JpegInfoType::JpegReadLine()
{
   unsigned char *outbuffer; 
   
   jpeg_read_scanlines(&jpegInfo,buffer,1);
   outbuffer = (unsigned char *) *(buffer);
   zeilenSchonGelesen +=1;

   return outbuffer;
}

