213 lines
8.2 KiB
C
213 lines
8.2 KiB
C
//___________________________________________________________________________________________________________nFO
|
|
// "tiff-export.c" - tiff export [will be saved to an uncompressed tiff].
|
|
//
|
|
// NOTE: was hacked together after analyzing some tiff files with HexEdit and Tiffy.
|
|
//
|
|
// Written by: Axel "awe" Wefers [mailto:awe@fruitz-of-dojo.de].
|
|
//
|
|
//
|
|
// Part of the "Hagane Engine v2.0".
|
|
//
|
|
// Copyright (c) 2001-2002 Fruitz Of Dojo. All rights reserved.
|
|
//______________________________________________________________________________________________________iNCLUDES
|
|
|
|
#pragma mark =Includes=
|
|
|
|
#include "quakedef.h"
|
|
|
|
#pragma mark -
|
|
|
|
//_________________________________________________________________________________________________________eNUMS
|
|
|
|
#pragma mark =Enums=
|
|
|
|
enum {
|
|
TIF_BYTE = 1,
|
|
TIF_ASCII,
|
|
TIF_SHORT,
|
|
TIF_LONG,
|
|
TIF_RATIONAL
|
|
};
|
|
|
|
#pragma mark -
|
|
|
|
//_______________________________________________________________________________________________________dEFINES
|
|
|
|
#pragma mark =Defines=
|
|
|
|
#ifdef __BIG_ENDIAN__
|
|
|
|
#define TIF_ENDIANESS { 0x4D, 0x4D, 0x00, 0x2A }
|
|
|
|
#else
|
|
|
|
#define TIF_ENDIANESS { 0x49, 0x49, 0x2A, 0x00 }
|
|
|
|
#endif /* __BIG_ENDIAN__ */
|
|
|
|
#define TIF_IFD_OFFSET 0x0000001E
|
|
#define TIF_NUM_TAGS 0x000E
|
|
#define TIF_SUBFILE_TYPE 0x00000000
|
|
#define TIF_BITS_PER_SAMPLE { 8, 8, 8}
|
|
#define TIF_SAMPLES_PER_PIXEL 3
|
|
#define TIF_SAMPLE_OFFSET 0x0018
|
|
#define TIF_COMPRESSION 0x0001
|
|
#define TIF_PHOTOMETRIC 0x0002
|
|
#define TIF_STRIP_OFFSETS 0x000000CC
|
|
#define TIF_RESOLUTION_X_OFFSET 8
|
|
#define TIF_RESOLUTION_Y_OFFSET 16
|
|
#define TIF_RESOLUTION_X { 72, 1 }
|
|
#define TIF_RESOLUTION_Y { 72, 1 }
|
|
#define TIF_PLANAR_CONFIGURATION 1
|
|
#define TIF_RESOLUTION_UNIT 2
|
|
#define TIF_BLANK_TAG { \
|
|
0x00, 0x00, 0x00, 0x00, \
|
|
0x00, 0x00, 0x00, 0x00, \
|
|
0x00, 0x00, 0x00, 0x00 \
|
|
}
|
|
|
|
#define TIF_TAG_SUBFILE_TYPE 0x00FE
|
|
#define TIF_TAG_IMAGE_WIDTH 0x0100
|
|
#define TIF_TAG_IMAGE_HEIGHT 0x0101
|
|
#define TIF_TAG_BITS_PER_SAMPLE 0x0102
|
|
#define TIF_TAG_COMPRESSION 0x0103
|
|
#define TIF_TAG_PHOTOMETRIC 0x0106
|
|
#define TIF_TAG_STRIP_OFFSETS 0x0111
|
|
#define TIF_TAG_SAMPLES_PER_PIXEL 0x0115
|
|
#define TIF_TAG_ROWS_PER_STRIP 0x0116
|
|
#define TIF_TAG_STRIP_BYTE_COUNTS 0x0117
|
|
#define TIF_TAG_RESOLUTION_X 0x011A
|
|
#define TIF_TAG_RESOLUTION_Y 0x011B
|
|
#define TIF_TAG_PLANAR_CONFIGURATION 0x011C
|
|
#define TIF_TAG_RESOLUTION_UNIT 0x0128
|
|
|
|
#pragma mark -
|
|
|
|
//_____________________________________________________________________________________________________cONSTANTS
|
|
|
|
#pragma mark =Constants=
|
|
|
|
const unsigned char cTifEndianHeader[4] = TIF_ENDIANESS,
|
|
cTifBlankTag[12] = TIF_BLANK_TAG;
|
|
const unsigned short cTifBitsPerSample[3] = TIF_BITS_PER_SAMPLE,
|
|
cTifNumTags = TIF_NUM_TAGS,
|
|
cTifCompression = TIF_COMPRESSION,
|
|
cTifPhotometric = TIF_PHOTOMETRIC,
|
|
cTifSamplesPerPixel = TIF_SAMPLES_PER_PIXEL,
|
|
cTifPlanarConfig = TIF_PLANAR_CONFIGURATION,
|
|
cTifResolutionUnit = TIF_RESOLUTION_UNIT;
|
|
const unsigned int cTifIfdOffset = TIF_IFD_OFFSET,
|
|
cTifResolutionX[2] = TIF_RESOLUTION_X,
|
|
cTifResolutionY[2] = TIF_RESOLUTION_Y,
|
|
cTifSampleOffset = TIF_SAMPLE_OFFSET,
|
|
cTifSubfileType = TIF_SUBFILE_TYPE,
|
|
cTifStripOffsets = TIF_STRIP_OFFSETS,
|
|
cTifResXOffset = TIF_RESOLUTION_X_OFFSET,
|
|
cTifResYOffset = TIF_RESOLUTION_Y_OFFSET;
|
|
|
|
#pragma mark -
|
|
|
|
//___________________________________________________________________________________________fUNCTION_pROTOTYPES
|
|
|
|
#pragma mark =Function Prototypes=
|
|
|
|
extern char * Sys_sprintf (char *theFormat, ...);
|
|
|
|
void TIF_WriteFile (char *theFileName, unsigned int theWidth, unsigned int theHeight,
|
|
unsigned char *theData);
|
|
|
|
static void TIF_WriteTag (int theFile, unsigned short theTagName, unsigned short theTagSize,
|
|
unsigned int theTagLength, const void (*theTagData));
|
|
|
|
#pragma mark -
|
|
|
|
//________________________________________________________________________________________________TIF_WriteTag()
|
|
|
|
void TIF_WriteTag (int theFile, unsigned short theTagName, unsigned short theTagSize,
|
|
unsigned int theTagLength, const void (*theTagData))
|
|
{
|
|
unsigned char mySize = 0;
|
|
|
|
Sys_FileWrite (theFile, &theTagName, sizeof (short));
|
|
Sys_FileWrite (theFile, &theTagSize, sizeof (short));
|
|
Sys_FileWrite (theFile, &theTagLength, sizeof (int));
|
|
|
|
switch (theTagSize)
|
|
{
|
|
case TIF_BYTE:
|
|
case TIF_ASCII:
|
|
mySize = sizeof (char);
|
|
break;
|
|
case TIF_SHORT:
|
|
mySize = sizeof (short);
|
|
break;
|
|
case TIF_LONG:
|
|
mySize = sizeof (int);
|
|
break;
|
|
case TIF_RATIONAL:
|
|
mySize = sizeof (float);
|
|
break;
|
|
}
|
|
|
|
if (theTagName == TIF_TAG_BITS_PER_SAMPLE)
|
|
{
|
|
mySize = sizeof (int);
|
|
}
|
|
|
|
Sys_FileWrite (theFile, (void *) theTagData, mySize);
|
|
Sys_FileWrite (theFile, (void *) cTifBlankTag, 12 - (sizeof (short) << 1) - (sizeof (int)) - mySize);
|
|
}
|
|
|
|
//_______________________________________________________________________________________________TIF_WriteFile()
|
|
|
|
void TIF_WriteFile (char *theFileName, unsigned int theWidth, unsigned int theHeight, unsigned char *theData)
|
|
{
|
|
char *myFileName = NULL;
|
|
int myFile;
|
|
unsigned int mySize = theWidth * theHeight * cTifSamplesPerPixel;
|
|
|
|
// get the file to write to:
|
|
myFileName = Sys_sprintf ("%s/%s", com_gamedir, theFileName);
|
|
myFile = Sys_FileOpenWrite (myFileName);
|
|
|
|
if (myFile == -1)
|
|
{
|
|
Sys_Printf ("TIF_WriteFile: failed on \"%s\"\n", myFileName);
|
|
return;
|
|
}
|
|
|
|
Sys_Printf ("TIF_WriteFile: %s\n", myFileName);
|
|
|
|
// write the header data:
|
|
Sys_FileWrite (myFile, (void *) cTifEndianHeader, sizeof (char) << 2);
|
|
Sys_FileWrite (myFile, (void *) &cTifIfdOffset, sizeof (int));
|
|
Sys_FileWrite (myFile, (void *) cTifResolutionX, sizeof (int) << 1);
|
|
Sys_FileWrite (myFile, (void *) cTifResolutionY, sizeof (int) << 1);
|
|
Sys_FileWrite (myFile, (void *) cTifBitsPerSample, sizeof (short) * 3);
|
|
Sys_FileWrite (myFile, (void *) &cTifNumTags, sizeof (short));
|
|
|
|
TIF_WriteTag (myFile, TIF_TAG_SUBFILE_TYPE, TIF_LONG, 1, &cTifSubfileType);
|
|
TIF_WriteTag (myFile, TIF_TAG_IMAGE_WIDTH, TIF_LONG, 1, &theWidth);
|
|
TIF_WriteTag (myFile, TIF_TAG_IMAGE_HEIGHT, TIF_LONG, 1, &theHeight);
|
|
TIF_WriteTag (myFile, TIF_TAG_BITS_PER_SAMPLE, TIF_SHORT, 3, &cTifSampleOffset);
|
|
TIF_WriteTag (myFile, TIF_TAG_COMPRESSION, TIF_SHORT, 1, &cTifCompression);
|
|
TIF_WriteTag (myFile, TIF_TAG_PHOTOMETRIC, TIF_SHORT, 1, &cTifPhotometric);
|
|
TIF_WriteTag (myFile, TIF_TAG_STRIP_OFFSETS, TIF_LONG, 1, &cTifStripOffsets);
|
|
TIF_WriteTag (myFile, TIF_TAG_SAMPLES_PER_PIXEL, TIF_SHORT, 1, &cTifSamplesPerPixel);
|
|
TIF_WriteTag (myFile, TIF_TAG_ROWS_PER_STRIP, TIF_LONG, 1, &theWidth);
|
|
TIF_WriteTag (myFile, TIF_TAG_STRIP_BYTE_COUNTS, TIF_LONG, 1, &mySize);
|
|
TIF_WriteTag (myFile, TIF_TAG_RESOLUTION_X, TIF_RATIONAL, 1, &cTifResXOffset);
|
|
TIF_WriteTag (myFile, TIF_TAG_RESOLUTION_Y, TIF_RATIONAL, 1, &cTifResYOffset);
|
|
TIF_WriteTag (myFile, TIF_TAG_PLANAR_CONFIGURATION, TIF_SHORT, 1, &cTifPlanarConfig);
|
|
TIF_WriteTag (myFile, TIF_TAG_RESOLUTION_UNIT, TIF_SHORT, 1, &cTifResolutionUnit);
|
|
|
|
Sys_FileWrite (myFile, (void *) cTifBlankTag, sizeof (char) << 2);
|
|
|
|
// write the bitmap data:
|
|
Sys_FileWrite (myFile, theData, mySize);
|
|
|
|
// good bye...
|
|
Sys_FileClose (myFile);
|
|
}
|
|
|
|
//___________________________________________________________________________________________________________eOF
|