File: DevIL-MFC.cpp

package info (click to toggle)
devil 1.6.7-5%2Betch1
  • links: PTS
  • area: main
  • in suites: etch
  • size: 11,536 kB
  • ctags: 7,441
  • sloc: ansic: 35,573; sh: 8,075; cpp: 7,465; pascal: 792; makefile: 399; python: 47
file content (130 lines) | stat: -rw-r--r-- 3,615 bytes parent folder | download | duplicates (4)
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
//-----------------------------------------------------------------------------
//
// DevIL MFC Sources
// Copyright (C) 2000-2002 by Denton Woods
// Last modified: 02/07/2002 <--Y2K Compliant! =]
//
// Filename: mfc/devil-mfc.cpp
//
// Description: MFC CBitmap loading routines
//
//-----------------------------------------------------------------------------

#include "stdafx.h"
#include "DevIL-MFC.h"


// Basic Palette struct
typedef struct ILpal
{
	ILubyte	*Palette;		// the image palette (if any)
	ILuint	PalSize;		// size of the palette (in bytes)
	ILenum	PalType;		// the palette types below (0x0500 range)
} ILpal;


// The Fundamental Image struct
typedef struct ILimage
{
	ILuint	Width;				// the image's width
	ILuint	Height;				// the image's height
	ILuint	Depth;				// the image's depth
	ILubyte	Bpp;				// bytes per pixel (now number of channels)
	ILubyte	Bpc;				// bytes per channel
	ILuint	Bps;				// bytes per scanline (components for IL)
	ILubyte	*Data;				// the image data
	ILuint	SizeOfData;			// the total size of the data (in bytes)
	ILuint	SizeOfPlane;		// SizeOfData in a 2d image, size of each plane slice in a 3d image (in bytes)
	ILenum	Format;				// image format (in IL enum style)
	ILenum	Type;				// image type (in IL enum style)
	ILenum	Origin;				// origin of the image
	ILpal	Pal;				// palette details
	ILuint	Duration;			// length of the time to display this "frame"
	ILenum	CubeFlags;			// cube map flags for sides present in chain
	struct	ILimage *Mipmaps;	// mipmapped versions of this image terminated by a NULL - usu. NULL
	struct	ILimage *Next;		// next image in the chain - usu. NULL
	struct	ILimage *Layers;	// subsequent layers in the chain - usu. NULL
	ILuint	NumNext;			// number of images following this one (0 when not parent)
	ILuint	NumMips;			// number of mipmaps (0 when not parent)
	ILuint	NumLayers;			// number of layers (0 when not parent)
	ILuint	*AnimList;			// animation list
	ILuint	AnimSize;			// animation list size
	ILvoid	*Profile;			// colour profile
	ILuint	ProfileSize;		// colour profile size
	ILuint	OffX, OffY;			// offset of the image
} ILimage;

ILAPI ILimage*	ILAPIENTRY iConvertImage(ILenum DestFormat, ILenum DestType);
ILAPI ILubyte*	ILAPIENTRY iGetPaddedData(ILimage *Image);
ILAPI ILimage*	ILAPIENTRY ilGetCurImage(ILvoid);
ILAPI ILvoid	ILAPIENTRY ilCloseImage(ILimage *Image);
ILAPI ILvoid	ILAPIENTRY iBindImageTemp(ILvoid);


CBitmap *ilutConvertToCBitmap()
{
	CBitmap	*Bmp = NULL;
	ILubyte	*Data = NULL;
	ILimage	*Image = NULL, *MfcCurImage = NULL;

	Bmp = new CBitmap;
	if (Bmp == NULL)
		return NULL;

	MfcCurImage = ilGetCurImage();
	if (MfcCurImage == NULL) {
		return NULL;
	}

	if (MfcCurImage->Format == IL_BGRA && MfcCurImage->Format == IL_UNSIGNED_BYTE) {
		Image = MfcCurImage; 
	}
	else if (MfcCurImage->Format == IL_BGRA || MfcCurImage->Format == IL_RGBA) {
		Image = iConvertImage(IL_BGRA, IL_UNSIGNED_BYTE);
		if (Image == NULL) {
			delete Bmp;
			return NULL;
		}
	}
	else {
		Image = iConvertImage(IL_BGR, IL_UNSIGNED_BYTE);
		if (Image == NULL) {
			delete Bmp;
			return NULL;
		}
	}

	Data = iGetPaddedData(Image);
	if (Data == NULL) {
		if (Image != MfcCurImage)
			ilCloseImage(Image);
		delete Bmp;
		return NULL;
	}

	if (!Bmp->CreateBitmap(Image->Width, Image->Height, 1, Image->Bpp << 3, Image->Data)) {
		if (Image != MfcCurImage)
			ilCloseImage(Image);
		free(Data);
		delete Bmp;
		return NULL;
	}

	return Bmp;
}


CBitmap *ilutMFCLoadImage(const ILstring FileName)
{
	CBitmap *Bmp;

	iBindImageTemp();
	if (!ilLoadImage(FileName))
		return NULL;

	Bmp = ilutConvertToCBitmap();

	return Bmp;
}