/* This example use of imageio.library loads the image file specified
		on the command line at half size and saves it in jpeg format, first
		querying if its is indeed possible to do so. The file is saved in
		'ram:test'.
*/

#include <stdio.h>

#include <dos/dos.h>
#include <exec/memory.h>
#include <exec/types.h>

#include <clib/dos_protos.h>
#include <clib/exec_protos.h>
#include <clib/intuition_protos.h>

#include <pragmas/dos_pragmas.h>
#include <pragmas/exec_pragmas.h>
#include <pragmas/intuition_pragmas.h>

#include <imageio/imageio.h>
#include <imageio/imageio_protos.h>
#include <imageio/imageio_pragmas.h>

/* Function prototypes */
__saveds __asm ULONG progressFunc( register __d0 ULONG curr, register __d1 ULONG lines, register __a0 void *userdata );

extern struct Library *DOSBase;
struct Library *ImageIOBase, *IntuitionBase;

void main( int argc, char **argv )
{
	ImageIOBase = OpenLibrary( "imageio.library", 2 );
	IntuitionBase = OpenLibrary( "intuition.library", NULL );
	if ( IntuitionBase && ImageIOBase )
	{
		struct ImageHandle *ih;
		ULONG err;
		BPTR fp;

		fp = Open( argv[1], MODE_OLDFILE );
		if ( fp != NULL )
		{
			err = AllocImage( &ih, IMG_SrcFile, fp, TAG_DONE );
			if ( !err )
			{
				ULONG num = 1, denom = 2;
				ULONG x, y, bpp, rs;
				UBYTE *buffer, cs, it;
				UBYTE saveable;

				err = GetImageAttrs( ih,
					IMG_Width, &x,
					IMG_Height,&y,
					IMG_BytesPerPixel, &bpp,
					IMG_ColourSpace, &cs,
					IMG_RowSize, &rs,
					IMG_TestScaleNum, num,
					IMG_TestScaleDenom, denom,
					TAG_DONE );
				if ( !err )
				{
					printf( "width=%ld, height=%ld\n", x, y );
					printf( "bytes per pixel=%ld, colourspace=%d\n", bpp, cs );
					printf( "row size=%ld\n", rs );

					err = ReadImage( ih,
						IMG_ScaleNum, num,
						IMG_ScaleDenom, denom,
						IMG_ImageBuffer, &buffer,
						IMG_ProgressHook, progressFunc,
						TAG_DONE );
					if ( !err )
					{
						err = GetImageAttrs( ih,
							IMG_ImageType, &it,
							TAG_DONE );
						if ( !err )
						{
							printf("Image type=%d\n",it);
						}

						saveable = IMGF_ILBM;
						err = GetImageAttrs( ih,
							IMG_QuerySaveable, &saveable,
							TAG_DONE );
						if ( !err )
						{
							printf( "can save in ILBM: %s\n", saveable == 1 ? "Yes" : "No" );
						}

						saveable = IMGF_JPEG;
						err = GetImageAttrs( ih,
							IMG_QuerySaveable, &saveable,
							TAG_DONE );
						if ( !err )
						{
							printf( "can save in JPEG: %s\n", saveable == 1 ? "Yes" : "No" );
						}

						if ( saveable == 1 )
						{
							err = WriteImage( ih, IMGF_JPEG, "ram:test",
								IMG_ProgressHook, progressFunc,
								IMG_JPEG_Quality, 90,
								TAG_DONE );
							if ( !err )
							{
								printf("Image saved\n");
							}
							else printf( "write image error:%d\n", err );
						}
					}
					else printf( "read image error:%d\n", err );
				}
				else printf( "get image attrs error:%d\n", err );

				FreeImage( ih );
			}
			else printf( "alloc image error:%d\n", err );

			Close( fp );
		}
		else printf( "cant open file\n" );
	}

	if ( ImageIOBase ) CloseLibrary( ImageIOBase );
	if ( IntuitionBase ) CloseLibrary ( IntuitionBase );
}

__saveds __asm ULONG progressFunc( register __d0 ULONG curr, register __d1 ULONG lines, register __a0 void *userdata )
{
	static int prevpercent = 0;

	int percent = ( curr * 100 ) / lines;

	if ( prevpercent != percent )
	{
		if ( percent % 10 == 0 ) printf( "%d%%\n", percent );
	}

	prevpercent = percent;

	return NULL;
}
