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

#include "svobject.h"


 /* PUBLIC functions */

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

ULONG __saveds __regargs SVLI_GetXPKMethod(void);


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

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

 ULONG retval = SVERR_NO_ERROR, xpkmethod = N;
 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);
  }

 if(   SVObjectHandle->ah_SV_GfxBuffer2->svgfx_BufferType != SVGFX_BUFFERTYPE_BITPLANE
    && 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;

 if(SVObjectHandle->ah_SV_GfxBuffer2->svgfx_BufferType == SVGFX_BUFFERTYPE_BITPLANE)
  {
   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;
  }else
  {
   SVObjectHandle->ah_SVOHeader->svo_BytesPerLine   = SVObjectHandle->ah_SV_GfxBuffer2->svgfx_Width * (SVObjectHandle->ah_SV_GfxBuffer2->svgfx_PixelBits >> 3);
   SVObjectHandle->ah_SVOHeader->svo_PixelBits      = SVObjectHandle->ah_SV_GfxBuffer2->svgfx_PixelBits;
   SVObjectHandle->ah_SVOHeader->svo_PixelDepth     = 1;
  } 

 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);


 if(xpkmethod = SVLI_GetXPKMethod())
  {
   struct TagItem __aligned xpk_pars [4];
   char                     tmp_name [256];
   BPTR                     tst_handle;

   if(SVObjectHandle->ah_filehandle_dest2)
    {
     Close(SVObjectHandle->ah_filehandle_dest2);

     SVObjectHandle->ah_filehandle_dest2 = N;
    }


   /* Write XPK Data */

   strcpy(tmp_name, filename);
   strcat(tmp_name, ".xpk");


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

   xpk_pars[1].ti_Tag  = XPK_OutName;
   xpk_pars[1].ti_Data = (ULONG) tmp_name;

   xpk_pars[2].ti_Tag  = XPK_FindMethod;
   xpk_pars[2].ti_Data = (ULONG) &xpkmethod;

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

   XpkPack(&xpk_pars[0]);

   if(tst_handle = Open(tmp_name, MODE_OLDFILE))
    {
     Close(tst_handle); /* delete only, if packing was succesful so far */

     DeleteFile(           filename);
     Rename(     tmp_name, filename);
    }
  }

 return(retval);
}

ULONG __saveds __regargs SVLI_GetXPKMethod(void)
{
 struct SV_ControlPad *pad;
 char *content; 
 ULONG method = N;

 if(SVSUP_LoadControlPad("ENV:superview-library/SVO.controlpad", &pad))
  {
   if(SVSUP_FindControlPad(pad, "PACKMETHOD", &content))
    {
     if(content) strcpy((UBYTE *)&method, content);
    }

   SVSUP_FreeControlPad(pad);
  }

 return(method);
}
