/*
	DblBuf

	A demo of rtg.library

	Written by Hans-Jörg & Thomas Frieden
		   Schlossstr. 176
		   54293 Trier
		   tfrieden@fax.uni-trier.de
		   hfrieden@fix.uni-trier.de

*/


#include <stdio.h>
#include <stdlib.h>
#include <exec/types.h>
#include <exec/memory.h>
#include <dos/dos.h>
#include <rtgmaster/rtgmaster.h>
#include <rtgmaster/rtgsublibs.h>
#include <utility/tagitem.h>
#include <clib/exec_protos.h>
#include <clib/rtgmaster_protos.h>
#include <clib/dos_protos.h>
#include <pragmas/exec_pragmas.h>
#include <pragmas/rtgmaster_pragmas.h>
#include <pragmas/dos_pragmas.h>

struct RtgScreen *RtgScreen;
struct ScreenReq *sr;
struct RTGMasterBase *RTGMasterBase;
extern struct DOSBase *DOSBase;

ULONG cmap[800];

struct TagItem rtag[] = {
    //smr_MinWidth,       320,
    //smr_MinHeight,      240,
    //smr_MaxWidth,       640,
    //smr_MaxHeight,      480,
    smr_ChunkySupport,  -1,
    smr_PlanarSupport,  -1,
    //smr_Buffers,        1,
    TAG_DONE,           NULL
};

struct TagItem gtag[] = {
    grd_BytesPerRow,    0,
    grd_Width,          0,
    grd_Height,         0,
    grd_Depth,          0,
    grd_PixelLayout,    0,
    grd_ColorSpace,     0,
    grd_PlaneSize,      0,
    TAG_DONE,           0
};

struct TagItem tacks[] = {
    rtg_Buffers,        2,
    TAG_DONE,           0
};

void main(int argc, char **argv) {
   /*
    * Since this is a demo, I don't check anything at all
    * and simply assume that every open went ok... 8-)
    */
    int i, x, y;
    UBYTE *adr;
    ULONG size;

    RTGMasterBase = (struct RTGMasterBase *)OpenLibrary((STRPTR)"rtgmaster.library", 0);

    sr = RtgScreenModeReq(rtag);

    if (sr==NULL) {
	CloseLibrary((struct Library *)RTGMasterBase);
	exit(0L);
    }

    RtgScreen = OpenRtgScreen(sr, tacks);

    GetRtgScreenData(RtgScreen, gtag);

    size = gtag[0].ti_Data;

    printf("Screen is %ld x %ld x %ld\n", gtag[1].ti_Data, gtag[2].ti_Data, gtag[3].ti_Data);
    printf("It has %ld bytes per row", size);
    if (size>gtag[1].ti_Data) {
	printf(", which means that the screen is wider than what you see\n");
    } else printf("\n");

    cmap[0] = 0x01000000;
    x = 1;
    for (i = 0; i < 256; i++) {
	cmap[x++] = i * 0x1111111;
	cmap[x++] = i * 0x1111111;
	cmap[x++] = i * 0x1111111;
    }
    cmap[x++]=0;


    if (RtgScreen) {
	LockRtgScreen(RtgScreen);

	adr=(UBYTE *)GetBufAdr(RtgScreen, 0);

	for (y=0; y<30; y++) {
	    for (x=0; x<size/2; x++) {
		*(adr+x)=45;
	    }
	    adr+=size;
	}

	adr=(UBYTE *)GetBufAdr(RtgScreen, 1)/*+10*size*/;

	for (y=0; y<30; y++) {
	    for (x=0; x<size/2; x++) {
		*(adr+x)=255;
	    }
	    adr+=size;
	}


	LoadRGBRtg(RtgScreen, (APTR) cmap);
	x=1;
	for (i=30; i>0; i--) {
	    Delay(i);
	    if (x==0) x=1; else x=0;
	    SwitchScreens(RtgScreen, (ULONG)x);
	}
	for (i=30; i>0; i--) {
	    Delay(1);
	    if (x==0) x=1; else x=0;
	    SwitchScreens(RtgScreen, (ULONG)x);
	}

	UnlockRtgScreen(RtgScreen);
	CloseRtgScreen(RtgScreen);
    }
    CloseLibrary((struct Library *)RTGMasterBase);
}
