home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
568b.lha
/
PowerSource_v3.0
/
source.lzh
/
source
/
ibank.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-09-15
|
13KB
|
554 lines
/*----------------------------------------------------------------------*
ibank.c Version 3.0 - © 1990-91 Jaba Development
Author : Jan van den Baard
Purpose: Image sharing (shorter source!)
*----------------------------------------------------------------------*/
/*---------------------------------------------------*
Gadgets created with GadgetEd V2.4
which is (c) Copyright 1990-91 by Jaba Development
written by Jan van den Baard
*---------------------------------------------------*/
static SHORT Border0_pairs[] = {
-1,-1,314,-1,314,196,-1,196,-1,-1 };
static SHORT Border1_pairs[] = {
-1,-1,314,-1,314,10,-1,10,-1,-1 };
static SHORT Border2_pairs[] = {
-1,-1,314,-1,314,14,-1,14,-1,-1 };
static struct Border Border_bord[] = {
3,2,0,0,JAM1,5,(SHORT *)&Border0_pairs,&Border_bord[1],
3,2,0,0,JAM1,5,(SHORT *)&Border1_pairs,&Border_bord[2],
3,184,0,0,JAM1,5,(SHORT *)&Border2_pairs,NULL };
static struct IntuiText Render_text = {
0,1,JAM1,112,3,NULL,(UBYTE *)"Image Bank",NULL };
static SHORT CNT_pairs0[] = {
-1,-1,93,-1,93,9,-1,9,-1,-1 };
static struct Border CNT_bord = {
0,0,0,0,JAM1,5,(SHORT *)&CNT_pairs0,NULL };
static struct IntuiText CNT_text = {
0,1,JAM1,15,1,NULL,(UBYTE *)"CONTINUE",NULL };
#define CNT_ID 6
static struct Gadget CNT = {
NULL,217,186,93,9,
GADGHCOMP,
RELVERIFY,
BOOLGADGET,
(APTR)&CNT_bord,NULL,
&CNT_text,NULL,NULL,CNT_ID,NULL };
static SHORT CANCEL_pairs0[] = {
-1,-1,58,-1,58,9,-1,9,-1,-1 };
static struct Border CANCEL_bord = {
0,0,0,0,JAM1,5,(SHORT *)&CANCEL_pairs0,NULL };
static struct IntuiText CANCEL_text = {
0,1,JAM1,3,1,NULL,(UBYTE *)"CANCEL",NULL };
#define CANCEL_ID 5
static struct Gadget CANCEL = {
NULL,252,186,58,9,
GADGHCOMP,
RELVERIFY,
BOOLGADGET,
(APTR)&CANCEL_bord,NULL,
&CANCEL_text,NULL,NULL,CANCEL_ID,NULL };
static SHORT OKIDOKI_pairs0[] = {
-1,-1,25,-1,25,9,-1,9,-1,-1 };
static struct Border OKIDOKI_bord = {
0,0,0,0,JAM1,5,(SHORT *)&OKIDOKI_pairs0,NULL };
static struct IntuiText OKIDOKI_text = {
0,1,JAM1,4,1,NULL,(UBYTE *)"OK",NULL };
#define OKIDOKI_ID 4
static struct Gadget OKIDOKI = {
&CANCEL,217,186,25,9,
GADGHCOMP,
RELVERIFY,
BOOLGADGET,
(APTR)&OKIDOKI_bord,NULL,
&OKIDOKI_text,NULL,NULL,OKIDOKI_ID,NULL };
static SHORT PREV_pairs0[] = {
-1,-1,39,-1,39,9,-1,9,-1,-1 };
static struct Border PREV_bord = {
0,0,0,0,JAM1,5,(SHORT *)&PREV_pairs0,NULL };
static struct IntuiText PREV_text = {
0,1,JAM1,3,1,NULL,(UBYTE *)"PREV",NULL };
#define PREV_ID 3
static struct Gadget PREV = {
NULL,168,186,39,9,
GADGHCOMP,
RELVERIFY,
BOOLGADGET,
(APTR)&PREV_bord,NULL,
&PREV_text,NULL,NULL,PREV_ID,NULL };
static SHORT NEXT_pairs0[] = {
-1,-1,39,-1,39,9,-1,9,-1,-1 };
static struct Border NEXT_bord = {
0,0,0,0,JAM1,5,(SHORT *)&NEXT_pairs0,NULL };
static struct IntuiText NEXT_text = {
0,1,JAM1,4,1,NULL,(UBYTE *)"NEXT",NULL };
#define NEXT_ID 2
static struct Gadget NEXT = {
&PREV,119,186,39,9,
GADGHCOMP,
RELVERIFY,
BOOLGADGET,
(APTR)&NEXT_bord,NULL,
&NEXT_text,NULL,NULL,NEXT_ID,NULL };
static SHORT REM_pairs0[] = {
-1,-1,54,-1,54,9,-1,9,-1,-1 };
static struct Border REM_bord = {
0,0,0,0,JAM1,5,(SHORT *)&REM_pairs0,NULL };
static struct IntuiText REM_text = {
0,1,JAM1,3,1,NULL,(UBYTE *)"Remove",NULL };
#define REM_ID 1
static struct Gadget REM = {
&NEXT,56,186,54,9,
GADGHCOMP,
RELVERIFY,
BOOLGADGET,
(APTR)&REM_bord,NULL,
&REM_text,NULL,NULL,REM_ID,NULL };
static SHORT LOAD_pairs0[] = {
-1,-1,39,-1,39,9,-1,9,-1,-1 };
static struct Border LOAD_bord = {
0,0,0,0,JAM1,5,(SHORT *)&LOAD_pairs0,NULL };
static struct IntuiText LOAD_text = {
0,1,JAM1,3,1,NULL,(UBYTE *)"Load",NULL };
#define LOAD_ID 0
static struct Gadget LOAD = {
&REM,7,186,39,9,
GADGHCOMP,
RELVERIFY,
BOOLGADGET,
(APTR)&LOAD_bord,NULL,
&LOAD_text,NULL,NULL,LOAD_ID,NULL };
static struct NewWindow nw_ibank = {
0,0,320,200,0,1,
GADGETUP,
NOCAREREFRESH+SMART_REFRESH+ACTIVATE+RMBTRAP+BORDERLESS,
NULL,NULL,
NULL,NULL,NULL,
150,50,320,256,CUSTOMSCREEN };
/*
* imported data.
*/
extern struct FileSelector *IODir;
extern struct Gadget *Gadget;
extern struct Screen *MainScreen;
extern struct MemoryChain Memory;
extern struct SharedList Images;
extern ULONG Class;
extern USHORT WDBackFill, BackFill;
extern BOOL REQUESTER, Saved, WBSCREEN;
extern UBYTE name[256];
extern UWORD Colors[32];
struct Window *iwin;
struct Image *active = NULL;
struct SharedImage *freeit;
UWORD old_colors[32];
/*
* find the "SharedImage" from "image"
*/
struct SharedImage *get_sim( struct Image *image )
{
struct SharedImage *sim;
for(sim = Images.Head; sim->Succ; sim = sim->Succ) {
if(sim->Image == image)
return(sim);
}
return(NULL);
}
/*
* Add a user to the image
*/
void add_user( struct Image *image )
{
struct SharedImage *sim;
if(NOT(sim = get_sim(image))) return;
sim->UseCount++;
}
/*
* Remove a user from the image.
*/
void rem_user( struct Image *image )
{
struct SharedImage *sim;
if(NOT(sim = get_sim(image))) return;
if(sim->UseCount) sim->UseCount--;
}
/*
* Deallocate an image.
*/
void free_image( struct Image *image, long force )
{
struct SharedImage *sim;
if(NOT force) {
if(NOT(sim = get_sim(image))) return;
Remove((void *)sim);
} else
sim = freeit;
if(image->ImageData) FreeMem(image->ImageData,(ULONG)RASSIZE(image->Width,image->Height)*image->Depth);
FreeItem(&Memory,image,(long)sizeof(struct Image));
FreeItem(&Memory,sim,(long)sizeof(struct SharedImage));
}
/*
* clear the image output field with the current background color.
*/
void clear_field( void )
{
if(REQUESTER)
SetAPen(iwin->RPort,BackFill);
else
SetAPen(iwin->RPort,WDBackFill);
RectFill(iwin->RPort,3,13,317,182);
}
/*
* Refresh the image bank window if it's damaged
* by an image bigger than the output field.
*/
void refresh_ibank( void )
{
SetAPen(iwin->RPort,1);
RectFill(iwin->RPort,0,184,320,200);
RectFill(iwin->RPort,318,0,320,200);
DrawBorder(iwin->RPort,&Border_bord[0],0,0);
PrintIText(iwin->RPort,&Render_text,0,0);
RefreshGList(&LOAD,iwin,NULL,-1L);
ShadowGList(iwin,&LOAD,NULL,0,-1L);
}
/*
* draw the image in the output field.
*/
void display( void )
{
struct SharedImage *sim;
clear_field();
if(NOT(sim = get_sim(active))) return;
if(active) {
if(NOT WBSCREEN)
LoadRGB4(&MainScreen->ViewPort,&sim->Colors[0],(1<<active->Depth));
active->LeftEdge = active->TopEdge = 0;
DrawImage(iwin->RPort,active,4,13);
}
refresh_ibank();
}
/*
* display the previous image in the bank if available
* otherwise flash the screen.
*/
void display_prev( void )
{
struct SharedImage *sim;
if(NOT(sim = get_sim(active))) return;
if((sim != Images.Head) AND sim) {
active = sim->Pred->Image;
display();
} else
DisplayBeep(MainScreen);
}
/*
* display the next image in the bank if available
* otherwise flash the screen.
*/
void display_next( void )
{
struct SharedImage *sim;
if(NOT(sim = get_sim(active))) return;
if((sim != Images.TailPred) AND sim) {
active = sim->Succ->Image;
display();
} else
DisplayBeep(MainScreen);
}
/*
* deallocate all images from the image bank.
*/
void free_all( void )
{
struct SharedImage *sim,*sim1;
struct Image *image;
sim = Images.Head;
while((sim = (struct SharedImage *)RemHead((void *)&Images))) {
freeit = sim;
free_image(sim->Image,TRUE);
}
NewList((void *)&Images);
}
/*
* Check if an image with the "sum" checksum
* is already in the bank.
*/
ULONG check_sum( ULONG sum )
{
register struct SharedImage *sim;
for(sim = Images.Head; sim; sim = sim->Succ) {
if(sim->CheckSum == sum)
return(TRUE);
}
return(FALSE);
}
/*
* load in an IFF brush in the image bank.
*/
void load_image( void )
{
struct SharedImage *sim;
struct Image *image, *ReadImage();
UBYTE *data;
ULONG ps, rc, i;
strcpy((char *)IODir->fr_HeadLine,"Load IFF Image");
IODir->fr_Screen = MainScreen;
IODir->fr_Caller = iwin;
IODir->fr_Flags |= FR_NoInfo;
rc = FileRequest(IODir);
strcpy((char *)&name,(char *)IODir->fr_DirName);
strcat((char *)&name,(char *)IODir->fr_FileName);
if(rc == FREQ_CANCELED) return;
else if(rc) {
Error("FileRequester Won't Open !");
return;
}
Saved = FALSE;
disable_window();
if(NOT(image = ReadImage(name))) {
enable_window();
return;
}
if(NOT(sim = Alloc(&Memory,sizeof(struct SharedImage)))) {
enable_window();
Error("Out of memory !");
return;
}
ReadCMAP(name,&sim->Colors[0]);
sim->Image = image;
sim->UseCount = 0;
sim->CheckSum = NULL;
ps = (ULONG)(RASSIZE(image->Width,image->Height) * image->Depth);
data = (UBYTE *)image->ImageData;
for(i = 0; i < ps; i++)
sim->CheckSum += *(data++);
if(check_sum(sim->CheckSum)) {
enable_window();
if(Ask("Image already in the bank!","Keep it ?") == FALSE) {
freeit = sim;
free_image(image,TRUE);
disable_window();
goto noShow;
}
disable_window();
}
AddTail((void *)&Images,(void *)sim);
active = image;
noShow:
enable_window();
display();
return;
}
/*
* remove a single image from the image bank.
*/
void remove_image( void )
{
struct SharedImage *sim;
struct Image *tofree = active;
if(NOT(sim = get_sim(active))) return;
if(sim->UseCount) {
Error("Image still in use !");
return;
}
if(sim) {
if(sim->Pred != (struct SharedImage *)&Images)
active = sim->Pred->Image;
else if(sim->Succ)
active = sim->Succ->Image;
else
active = NULL;
free_image(tofree,FALSE);
}
display();
}
ULONG bank_account( struct Image *image )
{
struct SharedImage *sim;
ULONG i;
for(sim = Images.Head, i = 0; sim->Succ; sim = sim->Succ, i++) {
if(image == sim->Image)
return(i);
}
}
struct Image *withdraw( ULONG acount )
{
struct SharedImage *sim;
ULONG i;
for(sim = Images.Head, i = 0; sim->Succ; sim = sim->Succ, i++) {
if(i == acount)
return(sim->Image);
}
}
/*
* put up the image bank main window.
*/
struct Image *image_bank( long get )
{
BOOL running = TRUE;
UWORD id,i;
for(i = 0; i < 32; i++)
old_colors[i] = (UWORD)GetRGB4(MainScreen->ViewPort.ColorMap,i);
if(get)
PREV.NextGadget = &OKIDOKI;
else
PREV.NextGadget = &CNT;
nw_ibank.Screen = MainScreen;
if(NOT(iwin = OpenWindow(&nw_ibank)))
close_up(" - ERROR: Can't open the Image Bank !");
draw(iwin,&LOAD,&Border_bord[0],&Render_text);
display();
while(running == TRUE) {
Wait(1<<iwin->UserPort->mp_SigBit);
while(read_msg(iwin)) {
id = Gadget->GadgetID;
if(Class == GADGETUP) {
switch(id) {
case LOAD_ID:
load_image();
break;
case REM_ID:
remove_image();
break;
case NEXT_ID:
display_next();
break;
case PREV_ID:
display_prev();
break;
case OKIDOKI_ID:
running = FALSE;
break;
case CANCEL_ID:
running = FALSE;
break;
case CNT_ID:
running = FALSE;
break;
default:
break;
}
}
}
}
CloseWindow(iwin);
if(id == OKIDOKI_ID) {
if(NOT WBSCREEN) {
if(NOT Ask("Do you want the Image colors set ?",NULL))
LoadRGB4(&MainScreen->ViewPort,&old_colors[0],(1<<active->Depth));
}
return(active);
} else if(id == CANCEL_ID) {
if(NOT WBSCREEN)
LoadRGB4(&MainScreen->ViewPort,&old_colors[0],(1<<active->Depth));
refresh();
return(NULL);
}
if(NOT WBSCREEN)
LoadRGB4(&MainScreen->ViewPort,&old_colors[0],(1<<active->Depth));
}