home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CSAPE32.ARJ / EXAMPLES / DEMOPCX.C < prev    next >
C/C++ Source or Header  |  1991-03-09  |  8KB  |  301 lines

  1. /*
  2.     demopcx.c
  3.  
  4.     jmd 8/89
  5.  
  6.     C-scape 3.2    Example Program
  7.     Copyright (c) 1989, 1990 by Oakland Group, Inc.
  8.     ALL RIGHTS RESERVED.
  9.  
  10.     OVERVIEW:
  11.     ---------
  12.  
  13.     This program demonstrates how to use graphics and .pcx file 
  14.     images with C-scape.  In particular it shows how to open
  15.     a pmap (pixel map graphics) window, load an image into it
  16.     from a .pcx file, and attach the window to a sed as a bob.
  17.  
  18.     A .pcx file contains a graphic image.  You can create them
  19.     with PC Paintbrush(tm) as well as a number of other popular
  20.     graphics packages.  This program assumes the four .pcx
  21.     files:     
  22.             abc.pcx, art.pcx, face.pcx, graph.pcx
  23.  
  24.     are in the current directory when it is run.
  25.  
  26.  
  27.  
  28.     NOTE:    THIS PROGRAM MUST BE COMPILED IN LARGE MODEL !!!
  29.             (it needs more than 64k of data)
  30.  
  31.     NOTE:  This will not work under UNIX as the current UNIX 
  32.     version has no graphics support.
  33.  
  34.     Revision History:
  35.     -----------------
  36.      2/03/90 jmd    Made it close the pmap when it's done
  37.      4/01/90 jmd    ansi-fied
  38.      6/06/90 jmd    changed main to return an int
  39.      7/24/90 pmcm/pgo    Made it close the pmap when it's done in all cases
  40.      9/14/90 bkd    changed to use exit(0) instead of return(0).
  41.     10/19/90 pmcm    included ostdlib.h for exit(), added return(1)
  42.     12/01/90 ted    added 'void' arg list in demo_pcx() prototype & declaration.
  43.     12/01/90 ted    prototyped main, except if Turbo C++.
  44.     12/04/90 ted    added disp_SetColmap() and ocolmap_Close calls.
  45.     12/04/90 ted    restored "" includes for C-scape headers (not <> includes).
  46.     12/19/90 ted    added disp_GetColMap() call to init crange before loading
  47.                      1-plane pcx files.
  48. */
  49.  
  50. #include <stdio.h>
  51. #include <string.h>
  52.  
  53. #include "cscape.h"
  54. #include "ostdlib.h"    /*    for exit() */
  55. #include "pmwinobj.h"    /* for pmwin stuff */
  56.  
  57. /*** Function prototypes ***/
  58.  
  59. /* Turbo C++ complains if main is prototyped */
  60. #ifndef TCP
  61. int main(void);
  62. #endif
  63.  
  64. boolean demo_pcx(void);
  65. void     about(sed_type sed);
  66.  
  67. /*** list of .pcx files ***/
  68.  
  69. char *pcx_files = "abc.pcx,art.pcx,face.pcx,graph.pcx";
  70.  
  71. int main(void)
  72. {
  73.     boolean success;
  74.  
  75.     /*  
  76.         Initialize the C-scape device interface:
  77.         def_ModeGraphics selects best available graphics mode
  78.     */
  79.  
  80.     if (!disp_Init(def_ModeGraphics, FNULL)) {
  81.         printf("\nDEMOPCX: No graphics hardware found.");
  82.         printf("\n         Or, there is insufficient memory to initialize the OWL ...");
  83.         printf("\n         (This program requires a large memory model.)\n");
  84.         exit(1);
  85.         return(1);
  86.     }
  87.  
  88.     /* map colors for 2 color video modes */
  89.     if (disp_GetColors() <= 2L) {
  90.         disp_MapMono(TRUE);
  91.     }
  92.  
  93.     /* Turn on the mouse */
  94.     hard_InitMouse();
  95.  
  96.     /* Turn on sedwin mouse */
  97.     sedwin_ClassInit();
  98.  
  99.     /* Turn on pmap window mouse support */
  100.     pmwin_MouseInit();
  101.     
  102.     /* Turn on pmap window .pcx file handling */
  103.     pmap_IoInit();
  104.  
  105.     /* call the main part of the program */
  106.     success = demo_pcx();
  107.  
  108.     /* close down the display interface */
  109.     disp_Close();
  110.  
  111.     if (!success) {
  112.         printf("\nDEMOPCX: Unable to open .pcx files; or,\n");
  113.         printf("\n         Unable to load .pcx image\n");
  114.     }
  115.  
  116.     exit(0);
  117.     return(0);
  118. }
  119.  
  120. boolean demo_pcx(void)
  121. /*
  122.     Returns FALSE if it can't find the .pcx files
  123. */
  124. {
  125.     menu_type menu;
  126.     sed_type sed;
  127.     bob_type bob;
  128.     boolean     quit = FALSE;
  129.     boolean     ret = TRUE;
  130.  
  131.     win_type win;
  132.     ocbox cbox;
  133.     pmap_type pmap = NULL;
  134.     ocolmap_type crange;
  135.  
  136.     FILE *fp;
  137.     char  filename[15];
  138.  
  139.     strcpy(filename, "face.pcx");
  140.  
  141.     /* 
  142.         Create a color range for the pmap; the color range contains the palette
  143.         of colors used to create the image.
  144.         Initialize it to contain the current system display colors.
  145.     */
  146.     crange = ocolmap_Open(0, 16);
  147.     disp_GetColMap(crange);
  148.  
  149.     /* Create a pmap window to display the pmap */
  150.     /* first define the size of the windows in a ocbox structure: */
  151.     cbox.toprow   = 0;
  152.     cbox.leftcol  = 0;
  153.     cbox.botrow   = 17;
  154.     cbox.rightcol = 50;
  155.  
  156.     /* 
  157.         now create the window with win_Open.  We pass win_Open
  158.            the class function for the type of window we wish to create,
  159.            in this case pmwin_Class, and a pointer to the ocbox structure
  160.            defining its initial size and position.
  161.     */    
  162.         
  163.     win = win_Open(pmwin_Class, &cbox);
  164.  
  165.     win_SetAttr(win, 0x3f);
  166.     win_SetBorder(win, bd_mouse2);
  167.  
  168.     /* Create a bob from the pmap window */
  169.     bob = win_CreateBob(win, BOB_DEPENDENT);
  170.  
  171.     /* Create a sed, attach the bob to it */
  172.     menu = menu_Open();
  173.  
  174.     menu_Printf(menu, " Picture: @fd2[############]\n", 
  175.         filename, &list_funcs, NULL, pcx_files);
  176.  
  177.     menu_Printf(menu, "          @fd2[New] ", NULL, &gmenu_funcs, NULL, "2");
  178.  
  179.     menu_Printf(menu, " @fd2[Quit] ", NULL, &gmenu_funcs, NULL, "0");
  180.  
  181.     menu_Printf(menu, " @fd2[About] ", NULL, &gmenu_funcs, NULL, "1");
  182.     
  183.     /* attach the pmap bob to a protected field 
  184.        (it makes no sense to pass control to an image)
  185.     */
  186.     menu_Printf(menu, "\n @fpb[]", NULL, &bob_funcs, bob);
  187.  
  188.     sed = sed_Open(menu);
  189.     sed_SetColors(sed, 0x34, 0x3f, 0x43);
  190.  
  191.     sed_SetBorder(sed, bd_1);
  192.     sed_SetBorderFeature(sed, BD_MOVE | BD_RESIZE);
  193.     sed_SetPosition(sed, 0, 1);
  194.  
  195.     sed_SetMouse(sed, sedmou_Track);
  196.  
  197.     /* sit in a loop displaying different pmaps */
  198.     while(!quit) {
  199.  
  200.         /* if we haven't already, load a pmap (pixel map) from a .pcx file */
  201.         if (pmap == NULL) {
  202.             /* first, open the file in binary mode */
  203.             if ((fp = fopen(filename, "rb")) == NULL) {
  204.                 ret = FALSE;
  205.                 break;
  206.             }
  207.  
  208.             /* now, load a pmap from the file and close the file */    
  209.             if ((pmap = pmap_Load(fp, crange)) == NULL) {
  210.                 ret = FALSE;
  211.                 break;
  212.             }
  213.             disp_SetColMap(crange);
  214.  
  215.             fclose(fp);
  216.  
  217.             /* attach the pmap to the pmap window */
  218.             pmwin_SetPmap(win, pmap);
  219.  
  220.             /* paint the sed and the attached pmap window */
  221.             sed_Repaint(sed);
  222.         }
  223.  
  224.         /* go until Escape is pressed */
  225.         switch(sed_Go(sed)) {
  226.         case 1:
  227.             /* about */
  228.             about(sed);
  229.             break;
  230.  
  231.         case 0:
  232.             /* quit */
  233.             quit = TRUE;
  234.             /* no break, fall through */
  235.  
  236.         case 2:
  237.         default:
  238.             /* New: close the old pmap and then load a new one (above) */
  239.             pmap_Close(pmap);
  240.             pmwin_SetPmap(win, NULL);
  241.             pmap = NULL;
  242.             break;
  243.         }
  244.     }
  245.  
  246.     if (pmap != NULL) {
  247.         pmap_Close(pmap);
  248.         pmwin_SetPmap(win, NULL);
  249.         pmap = NULL;
  250.     }
  251.  
  252.     /* close the sed and pmap window */
  253.     sed_Close(sed);
  254.  
  255.     ocolmap_Close(crange);
  256.     return(ret);
  257. }
  258.  
  259. void about(sed_type sed)
  260. {
  261.     menu_type menu;
  262.     sed_type  popsed;
  263.     int       row, col;
  264.  
  265.     menu = menu_Open();
  266.     menu_Printf(menu, "\n This is demopcx, which demonstrates the use of .pcx files\n");
  267.     menu_Printf(menu, " with C-scape.  It holds four pictures and you can look at\n");
  268.     menu_Printf(menu, " any (or all) of them\n\n");
  269.     menu_Printf(menu, " To look at a new picture, either press the Plus key or\n");
  270.     menu_Printf(menu, " click the mouse on the `pic' field.  This pops up a list\n");
  271.     menu_Printf(menu, " of the pictures which you can view.  After picking one,\n");
  272.     menu_Printf(menu, " either press Enter or click the mouse on the `New'\n");
  273.     menu_Printf(menu, " field--this will display the picture you selected.\n\n");
  274.     menu_Printf(menu, " If you are using a mouse, you can also scroll the picture\n");                             
  275.     menu_Printf(menu, " by clicking on either arrow in the scroll bar.  You can\n");                             
  276.     menu_Printf(menu, " also use the mouse to move this window--click on an edge\n");                             
  277.     menu_Printf(menu, " (not a corner) and drag it wherever you want it to go.\n");                            
  278.  
  279.     menu_Printf(menu, "\n\n                          @f[ OK ]  ", NULL, &gmenu_funcs);
  280.  
  281.     popsed = sed_Open(menu);
  282.     sed_SetHeight(popsed, 20);
  283.     sed_SetWidth(popsed, 60);
  284.  
  285.     sed_SetColors(popsed, 0x50, 0x50, 0x05);
  286.  
  287.     sed_GetPosition(sed, &row, &col);
  288.     sed_SetPosition(popsed, row + 3, col + 4);
  289.  
  290.     sed_SetBorder(popsed, bd_2);
  291.     sed_SetBorderFeature(popsed, BD_MOVE | BD_RESIZE);
  292.     sed_SetShadow(popsed, 1);
  293.  
  294.     sed_SetMouse(popsed, sedmou_GreedyClick);
  295.     sed_Repaint(popsed);
  296.  
  297.     sed_Go(popsed);
  298.  
  299.     sed_Close(popsed);
  300. }
  301.