[Scummvm-git-logs] scummvm master -> 32f3bfea6c05aebf2e5ca132fd977395f808bc4b

dreammaster noreply at scummvm.org
Sat May 25 19:19:48 UTC 2024


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
32f3bfea6c M4: More endian fixes


Commit: 32f3bfea6c05aebf2e5ca132fd977395f808bc4b
    https://github.com/scummvm/scummvm/commit/32f3bfea6c05aebf2e5ca132fd977395f808bc4b
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2024-05-25T12:17:39-07:00

Commit Message:
M4: More endian fixes

Changed paths:
    engines/m4/fileio/sys_file.cpp
    engines/m4/fileio/sys_file.h
    engines/m4/wscript/ws_load.cpp


diff --git a/engines/m4/fileio/sys_file.cpp b/engines/m4/fileio/sys_file.cpp
index 9a24595c5c6..44b71d875ee 100644
--- a/engines/m4/fileio/sys_file.cpp
+++ b/engines/m4/fileio/sys_file.cpp
@@ -631,6 +631,14 @@ int32 SysFile::read(MemHandle bufferHandle, int32 n) {
 	}
 }
 
+uint32 SysFile::readUint32LE() {
+	byte buf[4];
+	void *ptr = (void *)buf;
+	read(&ptr, 4);
+
+	return READ_LE_UINT32(buf);
+}
+
 Common::SeekableReadStream *SysFile::rs() const {
 	Common::SeekableReadStream *rs = dynamic_cast<Common::SeekableReadStream *>(_fp);
 	assert(rs);
diff --git a/engines/m4/fileio/sys_file.h b/engines/m4/fileio/sys_file.h
index 73cdd74381c..4b843b5e8d8 100644
--- a/engines/m4/fileio/sys_file.h
+++ b/engines/m4/fileio/sys_file.h
@@ -123,6 +123,14 @@ public:
 	uint32 read(MemHandle bufferHandle);
 	int32 read(MemHandle bufferHandle, int32 n);
 
+	/**
+	 * Read in a 32-bit value
+	 */
+	uint32 readUint32LE();
+	int32 readSint32LE() {
+		return (int32)readUint32LE();
+	}
+
 	/**
 	 * Close the file
 	 */
diff --git a/engines/m4/wscript/ws_load.cpp b/engines/m4/wscript/ws_load.cpp
index 5878e2cad59..1ab66aa524f 100644
--- a/engines/m4/wscript/ws_load.cpp
+++ b/engines/m4/wscript/ws_load.cpp
@@ -1514,16 +1514,8 @@ static int32 GetSSHeaderInfo(SysFile *sysFile, uint32 **data, RGB8 *myPalette) {
 	}
 
 	// Read in the series header and the format number
-	handlebuffer = &header;
-	if (!(*sysFile).read(&handlebuffer, 4)) {
-		ws_LogErrorMsg(FL, "Unable to read series header.");
-		return -1;
-	}
-	handlebuffer = &format;
-	if (!(*sysFile).read(&handlebuffer, 4)) {
-		ws_LogErrorMsg(FL, "Unable to read series format.");
-		return -1;
-	}
+	header = sysFile->readUint32LE();
+	format = sysFile->readUint32LE();
 
 	// Make sure the header is "M4SS", and that the format is not antique
 	if (header == HEAD_SS4M) {
@@ -1538,26 +1530,14 @@ static int32 GetSSHeaderInfo(SysFile *sysFile, uint32 **data, RGB8 *myPalette) {
 	}
 
 	// Read in the SS chunk type - either PAL or SS info
-	handlebuffer = &celsType;
-	if (!(*sysFile).read(&handlebuffer, 4)) {
-		ws_LogErrorMsg(FL, "Unable to read series chunk type.");
-		return -1;
-	}
+	celsType = sysFile->readUint32LE();
 
 	if ((celsType == CELS__PAL) || (celsType == CELS_LAP_)) {
 		// PAL info, read in the size of the PAL chunk
-		handlebuffer = &celsSize;
-		if (!(*sysFile).read(&handlebuffer, 4)) {
-			ws_LogErrorMsg(FL, "Unable to read series chunk size.");
-			return -1;
-		}
+		celsSize = sysFile->readUint32LE();
 
 		// Now read in the number of colors to be inserted into the PAL
-		handlebuffer = &numColors;
-		if (!(*sysFile).read(&handlebuffer, 4)) {
-			ws_LogErrorMsg(FL, "Unable to read number of colors in PAL chunk.");
-			return -1;
-		}
+		numColors = sysFile->readUint32LE();
 
 		// Make sure the info is in the correct format (swap between Motorola and Intel formats)
 		if (celsType == CELS_LAP_) {
@@ -1611,11 +1591,7 @@ static int32 GetSSHeaderInfo(SysFile *sysFile, uint32 **data, RGB8 *myPalette) {
 		}
 
 		// Read in the next chunk type
-		handlebuffer = &celsType;
-		if (!(*sysFile).read(&handlebuffer, 4)) {
-			ws_LogErrorMsg(FL, "Failed to read in series chunk type.");
-			return -1;
-		}
+		celsType = sysFile->readUint32LE();
 	}
 
 	// Make sure the chunk type is Sprite Series info
@@ -1625,11 +1601,7 @@ static int32 GetSSHeaderInfo(SysFile *sysFile, uint32 **data, RGB8 *myPalette) {
 	}
 
 	// Read in the size of the entire chunk
-	handlebuffer = &celsSize;
-	if (!(*sysFile).read(&handlebuffer, 4)) {
-		ws_LogErrorMsg(FL, "Failed to read in series chunk size.");
-		return -1;
-	}
+	celsSize = sysFile->readUint32LE();
 
 	// If the chunk is the wrong format, byte-swap (between motorola and intel formats)
 	if (celsType == CELS_SS__) {
@@ -1644,11 +1616,7 @@ static int32 GetSSHeaderInfo(SysFile *sysFile, uint32 **data, RGB8 *myPalette) {
 	}
 
 	// Read how many sprites are in the series
-	handlebuffer = &numCels;
-	if (!(*sysFile).read(&handlebuffer, 4)) {
-		ws_LogErrorMsg(FL, "Failed to read the number of sprites in the series.");
-		return -1;
-	}
+	numCels = sysFile->readUint32LE();
 
 	// Again, byte-swap if the chunk is in the wrong format
 	if (celsType == CELS_SS__) {
@@ -1669,11 +1637,8 @@ static int32 GetSSHeaderInfo(SysFile *sysFile, uint32 **data, RGB8 *myPalette) {
 
 	// Read in the series header and the sprite offset table
 	// Since we already read in celsType and celsSize, SS_HEAD_SIZE-2
-	handlebuffer = &((*data)[2]);
-	if (!(*sysFile).read(&handlebuffer, (SS_HEAD_SIZE + numCels - 2) << 2)) {
-		ws_LogErrorMsg(FL, "Failed to read the series header and the sprite offset table.");
-		return -1;
-	}
+	for (i = 0; i < SS_HEAD_SIZE + (uint)numCels - 2; ++i)
+		(*data)[2 + i] = sysFile->readUint32LE();
 
 	// Set the celsType and the celsSize
 	(*data)[0] = celsType;
@@ -1718,10 +1683,10 @@ bool ws_OpenSSstream(SysFile *sysFile, Anim8 *anim8) {
 
 	// Automatically set some of the sequence registers
 	celsPtr = myCCB->streamSSHeader;
-	numSprites = FROM_LE_32(celsPtr[CELS_COUNT]);
+	numSprites = celsPtr[CELS_COUNT];
 	myRegs[IDX_CELS_INDEX] = -(1 << 16);	// First frame inc will make it 0
 	myRegs[IDX_CELS_COUNT] = numSprites << 16;
-	myRegs[IDX_CELS_FRAME_RATE] = FROM_LE_32(celsPtr[CELS_FRAME_RATE]) << 16;
+	myRegs[IDX_CELS_FRAME_RATE] = celsPtr[CELS_FRAME_RATE] << 16;
 
 	// Here we convert the offset table to become the actual size of the data for each sprite
 	// This is so the stream can be optimized to always read in on sprite boundaries
@@ -1731,22 +1696,21 @@ bool ws_OpenSSstream(SysFile *sysFile, Anim8 *anim8) {
 	maxFrameSize = 0;
 	// For all but the last frame, the frame size is the difference in offset values
 	for (i = 0; i < numSprites - 1; i++) {
-		uint32 diff = FROM_LE_32(offsets[i + 1]) - FROM_LE_32(offsets[i]);
-		WRITE_LE_UINT32(&offsets[i], diff);
+		offsets[i] = offsets[i + 1] - offsets[i];
 
-		if (FROM_LE_32(offsets[i]) > maxFrameSize) {
+		if (offsets[i] > maxFrameSize) {
 			maxFrameSize = offsets[i];
 			obesest_frame = i;
 		}
 	}
 
 	// For the last sprite we take the entire chunk size - the chunk header - the offset for that sprite
-	WRITE_LE_UINT32(&offsets[numSprites - 1], FROM_LE_32(celsPtr[CELS_SRC_SIZE]) -
-		((SS_HEAD_SIZE + FROM_LE_32(celsPtr[CELS_COUNT])) << 2) -
-		FROM_LE_32(offsets[numSprites - 1]));
+	offsets[numSprites - 1] = celsPtr[CELS_SRC_SIZE] -
+		((SS_HEAD_SIZE + celsPtr[CELS_COUNT]) << 2) -
+		offsets[numSprites - 1];
 
-	if (FROM_LE_32(offsets[numSprites - 1]) > maxFrameSize) {
-		maxFrameSize = FROM_LE_32(offsets[numSprites - 1]);
+	if (offsets[numSprites - 1] > maxFrameSize) {
+		maxFrameSize = offsets[numSprites - 1];
 		obesest_frame = numSprites - 1;
 	}
 
@@ -1813,14 +1777,14 @@ bool ws_GetNextSSstreamCel(Anim8 *anim8) {
 
 	// Check whether the end of the SS has been streamed
 	frameNum = anim8->myRegs[IDX_CELS_INDEX] >> 16;
-	if (frameNum >= FROM_LE_32(celsPtr[CELS_COUNT])) {
+	if (frameNum >= celsPtr[CELS_COUNT]) {
 		ws_LogErrorMsg(FL, "No more frames available to stream");
 		return false;
 	}
 
 	// Read the next sprite from the stream.  Note the offset table was converted to absolute size when the stream was opened.
-	if (f_stream_Read((strmRequest *)myCCB->myStream, (uint8 **)(&myCCB->streamSpriteSource), FROM_LE_32(offsets[frameNum]))
-			< (int32)FROM_LE_32(offsets[frameNum])) {
+	if (f_stream_Read((strmRequest *)myCCB->myStream, (uint8 **)(&myCCB->streamSpriteSource), offsets[frameNum])
+			< (int32)offsets[frameNum]) {
 		ws_LogErrorMsg(FL, "Unable to read the next stream frame");
 		return false;
 	}




More information about the Scummvm-git-logs mailing list