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

m_kiewitz at users.sourceforge.net m_kiewitz at users.sourceforge.net
Thu Jul 22 12:24:08 CEST 2010


Revision: 51134
          http://scummvm.svn.sourceforge.net/scummvm/?rev=51134&view=rev
Author:   m_kiewitz
Date:     2010-07-22 10:24:08 +0000 (Thu, 22 Jul 2010)

Log Message:
-----------
SCI: some work on priority in sci32

Modified Paths:
--------------
    scummvm/trunk/engines/sci/engine/selector.cpp
    scummvm/trunk/engines/sci/engine/selector.h
    scummvm/trunk/engines/sci/graphics/frameout.cpp
    scummvm/trunk/engines/sci/graphics/picture.cpp
    scummvm/trunk/engines/sci/graphics/picture.h

Modified: scummvm/trunk/engines/sci/engine/selector.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/selector.cpp	2010-07-22 09:36:04 UTC (rev 51133)
+++ scummvm/trunk/engines/sci/engine/selector.cpp	2010-07-22 10:24:08 UTC (rev 51134)
@@ -178,6 +178,8 @@
 	FIND_SELECTOR(dimmed);
 	FIND_SELECTOR(fore);
 	FIND_SELECTOR(back);
+	FIND_SELECTOR(fixPriority);
+	FIND_SELECTOR(mirrored);
 #endif
 }
 

Modified: scummvm/trunk/engines/sci/engine/selector.h
===================================================================
--- scummvm/trunk/engines/sci/engine/selector.h	2010-07-22 09:36:04 UTC (rev 51133)
+++ scummvm/trunk/engines/sci/engine/selector.h	2010-07-22 10:24:08 UTC (rev 51134)
@@ -142,6 +142,9 @@
 	Selector fore;
 	Selector back;
 	Selector dimmed;
+
+	Selector fixPriority;
+	Selector mirrored;
 #endif
 };
 

Modified: scummvm/trunk/engines/sci/graphics/frameout.cpp
===================================================================
--- scummvm/trunk/engines/sci/graphics/frameout.cpp	2010-07-22 09:36:04 UTC (rev 51133)
+++ scummvm/trunk/engines/sci/graphics/frameout.cpp	2010-07-22 10:24:08 UTC (rev 51134)
@@ -157,6 +157,7 @@
 		GuiResourceId planePictureNr = readSelectorValue(_segMan, planeObject, SELECTOR(picture));
 		GfxPicture *planePicture = 0;
 		int16 planePictureCels = 0;
+		bool planePictureMirrored = false;
 
 		if ((planePictureNr != 0xFFFF) && (planePictureNr != 0xFFFE)) {
 			planePicture = new GfxPicture(_resMan, _coordAdjuster, 0, _screen, _palette, planePictureNr, false);
@@ -164,6 +165,9 @@
 
 			_coordAdjuster->pictureSetDisplayArea(planeRect);
 			_palette->drewPicture(planePictureNr);
+
+			if (readSelectorValue(_segMan, planeObject, SELECTOR(mirrored)))
+				planePictureMirrored = true;
 		}
 
 		// Fill our itemlist for this plane
@@ -191,6 +195,9 @@
 				itemEntry->y = readSelectorValue(_segMan, itemObject, SELECTOR(y));
 				itemEntry->z = readSelectorValue(_segMan, itemObject, SELECTOR(z));
 				itemEntry->priority = readSelectorValue(_segMan, itemObject, SELECTOR(priority));
+				if (readSelectorValue(_segMan, itemObject, SELECTOR(fixPriority)) == 0)
+					itemEntry->priority = itemEntry->y;
+
 				if (gameId == GID_GK1) {
 					if ((itemEntry->viewId == 11000) && (itemEntry->loopNo == 0) && (itemEntry->celNo == 0) && (itemEntry->priority == 1)) {
 						itemEntry->priority = 0; // HACK for gk1 hires main menu
@@ -209,35 +216,60 @@
 				itemEntry->y += planeRect.top;
 				itemEntry->x += planeRect.left;
 
-				if (!(itemEntry->signal & 0x0010)) {	// kSignalFixedPriority
-					// TODO: Change priority of this item
-				}
-
 				itemList.push_back(itemEntry);
 				itemEntry++;
 				itemCount++;
 			}
 		}
 
+		FrameoutEntry *pictureCels = NULL;
+
+		if (planePicture) {
+			// Show base picture
+			planePicture->drawSci32Vga(0, 0, 0, planePictureMirrored);
+			// Allocate memory for picture cels
+			pictureCels = (FrameoutEntry *)malloc(planePicture->getSci32celCount() * sizeof(FrameoutEntry));
+			// Add following cels to the itemlist
+			FrameoutEntry *picEntry = pictureCels;
+			for (int pictureCelNr = 1; pictureCelNr < planePictureCels; pictureCelNr++) {
+				picEntry->celNo = pictureCelNr;
+				picEntry->object = NULL_REG;
+				picEntry->y = planePicture->getSci32celY(pictureCelNr);
+				picEntry->x = planePicture->getSci32celX(pictureCelNr);
+
+				int16 celHeight = planePicture->getSci32celHeight(pictureCelNr);
+				if (_screen->getWidth() > 320)
+					celHeight = celHeight / 2;
+
+				picEntry->priority = picEntry->y + celHeight;
+
+				picEntry->y = ((picEntry->y * _screen->getHeight()) / planeResY);
+				picEntry->x = ((picEntry->x * _screen->getWidth()) / planeResX);
+
+				itemList.push_back(picEntry);
+				picEntry++;
+			}
+		}
+
 		// Now sort our itemlist
 		Common::sort(itemList.begin(), itemList.end(), sortHelper);
 
 		// Now display itemlist
-		int16 planePictureCel = 0;
 		itemEntry = itemData;
 
 		for (FrameoutList::iterator listIterator = itemList.begin(); listIterator != itemList.end(); listIterator++) {
 			itemEntry = *listIterator;
-			if (planePicture) {
-				while ((planePictureCel <= itemEntry->priority) && (planePictureCel < planePictureCels)) {
-					planePicture->drawSci32Vga(planePictureCel, planeResY, planeResX);
-					planePictureCel++;
-				}
-			}
 
-			if (itemEntry->viewId != 0xFFFF) {
+			if (itemEntry->object.isNull()) {
+				// Picture cel data
+				planePicture->drawSci32Vga(itemEntry->celNo, itemEntry->x, itemEntry->y, planePictureMirrored);
+//				warning("picture cel %d %d", itemEntry->celNo, itemEntry->priority);
+
+			} else if (itemEntry->viewId != 0xFFFF) {
 				GfxView *view = _cache->getView(itemEntry->viewId);
 
+//				warning("view %s %d", _segMan->getObjectName(itemEntry->object), itemEntry->priority);
+
 				if (view->isSci2Hires())
 					_screen->adjustToUpscaledCoordinates(itemEntry->y, itemEntry->x);
 
@@ -301,10 +333,7 @@
 		}
 
 		if (planePicture) {
-			while (planePictureCel < planePictureCels) {
-				planePicture->drawSci32Vga(planePictureCel, planeResY, planeResX);
-				planePictureCel++;
-			}
+			free(pictureCels);
 			delete planePicture;
 			planePicture = 0;
 		}

Modified: scummvm/trunk/engines/sci/graphics/picture.cpp
===================================================================
--- scummvm/trunk/engines/sci/graphics/picture.cpp	2010-07-22 09:36:04 UTC (rev 51133)
+++ scummvm/trunk/engines/sci/graphics/picture.cpp	2010-07-22 10:24:08 UTC (rev 51134)
@@ -131,19 +131,40 @@
 	return inbuffer[2];
 }
 
-void GfxPicture::drawSci32Vga(int16 celNo, uint16 planeResY, uint16 planeResX) {
+int16 GfxPicture::getSci32celY(int16 celNo) {
 	byte *inbuffer = _resource->data;
+	int header_size = READ_LE_UINT16(inbuffer);
+	int cel_headerPos = header_size + 42 * celNo;
+	return READ_LE_UINT16(inbuffer + cel_headerPos + 40);
+}
+
+int16 GfxPicture::getSci32celX(int16 celNo) {
+	byte *inbuffer = _resource->data;
+	int header_size = READ_LE_UINT16(inbuffer);
+	int cel_headerPos = header_size + 42 * celNo;
+	return READ_LE_UINT16(inbuffer + cel_headerPos + 38);
+}
+
+int16 GfxPicture::getSci32celHeight(int16 celNo) {
+	byte *inbuffer = _resource->data;
+	int header_size = READ_LE_UINT16(inbuffer);
+	int cel_headerPos = header_size + 42 * celNo;
+	return READ_LE_UINT16(inbuffer + cel_headerPos + 2);
+}
+
+void GfxPicture::drawSci32Vga(int16 celNo, int16 callerX, int16 callerY, bool mirrored) {
+	byte *inbuffer = _resource->data;
 	int size = _resource->size;
 	int header_size = READ_LE_UINT16(inbuffer);
 	int palette_data_ptr = READ_LE_UINT16(inbuffer + 6);
 	int celCount = inbuffer[2];
 	int cel_headerPos = header_size;
 	int cel_RlePos, cel_LiteralPos;
-	int cel_relXpos, cel_relYpos;
+//	int cel_relXpos, cel_relYpos;
 	Palette palette;
 
 	// HACK
-	_mirroredFlag = false;
+	_mirroredFlag = mirrored;
 	_addToFlag = false;
 	_resourceType = SCI_PICTURE_TYPE_SCI32;
 
@@ -160,14 +181,14 @@
 	while (celCount > 0) {
 		cel_RlePos = READ_LE_UINT32(inbuffer + cel_headerPos + 24);
 		cel_LiteralPos = READ_LE_UINT32(inbuffer + cel_headerPos + 28);
-		cel_relXpos = READ_LE_UINT16(inbuffer + cel_headerPos + 38);
-		cel_relYpos = READ_LE_UINT16(inbuffer + cel_headerPos + 40);
+		//cel_relXpos = READ_LE_UINT16(inbuffer + cel_headerPos + 38);
+		//cel_relYpos = READ_LE_UINT16(inbuffer + cel_headerPos + 40);
 
 		// This is really weird, adjusting picture data to plane resolution - why...
-		cel_relYpos = ((cel_relYpos * g_sci->_gfxScreen->getHeight()) / planeResY);
-		cel_relXpos = ((cel_relXpos * g_sci->_gfxScreen->getWidth()) / planeResX);
+		//cel_relYpos = ((cel_relYpos * g_sci->_gfxScreen->getHeight()) / planeResY);
+		//cel_relXpos = ((cel_relXpos * g_sci->_gfxScreen->getWidth()) / planeResX);
 
-		drawCelData(inbuffer, size, cel_headerPos, cel_RlePos, cel_LiteralPos, cel_relXpos, cel_relYpos);
+		drawCelData(inbuffer, size, cel_headerPos, cel_RlePos, cel_LiteralPos, callerX, callerY);
 		cel_headerPos += 42;
 		celCount--;
 	}

Modified: scummvm/trunk/engines/sci/graphics/picture.h
===================================================================
--- scummvm/trunk/engines/sci/graphics/picture.h	2010-07-22 09:36:04 UTC (rev 51133)
+++ scummvm/trunk/engines/sci/graphics/picture.h	2010-07-22 10:24:08 UTC (rev 51134)
@@ -56,7 +56,10 @@
 
 #ifdef ENABLE_SCI32
 	int16 getSci32celCount();
-	void drawSci32Vga(int16 celNo, uint16 planeResY, uint16 planeResX);
+	int16 getSci32celY(int16 celNo);
+	int16 getSci32celX(int16 celNo);
+	int16 getSci32celHeight(int16 celNo);
+	void drawSci32Vga(int16 celNo, int16 callerX, int16 callerY, bool mirrored);
 #endif
 
 private:


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