home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 5 / FreshFish_July-August1994.bin / new / gfx / show / edushow / edushow.c < prev    next >
C/C++ Source or Header  |  1994-05-29  |  16KB  |  624 lines

  1. /*********************************************************************
  2.  * EDUSHOW    Copyright 1990 Laurence Vanhelsuwé
  3.  * -------
  4.  * Specialised interactive slideshow program for educational purposes 
  5.  * or giving presentations to groups of people.
  6.  *
  7.  * Written by L.Vanhelsuwé    © 1990
  8.  *
  9.  * - started/finished on 12-Mar-1990
  10.  * - quick check before releasing to Fish PD 22-May-1994
  11.  *********************************************************************/
  12.  
  13.  
  14. #include    <exec/types.h>
  15. #include    <intuition/intuition.h>
  16.  
  17. #include    <clib/exec_protos.h>            // ANSI function prototypes
  18. #include    <clib/alib_protos.h>
  19. #include    <clib/dos_protos.h>
  20. #include    <clib/graphics_protos.h>
  21. #include    <clib/intuition_protos.h>
  22.  
  23. #define        FIRST_ARG        argv[1] 
  24. #define        LF                (0x0a)
  25. #define        MAX_COLOR        16    /** IN HIRES SCREEN            **/
  26. #define        COLOR            15    /** MASK FOR HARDWARE COLOR PRIMARY    **/
  27. #define        CHUNK_ID        long
  28. #define        CHUNK_LEN        long
  29.  
  30. #define        COLORS            16
  31.  
  32. #define        NEXT_COLOR        ' '
  33. #define        PREV_COLOR        '\b'
  34. #define        NEXT_PICTURE    'n'
  35. #define        PREV_PICTURE    'p'
  36. #define        QUIT            'q'
  37.  
  38. #define        IN                1        /** COLOR FADE DIRECTIONS **/
  39. #define        OUT                0
  40.  
  41. #define        MAX_ALLOCS    40            // maximum objects allocated 
  42.  
  43. /************************************************************************/
  44.  
  45. char ver[] = "$VER: EDUSHOW v0.9 (12-MAR-90) by Laurence Vanhelsuwé";
  46.  
  47. char screentitle[] = 
  48. "WICPUG 68000 Assembly Language Course -Educational Slideshow 0.9 (C) LVA 1990";
  49.  
  50. int count_lines(char *text);        /** AND ZERO TERMINATE LINES !! **/
  51. int cache_all_pictures(char * list_of_pictures, int number_of_pics);
  52.  
  53.         /****** non "int" functions ******/
  54.         
  55. char  * load_file(char *name);        /** CACHES ANY FILE IN MEMORY    **/
  56. char  * next_string(char*n);        /** NEXT START OF LINE        **/
  57. char  * expand_line(char*a,char*b);    /** UN-COMPRESS RUN-LENGTH LINE **/
  58. char  * find_chunk(char*s,char*n);    /** FIND START OF ANY iff CHUNK **/
  59. char    get_input(void);            /** USER INPUT ROUTINE        **/
  60.  
  61. short    scale_color(short,short);    /** FADE COLOR n BY FACTOR x    **/
  62.  
  63. void    fade_color(int p, int d);    /** FADES PEN n IN or OUT    **/
  64. void    fade_screen(int dir);
  65. void    decode_color_maps(struct mem_iff_pic *mip_array,int n);    /** UNPACKS iff CMAP INTO INTERNAL FORM **/
  66. void    decompress_pic(void);        /** PUT COMPRESSED PICTURE ON SCREEN **/
  67. void    open_screen(void);            /** OPEN AN Intuition SCREEN    **/
  68. void    lights_out(void);            /** ALL PENS ARE SET TO BLACK    **/
  69. void    close_everything(void);        /** DEALLOCATE,FREE,CLOSE ALL    **/
  70. void    next_color(void);            /** FADE IN NEXT COLOR IN SLIDE **/
  71. void    prev_color(void);            /** FADE OUT CURRENT COLOR IN SLIDE **/
  72. void    next_picture(void);                /** FADE OUT THIS SLIDE, SHOW NEXT **/
  73. void    prev_picture(void);            /** FADE OUT THIS SLIDE, SHOW PREV **/
  74.  
  75. struct Screen * OpenScreen();
  76. struct Window * OpenWindow();
  77.  
  78.         /****** global variables ******/
  79. struct IntuitionBase *IntuitionBase;
  80. struct GfxBase        *GfxBase;
  81.  
  82. struct Screen *screen;
  83. struct Window *window;
  84. struct ViewPort *vport;
  85.  
  86. int current_pic,current_color,lessons;
  87.  
  88. int alloc_num=0;
  89.  
  90.         /****** global structures *****/
  91. struct iff_header {            /** THIS DEFINES THE iff HEADER **/
  92.     CHUNK_ID    form_id;
  93.     CHUNK_LEN    form_len;
  94.     CHUNK_ID    form_type;
  95.     CHUNK_ID    bmhdr_id;
  96.     CHUNK_LEN    bmhdr_len;
  97.     short        width;
  98.     short        height;
  99.     long        unknown;
  100.     BYTE        planes;
  101.     BYTE        pad0;
  102.     BYTE        compression;
  103.     BYTE        pad1;
  104.     long        pad2,pad3;
  105.     CHUNK_ID    cmap_id;
  106.     CHUNK_LEN    cmap_len;
  107.     char        cmap[16*3];
  108.     CHUNK_ID    body_id;
  109.     CHUNK_LEN    body_len;
  110.     char        body;
  111. };    
  112.  
  113. struct mem_iff_pic {
  114.     struct iff_header *file_buffer;    /** PTR TO COMPRESSED IFF PIC **/
  115.     char    *body_ptr;        /** PTR TO BODY CHUNK IFF **/
  116.     short cmap [COLORS][3];        /** EXPANDED COLOR PALETTE */
  117. };
  118.  
  119. struct mem_iff_pic *lesson_pics;
  120.  
  121. struct mem_block {            /** define a struct for every object **/
  122.     char    *ptr;            /** that we've allocated             **/
  123.     int        size;
  124. } allocations[MAX_ALLOCS];
  125.  
  126. /*************************************************************************/
  127. /*************************** START OF MAIN *******************************/
  128. /*************************************************************************/
  129.  
  130. main(argc,argv)            /** TAKES A SCRIPT FILE AS ARGUMENT **/
  131. int argc;
  132. char *argv[];
  133. {
  134.     char *script_buffer;
  135.     char user_input;
  136.     int    script_size;
  137.     int    success;
  138.     
  139.     script_size = 0;
  140.     
  141. //    printf("Filename = %s # of args = %d\n",FIRST_ARG,argc);
  142.     if (argc != 2) exit (100);
  143.  
  144.     printf("EDUcational slideSHOW V0.9                   (C) 1990 L. Vanhelsuwé\n");
  145.     printf("--------------------------                   -------------------------\n");
  146.     printf("\n");
  147.     printf("Use the following keys to control the presentation:\n");
  148.     printf("\n");
  149.     printf("SPACE...... fade in next image element\n");
  150.     printf("BACKSPACE.. fade out current image element\n");
  151.     printf("'N'........ fade in next slide\n");
  152.     printf("'P'........ fade in previous slide\n\n");
  153.     printf("'Q'........ to quit\n\n");
  154.  
  155.     printf("HIT <ENTER> to start presentation."); getch();
  156.     printf("\n");
  157.     
  158.     GfxBase          = (struct GfxBase *) OpenLibrary("graphics.library",0);
  159.     IntuitionBase = (struct IntuitionBase*) OpenLibrary("intuition.library",0);
  160.     
  161.     script_buffer = load_file(FIRST_ARG);        /** LOAD SCRIPT **/
  162.         if (script_buffer == NULL) exit(100);
  163.  
  164.     lessons = count_lines(script_buffer);        /** HOWMANY PICS **/
  165.     printf("Number of Slides in this presentation = %d \n",lessons);
  166.  
  167.     lesson_pics = (struct mem_iff_pic*)
  168.          AllocMem(lessons*sizeof (struct mem_iff_pic),0); 
  169.  
  170.                             /** LOAD ALL PICS **/
  171.     success = cache_all_pictures(script_buffer,lessons);
  172.     if (success == FALSE)
  173.     {
  174.         printf("Cache technique failed this time....\n");
  175.         exit(100);
  176.     }
  177.  
  178.     decode_color_maps(lesson_pics,lessons);
  179.  
  180.     open_screen();            /** OPEN SLIDESHOW SCREEN    **/
  181.     current_pic = -1;        /** START SHOW OFF ....        **/
  182.     next_picture();            
  183.     
  184.     while ( (user_input = get_input()) != QUIT)
  185.     {
  186.         switch (user_input)
  187.         {
  188.             case 13:
  189.             case NEXT_COLOR:    next_color(); break;
  190.             case PREV_COLOR:    prev_color(); break;
  191.             case NEXT_PICTURE:    next_picture(); break;
  192.             case PREV_PICTURE:    prev_picture(); break;
  193.  
  194.             default:
  195.                 printf("Don't know event %d !\n",(int) user_input);
  196.         }
  197.     }
  198.  
  199.     close_everything();        /** RELEASE SCREEN,CACHE ETC..**/
  200.  
  201.     CloseLibrary((struct Library*)GfxBase);
  202.     CloseLibrary((struct Library*)IntuitionBase);
  203.  
  204.     printf ("\n\nHave a nice day..\n");
  205. }
  206.     
  207. /***********************************************************************/
  208. // Turn screen dark, decompress next slide, fade it in.
  209. /***********************************************************************/
  210. void next_picture()
  211. {
  212.     if (current_pic != (lessons -1) )
  213.     {
  214.         lights_out();
  215.         current_pic++;
  216.         decompress_pic();
  217.         
  218.         current_color = 1; fade_color(current_color,IN);
  219.     }
  220. }
  221. /***********************************************************************/
  222. // Fade next "subject" in (mapped to a unique pen color)
  223. // Goto next slide if no more subjects.
  224. /***********************************************************************/
  225. void next_color()
  226. {
  227.     current_color++;
  228.     if (current_color < MAX_COLOR)
  229.     {
  230.         fade_color(current_color,IN);
  231.     }
  232.     else
  233.     {
  234.         next_picture();
  235.     }
  236. }    
  237. /***********************************************************************/
  238. // Do opposite of next_color()
  239. /***********************************************************************/
  240. void prev_color()
  241. {
  242.     if (current_color != 1)
  243.     {
  244.         fade_color( current_color, OUT );
  245.         current_color--;
  246.     }
  247.     else
  248.     {
  249.         prev_picture();
  250.     }
  251. }
  252. /***********************************************************************/
  253. // Backtrack by going back to previous slide
  254. /***********************************************************************/
  255. void prev_picture()
  256. {
  257.     if (current_pic != 0)
  258.     {
  259.         lights_out();
  260.         current_pic--;
  261.         decompress_pic();
  262.         fade_screen(IN);
  263.         current_color = 1;
  264.     }
  265. }
  266. /***********************************************************************/
  267. char get_input()        /** WAIT FOR ANY ASCII KEY PRESS **/
  268. {
  269.     int type = -1;
  270.     char key;
  271.     struct IntuiMessage * msg;
  272.  
  273.     while (type != VANILLAKEY)
  274.     {
  275.         Wait(1 << window->UserPort->mp_SigBit);
  276.  
  277.         while (msg = (struct IntuiMessage *) GetMsg(window->UserPort))
  278.         {
  279.             type = msg->Class;
  280.             key = (char) msg->Code;
  281.             ReplyMsg((struct Message*)msg);
  282.         }
  283.     }
  284.  
  285.     return key;
  286. }
  287. /***********************************************************************/
  288. // Cache a picture file in its entirety.
  289. /*************