home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1997 March
/
VPR9703A.ISO
/
VPR_DATA
/
DOGA
/
SOURCES
/
REND.LZH
/
REND
/
PICOUT.C
< prev
next >
Wrap
C/C++ Source or Header
|
1996-07-21
|
24KB
|
998 lines
#include <stdio.h>
#include <stdlib.h>
#ifndef DJ
#ifndef UNIX
#include <conio.h>
#endif
#endif
#include <string.h>
#include "reader.h"
#include "glib.h"
#include "rend.h"
#ifndef NO_PICLIB
#include "piclib.h"
#endif
#define CTRL_Z 0x1A
static int picline ; /* 画面のライン */
#ifdef NO_PICLIB
static FILE *fp = NULL ; /* ファイルポインタ */
static long ftp ; /* 画像データ領域のトップ */
static long size ; /* 画像データのサイズ */
static ColorCode code ; /* カラーコード */
static unsigned short len ; /* レングス */
#else
static PicData *pd = NULL;
static Pixel *pix = NULL;
#endif
static unsigned short *errorbuf; /* 誤差バッファ */
static unsigned short *errorbufnext;
static ColorCode *antibuf[10] ; /* アンチエリアシング用のバッファ */
/*
proto -s picout.c > temp
*/
static void picerror( char* );
static void putshort( int );
static void putlong( long );
FILE *picinit( picfile )
char *picfile ;
{
int i ;
picline = 0 ;
#ifdef NO_PICLIB
len = 0 ;
size = 0 ;
#endif
/* アンチエリアシングバッファの確保 */
if ( antibuf[0] == NULL )
{
for( i = 0 ; i < antiareas ; ++i )
antibuf[i] =(ColorCode*)tempalloc( sizeof( ColorCode ) * XPixel );
}
if (fullcolorditherflag == ERRORDIFUSION || fullcolorditherflag == ERRORDIFUSION2) {
if (errorbuf == NULL) {
errorbuf = (unsigned short*)tempalloc(sizeof(short)*(XPixel/antiareas+2))+1;
errorbufnext = (unsigned short*)tempalloc(sizeof(short)*(XPixel/antiareas+2))+1;
}
for (i = 0; i < XPixel/antiareas; ++i) {
errorbuf[i] = errorbufnext[i] = 0;
}
}
if ( nflag == 1 )
return NULL;
#ifdef NO_PICLIB
if ( fp != NULL )
picerror( "画像ファイルをクローズしていません。" );
fp = fopen( picfile, "wb" );
if ( fp == NULL )
{
picerrorflag = TRUE ;
picerror( "画像ファイルがオープンできません。" );
return( NULL );
}
fprintf( stderr, "Writing Picture File : %s\n", picfile );
fprintf( fp, "image\x0d\x0a" ) ;
fprintf( fp, "mod rln\x0d\x0a" );
#ifndef HIVISION
fprintf( fp, "pxn %d %d\x0d\x0a", XPixel/antiareas, YPixel/antiareas );
#else
{
int x, y;
switch (PixelMode) {
case P256x256: x = 256; y = 256; break;
case P320x200: x = 320; y = 200; break;
case P512x512: x = 512; y = 512; break;
case P640x400: x = 640; y = 400; break;
case P640x480: x = 640; y = 480; break;
case P1024x1024: x = 1024; y = 1024; break;
case P1920x1125: x = 1920; y = 1125; break;
case P2048x2048: x = 2048; y = 2048; break;
case P4096x4096: x = 4096; y = 4096; break;
default: x = 256; y = 256; break;
}
fprintf( fp, "pxn %d %d\x0d\x0a", x, y);
}
#endif
#ifdef HIVISION
switch (PixelMode) {
case P256x256:
case P512x512:
case P1024x1024:
case P2048x2048:
case P4096x4096:
fprintf( fp, "pxs 4 3\x0d\x0a" );
break;
case P640x400:
case P640x480:
case P1920x1125:
fprintf( fp, "pxs 1 1\x0d\x0a" );
break;
default:
;
}
#else
fprintf( fp, "pxs 4 3\x0d\x0a" );
#endif
fprintf( fp, "pnt 0 0\x0d\x0a" );
fprintf( fp, "frm 1\x0d\x0a" );
if (fullcoloroutflag) {
fprintf( fp, "cst {\x0d\x0a" );
fprintf( fp, " grn 8\x0d\x0a" );
fprintf( fp, " red 8\x0d\x0a" );
fprintf( fp, " blu 8\x0d\x0a" );
fprintf( fp, " trp 1\x0d\x0a" );
fprintf( fp, " }\x0d\x0a" );
fprintf( fp, "dst {\x0d\x0a" );
fprintf( fp, " col 25\x0d\x0a" );
fprintf( fp, " len 7\x0d\x0a" );
fprintf( fp, " }\x0d\x0a" );
} else {
fprintf( fp, "cst {\x0d\x0a" );
fprintf( fp, " grn 5\x0d\x0a" );
fprintf( fp, " red 5\x0d\x0a" );
fprintf( fp, " blu 5\x0d\x0a" );
fprintf( fp, " trp 1\x0d\x0a" );
fprintf( fp, " }\x0d\x0a" );
fprintf( fp, "dst {\x0d\x0a" );
fprintf( fp, " col 16\x0d\x0a" );
fprintf( fp, " len 16\x0d\x0a" );
fprintf( fp, " }\x0d\x0a" );
}
fputc( CTRL_Z, fp );
ftp = ftell( fp );
fprintf( fp, "1234" ); /* 4バイトあけておく */
if ( ferror( fp ) )
picerror( "画像ファイル出力でエラーが発生しました。" );
#ifdef HIVISION
{
long prelength;
int ysize;
switch (PixelMode) {
case P256x256: ysize = 256; break;
case P512x512: ysize = 512; break;
case P640x400: ysize = 0; break;
case P640x480: ysize = 0; break;
case P1024x1024: ysize = 1024; break;
case P1920x1125: ysize = 0; break;
case P2048x2048: ysize = 2048; break;
case P4096x4096: ysize = 4096; break;
default: ysize = 0; break;
}
if (ysize > 0) {
prelength = ysize * YPosition + XPosition;
if (prelength > 0) {
if (fullcoloroutflag) {
while (prelength > 127) {
putlong(0x000000ffL);
prelength -= 127;
}
putlong(0x00000080L + prelength);
} else {
while (prelength > 65535L) {
putshort(1);
putshort(65535U);
prelength -= 65535L;
}
putshort(1);
putshort((unsigned short)prelength );
}
}
}
}
#endif
return( fp );
#else
if ( pd != NULL )
picerror( "画像ファイルをクローズしていません。" );
{
int mode = 0;
int x, y;
long prelength;
int ysize;
int l;
l = strlen(picfile);
if (strcmpi(picfile+l-4, ".PIC") != 0) {
PixelMode = -1;
}
switch (PixelMode) {
case P256x256: x = 256; y = 256; break;
case P320x200: x = 320; y = 200; break;
case P512x512: x = 512; y = 512; break;
case P640x400: x = 640; y = 400; break;
case P640x480: x = 640; y = 480; break;
case P1024x1024: x = 1024; y = 1024; break;
case P1920x1125: x = 1920; y = 1125; break;
case P2048x2048: x = 2048; y = 2048; break;
case P4096x4096: x = 4096; y = 4096; break;
default:
x = XPosition + XPixel/antiareas;
y = YPosition + YPixel/antiareas;
break;
}
if (PixelMode == -1) {
if (fullcoloroutflag || fullcolorditherflag == DITHERNONE) {
mode = BMP_TRUECOLOR;
} else {
mode = BMP_PALETTE;
}
} else if (fullcoloroutflag) {
mode = COMPRESS_TRUECOLOR;
} else {
switch (fullcolorditherflag) {
case DITHERNONE: mode = COMPRESS_NORMAL; break;
case ORDEREDDITHER4: mode = COMPRESS_DITHER_ORDERD; break;
case ORDEREDDITHER8: mode = COMPRESS_DITHER_ORDERD; break;
case RANDOMDITHER: mode = COMPRESS_DITHER_RANDOM; break;
case ERRORDIFUSION: mode = COMPRESS_DITHER_ERROR; break;
case ERRORDIFUSION2: mode = COMPRESS_DITHER_ERROR216; break;
}
}
if (pix == NULL) {
pix = (Pixel*)tempalloc( sizeof(Pixel) * x);
}
pd = PicWriteOpen(picfile, x, y, mode);
if (pd == NULL) {
picerrorflag = TRUE ;
picerror( "画像ファイルがオープンできません。" );
return( NULL );
}
fprintf( stderr, "Writing Picture File : %s\n", picfile );
switch (PixelMode) {
case P256x256: ysize = 256; break;
case P512x512: ysize = 512; break;
case P640x400: ysize = 0; break;
case P640x480: ysize = 0; break;
case P1024x1024: ysize = 1024; break;
case P1920x1125: ysize = 0; break;
case P2048x2048: ysize = 2048; break;
case P4096x4096: ysize = 4096; break;
default: ysize = 0; break;
}
memset(pix, 0, sizeof(Pixel) * pd->pixelX);
if (ysize > 0) {
for (i = 0; i < YPosition; ++i) {
if (PicOutputLine(pd, pix) == FALSE) {
picerror( "画像ファイル出力でエラーが発生しました。" );
}
}
}
}
return (FILE*)pd;
#endif
}
void picout( framebuf )
ColorCode *framebuf ;
{
int i, j, n, x, r, g, b, a, f;
ColorCode c ;
ColorCode *cp[16] ;
static const int dither_map[4][4] =
{{0,6,1,7}, {4,2,5,3}, {1,7,0,6}, {5,3,4,2}};
static int dither_y = 0;
unsigned short *shortp ;
ColorCode *p;
#ifdef EDGEANTI
int f0;
#endif
unsigned short realbuf[MAXLINE];
#ifdef HIVISION
int xysize;
switch (PixelMode) {
case P256x256: xysize = 256; break;
case P512x512: xysize = 512; break;
case P640x400: xysize = 0; break;
case P640x480: xysize = 0; break;
case P1024x1024: xysize = 1024; break;
case P1920x1125: xysize = 0; break;
case P2048x2048: xysize = 2048; break;
case P4096x4096: xysize = 4096; break;
default: xysize = 0; break;
}
#endif
(*interrupt)();
n = XPixel / antiareas ;
/* アンチエリアシングバッファにコピー */
memcpy( (char *)antibuf[ picline % antiareas ], (char *)framebuf,
sizeof( ColorCode ) * XPixel );
picline++ ;
/* アンチエリアシングのチェック */
if ( picline % antiareas != 0 )
return ;
#ifdef HIVISION
if (xysize > 0 && YPosition + picline / antiareas > xysize) {
return;
}
#endif
/* アンチエリアシング */
if ( antiareas != 1 )
{
a = antiareas * antiareas ;
for( i = 0 ; i < antiareas ; ++i )
cp[i] = antibuf[i] ;
for( x = 0 ; x < n ; ++x )
{
/* すべて同じ色かどうかチェックする */
f = 1 ;
for( i = 0 ; i < antiareas && f ; ++i )
{
c = *(cp[0]) ;
for( j = 0 ; j < antiareas && f ; ++j )
{
if ( cp[i][j] != c ) {
f = 0 ;
break;
}
}
}
if ( f )
{
framebuf[x] = c ;
for( j = 0 ; j < antiareas ; ++j )
cp[j] += antiareas ;
continue ;
}
/* 同じ色でなければアンチエリアシング */
r = g = b = 0 ;
f = 0;
#ifdef EDGEANTI
f0 = FALSE;
#endif
for( i = 0 ; i < antiareas ; ++i )
{
for( j = 0 ; j < antiareas ; ++j )
{
r += (int)(( *(cp[j]) >> 16 ) & 255);
g += (int)(( *(cp[j]) >> 24 ) & 255);
b += (int)(( *(cp[j]) >> 8 ) & 255);
f += (int)(( *(cp[j]) ) & 255);
#ifdef EDGEANTI
if ((( *(cp[j]) ) & 255) == 255) {
f0 = TRUE;
}
#endif
++ ( cp[j] ) ;
}
}
#ifdef EDGEANTI
if (EdgeAntiFlag == FALSE && f0 != FALSE) {
f = 255 * a;
}
#endif
framebuf[x] = ( (long)( r / a ) << 16)
+ ( (long)( g / a ) << 24)
+ ( (long)( b / a ) << 8)
+ ( (long)( f / a ) );
}
}
switch (fullcolorditherflag) {
case ERRORDIFUSION2:
{
int er = 0, eg = 0, eb = 0, ee;
unsigned short *ppp;
ppp = errorbuf;
errorbuf = errorbufnext;
errorbufnext = ppp;
for (x = 0; x < n; ++x) {
errorbufnext[x] = 0;
}
for (x = 0; x < n; ++x) {
ee = (int)((framebuf[x] >> 16) & 0xff) + er +((errorbuf[x]>>11) & 0x1f);
r = (ee >> 3)&0x3c; er = ee & 31;
ee = (er * 3 + 4) / 8;
errorbufnext[x] += ee << 11;
errorbufnext[x+1] += (er - ee * 2) << 11;
er = ee;
ee = (int)((framebuf[x] >> 24) & 0xff) +eg+ ((errorbuf[x]>> 6) & 0x1f);
g = (ee >> 3)&0x3c; eg = ee & 31;
ee = (eg * 3 + 4) / 8;
errorbufnext[x] += ee << 6;
errorbufnext[x+1] += (eg - ee * 2) << 6;
eg = ee;
ee = (int)((framebuf[x] >> 8) & 0xff) + eb+ ((errorbuf[x] ) & 0x3f);
b = (ee >> 3)&0x3f; eb = ee & 63;
ee = (eb * 3 + 4) / 8;
errorbufnext[x] += ee ;
errorbufnext[x+1] += (eb - ee * 2);
eb = ee;
if (r > 31) r = 31;
if (g > 31) g = 31;
if (b > 31) b = 31;
realbuf[x] = (r << 6) + (g << 11) + (b << 1)
+ ((framebuf[x]&0xff)>0xfc?1:0);
}
break;
}
case ERRORDIFUSION:
{
int er = 0, eg = 0, eb = 0, ee;
unsigned short *ppp;
ppp = errorbuf;
errorbuf = errorbufnext;
errorbufnext = ppp;
for (x = 0; x < n; ++x) {
errorbufnext[x] = 0;
}
for (x = 0; x < n; ++x) {
ee = (int)((framebuf[x] >> 16) & 0xff) + er +((errorbuf[x]>>8) & 0x0f);
r = ee >> 3; ee &= 7;
er = (ee * 3 + 4)/8;
errorbufnext[x ] += er << 8;
errorbufnext[x+1] += (ee-er*2) << 8;
ee = (int)((framebuf[x] >> 24) & 0xff) +eg+ ((errorbuf[x]>> 4) & 0x0f);
g = ee >> 3; ee &= 7;
eg = (ee * 3 + 4)/8;
errorbufnext[x ] += eg << 4;
errorbufnext[x+1] += (ee-eg*2) << 4;
ee = (int)((framebuf[x] >> 8) & 0xff) + eb+ ((errorbuf[x] ) & 0x0f);
b = ee >> 3; ee &= 7;
eb = (ee * 3 + 4)/8;
errorbufnext[x ] += eb;
errorbufnext[x+1] += (ee-eb*2);
if (r > 31) r = 31;
if (g > 31) g = 31;
if (b > 31) b = 31;
realbuf[x] = (r << 6) + (g << 11) + (b << 1)
+ ((framebuf[x]&0xff)>0xfc?1:0);
}
break;
}
case RANDOMDITHER:
for (x = 0; x < n; ++x) {
int diff;
diff = (rand()>>12)%8;
r = (int)(((framebuf[x] >> 16) & 0xff) + diff) >> 3;
g = (int)(((framebuf[x] >> 24) & 0xff) + diff) >> 3;
b = (int)(((framebuf[x] >> 8) & 0xff) + diff) >> 3;
if (r > 31) r = 31;
if (g > 31) g = 31;
if (b > 31) b = 31;
realbuf[x] = (r << 6) + (g << 11) + (b << 1)
+ ((framebuf[x]&0xff)>0xfc?1:0);
}
break;
case ORDEREDDITHER4:
for (x = 0; x < n; ++x) {
r = (int)(((framebuf[x]>>16) & 0xff) + dither_map[x&1][dither_y&1])>>3;
g = (int)(((framebuf[x]>>24) & 0xff) + dither_map[x&1][dither_y&1])>>3;
b = (int)(((framebuf[x]>> 8) & 0xff) + dither_map[x&1][dither_y&1])>>3;
if (r > 31) r = 31;
if (g > 31) g = 31;
if (b > 31) b = 31;
realbuf[x] = (r << 6) + (g << 11) + (b << 1)
+ ((framebuf[x]&0xff)>0xfc?1:0);
}
break;
case ORDEREDDITHER8:
for (x = 0; x < n; ++x) {
r = (int)(((framebuf[x]>>16) & 0xff) + dither_map[x&3][dither_y&3])>>3;
g = (int)(((framebuf[x]>>24) & 0xff) + dither_map[x&3][dither_y&3])>>3;
b = (int)(((framebuf[x]>> 8) & 0xff) + dither_map[x&3][dither_y&3])>>3;
if (r > 31) r = 31;
if (g > 31) g = 31;
if (b > 31) b = 31;
realbuf[x] = (r << 6) + (g << 11) + (b << 1)
+ ((framebuf[x]&0xff)>0xfc?1:0);
}
break;
case DITHERNONE:
default:
for (x = 0; x < n; ++x) {
r = (int)((framebuf[x] >> 19) & 0x1f);
g = (int)((framebuf[x] >> 27) & 0x1f);
b = (int)((framebuf[x] >> 11) & 0x1f);
realbuf[x] = (r << 6) + (g << 11) + (b << 1)
+ ((framebuf[x]&0xff)>0xfc?1:0);
/*
ggggggggrrrrrrrrbbbbbbbb.......a
gggggrrrrrbbbbba
realbuf[x] = ((framebuf[x]>>13)&0xf800)
| ((framebuf[x]>>16)&0x07c0)
| ((framebuf[x]>>10)&0x003e);
*/
}
}
dither_y++;
#if 0
if (picline == 100) {
int i;
ColorCode *p;
FILE *fp;
p = framebuf;
fp = fopen("c:/tmp.log", "w");
if (fp != NULL) {
for (i = XPixel/4; i > 0; --i) {
fprintf(fp, "%08x\n", *p);
p += 4;
}
fclose(fp);
}
}
#endif
#ifdef HIVISION
if ( !uflag) {
#ifdef CRTFULLCOLOR
if (xysize > 0) {
crtout24( framebuf, XPosition + n <= xysize ? n : xysize - XPosition, picline/antiareas - 1 );
crtout( realbuf, XPosition + n <= xysize ? n : xysize - XPosition, picline/antiareas - 1 );
} else {
crtout24( framebuf, n, picline/antiareas - 1 );
crtout( realbuf, n, picline/antiareas - 1 );
}
#else
if (xysize > 0) {
crtout( realbuf, XPosition + n <= xysize ? n : xysize - XPosition, picline/antiareas - 1 );
} else {
crtout( realbuf, n, picline/antiareas - 1 );
}
#endif
}
#else
if ( ! uflag )
crtout( realbuf, n, picline/antiareas - 1 );
#endif
p = framebuf;
shortp = realbuf;
if ( nflag == 1 )
{
#ifndef WINDOWS
#ifdef XC
if ( picline == YPixel && ! BackGroundJob )
#else
if ( picline == YPixel )
#endif
{
fprintf( stderr, "\n何かキーを押して下さい。" );
#if defined(DJ) || defined(UNIX)
fgetc(stdin);
#else
getch() ;
#endif
fprintf( stderr, "\n" );
}
#endif
return ;
}
#ifdef NO_PICLIB
/* ファイル出力 */
#ifdef HIVISION
for( i = 0 ; i < n && (xysize == 0 || i + XPosition < xysize) ; ++i )
#else
for( i = 0 ; i < n ; ++i )
#endif
{
if ( len == 0 ) /* ファイルの初め */
{
len = 1 ;
if (fullcoloroutflag) {
code = *p++ ;
} else {
code = *shortp++;
}
continue ;
}
if (
(fullcoloroutflag == TRUE && *p == code && len < 127) ||
(fullcoloroutflag == FALSE && *shortp == code && len < 32767))
++len ;
else
{
if (fullcoloroutflag) {
putlong(( code & 0xffffff00L) | ((code&0xff)>0xfc?0x80:0x00) | len );
code = *p;
} else {
putshort( (unsigned short)code );
putshort( (unsigned short)len );
code = *shortp;
}
len = 1 ;
}
p ++ ;
shortp++;
}
#ifdef HIVISION
if (!(xysize == 0 ||
picline == YPixel ||
YPosition + picline / antiareas == xysize)) {
if (fullcoloroutflag) {
putlong(( code & 0xffffff00L) | ((code&0xff)>0xfc?0x80:0x00) | len );
} else {
putshort( (unsigned short)code );
putshort( len );
}
code = 1;
if (n + XPosition < xysize) {
len = xysize - n;
} else {
len = XPosition;
}
if (fullcoloroutflag) {
while ( len > 127) {
putlong(0x00000080L | 127 );
len -= 127;
}
}
}
/* len = n <= 256 ? 256 - n : 512 - n;*/
#endif
if ( ferror( fp ) )
picerror( "画像ファイル出力でエラーが発生しました。" );
#ifdef HIVISION
if (picline == YPixel || YPosition + picline / antiareas == xysize)
#else
if ( picline == YPixel ) /* ファイル終了 */
#endif
{
fprintf( stderr, "\n" );
if (fullcoloroutflag) {
putlong(( code & 0xffffff00L) | ((code&0xff)>0xfc?0x80:0x00) | len );
} else {
putshort( (unsigned short)code );
putshort( len );
}
#ifdef HIVISION
if (xysize != 0) {
long lastlength;
int ny;
ny = YPixel / antiareas;
/* lastlength = (ny <= 256 ? 256 - ny : 512 - ny) * (n <= 256 ? 256 : 512);*/
lastlength = (xysize - ny - YPosition) * (xysize) + (xysize-XPosition-n);
if (fullcoloroutflag) {
if (lastlength > 0) {
while (lastlength > 127) {
putlong(0x000000ffL);
lastlength -= 127;
}
putlong(0x00000080L + lastlength);
}
} else {
if (lastlength > 0) {
while (lastlength > 65535L) {
putshort( 1 );
putshort( 65535U );
lastlength -= 65535L;
}
putshort( 1 );
putshort( (unsigned short)lastlength );
}
}
}
#endif
fseek( fp, ftp, 0 );
putlong( size );
if ( ferror( fp ) )
picerror( "画像ファイル出力でエラーが発生しました。" );
fclose( fp );
fp = NULL ;
}
#else
/* ファイル出力 */
if (pd->pixelX == XPixel/antiareas) {
if (PicOutputLine(pd, framebuf) == FALSE) {
picerror( "画像ファイル出力でエラーが発生しました。" );
}
} else {
memcpy(pix + XPosition, framebuf, sizeof(Pixel) * (XPixel/antiareas));
if (PicOutputLine(pd, pix) == FALSE) {
picerror( "画像ファイル出力でエラーが発生しました。" );
}
}
if (picline == YPixel || YPosition + picline / antiareas == xysize)
{
long lastlength;
int ny;
fprintf( stderr, "\n" );
ny = YPixel / antiareas;
lastlength = (xysize - ny - YPosition);
memset(pix, 0, sizeof(Pixel) * pd->pixelX);
for (; lastlength > 0; --lastlength) {
if (PicOutputLine(pd, pix) == FALSE) {
picerror( "画像ファイル出力でエラーが発生しました。" );
}
}
if (PicClose(pd) == FALSE) {
picerror( "画像ファイル出力でエラーが発生しました。" );
}
pd = NULL ;
}
#endif
}
void piclineout( x1, y1, x2, y2 )
int x1, y1, x2, y2 ;
{
crtline( x1/antiareas, y1/antiareas, x2/antiareas, y2/antiareas );
}
static void picerror( msg )
char *msg ;
{
#ifdef MESSAGE
extern int printwarning(const char *format, ...);
#endif
if (picerrorflag) return;
#ifdef MESSAGE
printwarning( "%s", msg);
#endif
picerrorflag = TRUE ;
fprintf( stderr, "\n%s\n", msg );
perror("");
/*
exit( 1 );
*/
}
#ifdef NO_PICLIB
static inline void putshort( n )
int n ;
{
size += 2 ;
fputc( ( n >> 8 ) & 255, fp );
fputc( n & 255, fp );
}
static inline void putlong( n )
long n ;
{
putshort( (short)( ( n >> 16 ) & 0xffffL ) );
putshort( (short)( n & 0xffffL ) );
}
#endif
#ifdef WIREVIEW
#ifndef X68000
#err "WIREVIEW is only X68000"
#endif
void wirelineout( x1, y1, x2, y2, color )
int x1, y1, x2, y2 ;
unsigned short color;
{
crtlinecolor( x1/antiareas, y1/antiareas, x2/antiareas, y2/antiareas, color );
}
#define PIC_COL( col ) ( ( col == 0 || col == 1 ) ? 1 : ( col & 0xfffe ) )
static inline int putww( fp, i )
FILE *fp ;
int i ;
{
fputc( ( i >> 8 ) & 255, fp );
fputc( ( i & 255 ), fp );
return( 0 );
}
static inline int putll( fp, i )
FILE *fp ;
long i ;
{
fputc( (int)(( i >> 24 ) & 255), fp ) ;
fputc( (int)(( i >> 16 ) & 255), fp ) ;
fputc( (int)(( i >> 8 ) & 255), fp ) ;
fputc( (int)( i & 255), fp ) ;
return( 0 );
}
static int inline getll( fp )
FILE *fp ;
{
int i ;
i = fgetc( fp ) << 24 ;
i += fgetc( fp ) << 16 ;
i += fgetc( fp ) << 8 ;
i += fgetc( fp ) ;
return( i );
}
static inline unsigned short anti_color(unsigned short *p)
{
long int c1, c2, c3, c4;
long int r1, r2, r3, r4;
c1 = p[0];
c2 = p[1];
c3 = p[512];
c4 = p[513];
if (c1 == c2 && c1 == c3 && c1 == c4) {
return PIC_COL(c1);
}
r1 = (c1 & 0xf83e) + (c2 & 0xf83e) + (c3 & 0xf83e) + (c4 & 0xf83e);
r2 = (c1 & 0x07c0) + (c2 & 0x07c0) + (c3 & 0x07c0) + (c4 & 0x07c0);
r3 = (c1 & c2 & c3 & c4 & 0x0001);
r4 = ((r1/4) & 0xf83e) | ((r2/4) & 0x7c0) | r3;
return PIC_COL(r4);
}
static inline unsigned short white_color(unsigned short *p)
{
unsigned short c;
c = p[0];
if (c < p[1]) c = p[1];
if (c < p[512]) c = p[512];
if (c < p[513]) c = p[513];
return c;
#if 0
long int c1, c2, c3, c4;
long int r1, r2, r3, r4;
c1 = p[0] & 0xfffe;
c2 = p[1] & 0xfffe;
c3 = p[512] & 0xfffe;
c4 = p[513] & 0xfffe;
if (c1 || c2 || c3 || c4) {
return 0xfffe;
} else {
return 1;
}
#endif
}
/*By Taka2*/
#define SAVE_GRAPHIC_256 0
#define SAVE_GRAPHIC_ANTI 1
#define SAVE_GRAPHIC_512 2
/*
** file screen
** msb = 1 -> toumei, futoumei
*/
#define CTRL_Z 0x1A
#define G_RAM_ADDRESS 0xc00000
#define OUT_SIZE 256
int wiresave(void)
{
int sp ;
long end ;
int save_graphic_mode;
unsigned short int *lp, *p ;
int x, y, col, col2, count, step ;
int out_size = 256;
if (XPixel / antiareas > 256) {
save_graphic_mode = SAVE_GRAPHIC_512;
out_size = 512;
} else if (antiareas == 1) {
save_graphic_mode = SAVE_GRAPHIC_256;
} else {
save_graphic_mode = SAVE_GRAPHIC_ANTI;
}
lp = p =(unsigned short *) G_RAM_ADDRESS ;
step = 2 ;
y = 0 ;
x = 0 ;
while(0) ;
#ifndef RENDXVI
sp = SUPER( 0 ) ;
#endif
while(0) ;
switch(save_graphic_mode) {
case SAVE_GRAPHIC_256 :
for (x = 256 * 256; x > 0;) {
col = white_color(p);
count = 1;
p+=2;
if ((--x & 255) == 0) {
p += 512;
}
while (x > 0 && col == (col2 = white_color(p))) {
count++;
if (count == 65536) {
putww( fp, col );
putww( fp, 65535 );
count = 1;
}
p+=2;
if ((--x & 255) == 0) {
p += 512;
}
}
putww( fp, col );
putww( fp, count );
}
break;
case SAVE_GRAPHIC_ANTI :
for (x = 256 * 256; x > 0;) {
col = anti_color(p);
count = 1;
p+=2;
if ((--x & 255) == 0) {
p += 512;
}
while (x > 0 && col == (col2 = anti_color(p))) {
count++;
if (count == 65536) {
putww( fp, col );
putww( fp, 65535 );
count = 1;
}
p+=2;
if ((--x & 255) == 0) {
p += 512;
}
}
putww( fp, col );
putww( fp, count );
}
break;
case SAVE_GRAPHIC_512 :
for (x = 512 * 512; x > 0;) {
col = PIC_COL(*p);
count = 1;
x--;
p++;
while (x > 0 && col == (col2 = PIC_COL(*p))) {
count++;
if (count == 65536) {
putww( fp, col );
putww( fp, 65535 );
count = 1;
}
x--;
p++;
}
putww( fp, col );
putww( fp, count );
}
break;
}
while(0) ;
#ifndef RENDXVI
STACK_ADJUST:
SUPER( sp ) ;
#endif
while(0) ;
end = ftell( fp );
fseek( fp, ftp, 0 );
putll( fp, end - ftp );
/*
fseek( fp, top, 0 );
putll( fp, end-top );
fseek( fp, end, 0 );
*/
if ( ferror( fp ) ) {
picerrorflag = TRUE;
} else {
picerrorflag = FALSE;
}
fclose( fp ) ;
fp = NULL;
return 0;
}
#endif