aboutsummaryrefslogtreecommitdiff
path: root/engines/saga/scene.cpp
diff options
context:
space:
mode:
authorAndrew Kurushin2010-10-24 22:17:44 +0000
committerAndrew Kurushin2010-10-24 22:17:44 +0000
commit67cc1b8a84e8cbc344e87fe0f4715cae96199b69 (patch)
treefddf53a8a74288676993025c5c1ad073982db740 /engines/saga/scene.cpp
parent859c1c2c08c39262de6b6ba6e1169bb03d14353a (diff)
downloadscummvm-rg350-67cc1b8a84e8cbc344e87fe0f4715cae96199b69.tar.gz
scummvm-rg350-67cc1b8a84e8cbc344e87fe0f4715cae96199b69.tar.bz2
scummvm-rg350-67cc1b8a84e8cbc344e87fe0f4715cae96199b69.zip
SAGA: replace Resource:loadResource malloc with ByteArray class
svn-id: r53779
Diffstat (limited to 'engines/saga/scene.cpp')
-rw-r--r--engines/saga/scene.cpp101
1 files changed, 40 insertions, 61 deletions
diff --git a/engines/saga/scene.cpp b/engines/saga/scene.cpp
index 2c419962dd..6631918b4c 100644
--- a/engines/saga/scene.cpp
+++ b/engines/saga/scene.cpp
@@ -137,8 +137,7 @@ const char *SAGAResourceTypesString[] = {
};
Scene::Scene(SagaEngine *vm) : _vm(vm) {
- byte *sceneLUTPointer;
- size_t sceneLUTLength;
+ ByteArray sceneLUTData;
uint32 resourceId;
uint i;
@@ -158,21 +157,19 @@ Scene::Scene(SagaEngine *vm) : _vm(vm) {
// Load scene lookup table
resourceId = _vm->_resource->convertResourceId(_vm->getResourceDescription()->sceneLUTResourceId);
debug(3, "Loading scene LUT from resource %i", resourceId);
- _vm->_resource->loadResource(_sceneContext, resourceId, sceneLUTPointer, sceneLUTLength);
- if (sceneLUTLength == 0) {
- error("Scene::Scene() sceneLUTLength == 0");
+ _vm->_resource->loadResource(_sceneContext, resourceId, sceneLUTData);
+ if (sceneLUTData.empty()) {
+ error("Scene::Scene() sceneLUT is empty");
}
- _sceneLUT.resize(sceneLUTLength / 2);
+ _sceneLUT.resize(sceneLUTData.size() / 2);
- MemoryReadStreamEndian readS(sceneLUTPointer, sceneLUTLength, _sceneContext->isBigEndian());
+ ByteArrayReadStreamEndian readS(sceneLUTData, _sceneContext->isBigEndian());
for (i = 0; i < _sceneLUT.size(); i++) {
_sceneLUT[i] = readS.readUint16();
debug(8, "sceneNumber %i has resourceId %i", i, _sceneLUT[i]);
}
- free(sceneLUTPointer);
-
#ifdef SAGA_DEBUG
#define DUMP_SCENES_LEVEL 10
@@ -686,11 +683,11 @@ void Scene::loadScene(LoadSceneParams &loadSceneParams) {
// Load resources from scene resource list
for (SceneResourceDataArray::iterator resource = _resourceList.begin(); resource != _resourceList.end(); ++resource) {
if (!resource->invalid) {
- _vm->_resource->loadResource(_sceneContext, resource->resourceId, resource->buffer, resource->size);
+ _vm->_resource->loadResource(_sceneContext, resource->resourceId, resource->buffer);
- if (resource->size >= 6) {
- if (!memcmp(resource->buffer, "DUMMY!", 6)) {
+ if (resource->buffer.size() >= 6) {
+ if (!memcmp(resource->buffer.getBuffer(), "DUMMY!", 6)) {
resource->invalid = true;
warning("DUMMY resource %i", resource->resourceId);
}
@@ -887,8 +884,7 @@ void Scene::loadScene(LoadSceneParams &loadSceneParams) {
}
void Scene::loadSceneDescriptor(uint32 resourceId) {
- byte *sceneDescriptorData;
- size_t sceneDescriptorDataLength;
+ ByteArray sceneDescriptorData;
_sceneDescription.reset();
@@ -896,10 +892,10 @@ void Scene::loadSceneDescriptor(uint32 resourceId) {
return;
}
- _vm->_resource->loadResource(_sceneContext, resourceId, sceneDescriptorData, sceneDescriptorDataLength);
+ _vm->_resource->loadResource(_sceneContext, resourceId, sceneDescriptorData);
- if (sceneDescriptorDataLength == 16) {
- MemoryReadStreamEndian readS(sceneDescriptorData, sceneDescriptorDataLength, _sceneContext->isBigEndian());
+ if (sceneDescriptorData.size() == 16) {
+ ByteArrayReadStreamEndian readS(sceneDescriptorData, _sceneContext->isBigEndian());
_sceneDescription.flags = readS.readSint16();
_sceneDescription.resourceListResourceId = readS.readSint16();
@@ -910,13 +906,10 @@ void Scene::loadSceneDescriptor(uint32 resourceId) {
_sceneDescription.startScriptEntrypointNumber = readS.readUint16();
_sceneDescription.musicResourceId = readS.readSint16();
}
-
- free(sceneDescriptorData);
}
void Scene::loadSceneResourceList(uint32 resourceId) {
- byte *resourceListData;
- size_t resourceListDataLength;
+ ByteArray resourceListData;
_resourceList.clear();
@@ -925,13 +918,13 @@ void Scene::loadSceneResourceList(uint32 resourceId) {
}
// Load the scene resource table
- _vm->_resource->loadResource(_sceneContext, resourceId, resourceListData, resourceListDataLength);
+ _vm->_resource->loadResource(_sceneContext, resourceId, resourceListData);
- if ((resourceListDataLength % SAGA_RESLIST_ENTRY_LEN) == 0) {
- MemoryReadStreamEndian readS(resourceListData, resourceListDataLength, _sceneContext->isBigEndian());
+ if ((resourceListData.size() % SAGA_RESLIST_ENTRY_LEN) == 0) {
+ ByteArrayReadStreamEndian readS(resourceListData, _sceneContext->isBigEndian());
// Allocate memory for scene resource list
- _resourceList.resize(resourceListDataLength / SAGA_RESLIST_ENTRY_LEN);
+ _resourceList.resize(resourceListData.size() / SAGA_RESLIST_ENTRY_LEN);
debug(3, "Scene resource list contains %i entries", (int)_resourceList.size());
// Load scene resource list from raw scene
@@ -946,12 +939,9 @@ void Scene::loadSceneResourceList(uint32 resourceId) {
}
}
- free(resourceListData);
}
void Scene::processSceneResources() {
- byte *resourceData;
- size_t resourceDataLength;
const byte *palPointer;
SAGAResourceTypes *types = 0;
int typesCount = 0;
@@ -964,8 +954,7 @@ void Scene::processSceneResources() {
if (resource->invalid) {
continue;
}
- resourceData = resource->buffer;
- resourceDataLength = resource->size;
+ ByteArray &resourceData = resource->buffer;
if (resource->resourceType >= typesCount) {
error("Scene::processSceneResources() wrong resource type %i", resource->resourceType);
@@ -993,19 +982,16 @@ void Scene::processSceneResources() {
}
debug(3, "Loading background resource.");
- _bg.res_buf = resourceData;
- _bg.res_len = resourceDataLength;
- _bg.loaded = true;
- if (!_vm->decodeBGImage(_bg.res_buf,
- _bg.res_len,
+ if (!_vm->decodeBGImage(resourceData,
_bg.buffer,
&_bg.w,
&_bg.h)) {
error("Scene::processSceneResources() Error loading background resource %i", resource->resourceId);
}
+ _bg.loaded = true;
- palPointer = _vm->getImagePal(_bg.res_buf, _bg.res_len);
+ palPointer = _vm->getImagePal(resourceData);
memcpy(_bg.pal, palPointer, sizeof(_bg.pal));
break;
case SAGA_BG_MASK: // Scene background mask resource
@@ -1013,10 +999,8 @@ void Scene::processSceneResources() {
error("Scene::ProcessSceneResources(): Duplicate background mask resource encountered");
}
debug(3, "Loading BACKGROUND MASK resource.");
- _bgMask.res_buf = resourceData;
- _bgMask.res_len = resourceDataLength;
+ _vm->decodeBGImage(resourceData, _bgMask.buffer, &_bgMask.w, &_bgMask.h, true);
_bgMask.loaded = true;
- _vm->decodeBGImage(_bgMask.res_buf, _bgMask.res_len, _bgMask.buffer, &_bgMask.w, &_bgMask.h, true);
// At least in ITE the mask needs to be clipped.
@@ -1027,15 +1011,15 @@ void Scene::processSceneResources() {
break;
case SAGA_STRINGS:
debug(3, "Loading scene strings resource...");
- _vm->loadStrings(_sceneStrings, resourceData, resourceDataLength);
+ _vm->loadStrings(_sceneStrings, resourceData);
break;
case SAGA_OBJECT_MAP:
debug(3, "Loading object map resource...");
- _objectMap->load(resourceData, resourceDataLength);
+ _objectMap->load(resourceData);
break;
case SAGA_ACTION_MAP:
debug(3, "Loading action map resource...");
- _actionMap->load(resourceData, resourceDataLength);
+ _actionMap->load(resourceData);
break;
case SAGA_ISO_IMAGES:
if (!(_sceneDescription.flags & kSceneFlagISO)) {
@@ -1044,7 +1028,7 @@ void Scene::processSceneResources() {
debug(3, "Loading isometric images resource.");
- _vm->_isoMap->loadImages(resourceData, resourceDataLength);
+ _vm->_isoMap->loadImages(resourceData);
break;
case SAGA_ISO_MAP:
if (!(_sceneDescription.flags & kSceneFlagISO)) {
@@ -1053,7 +1037,7 @@ void Scene::processSceneResources() {
debug(3, "Loading isometric map resource.");
- _vm->_isoMap->loadMap(resourceData, resourceDataLength);
+ _vm->_isoMap->loadMap(resourceData);
break;
case SAGA_ISO_PLATFORMS:
if (!(_sceneDescription.flags & kSceneFlagISO)) {
@@ -1062,7 +1046,7 @@ void Scene::processSceneResources() {
debug(3, "Loading isometric platforms resource.");
- _vm->_isoMap->loadPlatforms(resourceData, resourceDataLength);
+ _vm->_isoMap->loadPlatforms(resourceData);
break;
case SAGA_ISO_METATILES:
if (!(_sceneDescription.flags & kSceneFlagISO)) {
@@ -1071,7 +1055,7 @@ void Scene::processSceneResources() {
debug(3, "Loading isometric metatiles resource.");
- _vm->_isoMap->loadMetaTiles(resourceData, resourceDataLength);
+ _vm->_isoMap->loadMetaTiles(resourceData);
break;
case SAGA_ANIM:
{
@@ -1079,12 +1063,12 @@ void Scene::processSceneResources() {
debug(3, "Loading animation resource animId=%i", animId);
- _vm->_anim->load(animId, resourceData, resourceDataLength);
+ _vm->_anim->load(animId, resourceData);
}
break;
case SAGA_ENTRY:
debug(3, "Loading entry list resource...");
- loadSceneEntryList(resourceData, resourceDataLength);
+ loadSceneEntryList(resourceData);
break;
case SAGA_ISO_MULTI:
if (!(_sceneDescription.flags & kSceneFlagISO)) {
@@ -1093,11 +1077,11 @@ void Scene::processSceneResources() {
debug(3, "Loading isometric multi resource.");
- _vm->_isoMap->loadMulti(resourceData, resourceDataLength);
+ _vm->_isoMap->loadMulti(resourceData);
break;
case SAGA_PAL_ANIM:
debug(3, "Loading palette animation resource.");
- _vm->_palanim->loadPalAnim(resourceData, resourceDataLength);
+ _vm->_palanim->loadPalAnim(resourceData);
break;
case SAGA_FACES:
if (_vm->getGameId() == GID_ITE)
@@ -1106,10 +1090,10 @@ void Scene::processSceneResources() {
case SAGA_PALETTE:
{
PalEntry pal[PAL_ENTRIES];
- byte *palPtr = resourceData;
+ byte *palPtr = resourceData.getBuffer();
- if (resourceDataLength < 3 * PAL_ENTRIES)
- error("Too small scene palette %i", (int)resourceDataLength);
+ if (resourceData.size() < 3 * PAL_ENTRIES)
+ error("Too small scene palette %i", (int)resourceData.size());
for (uint16 c = 0; c < PAL_ENTRIES; c++) {
pal[c].red = *palPtr++;
@@ -1148,7 +1132,6 @@ void Scene::draw() {
void Scene::endScene() {
Rect rect;
- size_t i;
if (!_sceneLoaded)
return;
@@ -1197,10 +1180,6 @@ void Scene::endScene() {
}
// Free scene resource list
- for (i = 0; i < _resourceList.size(); i++) { //!!!!!!!!!!!!!!!!!!!
- free(_resourceList[i].buffer);
- }
-
_resourceList.clear();
// Free animation info list
@@ -1265,16 +1244,16 @@ void Scene::cmdObjectMapInfo() {
_objectMap->cmdInfo();
}
-void Scene::loadSceneEntryList(const byte* resourcePointer, size_t resourceLength) {
+void Scene::loadSceneEntryList(const ByteArray &resourceData) {
uint i;
if (!_entryList.empty()) {
error("Scene::loadSceneEntryList entryList not empty");
}
- _entryList.resize(resourceLength / 8);
+ _entryList.resize(resourceData.size() / 8);
- MemoryReadStreamEndian readS(resourcePointer, resourceLength, _sceneContext->isBigEndian());
+ ByteArrayReadStreamEndian readS(resourceData, _sceneContext->isBigEndian());
for (i = 0; i < _entryList.size(); i++) {
_entryList[i].location.x = readS.readSint16();