
 /* SD_SuperVisor.c
    - SuperVising (global exit) Functions for ECS-Support -
    (c) 1990-95 by Andreas R. Kleinert
    Last changes : 30.04.1995
 */

#include "svdriver.h"


struct SVDriverHandle * __saveds __asm SVD_AllocHandle( register __a1 APTR future_a1);
void __saveds __asm SVD_FreeHandle( register __a1 struct SVDriverHandle *SVDriverHandle_a1);
void __saveds __asm SVD_CloseDisplay( register __a1 struct SVDriverHandle *SVDriverHandle_a1);
void __saveds __asm SVD_FreeResources( register __a1 struct SVDriverHandle *SVDriverHandle_a1);

/* *************************************************** */
/* *						     * */
/* * SVD_AllocHandle : Free SVDriverHandle and more  * */
/* *						     * */
/* *************************************************** */

struct SVDriverHandle * __saveds __asm SVD_AllocHandle( register __a1 APTR future_a1)
{
 struct SVDriverHandle *handle;

 handle = (APTR) AllocVec(sizeof(struct SVDriverHandle), (MEMF_CLEAR|MEMF_PUBLIC));

 return(handle);
}

/* *************************************************** */
/* *						     * */
/* * SVD_FreeHandle : Free SVDriverHandle and more   * */
/* *						     * */
/* *************************************************** */

void __saveds __asm SVD_FreeHandle( register __a1 struct SVDriverHandle *SVDriverHandle_a1)
{
 struct SVDriverHandle *SVDriverHandle = SVDriverHandle_a1;

 SVD_CloseDisplay(SVDriverHandle);
 SVD_FreeResources(SVDriverHandle);

 FreeVec(SVDriverHandle);
}

/* *************************************************** */
/* *						     * */
/* * SVD_CloseDisplay : Close Display, ...           * */
/* *						     * */
/* *************************************************** */

void __saveds __asm SVD_CloseDisplay( register __a1 struct SVDriverHandle *SVDriverHandle_a1)
{
 struct SVDriverHandle *SVDriverHandle = SVDriverHandle_a1;
 APTR msg;

 if(!SVDriverHandle) return;

 if(SVDriverHandle->ah_Screen)
  {
   if(SVDriverHandle->ah_Window)
    {
     while( msg = GetMsg(SVDriverHandle->ah_Window->UserPort) ) ReplyMsg(msg);

     CloseWindow(SVDriverHandle->ah_Window);
    }

   CloseScreen(SVDriverHandle->ah_Screen);

   SVDriverHandle->ah_Window = N;
   SVDriverHandle->ah_Screen = N;
  }
}

/* *************************************************** */
/* *						     * */
/* * SVD_FreeResources : Free Memory and more        * */
/* *						     * */
/* *************************************************** */

 /* from SD_BufferSubs.c (usually called there also, if no errors occured) */

void __saveds __stdargs SVLI_Free24BitOperator(struct SVDriverHandle *SVDriverHandle);

void __saveds __asm SVD_FreeResources( register __a1 struct SVDriverHandle *SVDriverHandle_a1)
{
 struct SVDriverHandle *SVDriverHandle = SVDriverHandle_a1;

 if(!SVDriverHandle) return;

 if(SVDriverHandle->ah_TmpGfxBuffer)
  {
   SVSUP_FreeGfxBuffer(SVDriverHandle->ah_TmpGfxBuffer);
   SVDriverHandle->ah_TmpGfxBuffer = N;
  }

 SVLI_Free24BitOperator(SVDriverHandle); /* if any */
 SVLI_FreeModeList(SVDriverHandle);      /* if any */
}
