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 >
C/C++ Source or Header  |  1991-09-15  |  13KB  |  554 lines

  1. /*----------------------------------------------------------------------*
  2.    ibank.c Version 3.0 - © 1990-91 Jaba Development
  3.  
  4.    Author : Jan van den Baard
  5.    Purpose: Image sharing (shorter source!)
  6.  *----------------------------------------------------------------------*/
  7. /*---------------------------------------------------*
  8.   Gadgets created with GadgetEd V2.4
  9.   which is (c) Copyright 1990-91 by Jaba Development
  10.   written by Jan van den Baard
  11.  *---------------------------------------------------*/
  12.  
  13. static SHORT Border0_pairs[] = {
  14.   -1,-1,314,-1,314,196,-1,196,-1,-1 };
  15. static SHORT Border1_pairs[] = {
  16.   -1,-1,314,-1,314,10,-1,10,-1,-1 };
  17. static SHORT Border2_pairs[] = {
  18.   -1,-1,314,-1,314,14,-1,14,-1,-1 };
  19.  
  20. static struct Border Border_bord[] = {
  21.   3,2,0,0,JAM1,5,(SHORT *)&Border0_pairs,&Border_bord[1],
  22.   3,2,0,0,JAM1,5,(SHORT *)&Border1_pairs,&Border_bord[2],
  23.   3,184,0,0,JAM1,5,(SHORT *)&Border2_pairs,NULL };
  24.  
  25. static struct IntuiText Render_text = {
  26.   0,1,JAM1,112,3,NULL,(UBYTE *)"Image Bank",NULL };
  27.  
  28. static SHORT CNT_pairs0[] = {
  29.   -1,-1,93,-1,93,9,-1,9,-1,-1 };
  30.  
  31. static struct Border CNT_bord = {
  32.   0,0,0,0,JAM1,5,(SHORT *)&CNT_pairs0,NULL };
  33.  
  34. static struct IntuiText CNT_text = {
  35.   0,1,JAM1,15,1,NULL,(UBYTE *)"CONTINUE",NULL };
  36.  
  37. #define CNT_ID       6
  38.  
  39. static struct Gadget CNT = {
  40.   NULL,217,186,93,9,
  41.   GADGHCOMP,
  42.   RELVERIFY,
  43.   BOOLGADGET,
  44.   (APTR)&CNT_bord,NULL,
  45.   &CNT_text,NULL,NULL,CNT_ID,NULL };
  46.  
  47. static SHORT CANCEL_pairs0[] = {
  48.   -1,-1,58,-1,58,9,-1,9,-1,-1 };
  49.  
  50. static struct Border CANCEL_bord = {
  51.   0,0,0,0,JAM1,5,(SHORT *)&CANCEL_pairs0,NULL };
  52.  
  53. static struct IntuiText CANCEL_text = {
  54.   0,1,JAM1,3,1,NULL,(UBYTE *)"CANCEL",NULL };
  55.  
  56. #define CANCEL_ID    5
  57.  
  58. static struct Gadget CANCEL = {
  59.   NULL,252,186,58,9,
  60.   GADGHCOMP,
  61.   RELVERIFY,
  62.   BOOLGADGET,
  63.   (APTR)&CANCEL_bord,NULL,
  64.   &CANCEL_text,NULL,NULL,CANCEL_ID,NULL };
  65.  
  66. static SHORT OKIDOKI_pairs0[] = {
  67.   -1,-1,25,-1,25,9,-1,9,-1,-1 };
  68.  
  69. static struct Border OKIDOKI_bord = {
  70.   0,0,0,0,JAM1,5,(SHORT *)&OKIDOKI_pairs0,NULL };
  71.  
  72. static struct IntuiText OKIDOKI_text = {
  73.   0,1,JAM1,4,1,NULL,(UBYTE *)"OK",NULL };
  74.  
  75. #define OKIDOKI_ID    4
  76.  
  77. static struct Gadget OKIDOKI = {
  78.   &CANCEL,217,186,25,9,
  79.   GADGHCOMP,
  80.   RELVERIFY,
  81.   BOOLGADGET,
  82.   (APTR)&OKIDOKI_bord,NULL,
  83.   &OKIDOKI_text,NULL,NULL,OKIDOKI_ID,NULL };
  84.  
  85. static SHORT PREV_pairs0[] = {
  86.   -1,-1,39,-1,39,9,-1,9,-1,-1 };
  87.  
  88. static struct Border PREV_bord = {
  89.   0,0,0,0,JAM1,5,(SHORT *)&PREV_pairs0,NULL };
  90.  
  91. static struct IntuiText PREV_text = {
  92.   0,1,JAM1,3,1,NULL,(UBYTE *)"PREV",NULL };
  93.  
  94. #define PREV_ID    3
  95.  
  96. static struct Gadget PREV = {
  97.   NULL,168,186,39,9,
  98.   GADGHCOMP,
  99.   RELVERIFY,
  100.   BOOLGADGET,
  101.   (APTR)&PREV_bord,NULL,
  102.   &PREV_text,NULL,NULL,PREV_ID,NULL };
  103.  
  104. static SHORT NEXT_pairs0[] = {
  105.   -1,-1,39,-1,39,9,-1,9,-1,-1 };
  106.  
  107. static struct Border NEXT_bord = {
  108.   0,0,0,0,JAM1,5,(SHORT *)&NEXT_pairs0,NULL };
  109.  
  110. static struct IntuiText NEXT_text = {
  111.   0,1,JAM1,4,1,NULL,(UBYTE *)"NEXT",NULL };
  112.  
  113. #define NEXT_ID    2
  114.  
  115. static struct Gadget NEXT = {
  116.   &PREV,119,186,39,9,
  117.   GADGHCOMP,
  118.   RELVERIFY,
  119.   BOOLGADGET,
  120.   (APTR)&NEXT_bord,NULL,
  121.   &NEXT_text,NULL,NULL,NEXT_ID,NULL };
  122.  
  123. static SHORT REM_pairs0[] = {
  124.   -1,-1,54,-1,54,9,-1,9,-1,-1 };
  125.  
  126. static struct Border REM_bord = {
  127.   0,0,0,0,JAM1,5,(SHORT *)&REM_pairs0,NULL };
  128.  
  129. static struct IntuiText REM_text = {
  130.   0,1,JAM1,3,1,NULL,(UBYTE *)"Remove",NULL };
  131.  
  132. #define REM_ID    1
  133.  
  134. static struct Gadget REM = {
  135.   &NEXT,56,186,54,9,
  136.   GADGHCOMP,
  137.   RELVERIFY,
  138.   BOOLGADGET,
  139.   (APTR)&REM_bord,NULL,
  140.   &REM_text,NULL,NULL,REM_ID,NULL };
  141.  
  142. static SHORT LOAD_pairs0[] = {
  143.   -1,-1,39,-1,39,9,-1,9,-1,-1 };
  144.  
  145. static struct Border LOAD_bord = {
  146.   0,0,0,0,JAM1,5,(SHORT *)&LOAD_pairs0,NULL };
  147.  
  148. static struct IntuiText LOAD_text = {
  149.   0,1,JAM1,3,1,NULL,(UBYTE *)"Load",NULL };
  150.  
  151. #define LOAD_ID    0
  152.  
  153. static struct Gadget LOAD = {
  154.   &REM,7,186,39,9,
  155.   GADGHCOMP,
  156.   RELVERIFY,
  157.   BOOLGADGET,
  158.   (APTR)&LOAD_bord,NULL,
  159.   &LOAD_text,NULL,NULL,LOAD_ID,NULL };
  160.  
  161. static struct NewWindow nw_ibank = {
  162.   0,0,320,200,0,1,
  163.   GADGETUP,
  164.   NOCAREREFRESH+SMART_REFRESH+ACTIVATE+RMBTRAP+BORDERLESS,
  165.   NULL,NULL,
  166.   NULL,NULL,NULL,
  167.   150,50,320,256,CUSTOMSCREEN };
  168.  
  169. /*
  170.  * imported data.
  171.  */
  172. extern struct FileSelector *IODir;
  173. extern struct Gadget       *Gadget;
  174. extern struct Screen       *MainScreen;
  175. extern struct MemoryChain   Memory;
  176. extern struct SharedList    Images;
  177. extern ULONG                Class;
  178. extern USHORT               WDBackFill, BackFill;
  179. extern BOOL                 REQUESTER, Saved, WBSCREEN;
  180. extern UBYTE                name[256];
  181. extern UWORD                Colors[32];
  182.  
  183. struct Window       *iwin;
  184. struct Image        *active = NULL;
  185. struct SharedImage  *freeit;
  186.  
  187. UWORD  old_colors[32];
  188.  
  189. /*
  190.  * find the "SharedImage" from "image"
  191.  */
  192. struct SharedImage *get_sim( struct Image *image )
  193. {
  194.     struct SharedImage  *sim;
  195.  
  196.     for(sim = Images.Head; sim->Succ; sim = sim->Succ) {
  197.         if(sim->Image == image)
  198.             return(sim);
  199.     }
  200.     return(NULL);
  201. }
  202.  
  203. /*
  204.  * Add a user to the image
  205.  */
  206. void add_user( struct Image *image )
  207. {
  208.     struct SharedImage  *sim;
  209.  
  210.     if(NOT(sim = get_sim(image))) return;
  211.  
  212.     sim->UseCount++;
  213. }
  214.  
  215. /*
  216.  * Remove a user from the image.
  217.  */
  218. void rem_user( struct Image *image )
  219. {
  220.     struct SharedImage  *sim;
  221.  
  222.     if(NOT(sim = get_sim(image))) return;
  223.  
  224.     if(sim->UseCount) sim->UseCount--;
  225. }
  226.  
  227. /*
  228.  * Deallocate an image.
  229.  */
  230. void free_image( struct Image *image, long force )
  231. {
  232.     struct SharedImage  *sim;
  233.  
  234.     if(NOT force) {
  235.         if(NOT(sim = get_sim(image))) return;
  236.         Remove((void *)sim);
  237.     } else
  238.         sim = freeit;
  239.  
  240.     if(image->ImageData) FreeMem(image->ImageData,(ULONG)RASSIZE(image->Width,image->Height)*image->Depth);
  241.     FreeItem(&Memory,image,(long)sizeof(struct Image));
  242.     FreeItem(&Memory,sim,(long)sizeof(struct SharedImage));
  243. }
  244.  
  245. /*
  246.  * clear the image output field with the current background color.
  247.  */
  248. void clear_field( void )
  249. {
  250.     if(REQUESTER)
  251.         SetAPen(iwin->RPort,BackFill);
  252.     else
  253.         SetAPen(iwin->RPort,WDBackFill);
  254.  
  255.     RectFill(iwin->RPort,3,13,317,182);
  256. }
  257.  
  258. /*
  259.  * Refresh the image bank window if it's damaged
  260.  * by an image bigger than the output field.
  261.  */
  262. void refresh_ibank( void )
  263. {
  264.     SetAPen(iwin->RPort,1);
  265.     RectFill(iwin->RPort,0,184,320,200);
  266.     RectFill(iwin->RPort,318,0,320,200);
  267.     DrawBorder(iwin->RPort,&Border_bord[0],0,0);
  268.     PrintIText(iwin->RPort,&Render_text,0,0);
  269.     RefreshGList(&LOAD,iwin,NULL,-1L);
  270.     ShadowGList(iwin,&LOAD,NULL,0,-1L);
  271. }
  272.  
  273. /*
  274.  * draw the image in the output field.
  275.  */
  276. void display( void )
  277. {
  278.     struct SharedImage  *sim;
  279.  
  280.     clear_field();
  281.  
  282.     if(NOT(sim = get_sim(active))) return;
  283.  
  284.     if(active) {
  285.         if(NOT WBSCREEN)
  286.             LoadRGB4(&MainScreen->ViewPort,&sim->Colors[0],(1<<active->Depth));
  287.         active->LeftEdge = active->TopEdge = 0;
  288.         DrawImage(iwin->RPort,active,4,13);
  289.     }
  290.     refresh_ibank();
  291. }
  292.  
  293. /*
  294.  * display the previous image in the bank if available
  295.  * otherwise flash the screen.
  296.  */
  297. void display_prev( void )
  298. {
  299.     struct SharedImage  *sim;
  300.  
  301.     if(NOT(sim = get_sim(active))) return;
  302.  
  303.     if((sim != Images.Head) AND sim) {
  304.         active = sim->Pred->Image;
  305.         display();
  306.     } else
  307.         DisplayBeep(MainScreen);
  308. }
  309.  
  310. /*
  311.  * display the next image in the bank if available
  312.  * otherwise flash the screen.
  313.  */
  314. void display_next( void )
  315. {
  316.     struct SharedImage  *sim;
  317.  
  318.     if(NOT(sim = get_sim(active))) return;
  319.  
  320.     if((sim != Images.TailPred) AND sim) {
  321.         active = sim->Succ->Image;
  322.         display();
  323.     } else
  324.         DisplayBeep(MainScreen);
  325. }
  326.  
  327. /*
  328.  * deallocate all images from the image bank.
  329.  */
  330. void free_all( void )
  331. {
  332.     struct SharedImage *sim,*sim1;
  333.     struct Image       *image;
  334.  
  335.     sim = Images.Head;
  336.  
  337.     while((sim = (struct SharedImage *)RemHead((void *)&Images))) {
  338.         freeit = sim;
  339.         free_image(sim->Image,TRUE);
  340.     }
  341.  
  342.     NewList((void *)&Images);
  343. }
  344.  
  345. /*
  346.  * Check if an image with the "sum" checksum
  347.  * is already in the bank.
  348.  */
  349. ULONG   check_sum( ULONG sum )
  350. {
  351.     register struct SharedImage *sim;
  352.  
  353.     for(sim = Images.Head; sim; sim = sim->Succ) {
  354.         if(sim->CheckSum == sum)
  355.             return(TRUE);
  356.     }
  357.     return(FALSE);
  358. }
  359.  
  360. /*
  361.  * load in an IFF brush in the image bank.
  362.  */
  363. void load_image( void )
  364. {
  365.     struct SharedImage  *sim;
  366.     struct Image        *image, *ReadImage();
  367.     UBYTE               *data;
  368.     ULONG                ps, rc, i;
  369.  
  370.     strcpy((char *)IODir->fr_HeadLine,"Load IFF Image");
  371.  
  372.     IODir->fr_Screen = MainScreen;
  373.     IODir->fr_Caller = iwin;
  374.     IODir->fr_Flags |= FR_NoInfo;
  375.  
  376.     rc = FileRequest(IODir);
  377.  
  378.     strcpy((char *)&name,(char *)IODir->fr_DirName);
  379.     strcat((char *)&name,(char *)IODir->fr_FileName);
  380.  
  381.     if(rc == FREQ_CANCELED) return;
  382.     else if(rc) {
  383.         Error("FileRequester Won't Open !");
  384.         return;
  385.     }
  386.  
  387.     Saved = FALSE;
  388.     disable_window();
  389.     if(NOT(image = ReadImage(name))) {
  390.         enable_window();
  391.         return;
  392.     }
  393.  
  394.     if(NOT(sim = Alloc(&Memory,sizeof(struct SharedImage)))) {
  395.         enable_window();
  396.         Error("Out of memory !");
  397.         return;
  398.     }
  399.  
  400.     ReadCMAP(name,&sim->Colors[0]);
  401.  
  402.     sim->Image    = image;
  403.     sim->UseCount = 0;
  404.     sim->CheckSum = NULL;
  405.  
  406.     ps   = (ULONG)(RASSIZE(image->Width,image->Height) * image->Depth);
  407.     data = (UBYTE *)image->ImageData;
  408.  
  409.     for(i = 0; i < ps; i++)
  410.         sim->CheckSum += *(data++);
  411.  
  412.     if(check_sum(sim->CheckSum)) {
  413.         enable_window();
  414.         if(Ask("Image already in the bank!","Keep it ?") == FALSE) {
  415.             freeit = sim;
  416.             free_image(image,TRUE);
  417.             disable_window();
  418.             goto noShow;
  419.         }
  420.         disable_window();
  421.     }
  422.     AddTail((void *)&Images,(void *)sim);
  423.     active        = image;
  424. noShow:
  425.     enable_window();
  426.     display();
  427.     return;
  428. }
  429.  
  430. /*
  431.  * remove a single image from the image bank.
  432.  */
  433. void remove_image( void )
  434. {
  435.     struct SharedImage  *sim;
  436.     struct Image        *tofree = active;
  437.  
  438.     if(NOT(sim = get_sim(active))) return;
  439.  
  440.     if(sim->UseCount) {
  441.         Error("Image still in use !");
  442.         return;
  443.     }
  444.  
  445.     if(sim) {
  446.         if(sim->Pred != (struct SharedImage *)&Images)
  447.             active = sim->Pred->Image;
  448.         else if(sim->Succ)
  449.             active = sim->Succ->Image;
  450.         else
  451.             active = NULL;
  452.         free_image(tofree,FALSE);
  453.     }
  454.     display();
  455. }
  456.  
  457. ULONG bank_account( struct Image *image )
  458. {
  459.     struct SharedImage  *sim;
  460.     ULONG                i;
  461.  
  462.     for(sim = Images.Head, i = 0; sim->Succ; sim = sim->Succ, i++) {
  463.         if(image == sim->Image)
  464.             return(i);
  465.     }
  466. }
  467.  
  468. struct Image *withdraw( ULONG acount )
  469. {
  470.     struct SharedImage  *sim;
  471.     ULONG                i;
  472.  
  473.     for(sim = Images.Head, i = 0; sim->Succ; sim = sim->Succ, i++) {
  474.         if(i == acount)
  475.             return(sim->Image);
  476.     }
  477. }
  478.  
  479. /*
  480.  * put up the image bank main window.
  481.  */
  482. struct Image *image_bank( long get )
  483. {
  484.     BOOL            running = TRUE;
  485.     UWORD           id,i;
  486.  
  487.     for(i = 0; i < 32; i++)
  488.         old_colors[i] = (UWORD)GetRGB4(MainScreen->ViewPort.ColorMap,i);
  489.  
  490.     if(get)
  491.         PREV.NextGadget = &OKIDOKI;
  492.     else
  493.         PREV.NextGadget = &CNT;
  494.  
  495.     nw_ibank.Screen = MainScreen;
  496.  
  497.     if(NOT(iwin = OpenWindow(&nw_ibank)))
  498.         close_up("    - ERROR: Can't open the Image Bank !");
  499.  
  500.     draw(iwin,&LOAD,&Border_bord[0],&Render_text);
  501.  
  502.     display();
  503.  
  504.     while(running == TRUE) {
  505.         Wait(1<<iwin->UserPort->mp_SigBit);
  506.         while(read_msg(iwin)) {
  507.             id = Gadget->GadgetID;
  508.             if(Class == GADGETUP) {
  509.                 switch(id) {
  510.                     case    LOAD_ID:
  511.                                 load_image();
  512.                                 break;
  513.                     case    REM_ID:
  514.                                 remove_image();
  515.                                 break;
  516.                     case    NEXT_ID:
  517.                                 display_next();
  518.                                 break;
  519.                     case    PREV_ID:
  520.                                 display_prev();
  521.                                 break;
  522.                     case    OKIDOKI_ID:
  523.                                 running = FALSE;
  524.                                 break;
  525.                     case    CANCEL_ID:
  526.                                 running = FALSE;
  527.                                 break;
  528.                     case    CNT_ID:
  529.                                 running = FALSE;
  530.                                 break;
  531.                     default:
  532.                                 break;
  533.                 }
  534.             }
  535.         }
  536.     }
  537.     CloseWindow(iwin);
  538.  
  539.     if(id == OKIDOKI_ID) {
  540.         if(NOT WBSCREEN) {
  541.             if(NOT Ask("Do you want the Image colors set ?",NULL))
  542.                 LoadRGB4(&MainScreen->ViewPort,&old_colors[0],(1<<active->Depth));
  543.         }
  544.         return(active);
  545.     } else if(id == CANCEL_ID) {
  546.         if(NOT WBSCREEN)
  547.             LoadRGB4(&MainScreen->ViewPort,&old_colors[0],(1<<active->Depth));
  548.         refresh();
  549.         return(NULL);
  550.     }
  551.     if(NOT WBSCREEN)
  552.         LoadRGB4(&MainScreen->ViewPort,&old_colors[0],(1<<active->Depth));
  553. }
  554.