[net.micro.amiga] V1.2 "Lines" demo source code - FILE

bart@amiga.UUCP (Barry A. Whitebook) (06/13/86)

< eat this line - please >

this is amiga!bart...

i am posting the source to the "lines" demos which will be included on the V1.2
workbench disk... this source illustrates the use of proportional gadgets to
scroll around in a superbitmap window.

NOTE!!!!!NOTE!!!!!NOTE!!!!!NOTE!!!!!NOTE!!!!!NOTE!!!!!NOTE!!!!!NOTE!!!!!NOTE!!!!

	this demo will only work with V1.2 and above kickstart... it relies on
	the function ScrollLayer() which has been implemented correctly for V1.2

NOTE!!!!!NOTE!!!!!NOTE!!!!!NOTE!!!!!NOTE!!!!!NOTE!!!!!NOTE!!!!!NOTE!!!!!NOTE!!!!

this source has NOT been compiled under either lattice or manx C...
it is intended as informational only and no warranties, express or implied
are made for this code. 

/***************************************************************/
doslbnc.c
/***************************************************************/

#include <exec/types.h>
#include <exec/memory.h>
#include <graphics/gfx.h>
#include <graphics/gfxbase.h>
#include <graphics/clip.h>
#include <graphics/rastport.h>
#include <graphics/layers.h>
#include <intuition/intuition.h>

#define DEPTH	2

/*#define DEBUG*/

/* #define KPRINTF */

#ifdef KPRINTF
#define printf kprintf
#endif

extern int GfxBase;

int HEIGHT = 512;
int WIDTH = 1024-16;

#define RBG_ID 0x0001
#define BBG_ID 0x0002

int usable_width(w)
struct Window *w;
{
   return (w->Width - w->BorderLeft - w->BorderRight);
}

int usable_height(w)
struct Window *w;
{
   return(w->Height - w->BorderTop - w->BorderBottom);
}

do_gadget_down(msg)
struct IntuiMessage *msg;
{
LONG error = FALSE;

#ifdef DEBUG
    printf("do_gadget_down: entering...\n");
#endif

    /* stub */

#ifdef DEBUG
    printf("do_gadget_down: exiting...\n");
#endif

    return(error);
}

do_gadget_up(msg)
struct IntuiMessage *msg;
{
LONG error = FALSE;
struct Window *w;
struct RastPort *rp;
struct Layer *l;
struct LayerInfo *li;
struct Gadget *g;
UWORD gid;
struct PropInfo *pi;

#ifdef DEBUG
    printf("do_gadget_up: entering...\n");
#endif

    if(msg)
    {
	if(g = (struct Gadget *)msg->IAddress)
	{

	    gid = g->GadgetID;
	    switch(gid)
	    {
		case(RBG_ID): 
		{
		    /* scroll vertically */
#ifdef DEBUG
		    printf("do_gadget_up: scroll vertically...\n");
#endif

		    if(w = msg->IDCMPWindow)
		    {
			if(rp = w->RPort)
			{
			    if(l = rp->Layer)
			    {
				if(li = l->LayerInfo)
				{
				    WORD abs_scroll;
				    WORD delta_scroll;
				    WORD max_scroll;
				    WORD sb_height;

				    pi = g->SpecialInfo;
			    
				    sb_height = l->SuperBitMap->Rows;

				    abs_scroll = (((pi->VertPot + 1) * (sb_height - usable_height(w))) >> 16);

				    delta_scroll = abs_scroll - l->Scroll_Y;

				    ScrollLayer(li,l,0,delta_scroll);
				}
			    }
			}
		    }
		    break;
		}

		case(BBG_ID): 
		{
		    /* scroll horizontally */
#ifdef DEBUG
		    printf("do_gadget_up: scroll horizontally...\n");
#endif
		    if(w = msg->IDCMPWindow)
		    {
			if(rp = w->RPort)
			{
			    if(l = rp->Layer)
			    {
				if(li = l->LayerInfo)
				{
				    WORD abs_scroll;
				    WORD delta_scroll;
				    WORD max_scroll;
				    WORD sb_width;

				    pi = g->SpecialInfo;
			
				    sb_width = l->SuperBitMap->BytesPerRow << 3;

				    abs_scroll = (((pi->HorizPot + 1) * (sb_width - usable_width(w))) >> 16);

				    delta_scroll = abs_scroll - l->Scroll_X;

				    ScrollLayer(li,l,delta_scroll,0);
				}
			    }
			}
		    }
		    break;
		}

		default:
		{
		    /* unknown gid */
#ifdef DEBUG
		    printf("do_gadget_up: unknown gadget_id...ERROR = TRUE!\n");
#endif
		    error = TRUE;
		    break;
		}
	    }
	}
	else
	{
	    error = TRUE;
	} 
    } 
    else
    {
    error = TRUE;
    } 

#ifdef DEBUG
    printf("do_gadget_up: exiting...\n");
#endif

    return(error);
}

dots(vp,rp)
struct ViewPort *vp;
struct RastPort *rp;
{
#ifdef DEBUG
    printf("rp=%lx\n",rp);
#endif
    lbnc(rp);
}

struct BitMap bm;   /* assume initialized to 0 */

main()
{
    int i;

    GfxBase = OpenLibrary("graphics.library",32);

    if (AvailMem(MEMF_CHIP) < 100000)	/* for eentsy machines */
    {
	HEIGHT = 256;
	WIDTH = 640;
    }

    InitBitMap(&bm,DEPTH,WIDTH,HEIGHT);

    for(i = 0; i< DEPTH ; i++)
    {
	if ( (bm.Planes[i] = (PLANEPTR)AllocRaster(WIDTH,HEIGHT)) == 0)
	{

#ifdef DEBUG
	    printf("no mem for bitmap\n");
#endif
	    for (i = 0; i< DEPTH; i++)
	    {
		if (bm.Planes[i])   
		{
		    FreeRaster(bm.Planes[i],WIDTH,HEIGHT);
		}
	    }
	    CloseLibrary(GfxBase);
	    exit();
	}
	else	
	{
	    BltClear(bm.Planes[i],RASSIZE(WIDTH,HEIGHT));
	}
    }

    startgfx(200,100,50,100,DEPTH,0,dots,"Lines Window",
	GIMMEZEROZERO|SMART_REFRESH|SUPER_BITMAP,&bm);

    for(i = 0; i< DEPTH ; i++)
    {
	FreeRaster(bm.Planes[i],WIDTH,HEIGHT);
    }

    CloseLibrary(GfxBase);

}