
 /* SD_ChangeSubs.c
    - Functions for controlling ECS-Support -
    (c) 1990-95 by Andreas R. Kleinert
    Last changes : 19.02.1995
 */

#include "svdriver.h"

ULONG __saveds __asm SVD_SetScreenType( register __a1 struct SVDriverHandle *SVDriverHandle_a1, register __d1 ULONG type, register __a2 APTR future);
ULONG __saveds __asm SVD_SetWindowFlags( register __a1 struct SVDriverHandle *SVDriverHandle_a1, register __d1 ULONG flags, register __a2 APTR future);
ULONG __saveds __asm SVD_SetWindowIDCMP( register __a1 struct SVDriverHandle *SVDriverHandle_a1, register __d1 ULONG idcmp, register __a2 APTR future);
struct Screen * __saveds __asm SVD_GetScreenAddress( register __a1 struct SVDriverHandle *SVDriverHandle_a1, register __a2 APTR future);
struct Window * __saveds __asm SVD_GetWindowAddress( register __a1 struct SVDriverHandle *SVDriverHandle_a1, register __a2 APTR future);
ULONG __saveds __asm SVD_GetModeList( register __a1 struct SVDriverHandle *SVDriverHandle_a1, register __a2 struct SVModeList **modelist, register __a3 struct SV_GfxBuffer *refbuf, register __a4 ULONG future);


/* *************************************************** */
/* *						     * */
/* * SVD_SetScreenType :                             * */
/* *						     * */
/* *************************************************** */

ULONG __saveds __asm SVD_SetScreenType( register __a1 struct SVDriverHandle *SVDriverHandle_a1, register __d1 ULONG type, register __a2 APTR future)
{
 struct SVDriverHandle *SVDriverHandle = SVDriverHandle_a1;

 if(!SVDriverHandle) return(SVERR_NO_HANDLE);

 SVDriverHandle->ah_ScreenType = type;

 return(SVERR_NO_ERROR);
}

/* *************************************************** */
/* *						     * */
/* * SVD_SetWindowFlags :                            * */
/* *						     * */
/* *************************************************** */

ULONG __saveds __asm SVD_SetWindowFlags( register __a1 struct SVDriverHandle *SVDriverHandle_a1, register __d1 ULONG flags, register __a2 APTR future)
{
 struct SVDriverHandle *SVDriverHandle = SVDriverHandle_a1;

 if(!SVDriverHandle) return(SVERR_NO_HANDLE);

 SVDriverHandle->ah_WindowFlags = flags;

 return(SVERR_NO_ERROR);
}

/* *************************************************** */
/* *						     * */
/* * SVD_SetWindowIDCMP :                            * */
/* *						     * */
/* *************************************************** */

ULONG __saveds __asm SVD_SetWindowIDCMP( register __a1 struct SVDriverHandle *SVDriverHandle_a1, register __d1 ULONG idcmp, register __a2 APTR future)
{
 struct SVDriverHandle *SVDriverHandle = SVDriverHandle_a1;

 if(!SVDriverHandle) return(SVERR_NO_HANDLE);

 SVDriverHandle->ah_WindowIDCMP = idcmp;

 return(SVERR_NO_ERROR);
}

/* *************************************************** */
/* *						     * */
/* * SVD_GetScreenAddress :                          * */
/* *						     * */
/* *************************************************** */

struct Screen * __saveds __asm SVD_GetScreenAddress( register __a1 struct SVDriverHandle *SVDriverHandle_a1, register __a2 APTR future)
{
 struct SVDriverHandle *SVDriverHandle = SVDriverHandle_a1;

 if(!SVDriverHandle) return(N);

 return(SVDriverHandle->ah_Screen);
}

/* *************************************************** */
/* *						     * */
/* * SVD_GetWindowAddress :                          * */
/* *						     * */
/* *************************************************** */

struct Window * __saveds __asm SVD_GetWindowAddress( register __a1 struct SVDriverHandle *SVDriverHandle_a1, register __a2 APTR future)
{
 struct SVDriverHandle *SVDriverHandle = SVDriverHandle_a1;

 if(!SVDriverHandle) return(N);

 return(SVDriverHandle->ah_Window);
}

/* *************************************************** */
/* *						     * */
/* * SVD_GetModeList :                               * */
/* *						     * */
/* *************************************************** */

ULONG __saveds __asm SVD_GetModeList( register __a1 struct SVDriverHandle *SVDriverHandle_a1, register __a2 struct SVModeList **modelist, register __a3 struct SV_GfxBuffer *refbuf, register __a4 ULONG future)
{
 struct SVDriverHandle *SVDriverHandle = SVDriverHandle_a1;
 struct List           *samelist = N;
 struct SVModeEntry    *entry   = N;
 ULONG                  mode_id  = INVALID_ID;
 ULONG                  mode_ret = FALSE;

 SVLI_FreeModeList(SVDriverHandle);
 *modelist = N;


 samelist = (struct List *) AllocVec(sizeof(struct SVModeList), MEMF_CLEAR|MEMF_PUBLIC);
 if(!samelist) return(SVERR_NO_MEMORY);

 *modelist = (APTR) samelist;

 (*modelist)->svm_NumEntries = 0;

 samelist->lh_Head     = (struct Node *) &(samelist->lh_Tail);
 samelist->lh_Tail     = N;
 samelist->lh_TailPred = (struct Node *) &(samelist->lh_Head);
 samelist->lh_Type     = NT_UNKNOWN;


 for(;;)
  {
   mode_id = NextDisplayInfo(mode_id);
   
   if(mode_id == INVALID_ID) break;

   entry = SVLI_GetModeEntry(mode_id, 0xFFFFFFFF);
   if(entry)
    {
     AddTail(samelist, (APTR) entry);

     (*modelist)->svm_NumEntries++;
     mode_ret = TRUE;           /* at least ONE entry */
    }
  }

 if(!mode_ret)
  {
   SVLI_FreeModeList(SVDriverHandle);
   return(SVERR_NO_MEMORY);
  }

 return(SVERR_NO_ERROR);
}

void __saveds __stdargs SVLI_FreeModeList(struct SVDriverHandle *SVDriverHandle)
{
 struct SVModeList  *modelist;
 struct SVModeEntry *selmode;

 modelist = SVDriverHandle->ah_ModeList;
 if(modelist)
  {
   for(selmode=(APTR) modelist->svm_EntryList.lh_Head;(selmode)&&(selmode!=(APTR) &(modelist->svm_EntryList.lh_Tail));)
    {
     Remove((APTR) selmode);
     FreeVec(selmode);
     selmode = (APTR) modelist->svm_EntryList.lh_Head;
    }

   FreeVec(modelist);

   SVDriverHandle->ah_ModeList = N;
  }
}

struct SVModeEntry *  __saveds __stdargs SVLI_GetModeEntry(ULONG mode_id, ULONG id_mask)
{
 struct SVModeEntry  *entry        = N;
 APTR                   mode_handle  = N;
 struct DimensionInfo  *mode_diminfo = N;
 struct NameInfo       *mode_naminfo = N;
 long                   mode_dimsize = sizeof(struct DimensionInfo);
 long                   mode_namsize = sizeof(struct NameInfo);
 ULONG                  mode_result  = N;

 mode_handle = FindDisplayInfo(mode_id);
 if(mode_handle)
  {
   mode_diminfo = (APTR) AllocVec(mode_dimsize, (MEMF_CLEAR|MEMF_PUBLIC));
   mode_naminfo = (APTR) AllocVec(mode_namsize, (MEMF_CLEAR|MEMF_PUBLIC));

   if(mode_diminfo && mode_naminfo)
    {
     mode_result = GetDisplayInfoData(mode_handle, (UBYTE *) mode_diminfo, mode_dimsize, DTAG_DIMS, N);
     mode_result = GetDisplayInfoData(mode_handle, (UBYTE *) mode_naminfo, mode_namsize, DTAG_NAME, N);

     if(mode_result && (mode_id & id_mask) && !ModeNotAvailable(mode_id))
      {
       entry = (APTR) AllocVec(sizeof(struct SVModeEntry), (MEMF_CLEAR|MEMF_PUBLIC));
       if(entry)
        {
         entry->ModeNode.ln_Name = entry->ModeName;
         strncpy(entry->ModeName, mode_naminfo->Name, 79);
         entry->ModeName[79] = (char) 0;

         entry->StandardWidth  = mode_diminfo->Nominal.MaxX+1;
         entry->StandardHeight = mode_diminfo->Nominal.MaxY+1;

         entry->MaxWidth  = mode_diminfo->MaxOScan.MaxX+1;
         entry->MaxHeight = mode_diminfo->MaxOScan.MaxY+1;

         entry->MaxDepth       = mode_diminfo->MaxDepth;
         entry->ModeID         = mode_id;
         entry->ModeHandle     = mode_handle;
        }
      }
    }

   if(mode_diminfo) FreeVec(mode_diminfo);
   if(mode_naminfo) FreeVec(mode_naminfo);
  }

 return(entry);
}
