/*
**
**      Project     : 15BitDemo - this is the main file
**      Version     : 1.1
**      File        : 15BitDemo - Demonstration of using the 15 Bit mode
**                                Draws some coloured rectangles into the screen.
**                                Can be aborted with keystroke or mouseclick.
**
**      Authors     : David Göhler, Uwe Röhm
**      Date   Init : 21. November 1992
**             Last : 28. April 1993
**      Company     : VillageTronic Marketing GmbH, Hannover, Germany
**
**      To compile with
**         DICE          type "make"
**         SAS/C V6.x    type "sc LINK OPT PARMS=REGS NOSTKCHK 15BitDemo.c vilintuisup.c"
**      For other compilers you may have to do minor changes.
**
**      This programm will only run, if the monitor file supplied
**      with your graphics card is installed and running.
**
**      THIS IS NOT PD. THIS IS COMMERCIAL SOFTWARE.
**
*/
#include "SysInclude.h"
#include "vilintuisup.h"

BOOL Demo15Bit(struct Screen *s, struct Dimensions *dm, ULONG sigmask);

static char Version[] = "$VER: 15BitDemo 1.1 (28.04.93)  (c) 1993 by Village Tronic Marketing GmbH";

extern struct Library *SysBase;
extern struct Library *DOSBase;
struct Library *VilIntuiBase;
struct Library *IntuitionBase;
struct Library *GfxBase;

main()
{
   struct Dimensions     dm;  /* Struktur mit den Dimensionen des Screens */
   struct NewWindow      nw;  /* Struktur für das IDCMP Fenster           */
   struct Screen        *s = NULL;
   struct Window        *w = NULL;

   /*
    *    Initialisieren der Dimensionen für den Bildschirm
    */
   dm.width  = 800;           /* Breite in Pixeln                         */
   dm.height = 600;           /* Höhe   in Pixeln                         */
   dm.depth  = 15;            /* Tiefe in Bit - 15 steht für 2^15 Farben  */

   /*
    *    Wir benötigen eine Reihe von Libraries.
    *    Wenn keine Picasso im System vorhanden ist, kann die vilintuisup
    *    Library nicht geöffnet werden!
    */
   if (VilIntuiBase = OpenLibrary("vilintuisup.library",0))
   { if (IntuitionBase = OpenLibrary("intuition.library",0))
     { if (GfxBase = OpenLibrary("graphics.library",0))
       {
         /*
          *    Den 15 Bit tiefen HiColor Screen öffnen
          */
         if (s = OpenVillageScreen(&dm)) /* Screen öffnen */
         {
           /*
            *    Die NewScreen-Struktur vorbereiten. Auf dem Bildschirm wird ein
            *    Backdrop Fenster geöffnet, um von der Intuition IDCMP Messages
            *    bekommen zu können (Hier im Beispiel: Tasten und Mausklicks).
            *    Das Fenster müßte nicht unbedingt mit BACKDROP und BORDERLESS
            *    geöffnet werden, da die Screenverwaltung unseres Intuition-
            *    Treibers das Zeichnen auf 15/16/24 Bit Screens über das OS
            *    verhindert. Nichtsdestotrotz ist es aber sauberer...
            */
           nw.LeftEdge  = 0; /*Das Fenster soll den ganzen Screen abdecken*/
           nw.TopEdge   = 0;
           nw.Width     = s->Width;
           nw.Height    = s->Height;
           nw.FirstGadget = NULL; /* keine Gadgets im Fenster */
           nw.Title     = NULL;
           nw.IDCMPFlags= IDCMP_VANILLAKEY | IDCMP_MOUSEBUTTONS;
           nw.Flags     = WFLG_BACKDROP | WFLG_BORDERLESS | WFLG_RMBTRAP | WFLG_ACTIVATE;
           nw.Type      = CUSTOMSCREEN;
           nw.Screen    = s;

           if ( w = OpenWindow(&nw) )
           {
             struct Message *msg;
             ULONG           sigs = SIGBREAKF_CTRL_C | (1 << w->UserPort->mp_SigBit);

             /*
              *   Die Rechtecke zeichnen und danach warten (falls nicht abgebrochen)
              */
             if ( Demo15Bit(s,&dm, sigs) )
               Wait( sigs );

             /*
              *   Als vorsichtige Menschen den UserPort leeren und dann
              *   erst das Fenster schließen.
              */
             while ( msg = GetMsg(w->UserPort) )
               ReplyMsg( msg );
             CloseWindow(w);               /* Fenster wieder schließen    */

           } /* if OpenWindow() */

           CloseVillageScreen(s);       /* und Screen wieder schließen */
         }
         else
         {  PutStr("Konnte VILLAGE-Screen 15 Bit nicht öffnen\n");
         }
         CloseLibrary(GfxBase);
       }
       CloseLibrary(IntuitionBase);
     }
     CloseLibrary(VilIntuiBase);
   }
   else
   {  PutStr("Konnte \"vilintuisup.library\" nicht öffnen\n");
   }

   return 0;
}


/*
 * Demo15Bit zeichnet ein paar Vierecke in Farbe
 */
BOOL Demo15Bit(struct Screen *s, struct Dimensions *dm, ULONG sigmask)
{
   register UWORD red, green, blue;
   UWORD xoffset[] = {2,102,202,302,402,502,602,702};
   UWORD yoffset[] = {11,161,311,461};

   if (dm->depth != 15)
   {  PutStr("Not a 15 Bit VideoMode\n");
      return 0;
   }

   /*
    *  Der Screen wird hier komplett gelocked.
    *  Dadurch kann man NICHT zwischendurch den Screen umschalten...
    *  Würde das LockVillageScreen() in die for(red...) Schleife
    *  gehen, würde die Demo langsamer, man könnte aber umschalten.
    */
   LockVillageScreen(s);

   for(blue=0;blue<32;blue++)
   {
     for(green =0;green<32;green++)
     {
       /*
        *  Die Demo kann nach jeder Zeile mit CTRL-C oder einer Eingabe
        *  (Tastatur oder Maus) abgebrochen werden
        */
       if ( CheckSignal( sigmask ) )
          return FALSE;

       for(red=0;red<32;red++)
       {
         Set15BitPixel(s,(red*3)+xoffset[blue&0x07],   (green<<2)+yoffset[blue>>3],   red, green, blue);
         Set15BitPixel(s,(red*3)+xoffset[blue&0x07]+1, (green<<2)+yoffset[blue>>3],   red, green, blue);
         Set15BitPixel(s,(red*3)+xoffset[blue&0x07]+2, (green<<2)+yoffset[blue>>3],   red, green, blue);
         Set15BitPixel(s,(red*3)+xoffset[blue&0x07],   (green<<2)+yoffset[blue>>3]+1, red, green, blue);
         Set15BitPixel(s,(red*3)+xoffset[blue&0x07]+1, (green<<2)+yoffset[blue>>3]+1, red, green, blue);
         Set15BitPixel(s,(red*3)+xoffset[blue&0x07]+2, (green<<2)+yoffset[blue>>3]+1, red, green, blue);
         Set15BitPixel(s,(red*3)+xoffset[blue&0x07],   (green<<2)+yoffset[blue>>3]+2, red, green, blue);
         Set15BitPixel(s,(red*3)+xoffset[blue&0x07]+1, (green<<2)+yoffset[blue>>3]+2, red, green, blue);
         Set15BitPixel(s,(red*3)+xoffset[blue&0x07]+2, (green<<2)+yoffset[blue>>3]+2, red, green, blue);
         Set15BitPixel(s,(red*3)+xoffset[blue&0x07],   (green<<2)+yoffset[blue>>3]+3, red, green, blue);
         Set15BitPixel(s,(red*3)+xoffset[blue&0x07]+1, (green<<2)+yoffset[blue>>3]+3, red, green, blue);
         Set15BitPixel(s,(red*3)+xoffset[blue&0x07]+2, (green<<2)+yoffset[blue>>3]+3, red, green, blue);

       } /* for red */

     } /* for green */

   } /* for blue */

   UnLockVillageScreen(s);
}
