home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_300 / 328_01 / wdraw.c < prev    next >
C/C++ Source or Header  |  1991-03-17  |  4KB  |  209 lines

  1. /* wdraw.c
  2.  *    routines for mouse-controlled drawing of lines, squigles, squares
  3.  *    use:
  4.  *        call the procedure specifying type of drawing to do.
  5.  *        (see definitions of WDR_LINE, WDR_RECT, etc for types,
  6.  *        linestyle, thickness, color are set by TurboC graphics
  7.  *        (user-defined linestyle is not supported).
  8.  *
  9.  * This program does not work in Microsoft C, which doesn't support 
  10.  * drawing.
  11.  */
  12.  
  13.  
  14.  
  15.  
  16.  
  17. /*--------------------------------------------*/
  18.  
  19.  
  20.  
  21.  
  22. #ifndef TEXTONLY
  23.  
  24.  
  25. #ifdef __TURBOC__
  26.  
  27.  
  28. #include "wsys.h"
  29. #include <graphics.h>
  30.  
  31.  
  32. static W_NEAR xdraw ( WOBJECT_D_ART * );
  33.  
  34.  
  35.  
  36. WOBJECT_D_ART *wdraw ( char type, int color, int linestyle, int thickness )
  37.     {
  38.     WOBJECT_D_ART *wdr;
  39.     int key;
  40.     int first_pass =1;
  41.  
  42.     struct linesettingstype   save_line_set;
  43.     int save_color;
  44.     
  45.     /* get keys until either Left mouse button pressed or ESCAPE
  46.      */
  47.  
  48.     wmouse_limit (ON);
  49.     
  50.     while ( ( (key=wgetc()) != MOUSE ) && (key != ESCAPE) )
  51.         {
  52.         /* empty */
  53.         }
  54.     if ( (key==ESCAPE ) || ( (wmouse.wms_used & WMS_LEFT_PRS) == 0 )  )
  55.         {
  56.         wmouse_limit (OFF);
  57.         return (NULL);
  58.         }
  59.         
  60.     wmouse_turn (OFF);    
  61.     
  62.  
  63.     getlinesettings ( &save_line_set );
  64.     save_color = getcolor ();
  65.  
  66.  
  67.     wdr = wmalloc ( sizeof (WOBJECT_D_ART), "WDRAW");
  68.     memset ( wdr, 0, sizeof (WOBJECT_D_ART) );
  69.     wdr->wdr_type         = type;
  70.     wdr->wdr_linestyle     = linestyle;
  71.     wdr->wdr_thickness     = thickness;
  72.     wdr->wdr_color           = color;
  73.     wdr->wdr_x1             = wdr->wdr_x2           = wmouse.wms_px;
  74.     wdr->wdr_y1             = wdr->wdr_y2        = wmouse.wms_py;
  75.  
  76.  
  77.     setlinestyle ( linestyle, 0, thickness );
  78.     setcolor (color);
  79.  
  80.     setwritemode (1);        /* XOR */
  81.  
  82.     if ( type == WDR_SQUIGGLE )
  83.         {
  84.         moveto (wdr->wdr_x1, wdr->wdr_y1);
  85.         }
  86.  
  87.     do
  88.         {
  89.  
  90.         if ( (! first_pass ) && (type != WDR_SQUIGGLE) )
  91.             {
  92.             xdraw (wdr);    /* erase old image */
  93.             wmouse.wms_used |= WMS_MOVED;  /* force first draw */
  94.             }
  95.         first_pass =0;
  96.  
  97.  
  98.         if ( ( wmouse.wms_used & WMS_MOVED ) != 0 )
  99.             {
  100.             wdr->wdr_x2 = wmouse.wms_px;
  101.             wdr->wdr_y2 = wmouse.wms_py;
  102.  
  103.             xdraw (wdr);    /* redraw */
  104.             }
  105.  
  106.         wmouse_location ();
  107.  
  108.         }
  109.         /* continue loop until either left or right key is released.
  110.          */
  111.     while  ( (wmouse.wms_used & (WMS_LEFT_RLS | WMS_RIGHT_PRS )) == 0 ) ;
  112.  
  113.  
  114.     if     ( (wmouse.wms_used & WMS_RIGHT_PRS ) != 0 )
  115.         {
  116.         /* RIGHT BUTTON = ESCAPE, erase drawing.
  117.          */
  118.         if ( (! first_pass ) && (type != WDR_SQUIGGLE) )
  119.             {
  120.             xdraw (wdr);
  121.             }
  122.         }
  123.  
  124.  
  125.     /* restore prior drawing environment
  126.      */
  127.     setwritemode (0);    /* overwrite */
  128.     setlinestyle (     save_line_set.linestyle,
  129.                     save_line_set.upattern,
  130.                     save_line_set.thickness );
  131.     setcolor (save_color);
  132.     wmouse_turn (ON);
  133.     wmouse_limit (OFF);
  134.  
  135.     /* flush mouse 
  136.      */
  137.     do 
  138.         {
  139.         wmouse.wms_internal =0;
  140.         wmouse_location ();
  141.         }
  142.     while ( wmouse.wms_used );
  143.     
  144.  
  145.     return ( wdr );         /* wdraw, TurboC version */
  146.     }
  147.  
  148.  
  149.  
  150.  
  151.  
  152.  
  153.  
  154. /* slave routine for wdraw() - uses XOR_PUT to either write or erase
  155.  * the object using x2, y2 as new co-ords
  156.  */
  157. static W_NEAR xdraw ( WOBJECT_D_ART *wdr )
  158.     {
  159.  
  160.     int ymax, xmax;
  161.  
  162.     xmax =w0->winpxmax;
  163.     ymax =w0->winpymax;
  164.  
  165.     switch ( wdr-> wdr_type )
  166.         {
  167.     case ( WDR_LINE ):
  168.         line ( wdr->wdr_x1, wdr->wdr_y1, wdr->wdr_x2, wdr->wdr_y2 );
  169.         break;
  170.  
  171.     case ( WDR_RECT ):
  172.         line ( wdr->wdr_x1, wdr->wdr_y1, wdr->wdr_x2, wdr->wdr_y1 );
  173.         line ( wdr->wdr_x2, wdr->wdr_y1, wdr->wdr_x2, wdr->wdr_y2 );
  174.         line ( wdr->wdr_x2, wdr->wdr_y2, wdr->wdr_x1, wdr->wdr_y2 );
  175.         line ( wdr->wdr_x1, wdr->wdr_y2, wdr->wdr_x1, wdr->wdr_y1 );
  176.         break;
  177.  
  178.     case ( WDR_XHAIR ):
  179.         line ( wdr->wdr_x2, 0,           wdr->wdr_x2, ymax );
  180.         line ( 0,           wdr->wdr_y2, xmax, wdr->wdr_y2 );
  181.         break;
  182.  
  183.     case ( WDR_VERT ):
  184.         line ( wdr->wdr_x2, 0,           wdr->wdr_x2, ymax );
  185.         break;
  186.  
  187.     case ( WDR_HORZ ):
  188.         line ( 0,           wdr->wdr_y2, xmax,        wdr->wdr_y2 );
  189.         break;
  190.  
  191.     case ( WDR_SQUIGGLE ):
  192.         lineto ( wdr->wdr_x2, wdr->wdr_y2 );
  193.         break;
  194.  
  195.         }
  196.  
  197.  
  198.  
  199.  
  200.  
  201.     return;        /* xdraw */
  202.     }
  203.  
  204.  
  205. #endif          /* end TurboC */
  206.  
  207.  
  208. #endif /*TEXTONLY */
  209.