- pluginsystem_src.zip
- defmaker.exe
- defmaker
- DLL+EXE
- BMPParser
- Host.dsw
- Host.sln
- Host
- HostExe.dsp
- HostExe.vcproj
- Main.cpp
- Release
- BMPParser.imp
- Host.dll
- HostExe.exe
- TGAParser.imp
- TGAParser
- EXE
- BMPParser
- Host.cpp
- Host.dsp
- Host.dsw
- Host.h
- Host.sln
- Host.vcproj
- ImageParser
- Release
- BMPParser.imp
- Host.exe
- TGAParser.imp
- TGAParser
- Interface
- readme.rtf
- TestImage1.bmp
- TestImage2.tga
- pluginsystem_src-noexe.zip
- readme.rtf
- TestImage1.bmp
- TestImage2.tga
|
// TGAParser.cpp - a very simple TGA file parser
//
// Part of the Plugin System tutorial
//
///////////////////////////////////////////////////////////////////////////////
#include <windows.h>
#include <stdio.h>
#include "..\Host.h"
#include "..\ImageParser\ImageParser.h"
// CTGAParser inherits from CImageParser
class CTGAParser: public CImageParser
{
public:
virtual HBITMAP ParseFile( const char *fname );
virtual bool SupportsType( const char *type ) const;
};
// Parses a TGA file
HBITMAP CTGAParser::ParseFile( const char *fname )
{
FILE *f=fopen(fname,"rb");
if (!f) return NULL;
// Targa header structure
#pragma pack(push,1)
struct TGAHeader
{
unsigned char idFieldLength;
unsigned char colorMapType;
unsigned char imageType;
unsigned short firstColorMapEntry;
unsigned short colorMapLength;
unsigned char colorMapEntrySize;
unsigned short xOrigin;
unsigned short yOrigin;
unsigned short width;
unsigned short height;
unsigned char bitsPerPixel;
unsigned char descriptorBits;
};
#pragma pack(pop)
TGAHeader header;
fread(&header,sizeof(header),1,f);
int width=header.width;
int height=header.height;
if (header.imageType&8) {
// compressed images are not supported
fclose(f);
return NULL;
}
if (header.bitsPerPixel!=24) {
// only 24 bit images are supported
fclose(f);
return NULL;
}
// create the HBITMAP
void *data;
HBITMAP bitmap=CreateBitmap(width,(header.descriptorBits&32)?-height:height,&data);
if (!bitmap) {
fclose(f);
return NULL;
}
// read the pixels
int pitch=(width*3+3)&~3;
char *ptr=(char*)data;
fseek(f,ftell(f)+header.idFieldLength,SEEK_SET);
for (int y=0;y<height;y++,ptr+=pitch)
fread(ptr,width,3,f);
fclose(f);
return bitmap;
}
// Notifies the host that the plugin supports the TGA type
bool CTGAParser::SupportsType( const char *type ) const
{
return stricmp(type,".tga")==0;
}
static CTGAParser g_TGAParser;
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.
Ivo started programming in 1985 on an Apple ][ clone. He graduated from Sofia University, Bulgaria with a MSCS degree. Ivo has been working as a professional programmer for over 12 years, and as a professional game programmer for over 10. He is currently employed in Pandemic Studios, a video game company in Los Angeles, California.