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 >
Wrap
C/C++ Source or Header
|
1996-03-12
|
6KB
|
315 lines
/*
* アトリビュートファイル入力関数
*
* Copyright T.Kobayashi 1993.1.17
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "lib.h"
#include "_reader.h"
#include "word.h"
#include "inlib.h"
#define NOT_IMPLIMENTED 1
#define NOT_FOUND 11
#define BAD_EXIST 12
#define WRONG_MAP_DATA 13
#define UNEXPECTED_EOF 21
#define NOT_ATR_FILE 22
static void getmapdata( int[2][2] );
static void atrerror( int, char* );
static char name[MAXWORD] ;
static int type ;
static Color col ;
static Color amb, dif, spc, size ;
static Color ref, tra, rfr, att;
static int h ;
#if 0
static int tra ;
#endif
static int maptype ;
static char colorfile[F_NAME_LEN] ;
static int mapsize[2][2], mapview[2][2], mapwind[2][2] ;
extern int lasterror;
/* アトリビュートファイルのオープン */
int AtrReadOpen( filename )
const char *filename ;
{
lasterror = 0;
if ( fileopen( filename ) == 0 )
return FALSE ;
if ( wordid != WORD_ATR )
{
atrerror( NOT_ATR_FILE, "" );
fileclose();
return FALSE ;
}
return TRUE ;
}
/* アトリビュートファイルのクローズ */
int AtrReadClose()
{
fileclose();
return TRUE ;
}
/* アトリビュートの読み込み */
int AtrReadNext()
{
int id ;
double w ;
Color coldmy ;
if ( end_of_file )
return FALSE ;
if ( wordid != WORD_ATR )
{
atrerror( NOT_FOUND, "atr" );
get() ;
}
get() ;
getname( name );
if ( wordid != WORD_OPEN2 )
atrerror( NOT_FOUND, "{" );
get();
col.r = col.g = col.b = 0 ;
amb = dif = spc = size = ref = tra = rfr = att = col;
h = 0 ;
amb.r = amb.g = amb.b = COLOR_UNIT/2;
dif = amb;
#if 0
tra = COLOR_UNIT ;
#endif
type = ATR_SIMPLE ;
maptype = MAP_NO ;
while( wordid != WORD_CLOSE2 )
{
id = wordid ;
isopen1() ;
switch( id )
{
case WORD_COL :
getcolor( &col );
break ;
case WORD_AMB :
if ( getcolor( &amb ) )
type |= ATR_RGB ;
break ;
case WORD_DIF :
if ( getcolor( &dif ) )
type |= ATR_RGB ;
break ;
case WORD_SPC :
if ( getcolor( &spc ) && getcolor( &size ) )
type |= ATR_RGB ;
#if 0
size.r = ( size.r * 100 ) >> COLOR_SHIFT ;
size.g = ( size.g * 100 ) >> COLOR_SHIFT ;
size.b = ( size.b * 100 ) >> COLOR_SHIFT ;
#endif
w = getdouble();
h = (int)(w * (double)( 1 << COLOR_SHIFT ));
break ;
case WORD_TRA :
#if 0
getcolor( &coldmy );
tra = coldmy.r ;
#endif
if ( getcolor( &tra ) )
type |= ATR_RGB ;
break ;
break ;
case WORD_REF :
#if 0
getcolor( &coldmy );
/* atrerror( NOT_IMPLIMENTED, "ref" ); REND supports `ref' */
#endif
if ( getcolor( &ref ) )
type |= ATR_RGB ;
break ;
break ;
case WORD_RFR :
#if 0
getcolor( &coldmy );
/* atrerror( NOT_IMPLIMENTED, "rfr" );*/
#endif
if ( getcolor( &rfr ) )
type |= ATR_RGB ;
break ;
case WORD_ATT :
if ( getcolor( &att ) )
type |= ATR_RGB ;
#if 0
atrerror( NOT_IMPLIMENTED, "att" );
#endif
break ;
case WORD_MAPWIND :
getmapdata( mapwind );
break ;
case WORD_MAPVIEW :
getmapdata( mapview );
break ;
case WORD_MAPSIZE :
getmapdata( mapsize );
break ;
case WORD_COLORMAP :
maptype = MAP_COLOR ;
getname( colorfile );
break ;
case WORD_BUMPMAP :
atrerror( NOT_IMPLIMENTED, "bumpmap" );
break ;
default :
atrerror( BAD_EXIST, nextword );
}
isclose1() ;
if (lasterror) return FALSE;
}
get() ;
return TRUE ;
}
/* アトリビュート名の読み込み */
void AtrReadName( namebuf )
char *namebuf ;
{
strcpy( namebuf, name );
}
/* アトリビュートデータの読み込み */
int AtrReadColor( colp, ambp, difp, spcp, sizep, hp )
Color *colp ;
Color *ambp ;
Color *difp ;
Color *spcp, *sizep ;
int *hp ;
{
*colp = col ;
*ambp = amb ;
*difp = dif ;
*spcp = spc ;
*sizep = size ;
*hp = h ;
return type ;
}
/* アトリビュートデータの読み込み */
int AtrReadColorAll( Color para[9], int *hp )
{
para[0] = col;
para[1] = amb;
para[2] = dif;
para[3] = spc;
para[4] = size;
para[5] = ref;
para[6] = tra;
para[7] = rfr;
para[8] = att;
*hp = h ;
return type ;
}
/* 透過度の読み込み */
int AtrReadTra()
{
return tra.r ;
}
/* マッピング情報の読み込み */
int AtrReadColorMap( file, sizebuf, windbuf, viewbuf )
char *file;
int sizebuf[2][2] ;
int windbuf[2][2] ;
int viewbuf[2][2] ;
{
int i, j ;
if ( maptype == MAP_COLOR )
{
strcpy( file, colorfile );
for( i = 0 ; i < 2 ; i++ )
{
for( j = 0 ; j < 2 ; j++ )
{
sizebuf[i][j] = mapsize[i][j] ;
windbuf[i][j] = mapwind[i][j] ;
viewbuf[i][j] = mapview[i][j] ;
}
}
}
return maptype ;
}
static void getmapdata( p )
int p[2][2] ;
{
int i, j ;
for( i = 0 ; i < 2 ; ++i )
{
for( j = 0 ; j < 2 ; ++j )
{
p[i][j] = (int)( getdouble() * 65536.0 );
}
}
}
static void atrerror( n, arg )
int n ;
char *arg ;
{
char *msg ;
int level ;
switch( n )
{
case NOT_IMPLIMENTED:
msg = "%s 処理はサポートしていません。" ;
level = 1 ;
break ;
case NOT_FOUND :
msg = " %s がありません。" ;
level = 10 ;
break ;
case BAD_EXIST :
msg = " %s が存在します。" ;
level = 10 ;
break ;
case WRONG_MAP_DATA :
msg = "マッピングデータがおかしい。" ;
level = 10 ;
break ;
case UNEXPECTED_EOF :
msg = "エンドオブファイルになりました" ;
level = 20 ;
break ;
case NOT_ATR_FILE :
msg = "アトリビュートファイルではありません。" ;
level = 20 ;
break ;
default :
msg = "エラーコードの誤り。( atrread.c )" ;
level = 20 ;
break ;
}
errormessage( level, msg, arg );
}