blob: b3ade2e91731220535104aa9d69f6fd88c7edf26 [file] [log] [blame]
/*************************************************************************/
/* */
/* Copyright (c) 1994 Stanford University */
/* */
/* All rights reserved. */
/* */
/* Permission is given to use, copy, and modify this software for any */
/* non-commercial purpose as long as this copyright notice is not */
/* removed. All other uses, including redistribution in whole or in */
/* part, are forbidden without prior written permission. */
/* */
/* This software is provided with absolutely no warranty and no */
/* support. */
/* */
/*************************************************************************/
#include "tiff_rgba_io.h"
#include <stdio.h>
#include <unistd.h>
#include <malloc.h>
#include <stdlib.h>
typedef short SHORT;
typedef long LONG;
typedef char CHAR;
typedef int INT;
typedef float REAL;
typedef void VOID;
typedef unsigned short USHORT;
typedef unsigned char BYTE;
typedef unsigned char BOOL;
typedef unsigned char UCHAR;
typedef unsigned int UINT;
typedef unsigned long ULONG;
#define FALSE 0
#define TRUE 1
typedef struct
{
SHORT sFileType; /* Mark what kind of file we have. */
SHORT sBpp; /* Bits per pixel, 1, 4, 8, 24, 32. */
SHORT sRows; /* Up to 1024. */
SHORT sCols; /* Up to 1024. */
SHORT sVectorType; /* So far, 0 = rectangular blocks. */
SHORT sVectorSize; /* So far, 16 for 4x4 square blocks. */
LONG lCntVectors; /* Up to 65536. */
SHORT sBrows; /* Number of block rows. */
SHORT sBcols; /* Number of block cols. */
SHORT sVrows; /* Number of vector rows. */
SHORT sVcols; /* Number of vector cols. */
CHAR achReserved[104]; /* Pad variable space to 128 bytes. */
CHAR achUser[128]; /* User application space. */
CHAR achComment[256]; /* Rest of 1st block for comments. */
}
ISPHDR;
typedef struct
{
USHORT usRes1;
USHORT usRes2;
USHORT usRes3;
USHORT usRes4;
USHORT usRes5;
USHORT usRes6;
USHORT usResX;
USHORT usResY;
USHORT usRes7;
}
TGAHDR;
typedef struct
{
BYTE b;
BYTE g;
BYTE r;
}
TGAPIX;
typedef struct
{
BYTE r;
BYTE g;
BYTE b;
BYTE count;
}
SPAPIX;
/*
USHORT ausBase[] =
{
HST_BASE2,
HST_BASE1,
HST_BASE0
};
*/
CHAR *pchProgName = "rltotiff"; /* The program name. */
BOOL fFirst = TRUE; /* TRUE if processing first file. */
BOOL fCenter = FALSE; /* TRUE if -c option specified. */
BOOL fDebug = FALSE; /* TRUE if -D option specified. */
BOOL fFlipBytes = FALSE; /* TRUE if -f option specified. */
BOOL fMerge = FALSE; /* TRUE if -m option specified. */
BOOL fIspFmt = FALSE; /* TRUE if -I option specified. */
BOOL fPaulsFmt = FALSE; /* TRUE if -P option specified. */
BOOL fRleFmt = FALSE; /* TRUE if -R option specified. */
BOOL fSingleScr = FALSE; /* TRUE if -s option specified. */
BOOL fSpachFmt = FALSE; /* TRUE if -S option specified. */
BOOL fTranspose = FALSE; /* TRUE if -t option specified. */
INT iCntResX = 0;
INT iCntResY = 0;
INT iOffsetX = 0;
INT iOffsetY = 0;
REAL rGamma = 1.0;
INT iCntDcX = 1024;
INT iCntDcY = 768;
INT iCntDcR = 256;
INT iCntDcG = 256;
INT iCntDcB = 256;
ISPHDR ih; /* ISP header buffer. */
TGAHDR th; /* TGA header buffer. */
SPAPIX sp; /* Spach pixel buffer. */
TGAPIX tp; /* TGA pixel buffer. */
static int *gbRGBA;
static int gbWidth;
static int gbHeight;
static int gbUseCurrentDim;
VOID ProcessSpachFile(FILE *pf, CHAR *pchFileName);
void configRGBABuf(void);
void SetPixel24(INT i, INT j, BYTE r, BYTE g, BYTE b);
main(int argc, char **argv)
{
FILE *fp;
char *spachfile, *tiffile;
if (argc < 3) {
fprintf(stderr, "spachtotiff <infile> <outfile>\n");
exit(1);
}
spachfile = argv[1];
tiffile = argv[2];
fp = fopen(spachfile, "rb");
if (!fp) {
fprintf(stderr, "spachtotiff: could not open file %s\n", spachfile);
exit(1);
}
ProcessSpachFile(fp, spachfile);
tiff_save_rgba(tiffile, gbRGBA, gbWidth, gbHeight);
}
void
configRGBABuf()
{
gbRGBA = (int *)malloc(gbWidth*gbHeight*sizeof(int));
}
void
SetPixel24(INT i, INT j, BYTE r, BYTE g, BYTE b)
{
if (i+j*gbWidth >= gbWidth*gbHeight)
fprintf(stderr, "Bug!\n");
gbRGBA[i+(gbHeight-j-1)*gbWidth] =
((UINT)r)*256*256 + ((UINT)g)*256 + ((UINT)b);
}
/*
* NAME
* ProcessSpachFile - process the file data as needed
*
* SYNOPSIS
* VOID ProcessSpachFile(pf)
* FILE *pf; // Pointer to stream FILE handle.
* CHAR *pchFileName; // Pointer to filename.
*
* RETURNS
* Nothing.
*/
VOID ProcessSpachFile(FILE *pf, CHAR *pchFileName)
{
INT i;
INT j;
INT k;
INT count;
UINT ui, ui2, ui_low, ui_high;
UINT c1, c2, c3, c4, c5, c6;
LONG lPixCnt;
ui = getc(pf);
ui = getc(pf);
ui = getc(pf);
iCntResX = ui*256 + (UINT)getc(pf);
ui = getc(pf);
ui = getc(pf);
ui = getc(pf);
iCntResY = ui*256 + (UINT)getc(pf);
gbWidth = iCntResX;
gbHeight = iCntResY;
lPixCnt = (ULONG)iCntResX*(ULONG)iCntResY;
configRGBABuf();
if (fCenter)
{
iOffsetX = (iCntDcX - iCntResX)/2;
iOffsetY = (iCntDcY - iCntResY)/2;
}
for (i = 0, j = 0; lPixCnt > 0; lPixCnt -= count)
{
if (fread(&sp, 1, sizeof(sp), pf) != sizeof(sp))
{
fprintf(stderr, "%s: Unexpected EOF in file \"%s\".\n", pchProgName, pchFileName);
exit(1);
}
count = (UINT)sp.count + 1;
for (k = 0; k < count; k++, i++)
{
if (i >= iCntResX)
{
i = 0;
j++;
}
if (fDebug)
printf("%d\t%d\t0x%02X\t0x%02X\t0x%02X\t0x%02X\n",
i, j, sp.count, sp.r, sp.g, sp.b);
SetPixel24(i, j, sp.r, sp.g, sp.b);
}
}
}