[comp.sys.amiga.programmer] Graphic Screens

T32QC@CUNYVM.BITNET (NEO) (02/06/91)

      This is some code to open up a graphic screen without using intuition
You dont have to worry about title bar etc. I was just wondering how do I
make this screen overscan. This opens up a 640 *  400 screen with 16 colors.
Any  help on how to make this an overscaned screen would be greatly appreciated

                              Thanks
                              T32QC@CUNYVM.BITNET

-------------------Cut Here----------------------------------

/**********************************************************/
/*     This Opens a 640*400 Screen 16  Colors             */
/**********************************************************/

#include "exec/types.h"
#include "exec/memory.h"
#include "exec/devices.h"
#include "graphics/gfx.h"
#include "graphics/gfxbase.h"
#include "graphics/gfxmacros.h"
#include "graphics/text.h"
#include "graphics/view.h"
#include "graphics/clip.h"
#include "graphics/copper.h"
#include "graphics/gels.h"
#include "graphics/regions.h"
#include "hardware/blit.h"
#include "devices/keymap.h"



#define Width 640
#define Height 400
#define Depth 4
#define MODES HIRES|LACE



struct GfxBase *GfxBase;

struct View View;
struct ViewPort ViewPort;
struct RasInfo RasInfo;
struct BitMap BitMap;
struct RastPort RastPort;
struct View *oldView;


USHORT Colors[16] = {
                      0x000,0xfff,0x0bf,0x09f,
                      0x07f,0x06f,0x04f,0x02f,
                      0x00f,0x20f,0x40f,0xbbb,
                      0x999,0x888,0x777,0x666
                    };



/**********************************************************/
/*       Grafix Setup                                     */
/**********************************************************/

main()
{
int i;

   if((GfxBase = (struct GfxBase *)
      OpenLibrary("graphics.library",0)) == NULL)
      {
         printf(" No Graphics !!!!!");
         Exit (0);
      }

   oldView = GfxBase->ActiView;

   InitView (&View);
   InitVPort (&ViewPort);

   View.ViewPort = &ViewPort;

   View.Modes = MODES;


   ViewPort.DWidth = Width;
   ViewPort.DHeight = Height;
   ViewPort.RasInfo = &RasInfo;
   ViewPort.Modes = MODES;
   ViewPort.ColorMap = (struct ColorMap *)GetColorMap (16);
   if (ViewPort.ColorMap == 0) goto cleanup1;

   RasInfo.Next = NULL;
   RasInfo.RxOffset = 0;
   RasInfo.RyOffset = 0;
   RasInfo.BitMap = &BitMap;

   InitBitMap (&BitMap, Depth, Width, Height);

   for (i=0; i<Depth; i++)
      {
         BitMap.Planes[i] = (PLANEPTR)
               AllocRaster (Width,Height);

         if (BitMap.Planes[i] == 0)
            {
               printf ("No Memory for BitPlanes\n");
               goto cleanup1;
            }
         else
         BltClear (BitMap.Planes[i],
                  RASSIZE (Width,Height),0);

      }

   InitRastPort (&RastPort);

   RastPort.BitMap = &BitMap;



   LoadRGB4(&ViewPort,&Colors[0],16);



   MakeVPort (&View, &ViewPort);
   MrgCop (&View);
   LoadView (&View);



/****************************************************/
/*   Place Code in here such as draw lines etc.     */
/****************************************************/



/****************************************************/
/*                      Cleanup Routines            */
/****************************************************/

             FreeColorMap (ViewPort.ColorMap);
             FreeVPortCopLists (&ViewPort);
             FreeCprList (View.LOFCprList);
             FreeCprList (View.SHFCprList);

   cleanup1: for (i=0; i<Depth; i++)
                {
                   if (BitMap.Planes[i] != NULL)
                   FreeRaster (BitMap.Planes[i],
                                   Width,Height);
                }

              LoadView (oldView);
              CloseLibrary(GfxBase);
              return (0);
}

jnmoyne@lbl.gov (Jean-Noel MOYNE) (02/07/91)

     The old-fashion (i.e. 1.3) way to open an overscan ViewPort (first, 
don't know if it's different in 2.0, and anyway your program is a 1.3 
program (no tags)):

   It's very easy, to have .. like 16 pixels of overscan on each side:

ViewPort.DxOffset=-16;
ViewPort.DyOffset=-16;

and that's it !! (don't forget to add 32 to your screen's height & width), 
and if you modify the caracteristics of your vp on the fly, don't forget 
to do a MakeVPort, MrgCop & LoadView to update the display.

             JNM

--
These are my own ideas (not LBL's)