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 >
C/C++ Source or Header  |  1995-02-22  |  6KB  |  281 lines

  1. /*
  2.     Copyright 1995 Ogasawara Hiroyuki(COR.)
  3. */
  4.  
  5. #include    <corlib.h>
  6. #include    <sys_doslib.h>
  7. #include    <microfio.h>
  8.  
  9. #include    "Sesse.inc"
  10.  
  11. #define        PROG        "GV_ppm v1.10"
  12. #define        OUTPUTNAME    "gvppm.ppm"
  13.  
  14. #define        GVIEWWIN    "gview.win"
  15. #define        XSIZE        (80)
  16. #define        YSIZE        (42-12)
  17.  
  18. int        WindowHeapSize= 1024*0;
  19.  
  20. static unsigned char *
  21. getnum( ptr, num )
  22. unsigned char    *ptr;
  23. int    *num;
  24. {
  25.     int    i= 0;
  26.     for(; *ptr && *ptr <= ' ' ; ptr++ );
  27.     for(; *ptr >= '0' && *ptr <= '9' ;)
  28.         i= i*10+ (*ptr++&15);
  29.     *num= i;
  30.     return    ptr;
  31. }
  32.  
  33. static unsigned char *
  34. putnum( str, num )
  35. unsigned char    *str;
  36. int    num;
  37. {
  38.     char    buf[20], *p= buf+20;
  39.     *--p= '\0';
  40.     do{
  41.         *--p= num%10 +'0';
  42.     }while( num/= 10 );
  43.     for(; *str++= *p++ ;);
  44.     return    str-1;
  45. }
  46.  
  47. static void
  48. Error( msg )
  49. char    *msg;
  50. {
  51.     ConsoleOpen();
  52.     ConsolePrint( msg );
  53.     ConsolePrint( "\r\n" );
  54.     MS_SEL( 0 );
  55. }
  56.  
  57. static void
  58. WaitMark()
  59. {
  60.     MouseSetPattern( 1, &SessePattern, 7, 3 );
  61.     MS_SEL( 1 );
  62. }
  63.  
  64. static void
  65. MakeNewGWin( ng )
  66. UGraphic    *ng;
  67. {
  68.     EventInfo    info;
  69.     info.option= EventUser;
  70.     info.ComBuffer= ng;
  71.     info.ComData= UserGraphic;
  72.     PidSendEvent( GVIEWWIN, &info, TRUE );
  73.     MFREE( ng->buf );
  74. }
  75.  
  76. PPMload( file )
  77. char    *file;
  78. {
  79.     UGraphic    ng;
  80.     m_file    fm;
  81.     WaitMark();
  82.     if( Mopen( &fm, file ) ){
  83.         int    len= Mfsize( &fm ), color;
  84.         unsigned char    *buf= MALLOC( len ), *ptr= buf;
  85.         unsigned short    *str= (void*)buf;
  86.         if( (int)buf < 0 ){
  87.             Mclose( &fm );
  88.             Error( "âüâéâèé¬æ½éΦé▄é╣é±" );
  89.             return    FALSE;
  90.         }
  91.         Mread( &fm, buf, len );
  92.         Mclose( &fm );
  93.         if( *buf != 'P' || buf[1] != '6' ){
  94.             Error( "âtâHü[â}âbâgé¬êßéóé▄é╖" );
  95.             return    FALSE;
  96.         }
  97.         ptr= getnum( ptr+2, &ng.h );
  98.         ptr= getnum( ptr, &ng.v );
  99.         ptr= getnum( ptr, &color );
  100.         if( *ptr == '\r' || *ptr == '\n' )
  101.             ptr++;
  102.         if( *ptr == '\r' || *ptr == '\n' )
  103.             ptr++;
  104.         {
  105.             int    x, y;
  106.             for( y= 0 ; y< ng.v ; y++ ){
  107.                 for( x= 0 ; x< ng.h ; x++ ){
  108.                     unsigned char    c0= *ptr++,
  109.                             c1= *ptr++,
  110.                             c2= *ptr++;
  111.                     unsigned short    l;
  112.                     l= ((c0<< 11-3)&0xf800)+
  113.                        ((c1<<  6-3)&0x07c0)+
  114.                        ((c2>>-(1-3))&0x03e);
  115.                     *str++= l;
  116.                 }
  117.             }
  118.         }
  119.         ng.buf= (void*)buf;
  120.         ng.color= WindowAttrGraphic65536;
  121.         ng.palet= NULL;
  122.         MakeNewGWin( &ng );
  123.     }else{
  124.         Error( "âtâ@âCâïé¬éáéΦé▄é╣é±" );
  125.     }
  126.     MS_SEL( 0 );
  127.     return    TRUE;
  128. }
  129.  
  130. PPMsave( gp, file )
  131. UGraphic *gp;
  132. char    *file;
  133. {
  134.     m_file    fm;
  135.     WaitMark();
  136.     if( Mcreate( &fm, file ) ){
  137.         unsigned char    buf[80], *str= buf;
  138.         *str++= 'P';
  139.         *str++= '6';
  140.         *str++= '\r';
  141.         *str++= '\n';
  142.         str= putnum( str, gp->h );
  143.         *str++= ' ';
  144.         str= putnum( str, gp->v );
  145.         *str++= '\r';
  146.         *str++= '\n';
  147.         str= putnum( str, 255 );
  148.         *str++= '\r';
  149.         *str++= '\n';
  150.         Mwrite( &fm, buf, str-buf );
  151.         if( gp->color == WindowAttrGraphic65536 ){
  152.             int    x, y;
  153.             unsigned short    *ptr= gp->buf;
  154.             for( y= 0 ; y< gp->v ; y++ ){
  155.                 for( x= 0 ; x< gp->h ; x++ ){
  156.                     unsigned char    c0, c1, c2;
  157.                     unsigned short    l= *ptr++;
  158.                     if( l ){
  159.                         c0= ((l&0xf800)>>11-3)+0x7;
  160.                         c1= ((l&0x07c0)>> 6-3)+0x7;
  161.                         c2= ((l&0x003e)<< 2  )+0x7;
  162.                         Mputc( &fm, c0 );
  163.                         Mputc( &fm, c1 );
  164.                         Mputc( &fm, c2 );
  165.                     }else{
  166.                         Mputc( &fm, 0 );
  167.                         Mputc( &fm, 0 );
  168.                         Mputc( &fm, 0 );
  169.                     }
  170.                 }
  171.             }
  172.         }else if( gp->palet ){
  173.             int    x, y;
  174.             unsigned char    *ptr= (void*)gp->buf;
  175.             for( y= 0 ; y< gp->v ; y++ ){
  176.                 for( x= 0 ; x< gp->h ; x++ ){
  177.                     unsigned char    c0, c1, c2;
  178.                     unsigned short    l= gp->palet[*ptr++];
  179.                     if( l ){
  180.                         c0= ((l&0xf800)>>11-3)+0x7;
  181.                         c1= ((l&0x07c0)>> 6-3)+0x7;
  182.                         c2= ((l&0x003e)<< 2  )+0x7;
  183.                         Mputc( &fm, c0 );
  184.                         Mputc( &fm, c1 );
  185.                         Mputc( &fm, c2 );
  186.                     }else{
  187.                         Mputc( &fm, 0 );
  188.                         Mputc( &fm, 0 );
  189.                         Mputc( &fm, 0 );
  190.                     }
  191.                 }
  192.             }
  193.             Error( OUTPUTNAME "é╔Åoù═é╡é▄é╡é╜" );
  194.         }else{
  195.             Error( "ò╧è╖é┼é½é▄é╣é±é┼é╡é╜" );
  196.         }
  197.         Mflush( &fm );
  198.         Mclose( &fm );
  199.     }else{
  200.         Error( "âtâ@âCâïé¬ì∞éΩé▄é╣é±" );
  201.     }
  202.     MS_SEL( 0 );
  203.     return    TRUE;
  204. }
  205.  
  206.  
  207. static int
  208. EventExec( wp, info )
  209. WindowID    wp;
  210. EventInfo    *info;
  211. {
  212.     DrawBuf    dbuf[4];
  213.     switch( info->option ){
  214.         case EventOpen:
  215.             WindowSetEventAttr( wp,  EventOpenON|EventRedrawON
  216.                 |EventCloseON|EventMouseSwitchON|EventIconifyON
  217.                 |EventUserON );
  218.             WindowRedraw( wp );
  219.             return    TRUE;
  220.         case EventIconify:
  221.             IconEnt( wp, PROG, AttrDefault, 12 );
  222.             return    TRUE;
  223.         case EventRedraw:
  224.             DrawSetClear( dbuf, ColorGray );
  225.             DrawSetSymbol( dbuf+1, 3, 1, PROG, 9|4, 12 );
  226.             DrawSetSymbol( dbuf+2, 3,14, "[ppm <=> UG]", 9, 12 );
  227.             WindowDraw( wp, dbuf, 3 );
  228.             return    TRUE;
  229.         case EventClose:
  230.             WindowClose( wp );
  231.             WindowConnectionClose();
  232.             return    TRUE;
  233.         case EventUser:
  234.             switch( info->ComData ){
  235.             case UserGraphic:
  236.                 PPMsave( info->ComBuffer, OUTPUTNAME );
  237.                 return    TRUE;
  238.             case UserSheet:
  239.                 break;
  240.             case UserString:
  241.             case UserPaste:
  242.                 PPMload( info->ComBuffer );
  243.                 return    TRUE;
  244.             case UserStrings: {
  245.                     char    **p= info->ComBuffer;
  246.                     for(; *p ; PPMload( *p++ ) );
  247.                 }
  248.                 return    TRUE;
  249.             }
  250.             return    FALSE;
  251.  
  252.         case EventMouseSwitch:
  253.             if( info->LeftON ){
  254.                 ConsoleOpen();
  255.                 ConsolePrint(
  256. "\r\n" PROG " 1995 COR.\r\n"
  257. "------------------------------------------------------------------------\r\n"
  258. "âtâ@âCâïû╝ ü¿ppm âtâHü[â}âbâgé╠âtâ@âCâïé≡ô╟é▌ì₧é±é┼ôαùeé╠ò\Īé≡ìséóé▄é╖üB\r\n"
  259. "UserGraphicü¿ppm î`Ä«é┼âtâ@âCâïé╔Åæé½Åoé╡é▄é╖üB\r\n"
  260. "------------------------------------------------------------------------\r\n"
  261.                 );
  262.                 return    TRUE;
  263.             }
  264.             return    FALSE;
  265.     }
  266.     return    FALSE;
  267. }
  268.  
  269.  
  270. void
  271. WindowMain( argc, argv )
  272. char    **argv;
  273. {
  274.     int    x= 400, y= 0;
  275.     argc= AnalyzeArgs( argc, argv, &x, &y, NULL, NULL );
  276.     WindowTitleOpen( x, y, XSIZE, YSIZE, NULL, " ",
  277.                         Close|Push|Icon, EventExec );
  278.     for(; --argc ; PPMload( *++argv ) );
  279. }
  280.  
  281.