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);
}