home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1997 March
/
VPR9703A.ISO
/
VPR_DATA
/
DOGA
/
SOURCES
/
REND.LZH
/
REND
/
MAP.C
< prev
next >
Wrap
C/C++ Source or Header
|
1996-07-24
|
16KB
|
733 lines
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include "reader.h"
#include "word.h"
#include "glib.h"
#include "rend.h"
#ifndef NO_PICLIB
#include "piclib.h"
#endif
static Map *maptable ;
static int mapnum ;
#ifndef NO_PICLIB
static Pixel pix[4096];
#endif
/*
proto map.c -s > temp
*/
#ifdef REFMAP
static void refmapset(Map *, char *);
#endif
static void mapset( Map*, Pointer(Atr*) );
static void maperror( char*, char* );
extern FILE *logfp;
/* 初期化 */
int MapInit( patr )
Pointer(Atr*) patr ;
{
Atr *atr ;
Map *mp ;
Pointer(Atr*) p ;
int lockatr ;
mapnum = 0 ;
for( atr = pointer( patr ) ; atr != NULL ; atr = pointer( atr->next ) )
{
if ( atr->maptype == COLOR_MAP )
mapnum ++ ;
}
#ifdef REFMAP
mapnum += RefMap;
#endif
#ifdef BGMAKE
if (BgMake) mapnum += 12;
#endif
if ( mapnum == 0 )
return( 0 );
maptable = tempalloc( mapnum * sizeof( Map ) );
mp = maptable ;
fprintf(stderr, "Reading Map File\n");
#ifdef WINDOWS
if (logfp)
fprintf(logfp, "Reading Map File\n");
#endif
for( p = patr ; p != NULL ; p = atr->next )
{
atr = pointer( p );
lockatr = datalock();
if ( atr->maptype == COLOR_MAP )
{
Pointer(Atr*) q;
Atr *checkatr;
int flag = FALSE;
fprintf(stderr, "%s(%s)\n", atr->filename, atr->name);
#ifdef WINDOWS
if (logfp)
fprintf(logfp, "%s(%s)\n", atr->filename, atr->name);
#endif
for (q = patr; q != p && q != NULL; q = checkatr->next) {
checkatr = pointer(q);
if (checkatr->maptype == COLOR_MAP
&& strcmp(checkatr->filename, atr->filename) == 0
&& checkatr->mapwind[0][0] == atr->mapwind[0][0]
&& checkatr->mapwind[0][1] == atr->mapwind[0][1]
&& checkatr->mapwind[1][0] == atr->mapwind[1][0]
&& checkatr->mapwind[1][1] == atr->mapwind[1][1]) {
Map *checkmp;
for (checkmp=maptable; checkmp != mp; ++checkmp) {
if (checkmp->atr == q) {
mp->h = checkmp->h;
mp->v = checkmp->v;
mp->buf = checkmp->buf;
mp->fullcolor = checkmp->fullcolor;
mp->atr = p;
mp++;
break;
}
}
assert(checkmp != mp);
flag = TRUE;
break;
}
}
if (!flag) {
mapset( mp++, p );
}
}
dataunlock( lockatr );
}
#ifdef REFMAP
if (RefMap) {
int i, j;
int found = FALSE;
for (i = 0; i < RefMap; ++i) {
Pointer(Atr*) q;
Atr *checkatr;
j = strlen(RefMapFile[i]);
#ifdef NO_PICLIB
if (j < 4 || strcmpi(RefMapFile[i] + j-4, ".PIC") != 0) {
strcat(RefMapFile[i], ".PIC");
}
#else
if (j < 4 || RefMapFile[i][j-4] != '.') {
strcat(RefMapFile[i], ".PIC");
}
#endif
fprintf(stderr, "%s(環境マッピング)\n", RefMapFile[i]);
#ifdef WINDOWS
if (logfp)
fprintf(logfp, "%s(環境マッピング)\n", RefMapFile[i]);
#endif
for (q = patr; q != p && q != NULL; q = checkatr->next) {
checkatr = pointer(q);
if (checkatr->maptype == COLOR_MAP
&& strcmp(checkatr->filename, RefMapFile[i]) == 0) {
Map *checkmp;
for (checkmp=maptable; checkmp != mp; ++checkmp) {
if (checkmp->atr == q) {
break;
}
}
if (checkmp != mp
&& checkmp->wh == checkmp->h
&& checkmp->wv == checkmp->v) {
RefMapData[i] = checkmp;
found = TRUE;
break;
}
}
}
if (found == FALSE) {
for (j = 0; j < i; ++j) {
if (strcmp(RefMapFile[j], RefMapFile[i]) == 0) {
RefMapData[i] = RefMapData[j];
found = TRUE;
break;
}
}
}
if (found == FALSE) {
refmapset( RefMapData[i] = mp++, RefMapFile[i] );
}
}
}
#endif
#ifdef BGMAKE
if (BgMake) {
int i, j;
int found = FALSE;
BgMakeAtr[0] = dataalloc(sizeof(Atr) * BgMake);
memset(BgMakeAtr[0], 0, sizeof(Atr));
BgMakeAtr[0]->amb[0] = BgMakeAtr[0]->amb[1] = BgMakeAtr[0]->amb[2] = COLOR_POINT;
BgMakeAtr[0]->col[0] = BgMakeAtr[0]->col[1] = BgMakeAtr[0]->col[2] = COLOR_POINT;
BgMakeAtr[0]->rgbflag = TRUE;
BgMakeAtr[0]->maptype = COLOR_MAP;
BgMakeAtr[0]->mapsize[0][0] = BgMakeAtr[0]->mapsize[0][1] = 0.0;
BgMakeAtr[0]->mapsize[1][0] = BgMakeAtr[0]->mapsize[1][1] = 1.0;
BgMakeAtr[0]->mapwind[0][0] = BgMakeAtr[0]->mapwind[0][1] = 0.0;
for (i = 1; i < BgMake; ++i) {
BgMakeAtr[i] = BgMakeAtr[i-1] + 1;
memcpy(BgMakeAtr[i], BgMakeAtr[i-1], sizeof(Atr));
}
for (i = 0; i < BgMake; ++i) {
Pointer(Atr*) q;
Atr *checkatr;
found = FALSE;
j = strlen(BgMakeFile[i]);
if (j < 4 || BgMakeFile[i][j-4] != '.') {
strcat(BgMakeFile[i], ".PIC");
}
fprintf(stderr, "%s(背景球)\n", BgMakeFile[i]);
#ifdef WINDOWS
if (logfp)
fprintf(logfp, "%s(背景球)\n", BgMakeFile[i]);
#endif
for (q = patr; q != p && q != NULL; q = checkatr->next) {
checkatr = pointer(q);
if (checkatr->maptype == COLOR_MAP
&& strcmp(checkatr->filename, BgMakeFile[i]) == 0) {
Map *checkmp;
for (checkmp=maptable; checkmp != mp; ++checkmp) {
if (checkmp->atr == q) {
break;
}
}
if (checkmp != mp
&& checkmp->wh == checkmp->h
&& checkmp->wv == checkmp->v) {
mp->h = checkmp->h;
mp->v = checkmp->v;
mp->buf = checkmp->buf;
mp->fullcolor = checkmp->fullcolor;
BgMakeData[i] = mp++;
found = TRUE;
break;
}
}
}
if (found == FALSE) {
for (j = 0; j < RefMap; ++j) {
if (strcmp(BgMakeFile[i], RefMapFile[j]) == 0) {
mp->h = RefMapData[j]->h;
mp->v = RefMapData[j]->v;
mp->buf = RefMapData[j]->buf;
mp->fullcolor = RefMapData[j]->fullcolor;
BgMakeData[i] = mp++;
found = TRUE;
break;
}
}
}
if (found == FALSE) {
for (j = 0; j < i; ++j) {
if (strcmp(BgMakeFile[j], BgMakeFile[i]) == 0) {
mp->h = BgMakeData[j]->h;
mp->v = BgMakeData[j]->v;
mp->buf = BgMakeData[j]->buf;
mp->fullcolor = BgMakeData[j]->fullcolor;
BgMakeData[i] = mp++;
found = TRUE;
break;
}
}
}
if (found == FALSE) {
refmapset( BgMakeData[i] = mp++, BgMakeFile[i] );
}
BgMakeAtr[i]->mapwind[1][0] = BgMakeData[i]->h-1;
BgMakeAtr[i]->mapwind[1][1] = BgMakeData[i]->v-1;
BgMakeData[i]->atr = BgMakeAtr[i];
}
}
#endif
return( mapnum );
}
#ifndef NO_PICLIB
static inline unsigned short Convert_24_16(Pixel p)
{
return ((p & 0xf8000000) >> 16)
| ((p & 0x00f80000) >> 13)
| ((p & 0x0000f800) >> 10)
| ((p & 0x00000080) ? 1 : 0);
}
#endif
#ifdef REFMAP
static void refmapset(mp, file)
Map *mp;
char *file;
{
#ifdef NO_PICLIB
int i ;
int x, y ;
int code, len ;
ColorCode *buf ;
FILE *fp ;
unsigned short codes;
int mode;
int mapfullcolorflag;
/* 画像ファイル読み込み */
errlevel = 0 ;
mp->atr = NULL;
fileopen( file );
if ( wordid != WORD_IMAGE )
maperror( "%s は画像ファイルではありません。", file );
get();
while( ! end_of_file )
{
switch( wordid )
{
case WORD_COL :
get();
mode = getint();
if (mode == 16) {
mapfullcolorflag = FALSE;
} else {
mapfullcolorflag = TRUE;
}
break;
case WORD_PXN :
get();
mp->h = getint();
mp->v = getint();
break ;
case WORD_MOD :
get();
if ( wordid != WORD_RLN )
{
maperror( "画像ファイル %s は読み込めません。",file );
}
break ;
}
get();
}
fileclose();
/* バッファの確保 */
mp->buf = (Pointer(ColorCode*)*)tempalloc( mp->v * sizeof( Pointer(ColorCode*) ) );
mp->fullcolor = mapfullcolorflag;
if (mapfullcolorflag) {
for( i = 0 ; i < mp->v ; ++i )
mp->buf[i] = dataalloc( mp->h * sizeof( ColorCode ) );
} else {
for( i = 0 ; i < mp->v ; ++i )
mp->buf[i] = dataalloc( mp->h * sizeof( unsigned short ) );
}
/* データの読み込み */
fp = fopen( file, "rb" );
while( fgetc(fp) != 0x1A ) ;
for( i = 0 ; i < 4 ; ++i )
fgetc( fp );
if (mapfullcolorflag) {
unsigned long c;
c = getlong(fp);
code = (c & 0xffffff00L) | ((c & 0x00000080L) ? 1 : 0);
len = c & 0x7f;
} else {
codes = getshort(fp);
len = getshort( fp );
}
if (mapfullcolorflag) {
for( y = 0 ; y < mp->v ; ++y )
{
(*interrupt)();
buf = pointer( mp->buf[y] );
for( x = 0 ; x < mp->h ; ++x )
{
buf[ x ] = code ;
len -- ;
if ( len == 0 )
{
unsigned long c;
c = getlong(fp);
code = (c & 0xffffff00L) | ((c & 0x00000080L) ? 1 : 0);
len = c & 0x7f;
}
}
}
} else {
for( y = 0 ; y < mp->v ; ++y )
{
unsigned short *bufs;
(*interrupt)();
bufs = (unsigned short *)pointer( mp->buf[ y ] );
for( x = 0 ; x < mp->h ; ++x )
{
bufs[ x ] = codes ;
len -- ;
if ( len == 0 )
{
codes = getshort(fp);
len = getshort( fp );
}
}
}
}
fclose( fp );
#else
int i ;
int x, y ;
ColorCode *buf ;
int mode;
PicData *pd;
Pixel *p;
/* 画像ファイル読み込み */
errlevel = 0 ;
mp->atr = NULL;
pd = PicReadOpen(file);
if (pd == NULL) {
maperror( "%s の読み込みに失敗しました。", file );
}
mp->h = pd->pixelX;
mp->v = pd->pixelY;
mp->buf = (Pointer(ColorCode*)*)tempalloc( mp->v * sizeof( Pointer(ColorCode*) ) );
mp->fullcolor = pd->fullcolor;
if (mp->fullcolor) {
for( i = 0 ; i < mp->v ; ++i )
mp->buf[i] = dataalloc( mp->h * sizeof( ColorCode ) );
} else {
for( i = 0 ; i < mp->v ; ++i )
mp->buf[i] = dataalloc( mp->h * sizeof( unsigned short ) );
}
/* データの読み込み */
for( y = 0 ; y < mp->v ; ++y )
{
unsigned short *bufs;
(*interrupt)();
if (PicInputLine(pd, pix) == FALSE) {
maperror( "読み込みに失敗しました。", "");
}
if (mp->fullcolor) {
buf = pointer( mp->buf[y] );
for( x = 0 ; x < mp->h ; ++x )
{
buf[ x ] = (pix[x] & 0xffffff00) | ((pix[x] & 0x00000080L) ? 1 : 0);
}
} else {
bufs = (unsigned short *)pointer( mp->buf[ y ] );
for( x = 0 ; x < mp->h ; ++x )
{
bufs[ x ] = Convert_24_16(pix[x]);
}
}
}
PicClose(pd);
#endif
}
#endif
static void mapset( mp, patr )
Map *mp ;
Pointer(Atr*) patr ;
{
int i ;
int h, v, x, y ;
#ifdef NO_PICLIB
int len ;
unsigned long code;
#else
PicData *pd;
#endif
int wx1, wy1, wx2, wy2 ;
ColorCode *buf ;
Atr *atr ;
FILE *fp ;
unsigned short codes;
int mode;
int mapfullcolorflag;
atr = pointer( patr );
wx1 = (int)atr->mapwind[0][0] ;
wy1 = (int)atr->mapwind[0][1] ;
wx2 = (int)atr->mapwind[1][0] ;
wy2 = (int)atr->mapwind[1][1] ;
if ( wx1 < 0 || wy1 < 0 )
maperror( "ウインドウの指定が不正です。", NULL );
mp->h = wx2 - wx1 + 1 ;
mp->v = wy2 - wy1 + 1 ;
mp->atr = patr ;
(*interrupt)();
/* 画像ファイル読み込み */
errlevel = 0 ;
#ifdef NO_PICLIB
fileopen( atr->filename );
if ( wordid != WORD_IMAGE )
maperror( "%s は画像ファイルではありません。", atr->filename );
get();
while( ! end_of_file )
{
switch( wordid )
{
case WORD_COL :
get();
mode = getint();
if (mode == 16) {
mapfullcolorflag = FALSE;
} else {
mapfullcolorflag = TRUE;
}
break;
case WORD_PXN :
get();
h = getint();
v = getint();
#ifdef REFMAP
mp->wh = h;
mp->wv = v;
#endif
if ( h < wx2 || v < wy2 )
maperror( "ウインドウの指定が不正です。", NULL );
break ;
case WORD_MOD :
get();
if ( wordid != WORD_RLN )
{
maperror( "画像ファイル %s は読み込めません。",
atr->filename );
}
break ;
}
get();
}
fileclose();
/* バッファの確保 */
mp->buf = (Pointer(ColorCode*)*)tempalloc( mp->v * sizeof( Pointer(ColorCode*) ) );
mp->fullcolor = mapfullcolorflag;
if (mapfullcolorflag) {
for( i = 0 ; i < mp->v ; ++i )
mp->buf[i] = dataalloc( mp->h * sizeof( ColorCode ) );
} else {
for( i = 0 ; i < mp->v ; ++i )
mp->buf[i] = dataalloc( mp->h * sizeof( unsigned short ) );
}
/* データの読み込み */
fp = fopen( atr->filename, "rb" );
while( fgetc(fp) != 0x1A ) ;
for( i = 0 ; i < 4 ; ++i )
fgetc( fp );
if (mapfullcolorflag) {
unsigned long c;
c = getlong(fp);
code = (c & 0xffffff00L) | ((c & 0x00000080L) ? 1 : 0);
len = (int)(c & 0x7fL);
} else {
/* code = X68kcolorToColorCode(getshort( fp ));*/
codes = getshort(fp);
len = getshort( fp );
}
if (mapfullcolorflag) {
for( y = 0 ; y <= wy2 ; ++y )
{
(*interrupt)();
if ( wy1 <= y && y <= wy2 )
{
buf = pointer( mp->buf[ y - wy1 ] );
}
for( x = 0 ; x < h ; ++x )
{
if ( wx1 <= x && x <= wx2 && wy1 <= y && y <= wy2 )
{
buf[ x - wx1 ] = code ;
}
len -- ;
if ( len == 0 )
{
unsigned long c;
c = getlong(fp);
code = (c & 0xffffff00L) | ((c & 0x00000080L) ? 1 : 0);
len = (int)(c & 0x7fL);
}
}
}
} else {
for( y = 0 ; y <= wy2 ; ++y )
{
unsigned short *bufs;
(*interrupt)();
if ( wy1 <= y && y <= wy2 )
{
bufs = (unsigned short *)pointer( mp->buf[ y - wy1 ] );
}
for( x = 0 ; x < h ; ++x )
{
if ( wx1 <= x && x <= wx2 && wy1 <= y && y <= wy2 )
{
bufs[ x - wx1 ] = codes ;
}
len -- ;
if ( len == 0 )
{
codes = getshort(fp);
len = getshort( fp );
}
}
}
}
fclose( fp );
#else
pd = PicReadOpen(atr->filename);
if ( pd == NULL) {
maperror( "%s の読み込みに失敗しました。", atr->filename );
}
h = pd->pixelX;
v = pd->pixelY;
#ifdef REFMAP
mp->wh = h;
mp->wv = v;
#endif
if ( h < wx2 || v < wy2 )
maperror( "ウインドウの指定が不正です。", NULL );
mp->buf = (Pointer(ColorCode*)*)tempalloc( mp->v * sizeof( Pointer(ColorCode*) ) );
mp->fullcolor = pd->fullcolor;
if (mp->fullcolor) {
for( i = 0 ; i < mp->v ; ++i )
mp->buf[i] = dataalloc( mp->h * sizeof( ColorCode ) );
} else {
for( i = 0 ; i < mp->v ; ++i )
mp->buf[i] = dataalloc( mp->h * sizeof( unsigned short ) );
}
for( y = 0 ; y < wy1 ; ++y )
{
(*interrupt)();
PicInputLine(pd, pix);
}
for (y = wy1; y <= wy2; y++) {
int i = 0;
(*interrupt)();
PicInputLine(pd, pix);
if (mp->fullcolor) {
buf = pointer( mp->buf[ y - wy1 ] );
for( x = wx1 ; x <= wx2 ; ++x )
{
buf[i++] = (pix[x] & 0xffffff00) | ((pix[x] & 0x00000080L) ? 1 : 0);
}
} else {
unsigned short *bufs;
bufs = (unsigned short *)pointer( mp->buf[ y - wy1 ] );
for( x = wx1 ; x <= wx2 ; ++x )
{
bufs[i++] = Convert_24_16(pix[x]);
}
}
}
PicClose(pd);
#endif
}
void SetMapTable( atrtable, puv, n, patr )
AtrTable *atrtable ;
Pointer(Point*) puv ;
int n ;
Pointer(Atr*) patr ;
{
int i, m ;
Map *mp ;
Atr *atr ;
Point *uv ;
Float tu, tv, su, sv, wu, wv ;
/* 検索 */
mp = maptable ;
for( m = 0 ; m < mapnum ; ++m )
{
if ( mp->atr == patr )
break ;
mp++ ;
}
assert( m < mapnum );
/* 座標変換 */
atr = pointer( patr );
assert( atr->maptype == COLOR_MAP );
su = atr->mapsize[0][0] ;
sv = atr->mapsize[0][1] ;
wu = atr->mapwind[0][0] ;
wv = atr->mapwind[0][1] ;
tu = ( atr->mapwind[1][0] - wu ) / ( atr->mapsize[1][0] - su );
tv = ( atr->mapwind[1][1] - wv ) / ( atr->mapsize[1][1] - sv );
uv = (Point*)pointer( puv );
for( i = 0 ; i < n ; ++i )
{
atrtable[i].map.curuv[0] = (long)( ( uv[i][0] - su ) * tu * 65536.0 ) ;
atrtable[i].map.curuv[1] = (long)( ( uv[i][1] - sv ) * tv * 65536.0 ) ;
atrtable[i].map.map = mp ;
}
}
#ifdef NO_PICLIB
unsigned short getshort( fp )
FILE *fp ;
{
int n ;
n = fgetc( fp ) << 8 ;
n += fgetc( fp ) ;
return( n );
}
unsigned long getlong(FILE *fp)
{
long n;
n = fgetc( fp ) << 24 ;
n += fgetc( fp ) << 16 ;
n += fgetc( fp ) << 8 ;
n += fgetc( fp );
return n;
}
#endif
static void maperror( msg, arg )
char *msg ;
char *arg ;
{
char buf[100] ;
#ifdef MESSAGE
extern int printwarning(const char *format, ...);
printwarning( msg, arg );
#endif
sprintf( buf, msg, arg );
fprintf( stderr, "%s\n", buf );
fprintf( stderr, "エラーが発生しました。\n\n" );
exit( 1 );
}