
#include <stdio.h>
#include <string.h>
#include <glib.h>

/* #include "..\lib.h" */


int tiffl(int x, int y, char *fnam)
{
int    ern;
FILE   *fp;
char   ch2[2];
long   ifdoff, voff;
unsigned int    ifdn, dx, dy, pi;
unsigned int    i, j;
struct ifdt{
         int   tag;
         int   type;
         long  len;
         long  data;
         } ifd;
unsigned int    vramd;
unsigned n, offset;
int    ret;

   if ((fp = fopen(fnam, "r")) == NULL) { ern = -1; goto end; } /* file error */
   if (getw(fp) != 0x4949) { ern = -2; goto end; } /* ID error */
   getw(fp); /* dummy read */
   
   if (fread(&ifdoff, 4, 1, fp) == NULL) { ern = -3; goto end; }
   if (fseek(fp, ifdoff, SEEK_SET) != 0) { ern = -4; goto end; }
   if (fread(&ifdn,   2, 1, fp) == NULL) { ern = -5; goto end; }
   for (i = 1; i <= ifdn; i++) {
      if (fread(&ifd,   12, 1, fp) == NULL) { ern = -6; goto end; }
      if (ifd.tag == 0x0100) dx = ifd.data;
      if (ifd.tag == 0x0101) dy = ifd.data;
      if (ifd.tag == 0x0102) {
          pi = ifd.data;
          if (pi != 4) { ern = -7; goto end; } /* not color 16 */
      }
      if ((ifd.tag == 0x0103) && (ifd.data != 1)) { ern = -8; goto end; } /* not normal */
      if (ifd.tag == 0x0111) voff = ifd.data;
   }
   
   if (fseek(fp, voff, SEEK_SET) != 0) { ern = -9; goto end; }
   dy += y; dx += x;
   for (i = y; i < dy; i++) {
      for (j = x; j < dx;) {
         if (fread(&vramd, 2, 1, fp) == NULL) { ern = -10; goto end; }
         ret = GDS_pointColor(&GDS_data, vramd & 0x0f);
         ret = GDS_pointFirst(&GDS_data, j++, i);
         ret = GDS_pointColor(&GDS_data, (vramd >>= 4) & 0x0f);
         ret = GDS_pointFirst(&GDS_data, j++, i);
         ret = GDS_pointColor(&GDS_data, (vramd >>= 4) & 0x0f);
         ret = GDS_pointFirst(&GDS_data, j++, i);
         ret = GDS_pointColor(&GDS_data, (vramd >>= 4));
         ret = GDS_pointFirst(&GDS_data, j++, i);
         ret = GDS_outputGraph(&GDS_data, &n, &offset);
         ret = GDS_resetData(&GDS_data);
      }
   }
   ern = 0;
end:;
   fclose(fp);
   return(ern);
}

