#include <clib/alib_protos.h>
#include <pragma/dos_lib.h>
#include <pragma/exec_lib.h>
#include <pragma/intuition_lib.h>
#include <pragma/muimaster_lib.h>
#include <tools/tools.h>
#include <stdlib.h>
#include <string.h>

struct Arg
{
long *mode,*dither,*depth,*dct,*scale,*quality,*smooth,gray,prog,fup;
};

APTR
app,window,
CY_Mode,CY_Dither,SLI_Depth,CY_DCT,CY_Scale,
SLI_Quality,SLI_Smooth,CH_Gray,CH_Prog,CH_FUp,
BT_Save,BT_Use,BT_Quit;

char
*cycle_mode[]={"V40 AGA Mode","V43 CGX Mode",0},
*cycle_dither[]={"No Dithering","Floyd-Steinberg",0},
*cycle_dct[]={"Slow Integer","Fast Integer","Floating Point",0},
*cycle_scale[]={"1:1","1:2","1:4","1:8",0};

enum
{
ID_BT_Save=1,
ID_BT_Use
};

void InitGUI()
{
app=ApplicationObject,
	MUIA_Application_Title,"JPEG Datatypes Preferences",
	MUIA_Application_Base,"JPEG",
	MUIA_Application_Author,"Achim Stegemann",
	MUIA_Application_Copyright,"© 1999-2001 by Achim Stegemann",
	MUIA_Application_Version,"$VER:JPEGPrefs 43.4 (06.07.00)",
	MUIA_Application_Description,"MUI-Preferences 43.4 for JPEG",
	MUIA_Application_UseRexx,0,
	MUIA_Application_SingleTask,1,
	SubWindow,window=WindowObject,
		MUIA_Window_Title,"JPEG MUI-Preferences",
		MUIA_Window_ID,'JPEG',
		WindowContents,VGroup,
			Child,ColGroup(2),
				GroupFrame,
				MUIA_Background,MUII_GroupBack,
				Child,Label1("Gfx Mode"),
				Child,CY_Mode=CycleObject,
					MUIA_CycleChain,1,
					MUIA_Cycle_Active,1,
					MUIA_Cycle_Entries,cycle_mode,
				End,
				Child,Label1("V40 Dithermode"),
				Child,CY_Dither=CycleObject,
					MUIA_CycleChain,1,
					MUIA_Cycle_Entries,cycle_dither,
				End,
				Child,Label1("V40 CLUT Depth"),
				Child,SLI_Depth=SliderObject,
					MUIA_CycleChain,1,
					MUIA_Numeric_Min,3,
					MUIA_Numeric_Max,8,
					MUIA_Numeric_Value,8,
				End,
				Child,Label1("DCT Methods"),
				Child,CY_DCT=CycleObject,
					MUIA_CycleChain,1,
					MUIA_Cycle_Active,0,
					MUIA_Cycle_Entries,cycle_dct,
				End,
				Child,Label1("Scale"),
				Child,CY_Scale=CycleObject,
					MUIA_CycleChain,1,
					MUIA_Cycle_Active,0,
					MUIA_Cycle_Entries,cycle_scale,
				End,
				Child,Label1("Quality"),
				Child,SLI_Quality=SliderObject,
					MUIA_CycleChain,1,
					MUIA_Numeric_Min,0,
					MUIA_Numeric_Max,100,
					MUIA_Numeric_Value,75,
				End,
				Child,Label1("Smoothing"),
				Child,SLI_Smooth=SliderObject,
					MUIA_CycleChain,1,
					MUIA_Numeric_Min,0,
					MUIA_Numeric_Max,100,
					MUIA_Numeric_Value,0,
				End,
				Child,Label1("Gray Mode"),
				Child,CH_Gray=ImageObject,
					ImageButtonFrame,
					MUIA_InputMode,MUIV_InputMode_Toggle,
					MUIA_Image_Spec,MUII_CheckMark,
					MUIA_Image_FreeVert,1,
					MUIA_Selected,0,
					MUIA_Background,MUII_ButtonBack,
					MUIA_CycleChain,1,
				End,
				Child,Label1("Progressive Mode"),
				Child,CH_Prog=ImageObject,
					ImageButtonFrame,
					MUIA_InputMode,MUIV_InputMode_Toggle,
					MUIA_Image_Spec,MUII_CheckMark,
					MUIA_Image_FreeVert,1,
					MUIA_Selected,0,
					MUIA_Background,MUII_ButtonBack,
					MUIA_CycleChain,1,
				End,
				Child,Label1("Fancy Upsampling"),
				Child,CH_FUp=ImageObject,
					ImageButtonFrame,
					MUIA_InputMode,MUIV_InputMode_Toggle,
					MUIA_Image_Spec,MUII_CheckMark,
					MUIA_Image_FreeVert,1,
					MUIA_Selected,0,
					MUIA_Background,MUII_ButtonBack,
					MUIA_CycleChain,1,
				End,
			End,
			Child,HGroup,
				Child,BT_Save=TextObject,
					ButtonFrame,
					MUIA_Background,MUII_ButtonBack,
					MUIA_CycleChain,1,
					MUIA_ControlChar,'s',
					MUIA_InputMode,MUIV_InputMode_RelVerify,
					MUIA_Text_PreParse,MUIX_C,
					MUIA_Text_HiCharIdx,'_',
					MUIA_Text_Contents,"_Save",
				End,
				Child,BT_Use=TextObject,
					ButtonFrame,
					MUIA_Background,MUII_ButtonBack,
					MUIA_CycleChain,1,
					MUIA_ControlChar,'u',
					MUIA_InputMode,MUIV_InputMode_RelVerify,
					MUIA_Text_PreParse,MUIX_C,
					MUIA_Text_HiCharIdx,'_',
					MUIA_Text_Contents,"_Use",
				End,
				Child,BT_Quit=TextObject,
					ButtonFrame,
					MUIA_Background,MUII_ButtonBack,
					MUIA_CycleChain,1,
					MUIA_ControlChar,'c',
					MUIA_InputMode,MUIV_InputMode_RelVerify,
					MUIA_Text_PreParse,MUIX_C,
					MUIA_Text_HiCharIdx,'_',
					MUIA_Text_Contents,"_Cancel",
				End,
			End,
		End,
	End,
End;
if(!app) exit(20);
NotifyAppClose(window);
NotifyButton(BT_Save,ID_BT_Save);
NotifyButton(BT_Use,ID_BT_Use);
NotifyButton(BT_Quit,MUIV_Application_ReturnID_Quit);
}

void Ende()
{
if(app) MUI_DisposeObject(app);
}

void Save(BPTR file)
{
FPrintf(file,"%lu %lu %lu %lu %lu %lu %lu %s %s\n",
MyGetAttr(MUIA_Cycle_Active,CY_Mode),
MyGetAttr(MUIA_Cycle_Active,CY_Dither),
MyGetAttr(MUIA_Numeric_Value,SLI_Depth),
MyGetAttr(MUIA_Cycle_Active,CY_DCT),
MyGetAttr(MUIA_Cycle_Active,CY_Scale),
MyGetAttr(MUIA_Numeric_Value,SLI_Quality),
MyGetAttr(MUIA_Numeric_Value,SLI_Smooth),
MyGetAttr(MUIA_Selected,CH_Gray)?"GRAY":"",
MyGetAttr(MUIA_Selected,CH_Prog)?"PROGRESSIVE":"",
MyGetAttr(MUIA_Selected,CH_FUp)?"FANCYUP":"");
}

void SaveENV()
{
BPTR file;
if(file=Open("ENV:DataTypes/jpeg.prefs",MODE_NEWFILE))
	{
	Save(file);
	Close(file);
	}
}

void SaveENVARC()
{
BPTR file;
if(file=Open("ENVARC:DataTypes/jpeg.prefs",MODE_NEWFILE))
	{
	Save(file);
	Close(file);
	}
}

void LoadENV()
{
char *var;
if(var=(char *)AllocVec(512,0))
	{
	if(GetVar("ENV:DataTypes/jpeg.prefs",var,512,LV_VAR|GVF_GLOBAL_ONLY)>=0)
		{
		RDArgs *rdargs;
      if(rdargs=(RDArgs *)AllocDosObject(DOS_RDARGS,0))
			{
			RDArgs *args;
			Arg para;
			rdargs->RDA_Source.CS_Buffer=var;
			rdargs->RDA_Source.CS_Length=strlen(var);
			rdargs->RDA_Source.CS_CurChr=0;
			memset(&para,0,sizeof(Arg));
			if(args=ReadArgs("MODE/A/N,DITHER/A/N,DEPTH/A/N,DCT/A/N,SCALE/A/N,QUALITY/A/N,SMOOTH/A/N,GRAY/S,PROGRESSIVE/S,FANCYUP/S",(long *)&para,rdargs))
				{
				long v;
				v=*para.mode;
				if(v<0) v=0;
				else if(v>1) v=1;
				SetAttrs(CY_Mode,MUIA_Cycle_Active,v,TAG_END);
				v=*para.dither;
				if(v<0) v=0;
				else if(v>1) v=1;
				SetAttrs(CY_Dither,MUIA_Cycle_Active,v,TAG_END);
				v=*para.depth;
				if(v<3) v=3;
				else if(v>8) v=8;
				SetAttrs(SLI_Depth,MUIA_Numeric_Value,v,TAG_END);
				v=*para.dct;
				if(v<0) v=0;
				else if(v>2) v=2;
				SetAttrs(CY_DCT,MUIA_Cycle_Active,v,TAG_END);
				v=*para.scale;
				if(v<0) v=0;
				else if(v>3) v=3;
				SetAttrs(CY_Scale,MUIA_Cycle_Active,v,TAG_END);
				v=*para.quality;
				if(v<1) v=1;
				else if(v>100) v=100;
				SetAttrs(SLI_Quality,MUIA_Numeric_Value,v,TAG_END);
				v=*para.smooth;
				if(v<0) v=0;
				else if(v>100) v=100;
				SetAttrs(SLI_Smooth,MUIA_Numeric_Value,v,TAG_END);
				SetAttrs(CH_Gray,MUIA_Selected,para.gray,TAG_END);
				SetAttrs(CH_Prog,MUIA_Selected,para.prog,TAG_END);
				SetAttrs(CH_FUp,MUIA_Selected,para.fup,TAG_END);
				FreeArgs(args);
				}
			FreeDosObject(DOS_RDARGS,rdargs);
			}
		}
	FreeVec(var);
	}
}

void main()
{
UWORD ende=0;
atexit(Ende);
InitGUI();
LoadENV();
SetAttrs(window,MUIA_Window_Open,1,TAG_END);
while(!ende)
	{
	ULONG signals;
	switch(DoMethod(app,MUIM_Application_NewInput,&signals))
		{
		case MUIV_Application_ReturnID_Quit:
			ende=1;
			break;
		case ID_BT_Save:
			SaveENVARC();
		case ID_BT_Use:
			SaveENV();
			ende=1;
		}
	if(signals) signals=Wait(signals);
	}
}

extern "C" void wbmain()
{
main();
}
