
 /* SV_BufferSubs.c
    - Functions for Buffering SVO Files -
    (c) 1993-94 by Andreas R. Kleinert
    Last changes : 07.05.1994
 */


#include "svobject.h"

ULONG __saveds __asm SVO_ReadToGfxBuffer( register __a1 struct SVObjectHandle *SVObjectHandle_a1);
ULONG __saveds __asm SVO_GetGfxBuffer(    register __a1 struct SVObjectHandle *SVObjectHandle_a1,
                                          register __a2 struct SV_GfxBuffer **bufferhandle,
                                          register __a3 ULONG future);
ULONG __saveds __asm SVO_SetGfxBuffer(    register __a1 struct SVObjectHandle *SVObjectHandle_a1,
                                          register __a2 struct SV_GfxBuffer *bufferhandle,
                                          register __a3 ULONG future);

ULONG __saveds __asm SVO_ReadToGfxBuffer( register __a1 struct SVObjectHandle *SVObjectHandle_a1)
{
 struct SVObjectHandle *SVObjectHandle = SVObjectHandle_a1;

 ULONG retval = SVERR_NO_ERROR;
 struct TagItem __aligned xpk_pars [5];
 char filename [256], filename_svo [256];

 if(!SVObjectHandle) return(SVERR_NO_HANDLE);

 SVObjectHandle->ah_SVOHeader = AllocVec(sizeof(struct SVOHeader), (MEMF_CLEAR|MEMF_PUBLIC));
 if(!SVObjectHandle->ah_SVOHeader) return(SVERR_NO_MEMORY);

 SVObjectHandle->ah_ramhandle = SVSUP_GetMemList();
 if(!SVObjectHandle->ah_ramhandle) return(SVERR_NO_MEMORY);

 if(strlen(SVObjectHandle->ah_ReadName) > 4)
  {
   if(!stricmp(&SVObjectHandle->ah_ReadName[strlen(SVObjectHandle->ah_ReadName)-4], ".svo"))
    {
     strcpy(filename_svo, SVObjectHandle->ah_ReadName);
     strcpy(filename,     SVObjectHandle->ah_ReadName);
     filename[strlen(filename)-4] = (char) 0;
    }else
    {
     strcpy(filename,     SVObjectHandle->ah_ReadName);
     strcpy(filename_svo, SVObjectHandle->ah_ReadName);
     strcat(filename_svo, ".svo");
    }
  }else
  {
   strcpy(filename_svo, SVObjectHandle->ah_ReadName);
   strcat(filename_svo, ".svo");
   strcpy(filename,     SVObjectHandle->ah_ReadName);
  }

 SVObjectHandle->ah_filehandle_dest = Open(filename_svo, MODE_OLDFILE);
 if(!SVObjectHandle->ah_filehandle_dest) return(SVERR_NO_FILE);

 Read(SVObjectHandle->ah_filehandle_dest, SVObjectHandle->ah_SVOHeader, SVOHEADER_SIZE);

 /* Read XPK Data */

 xpk_pars[0].ti_Tag  = XPK_GetOutBuf;
 xpk_pars[0].ti_Data = (ULONG) &SVObjectHandle->ah_XpkBuffer;

 xpk_pars[1].ti_Tag  = XPK_GetOutBufLen;
 xpk_pars[1].ti_Data = (ULONG) &SVObjectHandle->ah_XpkBufferSize;

 xpk_pars[2].ti_Tag  = XPK_InName;
 xpk_pars[2].ti_Data = (ULONG) filename;

 xpk_pars[3].ti_Tag  = XPK_PassThru;
 xpk_pars[3].ti_Data = (ULONG) TRUE;

 xpk_pars[4].ti_Tag  = TAG_DONE;
 xpk_pars[4].ti_Data = N;

 XpkUnpack(&xpk_pars[0]);

 if(!SVObjectHandle->ah_XpkBuffer || !SVObjectHandle->ah_XpkBufferSize) return(SVERR_NO_MEMORY);


 /* Initialize SV_GfxBuffer */

 SVObjectHandle->ah_SV_GfxBuffer = AllocVec(sizeof(struct SV_GfxBuffer), (MEMF_CLEAR|MEMF_PUBLIC));
 if(!SVObjectHandle->ah_SV_GfxBuffer) return(SVERR_NO_MEMORY);

 SVObjectHandle->ah_SV_GfxBuffer->svgfx_Version = SVGFX_VERSION;

 if(SVObjectHandle->ah_SVOHeader->svo_PixelBits == 1)
  {
   SVObjectHandle->ah_SV_GfxBuffer->svgfx_BufferType   = SVGFX_BUFFERTYPE_BITPLANE;
   SVObjectHandle->ah_SV_GfxBuffer->svgfx_BytesPerLine = SVObjectHandle->ah_SVOHeader->svo_BytesPerLine;
  }else
  {
   SVObjectHandle->ah_SV_GfxBuffer->svgfx_BufferType   = SVGFX_BUFFERTYPE_ONEPLANE;
   SVObjectHandle->ah_SV_GfxBuffer->svgfx_PixelBits    = SVObjectHandle->ah_SVOHeader->svo_PixelBits;
  }

 SVObjectHandle->ah_SV_GfxBuffer->svgfx_Width          = SVObjectHandle->ah_SVOHeader->svo_Width;
 SVObjectHandle->ah_SV_GfxBuffer->svgfx_Height         = SVObjectHandle->ah_SVOHeader->svo_Height;
 SVObjectHandle->ah_SV_GfxBuffer->svgfx_ColorDepth     = SVObjectHandle->ah_SVOHeader->svo_Depth;

 if(SVObjectHandle->ah_SVOHeader->svo_Version) SVObjectHandle->ah_SV_GfxBuffer->svgfx_ViewMode32 = SVObjectHandle->ah_SVOHeader->svo_ViewMode32;
  else                                         SVObjectHandle->ah_SV_GfxBuffer->svgfx_ViewMode32 = SVObjectHandle->ah_SVOHeader->svo_BAD_ViewMode32;

 SVObjectHandle->ah_SV_GfxBuffer->svgfx_Buffer         = SVObjectHandle->ah_XpkBuffer;
 SVObjectHandle->ah_SV_GfxBuffer->svgfx_BufferSize     = SVObjectHandle->ah_XpkBufferSize;

 SVObjectHandle->ah_XpkBuffer     = N;
 SVObjectHandle->ah_XpkBufferSize = N;

 CopyMem(SVObjectHandle->ah_SVOHeader->svo_Colors, SVObjectHandle->ah_SV_GfxBuffer->svgfx_Colors, 768);

 return(retval);
}

ULONG __saveds __asm SVO_GetGfxBuffer(    register __a1 struct SVObjectHandle *SVObjectHandle_a1,
                                          register __a2 struct SV_GfxBuffer **bufferhandle,
                                          register __a3 ULONG future)
{
 struct SVObjectHandle *SVObjectHandle = SVObjectHandle_a1;
 ULONG retval = SVERR_NO_ERROR;

 if(!SVObjectHandle) return(SVERR_NO_HANDLE);

 if(!bufferhandle) return(SVERR_ILLEGAL_ACCESS);

 *bufferhandle = SVObjectHandle->ah_SV_GfxBuffer;

 return(retval);
}

ULONG __saveds __asm SVO_SetGfxBuffer(    register __a1 struct SVObjectHandle *SVObjectHandle_a1,
                                          register __a2 struct SV_GfxBuffer *bufferhandle,
                                          register __a3 ULONG future)
{
 struct SVObjectHandle *SVObjectHandle = SVObjectHandle_a1;
 ULONG retval = SVERR_NO_ERROR;

 if(!SVObjectHandle) return(SVERR_NO_HANDLE);

 if(!bufferhandle) return(SVERR_ILLEGAL_ACCESS);

 SVObjectHandle->ah_SV_GfxBuffer2 = bufferhandle;

 return(retval);
}
