diff options
| author | Martin Kiewitz | 2009-10-04 21:57:31 +0000 | 
|---|---|---|
| committer | Martin Kiewitz | 2009-10-04 21:57:31 +0000 | 
| commit | 6063d5fbe9c183a106ddeca27992b26b8a6a38d5 (patch) | |
| tree | 62a8cfde25f07c4ae435336378b88d56f995ac25 | |
| parent | 08c7ec123def1bfb298bfe30f918ba4f78a2ecea (diff) | |
| download | scummvm-rg350-6063d5fbe9c183a106ddeca27992b26b8a6a38d5.tar.gz scummvm-rg350-6063d5fbe9c183a106ddeca27992b26b8a6a38d5.tar.bz2 scummvm-rg350-6063d5fbe9c183a106ddeca27992b26b8a6a38d5.zip | |
SCI/newgui: ega view loading implemented, unpacking still missing
svn-id: r44637
| -rw-r--r-- | engines/sci/gui/gui_view.cpp | 51 | ||||
| -rw-r--r-- | engines/sci/gui/gui_view.h | 3 | 
2 files changed, 39 insertions, 15 deletions
| diff --git a/engines/sci/gui/gui_view.cpp b/engines/sci/gui/gui_view.cpp index 048cfc0198..eb38a2ccaf 100644 --- a/engines/sci/gui/gui_view.cpp +++ b/engines/sci/gui/gui_view.cpp @@ -58,16 +58,15 @@ void SciGUIview::initData(GUIResourceId resourceId) {  	uint16 loopSize = 0, cellSize = 0;  	int loopNo, cellNo;  	byte seekEntry; +	bool IsEGA = false;  	_embeddedPal = false;  	_loopCount = 0;  	switch (_s->resMan->getViewType()) { -	case kViewEga: // View-format SCI0/SCI0 -		// FIXME: seems to be almost the same as kViewVga -		break; - +	case kViewEga: // View-format SCI0 +		IsEGA = true;  	case kViewVga: // View-format SCI1  		// LoopCount:WORD MirrorMask:WORD Version:WORD PaletteOffset:WORD LoopOffset0:WORD LoopOffset1:WORD... @@ -77,7 +76,11 @@ void SciGUIview::initData(GUIResourceId resourceId) {  		palOffset = READ_LE_UINT16(_resourceData + 6);  		if (palOffset && palOffset != 0x100) { -			_gfx->CreatePaletteFromData(&_resourceData[palOffset], &_palette); +			if (IsEGA) { +				// translation map for 16 colors +			} else { +				_gfx->CreatePaletteFromData(&_resourceData[palOffset], &_palette); +			}  			_embeddedPal = true;  		} @@ -97,13 +100,23 @@ void SciGUIview::initData(GUIResourceId resourceId) {  				cellOffset = READ_LE_UINT16(loopData + 4 + cellNo * 2);  				cellData = _resourceData + cellOffset; +				// For VGA +				// Width:WORD Height:WORD DisplaceX:BYTE DisplaceY:BYTE ClearKey:BYTE Unknown:BYTE RLEData starts now directly +				// For EGA +				// Width:WORD Height:WORD DisplaceX:BYTE DisplaceY:BYTE ClearKey:BYTE EGAData starts now directly  				cell = &_loop[loopNo].cell[cellNo];  				cell->width = READ_LE_UINT16(cellData);  				cell->height = READ_LE_UINT16(cellData + 2);  				cell->displaceX = cellData[4];  				cell->displaceY = cellData[5];  				cell->clearKey = cellData[6]; -				cell->offsetRLE = cellOffset + 8; +				if (IsEGA) { +					cell->offsetEGA = cellOffset + 7; +					cell->offsetRLE = 0; +				} else { +					cell->offsetEGA = 0; +					cell->offsetRLE = cellOffset + 8; +				}  				cell->offsetLiteral = 0;  				cell->rawBitmap = 0;  				if (_loop[loopNo].mirrorFlag) @@ -165,6 +178,7 @@ void SciGUIview::initData(GUIResourceId resourceId) {  	case kViewAmiga: // View-format on amiga  		// FIXME +		error("ViewType Amiga is currently unsupported");  		break;  	default: @@ -212,13 +226,22 @@ void SciGUIview::getCellRect(GUIViewLoopNo loopNo, GUIViewCellNo cellNo, int16 x  	}  } -void SciGUIview::unpackView(GUIViewLoopNo loopNo, GUIViewCellNo cellNo, byte *outPtr, uint16 pixelCount) { -	byte *rlePtr = _resourceData + _loop[loopNo].cell[cellNo].offsetRLE; -	byte *literalPtr = _resourceData + _loop[loopNo].cell[cellNo].offsetLiteral; +void SciGUIview::unpackCel(GUIViewLoopNo loopNo, GUIViewCellNo cellNo, byte *outPtr, uint16 pixelCount) { +	sciViewCellInfo *cellInfo = getCellInfo(loopNo, cellNo); +	byte *rlePtr; +	byte *literalPtr;  	uint16 pixelNo = 0, brun;  	byte b; -	if (literalPtr == _resourceData) { // no extra literal data +	if (cellInfo->offsetEGA) { // EGA data +		literalPtr = _resourceData + _loop[loopNo].cell[cellNo].offsetEGA; +		// FIXME: Implement EGA "decompression" +		return; +	} + + +	rlePtr = _resourceData + cellInfo->offsetRLE; +	if (!cellInfo->offsetLiteral) { // no extra literal data  		while (pixelNo < pixelCount) {  			b = *rlePtr++;  			brun = b & 0x3F; // bytes run length on this step @@ -237,6 +260,7 @@ void SciGUIview::unpackView(GUIViewLoopNo loopNo, GUIViewCellNo cellNo, byte *ou  			}  		}  	} else { +		literalPtr = _resourceData + cellInfo->offsetLiteral;  		while (pixelNo < pixelCount) {  			b = *rlePtr++;  			brun = b & 0x3F; // bytes run length on this step @@ -272,11 +296,10 @@ byte *SciGUIview::getBitmap(GUIViewLoopNo loopNo, GUIViewCellNo cellNo) {  	_loop[loopNo].cell[cellNo].rawBitmap = new byte[pixelCount];  	byte *pOut = _loop[loopNo].cell[cellNo].rawBitmap; +	// Some RLE compressed cels end with the last non-transparent pixel, thats why we fill it up here +	//  FIXME: change this to fill the remaining bytes within unpackCel()  	memset(pOut, _loop[loopNo].cell[cellNo].clearKey, pixelCount); -	//if (g_sci->getPlatform() == Common::kPlatformAmiga) -	//	unpackViewAmiga(ptr, pOut, pixelCount); -	//else -		unpackView(loopNo, cellNo, pOut, pixelCount); +	unpackCel(loopNo, cellNo, pOut, pixelCount);  	// mirroring the view if needed  	if (_loop[loopNo].mirrorFlag) { diff --git a/engines/sci/gui/gui_view.h b/engines/sci/gui/gui_view.h index f999adf09c..fa06156d39 100644 --- a/engines/sci/gui/gui_view.h +++ b/engines/sci/gui/gui_view.h @@ -33,6 +33,7 @@ struct sciViewCellInfo {  	char displaceX;  	byte displaceY;  	byte clearKey; +	uint16 offsetEGA;  	uint16 offsetRLE;  	uint16 offsetLiteral;  	byte *rawBitmap; @@ -62,7 +63,7 @@ public:  private:  	void initData(GUIResourceId resourceId); -	void unpackView(GUIViewLoopNo loopNo, GUIViewCellNo cellNo, byte *outPtr, uint16 pixelCount); +	void unpackCel(GUIViewLoopNo loopNo, GUIViewCellNo cellNo, byte *outPtr, uint16 pixelCount);  	OSystem *_system;  	EngineState *_s; | 
