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); }
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; }