home *** CD-ROM | disk | FTP | other *** search
/ Photo CD Demo 1 / Demo.bin / gle / gle / dviwp.c < prev    next >
C/C++ Source or Header  |  1992-11-29  |  4KB  |  210 lines

  1. #define XSIZECM 24        /* at 120 DPI  */
  2. #define YSIZECM 24        /* at 72 DPI */
  3. #define NXBITS 200
  4. #define NYBITS 200
  5. #include "bitmap.h"
  6. extern char outbitname[];
  7. extern int fittobit;
  8. dvitype(void)
  9. {
  10.     fittobit = true;
  11.     printf("Adding TIFF, Include the EPF file into WordPerfect.");
  12.     strlwr(outbitname);
  13.     if (strlen(outbitname)==0) {
  14.         printf("You must give the name of the gle file.\n");
  15.         abort();
  16.     }
  17.     if (strstr(outbitname,".")!=0) {
  18.         * strchr(outbitname,'.') = 0;
  19.     }
  20.     strcat(outbitname,".epf");
  21. }
  22. /* tiff stuff starts here */
  23.  
  24. long sa(long a);
  25. long ss(char *s);
  26. long sw(int x);
  27. long sl(long x);
  28. long read_eps(char *fname,FILE *tf);
  29. int sendmem(char *s, long j);
  30. int setl(long p, long x);
  31. int setw(long p, int x);
  32.  
  33. long tcnt; /* current byte position */
  34. extern FILE *outbit;
  35. FILE *tf;
  36. int addeps=true;
  37. long tstart;
  38. bitmap_print()
  39. {
  40.     /* 1=byte, 2=ascii, 3=short, 4=long, 5=rational */
  41.     char fname[80];
  42.     long strip1,entrycount,stripoffsets,stripbcounts,ifd;
  43.     long datep,datelen,namep,namelen,i,j;
  44.     long h_ps,h_pslen,h_tiff,h_tifflen;
  45.  
  46.     tf = outbit; /* output file handle */
  47.  
  48.     if (addeps) {
  49.         sw(0xd0c5); sw(0xc6d3);
  50.         h_ps = sl(0);
  51.         h_pslen = sl(0);
  52.         sl(0); sl(0);
  53.         h_tiff = sl(0);
  54.         h_tifflen = sl(0);
  55.         sw(0xffff);
  56.  
  57.         setl(h_ps,sa(tcnt));
  58.         i = tcnt;
  59.         tcnt += read_eps(outbitname,tf);
  60.         setl(h_pslen,tcnt-i);
  61.     }
  62.  
  63.  
  64.     tstart = sw(0x4949); /* byte order  4d 4d */
  65.     sw(0x002a);
  66.     ifd = sl(0x0000);
  67.     entrycount = sw(0);
  68.     setl(ifd,sa(entrycount));
  69.     sw(0xff); sw(3); sl(1); sw(1);  sw(0);        /* subfiletype */
  70.     sw(0x100); sw(3); sl(1); sl(nxbits);     /* image width */
  71.     sw(0x101); sw(3); sl(1); sl(nybits);          /* image length */
  72.     sw(0x102); sw(3); sl(1); sw(1); sw(0);  /* bits per sample */
  73.     sw(0x103); sw(3); sl(1); sw(1); sw(0);    /* no compression */
  74.     sw(0x106); sw(3); sl(1); sw(1); sw(0);  /* black and white */
  75.     sw(0x111); sw(4); sl(1); stripoffsets = sl(0); /* offsets to image data */
  76.     sw(0x11c); sw(3); sl(1); sw(1); sw(0); /* planar config */
  77.     sw(0x131); sw(2); namelen = sl(1); namep = sl(0); /* Name  */
  78.     sl(0); /* end of table  */
  79.     setw(entrycount,9);
  80.     strip1 = tcnt;
  81.     send_image();
  82.     setl(stripoffsets,sa(strip1));
  83.  
  84.     namelen = strlen("GLE Tiff output.");
  85.     setl(namep,sa(ss("GLE Tiff output.")));
  86.  
  87.     if (addeps) {
  88.         setl(h_tiff,tstart);
  89.         setl(h_tifflen,tcnt-tstart);
  90.     }
  91.  
  92.     fclose(tf);
  93.  
  94. }
  95. unsigned char swapbit[256];
  96. send_image()
  97. {
  98.     int y;
  99.     unsigned char swapnib[16]={0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15};
  100.     unsigned char *o,c;
  101.     int i,n1,n2;
  102.  
  103.     printf("Writing out TIFF image \n");
  104.     for (i=0;i<256;i++) {
  105.         n1 = i & 0xf;
  106.         n2 = (i >> 4) & 0xf;
  107.         swapbit[i] = swapnib[n2] | (swapnib[n1] << 4);
  108.     }
  109.  
  110.  
  111.     for (y=nybits-1 ; y>=0 ; y-=1)
  112.         print_row(y);
  113. }
  114. print_row(int y)
  115. {
  116.     unsigned char savechar,temp;
  117.     static unsigned char out_buff[NXBITS+10];
  118.     unsigned int r,i,j,newy,x,z;
  119.     unsigned char *line;
  120.     out_buff[0] = 0;
  121.     line = bitmap_line(y);
  122.     for (i=0; i<nxbits/8; i++) {
  123.         out_buff[i] = swapbit[line[i]];
  124.     }
  125.  
  126.     sendmem(out_buff,nxbits/8);
  127. }
  128.  
  129.  
  130. long sa(long a)
  131. {
  132.     return a-tstart;
  133. }
  134. long sw(int x)
  135. {
  136.     fwrite(&x,2,1,tf);
  137.     tcnt += 2;
  138.     return tcnt-2;
  139. }
  140. long ss(char *s)
  141. {
  142.     int i;
  143.  
  144.     i = strlen(s)+1;
  145.     if (i&1 == 1) i++;
  146.     fwrite(s,1,i,tf);
  147.     tcnt += i;
  148.     return tcnt-i;
  149. }
  150. sendmem(char *s, long j)
  151. {
  152.     fwrite(s,1,j,tf);
  153.     tcnt += j;
  154. }
  155. long sl(long x)
  156. {
  157.     fwrite(&x,4,1,tf);
  158.     tcnt += 4;
  159.     return tcnt-4;
  160. }
  161. setl(long p, long x)
  162. {
  163.     if (fseek(tf,p,SEEK_SET)!=0)  printf("Seekl failed, %ld %ld\n",p,tcnt);
  164.     fwrite(&x,4,1,tf);
  165.     if (fseek(tf,tcnt,SEEK_SET)!=0) printf("Seekl eof failed, %ld \n",p);
  166. }
  167. setw(long p, int x)
  168. {
  169.     if (fseek(tf,p,SEEK_SET)!=0) printf("Seekw failed, %ld  %ld\n",p,tcnt);
  170.     fwrite(&x,2,1,tf);
  171.     if (fseek(tf,tcnt,SEEK_SET)!=0) printf("Seekw eof failed, %ld \n",p);
  172. }
  173.  
  174. long read_eps(char *fname,FILE *tf)
  175. {
  176.     FILE *eps;
  177.     static char buff[1002];
  178.     char *s;
  179.     long tot=0;
  180.     int n;
  181.  
  182.     strcpy(buff,fname);
  183.     s = strchr(buff,'.');
  184.     if (s!=NULL) *s = 0;
  185.     strcat(buff,".eps");
  186.  
  187. #ifdef ultrix
  188.     eps = fopen(buff,"r");
  189. #else
  190.     eps = fopen(buff,"rb");
  191. #endif
  192.     if (eps==NULL) {
  193.         printf("Unable to open {%s}, you must PSGLE /EPS first\n",buff);\
  194.         abort();
  195.     }
  196.  
  197.     for (;!feof(eps);) {
  198.       n = fread(buff,1,1000,eps);
  199.       if (n>0) {
  200.         fwrite(buff,1,n,tf);
  201.         tot += n;
  202.       }
  203.     }
  204.     buff[0] = 13; buff[1] = 10; buff[2] = 0;
  205.     if (tot&1 == 1) {fwrite(" ",1,1,tf); tot++;}
  206.     fwrite(buff,1,2,tf); tot+=2;
  207.     return tot;
  208. }
  209.  
  210.