/*
	STELLA - Definitionen

	Teil von STELLA von Thomas Knneth, 90552 R”thenbach
*/

#ifndef _STELLADF_
#define _STELLADF_

#ifndef __AES__
#include <aes.h>
#endif

#ifndef __VDI__
#include <vdi.h>
#endif

#ifndef __PORTAB__
#include <portab.h>
#endif

#ifndef _MPDIALS_
#define	Dialmode	int
#define	DialHandler	void*
#define	BITSET		int
#define	DrawProc	void*
#define	tKey		int
#endif

#ifndef _MPXOBJEC_
#define	PtrPARMBLK	void*
#endif

#ifndef _MPEVENT_
#define HandleEvent void*
#endif

#ifndef _MPWINDOW_
#define	RewriteProc	void*
#endif

typedef enum { MONO , COLOR , TRUECOLOR } COLTYP;

/* wird auf DOC-Strukturen angewendet und ergibt Zahl der Farben */
#define	COLORS(x)	(1 << (x->planes))

typedef struct {
	int	*base,	/* Zeiger auf die Bilddaten */
		width,	/* Breite in Pixeln */
		height,	/* H”he in Pixeln */
		wpl;	/* Worte pro Zeile */
} SCINFO;

/* diese Struktur beschreibt die VDI-Farbdarstellung (0 ... 1000) */
#ifndef _DANDY_
	typedef struct {
		int	red,
			green,
			blue;
	} RGB;
#endif

/* die folgenden Werte finden bitweise Verwendung */
#define	D_ARROW		1	/* Mehrfach-Block */
#define	D_SKEW		2	/* Block neigen */
#define	D_SHADOW	4	/* Schatteneffekt */

typedef struct {
	int		angle_hor,	/* horizontaler Neigungswinkel in Grad */
			angle_ver,	/* vertikal */
			size,		/* Schattengr”že in % */
			pos_x,		/* die relative Position des Pfeils */
			pos_y,
			d_typ;		/* welche Komponenten gezeichnet werden */
} COOSYS;

typedef struct {
	int	raster,		/* von 0 (schwarz) bis 255 (weiž) */
		fg_index,	/* VDI-Farbindex Vordergrundfarbe */
		bg_index;	/* dito fr Hintergrund */
	RGB	fgc,		/* Vordergrundfarbe im TC-Modus */
		bgc;		/* Hintergrundfarbe im TC-Modus */
} D16T16;

/* diese Struktur beschreibt ein Dokument */
typedef struct _doc {
	struct _doc	*doc_prev;	/* Zeiger auf vorheriges Element */
	char		name[256];	/* kompletter Name des Bildes */
	int			handle;		/* Handle des GEM-Fensters oder -1 */
	int			elements;	/* Komponenten des Fensters */
	int			x_start,
				y_start,	/* linke obere Ecke des Bildausschnitts */
				width,		/* Breite in Pixeln */
				height;		/* und die H”he */
	int			planes;		/* Anzahl Farbebenen */
	BOOLEAN		is_tc;		/* TrueColor-Modus */
	BOOLEAN		grey;		/* Graustufenbild (nur bei palette == NULL) */
	BOOLEAN		changed;	/* wurden am Bild Žnderungen gemacht? */
	int			*standard;	/* das Bild im GEM-Standardformat */
	RGB			*palette;	/* Zeiger auf Farbpalette */
	MFDB		*data;		/* wie das Bild am Schirm angezeigt wird */
	long		*trtable;	/* Umrechnungstabelle Farbindizes->Standardformat */
	BOOLEAN		doclist_selected;
	GRECT		block;		/* markierter Bildausschnitt */
	int			*blk_stnd;	/* Zeiger auf Blockdaten im Standardformat */
	MFDB		*blk_data;	/* Zeiger auf Blockdaten im Ger„te-Format */
	GRECT		undo_blk;	/* letzter gepufferter Bereich */
	int			*undo_ptr;	/* Zeiger auf Puffer-Speicher */
	BOOLEAN		path_update,	/* nach Sichern entsprechende Nachricht? */
				system;			/* erscheint nicht in der Dokumentliste */
	int			*offset_tbl;	/* Position des Zeichens */
	char		*info_text;		/* kann vom Modul bereitgestellt werden */
	/* fr Gitterfunktionen */
	int			grid_width,
				grid_height,
				grid_flags;
} DOC;

/* wenn 'is_tc' TRUE liefert, zeigt 'standard' auf einen Speicherblock,
	der folgendermažen aufgebaut ist */
typedef	UBYTE	TCM[3];

/* diese Struktur beschreibt Konvertiermodule */
typedef	struct {
	long	magic;				/* TKGM oder TKKM */
	void	*prev;				/* Zeiger auf vorheriges Modul */
	void	*func;				/* Einsprungpunkt in Funktion */
	char	name[14];			/* Name des Moduls */
	long	reserved;			/* nicht ver„ndern! */
	char	description[30];	/* Text im 'Formatauswahl'-Dialog */
	int		version;			/* Modul-Version z.B. 0x100 */
	long	bcd_date;			/* Datum der Modulerstellung, BCD-Format */
	char	can_load,			/* welche Extensions werden gelesen? */
			can_save;			/* und welche geschrieben? */
	long	extension[8];		/* Datei-Erweiterung */
	int		width[8],			/* Breite (-1 bedeutet beliebig */
			height[8],			/* H”he */
			planes[8];			/* Planes */
} KM_INFO;

/* die folgende Struktur beschreibt allgemeine Module */
typedef struct _mp_info {
	long	magic;					/* TKGM oder TKKM */
	void	*prev;					/* Zeiger auf vorheriges Modul */
	void	*func;					/* Adresse der Funktion */
	char	name[14];				/* Name des Moduls */
	long	reserved;				/* nicht ver„ndern! */
	char	description[30];		/* Beschreibung */
	int		version;				/* Modul-Version z.B. 0x100 */
	long	bcd_date;				/* Datum der Modulerstellung, BCD-Format */
	struct {
		unsigned	planes:5;		/* das Dokument hat dann x Planes */
		unsigned	newdoc_poss:1;	/* 'neues Dokument' anw„hlbar */
		unsigned	toolbox:1;		/* in der Toolbox? */
	} flags;
	int		image_data[64];			/* Bildchen 32 * 32 Pixel */
} GM_INFO;

/*
 * Diese Struktur wird von BoxKite gefllt. Sie ist identisch mit der
 * TOS-DTA, sieht jedoch Platz fr lange Datenamen vor.
 * Verwendung mit freundlicher Genehmigung von Harald Becker
 */
typedef struct
{	char			d_reserved[21];
	unsigned char	d_attrib;
	unsigned int	d_time;
	unsigned int	d_date;
	unsigned long	d_length;
	char			d_fname[34];
} XDTA;

typedef struct
{	unsigned long	id;			/* Selectric ID (SLCT)		*/
	unsigned int	version;	/* version (BCD-Format)		*/
	struct
	{	unsigned           : 7;    /* reserved                     */
		unsigned pthsav    : 1;
		unsigned stdest    : 1;
		unsigned           : 1;
		unsigned numsrt    : 1;   /* numerisches Sortieren     */
		unsigned lower     : 1;
		unsigned dclick    : 1;   /* Ordner mit Doppelklick    */
		unsigned hidden    : 1;   /* versteckte Dateien        */
		unsigned onoff     : 1;   /* Fileselector AN/AUS       */
	} config;
	int	sort;			/* sort-mode (neg. = rev.)	*/
	int	num_ext;		/* number of extensions		*/
	char *(*ext)[];		/* preset extensions		*/
	int	num_paths;		/* number of paths		*/
	char *(*paths)[];		/* preset paths			*/
	int	comm;			/* communication word		*/
	int	in_count;		/* input counter		*/
	void *in_ptr;		/* input pointer		*/
	int	out_count;		/* output counter		*/
	void *out_ptr;		/* output pointer		*/
	int	cdecl	(*get_first)(XDTA *dta, int attrib);
	int	cdecl 	(*get_next)(XDTA *dta);
	int	cdecl	(*release_dir)(void);
} SLCT_STR;

/* einen Zeiger auf die folgende Struktur bekommt jedes Modul */
typedef struct {
	/* Variablen */
	int		vdi_handle;
	int		grid_width,
			grid_height,
			grid_flags;
	int		greyvalue_red,
			greyvalue_green,
			greyvalue_blue;
	UBYTE	*tc_buffer;
	BOOLEAN	first_rect;
	BOOLEAN	on_clip;
	COLTYP	hardware;
	int		bitplanes;
	RGB		*default_palette;
	int		default_colors;
	BOOLEAN	multi_selection;
	SLCT_STR	*slct_cookie;
	int		*grey_rasters;
	/* Maushandling */
	void	(*store_mouse)(void);
	void	(*restore_mouse)(void);
	void	(*set_mouse)(int form);
	void	(*rotor)(void);
	/* Datei laden/sichern */
	void*	(*load_file)(const char *filename,long *);
	BOOLEAN	(*save_file)(const char *,size_t *);
	/* Speicher reservieren/freigeben */
	void*	(*alloc_mem)(size_t);
	void	(*fre_mem)(void *base);
	/* Dialog-Handling */
	BOOLEAN	(*inst_userdef)(OBJECT *tree,int objc,DrawProc proc,void *private);
	void	*(*get_private)(OBJECT *tree,int objc);
	int		(*open_dial)(OBJECT *tree,Dialmode mode,int start,long flags,const char *title);
	int		(*act_entry)(OBJECT *tree,int item);
	void	(*close_dial)(OBJECT *tree);
	void	(*dispose_dial)(OBJECT *tree);
	BOOLEAN (*new_dial)(OBJECT *tree,DialHandler handler);
	void 	(*set_userkey)(OBJECT *tree,int objc,tKey key,BOOLEAN action,BOOLEAN doset);
	void	(*reset_userkeys)(OBJECT *tree);
	void	(*dial_draw)(OBJECT *tree,int entry,int depth,GRECT *clip);
	void	(*free_listbox)(OBJECT *tree,int item);
	BOOLEAN	(*add_entry)(OBJECT *tree,int item,BITSET state,void *data,const char *entry);
	void	(*get_entry)(OBJECT *tree,int item,int num,void **data,char *entry);
	int		(*max_entry)(OBJECT *tree,int item);
	void	(*set_dropbox_element)(OBJECT *tree,int item,int entry,BOOLEAN draw);
	void	(*select_entry)(OBJECT *tree,int item,int entry,int state,BOOLEAN sel);
	void	(*drop_next)(OBJECT *tree,int item);
	void	(*enable_dropbox)(OBJECT *tree,int item,BOOLEAN draw);
	void	(*disable_dropbox)(OBJECT *tree,int item,BOOLEAN draw);
	void	(*objc_pos)(OBJECT *tree,int entry,int *x,int *y);
	void	(*set_objc_string)(OBJECT *tree,int entry,char *str);
	int		(*inst_timer)(HandleEvent handler,long time);
	void	(*rmov_timer)(int id);
	/* Dokumente */
	DOC		*(*get_next_document)(DOC *document,BOOLEAN topwin_only,BOOLEAN selected_only);
	void	(*build_trtable)(RGB *palette,int colors,int x,int y,long *trtable);
	MFDB	*(*mp_stnd2spec)(int *source,long *trtable,int width,int height,int planes);
	size_t	(*mem_needed)(int,int,int,int *);
	void*	(*malloc_16)(int,int,int,BOOLEAN,int *);
	void	(*set_doc)(DOC *,int,int,int);
	void	(*set_block)(DOC *doc,int *base,int width,int height);
	DOC		*(*doc_new)(int width,int height,int planes);
	void	(*doc_changed)(DOC *doc,BOOLEAN changed);
	BOOLEAN	(*open_and_close)(DOC *new,DOC *old,BOOLEAN newdoc);
	void	(*redraw_doc)(DOC *doc,BOOLEAN update);
	BOOLEAN	(*get_block_extend)(DOC *doc,GRECT *rect);
	DOC		*(*doc_clone)(DOC *doc);
	DOC		*(*duplicate_document)(DOC *doc);
	BOOLEAN	(*doc_show)(DOC *document,BOOLEAN force_open);
	void	(*set_mfdb)(MFDB *mfdb,void *addr,int width,int height,int planes,BOOLEAN stand);
	DOC		*(*doc_load)(const char *filename,KM_INFO *mod,int *ec_ptr);
	BOOLEAN	(*save_img)(const char *filename,int *base,RGB *palette,int width,int height,int planes);
	void	(*doc_chcol)(DOC *source,DOC *desti,int *new_indices,BOOLEAN copy_palette);
	/* die folgenden 2 Funktionen konvertieren das GEM-Standardformat und
		das Format der ST-Grafikhardware ineinander */
	int	*	(*ilbm2stnd)(int *,int,int);
	void	(*stnd2ilbm)(int *,int *,int,int);
	/* die folgenden 2 Funktionen konvertieren das GEM-Standardformat und
		das PackBits-Format ineinander */
	int	*	(*PackBits2stnd)(BYTE *,int,int,int);
	BYTE *	(*stnd2PackBits)(int *,int,int,int,size_t *);
	/* die folgenden 2 Funktionen konvertieren Paletten der ST-Hardware
		und das VDI-Format ineinander */
	RGB	*	(*st2vdi)(int *,int);
	void	(*vdi2st)(RGB *,int *,int);
	/* die folgenden Funktionen wandeln int- bzw. long Werte vom
		Intel- in das Motorolla-Format um */
	int		(*int_i2m)(int);
	long	(*long_i2m)(long);
	/* setzen/ermitteln von Farbindizes */
	void  	(*get_color_indices)(int *,int,size_t,long *);
	void  	(*set_color_indices)(int *,int,size_t,long *);
	void	(*get_pixels)(DOC *doc,size_t offset,RGB *rgb_field);
	void 	(*get_line)(int *standard,int width,int height,int planes,BOOLEAN is_tc,int linenr,long *buffer);
	void	(*set_line)(int *standard,int width,int height,int planes,BOOLEAN is_tc,int linenr,long *buffer);
	/* Umwandeln von RGB-Werten */
	int  	(*dos2vdi)(int);
	int		(*rgb2grey)(RGB *rgb);
	/* diverse Funktionen */
	int		(*get_index)(KM_INFO *,long);
	void	(*blockfit)(DOC *,int *,int,int,int);
	void	(*help)(const char *what);
	int		(*get_number)(OBJECT *tree,int objc);
	void	(*set_number)(OBJECT *tree,int objc,int value);
	int		(*check_number)(OBJECT *tree,int objc,int min,int max);
	int		(*test_scrollfield)(OBJECT	*tree,int objc,int left,int text,int right,int min,int max);
	void	(*clear_clipboard)(void);
	void	(*set_description)(OBJECT *tree,int parent,int cpl,const char *str);
	void	(*set_path)(OBJECT *tree,int objc,int len,const char *str);
	void	(*central_disp)(void);
	int		(*alert)(int,const char *);
	int		(*GetCookie)(long cookie,long *value);
	void	(*rewrite_window)(int win,int handle,RewriteProc prc);
	/* Zeichenroutinen fr komplexe Objekte */
	int		(*color_popup)(RGB *palette,int colors);
	int		(*draw_coosys)(PtrPARMBLK p);
	int		(*draw_16t16)(PtrPARMBLK p);
	/* Bitmaps manipulieren */
	BOOLEAN	(*insert_block)(int *s_standard,int s_width,int s_height,int s_planes,int *b_standard,GRECT *block,int copy_mode);
	BOOLEAN	(*copy_block)(int *,int,int,GRECT *,int *,GRECT *,int,int);
	int		*(*block_skew)(int *,int,int,int,int,int,int *,int *);
	void	(*block_or_raster)(int *,int,int,int,int);
	void	(*scale)(int *,int,int,int,int,int,int,SCINFO *);
	/* Pfade und Dateinamen */
	void	(*build_filename)(const char *path,const char *name,long ext,char *filename);
	void	(*split_filename)(const char *filename,char *path,char *name);
	void	(*trunc)(char *filename,char chr);
	long	(*get_extension)(const char *);
	void	(*fit_path)(char *buffer,int len,const char *str);
	BOOLEAN	(*fsel)(char *path,char *name,long ext,char *hdl);
	/* Farbpaletten */
	RGB		*(*create_palette)(int);
	DOC		*(*adapt_palette)(DOC *doc,RGB *referenz,int ref_colors);
	RGB		*(*duplicate_palette)(RGB *base,int colors);
	void	(*find_closest)(RGB *src_pal,int src_col,RGB *dst_pal,int dst_col,int *indices);
	BOOLEAN	(*write_palette)(const char *filename,RGB *palette,int colors);
	RGB		*(*read_palette)(const char *filename,int *count_ptr);
	void	(*set_palette)(RGB *palette,int colors);
	BOOLEAN	(*change_palette)(DOC *doc,RGB *palette);
	/* lesen/setzen von Modul-Parametern */
	BOOLEAN	(*get_var)(const char *vnam,char *vval,size_t *vlen);
	BOOLEAN	(*set_var)(const char *vnam,char *vval);
	RGB		*(*create_grey_palette)(int colors);
	BOOLEAN	(*lock_module)(void *base,BOOLEAN do_lock);
	void	(*release_dir)(void);
} CUF;

/* so wird das Konvertier-Modul aufgerufen */
typedef BOOLEAN (*CALL_KM)(const char *,KM_INFO *,DOC *,BOOLEAN,CUF *);

/* und so ein allgemeines Modul */
typedef BOOLEAN (*CALL_GM)(DOC *,CUF *,GM_INFO *,BOOLEAN);

/* Modul zur Darstellung auf TC-Hardware */
typedef	BOOLEAN	(*TC_MOD)(DOC *,GRECT *,CUF *);

#endif
