home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 March / VPR9703A.ISO / VPR_DATA / DOGA / SOURCES / POLYEDIT.LZH / READER / ATRREAD.C < prev    next >
C/C++ Source or Header  |  1996-03-12  |  6KB  |  315 lines

  1. /*
  2.  *        アトリビュートファイル入力関数
  3.  *
  4.  *        Copyright T.Kobayashi    1993.1.17
  5.  */
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <assert.h>
  10.  
  11. #include "lib.h"
  12. #include "_reader.h"
  13. #include "word.h"
  14.  
  15. #include "inlib.h"
  16.  
  17. #define NOT_IMPLIMENTED    1
  18.  
  19. #define NOT_FOUND        11
  20. #define BAD_EXIST        12
  21. #define WRONG_MAP_DATA    13
  22.  
  23. #define UNEXPECTED_EOF    21
  24. #define NOT_ATR_FILE    22
  25.  
  26. static    void    getmapdata( int[2][2] );
  27. static    void    atrerror( int, char* );
  28.  
  29. static    char    name[MAXWORD] ;
  30. static    int        type ;
  31. static    Color    col ;
  32. static    Color    amb, dif, spc, size ;
  33. static    Color    ref, tra, rfr, att;
  34. static    int        h ;
  35. #if 0
  36. static    int        tra ;
  37. #endif
  38. static    int        maptype ;
  39. static    char    colorfile[F_NAME_LEN] ;
  40. static    int        mapsize[2][2], mapview[2][2], mapwind[2][2] ;
  41. extern    int        lasterror;
  42.  
  43. /*    アトリビュートファイルのオープン    */
  44. int        AtrReadOpen( filename )
  45. const    char    *filename ;
  46. {
  47.     lasterror = 0;
  48.     if ( fileopen( filename ) == 0 )
  49.         return FALSE ;
  50.  
  51.     if ( wordid != WORD_ATR )
  52.     {
  53.         atrerror( NOT_ATR_FILE, "" );
  54.         fileclose();
  55.         return FALSE ;
  56.     }
  57.     return TRUE ;
  58. }
  59.  
  60. /*    アトリビュートファイルのクローズ    */
  61. int        AtrReadClose()
  62. {
  63.     fileclose();
  64.     return TRUE ;
  65. }
  66.  
  67. /*    アトリビュートの読み込み    */
  68. int        AtrReadNext()
  69. {
  70.     int        id ;
  71.     double    w ;
  72.     Color    coldmy ;
  73.  
  74.     if ( end_of_file )
  75.         return FALSE ;
  76.  
  77.     if ( wordid != WORD_ATR )
  78.     {
  79.         atrerror( NOT_FOUND, "atr" );
  80.         get() ;
  81.     }
  82.     get() ;
  83.  
  84.     getname( name );
  85.  
  86.     if ( wordid != WORD_OPEN2 )
  87.         atrerror( NOT_FOUND, "{" );
  88.     get();
  89.  
  90.     col.r = col.g = col.b = 0 ;
  91.     amb = dif = spc = size = ref = tra = rfr = att = col;
  92.     h = 0 ;
  93.     amb.r = amb.g = amb.b = COLOR_UNIT/2;
  94.     dif = amb;
  95. #if 0
  96.     tra = COLOR_UNIT ;
  97. #endif
  98.     type = ATR_SIMPLE ;
  99.     maptype = MAP_NO ;
  100.     while( wordid != WORD_CLOSE2 )
  101.     {
  102.         id = wordid ;
  103.         isopen1() ;
  104.         switch( id )
  105.         {
  106.             case WORD_COL :
  107.                 getcolor( &col );
  108.                 break ;
  109.             case WORD_AMB :
  110.                 if ( getcolor( &amb ) )
  111.                     type |= ATR_RGB ;
  112.                 break ;
  113.             case WORD_DIF :
  114.                 if ( getcolor( &dif ) )
  115.                     type |= ATR_RGB ;
  116.                 break ;
  117.             case WORD_SPC :
  118.                 if ( getcolor( &spc ) && getcolor( &size ) )
  119.                     type |= ATR_RGB ;
  120. #if 0
  121.                 size.r = ( size.r * 100 ) >> COLOR_SHIFT ;
  122.                 size.g = ( size.g * 100 ) >> COLOR_SHIFT ;
  123.                 size.b = ( size.b * 100 ) >> COLOR_SHIFT ;
  124. #endif
  125.                 w = getdouble();
  126.                 h = (int)(w * (double)( 1 << COLOR_SHIFT ));
  127.                 break ;
  128.             case WORD_TRA :
  129. #if 0
  130.                 getcolor( &coldmy );
  131.                 tra = coldmy.r ;
  132. #endif
  133.                 if ( getcolor( &tra ) )
  134.                     type |= ATR_RGB ;
  135.                 break ;
  136.                 break ;
  137.             case WORD_REF :
  138. #if 0
  139.                 getcolor( &coldmy );
  140. /*                atrerror( NOT_IMPLIMENTED, "ref" );  REND supports `ref' */
  141. #endif
  142.                 if ( getcolor( &ref ) )
  143.                     type |= ATR_RGB ;
  144.                 break ;
  145.                 break ;
  146.             case WORD_RFR :
  147. #if 0
  148.                 getcolor( &coldmy );
  149. /*                atrerror( NOT_IMPLIMENTED, "rfr" );*/
  150. #endif
  151.                 if ( getcolor( &rfr ) )
  152.                     type |= ATR_RGB ;
  153.                 break ;
  154.             case WORD_ATT :
  155.                 if ( getcolor( &att ) )
  156.                     type |= ATR_RGB ;
  157. #if 0
  158.                 atrerror( NOT_IMPLIMENTED, "att" );
  159. #endif
  160.                 break ;
  161.             case WORD_MAPWIND :
  162.                 getmapdata( mapwind );
  163.                 break ;
  164.             case WORD_MAPVIEW :
  165.                 getmapdata( mapview );
  166.                 break ;
  167.             case WORD_MAPSIZE :
  168.                 getmapdata( mapsize );
  169.                 break ;
  170.             case WORD_COLORMAP :
  171.                 maptype = MAP_COLOR ;
  172.                 getname( colorfile );
  173.                 break ;
  174.             case WORD_BUMPMAP :
  175.                 atrerror( NOT_IMPLIMENTED, "bumpmap" );
  176.                 break ;
  177.             default :
  178.                 atrerror( BAD_EXIST, nextword );
  179.         }
  180.         isclose1() ;
  181.         if (lasterror) return FALSE;
  182.     }
  183.     get() ;
  184.     return TRUE ;
  185. }
  186.  
  187. /*    アトリビュート名の読み込み    */
  188. void    AtrReadName( namebuf )
  189. char    *namebuf ;
  190. {
  191.     strcpy( namebuf, name );
  192. }
  193.  
  194. /*    アトリビュートデータの読み込み    */
  195. int        AtrReadColor( colp, ambp, difp, spcp, sizep, hp )
  196. Color    *colp ;
  197. Color    *ambp ;
  198. Color    *difp ;
  199. Color    *spcp, *sizep ;
  200. int        *hp ;
  201. {
  202.     *colp = col ;
  203.     *ambp = amb ;
  204.     *difp = dif ;
  205.     *spcp = spc ;
  206.     *sizep = size ;
  207.     *hp = h ;
  208.     return type ;
  209. }
  210.  
  211. /*    アトリビュートデータの読み込み    */
  212. int        AtrReadColorAll( Color para[9], int *hp )
  213. {
  214.     para[0] = col;
  215.     para[1] = amb;
  216.     para[2] = dif;
  217.     para[3] = spc;
  218.     para[4] = size;
  219.     para[5] = ref;
  220.     para[6] = tra;
  221.     para[7] = rfr;
  222.     para[8] = att;
  223.     *hp = h ;
  224.     return type ;
  225. }
  226.  
  227. /*    透過度の読み込み    */
  228. int        AtrReadTra()
  229. {
  230.     return tra.r ;
  231. }
  232.  
  233. /*    マッピング情報の読み込み    */
  234. int        AtrReadColorMap( file, sizebuf, windbuf, viewbuf )
  235. char    *file;
  236. int        sizebuf[2][2] ;
  237. int        windbuf[2][2] ;
  238. int        viewbuf[2][2] ;
  239. {
  240.     int        i, j ;
  241.  
  242.     if ( maptype == MAP_COLOR )
  243.     {
  244.         strcpy( file, colorfile );
  245.         for( i = 0 ; i < 2 ; i++ )
  246.         {
  247.             for( j = 0 ; j < 2 ; j++ )
  248.             {
  249.                 sizebuf[i][j] = mapsize[i][j] ;
  250.                 windbuf[i][j] = mapwind[i][j] ;
  251.                 viewbuf[i][j] = mapview[i][j] ;
  252.             }
  253.         }
  254.     }
  255.     return maptype ;
  256. }
  257.  
  258. static    void    getmapdata( p )
  259. int        p[2][2] ;
  260. {
  261.     int        i, j ;
  262.  
  263.     for( i = 0 ; i < 2 ; ++i )
  264.     {
  265.         for( j = 0 ; j < 2 ; ++j )
  266.         {
  267.             p[i][j] = (int)( getdouble() * 65536.0 );
  268.         }
  269.     }
  270. }
  271.  
  272. static    void    atrerror( n, arg )
  273. int n ;
  274. char    *arg ;
  275. {
  276.     char    *msg ;
  277.     int level ;
  278.  
  279.     switch( n )
  280.     {
  281.         case NOT_IMPLIMENTED:
  282.             msg = "%s 処理はサポートしていません。" ;
  283.             level = 1 ;
  284.             break ;
  285.         case NOT_FOUND :
  286.             msg = " %s がありません。" ;
  287.             level = 10 ;
  288.             break ;
  289.         case BAD_EXIST :
  290.             msg = " %s が存在します。" ;
  291.             level = 10 ;
  292.             break ;
  293.         case WRONG_MAP_DATA :
  294.             msg = "マッピングデータがおかしい。" ;
  295.             level = 10 ;
  296.             break ;
  297.         case UNEXPECTED_EOF :
  298.             msg = "エンドオブファイルになりました" ;
  299.             level = 20 ;
  300.             break ;
  301.         case NOT_ATR_FILE :
  302.             msg = "アトリビュートファイルではありません。" ;
  303.             level = 20 ;
  304.             break ;
  305.         default :
  306.             msg = "エラーコードの誤り。( atrread.c )" ;
  307.             level = 20 ;
  308.             break ;
  309.     }
  310.  
  311.     errormessage( level, msg, arg );
  312.  
  313. }
  314.  
  315.