
/* Program otworzy okno SuperBitMap na ekranie Workbencha. Jest ono takūe   */
/* typu Gimmezerozero, ma doīāczone wszystkie gadgety systemowe, a wewnātrz */
/* narysowanych bėdzie kilka prostokātów. Program skoļczy siė po 30 s.      */

#include <intuition/intuition.h>


#define WIDTH  320
#define HEIGHT 150
#define DEPTH    2


struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;



/***********************************************/
/* 1. Definicja struktury NewWindow            */
/***********************************************/

struct Window *my_window;

struct NewWindow my_new_window=
{
  10,            /* LeftEdge                              */
  30,            /* TopEdge                              */
  200,           /* Width                        */
  50,            /* Height                     */
  0,             /* DetailPen                                           */
  1,             /* BlockPen                                              */
  NULL,          /* IDCMPFlags                  */
  SUPER_BITMAP|  /* Flags       SuperBitMap. (Nie potrzeba odōwieūaź) */
  GIMMEZEROZERO| /*             Okno Gimmezerozero  */
  WINDOWCLOSE|   /*             Close Gadget */
  WINDOWDRAG|    /*             Drag gadget */
  WINDOWDEPTH|   /*             Gadgety gīėbokoōci */
  WINDOWSIZING|  /*             Sizing Gadget. */
  ACTIVATE,      /*             Okno aktywne zaraz po otwarciu */
  NULL,          /* FirstGadget  */
  NULL,          /* CheckMark    */
  "SuperBitMap", /* Title        */
  NULL,          /* Screen      Okno otwarte na ekranie Workbencha */
  NULL,          /* BitMap      Póśniej wpisze siė tu wartoōź */
  80,            /* MinWidth    Minimalne/maksymalne wymiary okna */
  30,            /* MinHeight    */
  WIDTH,         /* MaxWidth     */
  HEIGHT,        /* MaxHeight */
  WBENCHSCREEN   /* Type        Ekran Workbencha */
};



/**********************************/
/* 2. Definicja struktury BitMap  */
/**********************************/

struct BitMap my_bitmap;



main()
{
  int loop;

  IntuitionBase = (struct IntuitionBase *)
    OpenLibrary( "intuition.library", 0 );

  if( IntuitionBase == NULL )
    exit();



  /* Otwarcie graphics.library potrzebnej dla kilku operacji graficznych */
  GfxBase = (struct GfxBase *)
    OpenLibrary( "graphics.library", 0);

  if( GfxBase == NULL )
  {
    /* Bīād otwarcia graphics.library! */

    CloseLibrary( IntuitionBase );

    exit();
  }


  /***************************************/
  /* 3. Inicjalizowanie struktury BitMap */
  /***************************************/

  InitBitMap( &my_bitmap, DEPTH, WIDTH, HEIGHT );

  /* &my_bitmap: Wskaśnik do struktury BitMap */
  /* DEPTH:      Iloōź bitplanów              */
  /* WIDTH:      Szerokoōź bitmapy (musi byź podzielna przez 16) */
  /* HEIGHT:     Wysokoōź bitmapy */


  /***************************************/
  /* 4. Alokacja pamiėci dla bitplanów   */
  /***************************************/

  for( loop=0; loop < DEPTH; loop++)
    if((my_bitmap.Planes[loop] = (PLANEPTR)
      AllocRaster( WIDTH, HEIGHT )) == NULL )
    {
      /* Bīād! Za maīo pamiėci */

      /* Zwolnienie przydzielonej pamiėci (po kolei kaūdy bitplan) */
      for( loop=0; loop < DEPTH; loop++)
        if( my_bitmap.Planes[loop] ) /* Zwolniź dla tego bitplanu? */
          FreeRaster( my_bitmap.Planes[loop], WIDTH, HEIGHT );

      CloseLibrary( GfxBase );

      CloseLibrary( IntuitionBase );

      exit();
    }

  /* Rzutowanie (PLANEPTR) nie jest potrzebne, ale dziėki niemu kompilator */
  /* nie bėdzie siė czepiaī niezgodnoōci typów. Dzieje siė tak dlatego     */
  /* poniewaū my_bitmap.Planes oczekuje na wskaśnik do pamiėci obrazu      */
  /* (PLANEPTR), podczas gdy funkcja AllocRaster() zwraca wskaśnik typu    */
  /* APTR. W zasadzie dla nas jest to ta sama wartoōź, ale kompilator      */
  /* rozpoznaje zmienne po ich deklaracjach, a te sā dla niego róūne       */
  /* (APTR i PLANEPTR).                                                     */


  /*********************************/
  /* 5. Wyczyōź wszystkie bitplany */
  /*********************************/

  for( loop=0; loop < DEPTH; loop++)
    BltClear( my_bitmap.Planes[loop], RASSIZE( WIDTH, HEIGHT ), 0);

  /* Pamiėź jakā zaalokowaliōmy dla bitplanów jest z reguīy zaōmiecona  */
  /* przypadkowymi wartoōciami. Uūywamy wiėc Blittera do wyczyszczenia  */
  /* pamiėci (bo jest to najszybszy i najprostszy sposób). RASZIZE jest */
  /* jest makrodefinicjā, która oblicza iloōź pamiėci potrzebnā na      */
  /* bitplany.                                                          */


  /*******************************************************************/
  /* 6. Uzupeīniamy strukturė NewWindow o wskaśnik do struktury      */
  /*    BitMap                                                       */
  /*******************************************************************/

  my_new_window.BitMap=&my_bitmap;


  /***************************************/
  /* 7. W koļcu moūemy otworzyź okno     */
  /***************************************/

  my_window = (struct Window *) OpenWindow( &my_new_window );

  if(my_window == NULL)
  {
    /* Bīād otwarcia okna! */

    /* Zwolnienie pamiėci bitplanów */
    for( loop=0; loop < DEPTH; loop++)
      if( my_bitmap.Planes[loop] )
        FreeRaster( my_bitmap.Planes[loop], WIDTH, HEIGHT );

    CloseLibrary( GfxBase );

    CloseLibrary( IntuitionBase );

    exit();
  }



  /* To sā funkcje z graphics.library, a o tym bėdzie mowa póśniej. */
  /* Narazie nie musisz w nie wnikaź. Zauwaū, ūe jeōli zmieni siė   */
  /* rozmiar okna kilka razy to rysunek pozostaje nietkniėty.       */

  SetDrMd( my_window->RPort, JAM1 );

  SetAPen( my_window->RPort, 1 );
  Move( my_window->RPort,  10,  10 );
  Draw( my_window->RPort, 100,  10 );
  Draw( my_window->RPort, 100, 100 );
  Draw( my_window->RPort,  10, 100 );
  Draw( my_window->RPort,  10,  10 );

  SetAPen( my_window->RPort, 2 );
  Move( my_window->RPort,  12,  12 );
  Draw( my_window->RPort,  98,  12 );
  Draw( my_window->RPort,  98,  98 );
  Draw( my_window->RPort,  12,  98 );
  Draw( my_window->RPort,  12,  12 );

  SetAPen( my_window->RPort, 3 );
  Move( my_window->RPort,  14,  14 );
  Draw( my_window->RPort,  96,  14 );
  Draw( my_window->RPort,  96,  96 );
  Draw( my_window->RPort,  14,  96 );
  Draw( my_window->RPort,  14,  14 );


  Delay( 50 * 30);


  /********************************************************************/
  /* 8. Nie zapomnij o zamkniėciu okna i zwolnieniu zajėtej pamiėci   */
  /********************************************************************/

  CloseWindow( my_window );

  /* Zwolnienie zajėtej pamiėci. */
  for( loop=0; loop < DEPTH; loop++)
    if( my_bitmap.Planes[loop] )
      FreeRaster( my_bitmap.Planes[loop], WIDTH, HEIGHT );

  CloseLibrary( GfxBase );

  CloseLibrary( IntuitionBase );

}
