[Scummvm-cvs-logs] SF.net SVN: scummvm:[44637] scummvm/trunk/engines/sci/gui

m_kiewitz at users.sourceforge.net m_kiewitz at users.sourceforge.net
Sun Oct 4 23:57:56 CEST 2009


Revision: 44637
          http://scummvm.svn.sourceforge.net/scummvm/?rev=44637&view=rev
Author:   m_kiewitz
Date:     2009-10-04 21:57:31 +0000 (Sun, 04 Oct 2009)

Log Message:
-----------
SCI/newgui: ega view loading implemented, unpacking still missing

Modified Paths:
--------------
    scummvm/trunk/engines/sci/gui/gui_view.cpp
    scummvm/trunk/engines/sci/gui/gui_view.h

Modified: scummvm/trunk/engines/sci/gui/gui_view.cpp
===================================================================
--- scummvm/trunk/engines/sci/gui/gui_view.cpp	2009-10-04 21:30:13 UTC (rev 44636)
+++ scummvm/trunk/engines/sci/gui/gui_view.cpp	2009-10-04 21:57:31 UTC (rev 44637)
@@ -58,16 +58,15 @@
 	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 @@
 		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 @@
 				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 @@
 
 	case kViewAmiga: // View-format on amiga
 		// FIXME
+		error("ViewType Amiga is currently unsupported");
 		break;
 
 	default:
@@ -212,13 +226,22 @@
 	}
 }
 
-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 @@
 			}
 		}
 	} else {
+		literalPtr = _resourceData + cellInfo->offsetLiteral;
 		while (pixelNo < pixelCount) {
 			b = *rlePtr++;
 			brun = b & 0x3F; // bytes run length on this step
@@ -272,11 +296,10 @@
 	_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) {

Modified: scummvm/trunk/engines/sci/gui/gui_view.h
===================================================================
--- scummvm/trunk/engines/sci/gui/gui_view.h	2009-10-04 21:30:13 UTC (rev 44636)
+++ scummvm/trunk/engines/sci/gui/gui_view.h	2009-10-04 21:57:31 UTC (rev 44637)
@@ -33,6 +33,7 @@
 	char displaceX;
 	byte displaceY;
 	byte clearKey;
+	uint16 offsetEGA;
 	uint16 offsetRLE;
 	uint16 offsetLiteral;
 	byte *rawBitmap;
@@ -62,7 +63,7 @@
 
 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;


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