home *** CD-ROM | disk | FTP | other *** search
-
- /* 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);
- }
-