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

  1. /*
  2.     demoswap.c
  3.  
  4.     C-scape 3.2    Example Program
  5.     Copyright (c) 1990 by Oakland Group, Inc.
  6.     ALL RIGHTS RESERVED.
  7.  
  8.     This program demonstrates how C-scape programs can swap between
  9.     graphics and text modes.
  10.  
  11.     It places a C-scape window on the display in text mode and asks
  12.     for the name of a .pcx file.  If you enter a valid .pcx file
  13.     it switches into graphics mode and displays the image in a 
  14.     pmap window.  It waits for a keystroke and then goes back into
  15.     text mode.
  16.  
  17.     In general, to swap between text and graphics modes requires the
  18.     contruction of two device interfaces.  Each of these interfaces
  19.     are constructed by calling disp_Init().  Only one device interface
  20.     can be current at one time, however.  So you must call disp_Init()
  21.     for one mode first, save the current device interface, and then 
  22.     call disp_Init() for the other mode.  You then swap back and forth
  23.     between the two device interfaces depending on which mode you wish to
  24.     use.
  25.  
  26.     Each device interface has its own window manager and set of windows.
  27.     A window created while one device interface is current does not exist
  28.     under the other device interface.  If you wish to have a similar window
  29.     under text and graphics modes, you must create separate copies of 
  30.     the windows for each mode.
  31.  
  32.     For example:
  33.  
  34.     1) open text device interface,
  35.  
  36.         disp_Init(def_ModeText, NULL);
  37.  
  38.     2) save a pointer to the text interface, (note that disp_GetCurrent
  39.        shuts down the current interface (without closing it) , you 
  40.        should call it only when you are about to make another interface
  41.        current),    
  42.  
  43.         VOID *textdisp;
  44.  
  45.         textdisp = disp_GetCurrent();
  46.  
  47.     3) now create a graphics mode interface,
  48.  
  49.         disp_Init(def_ModeGraphics, NULL);
  50.  
  51.     4) save a pointer to the graphics mode interface and make the
  52.        text mode interface current again,    
  53.  
  54.         VOID *grafdisp;
  55.  
  56.         grafdisp = disp_GetCurrent();
  57.         disp_SetCurrent(textdisp);
  58.  
  59.     5) we can now use C-scape in text mode.  If we want to put up
  60.        windows in graphics mode, we shut down the text interaface
  61.        and set the current device interface to the graphics interface,        
  62.  
  63.         textdisp = disp_GetCurrent();
  64.         disp_SetCurrent(grafdisp);
  65.  
  66.  
  67.     You can also use this technique to drive two displays at once.  If
  68.     your PC has both a graphics and text display, the text interface 
  69.     will communicate with the text display and the graphics interface
  70.     will communicate with the graphics display.
  71.  
  72.     Note:    THIS PROGRAM MUST BE COMPILED IN LARGE MODEL!
  73.             (it needs more than 64k of data)
  74.  
  75.     Revision History:
  76.     -----------------
  77.      4/01/90 jmd    ansi-fied
  78.      6/06/90 jmd    changed main to return an int
  79.      9/14/90 bkd    changed to use exit(0) instead of return(0).
  80.     10/19/90 pmcm    included ostdlib.h for exit(), added return(1)
  81.     12/01/90 ted    prototyped main, except if Turbo C++.
  82.     12/04/90 ted    restored "" includes for C-scape headers (not <> includes).
  83. */
  84.  
  85. #include <stdio.h>
  86. #include <string.h>
  87.  
  88. #include "cscape.h"
  89. #include "ostdlib.h"    /*    for exit() */
  90. #include "popdecl.h"
  91.  
  92. #include "pmwinobj.h"    /* for pmwin stuff */
  93.  
  94. /*** Function prototypes ***/
  95.  
  96. /* Turbo C++ complains if main is prototyped */
  97. #ifndef TCP
  98. int main(void);
  99. #endif
  100.  
  101. void go(void);
  102. boolean showit(char *fname);
  103.  
  104. /*** Global data ***/
  105.  
  106. static VOID    *textdisp, *grafdisp;
  107. static win_type pcxwin;
  108.  
  109. /* -------------------------------------------------------------------------- */
  110.  
  111. int main(void)
  112. {
  113.     ocbox     charbox;
  114.  
  115.     /* Set up text display */
  116.     disp_Init(def_ModeText, FNULL);
  117.  
  118.     /* Turn on mouse support */
  119.     hard_InitMouse();
  120.     sedwin_ClassInit();
  121.  
  122.     /* map colors for monochrome displays */
  123.     if (disp_GetColors() <= 2L) {
  124.         disp_MapMono(TRUE);
  125.     }
  126.     
  127.     /* Save a pointer to the text interface and shut it down */
  128.     textdisp = disp_GetCurrent();
  129.  
  130.     /* Init graphics mode display interface, save a pointer to it */
  131.     disp_Init(def_ModeGraphics, FNULL); 
  132.     hard_InitMouse();
  133.  
  134.     /* Turn on pmap window mouse support */
  135.     pmwin_MouseInit();
  136.  
  137.     /* Turn on pmap window .pcx file handling */
  138.     pmap_IoInit();
  139.  
  140.     /* create the pmap window in which we'll show the .pcx image */
  141.     /* this window will belong the the graphics device interface */
  142.     charbox.toprow = 1;
  143.     charbox.leftcol = 1;
  144.     charbox.botrow =  disp_GetHeight() - 2;
  145.     charbox.rightcol = disp_GetWidth() - 2;
  146.  
  147.     pcxwin = win_Open(pmwin_Class, &charbox);
  148.  
  149.     win_SetBorder(pcxwin, bd_prompt);
  150.     bord_SetTitle(pcxwin, "PCX Image");
  151.  
  152.     /* now go back to text mode (shut down graphics interface and remember it) */
  153.     grafdisp = disp_GetCurrent();
  154.     disp_SetCurrent(textdisp);
  155.  
  156.     /* Now, create a sed to get the name of a .pcx file to view. */
  157.     go();
  158.     
  159.     /* close graphics mode interface */
  160.     textdisp = disp_GetCurrent();
  161.     disp_SetCurrent(grafdisp);
  162.     disp_Close();
  163.  
  164.     /* close text mode interface */
  165.     disp_SetCurrent(textdisp);
  166.     disp_Close();
  167.  
  168.     exit(0);
  169.     return(0);
  170. }
  171. /* -------------------------------------------------------------------------- */
  172.  
  173. void go(void)
  174. /*
  175.     Create a sed, get the name of a PCX file and show it.
  176.     Quit when the user presses Escape.
  177. */
  178. {
  179.     menu_type    menu;
  180.     sed_type    sed;
  181.     char         pcxfname[81];
  182.     pcxfname[0] = '\0';
  183.  
  184.     menu = menu_Open();
  185.  
  186.     menu_Printf(menu, "@[15, ]┌@[12,─]┐\n PCX File name:│@[12, ]│\n@[15, ]└@[12,─]┘\n");
  187.  
  188.     menu_Printf(menu, "@p[1,16]@fdw12[@[80,#]]", pcxfname, &string_funcs,
  189.                 "Press Escape to quit");
  190.  
  191.     menu_Flush(menu);
  192.  
  193.     sed = sed_Open(menu);
  194.     sed_SetColors(sed, 0x34, 0x3f, 0x43);
  195.  
  196.     sed_SetBorder(sed, bd_prompt);
  197.     sed_SetBorderTitle(sed, "PCX IMAGE FILE VIEWER");
  198.     sed_SetBorderFeature(sed, BD_MOVE);
  199.     sed_SetPosition(sed, 2, 21);
  200.     sed_SetHeight(sed, 3);
  201.     sed_SetWidth(sed, 30);
  202.  
  203.     sed_Repaint(sed);
  204.  
  205.     for (;;) {
  206.         if (sed_Go(sed) == 0) {
  207.             break;
  208.         }
  209.         else if (!showit(pcxfname)) {
  210.             sed_BorderPrompt(sed, " File Not Found ");
  211.         }
  212.     }
  213.     sed_Close(sed);
  214. }
  215.  
  216. boolean showit(char *fname)
  217. /*
  218.     Open the .pcx file, swap into graphics mode
  219.     and show the image.
  220.  
  221.     return when the user presses a key.
  222. */
  223. {
  224.     FILE *fp;
  225.     pmap_type pmap = NULL;
  226.     ocolmap_type crange;
  227.  
  228.     /* Now we'll use the graphics display 
  229.        note that we must swap modes before calling
  230.        any display related functions
  231.     */
  232.  
  233.     textdisp = disp_GetCurrent();
  234.     disp_SetCurrent(grafdisp);
  235.  
  236.     /* First, try to open file in binary mode */
  237.     if ((fp = fopen(fname, "rb")) != NULL) {
  238.         
  239.         /* Create a color range for the pmap, the color range defines
  240.            the palette of colors used to create the image.
  241.         */
  242.         crange = ocolmap_Open(0, 16);
  243.  
  244.         /* Load pmap from file and close file */    
  245.         pmap = pmap_Load(fp, crange);
  246.         fclose(fp);
  247.  
  248.         /* close the color range */
  249.         ocolmap_Close(crange);
  250.  
  251.         /* attach the pmap to the window */
  252.         pmwin_SetPmap(pcxwin, pmap);
  253.     }
  254.  
  255.     if (pmap != NULL) {
  256.         bord_SetTitle(pcxwin, "Now Showing:");
  257.  
  258.         bord_SetPrompt(pcxwin, fname);
  259.         bord_SetFeature(pcxwin, BD_MOVE | BD_RESIZE);
  260.  
  261.         if (win_IsEmployed(pcxwin)) {
  262.             bord_Paint(pcxwin);            /* Paint win contents and new border Title */
  263.         }
  264.         else {
  265.             /* employ the window (first time here) */
  266.             win_Employ(pcxwin);
  267.         }
  268.  
  269.         /* prompt for a keystroke */
  270.         pop_Prompt("Press Enter to return to text mode.", disp_GetHeight() - 6, disp_GetWidth() /2, -1, 26, 0x70, bd_1);
  271.  
  272.         /* close the pmap */
  273.         pmap_Close(pmap);
  274.         pmwin_SetPmap(pcxwin, NULL);
  275.     }
  276.  
  277.     /* Now we go back to using the text display */
  278.     grafdisp = disp_GetCurrent();
  279.     disp_SetCurrent(textdisp);
  280.  
  281.     return(pmap != NULL);
  282. }
  283. /* -------------------------------------------------------------------------- */
  284.  
  285.  
  286. void ModeSwitch(int ToText)
  287. {
  288.     if (ToText) {
  289.         grafdisp = disp_GetCurrent();
  290.         disp_SetCurrent(textdisp);
  291.     }
  292.     else {
  293.         textdisp = disp_GetCurrent();
  294.         disp_SetCurrent(grafdisp);
  295.     }
  296.  
  297.      return;
  298. }
  299.