コード例 #1
0
ファイル: ShpFile.cpp プロジェクト: OmniBlade/libeastwood
void ShpFile::decodeCnC(uint16_t fileIndex, uint8_t* imageOut)
{
    if (fileIndex >= _size)
    {
        throw(Exception(LOG_ERROR, "ShpFile", "Requested frame out of range"));
    }
    
    LOG_DEBUG("Frame %d Offset %d, format %d", fileIndex, _index.at(fileIndex).startOffset, _index.at(fileIndex).imgFormat);
    
    _stream.seekg(_index.at(fileIndex).startOffset, std::ios_base::beg);
    
    uint32_t len;
    std::vector<uint8_t> source;
    
    switch (_index.at(fileIndex).imgFormat) {
        case 0x80:
            decode80(imageOut, 0);
            break;
        case 0x40:{
            uint32_t refimage = getIndex(_index.at(fileIndex).refOffset);
            decodeCnC(refimage, imageOut);
            len = _index.at(fileIndex + 1).startOffset - _index.at(fileIndex).startOffset;
            source.resize(len);
            source.clear();
            _stream.read(reinterpret_cast<char*>(&source.front()), len);
            decode40(reinterpret_cast<uint8_t*>(&source.front()), imageOut);
            break;
        }
        case 0x20:
            decodeCnC(fileIndex - 1, imageOut);
            len = _index.at(fileIndex + 1).startOffset - _index.at(fileIndex).startOffset;
            source.resize(len);
            source.clear();
            _stream.read(reinterpret_cast<char*>(&source.front()), len);
            decode40(reinterpret_cast<uint8_t*>(&source.front()), imageOut);
            break;
        default:
            throw(Exception(LOG_ERROR, "ShpFile", "Image format not recognized"));
    }
    //return Surface(imageOut, _width, _height, 8, _palette);
}
コード例 #2
0
int Cwsa_dune2_file::extract_as_pcx(const Cfname& name, const t_palet _palet) const
{
	t_palet palet;
	convert_palet_18_to_24(_palet, palet);
	int error = 0;
	const int cx = get_cx();
	const int cy = get_cy();
	const int c_frames = get_c_frames();
	byte* frame = new byte[cx * cy];
	byte* s = new byte[64 << 10];
	byte* d = new byte[cx * cy * 2];
	memset(frame, 0, cx * cy);
	for (int i = 0; i < c_frames; i++)
	{
		if (get_offset(i))
		{
			decode80(get_frame(i), s);
			decode40(s, frame);
		}
		int cb_d = pcx_encode(frame, d, cx, cy, 1);
		Cpcx_file_write f;
		Cfname t = name;
		t.set_title(name.get_ftitle() + " " + nwzl(4, i));
		error = f.open_write(t);
		if (error)
			break;
		f.set_size(cx, cy, 1);
		error = f.write_header();
		if (!error)
			error = f.write_image(d, cb_d);
		if (!error)
			error = f.write_palet(palet);
		f.close();
		if (error)
			break;
	}
	delete[] d;
	delete[] s;
	delete[] frame;
	return error;
}