
 /* SV_InfoSubs.c
    - Functions for SVO-Support -
    (c) 1990-93 by Andreas R. Kleinert
    Last changes : 19.12.1993
 */

#include "svobject.h"


 /* PUBLIC functions (high level) */

ULONG __saveds __asm SVO_FileInfoRequest( register __a1 struct SVObjectHandle *SVObjectHandle_a1, register __a2 struct Window *window, register __a3 ULONG future);
ULONG __saveds __asm SVO_CheckFileType(register __a1 BPTR handle, register __a2 UBYTE *filename, register __a3 APTR future);


 /* internal functions (low level) */

long __saveds __stdargs SVLI_CheckInterleaved(struct Screen *sc);
ULONG __saveds __stdargs SVLI_GetBitMapDepth(struct Screen *sc);
ULONG __saveds __stdargs SVLI_GetBitMapHeight(struct Screen *sc);
ULONG __saveds __stdargs SVLI_GetBodySize(struct Screen *sc);


/* *************************************************** */
/* *                                                 * */
/* * SVO_FileInfoRequest : Display File Information  * */
/* *                                                 * */
/* *************************************************** */

ULONG __saveds __asm SVO_FileInfoRequest( register __a1 struct SVObjectHandle *SVObjectHandle_a1, register __a2 struct Window *window, register __a3 ULONG future)
{
 struct SVObjectHandle *SVObjectHandle = SVObjectHandle_a1;

 ULONG retval = SVERR_NO_ERROR;
 char hbuf[80], buffer [1024];
 long idcmp = N, noinfo = TRUE;
 struct EasyStruct *estr;
 struct Window     *disp_win = window;

 if(!SVObjectHandle) return(SVERR_NO_HANDLE);

 buffer[0] = (char) 0;

 if(SVObjectHandle->ah_SVOHeader)
  {
   noinfo = FALSE;

   strcat(buffer,   "\n File Information"
                  "\n\n SVO V1.0");

   strcat(buffer, "\n");

   sprintf(hbuf, "\n GfxWidth       : %ld", (long) SVObjectHandle->ah_SVOHeader->svo_Width);
   strcat(buffer, hbuf);

   sprintf(hbuf, "\n GfxHeight      : %ld", (long) SVObjectHandle->ah_SVOHeader->svo_Height);
   strcat(buffer, hbuf);

   sprintf(hbuf, "\n Colordepth     : %ld", (long) SVObjectHandle->ah_SVOHeader->svo_Depth);
   strcat(buffer, hbuf);

   sprintf(hbuf, "\n => # of Colors : %ld", (long) (1<<SVObjectHandle->ah_SVOHeader->svo_Depth));
   strcat(buffer, hbuf);

   strcat(buffer, "\n");
  }else retval = SVERR_NO_HANDLE;

 if(!retval)
  {
   if(noinfo)
    {
     strcat(buffer,   "\n File Information"
                    "\n\n No information available\n");
    }

   estr = AllocVec(sizeof(struct EasyStruct), MEMF_CLEAR);
   if(estr)
    {
     estr->es_StructSize   = sizeof(struct EasyStruct);
     estr->es_Flags        = N;
     estr->es_Title        = "SuperView InfoRequester";
     estr->es_TextFormat   = buffer;
     estr->es_GadgetFormat = "Confirm";

     if(!disp_win) disp_win = SVObjectHandle->ah_Window;

     EasyRequestArgs(disp_win, estr, &idcmp, N);
     FreeVec(estr);
    }
  }

 return(retval);
}

/* *************************************************** */
/* *						     * */
/* * SVLI_CheckFileType : ...           	     * */
/* *						     * */
/* *************************************************** */

ULONG __saveds __asm SVO_CheckFileType(register __a1 BPTR handle, register __a2 UBYTE *filename, register __a3 APTR future)
{
 ULONG retval = FALSE;
 UBYTE SVO_id[256];
 BPTR handle2;
 char svo_name [256];

 Seek(handle, N, OFFSET_BEGINNING);
 Read(handle, &SVO_id[0], 256);
 Seek(handle, N, OFFSET_BEGINNING);

 if(!strncmp(SVO_id, SVO_ID, strlen(SVO_ID))) retval = TRUE;

 if(!retval && filename)
  {
   strcpy(svo_name, filename);
   strcat(svo_name, ".svo");

   handle2 = Open(svo_name, MODE_OLDFILE);
   if(handle2)
    {
     Read(handle2, &SVO_id[0], 256);

     if(!strncmp(SVO_id, SVO_ID, strlen(SVO_ID))) retval = TRUE;

     Close(handle2);
    }
  }

 return(retval);
}

/* *************************************************** */
/* *						     * */
/* * SVLI_CheckInterleaved : Check Bitmap            * */
/* *						     * */
/* *************************************************** */

long __saveds __stdargs SVLI_CheckInterleaved(struct Screen *sc)
{
 long result = FALSE;

 if(LibVer(GfxBase) > 38) /* possible since V39 */
  {
   long attrs;

   attrs = GetBitMapAttr(sc->RastPort.BitMap, BMA_FLAGS);

   if(attrs & BMF_INTERLEAVED) result = TRUE;
  }

 return(result);
}

/* *************************************************** */
/* *						     * */
/* * SVLI_GetBitMapDepth : ...                       * */
/* *						     * */
/* *************************************************** */

ULONG __saveds __stdargs SVLI_GetBitMapDepth(struct Screen *sc)
{
 ULONG depth = 0;

 if(LibVer(GfxBase) > 38) depth = GetBitMapAttr(sc->RastPort.BitMap, BMA_DEPTH);
  else                    depth = sc->RastPort.BitMap->Depth;

 return(depth);
}

/* *************************************************** */
/* *						     * */
/* * SVLI_GetBitMapHeight : ...                      * */
/* *						     * */
/* *************************************************** */

ULONG __saveds __stdargs SVLI_GetBitMapHeight(struct Screen *sc)
{
 ULONG height = 0;

 if(LibVer(GfxBase) > 38) height = GetBitMapAttr(sc->RastPort.BitMap, BMA_HEIGHT);
  else                    height = sc->RastPort.BitMap->Rows;

 return(height);
}


/* *************************************************** */
/* *                                                 * */
/* * SVLI_GetBodySize : (BODY and ABIT size)         * */
/* *                                                 * */
/* *************************************************** */

ULONG __saveds __stdargs SVLI_GetBodySize(struct Screen *sc)
{
 long depth, rows;
 ULONG size;

 if(!sc) return(0);

 depth  = SVLI_GetBitMapDepth(sc);
 rows   = SVLI_GetBitMapHeight(sc);

 size = sc->RastPort.BitMap->BytesPerRow * rows * depth;

 return(size);
}
