
 /* SV_WriteSubs.c
    - Functions for Writing of SVO Files -
    (c) 1990-94 by Andreas R. Kleinert
    Last changes : 27.05.1994
 */

#include "svobject.h"


 /* PUBLIC functions */

ULONG __saveds __asm SVO_Write( register __a1 struct SVObjectHandle *SVObjectHandle_a1);


/* *************************************************** */
/* *						     * */
/* * SVO_Write : ...                                 * */
/* *						     * */
/* *************************************************** */

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

 ULONG retval = SVERR_NO_ERROR;
 char filename [256], filename_svo [256];


 if(!SVObjectHandle)                              return(SVERR_NO_HANDLE);
 if(SVObjectHandle->ah_Medium != AKO_MEDIUM_DISK) return(SVERR_ACTION_NOT_SUPPORTED);

 if(!SVObjectHandle->ah_SV_GfxBuffer2)
  {
   if(SVObjectHandle->ah_WriteScreen)
    {
     retval = SVSUP_ScreenToBitPlane8(SVObjectHandle->ah_WriteScreen, &SVObjectHandle->ah_SV_GfxBuffer2);
     if(retval) return(retval);

     if(!SVObjectHandle->ah_SV_GfxBuffer2) return(SVERR_NO_MEMORY);

     /* to free the memory : */

     SVObjectHandle->ah_SV_GfxBuffer = SVObjectHandle->ah_SV_GfxBuffer2;

    }else return(SVERR_ACTION_NOT_SUPPORTED);
  }else
  {
   if(SVObjectHandle->ah_SV_GfxBuffer2->svgfx_BufferType == SVGFX_BUFFERTYPE_ONEPLANE)
    {
     retval = SVSUP_OnePlaneToBitPlane8(SVObjectHandle->ah_SV_GfxBuffer2, &SVObjectHandle->ah_SV_GfxBuffer);
     if(retval) return(retval);

     if(!SVObjectHandle->ah_SV_GfxBuffer) return(SVERR_NO_MEMORY);

     /* now set it to make use of it : */

     SVObjectHandle->ah_SV_GfxBuffer2 = SVObjectHandle->ah_SV_GfxBuffer;
    }
  }

 if(SVObjectHandle->ah_SV_GfxBuffer2->svgfx_BufferType != SVGFX_BUFFERTYPE_ONEPLANE) return(SVERR_ACTION_NOT_SUPPORTED);

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

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

 SVObjectHandle->ah_filehandle_dest2 = Open(filename, MODE_NEWFILE);
 if(!SVObjectHandle->ah_filehandle_dest2) return(SVERR_NO_FILE);

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

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


 /* init header */

 strcpy(SVObjectHandle->ah_SVOHeader->svo_ID, SVO_ID);

 SVObjectHandle->ah_SVOHeader->svo_Version        = SVO_HEADER_VERSION;

 SVObjectHandle->ah_SVOHeader->svo_BytesPerLine   =  SVObjectHandle->ah_SV_GfxBuffer2->svgfx_BytesPerLine;
 SVObjectHandle->ah_SVOHeader->svo_PixelBits      = 1;
 SVObjectHandle->ah_SVOHeader->svo_PixelDepth     = SVObjectHandle->ah_SV_GfxBuffer2->svgfx_ColorDepth;
 
 SVObjectHandle->ah_SVOHeader->svo_LeftEdge       = 0;
 SVObjectHandle->ah_SVOHeader->svo_TopEdge        = 0;
 SVObjectHandle->ah_SVOHeader->svo_Width          = SVObjectHandle->ah_SV_GfxBuffer2->svgfx_Width;
 SVObjectHandle->ah_SVOHeader->svo_Height         = SVObjectHandle->ah_SV_GfxBuffer2->svgfx_Height;
 
 SVObjectHandle->ah_SVOHeader->svo_Depth          = SVObjectHandle->ah_SV_GfxBuffer2->svgfx_ColorDepth;

 SVObjectHandle->ah_SVOHeader->svo_ViewMode16     = (UWORD) SVObjectHandle->ah_SV_GfxBuffer2->svgfx_ViewMode32 & FLAGMASK_13;
 SVObjectHandle->ah_SVOHeader->svo_ViewMode32     = (ULONG) SVObjectHandle->ah_SV_GfxBuffer2->svgfx_ViewMode32;
 SVObjectHandle->ah_SVOHeader->svo_BAD_ViewMode32 = (ULONG) SVObjectHandle->ah_SV_GfxBuffer2->svgfx_ViewMode32;


 CopyMem(&SVObjectHandle->ah_SV_GfxBuffer2->svgfx_Colors[0][0], &SVObjectHandle->ah_SVOHeader->svo_Colors[0][0], 768);


 Write(SVObjectHandle->ah_filehandle_dest,  SVObjectHandle->ah_SVOHeader, SVOHEADER_SIZE);
 Write(SVObjectHandle->ah_filehandle_dest2, SVObjectHandle->ah_SV_GfxBuffer2->svgfx_Buffer, SVObjectHandle->ah_SV_GfxBuffer2->svgfx_BufferSize);

 return(retval);
}
