home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Kyūkyoku!! X68000 Emulator
/
X68000Book.dat
/
mac
/
OLS
/
X68000
/
Ko-Window
/
gv_ppm11.lzh
/
gv_ppm.c
next >
Wrap
C/C++ Source or Header
|
1995-02-22
|
6KB
|
281 lines
/*
Copyright 1995 Ogasawara Hiroyuki(COR.)
*/
#include <corlib.h>
#include <sys_doslib.h>
#include <microfio.h>
#include "Sesse.inc"
#define PROG "GV_ppm v1.10"
#define OUTPUTNAME "gvppm.ppm"
#define GVIEWWIN "gview.win"
#define XSIZE (80)
#define YSIZE (42-12)
int WindowHeapSize= 1024*0;
static unsigned char *
getnum( ptr, num )
unsigned char *ptr;
int *num;
{
int i= 0;
for(; *ptr && *ptr <= ' ' ; ptr++ );
for(; *ptr >= '0' && *ptr <= '9' ;)
i= i*10+ (*ptr++&15);
*num= i;
return ptr;
}
static unsigned char *
putnum( str, num )
unsigned char *str;
int num;
{
char buf[20], *p= buf+20;
*--p= '\0';
do{
*--p= num%10 +'0';
}while( num/= 10 );
for(; *str++= *p++ ;);
return str-1;
}
static void
Error( msg )
char *msg;
{
ConsoleOpen();
ConsolePrint( msg );
ConsolePrint( "\r\n" );
MS_SEL( 0 );
}
static void
WaitMark()
{
MouseSetPattern( 1, &SessePattern, 7, 3 );
MS_SEL( 1 );
}
static void
MakeNewGWin( ng )
UGraphic *ng;
{
EventInfo info;
info.option= EventUser;
info.ComBuffer= ng;
info.ComData= UserGraphic;
PidSendEvent( GVIEWWIN, &info, TRUE );
MFREE( ng->buf );
}
PPMload( file )
char *file;
{
UGraphic ng;
m_file fm;
WaitMark();
if( Mopen( &fm, file ) ){
int len= Mfsize( &fm ), color;
unsigned char *buf= MALLOC( len ), *ptr= buf;
unsigned short *str= (void*)buf;
if( (int)buf < 0 ){
Mclose( &fm );
Error( "âüâéâèé¬æ½éΦé▄é╣é±" );
return FALSE;
}
Mread( &fm, buf, len );
Mclose( &fm );
if( *buf != 'P' || buf[1] != '6' ){
Error( "âtâHü[â}âbâgé¬êßéóé▄é╖" );
return FALSE;
}
ptr= getnum( ptr+2, &ng.h );
ptr= getnum( ptr, &ng.v );
ptr= getnum( ptr, &color );
if( *ptr == '\r' || *ptr == '\n' )
ptr++;
if( *ptr == '\r' || *ptr == '\n' )
ptr++;
{
int x, y;
for( y= 0 ; y< ng.v ; y++ ){
for( x= 0 ; x< ng.h ; x++ ){
unsigned char c0= *ptr++,
c1= *ptr++,
c2= *ptr++;
unsigned short l;
l= ((c0<< 11-3)&0xf800)+
((c1<< 6-3)&0x07c0)+
((c2>>-(1-3))&0x03e);
*str++= l;
}
}
}
ng.buf= (void*)buf;
ng.color= WindowAttrGraphic65536;
ng.palet= NULL;
MakeNewGWin( &ng );
}else{
Error( "âtâ@âCâïé¬éáéΦé▄é╣é±" );
}
MS_SEL( 0 );
return TRUE;
}
PPMsave( gp, file )
UGraphic *gp;
char *file;
{
m_file fm;
WaitMark();
if( Mcreate( &fm, file ) ){
unsigned char buf[80], *str= buf;
*str++= 'P';
*str++= '6';
*str++= '\r';
*str++= '\n';
str= putnum( str, gp->h );
*str++= ' ';
str= putnum( str, gp->v );
*str++= '\r';
*str++= '\n';
str= putnum( str, 255 );
*str++= '\r';
*str++= '\n';
Mwrite( &fm, buf, str-buf );
if( gp->color == WindowAttrGraphic65536 ){
int x, y;
unsigned short *ptr= gp->buf;
for( y= 0 ; y< gp->v ; y++ ){
for( x= 0 ; x< gp->h ; x++ ){
unsigned char c0, c1, c2;
unsigned short l= *ptr++;
if( l ){
c0= ((l&0xf800)>>11-3)+0x7;
c1= ((l&0x07c0)>> 6-3)+0x7;
c2= ((l&0x003e)<< 2 )+0x7;
Mputc( &fm, c0 );
Mputc( &fm, c1 );
Mputc( &fm, c2 );
}else{
Mputc( &fm, 0 );
Mputc( &fm, 0 );
Mputc( &fm, 0 );
}
}
}
}else if( gp->palet ){
int x, y;
unsigned char *ptr= (void*)gp->buf;
for( y= 0 ; y< gp->v ; y++ ){
for( x= 0 ; x< gp->h ; x++ ){
unsigned char c0, c1, c2;
unsigned short l= gp->palet[*ptr++];
if( l ){
c0= ((l&0xf800)>>11-3)+0x7;
c1= ((l&0x07c0)>> 6-3)+0x7;
c2= ((l&0x003e)<< 2 )+0x7;
Mputc( &fm, c0 );
Mputc( &fm, c1 );
Mputc( &fm, c2 );
}else{
Mputc( &fm, 0 );
Mputc( &fm, 0 );
Mputc( &fm, 0 );
}
}
}
Error( OUTPUTNAME "é╔Åoù═é╡é▄é╡é╜" );
}else{
Error( "ò╧è╖é┼é½é▄é╣é±é┼é╡é╜" );
}
Mflush( &fm );
Mclose( &fm );
}else{
Error( "âtâ@âCâïé¬ì∞éΩé▄é╣é±" );
}
MS_SEL( 0 );
return TRUE;
}
static int
EventExec( wp, info )
WindowID wp;
EventInfo *info;
{
DrawBuf dbuf[4];
switch( info->option ){
case EventOpen:
WindowSetEventAttr( wp, EventOpenON|EventRedrawON
|EventCloseON|EventMouseSwitchON|EventIconifyON
|EventUserON );
WindowRedraw( wp );
return TRUE;
case EventIconify:
IconEnt( wp, PROG, AttrDefault, 12 );
return TRUE;
case EventRedraw:
DrawSetClear( dbuf, ColorGray );
DrawSetSymbol( dbuf+1, 3, 1, PROG, 9|4, 12 );
DrawSetSymbol( dbuf+2, 3,14, "[ppm <=> UG]", 9, 12 );
WindowDraw( wp, dbuf, 3 );
return TRUE;
case EventClose:
WindowClose( wp );
WindowConnectionClose();
return TRUE;
case EventUser:
switch( info->ComData ){
case UserGraphic:
PPMsave( info->ComBuffer, OUTPUTNAME );
return TRUE;
case UserSheet:
break;
case UserString:
case UserPaste:
PPMload( info->ComBuffer );
return TRUE;
case UserStrings: {
char **p= info->ComBuffer;
for(; *p ; PPMload( *p++ ) );
}
return TRUE;
}
return FALSE;
case EventMouseSwitch:
if( info->LeftON ){
ConsoleOpen();
ConsolePrint(
"\r\n" PROG " 1995 COR.\r\n"
"------------------------------------------------------------------------\r\n"
"âtâ@âCâïû╝ ü¿ppm âtâHü[â}âbâgé╠âtâ@âCâïé≡ô╟é▌ì₧é±é┼ôαùeé╠ò\Īé≡ìséóé▄é╖üB\r\n"
"UserGraphicü¿ppm î`Ä«é┼âtâ@âCâïé╔Åæé½Åoé╡é▄é╖üB\r\n"
"------------------------------------------------------------------------\r\n"
);
return TRUE;
}
return FALSE;
}
return FALSE;
}
void
WindowMain( argc, argv )
char **argv;
{
int x= 400, y= 0;
argc= AnalyzeArgs( argc, argv, &x, &y, NULL, NULL );
WindowTitleOpen( x, y, XSIZE, YSIZE, NULL, " ",
Close|Push|Icon, EventExec );
for(; --argc ; PPMload( *++argv ) );
}