#ifndef DEVICES_SCANNER_H
#define DEVICES_SCANNER_H
/*
**      $Filename: devices/scanner.h $
**      $Version: 1.0 $
**      $Date: 96/06/06 $
**
**      Definizione della struttura dello scanner.device
**
**      (C) Copyright 1995 Andreas Günther
**          All Rights Reserved
**
**      Questo file (scanner.h) può essere liberamente distribuito
**      se il copyright qui sopra non viene modificato o cancellato.
**
*/

#ifndef EXEC_TYPES_H
#include "exec/types.h"
#endif

#ifndef  EXEC_NODES_H
#include "exec/nodes.h"
#endif

#ifndef  EXEC_LISTS_H
#include "exec/lists.h"
#endif

#ifndef  EXEC_PORTS_H
#include "exec/ports.h"
#endif


#define SCCMD_SELECT    (CMD_NONSTD)
#define SCCMD_SETPARAMS (CMD_NONSTD+1)
#define SCCMD_ABORT     (CMD_NONSTD+2)


struct IOScanRequest {
    struct  IOStdReq Req;
    struct  TagItem  *Tags; /* per più argomenti */
    ULONG   ScannerID;      /* scanner da usare (0=default) */
    ULONG   Scanline;       /* linea successiva da scansire */
    UWORD   AreaWidth;      /* lunghezza di una linea scansita (in pixel) */
    UWORD   AreaHeight;     /* numero totale delle righe da scansire */
    ULONG   Scanmode;       /* Modo di scansione attuale */
    BYTE    DataFormat;     /* in lettura dei dati con CMD_READ */
};


struct ScannerParams {
    UWORD   Length;         /* lunghezza della struttura
                               impostate questo campo con SCANNERPARAMS_LEN */
    UWORD   Res_x;          /* Risoluzione orizzontale o verticale (in dpi)  */
    UWORD   Res_y;          /* dell'immagine scansita */
    UWORD   AreaTop;        /* Margine superiore dell'area scansita (in pixels) */
    UWORD   AreaWidth;
    UWORD   AreaLeft;       /* Margine sinistro */
    UWORD   AreaHeight;
    BYTE    Brightness;     /* impostata dall'utente (-128 to 127) */
    UBYTE   Passes;         /* numero di passate (0=passata singola) */
    ULONG   Scanmode;
};

#define SCANNERPARAMS_LEN (sizeof(struct ScannerParams))



/* ScannerParams.Passes: */

#define SCANRED   1 
#define SCANGREEN 2
#define SCANBLUE  3
#define SCAN_SP   0  /* singola passata */

/* la macro seguente restituisce il colore della n-esima passata; n=1,2 o 3 */

#define SCANPASS(Passes,n) (((Passes)>>(2*((n)-1)))&0x03)


struct ScannerInfo {
    struct  Node Node;      /* Nome dello scanner (definito dall'utente) */
    UWORD   Type;           /* Tipo scanner (piano, manuale etc.) */
    UWORD   Flags;          /* capacità etc. */
    LONG    MaxWidth;       /* massima larghezza di scansione in 1/1000 mm (-1=infinita) */
    LONG    MaxHeight;      /* massima altezza di scansione (-1=infinita) */
    ULONG   *Scanmodes;     /* array con i modi di scansione supportati, 0=fine */
    ULONG   ScannerID;      /* identificazione univoca dello scanner */
};

/* ScannerInfo.Types: */

#define SCANTYPE_OTHER      0   /* Nessuno dei tipi seguenti */
#define SCANTYPE_FLATBED    1   /* scanner piano */
#define SCANTYPE_HANDY      2   /* scanner manuale */
#define SCANTYPE_VIDEO      3   /* digitalizzatore video */
#define SCANTYPE_CAMERA     4   /* macchina fotografica digitale */


/* ScannerInfo.Flags: */

#define SCANIF_SINGLEPASS   0x01  /* Lo scanner supporta la scansione a colori a singola passata */
#define SCANIF_TRIPLEPASS   0x02  /* Lo scanner supporta la scansione a tripla passata */
#define SCANIF_SHEETFEEDER  0x04  /* Alimentatore automatico di fogli installato */
#define SCANIF_TRANSPARENCY 0x08  /* Unità per trasparenti installata */


struct ScanWinPos {         /* posizione finestra */
    UWORD   LeftEdge;
    UWORD   TopEdge;
    UWORD   Width;
    UWORD   Height;
};


/* Modi scansione: */

#define SCMB_COLOR  4               /* 0: b/n, 1:colore */
#define SCMF_COLOR  (1<<SCMB_COLOR)
#define SCMB_HT     5               /* 1: modo mezzitoni */
#define SCMF_HT     (1<<SCMB_HT)
#define SCMF_DEPTH  0x0f            /* maschera per bit per pixel e colore */

/* i seguenti modi di scansione sono attualmente supportati dallo scanner.device: */

#define SCM_TXT     0x0001  /* testo/linee */
#define SCM_HT      0x0021  /* mezzitoni */
#define SCM_GREY4   0x0004  /* 16 toni di grigio */
#define SCM_GREY8   0x0008  /* 256 toni di grigio */
#define SCM_COLOR4  0x0014  /* 4096 colori */
#define SCM_COLOR8  0x0018  /* 16.7 milioni di colori */


/* formato dati: */

#define FORMAT_GREY1     0  /* 8 pixel per byte, MSB è il pixel a sinistra */
#define FORMAT_GREY4     1
#define FORMAT_GREY8     2  /* un byte per pixel */
#define FORMAT_RGB4      3  /* un nibble per colore, R->G->B->R->G->B->...*/
#define FORMAT_RGB4LINES 4  /* r,g,b in linee successive (ogni linea inizia
                                byte-aligned !!!) */
#define FORMAT_RGB8      5  /* un byte per colore, R->G->B->R->G->B->...*/
#define FORMAT_RGB8LINES 6  /* r,g,b in linee successive */
#define FORMAT_TRIPASS4  7  /* tre passate (vedi struct ScannerParams) */
#define FORMAT_TRIPASS8  8  /* tre passate (vedi struct ScannerParams) */


/* codici errore: */

#define ScanErr_OK          0   /* nessun errore */
#define ScanErr_Cancel      1   /* l'utente ha scelto "Annulla" */
#define ScanErr_NoMemory    2   /* memoria insufficiente */
#define ScanErr_NoScanner   3   /* nessuno scanner da usare */
#define ScanErr_NoScanMode  4   /* nessuno scanmode da usare */
#define ScanErr_ScanEnd     5   /* nessun altro dato da leggere (immagine completa) */
#define ScanErr_WrongFormat 6   /* formato dati non supportato */
#define ScanErr_PaperOut    7   /* l'alimentatore automatico di alimentazione è vuoto */
#define ScanErr_NoLib       8   /* la gtlayout.library non può essere aperta */


/* tag items: */

/* Nota: non tutti i campi di tag sono già supportati. Consultate la documentazione. */

#define SCAN_Hail           (TAG_USER+1)
#define SCAN_Screen         (TAG_USER+2)
#define SCAN_LeftEdge       (TAG_USER+3)
#define SCAN_TopEdge        (TAG_USER+4)
#define SCAN_Width          (TAG_USER+5)
#define SCAN_Height         (TAG_USER+6)
#define SCAN_Scanner        (TAG_USER+7)
#define SCAN_NotWithOne     (TAG_USER+8)
#define SCAN_OKText         (TAG_USER+9)
#define SCAN_CancelText     (TAG_USER+10)
#define SCAN_IncludeScanner (TAG_USER+11)
#define SCAN_ExcludeScanner (TAG_USER+12)
#define SCAN_WinPos         (TAG_USER+13)
#define SCAN_ExcludeType    (TAG_USER+14)
#define SCAN_IncludeType    (TAG_USER+15)
#define SCAN_Default        (TAG_USER+16)
#define SCAN_AreaTop        (TAG_USER+17)
#define SCAN_AreaLeft       (TAG_USER+18)
#define SCAN_AreaWidth      (TAG_USER+19)
#define SCAN_AreaHeight     (TAG_USER+20)
#define SCAN_AreaUnit       (TAG_USER+21)
#define SCAN_Resolution_X   (TAG_USER+22)
#define SCAN_Resolution_Y   (TAG_USER+23)
#define SCAN_Brightness     (TAG_USER+24)
#define SCAN_IncludeModes   (TAG_USER+25)
#define SCAN_ExcludeModes   (TAG_USER+26)
#define SCAN_Scanmode       (TAG_USER+27)
#define SCAN_MemoryFunc     (TAG_USER+28)
#define SCAN_OpenWindow     (TAG_USER+29)
#define SCAN_BytesPerRow    (TAG_USER+30)
#define SCAN_ProgressMsgPort (TAG_USER+31)
#define SCAN_NextSheet      (TAG_USER+32)
#define SCAN_Abort          (TAG_USER+33)
#define SCAN_ScannerName    (TAG_USER+34)
#define SCAN_GetPasses      (TAG_USER+35)
#define SCAN_DataFormat     (TAG_USER+36)
#define SCAN_PaletteSize    (TAG_USER+37)
#define SCAN_PaletteDepth   (TAG_USER+38)
#define SCAN_PaletteRGB8    (TAG_USER+39)
#define SCAN_PaletteRGB32   (TAG_USER+40)
#define SCAN_Image          (TAG_USER+41)
#define SCAN_PenArray       (TAG_USER+42)
#define SCAN_MinPen         (TAG_USER+43)
#define SCAN_PenArrayMod    (TAG_USER+44)


struct ProgressMsg {        /* per la propria finestra di progresso operazione */
    struct Message Msg;
    UBYTE  Complete;        /* 0-100 % */
};


/* units: */

#define SCANUNIT_MM    0 /* 1/1000 millimetri (default) */
#define SCANUNIT_INCH  1 /* 1/1000 pollici */
#define SCANUNIT_PIXEL 2 /* pixel */


#endif
