
 /* SV_ShowSubs.c
    - Functions for Showing SVO Files -
    (c) 1993 by Andreas R. Kleinert
    Last changes : 19.12.1993
 */


#include "svobject.h"


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


long __saveds __stdargs SVLI_SVOScreen(struct SVObjectHandle *SVObjectHandle, ULONG ai_mode_id);
long __saveds __stdargs SVLI_SVOSetCMAP(struct SVObjectHandle *SVObjectHandle, struct Screen *screen, long colornum);

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

 UBYTE *buffer, *bufferptr, *planeptr;
 ULONG retval = SVERR_NO_ERROR, depth, mode_id;
 long j, linebytes, colnum = 0;
 struct TagItem __aligned xpk_pars [5];
 char filename [256], filename_svo [256];

 struct RastPort *rp;
 struct BitMap	 *bm;
 struct ViewPort *vp;


 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 = AIM_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]);

 bufferptr = buffer = SVObjectHandle->ah_XpkBuffer;
 if(!buffer) return(SVERR_NO_MEMORY);

 /* Open Screen */

 mode_id = SVObjectHandle->ah_SVOHeader->svo_ViewMode32;

 if(!SVLI_SVOScreen(SVObjectHandle, mode_id)) return(SVERR_NO_SCREEN);

 rp = (struct RastPort *) &(SVObjectHandle->ah_Screen->RastPort);
 bm = (struct BitMap   *) SVObjectHandle->ah_Screen->RastPort.BitMap;
 vp = (struct ViewPort *) &(SVObjectHandle->ah_Screen->ViewPort);

 depth  = SVLI_GetBitMapDepth(SVObjectHandle->ah_Screen);
 colnum = 1<<SVObjectHandle->ah_SVOHeader->svo_Depth;


 /* Read Palette */

 SVLI_SVOSetCMAP(SVObjectHandle, SVObjectHandle->ah_Screen, colnum);


 /* Decoding */

 planeptr  = (UBYTE *) N;

 linebytes = (long) SVObjectHandle->ah_SVOHeader->svo_BytesPerLine;

 for(j=0;j<depth;j++)
  {
   CopyMem(bufferptr + (j*SVObjectHandle->ah_SVOHeader->svo_Height * linebytes), bm->Planes[j], SVObjectHandle->ah_SVOHeader->svo_Height * linebytes);
  }

 ScreenToFront(SVObjectHandle->ah_Screen);

 return(retval);
}

/* *************************************************** */
/* *						     * */
/* * SVLI_SVOScreen : SVO Screen Opening Function    * */
/* *						     * */
/* *************************************************** */

struct TextAttr __aligned chip topazfont = { (STRPTR) "topaz.font", TOPAZ_EIGHTY, FS_NORMAL, FPF_ROMFONT };

long __saveds __stdargs SVLI_SVOScreen(struct SVObjectHandle *SVObjectHandle, ULONG ai_mode_id)
{
 long ai_width, ai_height, ai_depth;

 if(!SVObjectHandle->ah_SVOHeader) return(FALSE);


 /* Get and set Standard Screen Dimensions */

 ai_width  = SVObjectHandle->ah_SVOHeader->svo_Width;
 ai_height = SVObjectHandle->ah_SVOHeader->svo_Height;
 ai_depth  = SVObjectHandle->ah_SVOHeader->svo_Depth;


 /* Get and/or set Screen, Window and IDCMP Flags */

 if(!SVObjectHandle->ah_ScreenType)  SVObjectHandle->ah_ScreenType  = CUSTOMSCREEN;
 if(!SVObjectHandle->ah_WindowIDCMP) SVObjectHandle->ah_WindowIDCMP = IDCMP_MOUSEBUTTONS | IDCMP_VANILLAKEY;
 if(!SVObjectHandle->ah_WindowFlags) SVObjectHandle->ah_WindowFlags = WFLG_BACKDROP | WFLG_BORDERLESS | WFLG_NOCAREREFRESH | WFLG_SIMPLE_REFRESH;


 /* Open Screen like needed for SVO Displaying */

 SVObjectHandle->ah_Screen = OpenScreenTags( NULL, SA_Left,        0,
                         			   SA_Top,	   0,
                        			   SA_Width,	   ai_width,
				                   SA_Height,	   ai_height,
				                   SA_Depth,	   ai_depth,
				                   SA_Font,	  &topazfont,
				                   SA_Type,	   SVObjectHandle->ah_ScreenType,
				                   SA_DisplayID,   ai_mode_id,
				                   SA_Title,	   "Please wait ...",
				                   SA_AutoScroll,  TRUE,
				                   SA_Behind,      TRUE,
				                   TAG_END );

 if(!SVObjectHandle->ah_Screen) return(FALSE);


 /* Open Window like needed for SVO Displaying */

 SVObjectHandle->ah_Window = OpenWindowTags(N,
			    WA_Left,	     0,
			    WA_Top,	     0,
			    WA_Width,	     SVObjectHandle->ah_Screen->Width,
			    WA_Height,	     SVObjectHandle->ah_Screen->Height,
			    WA_DetailPen,    1,
			    WA_BlockPen,     2,
			    WA_IDCMP,	     SVObjectHandle->ah_WindowIDCMP,
			    WA_Flags,	     SVObjectHandle->ah_WindowFlags,
			    WA_CustomScreen, SVObjectHandle->ah_Screen,
			    TAG_END,	     N);

 if(!SVObjectHandle->ah_Window) return(FALSE);

 ActivateWindow(SVObjectHandle->ah_Window);

 return(TRUE);
}

/* *************************************************** */
/* *						     * */
/* * SVLI_SVOSetCMAP : Set ColorMap (RGB8 / RGB 32)  * */
/* *						     * */
/* *************************************************** */

long __saveds __stdargs SVLI_SVOSetCMAP(struct SVObjectHandle *SVObjectHandle, struct Screen *screen, long colornum)
{
 struct ViewPort *vp;
 long i;

 if(SVObjectHandle && screen)
  {
   vp = (struct ViewPort *) &(screen->ViewPort);

   if(OS_VER < 39)
    {
     /* Standard / ECS "4 Bit of 12 Bit" Colors (RGB4) */

     for(i=0;i<colornum;i++) SetRGB4(vp, i, SVObjectHandle->ah_SVOHeader->svo_Colors[i][0]>>4, SVObjectHandle->ah_SVOHeader->svo_Colors[i][1]>>4, SVObjectHandle->ah_SVOHeader->svo_Colors[i][2]>>4);
    }else
    {
     /* AGA "8 Bit of 32 Bit" Colors (RGB32) */

     ULONG r,g,b;
     UBYTE rb, gb, bb;

     for(i=0;i<colornum;i++)
      {
       rb   = SVObjectHandle->ah_SVOHeader->svo_Colors[i][0];
       r  = (ULONG) rb;
       r  = (r<<24 | r<<16 | r<<8);

       gb = SVObjectHandle->ah_SVOHeader->svo_Colors[i][1];
       g  = (ULONG) gb;
       g  = (g<<24 | g<<16 | g<<8);

       bb = SVObjectHandle->ah_SVOHeader->svo_Colors[i][2];
       b  = (ULONG) bb;
       b  = (b<<24 | b<<16 | b<<8);

       SetRGB32(vp, i, r, g, b);
      }
    }
  }

 return(FALSE);
}
