1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
|
//-----------------------------------------------------------------------------
//
// ImageLib Source Example
// Copyright (C) 2000-2001 by Denton Woods
// Last modified: 09/06/2001 <--Y2K Compliant! =]
//
// Filename: examples/file override/file override.c
//
// Description: An example of overriding the DevIL reading and
// writing functions via ilSetRead and ilSetWrite.
//
//-----------------------------------------------------------------------------
// Required include files.
#include <IL/il.h>
#include <IL/ilu.h>
#include <stdio.h>
ILHANDLE ILAPIENTRY iOpenRead(const char *FileName)
{
return (ILHANDLE)fopen(FileName, "rb");
}
ILvoid ILAPIENTRY iCloseRead(ILHANDLE Handle)
{
fclose((FILE*)Handle);
return;
}
ILHANDLE ILAPIENTRY iOpenWrite(const char *FileName)
{
return (ILHANDLE)fopen(FileName, "wb");
}
ILvoid ILAPIENTRY iCloseWrite(ILHANDLE Handle)
{
fclose((FILE*)Handle);
return;
}
ILboolean ILAPIENTRY iEof(ILHANDLE Handle)
{
return (feof((FILE*)Handle) != 0);
}
ILint ILAPIENTRY iGetc(ILHANDLE Handle)
{
return fgetc((FILE*)Handle);
}
ILint ILAPIENTRY iPutc(ILubyte Char, ILHANDLE Handle)
{
return fputc(Char, (FILE*)Handle);
}
ILint ILAPIENTRY iRead(ILvoid *Buffer, ILuint Size, ILuint Number, ILHANDLE Handle)
{
return fread(Buffer, Size, Number, (FILE*)Handle);
}
ILint ILAPIENTRY iWrite(const ILvoid *Buffer, ILuint Size, ILuint Number, ILHANDLE Handle)
{
return fwrite(Buffer, Size, Number, (FILE*)Handle);
}
ILint ILAPIENTRY iReadSeek(ILHANDLE Handle, ILint Offset, ILint Mode)
{
return fseek((FILE*)Handle, Offset, Mode);
}
ILint ILAPIENTRY iWriteSeek(ILHANDLE Handle, ILint Offset, ILint Mode)
{
return fseek((FILE*)Handle, Offset, Mode);
}
ILint ILAPIENTRY iReadTell(ILHANDLE Handle)
{
return ftell((FILE*)Handle);
}
ILint ILAPIENTRY iWriteTell(ILHANDLE Handle)
{
return ftell((FILE*)Handle);
}
int main(int argc, char **argv)
{
ILuint ImgId;
ILenum Error;
// We use the filename specified in the first argument of the command-line.
if (argc < 2) {
printf("Please specify a file to open.\n");
return 1;
}
// Check if the shared lib's version matches the executable's version.
if (ilGetInteger(IL_VERSION_NUM) < IL_VERSION ||
iluGetInteger(ILU_VERSION_NUM) < ILU_VERSION) {
printf("DevIL version is different...exiting!\n");
return 2;
}
// Initialize DevIL.
ilInit();
// Generate the main image name to use.
ilGenImages(1, &ImgId);
// Bind this image name.
ilBindImage(ImgId);
// Override the reading functions.
ilSetRead(iOpenRead, iCloseRead, iEof, iGetc, iRead, iReadSeek, iReadTell);
ilSetWrite(iOpenWrite, iCloseWrite, iPutc, iWriteSeek, iWriteTell, iWrite);
// Loads the image specified by File into the image named by ImgId.
if (!ilLoadImage(argv[1])) {
printf("Could not open file...exiting.\n");
return 3;
}
// Display the image's dimensions to the end user.
printf("Width: %d Height: %d Depth: %d Bpp: %d\n", ilGetInteger(IL_IMAGE_WIDTH),
ilGetInteger(IL_IMAGE_HEIGHT), ilGetInteger(IL_IMAGE_DEPTH), ilGetInteger(IL_IMAGE_BYTES_PER_PIXEL));
// Enable this to let us overwrite the destination file if it already exists.
ilEnable(IL_FILE_OVERWRITE);
// If argv[2] is present, we save to this filename, else we save to test.tga.
if (argc > 2)
ilSaveImage(argv[2]);
else
ilSaveImage("test.tga");
// Reset the reading / writing functions when we're done loading specially.
// This isn't required here, since we're exiting, but here's how it's done:
ilResetRead();
ilResetWrite();
// We're done with the image, so let's delete it.
ilDeleteImages(1, &ImgId);
// Simple Error detection loop that displays the Error to the user in a human-readable form.
while ((Error = ilGetError())) {
printf("Error: %s\n", iluErrorString(Error));
}
return 0;
}
|