home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD1.iso / GFX / viewer / SVLIBS81.LHA / superview-lib / Programmers / Example_SVObjects / SVO / SV_WriteSubs.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-13  |  6.0 KB  |  188 lines

  1.  
  2.  /* SV_WriteSubs.c
  3.     - Functions for Writing of SVO Files -
  4.     (c) 1990-94 by Andreas R. Kleinert
  5.     Last changes : 01.07.1994
  6.  */
  7.  
  8. #include "svobject.h"
  9.  
  10.  
  11.  /* PUBLIC functions */
  12.  
  13. ULONG __saveds __asm SVO_Write( register __a1 struct SVObjectHandle *SVObjectHandle_a1);
  14.  
  15. ULONG __saveds __regargs SVLI_GetXPKMethod(void);
  16.  
  17.  
  18. /* *************************************************** */
  19. /* *                             * */
  20. /* * SVO_Write : ...                                 * */
  21. /* *                             * */
  22. /* *************************************************** */
  23.  
  24. ULONG __saveds __asm SVO_Write( register __a1 struct SVObjectHandle *SVObjectHandle_a1)
  25. {
  26.  struct SVObjectHandle *SVObjectHandle = SVObjectHandle_a1;
  27.  
  28.  ULONG retval = SVERR_NO_ERROR, xpkmethod = N;
  29.  char filename [256], filename_svo [256];
  30.  
  31.  
  32.  if(!SVObjectHandle)                              return(SVERR_NO_HANDLE);
  33.  if(SVObjectHandle->ah_Medium != AKO_MEDIUM_DISK) return(SVERR_ACTION_NOT_SUPPORTED);
  34.  
  35.  if(!SVObjectHandle->ah_SV_GfxBuffer2)
  36.   {
  37.    if(SVObjectHandle->ah_WriteScreen)
  38.     {
  39.      retval = SVSUP_ScreenToBitPlane8(SVObjectHandle->ah_WriteScreen, &SVObjectHandle->ah_SV_GfxBuffer2);
  40.      if(retval) return(retval);
  41.  
  42.      if(!SVObjectHandle->ah_SV_GfxBuffer2) return(SVERR_NO_MEMORY);
  43.  
  44.      /* to free the memory : */
  45.  
  46.      SVObjectHandle->ah_SV_GfxBuffer = SVObjectHandle->ah_SV_GfxBuffer2;
  47.  
  48.     }else return(SVERR_ACTION_NOT_SUPPORTED);
  49.   }
  50.  
  51.  if(   SVObjectHandle->ah_SV_GfxBuffer2->svgfx_BufferType != SVGFX_BUFFERTYPE_BITPLANE
  52.     && SVObjectHandle->ah_SV_GfxBuffer2->svgfx_BufferType != SVGFX_BUFFERTYPE_ONEPLANE) return(SVERR_ACTION_NOT_SUPPORTED);
  53.  
  54.  if(strlen(SVObjectHandle->ah_WriteName) > 4)
  55.   {
  56.    if(!stricmp(&SVObjectHandle->ah_WriteName[strlen(SVObjectHandle->ah_WriteName)-4], ".svo"))
  57.     {
  58.      strcpy(filename_svo, SVObjectHandle->ah_WriteName);
  59.      strcpy(filename,     SVObjectHandle->ah_WriteName);
  60.      filename[strlen(filename)-4] = (char) 0;
  61.     }else
  62.     {
  63.      strcpy(filename,     SVObjectHandle->ah_WriteName);
  64.      strcpy(filename_svo, SVObjectHandle->ah_WriteName);
  65.      strcat(filename_svo, ".svo");
  66.     }
  67.   }else
  68.   {
  69.    strcpy(filename_svo, SVObjectHandle->ah_WriteName);
  70.    strcat(filename_svo, ".svo");
  71.    strcpy(filename,     SVObjectHandle->ah_WriteName);
  72.   }
  73.  
  74.  SVObjectHandle->ah_filehandle_dest = Open(filename_svo, MODE_NEWFILE);
  75.  if(!SVObjectHandle->ah_filehandle_dest) return(SVERR_NO_FILE);
  76.  
  77.  SVObjectHandle->ah_filehandle_dest2 = Open(filename, MODE_NEWFILE);
  78.  if(!SVObjectHandle->ah_filehandle_dest2) return(SVERR_NO_FILE);
  79.  
  80.  SVObjectHandle->ah_ramhandle = SVSUP_GetMemList();
  81.  if(!SVObjectHandle->ah_ramhandle) return(SVERR_NO_MEMORY);
  82.  
  83.  SVObjectHandle->ah_SVOHeader = AllocVec(sizeof(struct SVOHeader), (MEMF_CLEAR|MEMF_PUBLIC));
  84.  if(!SVObjectHandle->ah_SVOHeader) return(SVERR_NO_MEMORY);
  85.  
  86.  
  87.  /* init header */
  88.  
  89.  strcpy(SVObjectHandle->ah_SVOHeader->svo_ID, SVO_ID);
  90.  
  91.  SVObjectHandle->ah_SVOHeader->svo_Version        = SVO_HEADER_VERSION;
  92.  
  93.  if(SVObjectHandle->ah_SV_GfxBuffer2->svgfx_BufferType == SVGFX_BUFFERTYPE_BITPLANE)
  94.   {
  95.    SVObjectHandle->ah_SVOHeader->svo_BytesPerLine   =  SVObjectHandle->ah_SV_GfxBuffer2->svgfx_BytesPerLine;
  96.    SVObjectHandle->ah_SVOHeader->svo_PixelBits      = 1;
  97.    SVObjectHandle->ah_SVOHeader->svo_PixelDepth     = SVObjectHandle->ah_SV_GfxBuffer2->svgfx_ColorDepth;
  98.   }else
  99.   {
  100.    SVObjectHandle->ah_SVOHeader->svo_BytesPerLine   = SVObjectHandle->ah_SV_GfxBuffer2->svgfx_Width * (SVObjectHandle->ah_SV_GfxBuffer2->svgfx_PixelBits >> 3);
  101.    SVObjectHandle->ah_SVOHeader->svo_PixelBits      = SVObjectHandle->ah_SV_GfxBuffer2->svgfx_PixelBits;
  102.    SVObjectHandle->ah_SVOHeader->svo_PixelDepth     = 1;
  103.   } 
  104.  
  105.  SVObjectHandle->ah_SVOHeader->svo_LeftEdge       = 0;
  106.  SVObjectHandle->ah_SVOHeader->svo_TopEdge        = 0;
  107.  SVObjectHandle->ah_SVOHeader->svo_Width          = SVObjectHandle->ah_SV_GfxBuffer2->svgfx_Width;
  108.  SVObjectHandle->ah_SVOHeader->svo_Height         = SVObjectHandle->ah_SV_GfxBuffer2->svgfx_Height;
  109.  
  110.  SVObjectHandle->ah_SVOHeader->svo_Depth          = SVObjectHandle->ah_SV_GfxBuffer2->svgfx_ColorDepth;
  111.  
  112.  SVObjectHandle->ah_SVOHeader->svo_ViewMode16     = (UWORD) SVObjectHandle->ah_SV_GfxBuffer2->svgfx_ViewMode32 & FLAGMASK_13;
  113.  SVObjectHandle->ah_SVOHeader->svo_ViewMode32     = (ULONG) SVObjectHandle->ah_SV_GfxBuffer2->svgfx_ViewMode32;
  114.  SVObjectHandle->ah_SVOHeader->svo_BAD_ViewMode32 = (ULONG) SVObjectHandle->ah_SV_GfxBuffer2->svgfx_ViewMode32;
  115.  
  116.  
  117.  CopyMem(&SVObjectHandle->ah_SV_GfxBuffer2->svgfx_Colors[0][0], &SVObjectHandle->ah_SVOHeader->svo_Colors[0][0], 768);
  118.  
  119.  
  120.  Write(SVObjectHandle->ah_filehandle_dest,  SVObjectHandle->ah_SVOHeader, SVOHEADER_SIZE);
  121.  Write(SVObjectHandle->ah_filehandle_dest2, SVObjectHandle->ah_SV_GfxBuffer2->svgfx_Buffer, SVObjectHandle->ah_SV_GfxBuffer2->svgfx_BufferSize);
  122.  
  123.  
  124.  if(xpkmethod = SVLI_GetXPKMethod())
  125.   {
  126.    struct TagItem __aligned xpk_pars [4];
  127.    char                     tmp_name [256];
  128.    BPTR                     tst_handle;
  129.  
  130.    if(SVObjectHandle->ah_filehandle_dest2)
  131.     {
  132.      Close(SVObjectHandle->ah_filehandle_dest2);
  133.  
  134.      SVObjectHandle->ah_filehandle_dest2 = N;
  135.     }
  136.  
  137.  
  138.    /* Write XPK Data */
  139.  
  140.    strcpy(tmp_name, filename);
  141.    strcat(tmp_name, ".xpk");
  142.  
  143.  
  144.    xpk_pars[0].ti_Tag  = XPK_InName;
  145.    xpk_pars[0].ti_Data = (ULONG) filename;
  146.  
  147.    xpk_pars[1].ti_Tag  = XPK_OutName;
  148.    xpk_pars[1].ti_Data = (ULONG) tmp_name;
  149.  
  150.    xpk_pars[2].ti_Tag  = XPK_FindMethod;
  151.    xpk_pars[2].ti_Data = (ULONG) &xpkmethod;
  152.  
  153.    xpk_pars[3].ti_Tag  = TAG_DONE;
  154.    xpk_pars[3].ti_Data = N;
  155.  
  156.    XpkPack(&xpk_pars[0]);
  157.  
  158.    if(tst_handle = Open(tmp_name, MODE_OLDFILE))
  159.     {
  160.      Close(tst_handle); /* delete only, if packing was succesful so far */
  161.  
  162.      DeleteFile(           filename);
  163.      Rename(     tmp_name, filename);
  164.     }
  165.   }
  166.  
  167.  return(retval);
  168. }
  169.  
  170. ULONG __saveds __regargs SVLI_GetXPKMethod(void)
  171. {
  172.  struct SV_ControlPad *pad;
  173.  char *content; 
  174.  ULONG method = N;
  175.  
  176.  if(SVSUP_LoadControlPad("ENV:superview-library/SVO.controlpad", &pad))
  177.   {
  178.    if(SVSUP_FindControlPad(pad, "PACKMETHOD", &content))
  179.     {
  180.      if(content) strcpy((UBYTE *)&method, content);
  181.     }
  182.  
  183.    SVSUP_FreeControlPad(pad);
  184.   }
  185.  
  186.  return(method);
  187. }
  188.