home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 March / VPR9703A.ISO / VPR_DATA / DOGA / SOURCES / POLYEDIT.LZH / MODEL / TLINE.C < prev    next >
C/C++ Source or Header  |  1996-01-19  |  4KB  |  215 lines

  1. /*
  2.  *        Line for Text VRAM
  3.  *
  4.  *        1993.11.21        T.Kobayashi
  5.  */
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <doslib.h>
  9.  
  10. #define    VRAM    ((unsigned short*)0xE20000)
  11. #define    HWORD    (1024/16)
  12.  
  13. #define    PutMask( p, mask, code )    {                \
  14.         if ( code == 0 )        *p &= ~( mask );    \
  15.         else if ( code == 1 )    *p |= ( mask );    \
  16.         else                    *p ^= ( mask );    \
  17.     }
  18.  
  19. #define    swap( a, b )    { int _w ; _w = a ; a = b ; b = _w ; }
  20.  
  21. /*
  22.  *        code    0 : clear
  23.  *                1 : set
  24.  *                2 : xor
  25.  */
  26.  
  27. #if    0
  28.  
  29. extern    void    TextLine( int, int, int, int, int );
  30.  
  31. void    main( argc, argv )
  32. int        argc ;
  33. char    *argv[] ;
  34. {
  35.     TextLine( atoi( argv[1] ), atoi( argv[2] ), atoi( argv[3] ), atoi( argv[4] ),
  36.                 atoi( argv[5] ) );
  37. }
  38.  
  39. #endif
  40.  
  41. static    void    TextLine1( int, int, int, int, int );
  42. static    void    TextLine2( int, int, int, int, int );
  43. static    void    TextLine3( int, int, int, int, int );
  44.  
  45. /*
  46.           3
  47.         |  /
  48.         | / 2
  49.         |/
  50.         +---1
  51.         |\
  52.         | \ 2
  53.         |  \
  54.           3
  55. */
  56. void    TextLine( x1, y1, x2, y2, code )
  57. int        x1, y1, x2, y2 ;
  58. int        code ;
  59. {
  60.     int        sp ;
  61.  
  62.     if ( x1 > x2 )
  63.     {
  64.         swap( x1, x2 );
  65.         swap( y1, y2 );
  66.     }
  67.     dummy_label1:
  68.     sp = SUPER( 0 );
  69.     dummy_label2:
  70.  
  71.     if ( y1 == y2 )
  72.         TextLine1( x1, y1, x2, y2, code );
  73.     else if ( x2 - x1 > abs( y1 - y2 ) )
  74.         TextLine2( x1, y1, x2, y2, code );
  75.     else
  76.         TextLine3( x1, y1, x2, y2, code );
  77.  
  78.     dummy_label3:
  79.     SUPER( sp );
  80. }
  81.  
  82. void    TextFill( x1, y1, x2, y2, code )
  83. int        x1, y1, x2, y2 ;
  84. int        code ;
  85. {
  86.     int        y, sp ;
  87.  
  88.     if ( x1 > x2 )
  89.         swap( x1, x2 );
  90.     if ( y1 > y2 )
  91.         swap( y1, y2 );
  92.  
  93.     dummy_label1:
  94.     sp = SUPER( 0 );
  95.     dummy_label2:
  96.     for( y = y1 ; y <= y2 ; y++ )
  97.     {
  98.         TextLine1( x1, y, x2, y, code );
  99.     }
  100.     dummy_label3:
  101.     SUPER( sp );
  102. }
  103.  
  104. static    void    TextLine1( x1, y1, x2, y2, code )
  105. int        x1, y1, x2, y2 ;
  106. int        code ;
  107. {
  108.     unsigned short    *p, *p1, *p2 ;
  109.     unsigned short    mask1, mask2 ;
  110.  
  111.     p1 = VRAM + y1 * HWORD + x1 / 16 ;
  112.     p2 = VRAM + y1 * HWORD + x2 / 16 ;
  113.  
  114.     mask1 = 0xffff >> ( x1 % 16 );
  115.     mask2 = 0xffff << ( 15 - ( x2 % 16 ) );
  116.  
  117.     if ( p1 == p2 )
  118.     {
  119.         PutMask( p1, mask1 & mask2, code );
  120.     }
  121.     else
  122.     {
  123.         PutMask( p1, mask1, code );
  124.         for( p = p1+1 ; p < p2 ; p++ )
  125.             PutMask( p, 0xffff, code );
  126.         PutMask( p2, mask2, code );
  127.     }
  128. }
  129.  
  130. static    void    TextLine2( x1, y1, x2, y2, code )
  131. int        x1, y1, x2, y2 ;
  132. int        code ;
  133. {
  134.     int        dxdy ;
  135.     int        x, y, xn ;
  136.     int        ylen, dy ;
  137.     unsigned short    *p, *p1, *p2 ;
  138.     unsigned short    mask1, mask2 ;
  139.  
  140.     if ( y1 < y2 )
  141.     {
  142.         ylen = y2 - y1 ;
  143.         dy = HWORD ;
  144.     }
  145.     else
  146.     {
  147.         ylen = y1 - y2 ;
  148.         dy = - HWORD ;
  149.     }
  150.  
  151.     dxdy = ( ( x2 - x1 ) << 16 ) / ylen ;
  152.     x = x1 << 16 ;
  153.     p1 = VRAM + y1 * HWORD + x1 / 16 ;
  154.  
  155.     for( y = 0 ; y < ylen ; y++ )
  156.     {
  157.         xn = x + dxdy ;
  158.         p2 = p1 + ( xn >> 20 ) - ( x >> 20 );
  159.  
  160.         mask1 = 0xffff >> ( ( x >> 16 ) % 16 );
  161.         mask2 = 0xffff << ( 16 - ( ( xn >> 16 ) % 16 ) );
  162.  
  163.         if ( p1 == p2 )
  164.         {
  165.             PutMask( p1, mask1 & mask2, code );
  166.         }
  167.         else
  168.         {
  169.             PutMask( p1, mask1, code );
  170.             for( p = p1+1 ; p < p2 ; p++ )
  171.                 PutMask( p, 0xffff, code );
  172.             PutMask( p2, mask2, code );
  173.         }
  174.  
  175.         p1 = p2 + dy ;
  176.         x = xn ;
  177.     }
  178.     PutMask( p1, 0x8000 >> ( x >> 16 ) % 16, code );
  179. }
  180.  
  181. static    void    TextLine3( x1, y1, x2, y2, code )
  182. int        x1, y1, x2, y2 ;
  183. int        code ;
  184. {
  185.     int        dxdy ;
  186.     int        x, y ;
  187.     int        ylen, dy ;
  188.     unsigned short    *p ;
  189.     unsigned short    mask ;
  190.  
  191.     if ( y1 < y2 )
  192.     {
  193.         ylen = y2 - y1 ;
  194.         dy = HWORD ;
  195.     }
  196.     else
  197.     {
  198.         ylen = y1 - y2 ;
  199.         dy = - HWORD ;
  200.     }
  201.  
  202.     p = VRAM + y1 * HWORD + x1 / 16 ;
  203.     dxdy = ( ( x2 - x1 ) << 16 ) / ylen ;
  204.     x = ( x1 << 16 ) + ( 1 << 15 );
  205.  
  206.     for( y = 0 ; y <= ylen ; y++ )
  207.     {
  208.         mask = 0x8000 >> ( ( x >> 16 ) % 16 );
  209.         PutMask( p, mask, code );
  210.  
  211.         p += dy + ( ( x + dxdy ) >> 20 ) - ( x >> 20 );
  212.         x += dxdy ;
  213.     }
  214. }
  215.