ScummVM API documentation
bitmap.h
1/* ScummVM - Graphic Adventure Engine
2 *
3 * ScummVM is the legal property of its developers, whose names
4 * are too numerous to list here. Please refer to the COPYRIGHT
5 * file distributed with this source distribution.
6 *
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 *
20 */
21
22#ifndef MOHAWK_BITMAP_H
23#define MOHAWK_BITMAP_H
24
25#include "mohawk/graphics.h"
26
27#include "common/scummsys.h"
28#include "common/stream.h"
29#include "common/array.h"
30#include "graphics/surface.h"
31
32namespace Mohawk {
33
34class MohawkSurface;
35
36enum BitmapFormat {
37 kBitsPerPixel1 = 0x0000,
38 kBitsPerPixel4 = 0x0001,
39 kBitsPerPixel8 = 0x0002,
40 kBitsPerPixel16 = 0x0003,
41 kBitsPerPixel24 = 0x0004,
42 kBitsPerPixelMask = 0x0007,
43 kBitmapHasCLUT = 0x0008,
44 kDrawMASK = 0x00f0,
45 kDrawRaw = 0x0000,
46 kDrawRLE8 = 0x0010,
47 kDrawMSRLE8 = 0x0020,
48 kDrawRLE = 0x0030,
49 kPackMASK = 0x0f00,
50 kPackNone = 0x0000,
51 kPackLZ = 0x0100,
52 kPackLZ1 = 0x0200,
53 kPackRiven = 0x0400,
54 kPackXDec = 0x0f00,
55 kFlagMASK = 0xf000,
56 kFlag16_80X86 = 0x1000, // 16 bit pixel data has been converted to 80X86 format
57 kFlag24_MAC = 0x1000 // 24 bit pixel data has been converted to MAC 32 bit format
58};
59
60enum OldBitmapFormat {
61 kOldPackLZ = 0x0020,
62 kOldDrawRLE8 = 0x0100
63};
64
66 uint16 width;
67 uint16 height;
68 int16 bytesPerRow;
69 uint16 format;
70
71 struct ColorTable {
72 uint16 tableSize;
73 byte rgbBits;
74 byte colorCount;
75 byte* palette; // In 8bpp only
76 } colorTable;
77};
78
80public:
82 virtual ~MohawkBitmap();
83
84 virtual MohawkSurface *decodeImage(Common::SeekableReadStream *stream);
86
87protected:
88 BitmapHeader _header;
89 virtual byte getBitsPerPixel();
90
91 void decodeImageData(Common::SeekableReadStream *stream);
92
93 // The actual LZ decoder
94 static Common::SeekableReadStream *decompressLZ(Common::SeekableReadStream *stream, uint32 uncompressedSize);
95
96 // The current data stream
98
99 // Create the output surface
100 Graphics::Surface *createSurface(uint16 width, uint16 height);
101
102 // Draw Functions
103 void drawRLE8(Graphics::Surface *surface, bool isLE);
104 void drawRaw(Graphics::Surface *surface);
105 void drawRLE8(Graphics::Surface *surface) { return drawRLE8(surface, false); }
106
107private:
108 // Unpack Functions
109 void unpackRaw();
110 void unpackLZ();
111 void unpackRiven();
112
113 // An unpacker
114 struct PackFunction {
115 uint16 flag;
116 const char *name;
117 void (MohawkBitmap::*func)();
118 };
119
120 // A drawer
121 struct DrawFunction {
122 uint16 flag;
123 const char *name;
124 void (MohawkBitmap::*func)(Graphics::Surface *surface);
125 };
126
127 // Unpack/Draw maps
128 const PackFunction *_packTable;
129 int _packTableSize;
130 const DrawFunction *_drawTable;
131 int _drawTableSize;
132
133 // Unpack/Draw helpers
134 const char *getPackName();
135 void unpackImage();
136 const char *getDrawName();
137 void drawImage(Graphics::Surface *surface);
138
139 // Riven Decoding
140 void handleRivenSubcommandStream(byte count, byte *&dst);
141};
142
143#ifdef ENABLE_MYST
144
145// Myst uses a different image format than that of other Mohawk games.
146// It essentially uses a Windows bitmap with the LZ encoding from the
147// Mohawk Bitmap format.
148class MystBitmap : public MohawkBitmap {
149public:
150 MystBitmap() : MohawkBitmap(), _bitsPerPixel(8) {}
151 ~MystBitmap() override {}
152
153 MohawkSurface *decodeImage(Common::SeekableReadStream *stream) override;
154
155protected:
156 byte getBitsPerPixel() override { return _bitsPerPixel; }
157
158private:
159 byte _bitsPerPixel;
160};
161
162#endif
163
165public:
167 ~LivingBooksBitmap_v1() override {}
168
169 MohawkSurface *decodeImageLB(Common::SeekableReadStreamEndian *stream);
170
171protected:
172 byte getBitsPerPixel() override { return 8; }
173};
174
175class DOSBitmap : public MohawkBitmap {
176public:
177 DOSBitmap() : MohawkBitmap() {}
178 ~DOSBitmap() override {}
179
180 MohawkSurface *decodeImage(Common::SeekableReadStream *stream) override;
181
182protected:
183 byte getBitsPerPixel() override { return ((_header.format & 0x30) >> 4) + 1; }
184
185private:
186 void expandMonochromePlane(Graphics::Surface *surface, Common::SeekableReadStream *rawStream);
187 void expandEGAPlanes(Graphics::Surface *surface, Common::SeekableReadStream *rawStream);
188};
189
190} // End of namespace Mohawk
191
192#endif
Definition: array.h:52
Definition: stream.h:944
Definition: stream.h:745
Definition: bitmap.h:175
Definition: bitmap.h:164
Definition: bitmap.h:79
Definition: graphics.h:40
Definition: bitmap.h:32
Definition: surface.h:67
Definition: bitmap.h:71
Definition: bitmap.h:65