Ejemplo n.º 1
0
void HunkPalette::setVersion(const uint32 version) const {
    if (_numPalettes != _data[10]) {
        error("Invalid HunkPalette");
    }

    if (_numPalettes) {
        const EntryHeader header = getEntryHeader();
        if (header.version != _version) {
            error("Invalid HunkPalette");
        }

        WRITE_SCI11ENDIAN_UINT32(getPalPointer() + kEntryVersionOffset, version);
        _version = version;
    }
}
Ejemplo n.º 2
0
HunkPalette::HunkPalette(byte *rawPalette) :
    _version(0),
    // NOTE: The header size in palettes is garbage. In at least KQ7 2.00b and
    // Phant1, the 999.pal sets this value to 0. In most other palettes it is
    // set to 14, but the *actual* size of the header structure used in SSCI is
    // 13, which is reflected by `kHunkPaletteHeaderSize`.
    // _headerSize(rawPalette[0]),
    _numPalettes(rawPalette[10]),
    _data(nullptr) {
    assert(_numPalettes == 0 || _numPalettes == 1);
    if (_numPalettes) {
        _data = rawPalette;
        _version = getEntryHeader().version;
    }
}
Ejemplo n.º 3
0
void HunkPalette::setVersion(const uint32 version) const {
	if (_numPalettes != _data.getUint8At(kNumPaletteEntriesOffset)) {
		error("Invalid HunkPalette");
	}

	if (_numPalettes) {
		const EntryHeader header = getEntryHeader();
		if (header.version != _version) {
			error("Invalid HunkPalette");
		}

		byte *palette = const_cast<byte *>(getPalPointer().getUnsafeDataAt(kEntryVersionOffset, sizeof(uint32)));
		WRITE_SCI11ENDIAN_UINT32(palette, version);
		_version = version;
	}
}
Ejemplo n.º 4
0
const Palette HunkPalette::toPalette() const {
	Palette outPalette;

	for (int16 i = 0; i < ARRAYSIZE(outPalette.colors); ++i) {
		outPalette.colors[i].used = false;
		outPalette.colors[i].r = 0;
		outPalette.colors[i].g = 0;
		outPalette.colors[i].b = 0;
	}

	if (_numPalettes) {
		const EntryHeader header = getEntryHeader();
		const uint32 dataSize = header.numColors * (/* RGB */ 3 + (header.sharedUsed ? 0 : 1));
		const byte *data = getPalPointer().getUnsafeDataAt(kEntryHeaderSize, dataSize);

		const int16 end = header.startColor + header.numColors;
		assert(end <= 256);

		if (header.sharedUsed) {
			for (int16 i = header.startColor; i < end; ++i) {
				outPalette.colors[i].used = header.used;
				outPalette.colors[i].r = *data++;
				outPalette.colors[i].g = *data++;
				outPalette.colors[i].b = *data++;
			}
		} else {
			for (int16 i = header.startColor; i < end; ++i) {
				outPalette.colors[i].used = *data++;
				outPalette.colors[i].r = *data++;
				outPalette.colors[i].g = *data++;
				outPalette.colors[i].b = *data++;
			}
		}
	}

	return outPalette;
}