[Scummvm-cvs-logs] SF.net SVN: scummvm:[53779] scummvm/trunk/engines/saga

h00ligan at users.sourceforge.net h00ligan at users.sourceforge.net
Mon Oct 25 00:17:45 CEST 2010


Revision: 53779
          http://scummvm.svn.sourceforge.net/scummvm/?rev=53779&view=rev
Author:   h00ligan
Date:     2010-10-24 22:17:44 +0000 (Sun, 24 Oct 2010)

Log Message:
-----------
SAGA: replace Resource:loadResource malloc with ByteArray class

Modified Paths:
--------------
    scummvm/trunk/engines/saga/actor.cpp
    scummvm/trunk/engines/saga/animation.cpp
    scummvm/trunk/engines/saga/animation.h
    scummvm/trunk/engines/saga/events.cpp
    scummvm/trunk/engines/saga/font.cpp
    scummvm/trunk/engines/saga/gfx.cpp
    scummvm/trunk/engines/saga/image.cpp
    scummvm/trunk/engines/saga/interface.cpp
    scummvm/trunk/engines/saga/introproc_ihnm.cpp
    scummvm/trunk/engines/saga/isomap.cpp
    scummvm/trunk/engines/saga/isomap.h
    scummvm/trunk/engines/saga/music.cpp
    scummvm/trunk/engines/saga/music.h
    scummvm/trunk/engines/saga/objectmap.cpp
    scummvm/trunk/engines/saga/objectmap.h
    scummvm/trunk/engines/saga/palanim.cpp
    scummvm/trunk/engines/saga/palanim.h
    scummvm/trunk/engines/saga/resource.cpp
    scummvm/trunk/engines/saga/resource.h
    scummvm/trunk/engines/saga/resource_res.cpp
    scummvm/trunk/engines/saga/saga.cpp
    scummvm/trunk/engines/saga/saga.h
    scummvm/trunk/engines/saga/scene.cpp
    scummvm/trunk/engines/saga/scene.h
    scummvm/trunk/engines/saga/script.cpp
    scummvm/trunk/engines/saga/script.h
    scummvm/trunk/engines/saga/sndres.cpp
    scummvm/trunk/engines/saga/sprite.cpp

Modified: scummvm/trunk/engines/saga/actor.cpp
===================================================================
--- scummvm/trunk/engines/saga/actor.cpp	2010-10-24 22:15:36 UTC (rev 53778)
+++ scummvm/trunk/engines/saga/actor.cpp	2010-10-24 22:17:44 UTC (rev 53779)
@@ -214,8 +214,7 @@
 
 Actor::Actor(SagaEngine *vm) : _vm(vm) {
 	int i;
-	byte *stringsPointer;
-	size_t stringsLength;
+	ByteArray stringsData;
 	debug(9, "Actor::Actor()");
 	_handleActionDiv = 15;
 
@@ -251,10 +250,9 @@
 
 	if (_vm->getGameId() == GID_ITE) {
 
-		_vm->_resource->loadResource(_actorContext, _vm->getResourceDescription()->actorsStringsResourceId, stringsPointer, stringsLength);
+		_vm->_resource->loadResource(_actorContext, _vm->getResourceDescription()->actorsStringsResourceId, stringsData);
 
-		_vm->loadStrings(_actorsStrings, stringsPointer, stringsLength);
-		free(stringsPointer);
+		_vm->loadStrings(_actorsStrings, stringsData);
 	}
 
 	if (_vm->getGameId() == GID_ITE) {
@@ -310,16 +308,15 @@
 }
 
 void Actor::loadFrameList(int frameListResourceId, ActorFrameSequences &frames) {
-	byte *resourcePointer;
-	size_t resourceLength;
+	ByteArray resourceData;
 
 	debug(9, "Loading frame resource id %d", frameListResourceId);
-	_vm->_resource->loadResource(_actorContext, frameListResourceId, resourcePointer, resourceLength);
+	_vm->_resource->loadResource(_actorContext, frameListResourceId, resourceData);
 
-	frames.resize(resourceLength / 16);
-	debug(9, "Frame resource contains %d frames (res length is %d)", frames.size(), (int)resourceLength);
+	frames.resize(resourceData.size() / 16);
+	debug(9, "Frame resource contains %d frames (res length is %d)", frames.size(), (int)resourceData.size());
 
-	MemoryReadStreamEndian readS(resourcePointer, resourceLength, _actorContext->isBigEndian());
+	ByteArrayReadStreamEndian readS(resourceData, _actorContext->isBigEndian());
 
 	for (ActorFrameSequences::iterator frame = frames.begin(); frame != frames.end(); ++frame) {
 		for (int orient = 0; orient < ACTOR_DIRECTIONS_COUNT; orient++) {
@@ -336,8 +333,6 @@
 			debug(9, "frameIndex %d frameCount %d", frame->directions[orient].frameIndex, frame->directions[orient].frameCount);
 		}
 	}
-
-	free(resourcePointer);
 }
 
 bool Actor::loadActorResources(ActorData *actor) {
@@ -398,8 +393,7 @@
 
 void Actor::loadActorList(int protagonistIdx, int actorCount, int actorsResourceID, int protagStatesCount, int protagStatesResourceID) {
 	int i, j;
-	byte* actorListData;
-	size_t actorListLength;
+	ByteArray actorListData;
 	byte walk[128];
 	byte acv[6];
 	int movementSpeed;
@@ -407,13 +401,13 @@
 	int walkStepCount;
 	int stateResourceId;
 
-	_vm->_resource->loadResource(_actorContext, actorsResourceID, actorListData, actorListLength);
+	_vm->_resource->loadResource(_actorContext, actorsResourceID, actorListData);
 
-	if (actorListLength != (uint)actorCount * ACTOR_INHM_SIZE) {
+	if (actorListData.size() != (uint)actorCount * ACTOR_INHM_SIZE) {
 		error("Actor::loadActorList wrong actorlist length");
 	}
 
-	MemoryReadStream actorS(actorListData, actorListLength);
+	ByteArrayReadStreamEndian actorS(actorListData);
 
 	_actors.resize(actorCount);
 	i = 0;
@@ -483,7 +477,6 @@
 		}
 //		actorS.seek(6, SEEK_CUR); //action vars
 	}
-	free(actorListData);
 
 	_actors[protagonistIdx]._flags |= kProtagonist | kExtended;
 
@@ -500,24 +493,21 @@
 	if (protagStatesResourceID) {
 		_protagStates.resize(protagStatesCount);
 
-		byte *idsResourcePointer;
-		size_t idsResourceLength;
+		ByteArray idsResourceData;
 
-		_vm->_resource->loadResource(_actorContext, protagStatesResourceID,
-									 idsResourcePointer, idsResourceLength);
+		_vm->_resource->loadResource(_actorContext, protagStatesResourceID, idsResourceData);
 
-		if (idsResourceLength < (size_t)protagStatesCount * 4) {
+		if (idsResourceData.size() < (size_t)protagStatesCount * 4) {
 			error("Wrong protagonist states resource");
 		}
 
-		MemoryReadStream statesIds(idsResourcePointer, idsResourceLength);
+		ByteArrayReadStreamEndian statesIds(idsResourceData);
 
 		for (i = 0; i < protagStatesCount; i++) {
 			stateResourceId = statesIds.readUint32LE();
 
 			loadFrameList(stateResourceId, _protagStates[i]._frames);
 		}
-		free(idsResourcePointer);
 
 		_protagonist->_frames = &_protagStates[_protagState]._frames;
 	}
@@ -527,14 +517,13 @@
 void Actor::loadObjList(int objectCount, int objectsResourceID) {
 	uint i;
 	int frameListResourceId;
-	byte* objectListData;
-	size_t objectListLength;
+	ByteArray objectListData;
 
-	_vm->_resource->loadResource(_actorContext, objectsResourceID, objectListData, objectListLength);
+	_vm->_resource->loadResource(_actorContext, objectsResourceID, objectListData);
 
 	_objs.resize(objectCount);
 
-	MemoryReadStream objectS(objectListData, objectListLength);
+	ByteArrayReadStreamEndian objectS(objectListData);
 
 	i = 0;
 	for (ObjectDataArray::iterator object = _objs.begin(); object != _objs.end(); ++object, i++) {
@@ -564,7 +553,6 @@
 		objectS.readUint16LE(); //BOTTOM
 		object->_interactBits = objectS.readUint16LE();
 	}
-	free(objectListData);
 }
 
 void Actor::takeExit(uint16 actorId, const HitZone *hitZone) {

Modified: scummvm/trunk/engines/saga/animation.cpp
===================================================================
--- scummvm/trunk/engines/saga/animation.cpp	2010-10-24 22:15:36 UTC (rev 53778)
+++ scummvm/trunk/engines/saga/animation.cpp	2010-10-24 22:17:44 UTC (rev 53779)
@@ -57,10 +57,10 @@
 
 #ifdef ENABLE_IHNM
 
-void Anim::loadCutawayList(const byte *resourcePointer, size_t resourceLength) {
-	_cutawayList.resize(resourceLength / 8);
+void Anim::loadCutawayList(const ByteArray &resourceData) {
+	_cutawayList.resize(resourceData.size() / 8);
 
-	MemoryReadStream cutawayS(resourcePointer, resourceLength);
+	ByteArrayReadStreamEndian cutawayS(resourceData);
 
 	for (uint i = 0; i < _cutawayList.size(); i++) {
 		_cutawayList[i].backgroundResourceId = cutawayS.readUint16LE();
@@ -80,8 +80,6 @@
 	Event event;
 	EventColumns *eventColumns = NULL;
 	bool startImmediately = false;
-	byte *resourceData;
-	size_t resourceDataLength;
 	ResourceContext *context = _vm->_resource->getContext(GAME_RESOURCEFILE);
 
 	_cutAwayFade = fade;
@@ -171,9 +169,10 @@
 	// for the second from the left monitor in Ellen's chapter etc
 	// Therefore, skip the animation bit if animResourceId is 0 and only show the background
 	if (_cutawayList[cut].animResourceId != 0) {
-		_vm->_resource->loadResource(context, _cutawayList[cut].animResourceId, resourceData, resourceDataLength);
-		load(MAX_ANIMATIONS + cutawaySlot, resourceData, resourceDataLength);
-		free(resourceData);
+		ByteArray resourceData;
+		_vm->_resource->loadResource(context, _cutawayList[cut].animResourceId, resourceData);
+		load(MAX_ANIMATIONS + cutawaySlot, resourceData);
+		
 
 		setCycles(MAX_ANIMATIONS + cutawaySlot, _cutawayList[cut].cycles);
 		setFrameTime(MAX_ANIMATIONS + cutawaySlot, 1000 / _cutawayList[cut].frameRate);
@@ -329,18 +328,17 @@
 void Anim::showCutawayBg(int bg) {
 	ResourceContext *context = _vm->_resource->getContext(GAME_RESOURCEFILE);
 
-	byte *resourceData;
-	size_t resourceDataLength;
+	ByteArray resourceData;
 	ByteArray image;
 	int width;
 	int height;
 	Event event;
 	static PalEntry pal[PAL_ENTRIES];
 
-	_vm->_resource->loadResource(context, bg, resourceData, resourceDataLength);
-	_vm->decodeBGImage(resourceData, resourceDataLength, image, &width, &height);
+	_vm->_resource->loadResource(context, bg, resourceData);
+	_vm->decodeBGImage(resourceData, image, &width, &height);
 
-	const byte *palPointer = _vm->getImagePal(resourceData, resourceDataLength);
+	const byte *palPointer = _vm->getImagePal(resourceData);
 	memcpy(pal, palPointer, sizeof(pal));
 	const Rect rect(width, height);
 	_vm->_render->getBackGroundSurface()->blit(rect, image.getBuffer());
@@ -359,8 +357,6 @@
 	} else {
 		_vm->_gfx->setPalette(pal);
 	}
-
-	free(resourceData);
 }
 
 void Anim::startVideo(int vid, bool fade) {
@@ -386,7 +382,7 @@
 
 #endif
 
-void Anim::load(uint16 animId, const byte *animResourceData, size_t animResourceLength) {
+void Anim::load(uint16 animId, const ByteArray &resourceData) {
 	AnimationData *anim;
 	uint16 temp;
 
@@ -397,7 +393,7 @@
 	} else
 		anim = _animations[animId] = new AnimationData();
 
-	MemoryReadStreamEndian headerReadS(animResourceData, animResourceLength, _vm->isBigEndian());
+	ByteArrayReadStreamEndian headerReadS(resourceData, _vm->isBigEndian());
 	anim->magic = headerReadS.readUint16LE(); // cause ALWAYS LE
 	anim->screenWidth = headerReadS.readUint16();
 	anim->screenHeight = headerReadS.readUint16();
@@ -420,9 +416,9 @@
 		warning("Anim::load animId=%d start != dataOffset 0x%X 0x%X", animId, uint(start), uint(dataOffset));
 	}
 
-	anim->resourceData.resize(animResourceLength - dataOffset);
+	anim->resourceData.resize(resourceData.size() - dataOffset);
 	
-	memcpy(anim->resourceData.getBuffer(), animResourceData + dataOffset, anim->resourceData.size());
+	memcpy(anim->resourceData.getBuffer(), resourceData.getBuffer() + dataOffset, anim->resourceData.size());
 	// Cache frame offsets
 
 	// WORKAROUND: Cutaway with background resource ID 37 (loaded as cutaway #4) is ending credits.

Modified: scummvm/trunk/engines/saga/animation.h
===================================================================
--- scummvm/trunk/engines/saga/animation.h	2010-10-24 22:15:36 UTC (rev 53778)
+++ scummvm/trunk/engines/saga/animation.h	2010-10-24 22:17:44 UTC (rev 53779)
@@ -97,7 +97,7 @@
 	Anim(SagaEngine *vm);
 	~Anim();
 
-	void loadCutawayList(const byte *resourcePointer, size_t resourceLength);
+	void loadCutawayList(const ByteArray &resourceData);
 	void clearCutawayList();
 	int playCutaway(int cut, bool fade);
 	void endCutaway();
@@ -109,7 +109,7 @@
 	void endVideo();
 	void returnFromVideo();
 
-	void load(uint16 animId, const byte *animResourceData, size_t animResourceLength);
+	void load(uint16 animId, const ByteArray &resourceData);
 	void freeId(uint16 animId);
 	void play(uint16 animId, int vectorTime, bool playing = true);
 	void link(int16 animId1, int16 animId2);

Modified: scummvm/trunk/engines/saga/events.cpp
===================================================================
--- scummvm/trunk/engines/saga/events.cpp	2010-10-24 22:15:36 UTC (rev 53778)
+++ scummvm/trunk/engines/saga/events.cpp	2010-10-24 22:17:44 UTC (rev 53779)
@@ -356,18 +356,17 @@
 		{
 		ResourceContext *context = _vm->_resource->getContext(GAME_RESOURCEFILE);
 
-		byte *resourceData;
-		size_t resourceDataLength;
+		ByteArray resourceData;
 
-		_vm->_resource->loadResource(context, _vm->getResourceDescription()->psychicProfileResourceId, resourceData, resourceDataLength);
+		_vm->_resource->loadResource(context, _vm->getResourceDescription()->psychicProfileResourceId, resourceData);
 
 		ByteArray image;
 		int width;
 		int height;
 
-		_vm->decodeBGImage(resourceData, resourceDataLength, image, &width, &height);
+		_vm->decodeBGImage(resourceData, image, &width, &height);
 
-		const PalEntry *palette = (const PalEntry *)_vm->getImagePal(resourceData, resourceDataLength);
+		const PalEntry *palette = (const PalEntry *)_vm->getImagePal(resourceData);
 
 		const Rect profileRect(width, height);
 
@@ -377,8 +376,6 @@
 
 		_vm->_gfx->setPalette(palette);
 
-		free(resourceData);
-
 		// Draw the scene. It won't be drawn by Render::drawScene(), as a placard is up
 		_vm->_scene->draw();
 		}

Modified: scummvm/trunk/engines/saga/font.cpp
===================================================================
--- scummvm/trunk/engines/saga/font.cpp	2010-10-24 22:15:36 UTC (rev 53778)
+++ scummvm/trunk/engines/saga/font.cpp	2010-10-24 22:17:44 UTC (rev 53779)
@@ -55,8 +55,7 @@
 
 
 void Font::loadFont(FontData *font, uint32 fontResourceId) {
-	byte *fontResourcePointer;
-	size_t fontResourceLength;
+	ByteArray fontResourceData;
 	int numBits;
 	int c;
 	ResourceContext *fontContext;
@@ -69,13 +68,13 @@
 	}
 
 	// Load font resource
-	_vm->_resource->loadResource(fontContext, fontResourceId, fontResourcePointer, fontResourceLength);
+	_vm->_resource->loadResource(fontContext, fontResourceId, fontResourceData);
 
-	if (fontResourceLength < FONT_DESCSIZE) {
-		error("Font::loadFont() Invalid font length (%i < %i)", (int)fontResourceLength, FONT_DESCSIZE);
+	if (fontResourceData.size() < FONT_DESCSIZE) {
+		error("Font::loadFont() Invalid font length (%i < %i)", (int)fontResourceData.size(), FONT_DESCSIZE);
 	}
 
-	MemoryReadStreamEndian readS(fontResourcePointer, fontResourceLength, fontContext->isBigEndian());
+	ByteArrayReadStreamEndian readS(fontResourceData, fontContext->isBigEndian());
 
 	// Read font header
 	font->normal.header.charHeight = readS.readUint16();
@@ -108,12 +107,10 @@
 		error("Invalid font resource size");
 	}
 
-	font->normal.font.resize(fontResourceLength - FONT_DESCSIZE);
-	memcpy(font->normal.font.getBuffer(), fontResourcePointer + FONT_DESCSIZE, fontResourceLength - FONT_DESCSIZE);
+	font->normal.font.resize(fontResourceData.size() - FONT_DESCSIZE);
+	memcpy(font->normal.font.getBuffer(), fontResourceData.getBuffer() + FONT_DESCSIZE, fontResourceData.size() - FONT_DESCSIZE);
 
-	free(fontResourcePointer);
 
-
 	// Create outline font style
 	createOutline(font);
 }

Modified: scummvm/trunk/engines/saga/gfx.cpp
===================================================================
--- scummvm/trunk/engines/saga/gfx.cpp	2010-10-24 22:15:36 UTC (rev 53778)
+++ scummvm/trunk/engines/saga/gfx.cpp	2010-10-24 22:17:44 UTC (rev 53779)
@@ -173,13 +173,11 @@
 		error("Resource::loadGlobalResources() resource context not found");
 	}
 
-	byte *resourcePointer;
-	size_t resourceLength;
+	ByteArray resourceData;
 
-	_vm->_resource->loadResource(resourceContext, RID_IHNM_DEFAULT_PALETTE,
-								 resourcePointer, resourceLength);
+	_vm->_resource->loadResource(resourceContext, RID_IHNM_DEFAULT_PALETTE, resourceData);
 
-	MemoryReadStream metaS(resourcePointer, resourceLength);
+	ByteArrayReadStreamEndian metaS(resourceData);
 
 	for (int i = 0; i < 256; i++) {
 		_globalPalette[i].red = metaS.readByte();
@@ -187,8 +185,6 @@
 		_globalPalette[i].blue = metaS.readByte();
 	}
 
-	free(resourcePointer);
-
 	setPalette(_globalPalette, true);
 }
 
@@ -504,19 +500,17 @@
 			break;
 		}
 
-		byte *resource;
-		size_t resourceLength;
+		ByteArray resourceData;
 		ByteArray image;
 		int width, height;
 
 		if (resourceId != (uint32)-1) {
 			ResourceContext *context = _vm->_resource->getContext(GAME_RESOURCEFILE);
 
-			_vm->_resource->loadResource(context, resourceId, resource, resourceLength);
+			_vm->_resource->loadResource(context, resourceId, resourceData);
 
-			_vm->decodeBGImage(resource, resourceLength, image, &width, &height);
+			_vm->decodeBGImage(resourceData, image, &width, &height);
 		} else {
-			resource = NULL;
 			width = height = 31;
 			image.resize(width * height);
 
@@ -530,8 +524,6 @@
 
 		// Note: Hard-coded hotspot
 		CursorMan.replaceCursor(image.getBuffer(), width, height, 15, 15, 0);
-
-		free(resource);
 	}
 }
 

Modified: scummvm/trunk/engines/saga/image.cpp
===================================================================
--- scummvm/trunk/engines/saga/image.cpp	2010-10-24 22:15:36 UTC (rev 53778)
+++ scummvm/trunk/engines/saga/image.cpp	2010-10-24 22:17:44 UTC (rev 53779)
@@ -47,18 +47,18 @@
 	}
 }
 
-bool SagaEngine::decodeBGImage(const byte *image_data, size_t image_size, ByteArray &outputBuffer, int *w, int *h, bool flip) {
+bool SagaEngine::decodeBGImage(const ByteArray &imageData, ByteArray &outputBuffer, int *w, int *h, bool flip) {
 	ImageHeader hdr;
 	int modex_height;
 	const byte *RLE_data_ptr;
 	size_t RLE_data_len;
 	ByteArray decodeBuffer;
 
-	if (image_size <= SAGA_IMAGE_DATA_OFFSET) {
-		error("decodeBGImage() Image size is way too small (%d)", (int)image_size);
+	if (imageData.size() <= SAGA_IMAGE_DATA_OFFSET) {
+		error("decodeBGImage() Image size is way too small (%d)", (int)imageData.size());
 	}
 
-	MemoryReadStreamEndian readS(image_data, image_size, isBigEndian());
+	ByteArrayReadStreamEndian readS(imageData, isBigEndian());
 
 	hdr.width = readS.readUint16();
 	hdr.height = readS.readUint16();
@@ -66,8 +66,8 @@
 	readS.readUint16();
 	readS.readUint16();
 
-	RLE_data_ptr = image_data + SAGA_IMAGE_DATA_OFFSET;
-	RLE_data_len = image_size - SAGA_IMAGE_DATA_OFFSET;
+	RLE_data_ptr = &imageData.front() + SAGA_IMAGE_DATA_OFFSET;
+	RLE_data_len = imageData.size() - SAGA_IMAGE_DATA_OFFSET;
 
 	modex_height = granulate(hdr.height, 4);
 
@@ -411,12 +411,4 @@
 	}
 }
 
-const byte *SagaEngine::getImagePal(const byte *image_data, size_t image_size) {
-	if (image_size <= SAGA_IMAGE_HEADER_LEN) {
-		return NULL;
-	}
-
-	return image_data + SAGA_IMAGE_HEADER_LEN;
-}
-
 } // End of namespace Saga

Modified: scummvm/trunk/engines/saga/interface.cpp
===================================================================
--- scummvm/trunk/engines/saga/interface.cpp	2010-10-24 22:15:36 UTC (rev 53778)
+++ scummvm/trunk/engines/saga/interface.cpp	2010-10-24 22:17:44 UTC (rev 53779)
@@ -124,8 +124,7 @@
 #define buttonRes1 0x42544E01
 
 Interface::Interface(SagaEngine *vm) : _vm(vm) {
-	byte *resource;
-	size_t resourceLength;
+	ByteArray resourceData;
 	int i;
 
 #if 0
@@ -170,27 +169,23 @@
 		}
 	}
 
-	_vm->_resource->loadResource(_interfaceContext, _vm->getResourceDescription()->mainPanelResourceId, resource, resourceLength);
-	_vm->decodeBGImage(resource, resourceLength, _mainPanel.image, &_mainPanel.imageWidth, &_mainPanel.imageHeight);
+	_vm->_resource->loadResource(_interfaceContext, _vm->getResourceDescription()->mainPanelResourceId, resourceData);
+	_vm->decodeBGImage(resourceData, _mainPanel.image, &_mainPanel.imageWidth, &_mainPanel.imageHeight);
 
-	free(resource);
-
 	// Converse panel
 	_conversePanel.buttons = _vm->getDisplayInfo().conversePanelButtons;
 	_conversePanel.buttonsCount = _vm->getDisplayInfo().conversePanelButtonsCount;
 
-	_vm->_resource->loadResource(_interfaceContext, _vm->getResourceDescription()->conversePanelResourceId, resource, resourceLength);
-	_vm->decodeBGImage(resource, resourceLength, _conversePanel.image, &_conversePanel.imageWidth, &_conversePanel.imageHeight);
-	free(resource);
+	_vm->_resource->loadResource(_interfaceContext, _vm->getResourceDescription()->conversePanelResourceId, resourceData);
+	_vm->decodeBGImage(resourceData, _conversePanel.image, &_conversePanel.imageWidth, &_conversePanel.imageHeight);
 
 	// Option panel
 	if (!_vm->_script->isNonInteractiveDemo()) {
 		_optionPanel.buttons = _vm->getDisplayInfo().optionPanelButtons;
 		_optionPanel.buttonsCount = _vm->getDisplayInfo().optionPanelButtonsCount;
 
-		_vm->_resource->loadResource(_interfaceContext, _vm->getResourceDescription()->optionPanelResourceId, resource, resourceLength);
-		_vm->decodeBGImage(resource, resourceLength, _optionPanel.image, &_optionPanel.imageWidth, &_optionPanel.imageHeight);
-		free(resource);
+		_vm->_resource->loadResource(_interfaceContext, _vm->getResourceDescription()->optionPanelResourceId, resourceData);
+		_vm->decodeBGImage(resourceData, _optionPanel.image, &_optionPanel.imageWidth, &_optionPanel.imageHeight);
 	} else {
 		_optionPanel.buttons = NULL;
 		_optionPanel.buttonsCount = 0;
@@ -203,9 +198,8 @@
 		_quitPanel.buttons = _vm->getDisplayInfo().quitPanelButtons;
 		_quitPanel.buttonsCount = _vm->getDisplayInfo().quitPanelButtonsCount;
 
-		_vm->_resource->loadResource(_interfaceContext, _vm->getResourceDescription()->warningPanelResourceId, resource, resourceLength);
-		_vm->decodeBGImage(resource, resourceLength, _quitPanel.image, &_quitPanel.imageWidth, &_quitPanel.imageHeight);
-		free(resource);
+		_vm->_resource->loadResource(_interfaceContext, _vm->getResourceDescription()->warningPanelResourceId, resourceData);
+		_vm->decodeBGImage(resourceData, _quitPanel.image, &_quitPanel.imageWidth, &_quitPanel.imageHeight);
 	}
 
 	// Save panel
@@ -213,9 +207,8 @@
 		_savePanel.buttons = _vm->getDisplayInfo().savePanelButtons;
 		_savePanel.buttonsCount = _vm->getDisplayInfo().savePanelButtonsCount;
 
-		_vm->_resource->loadResource(_interfaceContext, _vm->getResourceDescription()->warningPanelResourceId, resource, resourceLength);
-		_vm->decodeBGImage(resource, resourceLength, _savePanel.image, &_savePanel.imageWidth, &_savePanel.imageHeight);
-		free(resource);
+		_vm->_resource->loadResource(_interfaceContext, _vm->getResourceDescription()->warningPanelResourceId, resourceData);
+		_vm->decodeBGImage(resourceData, _savePanel.image, &_savePanel.imageWidth, &_savePanel.imageHeight);
 	}
 
 	// Load panel
@@ -223,9 +216,8 @@
 		_loadPanel.buttons = _vm->getDisplayInfo().loadPanelButtons;
 		_loadPanel.buttonsCount = _vm->getDisplayInfo().loadPanelButtonsCount;
 
-		_vm->_resource->loadResource(_interfaceContext, _vm->getResourceDescription()->warningPanelResourceId, resource, resourceLength);
-		_vm->decodeBGImage(resource, resourceLength, _loadPanel.image, &_loadPanel.imageWidth, &_loadPanel.imageHeight);
-		free(resource);
+		_vm->_resource->loadResource(_interfaceContext, _vm->getResourceDescription()->warningPanelResourceId, resourceData);
+		_vm->decodeBGImage(resourceData, _loadPanel.image, &_loadPanel.imageWidth, &_loadPanel.imageHeight);
 	}
 #endif
 
@@ -2695,8 +2687,7 @@
 
 void Interface::mapPanelShow() {
 	int i;
-	byte *resource;
-	size_t resourceLength;
+	ByteArray resourceData;
 	Rect rect;
 	ByteArray image;
 	int imageWidth, imageHeight;
@@ -2707,9 +2698,8 @@
 
 	rect.left = rect.top = 0;
 
-	_vm->_resource->loadResource(_interfaceContext,
-			 _vm->_resource->convertResourceId(RID_ITE_TYCHO_MAP), resource, resourceLength);
-	if (resourceLength == 0) {
+	_vm->_resource->loadResource(_interfaceContext, _vm->_resource->convertResourceId(RID_ITE_TYCHO_MAP), resourceData);
+	if (resourceData.empty()) {
 		error("Interface::mapPanelShow() unable to load Tycho map resource");
 	}
 
@@ -2723,8 +2713,8 @@
 
 	_vm->_render->setFlag(RF_MAP);
 
-	_vm->decodeBGImage(resource, resourceLength, image, &imageWidth, &imageHeight);
-	pal = _vm->getImagePal(resource, resourceLength);
+	_vm->decodeBGImage(resourceData, image, &imageWidth, &imageHeight);
+	pal = _vm->getImagePal(resourceData);
 
 	for (i = 0; i < PAL_ENTRIES; i++) {
 		cPal[i].red = *pal++;
@@ -2744,7 +2734,6 @@
 		_vm->_system->delayMillis(5);
 	}
 
-	free(resource);
 
 	setSaveReminderState(false);
 
@@ -2801,8 +2790,7 @@
 	_vm->_music->pause();
 
 	int i;
-	byte *resource;
-	size_t resourceLength;
+	ByteArray resourceData;
 	Rect rect;
 	ByteArray image;
 	int imageWidth, imageHeight;
@@ -2813,20 +2801,20 @@
 
 	rect.left = rect.top = 0;
 
-	_vm->_resource->loadResource(_interfaceContext, RID_IHNM_BOSS_SCREEN, resource, resourceLength);
-	if (resourceLength == 0) {
+	_vm->_resource->loadResource(_interfaceContext, RID_IHNM_BOSS_SCREEN, resourceData);
+	if (resourceData.empty()) {
 		error("Interface::bossKey() unable to load Boss image resource");
 	}
 
 	_bossMode = _panelMode;
 	setMode(kPanelBoss);
 
-	_vm->decodeBGImage(resource, resourceLength, image, &imageWidth, &imageHeight);
+	_vm->decodeBGImage(resourceData, image, &imageWidth, &imageHeight);
 	rect.setWidth(imageWidth);
 	rect.setHeight(imageHeight);
 
 	_vm->_gfx->getCurrentPal(_mapSavedPal);
-	pal = _vm->getImagePal(resource, resourceLength);
+	pal = _vm->getImagePal(resourceData);
 
 	cPal[0].red = 0;
 	cPal[0].green = 0;
@@ -2841,8 +2829,6 @@
 	_vm->_gfx->drawRegion(rect, image.getBuffer());
 
 	_vm->_gfx->setPalette(cPal);
-
-	free(resource);
 }
 
 

Modified: scummvm/trunk/engines/saga/introproc_ihnm.cpp
===================================================================
--- scummvm/trunk/engines/saga/introproc_ihnm.cpp	2010-10-24 22:15:36 UTC (rev 53778)
+++ scummvm/trunk/engines/saga/introproc_ihnm.cpp	2010-10-24 22:17:44 UTC (rev 53779)
@@ -121,8 +121,7 @@
 void Scene::IHNMLoadCutaways() {
 	ResourceContext *resourceContext;
 	//ResourceContext *soundContext;
-	byte *resourcePointer;
-	size_t resourceLength;
+	ByteArray resourceData;
 
 	resourceContext = _vm->_resource->getContext(GAME_RESOURCEFILE);
 	if (resourceContext == NULL) {
@@ -130,18 +129,16 @@
 	}
 
 	if (!_vm->isIHNMDemo())
-		_vm->_resource->loadResource(resourceContext, RID_IHNM_INTRO_CUTAWAYS, resourcePointer, resourceLength);
+		_vm->_resource->loadResource(resourceContext, RID_IHNM_INTRO_CUTAWAYS, resourceData);
 	else
-		_vm->_resource->loadResource(resourceContext, RID_IHNMDEMO_INTRO_CUTAWAYS, resourcePointer, resourceLength);
+		_vm->_resource->loadResource(resourceContext, RID_IHNMDEMO_INTRO_CUTAWAYS, resourceData);
 
-	if (resourceLength == 0) {
+	if (resourceData.empty() == 0) {
 		error("Scene::IHNMStartProc() Can't load cutaway list");
 	}
 
 	// Load the cutaways for the title screens
-	_vm->_anim->loadCutawayList(resourcePointer, resourceLength);
-
-	free(resourcePointer);
+	_vm->_anim->loadCutawayList(resourceData);
 }
 
 bool Scene::checkKey() {

Modified: scummvm/trunk/engines/saga/isomap.cpp
===================================================================
--- scummvm/trunk/engines/saga/isomap.cpp	2010-10-24 22:15:36 UTC (rev 53778)
+++ scummvm/trunk/engines/saga/isomap.cpp	2010-10-24 22:17:44 UTC (rev 53779)
@@ -102,17 +102,17 @@
 	_viewDiff = 1;
 }
 
-void IsoMap::loadImages(const byte *resourcePointer, size_t resourceLength) {
+void IsoMap::loadImages(const ByteArray &resourceData) {
 	IsoTileData *tileData;
 	uint16 i;
 	size_t offsetDiff;
 
-	if (resourceLength == 0) {
+	if (resourceData.empty()) {
 		error("IsoMap::loadImages wrong resourceLength");
 	}
 
 
-	MemoryReadStreamEndian readS(resourcePointer, resourceLength, _vm->isBigEndian());
+	ByteArrayReadStreamEndian readS(resourceData, _vm->isBigEndian());
 	readS.readUint16(); // skip
 	i = readS.readUint16();
 	i = i / SAGA_ISOTILEDATA_LEN;
@@ -134,25 +134,25 @@
 
 	offsetDiff = readS.pos();
 
-	_tileData.resize(resourceLength - offsetDiff);
-	memcpy(_tileData.getBuffer(), resourcePointer + offsetDiff, _tileData.size());
+	_tileData.resize(resourceData.size() - offsetDiff);
+	memcpy(_tileData.getBuffer(), resourceData.getBuffer() + offsetDiff, _tileData.size());
 
 	for (i = 0; i < _tilesTable.size(); i++) {
 		_tilesTable[i].tilePointer = _tileData.getBuffer() + tempOffsets[i] - offsetDiff;
 	}
 }
 
-void IsoMap::loadPlatforms(const byte * resourcePointer, size_t resourceLength) {
+void IsoMap::loadPlatforms(const ByteArray &resourceData) {
 	TilePlatformData *tilePlatformData;
 	uint16 i, x, y;
 
-	if (resourceLength == 0) {
+	if (resourceData.empty()) {
 		error("IsoMap::loadPlatforms wrong resourceLength");
 	}
 
-	MemoryReadStreamEndian readS(resourcePointer, resourceLength, _vm->isBigEndian());
+	ByteArrayReadStreamEndian readS(resourceData, _vm->isBigEndian());
 
-	i = resourceLength / SAGA_TILEPLATFORMDATA_LEN;
+	i = resourceData.size() / SAGA_TILEPLATFORMDATA_LEN;
 	_tilePlatformList.resize(i);
 
 	for (i = 0; i < _tilePlatformList.size(); i++) {
@@ -171,14 +171,14 @@
 
 }
 
-void IsoMap::loadMap(const byte * resourcePointer, size_t resourceLength) {
+void IsoMap::loadMap(const ByteArray &resourceData) {
 	uint16 x, y;
 
-	if (resourceLength != SAGA_TILEMAP_LEN) {
-		error("IsoMap::loadMap wrong resourceLength");
+	if (resourceData.size() != SAGA_TILEMAP_LEN) {
+		error("IsoMap::loadMap wrong resource length %d", resourceData.size());
 	}
 
-	MemoryReadStreamEndian readS(resourcePointer, resourceLength, _vm->isBigEndian());
+	ByteArrayReadStreamEndian readS(resourceData, _vm->isBigEndian());
 	_tileMap.edgeType = readS.readByte();
 	readS.readByte(); //skip
 
@@ -190,16 +190,16 @@
 
 }
 
-void IsoMap::loadMetaTiles(const byte * resourcePointer, size_t resourceLength) {
+void IsoMap::loadMetaTiles(const ByteArray &resourceData) {
 	MetaTileData *metaTileData;
 	uint16 i, j;
 
-	if (resourceLength == 0) {
+	if (resourceData.empty()) {
 		error("IsoMap::loadMetaTiles wrong resourceLength");
 	}
 
-	MemoryReadStreamEndian readS(resourcePointer, resourceLength, _vm->isBigEndian());
-	i = resourceLength / SAGA_METATILEDATA_LEN;
+	ByteArrayReadStreamEndian readS(resourceData, _vm->isBigEndian());
+	i = resourceData.size() / SAGA_METATILEDATA_LEN;
 	_metaTileList.resize(i);
 
 	for (i = 0; i < _metaTileList.size(); i++) {
@@ -212,16 +212,16 @@
 	}
 }
 
-void IsoMap::loadMulti(const byte * resourcePointer, size_t resourceLength) {
+void IsoMap::loadMulti(const ByteArray &resourceData) {
 	MultiTileEntryData *multiTileEntryData;
 	uint16 i;
 	int16 offsetDiff;
 
-	if (resourceLength < 2) {
+	if (resourceData.size() < 2) {
 		error("IsoMap::loadMetaTiles wrong resourceLength");
 	}
 
-	MemoryReadStreamEndian readS(resourcePointer, resourceLength, _vm->isBigEndian());
+	ByteArrayReadStreamEndian readS(resourceData, _vm->isBigEndian());
 	i = readS.readUint16();
 	_multiTable.resize(i);
 

Modified: scummvm/trunk/engines/saga/isomap.h
===================================================================
--- scummvm/trunk/engines/saga/isomap.h	2010-10-24 22:15:36 UTC (rev 53778)
+++ scummvm/trunk/engines/saga/isomap.h	2010-10-24 22:17:44 UTC (rev 53779)
@@ -155,11 +155,11 @@
 	IsoMap(SagaEngine *vm);
 	~IsoMap() {
 	}
-	void loadImages(const byte * resourcePointer, size_t resourceLength);
-	void loadMap(const byte * resourcePointer, size_t resourceLength);
-	void loadPlatforms(const byte * resourcePointer, size_t resourceLength);
-	void loadMetaTiles(const byte * resourcePointer, size_t resourceLength);
-	void loadMulti(const byte * resourcePointer, size_t resourceLength);
+	void loadImages(const ByteArray &resourceData);
+	void loadMap(const ByteArray &resourceData);
+	void loadPlatforms(const ByteArray &resourceData);
+	void loadMetaTiles(const ByteArray &resourceData);
+	void loadMulti(const ByteArray &resourceData);
 	void clear();
 	void draw();
 	void drawSprite(SpriteList &spriteList, int spriteNumber, const Location &location, const Point &screenPosition, int scale);

Modified: scummvm/trunk/engines/saga/music.cpp
===================================================================
--- scummvm/trunk/engines/saga/music.cpp	2010-10-24 22:15:36 UTC (rev 53778)
+++ scummvm/trunk/engines/saga/music.cpp	2010-10-24 22:17:44 UTC (rev 53779)
@@ -117,6 +117,7 @@
 
 Music::Music(SagaEngine *vm, Audio::Mixer *mixer) : _vm(vm), _mixer(mixer) {
 	_currentVolume = 0;
+	_currentMusicBuffer = NULL;
 	_driver = new MusicDriver();
 
 	_digitalMusicContext = _vm->_resource->getContext(GAME_DIGITALMUSICFILE);
@@ -162,11 +163,13 @@
 		// Just set an XMIDI parser for Mac IHNM for now
 		_parser = MidiParser::createParser_XMIDI();
 	} else {
-		byte *resourceData;
-		size_t resourceSize;
+		ByteArray resourceData;
 		int resourceId = (_vm->getGameId() == GID_ITE ? 9 : 0);
-		_vm->_resource->loadResource(_musicContext, resourceId, resourceData, resourceSize);
-		if (!memcmp(resourceData, "FORM", 4)) {
+		_vm->_resource->loadResource(_musicContext, resourceId, resourceData);
+		if (resourceData.size() < 4) {
+			error("Music::Music Unable to load midi resource data");
+		}
+		if (!memcmp(resourceData.getBuffer(), "FORM", 4)) {
 			_parser = MidiParser::createParser_XMIDI();
 			// ITE had MT32 mapped instruments
 			_driver->setGM(_vm->getGameId() != GID_ITE);
@@ -175,14 +178,12 @@
 			// ITE with standalone MIDI files is General MIDI
 			_driver->setGM(_vm->getGameId() == GID_ITE);
 		}
-		free(resourceData);
 	}
-
+	
 	_parser->setMidiDriver(_driver);
 	_parser->setTimerRate(_driver->getBaseTempo());
 	_parser->property(MidiParser::mpCenterPitchWheelOnUnload, 1);
 
-	_midiMusicData = NULL;
 	_digitalMusic = false;
 }
 
@@ -193,8 +194,6 @@
 	delete _driver;
 	_parser->setMidiDriver(NULL);
 	delete _parser;
-
-	free(_midiMusicData);
 }
 
 void Music::musicVolumeGaugeCallback(void *refCon) {
@@ -254,8 +253,6 @@
 
 void Music::play(uint32 resourceId, MusicFlags flags) {
 	Audio::SeekableAudioStream *audioStream = NULL;
-	byte *resourceData;
-	size_t resourceSize;
 	uint32 loopStart = 0;
 
 	debug(2, "Music::play %d, %d", resourceId, flags);
@@ -388,14 +385,19 @@
 #endif
 		return;
 	} else {
-		_vm->_resource->loadResource(_musicContext, resourceId, resourceData, resourceSize);
+		if (_currentMusicBuffer == &_musicBuffer[1]) {
+			_currentMusicBuffer = &_musicBuffer[0];
+		} else {
+			_currentMusicBuffer = &_musicBuffer[1];
+		}
+		_vm->_resource->loadResource(_musicContext, resourceId, *_currentMusicBuffer);
 	}
 
-	if (resourceSize < 4) {
+	if (_currentMusicBuffer->size() < 4) {
 		error("Music::play() wrong music resource size");
 	}
 
-	if (!_parser->loadMusic(resourceData, resourceSize))
+	if (!_parser->loadMusic(_currentMusicBuffer->getBuffer(), _currentMusicBuffer->size()))
 		error("Music::play() wrong music resource");
 
 	_parser->setTrack(0);
@@ -405,9 +407,6 @@
 
 	// Handle music looping
 	_parser->property(MidiParser::mpAutoLoop, (flags & MUSIC_LOOP) ? 1 : 0);
-
-	free(_midiMusicData);
-	_midiMusicData = resourceData;
 }
 
 void Music::pause() {

Modified: scummvm/trunk/engines/saga/music.h
===================================================================
--- scummvm/trunk/engines/saga/music.h	2010-10-24 22:15:36 UTC (rev 53778)
+++ scummvm/trunk/engines/saga/music.h	2010-10-24 22:17:44 UTC (rev 53779)
@@ -125,11 +125,12 @@
 	ResourceContext *_digitalMusicContext;
 	MidiParser *_parser;
 
-	byte *_midiMusicData;
 
 	static void musicVolumeGaugeCallback(void *refCon);
 	static void onTimer(void *refCon);
 	void musicVolumeGauge();
+	ByteArray *_currentMusicBuffer;
+	ByteArray _musicBuffer[2];
 };
 
 } // End of namespace Saga

Modified: scummvm/trunk/engines/saga/objectmap.cpp
===================================================================
--- scummvm/trunk/engines/saga/objectmap.cpp	2010-10-24 22:15:36 UTC (rev 53778)
+++ scummvm/trunk/engines/saga/objectmap.cpp	2010-10-24 22:17:44 UTC (rev 53779)
@@ -163,22 +163,22 @@
 #endif
 
 // Loads an object map resource ( objects ( clickareas ( points ) ) )
-void ObjectMap::load(const byte *resourcePointer, size_t resourceLength) {
+void ObjectMap::load(const ByteArray &resourceData) {
 	uint i;
 
 	if (!_hitZoneList.empty()) {
 		error("ObjectMap::load _hitZoneList not empty");
 	}
 
-	if (resourceLength == 0) {
+	if (resourceData.empty()) {
 		return;
 	}
 
-	if (resourceLength < 4) {
+	if (resourceData.size() < 4) {
 		error("ObjectMap::load wrong resourceLength");
 	}
 
-	MemoryReadStreamEndian readS(resourcePointer, resourceLength, _vm->isBigEndian());
+	ByteArrayReadStreamEndian readS(resourceData, _vm->isBigEndian());
 
 	_hitZoneList.resize(readS.readUint16());
 

Modified: scummvm/trunk/engines/saga/objectmap.h
===================================================================
--- scummvm/trunk/engines/saga/objectmap.h	2010-10-24 22:15:36 UTC (rev 53778)
+++ scummvm/trunk/engines/saga/objectmap.h	2010-10-24 22:17:44 UTC (rev 53779)
@@ -92,7 +92,7 @@
 public:
 	ObjectMap(SagaEngine *vm) : _vm(vm) {
 	}
-	void load(const byte *resourcePointer, size_t resourceLength);
+	void load(const ByteArray &resourceData);
 	void clear();
 #ifdef SAGA_DEBUG
 	void draw(const Point& testPoint, int color, int color2);	// for debugging

Modified: scummvm/trunk/engines/saga/palanim.cpp
===================================================================
--- scummvm/trunk/engines/saga/palanim.cpp	2010-10-24 22:15:36 UTC (rev 53778)
+++ scummvm/trunk/engines/saga/palanim.cpp	2010-10-24 22:17:44 UTC (rev 53779)
@@ -37,15 +37,15 @@
 PalAnim::PalAnim(SagaEngine *vm) : _vm(vm) {
 }
 
-void PalAnim::loadPalAnim(const byte *resdata, size_t resdata_len) {
+void PalAnim::loadPalAnim(const ByteArray &resourceData) {
 
 	clear();
 
-	if (resdata == NULL) {
+	if (resourceData.empty()) {
 		return;
 	}
 
-	MemoryReadStreamEndian readS(resdata, resdata_len, _vm->isBigEndian());
+	ByteArrayReadStreamEndian readS(resourceData, _vm->isBigEndian());
 
 	if (_vm->getGameId() == GID_IHNM) {
 		return;

Modified: scummvm/trunk/engines/saga/palanim.h
===================================================================
--- scummvm/trunk/engines/saga/palanim.h	2010-10-24 22:15:36 UTC (rev 53778)
+++ scummvm/trunk/engines/saga/palanim.h	2010-10-24 22:17:44 UTC (rev 53779)
@@ -42,7 +42,7 @@
  public:
 	PalAnim(SagaEngine *vm);
 
-	void loadPalAnim(const byte *, size_t);
+	void loadPalAnim(const ByteArray &resourceData);
 	void cycleStart();
 	void cycleStep(int vectortime);
 	void clear();

Modified: scummvm/trunk/engines/saga/resource.cpp
===================================================================
--- scummvm/trunk/engines/saga/resource.cpp	2010-10-24 22:15:36 UTC (rev 53778)
+++ scummvm/trunk/engines/saga/resource.cpp	2010-10-24 22:17:44 UTC (rev 53779)
@@ -103,8 +103,6 @@
 	uint32 subjectResourceId;
 	uint32 patchResourceId;
 	ResourceData *subjectResourceData;
-	byte *tableBuffer;
-	size_t tableSize;
 	bool isMacBinary;
 
 	if (_fileName == NULL) { // IHNM special case
@@ -141,10 +139,12 @@
 		if (subjectContext == NULL) {
 			error("ResourceContext::load() Subject context not found");
 		}
-		resource->loadResource(this, _table.size() - 1, tableBuffer, tableSize);
+		ByteArray tableBuffer;
 
-		MemoryReadStreamEndian readS2(tableBuffer, tableSize, _isBigEndian);
-		for (i = 0; i < tableSize / 8; i++) {
+		resource->loadResource(this, _table.size() - 1, tableBuffer);
+
+		ByteArrayReadStreamEndian readS2(tableBuffer, _isBigEndian);
+		for (i = 0; i < tableBuffer.size() / 8; i++) {
 			subjectResourceId = readS2.readUint32();
 			patchResourceId = readS2.readUint32();
 			subjectResourceData = subjectContext->getResourceData(subjectResourceId);
@@ -153,7 +153,6 @@
 			subjectResourceData->offset = resourceData->offset;
 			subjectResourceData->size = resourceData->size;
 		}
-		free(tableBuffer);
 	}
 
 	//process external patch files
@@ -366,7 +365,7 @@
 	}
 }
 
-void Resource::loadResource(ResourceContext *context, uint32 resourceId, byte*&resourceBuffer, size_t &resourceSize) {
+void Resource::loadResource(ResourceContext *context, uint32 resourceId, ByteArray &resourceBuffer) {
 	Common::File *file;
 	uint32 resourceOffset;
 	ResourceData *resourceData;
@@ -377,15 +376,14 @@
 	file = context->getFile(resourceData);
 
 	resourceOffset = resourceData->offset;
-	resourceSize = resourceData->size;
 
-	debug(8, "loadResource %d 0x%X:0x%X", resourceId, resourceOffset, uint(resourceSize));
+	debug(8, "loadResource %d 0x%X:0x%X", resourceId, resourceOffset, uint(resourceData->size));
+	resourceBuffer.resize(resourceData->size);
 
-	resourceBuffer = (byte*)malloc(resourceSize);
 
 	file->seek((long)resourceOffset, SEEK_SET);
 
-	if (file->read(resourceBuffer, resourceSize) != resourceSize) {
+	if (file->read(resourceBuffer.getBuffer(), resourceBuffer.size()) != resourceBuffer.size()) {
 		error("Resource::loadResource() failed to read");
 	}
 

Modified: scummvm/trunk/engines/saga/resource.h
===================================================================
--- scummvm/trunk/engines/saga/resource.h	2010-10-24 22:15:36 UTC (rev 53778)
+++ scummvm/trunk/engines/saga/resource.h	2010-10-24 22:17:44 UTC (rev 53779)
@@ -206,7 +206,7 @@
 	virtual ~Resource();
 	bool createContexts();
 	void clearContexts();
-	void loadResource(ResourceContext *context, uint32 resourceId, byte*&resourceBuffer, size_t &resourceSize);
+	void loadResource(ResourceContext *context, uint32 resourceId, ByteArray &resourceBuffer);
 
 	virtual uint32 convertResourceId(uint32 resourceId) = 0;
 	virtual void loadGlobalResources(int chapter, int actorsEntrance) = 0;

Modified: scummvm/trunk/engines/saga/resource_res.cpp
===================================================================
--- scummvm/trunk/engines/saga/resource_res.cpp	2010-10-24 22:15:36 UTC (rev 53778)
+++ scummvm/trunk/engines/saga/resource_res.cpp	2010-10-24 22:17:44 UTC (rev 53779)
@@ -66,42 +66,39 @@
 		error("Resource::loadGlobalResources() sound context not found");
 	}
 
-	byte *resourcePointer;
-	size_t resourceLength;
+	ByteArray resourceData;
 
 	if (!_vm->isIHNMDemo()) {
-		_vm->_resource->loadResource(resourceContext, metaResourceTable[chapter],
-									 resourcePointer, resourceLength);
+		_vm->_resource->loadResource(resourceContext, metaResourceTable[chapter], resourceData);
 	} else {
-		_vm->_resource->loadResource(resourceContext, metaResourceTableDemo[chapter],
-									 resourcePointer, resourceLength);
+		_vm->_resource->loadResource(resourceContext, metaResourceTableDemo[chapter], resourceData);
 	}
 
-	if (resourceLength == 0) {
+	if (resourceData.empty()) {
 		error("Resource::loadGlobalResources wrong metaResource");
 	}
 
-	MemoryReadStream metaS(resourcePointer, resourceLength);
+	{
+		ByteArrayReadStreamEndian metaS(resourceData);
 
-	_metaResource.sceneIndex = metaS.readSint16LE();
-	_metaResource.objectCount = metaS.readSint16LE();
-	_metaResource.objectsStringsResourceID = metaS.readSint32LE();
-	_metaResource.inventorySpritesID = metaS.readSint32LE();
-	_metaResource.mainSpritesID = metaS.readSint32LE();
-	_metaResource.objectsResourceID = metaS.readSint32LE();
-	_metaResource.actorCount = metaS.readSint16LE();
-	_metaResource.actorsStringsResourceID = metaS.readSint32LE();
-	_metaResource.actorsResourceID = metaS.readSint32LE();
-	_metaResource.protagFaceSpritesID = metaS.readSint32LE();
-	_metaResource.field_22 = metaS.readSint32LE();
-	_metaResource.field_26 = metaS.readSint16LE();
-	_metaResource.protagStatesCount = metaS.readSint16LE();
-	_metaResource.protagStatesResourceID = metaS.readSint32LE();
-	_metaResource.cutawayListResourceID = metaS.readSint32LE();
-	_metaResource.songTableID = metaS.readSint32LE();
+		_metaResource.sceneIndex = metaS.readSint16LE();
+		_metaResource.objectCount = metaS.readSint16LE();
+		_metaResource.objectsStringsResourceID = metaS.readSint32LE();
+		_metaResource.inventorySpritesID = metaS.readSint32LE();
+		_metaResource.mainSpritesID = metaS.readSint32LE();
+		_metaResource.objectsResourceID = metaS.readSint32LE();
+		_metaResource.actorCount = metaS.readSint16LE();
+		_metaResource.actorsStringsResourceID = metaS.readSint32LE();
+		_metaResource.actorsResourceID = metaS.readSint32LE();
+		_metaResource.protagFaceSpritesID = metaS.readSint32LE();
+		_metaResource.field_22 = metaS.readSint32LE();
+		_metaResource.field_26 = metaS.readSint16LE();
+		_metaResource.protagStatesCount = metaS.readSint16LE();
+		_metaResource.protagStatesResourceID = metaS.readSint32LE();
+		_metaResource.cutawayListResourceID = metaS.readSint32LE();
+		_metaResource.songTableID = metaS.readSint32LE();
+	}
 
-	free(resourcePointer);
-
 	_vm->_actor->loadActorList(actorsEntrance, _metaResource.actorCount,
 						  _metaResource.actorsResourceID, _metaResource.protagStatesCount,
 						  _metaResource.protagStatesResourceID);
@@ -110,9 +107,8 @@
 
 	_vm->_actor->_objectsStrings.clear();
 
-	_vm->_resource->loadResource(resourceContext, _metaResource.objectsStringsResourceID, resourcePointer, resourceLength);
-	_vm->loadStrings(_vm->_actor->_objectsStrings, resourcePointer, resourceLength);
-	free(resourcePointer);
+	_vm->_resource->loadResource(resourceContext, _metaResource.objectsStringsResourceID, resourceData);
+	_vm->loadStrings(_vm->_actor->_objectsStrings, resourceData);
 
 	if (uint(chapter) >= _vm->_sndRes->_fxTableIDs.size()) {
 		error("Chapter ID exceeds fxTableIDs length");
@@ -120,30 +116,30 @@
 
 	debug(0, "Going to read %d of %d", chapter, _vm->_sndRes->_fxTableIDs[chapter]);
 	_vm->_resource->loadResource(soundContext, _vm->_sndRes->_fxTableIDs[chapter],
-								 resourcePointer, resourceLength);
+								 resourceData);
 
-	if (resourceLength == 0) {
+	if (resourceData.empty()) {
 		error("Resource::loadGlobalResources Can't load sound effects for current track");
 	}
 
-	_vm->_sndRes->_fxTable.resize(resourceLength / 4);
-	
-	MemoryReadStream fxS(resourcePointer, resourceLength);
+	_vm->_sndRes->_fxTable.resize(resourceData.size() / 4);
 
-	for (i = 0; i < _vm->_sndRes->_fxTable.size(); i++) {
-		_vm->_sndRes->_fxTable[i].res = fxS.readSint16LE();
-		_vm->_sndRes->_fxTable[i].vol = fxS.readSint16LE();
+	{
+		ByteArrayReadStreamEndian fxS(resourceData);
+
+		for (i = 0; i < _vm->_sndRes->_fxTable.size(); i++) {
+			_vm->_sndRes->_fxTable[i].res = fxS.readSint16LE();
+			_vm->_sndRes->_fxTable[i].vol = fxS.readSint16LE();
+		}
 	}
-	free(resourcePointer);
 
 	_vm->_interface->_defPortraits.clear();
 	_vm->_sprite->loadList(_metaResource.protagFaceSpritesID, _vm->_interface->_defPortraits);
 
 	_vm->_actor->_actorsStrings.clear();
 
-	_vm->_resource->loadResource(resourceContext, _metaResource.actorsStringsResourceID, resourcePointer, resourceLength);
-	_vm->loadStrings(_vm->_actor->_actorsStrings, resourcePointer, resourceLength);
-	free(resourcePointer);
+	_vm->_resource->loadResource(resourceContext, _metaResource.actorsStringsResourceID, resourceData);
+	_vm->loadStrings(_vm->_actor->_actorsStrings, resourceData);
 
 	_vm->_sprite->_inventorySprites.clear();
 	_vm->_sprite->loadList(_metaResource.inventorySpritesID, _vm->_sprite->_inventorySprites);
@@ -153,39 +149,39 @@
 
 	_vm->_actor->loadObjList(_metaResource.objectCount, _metaResource.objectsResourceID);
 
-	_vm->_resource->loadResource(resourceContext, _metaResource.cutawayListResourceID, resourcePointer, resourceLength);
+	_vm->_resource->loadResource(resourceContext, _metaResource.cutawayListResourceID, resourceData);
 
-	if (resourceLength == 0) {
+	if (resourceData.empty()) {
 		error("Resource::loadGlobalResources Can't load cutaway list");
 	}
 
-	_vm->_anim->loadCutawayList(resourcePointer, resourceLength);
+	_vm->_anim->loadCutawayList(resourceData);
 
 	if (_metaResource.songTableID > 0) {
-		_vm->_resource->loadResource(resourceContext, _metaResource.songTableID, resourcePointer, resourceLength);
+		_vm->_resource->loadResource(resourceContext, _metaResource.songTableID, resourceData);
 
 		if (chapter == 6) {
-			int32 id = READ_LE_UINT32(&resourcePointer[actorsEntrance * 4]);
-			free(resourcePointer);
-			_vm->_resource->loadResource(resourceContext, id, resourcePointer, resourceLength);
+			if (resourceData.size() < (uint(actorsEntrance) * 4 + 4)) {
+				error("Resource::loadGlobalResources chapter 6 has wrong resource");
+			}
+			int32 id = READ_LE_UINT32(&resourceData[actorsEntrance * 4]);
+			_vm->_resource->loadResource(resourceContext, id, resourceData);
 		}
 
-		if (resourceLength == 0) {
+		if (resourceData.empty()) {
 			error("Resource::loadGlobalResources Can't load songs list for current track");
 		}
 
-		_vm->_music->_songTable.resize(resourceLength / 4);
+		_vm->_music->_songTable.resize(resourceData.size() / 4);
 
-		MemoryReadStream songS(resourcePointer, resourceLength);
+		ByteArrayReadStreamEndian songS(resourceData);
 
 		for (i = 0; i < _vm->_music->_songTable.size(); i++)
 			_vm->_music->_songTable[i] = songS.readSint32LE();
-		free(resourcePointer);
 	} else {
 		// The IHNM demo has a fixed music track and doesn't load a song table
 		_vm->_music->setVolume(_vm->_musicVolume, 1);
 		_vm->_music->play(3, MUSIC_LOOP);
-		free(resourcePointer);
 	}
 
 	int voiceLUTResourceID = 0;
@@ -201,9 +197,8 @@
 	}
 
 	if (voiceLUTResourceID) {
-		_vm->_resource->loadResource(resourceContext, voiceLUTResourceID, resourcePointer, resourceLength);
-		_vm->_script->loadVoiceLUT(_vm->_script->_globalVoiceLUT, resourcePointer, resourceLength);
-		free(resourcePointer);
+		_vm->_resource->loadResource(resourceContext, voiceLUTResourceID, resourceData);
+		_vm->_script->loadVoiceLUT(_vm->_script->_globalVoiceLUT, resourceData);
 	}
 
 	_vm->_spiritualBarometer = 0;

Modified: scummvm/trunk/engines/saga/saga.cpp
===================================================================
--- scummvm/trunk/engines/saga/saga.cpp	2010-10-24 22:15:36 UTC (rev 53778)
+++ scummvm/trunk/engines/saga/saga.cpp	2010-10-24 22:17:44 UTC (rev 53779)
@@ -393,19 +393,19 @@
 	return Common::kNoError;
 }
 
-void SagaEngine::loadStrings(StringsTable &stringsTable, const byte *stringsPointer, size_t stringsLength) {
+void SagaEngine::loadStrings(StringsTable &stringsTable, const ByteArray &stringsData) {
 	uint16 stringsCount;
 	size_t offset;
 	size_t prevOffset = 0;
 	Common::Array<size_t> tempOffsets;
 	uint ui;
 
-	if (stringsLength == 0) {
+	if (stringsData.empty()) {
 		error("SagaEngine::loadStrings() Error loading strings list resource");
 	}
 
 
-	MemoryReadStreamEndian scriptS(stringsPointer, stringsLength, isBigEndian()); //TODO: get endianess from context
+	ByteArrayReadStreamEndian scriptS(stringsData, isBigEndian()); //TODO: get endianess from context
 
 	offset = scriptS.readUint16();
 	stringsCount = offset / 2;
@@ -421,12 +421,12 @@
 		if (prevOffset > offset)
 			offset += 65536;
 		prevOffset = offset;
-		if (offset == stringsLength) {
+		if (offset == stringsData.size()) {
 			stringsCount = ui;
 			tempOffsets.resize(stringsCount);
 			break;
 		}
-		if (offset > stringsLength) {
+		if (offset > stringsData.size()) {
 			// This case should never occur, but apparently it does in the Italian fan
 			// translation of IHNM
 			warning("SagaEngine::loadStrings wrong strings table");

Modified: scummvm/trunk/engines/saga/saga.h
===================================================================
--- scummvm/trunk/engines/saga/saga.h	2010-10-24 22:15:36 UTC (rev 53778)
+++ scummvm/trunk/engines/saga/saga.h	2010-10-24 22:17:44 UTC (rev 53779)
@@ -464,11 +464,24 @@
 	 * Return a pointer to the start of the buffer underlying this byte array,
 	 * or NULL if the buffer is empty.
 	 */
-	byte *getBuffer() {
-		return empty() ? NULL : &front();
+	byte *getBuffer() const {
+		return empty() ? NULL : (byte *)&front();
 	}
+
+	void assign(const ByteArray &src) {
+		resize(src.size());
+		if (!empty()) {
+			memcpy(&front(), &src.front(), size());
+		}
+	}
 };
 
+class ByteArrayReadStreamEndian : public MemoryReadStreamEndian {
+public:
+	ByteArrayReadStreamEndian(const ByteArray & byteArray, bool bigEndian = false) : MemoryReadStreamEndian(byteArray.getBuffer(), byteArray.size(), bigEndian) {
+	}
+};
+
 class SagaEngine : public Engine {
 	friend class Scene;
 
@@ -553,10 +566,16 @@
 	uint32 _previousTicks;
 
 public:
-	bool decodeBGImage(const byte *image_data, size_t image_size, ByteArray &outputBuffer, int *w, int *h, bool flip = false);
-	const byte *getImagePal(const byte *image_data, size_t image_size);
-	void loadStrings(StringsTable &stringsTable, const byte *stringsPointer, size_t stringsLength);
+	bool decodeBGImage(const ByteArray &imageData, ByteArray &outputBuffer, int *w, int *h, bool flip = false);
+	const byte *getImagePal(const ByteArray &imageData) {
+		if (imageData.size() <= SAGA_IMAGE_HEADER_LEN) {
+			return NULL;
+		}
 
+		return &imageData.front() + SAGA_IMAGE_HEADER_LEN;
+	}
+	void loadStrings(StringsTable &stringsTable, const ByteArray &stringsData);
+
 	const char *getObjectName(uint16 objectId) const;
 public:
 	int processInput();

Modified: scummvm/trunk/engines/saga/scene.cpp
===================================================================
--- scummvm/trunk/engines/saga/scene.cpp	2010-10-24 22:15:36 UTC (rev 53778)
+++ scummvm/trunk/engines/saga/scene.cpp	2010-10-24 22:17:44 UTC (rev 53779)
@@ -137,8 +137,7 @@
 };
 
 Scene::Scene(SagaEngine *vm) : _vm(vm) {
-	byte *sceneLUTPointer;
-	size_t sceneLUTLength;
+	ByteArray sceneLUTData;
 	uint32 resourceId;
 	uint i;
 
@@ -158,21 +157,19 @@
 	// 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 @@
 	// 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::loadSceneDescriptor(uint32 resourceId) {
-	byte *sceneDescriptorData;
-	size_t sceneDescriptorDataLength;
+	ByteArray sceneDescriptorData;
 
 	_sceneDescription.reset();
 
@@ -896,10 +892,10 @@
 		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 @@
 		_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 @@
 	}
 
 	// 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 @@
 		}
 
 	}
-	free(resourceListData);
 }
 
 void Scene::processSceneResources() {
-	byte *resourceData;
-	size_t resourceDataLength;
 	const byte *palPointer;
 	SAGAResourceTypes *types = 0;
 	int typesCount = 0;
@@ -964,8 +954,7 @@
 		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 @@
 			}
 
 			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 @@
 				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 @@
 			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 @@
 
 			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 @@
 
 			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 @@
 
 			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 @@
 
 			debug(3, "Loading isometric metatiles resource.");
 
-			_vm->_isoMap->loadMetaTiles(resourceData, resourceDataLength);
+			_vm->_isoMap->loadMetaTiles(resourceData);
 			break;
 		case SAGA_ANIM:
 			{
@@ -1079,12 +1063,12 @@
 
 				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 @@
 
 			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 @@
 		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::endScene() {
 	Rect rect;
-	size_t i;
 
 	if (!_sceneLoaded)
 		return;
@@ -1197,10 +1180,6 @@
 	}
 
 	// 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 @@
 	_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();

Modified: scummvm/trunk/engines/saga/scene.h
===================================================================
--- scummvm/trunk/engines/saga/scene.h	2010-10-24 22:15:36 UTC (rev 53778)
+++ scummvm/trunk/engines/saga/scene.h	2010-10-24 22:17:44 UTC (rev 53779)
@@ -110,11 +110,10 @@
 struct SceneResourceData {
 	uint32 resourceId;
 	int resourceType;
-	byte *buffer;
-	size_t size;
+	ByteArray buffer;
 	bool invalid;
 
-	SceneResourceData() : resourceId(0), resourceType(0), buffer(NULL), size(0), invalid(false) {
+	SceneResourceData() : resourceId(0), resourceType(0),  invalid(false) {
 	}
 };
 
@@ -151,8 +150,6 @@
 	int h;
 	int p;
 	ByteArray buffer;
-	byte *res_buf;
-	size_t res_len;
 	PalEntry pal[256];
 
 	SceneImage() : loaded(false), w(0), h(0), p(0) {
@@ -364,7 +361,7 @@
 	void loadScene(LoadSceneParams &loadSceneParams);
 	void loadSceneDescriptor(uint32 resourceId);
 	void loadSceneResourceList(uint32 resourceId);
-	void loadSceneEntryList(const byte* resourcePointer, size_t resourceLength);
+	void loadSceneEntryList(const ByteArray &resourceData);
 	void processSceneResources();
 	void getResourceTypes(SAGAResourceTypes *&types, int &typesCount);
 

Modified: scummvm/trunk/engines/saga/script.cpp
===================================================================
--- scummvm/trunk/engines/saga/script.cpp	2010-10-24 22:15:36 UTC (rev 53778)
+++ scummvm/trunk/engines/saga/script.cpp	2010-10-24 22:17:44 UTC (rev 53779)
@@ -46,13 +46,11 @@
 
 SAGA1Script::SAGA1Script(SagaEngine *vm) : Script(vm) {
 	ResourceContext *resourceContext;
-	byte *resourcePointer;
-	size_t resourceLength;
+	ByteArray resourceData;
 	int prevTell;
 	uint ui;
 	int j;
-	byte *stringsPointer;
-	size_t stringsLength;
+	ByteArray stringsData;
 
 	//initialize member variables
 	_abortEnabled = true;
@@ -85,19 +83,19 @@
 	uint32 scriptResourceId = 0;
 	scriptResourceId = _vm->getResourceDescription()->moduleLUTResourceId;
 	debug(3, "Loading module LUT from resource %i", scriptResourceId);
-	_vm->_resource->loadResource(resourceContext, scriptResourceId, resourcePointer, resourceLength);
+	_vm->_resource->loadResource(resourceContext, scriptResourceId, resourceData);
 
 	// Create logical script LUT from resource
-	if (resourceLength % 22 == 0) {			// ITE CD
+	if (resourceData.size() % 22 == 0) {			// ITE CD
 		_modulesLUTEntryLen = 22;
-	} else if (resourceLength % 16 == 0) {	// ITE disk, IHNM
+	} else if (resourceData.size() % 16 == 0) {	// ITE disk, IHNM
 		_modulesLUTEntryLen = 16;
 	} else {
-		error("Script::Script() Invalid script lookup table length (%i)", (int)resourceLength);
+		error("Script::Script() Invalid script lookup table length (%i)", (int)resourceData.size());
 	}
 
 	// Calculate number of entries
-	int modulesCount = resourceLength / _modulesLUTEntryLen;
+	int modulesCount = resourceData.size() / _modulesLUTEntryLen;
 
 	debug(3, "LUT has %i entries", modulesCount);
 
@@ -105,7 +103,7 @@
 	_modules.resize(modulesCount);
 
 	// Convert LUT resource to logical LUT
-	MemoryReadStreamEndian scriptS(resourcePointer, resourceLength, resourceContext->isBigEndian());
+	ByteArrayReadStreamEndian scriptS(resourceData, resourceContext->isBigEndian());
 	for (ui = 0; ui < _modules.size(); ui++) {
 
 		prevTell = scriptS.pos();
@@ -120,8 +118,6 @@
 		}
 	}
 
-	free(resourcePointer);
-
 	// TODO
 	//
 	// In ITE, the "main strings" resource contains both the verb strings
@@ -130,10 +126,9 @@
 	// In IHNM, the "main strings" contains the verb strings, but not the
 	// object names. At least, I think that's the case.
 
-	_vm->_resource->loadResource(resourceContext, _vm->getResourceDescription()->mainStringsResourceId, stringsPointer, stringsLength);
+	_vm->_resource->loadResource(resourceContext, _vm->getResourceDescription()->mainStringsResourceId, stringsData);
 
-	_vm->loadStrings(_mainStrings, stringsPointer, stringsLength);
-	free(stringsPointer);
+	_vm->loadStrings(_mainStrings, stringsData);
 
 	setupScriptOpcodeList();
 
@@ -155,8 +150,7 @@
 }
 
 SAGA2Script::SAGA2Script(SagaEngine *vm) : Script(vm) {
-	byte *resourcePointer;
-	size_t resourceLength;
+	ByteArray resourceData;
 
 	debug(8, "Initializing scripting subsystem");
 	// Load script resource file context
@@ -171,12 +165,12 @@
 	if (entryNum < 0)
 		error("Unable to locate the script's export segment");
 	debug(3, "Loading module LUT from resource %i", entryNum);
-	_vm->_resource->loadResource(_scriptContext, (uint32)entryNum, resourcePointer, resourceLength);
+	_vm->_resource->loadResource(_scriptContext, (uint32)entryNum, resourceData);
 
 	_modulesLUTEntryLen = sizeof(uint32);
 
 	// Calculate number of entries
-	int modulesCount = resourceLength / _modulesLUTEntryLen + 1;
+	int modulesCount = resourceData.size() / _modulesLUTEntryLen + 1;
 
 	debug(3, "LUT has %i entries", modulesCount);
 
@@ -1055,8 +1049,7 @@
 }
 
 void Script::loadModule(uint scriptModuleNumber) {
-	byte *resourcePointer;
-	size_t resourceLength;
+	ByteArray resourceData;
 
 	// Validate script number
 	if (scriptModuleNumber >= _modules.size()) {
@@ -1070,21 +1063,18 @@
 	// Initialize script data structure
 	debug(3, "Loading script module #%d", scriptModuleNumber);
 
-	_vm->_resource->loadResource(_scriptContext, _modules[scriptModuleNumber].scriptResourceId, resourcePointer, resourceLength);
+	_vm->_resource->loadResource(_scriptContext, _modules[scriptModuleNumber].scriptResourceId, resourceData);
 
-	loadModuleBase(_modules[scriptModuleNumber], resourcePointer, resourceLength);
-	free(resourcePointer);
+	loadModuleBase(_modules[scriptModuleNumber], resourceData);
 
-	_vm->_resource->loadResource(_scriptContext, _modules[scriptModuleNumber].stringsResourceId, resourcePointer, resourceLength);
+	_vm->_resource->loadResource(_scriptContext, _modules[scriptModuleNumber].stringsResourceId, resourceData);
 
-	_vm->loadStrings(_modules[scriptModuleNumber].strings, resourcePointer, resourceLength);
-	free(resourcePointer);
+	_vm->loadStrings(_modules[scriptModuleNumber].strings, resourceData);
 
 	if (_modules[scriptModuleNumber].voicesResourceId > 0) {
-		_vm->_resource->loadResource(_scriptContext, _modules[scriptModuleNumber].voicesResourceId, resourcePointer, resourceLength);
+		_vm->_resource->loadResource(_scriptContext, _modules[scriptModuleNumber].voicesResourceId, resourceData);
 
-		loadVoiceLUT(_modules[scriptModuleNumber].voiceLUT, resourcePointer, resourceLength);
-		free(resourcePointer);
+		loadVoiceLUT(_modules[scriptModuleNumber].voiceLUT, resourceData);
 	}
 
 	_modules[scriptModuleNumber].staticOffset = _staticSize;
@@ -1105,16 +1095,14 @@
 	_staticSize = 0;
 }
 
-void Script::loadModuleBase(ModuleData &module, const byte *resourcePointer, size_t resourceLength) {
+void Script::loadModuleBase(ModuleData &module, const ByteArray &resourceData) {
 	uint i;
 
 	debug(3, "Loading module base...");
 
-	module.moduleBase.resize(resourceLength);
-	
-	memcpy(module.moduleBase.getBuffer(), resourcePointer, resourceLength);
+	module.moduleBase.assign(resourceData);
 
-	MemoryReadStreamEndian scriptS(module.moduleBase.getBuffer(), module.moduleBase.size(), _scriptContext->isBigEndian());
+	ByteArrayReadStreamEndian scriptS(module.moduleBase, _scriptContext->isBigEndian());
 
 	uint entryPointsCount = scriptS.readUint16();
 	scriptS.readUint16(); //skip
@@ -1152,12 +1140,12 @@
 	}
 }
 
-void Script::loadVoiceLUT(VoiceLUT &voiceLUT, const byte *resourcePointer, size_t resourceLength) {
+void Script::loadVoiceLUT(VoiceLUT &voiceLUT, const ByteArray &resourceData) {
 	uint16 i;
 
-	voiceLUT.resize(resourceLength / 2);
+	voiceLUT.resize(resourceData.size() / 2);
 
-	MemoryReadStreamEndian scriptS(resourcePointer, resourceLength, _scriptContext->isBigEndian());
+	ByteArrayReadStreamEndian scriptS(resourceData, _scriptContext->isBigEndian());
 
 	for (i = 0; i < voiceLUT.size(); i++) {
 		voiceLUT[i] = scriptS.readUint16();

Modified: scummvm/trunk/engines/saga/script.h
===================================================================
--- scummvm/trunk/engines/saga/script.h	2010-10-24 22:15:36 UTC (rev 53778)
+++ scummvm/trunk/engines/saga/script.h	2010-10-24 22:17:44 UTC (rev 53779)
@@ -392,10 +392,10 @@
 	void wakeUpThreads(int waitType);
 	void wakeUpThreadsDelayed(int waitType, int sleepTime);
 
-	void loadVoiceLUT(VoiceLUT &voiceLUT, const byte *resourcePointer, size_t resourceLength);
+	void loadVoiceLUT(VoiceLUT &voiceLUT, const ByteArray &resourceData);
 
 protected:
-	void loadModuleBase(ModuleData &module, const byte *resourcePointer, size_t resourceLength);
+	void loadModuleBase(ModuleData &module, const ByteArray &resourceData);
 
 	// runThread returns true if we should break running of other threads
 	bool runThread(ScriptThread &thread);

Modified: scummvm/trunk/engines/saga/sndres.cpp
===================================================================
--- scummvm/trunk/engines/saga/sndres.cpp	2010-10-24 22:15:36 UTC (rev 53778)
+++ scummvm/trunk/engines/saga/sndres.cpp	2010-10-24 22:17:44 UTC (rev 53779)
@@ -74,29 +74,24 @@
 			error("Resource::loadGlobalResources() resource context not found");
 		}
 
-		byte *resourcePointer;
-		size_t resourceLength;
+		ByteArray resourceData;
 
 		if (_vm->isIHNMDemo()) {
-			_vm->_resource->loadResource(resourceContext, RID_IHNMDEMO_SFX_LUT,
-									 resourcePointer, resourceLength);
+			_vm->_resource->loadResource(resourceContext, RID_IHNMDEMO_SFX_LUT, resourceData);
 		} else {
-			_vm->_resource->loadResource(resourceContext, RID_IHNM_SFX_LUT,
-									 resourcePointer, resourceLength);
+			_vm->_resource->loadResource(resourceContext, RID_IHNM_SFX_LUT, resourceData);
 		}
 
-		if (resourceLength == 0) {
+		if (resourceData.empty()) {
 			error("Sndres::SndRes can't read SfxIDs table");
 		}
 
-		_fxTableIDs.resize(resourceLength / 2);
+		_fxTableIDs.resize(resourceData.size() / 2);
 
-		MemoryReadStream metaS(resourcePointer, resourceLength);
+		ByteArrayReadStreamEndian metaS(resourceData);
 		for (uint i = 0; i < _fxTableIDs.size(); i++) {
 			_fxTableIDs[i] = metaS.readSint16LE();
 		}
-
-		free(resourcePointer);
 #endif
 #ifdef ENABLE_SAGA2
 	} else if (_vm->getGameId() == GID_DINO) {

Modified: scummvm/trunk/engines/saga/sprite.cpp
===================================================================
--- scummvm/trunk/engines/saga/sprite.cpp	2010-10-24 22:15:36 UTC (rev 53778)
+++ scummvm/trunk/engines/saga/sprite.cpp	2010-10-24 22:17:44 UTC (rev 53779)
@@ -75,8 +75,7 @@
 
 void Sprite::loadList(int resourceId, SpriteList &spriteList) {
 	SpriteInfo *spriteInfo;
-	byte *spriteListData = 0;
-	size_t spriteListLength = 0;
+	ByteArray spriteListData;
 	uint16 oldSpriteCount;
 	uint16 newSpriteCount;
 	uint16 spriteCount;
@@ -86,13 +85,13 @@
 	const byte *spritePointer;
 	const byte *spriteDataPointer;
 
-	_vm->_resource->loadResource(_spriteContext, resourceId, spriteListData, spriteListLength);
+	_vm->_resource->loadResource(_spriteContext, resourceId, spriteListData);
 
-	if (spriteListLength == 0) {
+	if (spriteListData.empty()) {
 		return;
 	}
 
-	MemoryReadStreamEndian readS(spriteListData, spriteListLength, _spriteContext->isBigEndian());
+	ByteArrayReadStreamEndian readS(spriteListData, _spriteContext->isBigEndian());
 
 	spriteCount = readS.readUint16();
 
@@ -112,14 +111,14 @@
 		else
 			offset = readS.readUint16();
 
-		if (offset >= spriteListLength) {
+		if (offset >= spriteListData.size()) {
 			// ITE Mac demos throw this warning
 			warning("Sprite::loadList offset exceeded");
 			spriteList.resize(i);
 			return;
 		}
 
-		spritePointer = spriteListData;
+		spritePointer = spriteListData.getBuffer();
 		spritePointer += offset;
 
 		if (bigHeader) {
@@ -144,7 +143,7 @@
 		}
 
 		outputLength = spriteInfo->width * spriteInfo->height;
-		inputLength = spriteListLength - (spriteDataPointer - spriteListData);
+		inputLength = spriteListData.size() - (spriteDataPointer - spriteListData.getBuffer());
 		spriteInfo->decodedBuffer.resize(outputLength);
 		if (outputLength > 0) {
 			decodeRLEBuffer(spriteDataPointer, inputLength, outputLength);
@@ -167,8 +166,6 @@
 				memcpy(dst, &_decodeBuf.front(), outputLength);
 		}
 	}
-
-	free(spriteListData);
 }
 
 void Sprite::getScaledSpriteBuffer(SpriteList &spriteList, uint spriteNumber, int scale, int &width, int &height, int &xAlign, int &yAlign, const byte *&buffer) {


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list