/* This example use of imageio.library loads the image file specified
		on the command line at half size (for the example, make sure it is an
		encoded file uu or base64), and saves a decoded version to the file
		'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;
				BOOL uu;
				char decodedname[50];

				err = GetImageAttrs( ih,
					IMG_ImageType, &it,
					TAG_DONE );
				if ( !err )
				{
					printf("Image type=%d\n",it);
				}

				err = GetImageAttrs( ih,
					IMG_Width, &x,
					IMG_Height,&y,
					IMG_BytesPerPixel, &bpp,
					IMG_ColourSpace, &cs,
					IMG_RowSize, &rs,
					IMG_TestScaleNum, num,
					IMG_TestScaleDenom, denom,
					IMG_IsDecoded, &uu,
					IMG_DecodedName, decodedname,
					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 );
					printf( "image is decoded %s\n", uu == TRUE ? "yes" : "no" );
					printf( "decoded name=%s\n", decodedname );

					err = ReadImage( ih,
						IMG_ScaleNum, num,
						IMG_ScaleDenom, denom,
						IMG_ImageBuffer, &buffer,
						IMG_ProgressHook, progressFunc,
						TAG_DONE );
					if ( !err )
					{
						err = WriteImage( ih,
							IMG_WriteDecodedFile, "ram:test",
							TAG_DONE );
						if ( err ) printf( "save err=%ld\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;
}
