/************************************************************************

 NAME               fm.h

 VERSION            2.00

 LAST EDIT          Monday 12-Apr-93 11:11:21
 LOCKED BY          -

 DESCRIPTION        Header-File for framemachine.library-Functions

 HISTORY            Author  Date        Comment
                    ---------------------------------------------------
                    ds      07-04-93    first coding
                    ds      12-04-93    DisplayInfo

*************************************************************************/

#ifndef __FM_H
#define __FM_H

/* Flags returned from QueryFlags():    */
#define FMFLG_DIGI_ON           0x0001  /* 1: Digitzer is active                */
#define FMFLG_FRAME_LOADED      0x0002  /* 1: Frame on Display was loaded       */
#define FMFLG_FRAME_DIGITIZED   0x0004  /* 1: Frame on Display was digitized    */
#define FMFLG_411               0x0008  /* 1: Display is 411 (hires)            */
#define FMFLG_211               0x0010  /* 1: Display is 211 (lores)            */
#define FMFLG_400               0x0020  /* 1: Display is 400 (hires bw)         */
#define FMFLG_200               0x0040  /* 1: Display is 200 (lores bw)         */
#define FMFLG_422               0x0080  /* 1: Display is 422 (hires loaded)     */
#define FMFLG_222               0x0100  /* 1: Display is 222 (lores loaded)     */
#define FMFLG_SNAPSHOT          0x0200  /* 1: Frame was snapshoted              */

/* Flags for DisplayMode(): */
#define PDP_OFF         0
#define PDP_AMIGA       1
#define PDP_PRISMA      2
#define PDP_PRISMA_KEY  3

/* Sizes for DisplaySize(): */
#define PDP_720 0
#define PDP_360 1
#define PDP_240 2
#define PDP_180 3
#define PDP_120 4
#define PDP_90  5
#define PDP_NUM_SIZE 6  /* # of available Sizes */

/* Sizes for FastPreview() */
#define MD_QUATER   0
#define MD_LORES    1
#define MD_HIRES    2


/* Flags for PrepRead():    */
#define READ_COLOR  (1<<0)
#define READ_BW     (1<<1)
#define READ_FIRST  (1<<2)
#define READ_SECOND (1<<3)

/* Flags for PrepWrite():   */
#define WRITE_COLOR         (1<<0)
#define WRITE_BW            (1<<1)
#define WRITE_NO_422        (1<<2)
#define WRITE_FORCE_720     (1<<3)
#define WRITE_HALF_CLOCK    (1<<6)

/* Flags for PrepSaveEDAN(): */
#define EDAN_BW         (1<<0)
#define EDAN_COLOR      (1<<1)
#define EDAN_LACE       (1<<2)
#define EDAN_RAM_BUFFER (1<<3)

/* Flags for PrepLoadEDAN():    */
#define EDAN_ORIGINAL_POS   (1<<4)
#define EDAN_HALF_CLOCK     (1<<6)

/* Flags for PutYUVN()/GetYUVN()/SaveYUVN(): */
#define YUVN_411        (1<<7)
#define YUVN_211        (1<<8)
#define YUVN_400        (1<<9)
#define YUVN_200        (1<<10)
#define YUVN_422        (1<<11)
#define YUVN_222        (1<<12)
#define YUVN_FIRST      (1<<13)
#define YUVN_SECOND     (1<<14)
#define YUVN_DONT_CARE  (1<<15)



/* Frame-Machine Preferences:   */
struct   FMPref
{
    ULONG   sys_flags;              /* See Below    */
    UWORD   display_size;           /* Display-Size */
    UWORD   display_mode;           /* Display-Mode */
    UWORD   key_mode;               /* Keymode      */
    WORD    pos_x[PDP_NUM_SIZE];    /* X-Pos of Display for each Size   */
    WORD    pos_y[PDP_NUM_SIZE];    /* Y-Pos of Display for each Size   */
    WORD    dx[PDP_NUM_SIZE];       /* Display-Offset for each Size     */
    WORD    dy[PDP_NUM_SIZE];       /* Display-Offset for each Size     */

    UBYTE       bri;
    UBYTE       sat;
    UBYTE       con;
    UBYTE       red;
    UBYTE       grn;
    UBYTE       blu;
};
#define SYSFLG_VIDEO_NTSC   0x00000001  /* 1: NTSC 0: PAL           */
#define SYSFLG_VIDEO_VCR    0x00000002  /* 1: VCR  0: TV            */
#define SYSFLG_VIDEO_YC     0x00000004  /* 1: YC   0: CVBS          */
#define SYSFLG_DUAL_MONITOR 0x00000008  /* Two Monitors attached    */
#define SYSFLG_GENLOCK      0x00000010  /* Genlock attached         */

struct  FMDisplayInfo
{
    UWORD   size;       /* Display-Size             */
    UWORD   mode;       /* Display-Mode,            */
    UWORD   keymode;    /* Number of KeyMode        */
    WORD    xpos;       /* X-Pos                    */
    WORD    ypos;       /* Y-Pos                    */
    UWORD   width;      /* Width                    */
    UWORD   height;     /* Height                   */
};

struct  EDANInfo
{
    ULONG   flags;      /* Flags        */
    UWORD   size;       /* Size Mode    */
    UWORD   width;      /* Width        */
    UWORD   height;     /* Height       */
     WORD   xpos,ypos;  /* X/Y-Position of Display when recorded    */
     WORD   frame;      /* Current frame    */
     WORD   nframe;     /* Number of frames */
    UWORD   frame_id;   /* Unique Frame-ID  */
};



typedef enum
{
    NO_ERROR,

/* Init-Errors: */
    FMERR_OUT_OF_MEMORY_FATAL,
    FMERR_NO_DOS_LIB,
    FMERR_NO_EXPANSION_LIB,
    FMERR_NO_GFX_LIB,
    FMERR_NO_INTUI_LIB,
    FMERR_NO_IFFPARSE_LIB,
    FMERR_SEMAPHORE_NOT_UNIQUE,
    FMERR_LOCKED,

/* Hardware-Errors: */
    FMERR_NO_XILINX_FILE,             /* Xilinx-Errors:                       */
    FMERR_NO_XILINX_RESPOND,
    FMERR_XILINX_FILE_CORUPTED,
    FMERR_XILINX_WRONG_VERSION,

    FMERR_ON_I2C_BUS,                 /* I2C-Errors                           */
    FMERR_SAA9051_FAILED,
    FMERR_SAA9065_FAILED,
    FMERR_TDA4680_FAILED,

    FMERR_FM_NOT_FOUND,               /* FrameMachine not found               */
    FMERR_PRISM_NOT_ATTACHED,         /* Prism is not attached                */
    FMERR_NEED_DUAL,                  /* Need Dual-Monitor for requested mode */

/* Preferences-Errors:  */
    FMERR_PREF_SIZE,                  /* Your PrefSize is not up-to-date      */
    FMERR_NO_PREF_FILE,
    FMERR_NVRAM_CORRUPTED,

/* General Errors:      */
    FMERR_IN_PARAMETER,               /* Check your parameters                */
    FMERR_OUT_OF_MEMORY,              /* Not enough memory                    */
    FMERR_INTERNAL,                   /* Internal Error. Report this!         */
    FMERR_MUST_PREPARE_FIRST,
    FMERR_CANT_OPEN_READ,
    FMERR_CANT_OPEN_WRITE,
    FMERR_READ,
    FMERR_WRITE,

/* ReadLine:  */
    FMERR_REQUESTED_SIZE_TO_BIG,      /* Your size is larger than image-size  */
    FMERR_LACE_NOT_POSSIBLE,          /* When DisplaySize < PDP_720, lace is not possible */

/* WriteLine: */
    FMERR_PICTURE_TOO_LARGE,
    FMERR_PICTURE_TOO_SMALL,

/* Preview:  */
    FMERR_BMAP_TO_SMALL,
    FMERR_NO_SCREEN,
    FMERR_NO_WINDOW,

/* LoadFile():  */
    FMERR_BAD_CMAP,
    FMERR_BAD_ILBM_FILE,
    FMERR_BAD_RGB8_FILE,
    FMERR_BAD_YUVN_FILE,
    FMERR_UNKNOWN_IFF_TYPE,
    FMERR_UNKNOWN_COMPRESSION,
    FMERR_FROM_IFFPARSE_LIB,

/* Save EDAN:   */
    FMERR_TOO_MANY_FRAMES,

/* Load EDAN:   */
    FMERR_NOT_EDAN_FORMAT,
    FMERR_OLD_EDAN_FORMAT,
    FMERR_NEW_EDAN_FORMAT,
    FMERR_EDAN_CORRUPTED,
    FMERR_BOE,                /* End Of EDAN      */
    FMERR_EOE,                /* Beginn Of EDAN   */

/* REXX-Function-Library:   */
    FM_REXX_RETURNED_STRING,

    FMERR_NOT_IMPLEMENTED,    /* Demaned feature not yet implemented. Sorry.  */


    NUMBER_OF_FM_ERRORS,
} ERRORS;

extern VOID     LockFM(VOID);
extern WORD     TryLockFM(VOID);
extern VOID     UnLockFM(VOID);
extern UBYTE*   WhoLocksFM(VOID);

extern WORD     SendI2C(UBYTE  *table, UWORD size);
extern WORD     DisplaySize(UWORD mode);
extern WORD     DisplayPos(WORD *x,  WORD *y);
extern WORD     DisplayMode(UWORD flags,  UWORD keymode);
extern WORD     QuerySize(UWORD mode,  UWORD *width, UWORD *height);
extern WORD     SnapShot(VOID);
extern WORD     GetDisplayInfo(struct FMDisplayInfo *info);
extern WORD     SetDisplayInfo(struct FMDisplayInfo *info);
extern WORD     DigiState(BOOL on);
extern BOOL     PrismAttached(VOID);
extern WORD     ClearDisplay(VOID);

extern WORD     GetFMPrefs(struct FMPref *pref, UWORD size);
extern WORD     GetSavedPrefs(struct FMPref *pref, UWORD size);
extern WORD     GetDefaultPrefs(struct FMPref *pref, UWORD size);
extern WORD     UsePrefs(struct FMPref *pref, UWORD size);
extern WORD     SavePrefs(struct FMPref *pref, UWORD size);

extern UBYTE    *ExplainStatus(WORD status);
extern VOID     DisplayStatus(WORD err);

extern WORD     PrepRead(UWORD width, UWORD height, UWORD flags);
extern WORD     EndRead(VOID);
extern WORD     ReadRGB24Line(UBYTE *r, UBYTE *g, UBYTE *b);
extern WORD     ReadBW8Line(UBYTE *bw);

extern WORD     PrepWrite(UWORD width, UWORD height, UWORD flags, UBYTE *rlut, UBYTE *glut, UBYTE *blut);
extern WORD     EndWrite(VOID);
extern WORD     WriteRGB24Line(UBYTE *r, UBYTE *g, UBYTE *b);
extern WORD     WriteBW8Line(UBYTE *y);

extern WORD     LoadFile(UBYTE  *fname, UWORD flags);

extern WORD     FastPreviewBmap(struct BitMap *bmap,struct Window *win, UWORD mode);
extern WORD     FastPreview(UWORD mode);

extern WORD     PrepSaveEDAN(UBYTE *fname, WORD nf, UWORD flags);
extern WORD     EndSaveEDAN(VOID);
extern WORD     RecordFrame(VOID);
extern WORD     QueryEDAN(struct EDANInfo *i);

extern WORD PrepLoadEDAN(UBYTE *fname, UWORD flags);
extern WORD EndLoadEDAN(VOID);
extern WORD GotoFrame(UWORD n);
extern WORD NextFrame(VOID);
extern WORD PreviousFrame(VOID);
extern WORD FirstFrame(VOID);
extern WORD LastFrame(VOID);
extern WORD SaveYUVN(UBYTE *fname, UWORD flags, WORD width, WORD height);
extern WORD GetYUVN(UWORD flags, WORD width, WORD height, UBYTE *y, UBYTE *u, UBYTE *v);
extern WORD PutYUVN(UWORD flags, WORD width, WORD height, UBYTE *y, UBYTE *u, UBYTE *v);


#endif



