home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 March / VPR9703A.ISO / VPR_DATA / DOGA / SOURCES / POLYEDIT.LZH / MODEL / GRAPHPC.C < prev    next >
C/C++ Source or Header  |  1995-06-11  |  6KB  |  377 lines

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <dos.h>
  4. #include <graphics.h>
  5.  
  6. #include "graph.h"
  7.  
  8. #define    iskanji( c )    ( ( c & 0x80 ) == 0x80 )
  9. #define    FRAME_ADR        0xd0000000
  10. #define    swap( a, b )    { int _w ; _w = a ; a = b ; b = _w ; }
  11.  
  12. void    FontInit();
  13. void    FontPuts( int, int, unsigned char*, int, int );
  14.  
  15. int        Cols, Lines ;
  16. static    int        hsize ;
  17. static    int        video_mode ;
  18. static    int        font_init = 0 ;
  19.  
  20. static    void    Line1( int, int, int, int, int );
  21. static    void    Line2( int, int, int, int, int );
  22. static    void    Line3( int, int, int, int, int );
  23. static    void    Line4( int, int, int, int, int );
  24.  
  25. void    graph_init()
  26. {
  27.     int        i ;
  28.     Cols = 80 ;
  29.     Lines = 25 ;
  30.  
  31.     video_mode = *(char*)( 0xE0000000 | 0x449 );
  32.  
  33.     if ( font_init == 0 )
  34.     {
  35.         FontInit();
  36.         font_init = 1 ;
  37.     }
  38.     GrSetMode( GR_default_graphics );
  39.     hsize = GrSizeX();
  40.  
  41. #if    1
  42.     for( i = 16 ; i < 32 ; i++ )
  43.         GrSetColor( i, 127, 127, 255 );
  44. #endif
  45.  
  46.     Cols = GrSizeX() / 8 ;
  47.     Lines = GrSizeY() / 16 ;
  48.  
  49.     for (i = 0; i < 8; ++i) {
  50.         GrSetColor( i, (i&4) ? 255 : 0, (i&2) ? 255 : 0, (i&1) ? 255 : 0 );
  51.     }
  52. }
  53.  
  54. void    graph_exit()
  55. {
  56.     union    REGS    regs ;
  57.     
  58.     regs.h.ah = 0 ;
  59.     regs.h.al = video_mode ;
  60.     int86( 0x10, ®s, ®s );
  61. }
  62.  
  63. void    graph_line( x1, y1, x2, y2, color )
  64. int     x1 ;
  65. int     y1 ;
  66. int        x2 ;
  67. int        y2 ;
  68. int        color ;
  69. {
  70.     if ( color < 16 )
  71.     {
  72.         if ( y1 > y2 )
  73.         {
  74.             swap( x1, x2 );
  75.             swap( y1, y2 );
  76.         }
  77.         if ( x2 - x1 < - ( y2 - y1 ) )
  78.             Line1( x1, y1, x2, y2, color );
  79.         else if ( x2 - x1 < 0 )
  80.             Line2( x1, y1, x2, y2, color );
  81.         else if ( x2 - x1 < y2 - y1 )
  82.             Line3( x1, y1, x2, y2, color );
  83.         else
  84.             Line4( x1, y1, x2, y2, color );
  85.     }
  86.     else if ( color == 18 )
  87.         GrLine( x1, y1, x2, y2, GrXOR | 0x1f );
  88. }
  89.  
  90. static    void    Line1( x1, y1, x2, y2, color )
  91. int        x1, y1, x2, y2 ;
  92. int        color ;
  93. {
  94.     char    *adr ;
  95.     int        add, over, total ;
  96.     int        x ;
  97.  
  98.     add = y2 - y1 ;
  99.     over = x1 - x2 ;
  100.     total = over / 2 ;
  101.  
  102.     adr = (char*)( FRAME_ADR + y1 * hsize + x1 );
  103.  
  104.     for( x = x1 ; x >= x2 ; x-- )
  105.     {
  106.         *adr-- = color ;
  107.         total += add ;
  108.         if ( total > over )
  109.         {
  110.             total -= over ;
  111.             adr += hsize ;
  112.         }
  113.     }
  114. }
  115.  
  116. static    void    Line2( x1, y1, x2, y2, color )
  117. int        x1, y1, x2, y2 ;
  118. int        color ;
  119. {
  120.     char    *adr ;
  121.     int        add, over, total ;
  122.     int        y ;
  123.  
  124.     add = x1 - x2 ;
  125.     over = y2 - y1 ;
  126.     total = over / 2 ;
  127.  
  128.     adr = (char*)( FRAME_ADR + y1 * hsize + x1 );
  129.  
  130.     for( y = y1 ; y <= y2 ; y++ )
  131.     {
  132.         *adr = color ;
  133.         adr += hsize ;
  134.         total += add ;
  135.         if ( total > over )
  136.         {
  137.             total -= over ;
  138.             adr -- ;
  139.         }
  140.     }
  141. }
  142.  
  143. static    void    Line3( x1, y1, x2, y2, color )
  144. int        x1, y1, x2, y2 ;
  145. int        color ;
  146. {
  147.     char    *adr ;
  148.     int        add, over, total ;
  149.     int        y ;
  150.  
  151.     add = x2 - x1 ;
  152.     over = y2 - y1 ;
  153.     total = over / 2 ;
  154.  
  155.     adr = (char*)( FRAME_ADR + y1 * hsize + x1 );
  156.  
  157.     for( y = y1 ; y <= y2 ; y++ )
  158.     {
  159.         *adr = color ;
  160.         adr += hsize ;
  161.         total += add ;
  162.         if ( total > over )
  163.         {
  164.             total -= over ;
  165.             adr ++ ;
  166.         }
  167.     }
  168. }
  169.  
  170. static    void    Line4( x1, y1, x2, y2, color )
  171. int        x1, y1, x2, y2 ;
  172. int        color ;
  173. {
  174.     char    *adr ;
  175.     int        add, over, total ;
  176.     int        x ;
  177.  
  178.     add = y2 - y1 ;
  179.     over = x2 - x1 ;
  180.     total = over / 2 ;
  181.  
  182.     adr = (char*)( FRAME_ADR + y1 * hsize + x1 );
  183.  
  184.     for( x = x1 ; x <= x2 ; x++ )
  185.     {
  186.         *adr++ = color ;
  187.         total += add ;
  188.         if ( total > over )
  189.         {
  190.             total -= over ;
  191.             adr += hsize ;
  192.         }
  193.     }
  194. }
  195.  
  196. void    graph_cls( color )
  197. int        color ;
  198. {
  199.     graph_fill( 0, 0, Cols*8, Lines*16, color );
  200. }
  201.  
  202. void    graph_fill( x1, y1, x2, y2, color )
  203. int        x1 ;
  204. int        y1 ;
  205. int        x2 ;
  206. int        y2 ;
  207. int        color ;
  208. {
  209.     int        x, y ;
  210.     char    *top, *adr ;
  211.     int        *iadr ;
  212.  
  213.     if ( color >= 16 )
  214.         return ;
  215.  
  216.     if ( x1 > x2 )
  217.         swap( x1, x2 );
  218.     if ( y1 > y2 )
  219.         swap( y1, y2 );
  220.  
  221.     top = (char*)( FRAME_ADR + y1 * hsize + x1 );
  222.  
  223.     color |= ( color << 24 ) | ( color << 16 ) | ( color << 8 );
  224.  
  225.     for( y = y1 ; y <= y2 ; y++ )
  226.     {
  227.         adr = top ;
  228.         for( x = x1 ; x <= x2 && ( x & 3 ) != 0 ; x++ )
  229.             *adr++ = color ;
  230.         iadr = (int*)adr ;
  231.         for( ; x < x2 - 3 ; x += 4 )
  232.             *iadr++ = color ;
  233.         adr = (char*)iadr ;
  234.         for( ; x <= x2 ; x++ )
  235.             *adr++ = color ;
  236.         top += hsize ;
  237.     }
  238. }
  239.  
  240. void    graph_palet( paletmode, g, r, b )
  241. int        paletmode ;
  242. int        g, r, b ;
  243. {
  244.     GrSetColor( paletmode, r, g, b );
  245. }
  246.  
  247. void    graph_puts( str, x, y, atr )
  248. char    *str ;
  249. int        x, y ;
  250. int        atr ;
  251. {
  252.     FontPuts( x, y, str, atr & 15, atr >> 4 );
  253. }
  254.  
  255. void    graph_pattern( x, y, color, pat, h, v )
  256. int        x, y ;
  257. int        color ;
  258. short    *pat ;
  259. int        h, v ;
  260. {
  261.     char    *adr ;
  262.     int        i, j, k ;
  263.     int        a, hh, hword ;
  264.     int        fg, bg ;
  265.  
  266.     fg = ( color & 0x0f );
  267.     bg = ( color >> 4 ) & 0x0f ;
  268.  
  269.     hword = ( h + 15 ) / 16 ;
  270.  
  271.     for( i = 0 ; i < v ; i++ )
  272.     {
  273.         adr = (char*)( FRAME_ADR + ( y + i ) * hsize + x );
  274.         hh = h ;
  275.         for( j = 0 ; j < hword ; j++ )
  276.         {
  277.             a = *pat++ & 0xffff ;
  278.             for( k = 0 ; k < 15 && k < hh ; k++ )
  279.             {
  280.                 if ( a & 0x8000 )
  281.                     *adr++ = fg ;
  282.                 else
  283.                     *adr++ = bg ;
  284.                 a <<= 1 ;
  285.             }
  286.             hh -= 16 ;
  287.         }
  288.     }
  289. }
  290.  
  291. void    graph_pattern2( x, y, color, buf, h, v )
  292. int        x, y ;
  293. int        color ;
  294. char    *buf ;
  295. int        h, v ;
  296. {
  297.     char    *adr ;
  298.     int        i, j, k, c ;
  299.     int        fg, bg ;
  300.  
  301.     fg = color & 0xf ;
  302.     bg = ( color >> 4 ) & 0x0f ;
  303.  
  304.     adr = (char*)( FRAME_ADR + y * hsize + x );
  305.  
  306.     h /= 8 ;
  307.     for( i = 0 ; i < v ; i++ )
  308.     {
  309.         for( j = 0 ; j < h ; j++ )
  310.         {
  311.             c = *buf++ ;
  312.             for( k = 0 ; k < 8 ; k++ )
  313.             {
  314.                 if ( c & 0x80 )
  315.                     *adr++ = fg ;
  316.                 else
  317.                     *adr++ = bg ;
  318.                 c <<= 1 ;
  319.             }
  320.         }
  321.         adr += hsize - h * 8 ;
  322.     }
  323. }
  324.  
  325. void    graph_pattern_xor( x, y, color, pat, h, v )
  326. int        x, y ;
  327. int        color ;
  328. short    *pat ;
  329. int        h, v ;
  330. {
  331.     char    *adr ;
  332.     int        i, j, k ;
  333.     int        a, hh, hword ;
  334.  
  335.     hword = ( h + 15 ) / 16 ;
  336.  
  337.     for( i = 0 ; i < v ; i++ )
  338.     {
  339.         adr = (char*)( FRAME_ADR + ( y + i ) * hsize + x );
  340.         hh = h ;
  341.         for( j = 0 ; j < hword ; j++ )
  342.         {
  343.             a = *pat++ & 0xffff ;
  344.             for( k = 0 ; k < 15 && k < hh ; k++ )
  345.             {
  346.                 if ( a & 0x8000 )
  347.                     *adr ^= color ;
  348.                 adr++ ;
  349.                 a <<= 1 ;
  350.             }
  351.             hh -= 16 ;
  352.         }
  353.     }
  354. }
  355.  
  356.  
  357. /*    ボタン表示    */
  358. void    graph_box( x1, y1, x2, y2, sw )
  359. int        x1, y1, x2, y2 ;
  360. int        sw ;
  361. {
  362.     if ( sw )
  363.     {
  364.         graph_line( x1, y1, x2, y1, 7 );
  365.         graph_fill( x1, y1, x1+1, y2, 7 );
  366.         graph_line( x1, y2, x2, y2, 0 );
  367.         graph_line( x2, y1, x2, y2, 0 );
  368.     }
  369.     else
  370.     {
  371.         graph_line( x1, y1, x2, y1, 0 );
  372.         graph_line( x1, y1, x1, y2, 0 );
  373.         graph_line( x1, y2, x2, y2, 7 );
  374.         graph_fill( x2, y1, x2+1, y2, 7 );
  375.     }
  376. }
  377.