home *** CD-ROM | disk | FTP | other *** search
/ PC World 2002 September / PCWorld_2002-09_cd.bin / Software / Vyzkuste / helpdeco / ZAPRES.C < prev    next >
C/C++ Source or Header  |  1996-09-13  |  5KB  |  177 lines

  1. /*
  2. ZAPRES - removes resolution information from Windows bitmap files - Version 1.1
  3. M.Winterhoff, Geschw.-Scholl-Ring 17, 38444 Wolfsburg, Germany, CIS 100326,2776
  4.  
  5. usage:    ZAPRES filename1[.BMP] filename2[.BMP] ...
  6.  
  7. option: Normally ZAPRES will create a .BAK file before it attempts to modify
  8.     the input file. Specify option /b if you don't want to backup files.
  9.  
  10. This program removes the resolution information from Windows .BMP bitmaps, .MRB
  11. multi resolution bitmaps, and .SHG segmented hotspot graphics. This way WinHelp
  12. will not rescale the image and MRBC can be applied to specify a new resolution.
  13.  
  14. This program is freeware. Use at your own risk. No part of it may be used
  15. commercially. No fees may be charged on distributing.
  16. */
  17.  
  18. #include <stdio.h>
  19. #include <stdlib.h>
  20. #include <dir.h>
  21. #include <string.h>
  22.  
  23. int backup(FILE *f,char *oldname)
  24. {
  25.     char drive[_MAX_DRIVE],dir[_MAX_DIR],fname[_MAX_FNAME],ext[_MAX_EXT];
  26.     char path[_MAX_PATH];
  27.     char buffer[512];
  28.     long pos,size;
  29.     size_t bytes;
  30.     FILE *bak;
  31.     int result=0;
  32.  
  33.     _splitpath(oldname,drive,dir,fname,ext);
  34.     _makepath(path,drive,dir,fname,".BAK");
  35.     bak=fopen(path,"wb");
  36.     if(bak)
  37.     {
  38.     result=1;
  39.         pos=ftell(f);
  40.         fseek(f,0L,SEEK_END);
  41.         size=ftell(f);
  42.         fseek(f,0L,SEEK_SET);
  43.     while(size)
  44.     {
  45.          bytes=size>sizeof(buffer)?sizeof(buffer):size;
  46.          if(fread(buffer,1,bytes,f)!=bytes)
  47.          {
  48.          fprintf(stderr,"Can not read from %s\n",oldname);
  49.          result=0;
  50.          break;
  51.          }
  52.          if(fwrite(buffer,1,bytes,bak)!=bytes)
  53.          {
  54.          fprintf(stderr,"Can not write to %s\n",path);
  55.          result=0;
  56.          break;
  57.          }
  58.          size-=bytes;
  59.     }
  60.     fclose(bak);
  61.         fseek(f,pos,SEEK_SET);
  62.     }
  63.     else
  64.     {
  65.     fprintf(stderr,"Can not create %s\n",path);
  66.     }
  67.     return result;
  68. }
  69.  
  70. int main(int argc,char *argv[])
  71. {
  72.     FILE *f;
  73.     int b,n,i,k,bb;
  74.     long w,h,zero,pos;
  75.     char drive[_MAX_DRIVE],dir[_MAX_DIR],fname[_MAX_FNAME],ext[_MAX_EXT];
  76.     char path[_MAX_PATH];
  77.  
  78.     for(b=i=1;i<argc;i++)
  79.     {
  80.     if(stricmp(argv[i],"/b")!=0&&stricmp(argv[i],"-b")!=0)
  81.     {
  82.         argv[b++]=argv[i];
  83.     }
  84.     }
  85.     if(b<2)
  86.     {
  87.     printf("ZAPRES - removes resolution information from Windows bitmap files - Version 1.1\n"
  88.            "M.Winterhoff, Geschw.-Scholl-Ring 17, 38444 Wolfsburg, Germany, CIS 100326,2776\n"
  89.            "\n"
  90.            "usage:    ZAPRES filename1[.BMP] filename2[.BMP] ...\n"
  91.            "\n"
  92.            "option: Normally ZAPRES will create a .BAK file before it attempts to modify\n"
  93.            "    the input file. Specify option /b if you don't want to backup files.\n"
  94.            "\n"
  95.            "This program removes the resolution information from Windows .BMP bitmaps, .MRB\n"
  96.            "multi resolution bitmaps, and .SHG segmented hotspot graphics. This way WinHelp\n"
  97.            "will not rescale the image and MRBC can be applied to specify a new resolution.\n"
  98.            "\n"
  99.            "This program is freeware. Use at your own risk. No part of it may be used\n"
  100.            "commercially. No fees may be charged on distributing.\n");
  101.     }
  102.     else for(i=1;i<b;i++)
  103.     {
  104.     _splitpath(argv[i],drive,dir,fname,ext);
  105.     if(!ext[0]) strcpy(ext,".BMP");
  106.     _makepath(path,drive,dir,fname,ext);
  107.     f=fopen(path,"r+b");
  108.     if(f)
  109.     {
  110.         n=getw(f);
  111.         if(n==0x4D42)
  112.         {
  113.         fseek(f,38L,SEEK_SET);
  114.         fread(&w,sizeof(long),1,f);
  115.         fread(&h,sizeof(long),1,f);
  116.         if(w==0&&h==0)
  117.         {
  118.             fprintf(stderr,"Resolution was already removed from %s\n",path);
  119.         }
  120.         else if(b<argc||backup(f,path))
  121.         {
  122.             fseek(f,38L,SEEK_SET);
  123.             zero=0;
  124.             fwrite(&zero,sizeof(long),1,f);
  125.             fwrite(&zero,sizeof(long),1,f);
  126.             fprintf(stderr,"Resolution %lux%lu (%ldx%ld dpi) removed from %s\n",w,h,(w*2)/79,(h*2)/79,path);
  127.         }
  128.         }
  129.         else if(n==0x506C||n==0x706C)
  130.         {
  131.         n=getw(f); /* number of bitmaps */
  132.                 bb=0;
  133.         for(k=0;k<n;k++)
  134.         {
  135.             fseek(f,4L+4*k,SEEK_SET);
  136.             fread(&pos,sizeof(pos),1,f);
  137.             fseek(f,pos,SEEK_SET);
  138.             switch(getc(f)) /* picture type */
  139.             {
  140.             case 5: /* DDB */
  141.             case 6: /* DIB */
  142.             getc(f); /* packing method ignored */
  143.             w=getw(f);
  144.             if(w&1) w|=(long)getw(f)<<16;
  145.             h=getw(f);
  146.             if(h&1) h|=(long)getw(f)<<16;
  147.             if(w/2==0&&h/2==0)
  148.             {
  149.                 fprintf(stderr,"Resolution was already removed from bitmap %u of %s\n",k,path);
  150.             }
  151.             else if(b<argc||bb||backup(f,path))
  152.             {
  153.                 fseek(f,pos+2,SEEK_SET);
  154.                 zero=w&1;
  155.                 fwrite(&zero,(w&1)+1,2,f);
  156.                 zero=h&1;
  157.                 fwrite(&zero,(h&1)+1,2,f);
  158.                 fprintf(stderr,"Resolution %lux%lu removed from bitmap %u of %s\n",w/2,h/2,k,path);
  159.                             bb=1;
  160.             }
  161.             }
  162.         }
  163.         }
  164.         else
  165.         {
  166.         fprintf(stderr,"%s is no valid Windows .BMP, .MRB, or .SHG file\n",path);
  167.         }
  168.         fclose(f);
  169.     }
  170.     else
  171.     {
  172.         fprintf(stderr,"Can not open %s\n",path);
  173.     }
  174.     }
  175.     return 0;
  176. }
  177.