_wcc.c
上传用户:gzelex
上传日期:2007-01-07
资源大小:707k
文件大小:10k
开发平台:

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  _wcc.c
  6. +
  7. +  Copyright (c) 1995  by  Max-Planck-Institut fuer Informatik
  8. +  Im Stadtwald, 66123 Saarbruecken, Germany     
  9. +  All rights reserved.
  10. *******************************************************************************/
  11. /* basic graphic routines for MSDOS 
  12.  * implemented using watcom's graphics library (graph.lib)
  13.  */
  14. #include <graph.h>
  15. static int MODE;
  16. static int STYLE;
  17. static int WIDTH;
  18. void init_graphics(int mode, int col)
  19. {
  20.   if (mode == 1) // graphics mode
  21.   { _setvideomode(_MAXRESMODE);
  22.     for(int i=0; i<16; i++) 
  23.       set_palette(i,_R_[i],_G_[i],_B_[i]);
  24.     }
  25.   else // text mode
  26.    _setvideomode(_DEFAULTMODE);
  27.   videoconfig vconf;
  28.   _getvideoconfig(&vconf);
  29.   DISP_WIDTH  = vconf.numxpixels;
  30.   DISP_HEIGHT = vconf.numypixels;
  31.   DISP_DEPTH  = vconf.bitsperpixel; 
  32.   DISP_MAX_X  = DISP_WIDTH-1;
  33.   DISP_MAX_Y  = DISP_HEIGHT-1;
  34.   
  35. }
  36. static void set_draw_window(Window w)
  37. { DosWindow win = win_stack[w];
  38.   int x0 = win->xpos;
  39.   int y0 = win->ypos;
  40.   int x1 = x0 + win->width  - 1;
  41.   int y1 = y0 + win->height - 1;
  42.   _setviewport(x0,y0,x1,y1);
  43.  }
  44. void flush_display() {}
  45. int  new_color(const char*) { return 1; }
  46. int  text_height(const char*)  { return FONT_HEIGHT; }
  47. int  text_width(const char* s) { return FONT_WIDTH*strlen(s); }
  48. int  load_text_font(const char*) { return 0;}
  49. int  load_bold_font(const char*) { return 0;}
  50. int  load_message_font(const char*) { return 0;}
  51. int  set_font(const char*) { return 0;}
  52. void set_text_font() {}
  53. void set_bold_font() {}
  54. void set_message_font() {}
  55. int set_line_width(int width) 
  56. { int save = WIDTH;
  57.   WIDTH = width;
  58.   return save; 
  59.  }
  60. int set_line_style(int style) 
  61. { int save = STYLE;
  62.   STYLE = style;
  63.   switch(style) {
  64.   case solid : _setlinestyle(0xFFFF);
  65.                break;
  66.   case dotted: _setlinestyle(0x3333);
  67.                break;
  68.   case dashed: _setlinestyle(0x0F0F);
  69.                break;
  70.   }
  71.   return save;
  72.  }
  73. int set_color(int color) 
  74. { return _setcolor(color); }
  75. int set_mode(int mode)
  76. { int save = MODE;
  77.   MODE = mode;
  78.   switch(mode) {
  79.    case 0: _setplotaction(_GPSET);
  80.            break;
  81.    case 1: _setplotaction(_GXOR);
  82.            break;
  83.    case 2: _setplotaction(_GXOR);
  84.            break;
  85.    case 3: _setplotaction(_GAND);
  86.            break;
  87.   }
  88.   return save;
  89. }
  90. void set_redraw(Window w, void (*f)())
  91. { win_stack[w]->redraw = f; }
  92. void line(Window w, int x1, int y1, int x2, int y2)
  93. { set_draw_window(w);
  94.   _moveto(x1,y1);
  95.   _lineto(x2,y2);
  96.   for(int i = 2; i <= WIDTH; i++)
  97.   { int dx = (x1 > x2) ? x1-x2 : x2-x1;
  98.     int dy = (y1 > y2) ? y1-y2 : y2-y1;
  99.     int d = (i&1) ? i/2 : -i/2;
  100.     if (dx < dy)
  101.       { _moveto(x1+d,y1);
  102.         _lineto(x2+d,y2);
  103.        }
  104.     else
  105.       { _moveto(x1,y1+d);
  106.         _lineto(x2,y2+d);
  107.        }
  108.    }
  109. }
  110. void fill_polygon(Window w, int n, int* xc, int* yc)
  111. { set_draw_window(w);
  112.   xycoord* points = new xycoord[n];
  113.   for(int i=0; i<n; i++)
  114.   { points[i].xcoord = xc[i];
  115.     points[i].ycoord = yc[i];
  116.    }
  117.   _polygon(_GFILLINTERIOR,n,points);
  118.   delete[] points;
  119.  }
  120. void box(Window w, int x0, int y0, int x1, int y1)
  121. { set_draw_window(w);
  122.   _rectangle(_GFILLINTERIOR,x0,y0,x1,y1);
  123.  }
  124. void  rectangle(Window w, int x0, int y0, int x1, int y1)
  125. { set_draw_window(w);
  126.   _rectangle(_GBORDER,x0,y0,x1,y1);
  127.  }
  128. void circle(Window w, int x0,int y0,int r)
  129. { set_draw_window(w);
  130.   _ellipse(_GBORDER,x0-r,y0-r,x0+r,y0+r);
  131.  }
  132. void fill_circle(Window w, int x0, int y0, int r)
  133. { set_draw_window(w);
  134.   _ellipse(_GFILLINTERIOR,x0-r,y0-r,x0+r,y0+r);
  135.  }
  136. void put_text(Window w, int x, int y0, const char *text, int opaque)
  137.   set_draw_window(w);
  138.   int y1 = y0 + FONT_HEIGHT;
  139.   if (opaque)
  140.   { int save_color = _setcolor(win_stack[w]->bg_col);
  141.     int save_mode = _setplotaction(_GPSET);
  142.     _rectangle(_GFILLINTERIOR,x,y0,x+strlen(text)*FONT_WIDTH-1,y0+FONT_HEIGHT);
  143.     _setplotaction(save_mode);
  144.     _setcolor(save_color);
  145.    }
  146.   const char* stop = text + strlen(text);
  147.   for (const char* p = text; p < stop; p++)
  148.   { unsigned char* q =  FONT + (*p & 127) * FONT_HEIGHT;
  149.     for(int y=y0; y<y1; y++)
  150.     { unsigned char pat = *q++;
  151.       if (pat & 128) _setpixel(x  ,y);
  152.       if (pat &  64) _setpixel(x+1,y);
  153.       if (pat &  32) _setpixel(x+2,y);
  154.       if (pat &  16) _setpixel(x+3,y);
  155.       if (pat &   8) _setpixel(x+4,y);
  156.       if (pat &   4) _setpixel(x+5,y);
  157.       if (pat &   2) _setpixel(x+6,y);
  158.       if (pat &   1) _setpixel(x+7,y);
  159.      }
  160.     x += 8;
  161.    }
  162. }
  163. void put_text(Window w, int x, int y, const char *text, int l, int opaque)
  164. { char* str = new char[strlen(text)+1];
  165.   strcpy(str,text);
  166.   str[l] = '';
  167.   put_text(w,x,y,text,l,opaque);
  168.   delete[] str;
  169. }
  170. void put_ctext(Window w, int x, int y, const char* str, int opaque)
  171. { put_text(w,x-(text_width(str)-1)/2, y-(text_height(str)-1)/2, str, opaque); }
  172. void show_coordinates(Window w, const char* s)
  173. { DosWindow win = win_stack[w];
  174.   set_draw_window(w);
  175.   int save_mode = _setplotaction(_GXOR);
  176.   int save_col  = _setcolor(blue);
  177.   put_text(w,win->width-138,1,s,1); 
  178.   _setplotaction(save_mode);
  179.   _setcolor(save_col);
  180. }
  181. void pixel(Window w, int x, int y) 
  182. { set_draw_window(w);
  183.   _setpixel(x,y);
  184. }
  185. void pixels(Window w, int n, int* x, int* y)
  186. { while(n--) pixel(w,x[n],y[n]); }
  187. void point(Window w, int x, int y) 
  188. { set_draw_window(w);
  189.   _setpixel(x,y);
  190.   _setpixel(x-2,y-2);
  191.   _setpixel(x-1,y-1);
  192.   _setpixel(x+1,y+1);
  193.   _setpixel(x+2,y+2);
  194.   _setpixel(x-2,y+2);
  195.   _setpixel(x-1,y+1);
  196.   _setpixel(x+1,y-1);
  197.   _setpixel(x+2,y-2);
  198. }
  199. void ellipse(Window w, int x0, int y0, int a, int b)
  200. { set_draw_window(w);
  201.   _ellipse(_GBORDER,x0-a,y0-b,x0+a,y0+b);
  202. }
  203. void fill_ellipse(Window w, int x0, int y0, int a, int b)
  204. { set_draw_window(w);
  205.   _ellipse(_GFILLINTERIOR,x0-a,y0-b,x0+a,y0+b);
  206. }
  207. void arc(Window w, int x0, int y0, int a, int b, double start, double angle)
  208. { set_draw_window(w);
  209.   int start_x = x0 + int(cos(start)*1000);
  210.   int start_y = y0 - int(sin(start)*1000);
  211.   int end_x   = x0 + int(cos(start+angle)*1000);
  212.   int end_y   = y0 - int(sin(start+angle)*1000);
  213.   _arc(x0-a,y0-b,x0+a,y0+b,start_x,start_y,end_x,end_y);
  214.  }
  215. void fill_arc(Window,int,int,int,int,double,double)
  216. { }
  217. void copy_pixrect(Window w, int x1, int y1, int x2, int y2, int x, int y)
  218. { set_draw_window(w);
  219.   int sz = _imagesize(x1,y1,x2,y2);
  220.   char* image = new char[sz];
  221.   _getimage(x1,y1,x2,y2,image);
  222.   _putimage(x,y,image,_GPSET);
  223.   delete[] image;
  224.  }
  225. void insert_bitmap(Window w, int width, int height, char* data)
  226. { set_draw_window(w);
  227.   char* p = data;
  228.   for(int y=0; y<height; y++)
  229.     for(int x=0; x<width; x+=8)
  230.     { char pat = *p++;
  231.       if (pat & 0x01) _setpixel(x,   y);
  232.       if (pat & 0x02) _setpixel(x+1, y);
  233.       if (pat & 0x04) _setpixel(x+2, y);
  234.       if (pat & 0x08) _setpixel(x+3, y);
  235.       if (pat & 0x10) _setpixel(x+4, y);
  236.       if (pat & 0x20) _setpixel(x+5, y);
  237.       if (pat & 0x40) _setpixel(x+6, y);
  238.       if (pat & 0x80) _setpixel(x+7, y);
  239.      }
  240.  }
  241. void set_palette(int index, int red, int green, int blue)
  242. { if (red < 0)     red = _R_[index]; else _R_[index] = red;
  243.   if (green < 0) green = _G_[index]; else _G_[index] = green;
  244.   if (blue < 0)   blue = _B_[index]; else _B_[index] = blue;
  245.   _remappalette(index, (blue<<16) | (green<<8) | red); 
  246. }
  247. //------------------------------------------------------------------------------
  248. // pixrects
  249. //------------------------------------------------------------------------------
  250. char* create_pixrect(Window w, int left, int top, int right, int bottom)
  251. { set_draw_window(w);
  252.   char* bp = new char[_imagesize(left,top,right,bottom)];
  253.   _getimage(left,top,right,bottom,bp);
  254.   return bp;
  255.  }
  256. void insert_pixrect(Window w, int left, int top, char* rect)
  257. { set_draw_window(w);
  258.   if (left < 0) left = 0;
  259.   if (top < 0) top = 0;
  260.   _putimage(left,top,rect,_GPSET);
  261.  }
  262. void delete_pixrect(char* rect)   { delete rect; }
  263. //------------------------------------------------------------------------------
  264. // mouse cursor
  265. //------------------------------------------------------------------------------
  266. static unsigned short p_mask1[14] = 
  267. {0xc000,0xf000,0x7c00,0x7f00,0x3fc0,0x3fc0,0x1f00,
  268.  0x1f80,0x0dc0,0x0ce0,0x0070,0x0038,0x001c,0x000c};
  269. static unsigned short p_mask2[14] = 
  270. {0x0003,0x000f,0x003e,0x00fe,0x03fc,0x03fc,0x00f8,
  271.  0x01f8,0x03b0,0x0730,0x0e00,0x1c00,0x3800,0x3000};
  272. void draw_pointer(int mouse_x, int mouse_y, int shape)
  273. {
  274.   _setviewport(0,0,DISP_MAX_X,DISP_MAX_Y);
  275.   set_color(black);
  276.   if (shape == 1)
  277.   { _setpixel(mouse_x-2,mouse_y);
  278.     _setpixel(mouse_x-1,mouse_y);
  279.     _setpixel(mouse_x,mouse_y);
  280.     _setpixel(mouse_x+1,mouse_y);
  281.     _setpixel(mouse_x+3,mouse_y);
  282.     _setpixel(mouse_x,mouse_y-2);
  283.     _setpixel(mouse_x,mouse_y-1);
  284.     _setpixel(mouse_x,mouse_y+1);
  285.     _setpixel(mouse_x,mouse_y+2);
  286.     _ellipse(_GBORDER,mouse_x-6,mouse_y-6,mouse_x+6,mouse_y+6);
  287.     return;
  288.    }
  289.   else
  290.   { int x = mouse_x;
  291.     int y = mouse_y;
  292.     unsigned short* p = p_mask1;
  293.     if (x > DISP_MAX_X - 16) 
  294.     { x -= 16;
  295.       p = p_mask2;
  296.      }
  297.     unsigned short* p_stop = p + 14;
  298.     int d  = 1;
  299.     if (y > DISP_MAX_Y - 14) 
  300.     { y -= 14;
  301.       d = -1;
  302.       p_stop = p-1;
  303.       p += 13;
  304.      }
  305.      
  306.     while (p != p_stop)
  307.     { unsigned short pat = *p;
  308.       if (pat & 0x8000) _setpixel(x,   y);
  309.       if (pat & 0x4000) _setpixel(x+1, y);
  310.       if (pat & 0x2000) _setpixel(x+2, y);
  311.       if (pat & 0x1000) _setpixel(x+3, y);
  312.       if (pat & 0x0800) _setpixel(x+4, y);
  313.       if (pat & 0x0400) _setpixel(x+5, y);
  314.       if (pat & 0x0200) _setpixel(x+6, y);
  315.       if (pat & 0x0100) _setpixel(x+7, y);
  316.       if (pat & 0x0080) _setpixel(x+8, y);
  317.       if (pat & 0x0040) _setpixel(x+9, y);
  318.       if (pat & 0x0020) _setpixel(x+10,y);
  319.       if (pat & 0x0010) _setpixel(x+11,y);
  320.       if (pat & 0x0008) _setpixel(x+12,y);
  321.       if (pat & 0x0004) _setpixel(x+13,y);
  322.       if (pat & 0x0002) _setpixel(x+14,y);
  323.       if (pat & 0x0001) _setpixel(x+15,y);
  324.       p+=d;
  325.       y++;
  326.      }
  327.    }
  328. }