home *** CD-ROM | disk | FTP | other *** search
/ Fun CD 26 / OTACD26.ISO / archive / game / dqif / dqif.lzh / DQIF.C next >
C/C++ Source or Header  |  1997-07-08  |  8KB  |  323 lines

  1. /******************************
  2.  *   同級生if BMP変換   *<<Saturn版>>
  3.  * Programmed By Melody-Yoshi *
  4.  ******************************/
  5. /* cc -mips2 -xansi -signed -fullwarn -prototypes dqif.c -o dqif */
  6. #include<stdio.h>
  7. #include<string.h>
  8. #include<stdlib.h>
  9. unsigned char *bz,*mem,*tbl,pal[512],txt[4096];
  10. FILE *fp,*fo;
  11. int xwide,ywide,xseek,xpad,bitcode,bitl;
  12. void writebmphead16(void),outpic(unsigned char *,int);
  13. void conv16(int,int),reduce(unsigned char *,int);
  14. void writelong(long),writeshort(short);
  15. void wrtlen(int),bitwrite(int,int);
  16. short getshort(unsigned char *,int);
  17. int decode(void),getlong(unsigned char *,int);
  18. void main(int argc,char *argv[])
  19. {
  20.     char fn[64];
  21.     int tblcnt,i,j,m;
  22.     if(argc<2){
  23.         printf("dqif [file] [flag]\n  flag:b0|b1|p0|p1\n");exit(1);
  24.     }
  25.     strcpy(fn,argv[1]);for(i=0;fn[i];i++)if(fn[i]=='.')break;
  26.     strcpy(&fn[i],".pac");
  27.     if((fp=fopen(fn,"rb"))==0){
  28.         printf("file open error![%s]\n",fn);exit(1);
  29.     }
  30.     if(argc>2){
  31.         if(argv[2][0]=='p' || argv[2][0]=='P')m=2;
  32.         if(argv[2][1]=='1')m|=1;
  33.     }
  34.     fseek(fp,28L,0);fread(txt,1,4,fp);tblcnt=getlong(txt,0);
  35.     tbl=(unsigned char *)malloc(tblcnt<<4);
  36.     mem=(unsigned char *)malloc(0x4D000);
  37.     bz=(unsigned char *)malloc(0x70000);
  38.     if(mem==NULL || tbl==NULL || bz==NULL){
  39.         printf("insufficient memory!\n");fclose(fp);exit(1);
  40.     }
  41.     fread(tbl,1,tblcnt<<4,fp);fclose(fp);
  42.     strcpy(&fn[i],".dat");
  43.     if((fp=fopen(fn,"rb"))==0){
  44.         printf("file open error![%s]\n",fn);exit(1);
  45.     }
  46.     for(i=0;i<tblcnt;i++){
  47.         for(j=0;;j++){
  48.             fn[j]=tbl[(i<<4)+j];if(fn[j]==0)break;
  49.         }
  50.         j=getlong(tbl,(i<<4)+8)<<11;fseek(fp,j,0);
  51.         j=getlong(tbl,(i<<4)+12);fread(mem,1,j,fp);
  52.         j=decode();
  53.         j=bz[16]*256+bz[17];xwide=640;ywide=(j&1)?224:160;
  54.         if(m&2)strcat(fn,".PIC");
  55.         else strcat(fn,".BMP");
  56.         if((fo=fopen(fn,"wb"))==0){
  57.             printf("file create error![%s]\n",fn);exit(1);
  58.         }
  59.         conv16(j,m);
  60.         fclose(fo);
  61.     }
  62.     free(mem);free(bz);free(tbl);fclose(fp);
  63.     exit(0);
  64. }
  65. int decode(void)
  66. {
  67.     int i,j,k,m,p,q,r,cnt,dist,dl;
  68.     dl=getlong(mem,16);for(i=0;i<4096;i++)txt[i]=0;
  69.     for(p=j=0,q=0xFEE,r=20,k=0;p<dl;k>>=1){
  70.         if((k&0xFF00)==0){
  71.             k=(mem[r++]|0xFF00)^j;j=(j+1)&255;
  72.         }
  73.         if(k&1){
  74.             m=mem[r++];bz[p++]=txt[q]=m;q=(q+1)&0xFFF;
  75.         }
  76.         else{
  77.             m=mem[r]|(mem[r+1]<<8);r+=2;
  78.             cnt=((m&0x0F00)>>8)+3;dist=((m&0xF000)>>4)|(m&255);
  79.             for(m=0;m<cnt;m++){
  80.                 bz[p++]=txt[q]=txt[dist];q=(q+1)&0xFFF;dist=(dist+1)&0xFFF;
  81.             }
  82.         }
  83.     }
  84.     return(p);
  85. }
  86. void reduce(unsigned char *b,int f)
  87. {
  88.     int i,j,m,r1,r2,b1,b2,g1,g2;
  89.     unsigned k;
  90.     m=xwide*ywide*2;
  91.     if(f==24){
  92.         for(i=j=0;i<m;i+=4,j+=3){
  93.             k=(b[i]<<8)|(b[i+1]);
  94.             r1=(k&0x1F)<<3;g1=(k&0x3E0)>>2;b1=(k&0x7C00)>>7;
  95.             k=(b[i+2]<<8)|(b[i+3]);
  96.             r2=(k&0x1F)<<3;g2=(k&0x3E0)>>2;b2=(k&0x7C00)>>7;
  97.             b[j]=(b1+b2)/2;b[j+1]=(g1+g2)/2;b[j+2]=(r1+r2)/2;
  98.         }
  99.     }
  100.     else{
  101.         for(i=j=0;i<m;i+=4,j+=2){
  102.             k=(b[i]<<8)|(b[i+1]);
  103.             r1=(k&0x1F)<<3;g1=(k&0x3E0)>>2;b1=(k&0x7C00)>>7;
  104.             k=(b[i+2]<<8)|(b[i+3]);
  105.             r2=(k&0x1F)<<3;g2=(k&0x3E0)>>2;b2=(k&0x7C00)>>7;
  106.             r2=(((b1+b2)&0x1F0)<<6)|(((g1+g2)&0x1F0)<<1)|(((r1+r2)&0x1F0)>>4);
  107.             b[j+1]=r2&255;b[j]=(r2>>8);
  108.         }
  109.     }
  110.     xwide/=2;
  111. }
  112. void conv16(int mode,int sv)
  113. {
  114.     int i,j,x,y,z;
  115.     if(sv&2){        /* PIC */
  116.         z=(mode>=0x400)?xwide*ywide+18:18;
  117.         if(sv&1)reduce(&bz[z],15);
  118.         outpic(&bz[z],15);
  119.     }
  120.     else{
  121.         z=(mode>=0x400)?xwide*ywide+18:18;
  122.         if(sv&1)reduce(&bz[z],24);
  123.         xseek=xwide*3;xpad=(4-(xseek&3))&3;xseek+=xpad;
  124.         writebmphead16();
  125.         if(sv&1){
  126.             for(y=ywide-1;y>=0;y--){
  127.                 fwrite(&bz[y*xwide*3+z],1,xwide*3,fo);
  128.                 for(x=0;x<xpad;x++)fputc(0,fo);
  129.             }
  130.         }
  131.         else{
  132.             for(y=ywide-1;y>=0;y--){
  133.                 for(x=0,j=y*xwide*2+z;x<xwide;x++){
  134.                     i=(bz[j+x*2]<<8)|(bz[j+x*2+1]);
  135.                     mem[x*3]=(i&0x7C00)>>7;mem[x*3+1]=(i&0x3E0)>>2;
  136.                     mem[x*3+2]=(i&0x1F)<<3;
  137.                 }
  138.                 fwrite(mem,1,xwide*3,fo);
  139.                 for(x=0;x<xpad;x++)fputc(0,fo);
  140.             }
  141.         }
  142.     }
  143. }
  144. /* WRITE BMP HEADER */
  145. void writebmphead16(void)
  146. {
  147.     short i;
  148.     unsigned short k;
  149.     fputc('B',fo);fputc('M',fo);    /* ID */
  150.     writelong(54L+(long)xwide*(long)ywide*3L+(long)xpad*(long)ywide);   /* FILE
  151. SIZE */
  152.     writelong(0L);                    /* RESERVED */
  153.     writelong(54L);                    /* IMAGE OFFSET */
  154.     writelong(40L);                    /* INFO SIZE */
  155.     writelong((long)xwide);            /* dx */
  156.     writelong((long)ywide);            /* dy */
  157.     writeshort(1);                    /* PLAIN */
  158.     writeshort(24);                    /* DEPTH */
  159.     writelong(0L);                    /* COMPRESS TYPE */
  160.     writelong(0L);
  161.     writelong(0L);                    /* x per meter */
  162.     writelong(0L);                    /* y per meter */
  163.     writelong(0L);
  164.     writelong(0L);
  165. }
  166. /* PIC-FILE OUTPUT */
  167. void outpic(unsigned char *b,int cbit)
  168. {
  169.     int a,ad,c,d,i,p,x,y,xx,yy,r1,g1,b1;
  170.     struct{
  171.         int c,n,p;
  172.     }table[128];
  173.     if(cbit==8){
  174.         r1=xwide*ywide;
  175.         for(i=r1-1,p=r1+r1-2;i>=0;i--,p-=2){
  176.             c=b[i]<<1;b[p]=(c&256)>>8;b[p+1]=c&255;
  177.         }
  178.     }
  179.     else{
  180.         for(p=0;p<xwide*ywide*2;p+=2){
  181.             i=b[p+1]+(b[p]<<8);
  182.             r1=(i&0x1f)<<6;g1=(i&0x3E0)<<6;b1=(i&0x7C00)>>9;
  183.             i=g1|r1|b1;b[p]=i/256;b[p+1]=i&255;
  184.         }
  185.     }
  186.     bitl=bitcode=0;
  187.     for(i=0;i<128;i++){
  188.         table[i].c=0;table[i].p=i+1;table[i].n=i-1;
  189.     }
  190.     table[127].p=0;table[0].n=127;
  191.     fprintf(fo,"PIC/MM/XSS:");                    /* HEADER */
  192.     fputc(26,fo);fputc(0,fo);                    /* TEXT EOF */
  193.     fputc(0,fo);fputc(0,fo);                    /* MODE */
  194.     fputc(0,fo);fputc(cbit,fo);                    /* COLOR LENGTH */
  195.     fputc(xwide/256,fo);fputc(xwide&255,fo);    /* SIZE X */
  196.     fputc(ywide/256,fo);fputc(ywide&255,fo);    /* SIZE Y */
  197.     if(cbit==8){
  198.         for(i=0;i<256;i++){
  199.             r1=pal[i<<1]|(pal[(i<<1)+1]<<8);
  200.             b1=(r1&0x7C00)>>7;g1=(r1&0x3E0)>>2;r1=(r1&0x1F)<<3;
  201.             r1=(g1<<8)|(r1<<3)|(b1>>2);
  202.             fputc(r1/256,fo);fputc(r1&255,fo);
  203.         }
  204.     }
  205.     for(p=y=c=0;y<xwide*ywide*2;y+=2){
  206.         if((i=((b[y]<<8)|(b[y+1]))&0xFFFE)!=c){
  207.             c=i;b[y]=c>>8;b[y+1]=(c&255)|1;
  208.         }
  209.     }
  210.     for(i=y=0;y<ywide;y++){
  211.         for(ad=y*xwide*2,x=0;x<xwide;x++,ad+=2){
  212.             i++;
  213.             if((c=(b[ad]<<8)|(b[ad+1]))&1){
  214.                 wrtlen(i);
  215.                 if(cbit==8)bitwrite(8,c>>1);
  216.                 else{
  217.                     for(a=0;a<128;a++)if(table[a].c==(c&0xFFFE))break;
  218.                     if(a==128){
  219.                         p=table[p].p;table[p].c=c&0xFFFE;
  220.                     }
  221.                     else{
  222.                         if(p!=a){
  223.                             table[table[a].p].n=table[a].n;
  224.                             table[table[a].n].p=table[a].p;
  225.                             table[table[p].p].n=a;table[a].p=table[p].p;
  226.                             table[p].p=a;table[a].n=p;p=a;
  227.                         }
  228.                     }
  229.                     if(a!=128)bitwrite(8,a+128);
  230.                     else bitwrite(16,(unsigned)c/2);
  231.                 }
  232.                 for(a=0,xx=x,yy=y+1,r1=((y+1)*xwide+x)*2;yy<ywide;yy++,r1+=xwide*2){
  233.                     if(c==((b[r1]<<8)|(b[r1+1])))d=2;
  234.                     else{
  235.                         xx--;r1-=2;
  236.                         if(xx>=0 && c==((b[r1]<<8)|(b[r1+1])))d=1;
  237.                         else{
  238.                             xx+=2;r1+=4;
  239.                             if(xx<xwide && c==((b[r1]<<8)|(b[r1+1])))d=3;
  240.                             else{
  241.                                 xx-=3;r1-=6;
  242.                                 if(xx>=0 && c==((b[r1]<<8)|(b[r1+1])))d=4;
  243.                                 else{
  244.                                     xx+=4;r1+=8;
  245.                                     if(xx<xwide && c==((b[r1]<<8)|(b[r1+1])))d=5;
  246.                                     else break;
  247.                                 }
  248.                             }
  249.                         }
  250.                     }
  251.                     b[r1]=c>>8;b[r1+1]=c&0xFE;
  252.                     if(a==0)bitwrite(1,1);
  253.                     if(d==4)bitwrite(4,2);
  254.                     if(d==5)bitwrite(4,3);
  255.                     if(d<=3)bitwrite(2,d);
  256.                     a=1;
  257.                 }
  258.                 if(a==0)bitwrite(1,0);
  259.                 else bitwrite(3,0);
  260.                 b[ad]=c>>8;b[ad+1]=c&0xFE;i=0;
  261.             }
  262.         }
  263.     }
  264.     wrtlen(i+1);bitwrite(8,0);bitwrite(31,0);
  265. }
  266. /* WRITE SHORT VALUE */
  267. void writeshort(short n)
  268. {
  269.     fputc(n&255,fo);fputc((n>>8)&255,fo);
  270. }
  271. /* WRITE LONG VALUE */
  272. void writelong(long n)
  273. {
  274.     fputc((int)(n&255),fo);n/=256L;
  275.     fputc((int)(n&255),fo);n/=256L;
  276.     fputc((int)(n&255),fo);n/=256L;
  277.     fputc((int)(n&255),fo);
  278. }
  279. void wrtlen(int n)
  280. {
  281.     int a,b;
  282.     a=1;b=4;
  283.     while(n>b-2){
  284.         a++;b<<=1;
  285.     }
  286.     bitwrite(a,0xfffffffe);bitwrite(a,(n+1-b/2));
  287. }
  288. void bitwrite(int sz,int n)
  289. {
  290.     int i;
  291.     if(bitl+sz>32){
  292.         i=32-bitl;bitl+=sz-32;
  293.         bitcode=(bitcode<<i)|((n>>bitl)&((1<<i)-1));
  294.         fputc(bitcode>>24,fo);
  295.         fputc((bitcode>>16)&255,fo);
  296.         fputc((bitcode>>8)&255,fo);
  297.         fputc(bitcode&255,fo);
  298.         bitcode=n&((1<<bitl)-1);
  299.     }
  300.     else if(bitl+sz==32){
  301.         bitcode=(bitcode<<sz)|(n&((1<<sz)-1));bitl=0;
  302.         fputc(bitcode>>24,fo);
  303.         fputc((bitcode>>16)&255,fo);
  304.         fputc((bitcode>>8)&255,fo);
  305.         fputc(bitcode&255,fo);
  306.     }
  307.     else{
  308.         bitcode=(bitcode<<sz)|(n&((1<<sz)-1));bitl+=sz;
  309.     }
  310. }
  311. /* READ LONG VALUE */
  312. int getlong(unsigned char *b,int p)
  313. {
  314.     int i;
  315.     i=b[p]<<24;i|=b[p+1]<<16;i|=b[p+2]<<8;i|=b[p+3];return(i);
  316. }
  317. /* READ SHORT VALUE */
  318. short getshort(unsigned char *b,int p)
  319. {
  320.     short i;
  321.     i=b[p]<<8;i|=b[p+1];return(i);
  322. }
  323.