home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 11 / 11.iso / m / m111 / 2.img / GRPCT3.EXE / LINE2.C < prev    next >
Encoding:
C/C++ Source or Header  |  1991-02-07  |  1.6 KB  |  115 lines

  1. /* 2x2 line draw routine,  Copyright 1991 John Bridges */
  2.  
  3. #define code _based(_segname("_CODE"))
  4.  
  5. unsigned code _acrtused;    /* Dummy variable required by linker */
  6.  
  7. #define width 320
  8. #define height 200
  9. #define scrnseg 0xa000
  10.  
  11. unsigned char code color;
  12.  
  13. unsigned long far main(argc, argv)
  14. int argc;
  15. char **argv;
  16. {
  17.     if (argc!=6) return 0;
  18.     color=num(argv[5]);
  19.     line(num(argv[1]),num(argv[2]),num(argv[3]),num(argv[4]));
  20.     return 1;
  21. }
  22.  
  23.  
  24. /* make a 2x2 size dot in 320x200 256 col mode */
  25. point(int x,int y)    
  26. {
  27.     _asm {
  28.         mov    ax,height-1
  29.         sub    ax,[y]
  30.         mov    bx,width
  31.         mul    bx
  32.         add    ax,[x]
  33.         mov    bx,ax
  34.         mov    ax,scrnseg
  35.         mov    es,ax
  36.         mov    al,byte ptr cs:[color]
  37.         mov    es:[bx],al
  38.         mov    es:[bx+1],al
  39.         add    bx,width
  40.         mov    es:[bx],al
  41.         mov    es:[bx+1],al
  42.     }
  43.         
  44. }
  45.  
  46. line(int x,int y,int x2,int y2)
  47. {
  48.     unsigned int cnt,acc;
  49.     int dx,dy,dir;
  50.  
  51.     if (x>x2)
  52.     {
  53.         cnt=x; x=x2; x2=cnt;
  54.         cnt=y; y=y2; y2=cnt;
  55.     }
  56.     acc=0;
  57.     dy=y2-y;
  58.     if(dy<0)
  59.     {
  60.         dir=-1;
  61.         dy=-dy;
  62.     }
  63.     else if(dy>0) dir=1;
  64.     else dir=0;
  65.     dx=x2-x;
  66.     if(dy<dx)
  67.     {
  68.         point(x,y);
  69.         cnt=dx;
  70.         while(cnt--)
  71.         {
  72.             x++;
  73.             acc+=dy;
  74.             if(acc>=dx)
  75.             {
  76.                 acc-=dx;
  77.                 y+=dir;
  78.             }
  79.             point(x,y);
  80.         }
  81.     }
  82.     else
  83.     {
  84.         point(x,y);
  85.         point(x+1,y);
  86.         cnt=dy;
  87.         while(cnt--)
  88.         {
  89.             y+=dir;
  90.             acc+=dx;
  91.             if(acc>=dy)
  92.             {
  93.                 acc-=dy;
  94.                 ++x;
  95.             }
  96.             point(x,y);
  97.         }
  98.     }
  99. }
  100.  
  101.  
  102. num(unsigned char *pt)
  103. {
  104.     unsigned int j;
  105.  
  106.     if (((unsigned int *) pt)[-1] == 1)
  107.         return (int) *(unsigned long *) pt;
  108.     j = 0;
  109.     while (*pt >= '0' && *pt <= '9')    /* loop through and convert */
  110.         j = j * 10 + (*pt++ - '0');
  111.     return j;
  112. }
  113.  
  114.  
  115.