
        /****************************************************/
        /*                                                  */
        /*             F A D E R   Versione  1.0            */
        /*                                                  */
        /*                  1 Febbraio 1989                 */
        /*                                                  */
        /*           by Mario Bianchi for Amazing           */
        /*                                                  */
        /*       Programma posto in pubblico dominio        */
        /*                                                  */
        /****************************************************/


#include "functions.h"              /********************************/
#include "graphics/gfxbase.h"       /*  Inclusione headers per il   */
#include "graphics/gfxmacros.h"     /*         compilatore          */
#include "libraries/dos.h"          /********************************/
#include "graphics/view.h"

extern struct GfxBase *GfxBase;

WORD colors[32],        /*  colormaps di supporto per il demo  */
     nullcolors[32];

/*--------------------------------------------------------------------------*/

            /************************************************/
            /*  Funzione di supporto per la 'manutenzione'  */
            /*            delle mappe dei colori            */
            /************************************************/

PreparaMappe(viewport)
struct ViewPort *viewport;
{
    int f,g=1<<viewport->RasInfo->BitMap->Depth;
    for (f=0;f<g;f++)
    {
        colors[f]=GetRGB4(viewport->ColorMap,f);
        nullcolors[f]=GetRGB4(viewport->ColorMap,0);
    }
}


/*--------------------------------------------------------------------------*/


Fade(viewport,cmap)
struct ViewPort *viewport;
WORD *cmap;
{
    /************************************************************/
    /*              INIZIALIZZAZIONE DELLE VARIABILI            */
    /************************************************************/

    BOOL change=TRUE;   /*  indica se la routine ha terminato il fade   */

                        /************************************************/
    int target,         /*              colore da raggiungere           */
        targetred,      /*  componente rosso del colore da raggiungere  */
        targetgreen,    /*  "   "   "  verde   "   "   "   "   "   "    */
        targetblue,     /*  "   "   "  blu     "   "   "   "   "   "    */
                        /************************************************/

                        /************************************************/
        item,           /*              colore di partenza              */
        itemred,        /*   componente rosso del colore di partenza    */
        itemgreen,      /*  "   "   "   verde   "   "   "   "   "   "   */
        itemblue,       /*  "   "   "   blu     "   "   "   "   "   "   */
                        /************************************************/

        f,              /*               Semplice contatore             */

                                                    /*  Numero  colori  */
        g=1<<viewport->RasInfo->BitMap->Depth;      /*      della       */
                                                    /*     colormap     */


    WORD *using;        /*             Puntatore di lavoro              */




    /********************************************************************/
    /*      CICLO PRINCIPALE CHE SI RIPETE FINO AL COMPLETAMENTO        */
    /*                      DELL'EFFETTO DI FADE                        */
    /********************************************************************/

    while (change)
    {
        change=FALSE;                       /*      Resetta flag       */
        using=cmap;                         /* Reinizializza puntatore */

        /**********************************************************/
        /*            Ciclo di modifica per ogni colore           */
        /*--------------------------------------------------------*/
        /*    Ogni iterazione esegue la trasformazione per ogni   */
        /* colore di blu,rosso e verde separatamente, aggiungendo */
        /*   o togliendo 1 ad ogni componente nella direzione di  */
        /*          'avvicinamento' al colore di arrivo           */
        /**********************************************************/
        for (f=0;f<g;f++)
        
        {
            item=GetRGB4(viewport->ColorMap,f);         /****************/
            itemred=(item&0x0f00)>>8;                   /* Estrae  dati */
            itemgreen=(item&0x00f0)>>4;                 /*  del colore  */
            itemblue=item&0x000f;                       /* di  partenza */
                                                        /****************/


            target=*(using++);                          /****************/
            targetred=(target&0x0f00)>>8;               /* Prepara dati */
            targetgreen=(target&0x00f0)>>4;             /*  del colore  */
            targetblue=target&0x000f;                   /*  di  arrivo  */
                                                        /****************/

                            /******************/
                            /* Modifica rosso */
                            /******************/
            if (targetred!=itemred) 
                itemred+=((targetred>itemred)?(1):(-1));


                            /******************/
                            /* Modifica verde */
                            /******************/
            if (targetgreen!=itemgreen) 
                itemgreen+=((targetgreen>itemgreen)?(1):(-1));


                             /****************/
                             /* Modifica blu */
                             /****************/
            if (targetblue!=itemblue)
                itemblue+=((targetblue>itemblue)?(1):(-1));
                
                
                    /********************************/
                    /* Abilita il colore modificato */
                    /********************************/
            SetRGB4(viewport,f,itemred,itemgreen,itemblue);


            /*************************************************/
            /*  Se uno dei colori non ha ancora raggiunto il */
            /*  colore di arrivo, il flag di controllo viene */
            /*   messo a 1, allo scopo di far eseguire una   */
            /*    ulteriore iterazione di 'avvicinamento'    */
            /*************************************************/
            if ((itemred!=targetred)||
                (itemgreen!=targetgreen)||
                (itemblue!=targetblue))
                    change=TRUE;
        }
        Delay(2);       /*  Ritarda 2 cinquantesimi di secondo, */
                        /* per rendere l'effetto piu' "morbido" */
    }
}


/**********************************************************************/
/*                                                                    */
/*  Programma dimostrativo: fa 'spegnere' e 'riaccendere' lo schermo  */
/*                                                                    */
/**********************************************************************/


main()
{
    /* Apre libreria Gfx */
    if (!(GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",0)))
    {
        printf("Non posso aprire la graphics library!\n");
        return;
    }

    /* Prepara la mappa coi colori  di 'sparizione'  */
    /*      e salva la mappa dei colori in uso       */
    PreparaMappe(GfxBase->ActiView->ViewPort);
    
    /*  Scomparsa schermo  */
    Fade(GfxBase->ActiView->ViewPort,&nullcolors[0]);
    
    /*  Ricomparsa schermo  */
    Fade(GfxBase->ActiView->ViewPort,&colors[0]);

    /* Chiude libreria Gfx  */
    CloseLibrary(GfxBase);
}
