~baltix/+junk/irrlicht-test

« back to all changes in this revision

Viewing changes to source/Irrlicht/CImageLoaderWAL.cpp

  • Committer: Mantas Kriaučiūnas
  • Date: 2011-07-18 13:06:25 UTC
  • Revision ID: mantas@akl.lt-20110718130625-c5pvifp61e7kj1ol
Included whole irrlicht SVN libraries to work around launchpad recipe issue with quilt, see https://answers.launchpad.net/launchpad/+question/165193

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// Copyright (C) 2004 Murphy McCauley
 
2
// Copyright (C) 2007-2011 Christian Stehno
 
3
// This file is part of the "Irrlicht Engine".
 
4
// For conditions of distribution and use, see copyright notice in irrlicht.h
 
5
 
 
6
#include "CImageLoaderWAL.h"
 
7
#include "CColorConverter.h"
 
8
#include "CImage.h"
 
9
#include "os.h"
 
10
#include "dimension2d.h"
 
11
#include "IVideoDriver.h"
 
12
#include "IFileSystem.h"
 
13
#include "IReadFile.h"
 
14
#include "irrString.h"
 
15
 
 
16
namespace irr
 
17
{
 
18
namespace video
 
19
{
 
20
 
 
21
// old implementation
 
22
#if 0
 
23
 
 
24
// May or may not be fully implemented
 
25
#define TRY_LOADING_PALETTE_FROM_FILE 0
 
26
 
 
27
// Default palette for Q2 WALs.
 
28
 
 
29
s32 CImageLoaderWAL::DefaultPaletteQ2[256] = {
 
30
0x000000L,0x0F0F0FL,0x1F1F1FL,0x2F2F2FL,0x3F3F3FL,0x4B4B4BL,0x5B5B5BL,0x6B6B6BL,0x7B7B7BL,0x8B8B8BL,0x9B9B9BL,
 
31
0xABABABL,0xBBBBBBL,0xCBCBCBL,0xDBDBDBL,0xEBEBEBL,0x634B23L,0x5B431FL,0x533F1FL,0x4F3B1BL,0x47371BL,0x3F2F17L,
 
32
0x3B2B17L,0x332713L,0x2F2313L,0x2B1F13L,0x271B0FL,0x23170FL,0x1B130BL,0x170F0BL,0x130F07L,0x0F0B07L,0x5F5F6FL,
 
33
0x5B5B67L,0x5B535FL,0x574F5BL,0x534B53L,0x4F474BL,0x473F43L,0x3F3B3BL,0x3B3737L,0x332F2FL,0x2F2B2BL,0x272727L,
 
34
0x232323L,0x1B1B1BL,0x171717L,0x131313L,0x8F7753L,0x7B6343L,0x735B3BL,0x674F2FL,0xCF974BL,0xA77B3BL,0x8B672FL,
 
35
0x6F5327L,0xEB9F27L,0xCB8B23L,0xAF771FL,0x93631BL,0x774F17L,0x5B3B0FL,0x3F270BL,0x231707L,0xA73B2BL,0x9F2F23L,
 
36
0x972B1BL,0x8B2713L,0x7F1F0FL,0x73170BL,0x671707L,0x571300L,0x4B0F00L,0x430F00L,0x3B0F00L,0x330B00L,0x2B0B00L,
 
37
0x230B00L,0x1B0700L,0x130700L,0x7B5F4BL,0x735743L,0x6B533FL,0x674F3BL,0x5F4737L,0x574333L,0x533F2FL,0x4B372BL,
 
38
0x433327L,0x3F2F23L,0x37271BL,0x2F2317L,0x271B13L,0x1F170FL,0x170F0BL,0x0F0B07L,0x6F3B17L,0x5F3717L,0x532F17L,
 
39
0x432B17L,0x372313L,0x271B0FL,0x1B130BL,0x0F0B07L,0xB35B4FL,0xBF7B6FL,0xCB9B93L,0xD7BBB7L,0xCBD7DFL,0xB3C7D3L,
 
40
0x9FB7C3L,0x87A7B7L,0x7397A7L,0x5B879BL,0x47778BL,0x2F677FL,0x17536FL,0x134B67L,0x0F435BL,0x0B3F53L,0x07374BL,
 
41
0x072F3FL,0x072733L,0x001F2BL,0x00171FL,0x000F13L,0x00070BL,0x000000L,0x8B5757L,0x834F4FL,0x7B4747L,0x734343L,
 
42
0x6B3B3BL,0x633333L,0x5B2F2FL,0x572B2BL,0x4B2323L,0x3F1F1FL,0x331B1BL,0x2B1313L,0x1F0F0FL,0x130B0BL,0x0B0707L,
 
43
0x000000L,0x979F7BL,0x8F9773L,0x878B6BL,0x7F8363L,0x777B5FL,0x737357L,0x6B6B4FL,0x636347L,0x5B5B43L,0x4F4F3BL,
 
44
0x434333L,0x37372BL,0x2F2F23L,0x23231BL,0x171713L,0x0F0F0BL,0x9F4B3FL,0x934337L,0x8B3B2FL,0x7F3727L,0x772F23L,
 
45
0x6B2B1BL,0x632317L,0x571F13L,0x4F1B0FL,0x43170BL,0x37130BL,0x2B0F07L,0x1F0B07L,0x170700L,0x0B0000L,0x000000L,
 
46
0x777BCFL,0x6F73C3L,0x676BB7L,0x6363A7L,0x5B5B9BL,0x53578FL,0x4B4F7FL,0x474773L,0x3F3F67L,0x373757L,0x2F2F4BL,
 
47
0x27273FL,0x231F2FL,0x1B1723L,0x130F17L,0x0B0707L,0x9BAB7BL,0x8F9F6FL,0x879763L,0x7B8B57L,0x73834BL,0x677743L,
 
48
0x5F6F3BL,0x576733L,0x4B5B27L,0x3F4F1BL,0x374313L,0x2F3B0BL,0x232F07L,0x1B2300L,0x131700L,0x0B0F00L,0x00FF00L,
 
49
0x23E70FL,0x3FD31BL,0x53BB27L,0x5FA72FL,0x5F8F33L,0x5F7B33L,0xFFFFFFL,0xFFFFD3L,0xFFFFA7L,0xFFFF7FL,0xFFFF53L,
 
50
0xFFFF27L,0xFFEB1FL,0xFFD717L,0xFFBF0FL,0xFFAB07L,0xFF9300L,0xEF7F00L,0xE36B00L,0xD35700L,0xC74700L,0xB73B00L,
 
51
0xAB2B00L,0x9B1F00L,0x8F1700L,0x7F0F00L,0x730700L,0x5F0000L,0x470000L,0x2F0000L,0x1B0000L,0xEF0000L,0x3737FFL,
 
52
0xFF0000L,0x0000FFL,0x2B2B23L,0x1B1B17L,0x13130FL,0xEB977FL,0xC37353L,0x9F5733L,0x7B3F1BL,0xEBD3C7L,0xC7AB9BL,
 
53
0xA78B77L,0x876B57L,0x9F5B53L
 
54
};
 
55
 
 
56
 
 
57
bool CImageLoaderWAL::isALoadableFileExtension(const io::path& filename) const
 
58
{
 
59
        return core::hasFileExtension ( filename, "wal" );
 
60
}
 
61
 
 
62
 
 
63
bool CImageLoaderWAL::isALoadableFileFormat(irr::io::IReadFile* file) const
 
64
{
 
65
        return (false); // no recognition possible, use a proper file ending
 
66
}
 
67
 
 
68
 
 
69
IImage* CImageLoaderWAL::loadImage(irr::io::IReadFile* file) const
 
70
{
 
71
        // Try to get the color palette from elsewhere (usually in a pak along with the WAL).
 
72
        // If this fails we use the DefaultPaletteQ2.
 
73
        static s32 * palette = 0;
 
74
#if TRY_LOADING_PALETTE_FROM_FILE
 
75
        s32 loadedPalette[256];
 
76
#endif
 
77
        if (!palette)
 
78
        {
 
79
#if TRY_LOADING_PALETTE_FROM_FILE
 
80
                IImage * paletteImage;
 
81
                // Look in a couple different places...
 
82
                paletteImage = createImageFromFile("pics/colormap.pcx");
 
83
                if (!paletteImage)
 
84
                        paletteImage = createImageFromFile("pics/colormap.tga");
 
85
                if (!paletteImage)
 
86
                        paletteImage = createImageFromFile("colormap.pcx");
 
87
                if (!paletteImage)
 
88
                        paletteImage = createImageFromFile("colormap.tga");
 
89
                if (paletteImage && (paletteImage->getDimension().Width == 256) ) {
 
90
                        palette = &loadedPalette;
 
91
                        for (u32 i = 0; i < 256; ++i) {
 
92
                                palette[i] = paletteImage->getPixel(i, 0).color;
 
93
                        }
 
94
                } else {
 
95
                        //FIXME: try reading a simple palette from "wal.pal"
 
96
                        palette = DefaultPaletteQ2;
 
97
                }
 
98
                if (paletteImage)
 
99
                        paletteImage->drop();
 
100
#endif
 
101
        }
 
102
        else
 
103
        {
 
104
                palette = DefaultPaletteQ2;
 
105
        }
 
106
 
 
107
        SWALHeader header;
 
108
 
 
109
        file->seek(0);
 
110
        if (file->read(&header, sizeof(SWALHeader)) != sizeof(SWALHeader) )
 
111
                return 0;
 
112
 
 
113
        if (file->getSize() < header.MipmapOffset[0])
 
114
                return 0;
 
115
        file->seek(header.MipmapOffset[0]);
 
116
 
 
117
        // read image
 
118
 
 
119
        const u32 imageSize = header.ImageHeight * header.ImageWidth;
 
120
        if (file->getSize() < (long)(imageSize + header.MipmapOffset[0]))
 
121
                return 0;
 
122
 
 
123
        u8* data = new u8[imageSize];
 
124
        file->read(data, imageSize);
 
125
 
 
126
        IImage* image = 0;
 
127
 
 
128
        image = new CImage(ECF_A1R5G5B5,
 
129
                core::dimension2d<u32>(header.ImageWidth, header.ImageHeight));
 
130
 
 
131
        // I wrote an 8 to 32 converter, but this works with released Irrlicht code.
 
132
        CColorConverter::convert8BitTo16Bit(data,
 
133
                (s16*)image->lock(), header.ImageWidth, header.ImageHeight, palette);
 
134
        image->unlock();
 
135
 
 
136
        delete [] data;
 
137
 
 
138
        return image;
 
139
}
 
140
 
 
141
 
 
142
IImageLoader* createImageLoaderWAL()
 
143
{
 
144
        return new irr::video::CImageLoaderWAL();
 
145
}
 
146
 
 
147
#endif
 
148
 
 
149
 
 
150
// Palette quake2 colormap.h, 768 byte, last is transparent
 
151
static const u32 colormap_h[256] = {
 
152
        0xFF000000,0xFF0F0F0F,0xFF1F1F1F,0xFF2F2F2F,0xFF3F3F3F,0xFF4B4B4B,0xFF5B5B5B,0xFF6B6B6B,
 
153
        0xFF7B7B7B,0xFF8B8B8B,0xFF9B9B9B,0xFFABABAB,0xFFBBBBBB,0xFFCBCBCB,0xFFDBDBDB,0xFFEBEBEB,
 
154
        0xFF0F0B07,0xFF170F0B,0xFF1F170B,0xFF271B0F,0xFF2F2313,0xFF372B17,0xFF3F2F17,0xFF4B371B,
 
155
        0xFF533B1B,0xFF5B431F,0xFF634B1F,0xFF6B531F,0xFF73571F,0xFF7B5F23,0xFF836723,0xFF8F6F23,
 
156
        0xFF0B0B0F,0xFF13131B,0xFF1B1B27,0xFF272733,0xFF2F2F3F,0xFF37374B,0xFF3F3F57,0xFF474767,
 
157
        0xFF4F4F73,0xFF5B5B7F,0xFF63638B,0xFF6B6B97,0xFF7373A3,0xFF7B7BAF,0xFF8383BB,0xFF8B8BCB,
 
158
        0xFF000000,0xFF070700,0xFF0B0B00,0xFF131300,0xFF1B1B00,0xFF232300,0xFF2B2B07,0xFF2F2F07,
 
159
        0xFF373707,0xFF3F3F07,0xFF474707,0xFF4B4B0B,0xFF53530B,0xFF5B5B0B,0xFF63630B,0xFF6B6B0F,
 
160
        0xFF070000,0xFF0F0000,0xFF170000,0xFF1F0000,0xFF270000,0xFF2F0000,0xFF370000,0xFF3F0000,
 
161
        0xFF470000,0xFF4F0000,0xFF570000,0xFF5F0000,0xFF670000,0xFF6F0000,0xFF770000,0xFF7F0000,
 
162
        0xFF131300,0xFF1B1B00,0xFF232300,0xFF2F2B00,0xFF372F00,0xFF433700,0xFF4B3B07,0xFF574307,
 
163
        0xFF5F4707,0xFF6B4B0B,0xFF77530F,0xFF835713,0xFF8B5B13,0xFF975F1B,0xFFA3631F,0xFFAF6723,
 
164
        0xFF231307,0xFF2F170B,0xFF3B1F0F,0xFF4B2313,0xFF572B17,0xFF632F1F,0xFF733723,0xFF7F3B2B,
 
165
        0xFF8F4333,0xFF9F4F33,0xFFAF632F,0xFFBF772F,0xFFCF8F2B,0xFFDFAB27,0xFFEFCB1F,0xFFFFF31B,
 
166
        0xFF0B0700,0xFF1B1300,0xFF2B230F,0xFF372B13,0xFF47331B,0xFF533723,0xFF633F2B,0xFF6F4733,
 
167
        0xFF7F533F,0xFF8B5F47,0xFF9B6B53,0xFFA77B5F,0xFFB7876B,0xFFC3937B,0xFFD3A38B,0xFFE3B397,
 
168
        0xFFAB8BA3,0xFF9F7F97,0xFF937387,0xFF8B677B,0xFF7F5B6F,0xFF775363,0xFF6B4B57,0xFF5F3F4B,
 
169
        0xFF573743,0xFF4B2F37,0xFF43272F,0xFF371F23,0xFF2B171B,0xFF231313,0xFF170B0B,0xFF0F0707,
 
170
        0xFFBB739F,0xFFAF6B8F,0xFFA35F83,0xFF975777,0xFF8B4F6B,0xFF7F4B5F,0xFF734353,0xFF6B3B4B,
 
171
        0xFF5F333F,0xFF532B37,0xFF47232B,0xFF3B1F23,0xFF2F171B,0xFF231313,0xFF170B0B,0xFF0F0707,
 
172
        0xFFDBC3BB,0xFFCBB3A7,0xFFBFA39B,0xFFAF978B,0xFFA3877B,0xFF977B6F,0xFF876F5F,0xFF7B6353,
 
173
        0xFF6B5747,0xFF5F4B3B,0xFF533F33,0xFF433327,0xFF372B1F,0xFF271F17,0xFF1B130F,0xFF0F0B07,
 
174
        0xFF6F837B,0xFF677B6F,0xFF5F7367,0xFF576B5F,0xFF4F6357,0xFF475B4F,0xFF3F5347,0xFF374B3F,
 
175
        0xFF2F4337,0xFF2B3B2F,0xFF233327,0xFF1F2B1F,0xFF172317,0xFF0F1B13,0xFF0B130B,0xFF070B07,
 
176
        0xFFFFF31B,0xFFEFDF17,0xFFDBCB13,0xFFCBB70F,0xFFBBA70F,0xFFAB970B,0xFF9B8307,0xFF8B7307,
 
177
        0xFF7B6307,0xFF6B5300,0xFF5B4700,0xFF4B3700,0xFF3B2B00,0xFF2B1F00,0xFF1B0F00,0xFF0B0700,
 
178
        0xFF0000FF,0xFF0B0BEF,0xFF1313DF,0xFF1B1BCF,0xFF2323BF,0xFF2B2BAF,0xFF2F2F9F,0xFF2F2F8F,
 
179
        0xFF2F2F7F,0xFF2F2F6F,0xFF2F2F5F,0xFF2B2B4F,0xFF23233F,0xFF1B1B2F,0xFF13131F,0xFF0B0B0F,
 
180
        0xFF2B0000,0xFF3B0000,0xFF4B0700,0xFF5F0700,0xFF6F0F00,0xFF7F1707,0xFF931F07,0xFFA3270B,
 
181
        0xFFB7330F,0xFFC34B1B,0xFFCF632B,0xFFDB7F3B,0xFFE3974F,0xFFE7AB5F,0xFFEFBF77,0xFFF7D38B,
 
182
        0xFFA77B3B,0xFFB79B37,0xFFC7C337,0xFFE7E357,0xFF7FBFFF,0xFFABE7FF,0xFFD7FFFF,0xFF670000,
 
183
        0xFF8B0000,0xFFB30000,0xFFD70000,0xFFFF0000,0xFFFFF393,0xFFFFF7C7,0xFFFFFFFF,0x009F5B53
 
184
};
 
185
 
 
186
// Palette quake2 demo pics/colormap.pcx, last is transparent
 
187
static const u32 colormap_pcx[256] = {
 
188
        0xFF000000,0xFF0F0F0F,0xFF1F1F1F,0xFF2F2F2F,0xFF3F3F3F,0xFF4B4B4B,0xFF5B5B5B,0xFF6B6B6B,
 
189
        0xFF7B7B7B,0xFF8B8B8B,0xFF9B9B9B,0xFFABABAB,0xFFBBBBBB,0xFFCBCBCB,0xFFDBDBDB,0xFFEBEBEB,
 
190
        0xFF634B23,0xFF5B431F,0xFF533F1F,0xFF4F3B1B,0xFF47371B,0xFF3F2F17,0xFF3B2B17,0xFF332713,
 
191
        0xFF2F2313,0xFF2B1F13,0xFF271B0F,0xFF23170F,0xFF1B130B,0xFF170F0B,0xFF130F07,0xFF0F0B07,
 
192
        0xFF5F5F6F,0xFF5B5B67,0xFF5B535F,0xFF574F5B,0xFF534B53,0xFF4F474B,0xFF473F43,0xFF3F3B3B,
 
193
        0xFF3B3737,0xFF332F2F,0xFF2F2B2B,0xFF272727,0xFF232323,0xFF1B1B1B,0xFF171717,0xFF131313,
 
194
        0xFF8F7753,0xFF7B6343,0xFF735B3B,0xFF674F2F,0xFFCF974B,0xFFA77B3B,0xFF8B672F,0xFF6F5327,
 
195
        0xFFEB9F27,0xFFCB8B23,0xFFAF771F,0xFF93631B,0xFF774F17,0xFF5B3B0F,0xFF3F270B,0xFF231707,
 
196
        0xFFA73B2B,0xFF9F2F23,0xFF972B1B,0xFF8B2713,0xFF7F1F0F,0xFF73170B,0xFF671707,0xFF571300,
 
197
        0xFF4B0F00,0xFF430F00,0xFF3B0F00,0xFF330B00,0xFF2B0B00,0xFF230B00,0xFF1B0700,0xFF130700,
 
198
        0xFF7B5F4B,0xFF735743,0xFF6B533F,0xFF674F3B,0xFF5F4737,0xFF574333,0xFF533F2F,0xFF4B372B,
 
199
        0xFF433327,0xFF3F2F23,0xFF37271B,0xFF2F2317,0xFF271B13,0xFF1F170F,0xFF170F0B,0xFF0F0B07,
 
200
        0xFF6F3B17,0xFF5F3717,0xFF532F17,0xFF432B17,0xFF372313,0xFF271B0F,0xFF1B130B,0xFF0F0B07,
 
201
        0xFFB35B4F,0xFFBF7B6F,0xFFCB9B93,0xFFD7BBB7,0xFFCBD7DF,0xFFB3C7D3,0xFF9FB7C3,0xFF87A7B7,
 
202
        0xFF7397A7,0xFF5B879B,0xFF47778B,0xFF2F677F,0xFF17536F,0xFF134B67,0xFF0F435B,0xFF0B3F53,
 
203
        0xFF07374B,0xFF072F3F,0xFF072733,0xFF001F2B,0xFF00171F,0xFF000F13,0xFF00070B,0xFF000000,
 
204
        0xFF8B5757,0xFF834F4F,0xFF7B4747,0xFF734343,0xFF6B3B3B,0xFF633333,0xFF5B2F2F,0xFF572B2B,
 
205
        0xFF4B2323,0xFF3F1F1F,0xFF331B1B,0xFF2B1313,0xFF1F0F0F,0xFF130B0B,0xFF0B0707,0xFF000000,
 
206
        0xFF979F7B,0xFF8F9773,0xFF878B6B,0xFF7F8363,0xFF777B5F,0xFF737357,0xFF6B6B4F,0xFF636347,
 
207
        0xFF5B5B43,0xFF4F4F3B,0xFF434333,0xFF37372B,0xFF2F2F23,0xFF23231B,0xFF171713,0xFF0F0F0B,
 
208
        0xFF9F4B3F,0xFF934337,0xFF8B3B2F,0xFF7F3727,0xFF772F23,0xFF6B2B1B,0xFF632317,0xFF571F13,
 
209
        0xFF4F1B0F,0xFF43170B,0xFF37130B,0xFF2B0F07,0xFF1F0B07,0xFF170700,0xFF0B0000,0xFF000000,
 
210
        0xFF777BCF,0xFF6F73C3,0xFF676BB7,0xFF6363A7,0xFF5B5B9B,0xFF53578F,0xFF4B4F7F,0xFF474773,
 
211
        0xFF3F3F67,0xFF373757,0xFF2F2F4B,0xFF27273F,0xFF231F2F,0xFF1B1723,0xFF130F17,0xFF0B0707,
 
212
        0xFF9BAB7B,0xFF8F9F6F,0xFF879763,0xFF7B8B57,0xFF73834B,0xFF677743,0xFF5F6F3B,0xFF576733,
 
213
        0xFF4B5B27,0xFF3F4F1B,0xFF374313,0xFF2F3B0B,0xFF232F07,0xFF1B2300,0xFF131700,0xFF0B0F00,
 
214
        0xFF00FF00,0xFF23E70F,0xFF3FD31B,0xFF53BB27,0xFF5FA72F,0xFF5F8F33,0xFF5F7B33,0xFFFFFFFF,
 
215
        0xFFFFFFD3,0xFFFFFFA7,0xFFFFFF7F,0xFFFFFF53,0xFFFFFF27,0xFFFFEB1F,0xFFFFD717,0xFFFFBF0F,
 
216
        0xFFFFAB07,0xFFFF9300,0xFFEF7F00,0xFFE36B00,0xFFD35700,0xFFC74700,0xFFB73B00,0xFFAB2B00,
 
217
        0xFF9B1F00,0xFF8F1700,0xFF7F0F00,0xFF730700,0xFF5F0000,0xFF470000,0xFF2F0000,0xFF1B0000,
 
218
        0xFFEF0000,0xFF3737FF,0xFFFF0000,0xFF0000FF,0xFF2B2B23,0xFF1B1B17,0xFF13130F,0xFFEB977F,
 
219
        0xFFC37353,0xFF9F5733,0xFF7B3F1B,0xFFEBD3C7,0xFFC7AB9B,0xFFA78B77,0xFF876B57,0x009F5B53
 
220
};
 
221
 
 
222
#if 0
 
223
// palette halflife gfx/palette.lmp only 1 entry difference.. transparent = 0,0,255
 
224
static const u32 palette_lmp[256] = {
 
225
        0xFF000000,0xFF0F0F0F,0xFF1F1F1F,0xFF2F2F2F,0xFF3F3F3F,0xFF4B4B4B,0xFF5B5B5B,0xFF6B6B6B,
 
226
        0xFF7B7B7B,0xFF8B8B8B,0xFF9B9B9B,0xFFABABAB,0xFFBBBBBB,0xFFCBCBCB,0xFFDBDBDB,0xFFEBEBEB,
 
227
        0xFF0F0B07,0xFF170F0B,0xFF1F170B,0xFF271B0F,0xFF2F2313,0xFF372B17,0xFF3F2F17,0xFF4B371B,
 
228
        0xFF533B1B,0xFF5B431F,0xFF634B1F,0xFF6B531F,0xFF73571F,0xFF7B5F23,0xFF836723,0xFF8F6F23,
 
229
        0xFF0B0B0F,0xFF13131B,0xFF1B1B27,0xFF272733,0xFF2F2F3F,0xFF37374B,0xFF3F3F57,0xFF474767,
 
230
        0xFF4F4F73,0xFF5B5B7F,0xFF63638B,0xFF6B6B97,0xFF7373A3,0xFF7B7BAF,0xFF8383BB,0xFF8B8BCB,
 
231
        0xFF000000,0xFF070700,0xFF0B0B00,0xFF131300,0xFF1B1B00,0xFF232300,0xFF2B2B07,0xFF2F2F07,
 
232
        0xFF373707,0xFF3F3F07,0xFF474707,0xFF4B4B0B,0xFF53530B,0xFF5B5B0B,0xFF63630B,0xFF6B6B0F,
 
233
        0xFF070000,0xFF0F0000,0xFF170000,0xFF1F0000,0xFF270000,0xFF2F0000,0xFF370000,0xFF3F0000,
 
234
        0xFF470000,0xFF4F0000,0xFF570000,0xFF5F0000,0xFF670000,0xFF6F0000,0xFF770000,0xFF7F0000,
 
235
        0xFF131300,0xFF1B1B00,0xFF232300,0xFF2F2B00,0xFF372F00,0xFF433700,0xFF4B3B07,0xFF574307,
 
236
        0xFF5F4707,0xFF6B4B0B,0xFF77530F,0xFF835713,0xFF8B5B13,0xFF975F1B,0xFFA3631F,0xFFAF6723,
 
237
        0xFF231307,0xFF2F170B,0xFF3B1F0F,0xFF4B2313,0xFF572B17,0xFF632F1F,0xFF733723,0xFF7F3B2B,
 
238
        0xFF8F4333,0xFF9F4F33,0xFFAF632F,0xFFBF772F,0xFFCF8F2B,0xFFDFAB27,0xFFEFCB1F,0xFFFFF31B,
 
239
        0xFF0B0700,0xFF1B1300,0xFF2B230F,0xFF372B13,0xFF47331B,0xFF533723,0xFF633F2B,0xFF6F4733,
 
240
        0xFF7F533F,0xFF8B5F47,0xFF9B6B53,0xFFA77B5F,0xFFB7876B,0xFFC3937B,0xFFD3A38B,0xFFE3B397,
 
241
        0xFFAB8BA3,0xFF9F7F97,0xFF937387,0xFF8B677B,0xFF7F5B6F,0xFF775363,0xFF6B4B57,0xFF5F3F4B,
 
242
        0xFF573743,0xFF4B2F37,0xFF43272F,0xFF371F23,0xFF2B171B,0xFF231313,0xFF170B0B,0xFF0F0707,
 
243
        0xFFBB739F,0xFFAF6B8F,0xFFA35F83,0xFF975777,0xFF8B4F6B,0xFF7F4B5F,0xFF734353,0xFF6B3B4B,
 
244
        0xFF5F333F,0xFF532B37,0xFF47232B,0xFF3B1F23,0xFF2F171B,0xFF231313,0xFF170B0B,0xFF0F0707,
 
245
        0xFFDBC3BB,0xFFCBB3A7,0xFFBFA39B,0xFFAF978B,0xFFA3877B,0xFF977B6F,0xFF876F5F,0xFF7B6353,
 
246
        0xFF6B5747,0xFF5F4B3B,0xFF533F33,0xFF433327,0xFF372B1F,0xFF271F17,0xFF1B130F,0xFF0F0B07,
 
247
        0xFF6F837B,0xFF677B6F,0xFF5F7367,0xFF576B5F,0xFF4F6357,0xFF475B4F,0xFF3F5347,0xFF374B3F,
 
248
        0xFF2F4337,0xFF2B3B2F,0xFF233327,0xFF1F2B1F,0xFF172317,0xFF0F1B13,0xFF0B130B,0xFF070B07,
 
249
        0xFFFFF31B,0xFFEFDF17,0xFFDBCB13,0xFFCBB70F,0xFFBBA70F,0xFFAB970B,0xFF9B8307,0xFF8B7307,
 
250
        0xFF7B6307,0xFF6B5300,0xFF5B4700,0xFF4B3700,0xFF3B2B00,0xFF2B1F00,0xFF1B0F00,0xFF0B0700,
 
251
        0xFF0000FF,0xFF0B0BEF,0xFF1313DF,0xFF1B1BCF,0xFF2323BF,0xFF2B2BAF,0xFF2F2F9F,0xFF2F2F8F,
 
252
        0xFF2F2F7F,0xFF2F2F6F,0xFF2F2F5F,0xFF2B2B4F,0xFF23233F,0xFF1B1B2F,0xFF13131F,0xFF0B0B0F,
 
253
        0xFF2B0000,0xFF3B0000,0xFF4B0700,0xFF5F0700,0xFF6F0F00,0xFF7F1707,0xFF931F07,0xFFA3270B,
 
254
        0xFFB7330F,0xFFC34B1B,0xFFCF632B,0xFFDB7F3B,0xFFE3974F,0xFFE7AB5F,0xFFEFBF77,0xFFF7D38B,
 
255
        0xFFA77B3B,0xFFB79B37,0xFFC7C337,0xFFE7E357,0xFF00FF00,0xFFABE7FF,0xFFD7FFFF,0xFF670000,
 
256
        0xFF8B0000,0xFFB30000,0xFFD70000,0xFFFF0000,0xFFFFF393,0xFFFFF7C7,0xFFFFFFFF,0xFF9F5B53
 
257
};
 
258
 
 
259
#endif
 
260
 
 
261
bool CImageLoaderLMP::isALoadableFileExtension(const io::path& filename) const
 
262
{
 
263
        return core::hasFileExtension ( filename, "lmp" );
 
264
}
 
265
 
 
266
 
 
267
bool CImageLoaderLMP::isALoadableFileFormat(irr::io::IReadFile* file) const
 
268
{
 
269
        return false;
 
270
}
 
271
 
 
272
/*!
 
273
        Quake1, Quake2, Hallife lmp texture
 
274
*/
 
275
IImage* CImageLoaderLMP::loadImage(irr::io::IReadFile* file) const
 
276
{
 
277
        SLMPHeader header;
 
278
 
 
279
        file->seek(0);
 
280
        file->read(&header, sizeof(header));
 
281
 
 
282
        // maybe palette file
 
283
        u32 rawtexsize = header.width * header.height;
 
284
        if ( rawtexsize + sizeof ( header ) != (u32)file->getSize() )
 
285
                return 0;
 
286
 
 
287
        u8 *rawtex = new u8 [ rawtexsize ];
 
288
 
 
289
        file->read(rawtex, rawtexsize);
 
290
 
 
291
        IImage* image = new CImage(ECF_A8R8G8B8, core::dimension2d<u32>(header.width, header.height));
 
292
 
 
293
        CColorConverter::convert8BitTo32Bit(rawtex, (u8*)image->lock(), header.width, header.height, (u8*) colormap_h, 0, false);
 
294
        image->unlock();
 
295
 
 
296
        delete [] rawtex;
 
297
 
 
298
        return image;
 
299
}
 
300
 
 
301
 
 
302
/*!
 
303
        Halflife
 
304
*/
 
305
bool CImageLoaderWAL2::isALoadableFileExtension(const io::path& filename) const
 
306
{
 
307
        // embedded in Wad(WAD3 format). originally it has no extension
 
308
        return core::hasFileExtension ( filename, "wal2" );
 
309
}
 
310
 
 
311
 
 
312
bool CImageLoaderWAL2::isALoadableFileFormat(irr::io::IReadFile* file) const
 
313
{
 
314
        return false;
 
315
}
 
316
 
 
317
/*
 
318
        Halflite Texture WAD
 
319
*/
 
320
IImage* CImageLoaderWAL2::loadImage(irr::io::IReadFile* file) const
 
321
{
 
322
        miptex_halflife header;
 
323
 
 
324
        file->seek(0);
 
325
        file->read(&header, sizeof(header));
 
326
 
 
327
#ifdef __BIG_ENDIAN__
 
328
        header.width = os::Byteswap::byteswap(header.width);
 
329
        header.height = os::Byteswap::byteswap(header.height);
 
330
#endif
 
331
 
 
332
        // palette
 
333
        //u32 paletteofs = header.mipmap[0] + ((rawtexsize * 85) >> 6) + 2;
 
334
        u32 *pal = new u32 [ 192 + 256 ];
 
335
        u8 *s = (u8*) pal;
 
336
 
 
337
        file->seek ( file->getSize() - 768 - 2 );
 
338
        file->read ( s, 768 );
 
339
        u32 i;
 
340
 
 
341
        for ( i = 0; i < 256; ++i, s+= 3 )
 
342
        {
 
343
                pal [ 192 + i ] = 0xFF000000 | s[0] << 16 | s[1] << 8 | s[2];
 
344
        }
 
345
 
 
346
        ECOLOR_FORMAT format = ECF_R8G8B8;
 
347
 
 
348
        // transparency in filename;-) funny. rgb:0x0000FF is colorkey
 
349
        if ( file->getFileName().findFirst ( '{' ) >= 0 )
 
350
        {
 
351
                format = ECF_A8R8G8B8;
 
352
                pal [ 192 + 255 ] &= 0x00FFFFFF;
 
353
        }
 
354
 
 
355
        u32 rawtexsize = header.width * header.height;
 
356
 
 
357
 
 
358
        u8 *rawtex = new u8 [ rawtexsize ];
 
359
 
 
360
        file->seek ( header.mipmap[0] );
 
361
        file->read(rawtex, rawtexsize);
 
362
 
 
363
        IImage* image = new CImage(format, core::dimension2d<u32>(header.width, header.height));
 
364
 
 
365
        switch ( format )
 
366
        {
 
367
        case ECF_R8G8B8:
 
368
                CColorConverter::convert8BitTo24Bit(rawtex, (u8*)image->lock(), header.width, header.height, (u8*) pal + 768, 0, false);
 
369
                break;
 
370
        case ECF_A8R8G8B8:
 
371
                CColorConverter::convert8BitTo32Bit(rawtex, (u8*)image->lock(), header.width, header.height, (u8*) pal + 768, 0, false);
 
372
                break;
 
373
        }
 
374
 
 
375
        image->unlock();
 
376
 
 
377
        delete [] rawtex;
 
378
        delete [] pal;
 
379
 
 
380
        return image;
 
381
}
 
382
 
 
383
bool CImageLoaderWAL::isALoadableFileExtension(const io::path& filename) const
 
384
{
 
385
        return core::hasFileExtension ( filename, "wal" );
 
386
}
 
387
 
 
388
 
 
389
bool CImageLoaderWAL::isALoadableFileFormat(irr::io::IReadFile* file) const
 
390
{
 
391
        return false;
 
392
}
 
393
 
 
394
 
 
395
/*!
 
396
        quake2
 
397
*/
 
398
IImage* CImageLoaderWAL::loadImage(irr::io::IReadFile* file) const
 
399
{
 
400
        miptex_quake2 header;
 
401
 
 
402
        file->seek(0);
 
403
        file->read(&header, sizeof(header));
 
404
 
 
405
#ifdef __BIG_ENDIAN__
 
406
        header.width = os::Byteswap::byteswap(header.width);
 
407
        header.height = os::Byteswap::byteswap(header.height);
 
408
#endif
 
409
 
 
410
        u32 rawtexsize = header.width * header.height;
 
411
 
 
412
        u8 *rawtex = new u8 [ rawtexsize ];
 
413
 
 
414
        file->seek ( header.mipmap[0] );
 
415
        file->read(rawtex, rawtexsize);
 
416
 
 
417
        IImage* image = new CImage(ECF_A8R8G8B8, core::dimension2d<u32>(header.width, header.height));
 
418
 
 
419
        CColorConverter::convert8BitTo32Bit(rawtex, (u8*)image->lock(), header.width, header.height, (u8*) colormap_pcx, 0, false);
 
420
        image->unlock();
 
421
 
 
422
        delete [] rawtex;
 
423
 
 
424
        return image;
 
425
}
 
426
 
 
427
 
 
428
 
 
429
IImageLoader* createImageLoaderHalfLife()
 
430
{
 
431
        return new irr::video::CImageLoaderWAL2();
 
432
}
 
433
 
 
434
IImageLoader* createImageLoaderWAL()
 
435
{
 
436
        return new irr::video::CImageLoaderWAL();
 
437
}
 
438
 
 
439
IImageLoader* createImageLoaderLMP()
 
440
{
 
441
        return new irr::video::CImageLoaderLMP();
 
442
}
 
443
 
 
444
}
 
445
}
 
446
 
 
447