diff options
Diffstat (limited to 'kyra/palette.cpp')
-rw-r--r-- | kyra/palette.cpp | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/kyra/palette.cpp b/kyra/palette.cpp new file mode 100644 index 0000000000..a9836c8ef9 --- /dev/null +++ b/kyra/palette.cpp @@ -0,0 +1,80 @@ +/* ScummVM - Kyrandia Interpreter + * Copyright (C) 2003-2004 The ScummVM project + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * $Header$ + * + */ + +#include "stdafx.h" +#include "resource.h" + +#include "common/stream.h" +#include "codecs.h" + +namespace Kyra { + + Palette::Palette(uint8* data, uint32 size) { + if (!data) { + error("resource created without data"); + } + + if (size != 768) { + Common::MemoryReadStream datastream(data, size); + + datastream.readSint32LE(); + int imageSize = datastream.readSint16LE(); + + if (imageSize != 768) { + error("decompresed palette is not 768 byte long!"); + } + + // lets uncompress this palette :) + _palette = new uint8[imageSize]; + assert(_palette); + + // made decompression + if (Compression::decode80(data + 10, _palette) != 768) { + error("decode80 decompressesize != 768 bytes"); + } + + delete [] data; + data = _palette; + } + + // hmm.. common/system.h Docu is wrong or SDL Backend has a bug :) + // a palette should have this order: + // R1-G1-B1-A1-R2-G2-B2-A2-... + // so we need 4 bytes per color + _palette = new uint8[256 * 4]; + + uint8* currentpossrc = &data[0]; + uint8* currentposdst = &_palette[0]; + + // creates the original pallette (only first 6 bits are used) + for (uint32 i = 0; i < 256; i++) { + currentposdst[0] = currentpossrc[0] << 2; + currentposdst[1] = currentpossrc[1] << 2; + currentposdst[2] = currentpossrc[2] << 2; + currentpossrc += 3; + currentposdst += 4; + } + + delete [] data; + } + +} // end of namespace Kyra + |