/*

------------------------------------------------------------------

Black Nebula

File :				viewports.c
Programmer:		Colin Adams
Date:				26/4/91
Last Modified :	10/6/91

Description:

Allocates two bitmapped views for the main display.

------------------------------------------------------------------

*/

#define AMIGA_INCLUDES
#include "3d.h"


extern UWORD Palette2[];
extern short swapflag, store1, store2;

struct View my_view;
struct View back_view;

struct View *my_old_view;

struct ViewPort my_view_port;
struct ViewPort back_view_port;

struct RasInfo my_ras_info;
struct RasInfo back_ras_info;

struct BitMap my_bit_map;
struct BitMap back_bit_map;

struct RastPort my_rast_port;
struct RastPort back_rast_port;

void SetUpViews(void)
{
  UWORD *pointer;
	int loop;
	char *temppoint, *temp2;
	
  my_old_view = GfxBase->ActiView;

  InitView(&my_view);
	InitView(&back_view);
	
  my_view.ViewPort = &my_view_port;
	back_view.ViewPort = &back_view_port;

  InitVPort(&my_view_port);
	InitVPort(&back_view_port);
	
  back_view_port.DWidth = my_view_port.DWidth = G;
  back_view_port.DHeight = my_view_port.DHeight = HEIGHT;
	
  my_view_port.RasInfo = &my_ras_info;
  my_view_port.Modes = NULL;

	back_view_port.RasInfo = &back_ras_info;
	back_view_port.Modes = NULL;

  my_view_port.ColorMap = (struct ColorMap *) GetColorMap(COLOURS);
  if(my_view_port.ColorMap == NULL)
    CleanUpandExit();
	  
	back_view_port.ColorMap = (struct ColorMap *) GetColorMap(COLOURS);
  if(back_view_port.ColorMap == NULL)
    CleanUpandExit();

  pointer = (UWORD *) my_view_port.ColorMap->ColorTable;

  for(loop = 0; loop<COLOURS; loop++)
    *pointer++ = Palette2[loop];
	 
	pointer = (UWORD *) back_view_port.ColorMap->ColorTable;

  for(loop = 0; loop < COLOURS; loop++)
			*pointer++ = Palette2[loop];

  InitBitMap(&my_bit_map, DEPTH, G, HEIGHT);
	InitBitMap(&back_bit_map, DEPTH, G, HEIGHT);
	
  temppoint = AllocMem(40960, MEMF_CHIP);
  if(!temppoint)
	  CleanUpandExit();
	
	temp2 = AllocMem(40960, MEMF_CHIP);
	if(!temp2)
		CleanUpandExit();
	
	for(loop=0; loop<DEPTH; loop++)
	{
		my_bit_map.Planes[loop] = (PLANEPTR) temppoint + 10240*loop;
		back_bit_map.Planes[loop] = (PLANEPTR) temp2 + 10240*loop;
	}
	
  BltClear(temppoint, 40960, 0);
	BltClear(temp2, 40960, 0);

  my_ras_info.BitMap = &my_bit_map;
  my_ras_info.RxOffset = 0;
  my_ras_info.RyOffset = 0;
  my_ras_info.Next = NULL;
	
	back_ras_info.BitMap = &back_bit_map;
  back_ras_info.RxOffset = 0;
  back_ras_info.RyOffset = 0;
  back_ras_info.Next = NULL;
                                  

  /* Create the display: */
	
  MakeVPort(&my_view, &my_view_port);
	MakeVPort(&back_view, &back_view_port);
	
  MrgCop(&my_view);
	MrgCop(&back_view);

  InitRastPort( &my_rast_port );
  my_rast_port.BitMap = &my_bit_map;
	
	InitRastPort( &back_rast_port );
  back_rast_port.BitMap = &back_bit_map;

	InitArea(&my_area_info, areabuffer, MAX_POINTS);
	
	back_rast_port.AreaInfo = my_rast_port.AreaInfo = &my_area_info;
	
	if(!(extra_space = (PLANEPTR) AllocRaster(G,256)))
		CleanUpandExit();
	
	back_rast_port.TmpRas = my_rast_port.TmpRas = (struct TmpRas *)
		InitTmpRas(&my_temp_ras, (APTR) extra_space, RASSIZE(G,HEIGHT));

	rastport = &back_rast_port;

	BNDRYOFF(&my_rast_port); /* no boundaries around objects */
	BNDRYOFF(&back_rast_port);
	
	loadpic("screen.iff");
  LoadView(&my_view);
}

void FreeView(void)
{
  LoadView(my_old_view);

  FreeVPortCopLists(&my_view_port);
	FreeVPortCopLists(&back_view_port);
	
  FreeCprList(my_view.LOFCprList);
  FreeCprList(back_view.LOFCprList);
	
  if(my_bit_map.Planes[0])
      FreeMem(my_bit_map.Planes[0], 40960);

  if(back_bit_map.Planes[0])
	    FreeMem(back_bit_map.Planes[0], 40960);

  if(my_view_port.ColorMap) FreeColorMap(my_view_port.ColorMap);
	if(back_view_port.ColorMap) FreeColorMap(back_view_port.ColorMap);
	if(extra_space)
		FreeRaster(extra_space, G, 256);
	swapflag = 1;
	store1 = store2 = 0;
	active_list[0] = NULL;
}

/* end of module views.c */
