diff options
| author | Matthew Hoops | 2010-11-13 19:15:31 +0000 | 
|---|---|---|
| committer | Matthew Hoops | 2010-11-13 19:15:31 +0000 | 
| commit | f4af4d2366fe0c3994da5186d5d232b353fd1b25 (patch) | |
| tree | 9fcee7bfc03f10ec28d5e10f141b215c802edc17 | |
| parent | ecaab84cb5cb90e599b147359986abaf3202fa10 (diff) | |
| download | scummvm-rg350-f4af4d2366fe0c3994da5186d5d232b353fd1b25.tar.gz scummvm-rg350-f4af4d2366fe0c3994da5186d5d232b353fd1b25.tar.bz2 scummvm-rg350-f4af4d2366fe0c3994da5186d5d232b353fd1b25.zip  | |
VIDEO: Switch Truemotion 1 to RGB565 for potential use with SCI CLUT tables
svn-id: r54231
| -rw-r--r-- | graphics/video/codecs/truemotion1.cpp | 58 | ||||
| -rw-r--r-- | graphics/video/codecs/truemotion1.h | 21 | 
2 files changed, 40 insertions, 39 deletions
diff --git a/graphics/video/codecs/truemotion1.cpp b/graphics/video/codecs/truemotion1.cpp index 25f01e9836..81ac857367 100644 --- a/graphics/video/codecs/truemotion1.cpp +++ b/graphics/video/codecs/truemotion1.cpp @@ -123,42 +123,40 @@ void TrueMotion1Decoder::selectDeltaTables(int deltaTableIndex) {  	}  } -int TrueMotion1Decoder::makeYdt15Entry(int p1, int p2) { +int TrueMotion1Decoder::makeYdt16Entry(int p1, int p2) {  #ifdef SCUMM_BIG_ENDIAN  	// Swap the values on BE systems. FFmpeg does this too.  	SWAP<int>(p1, p2);  #endif  	int lo = _ydt[p1]; -	lo += (lo << 5) + (lo << 10); +	lo += (lo << 6) + (lo << 11);  	int hi = _ydt[p2]; -	hi += (hi << 5) + (hi << 10); -	return (lo + (hi << 16)) << 1; +	hi += (hi << 6) + (hi << 11); +	return lo + (hi << 16);  } -int TrueMotion1Decoder::makeCdt15Entry(int p1, int p2) { -#ifdef SCUMM_BIG_ENDIAN -	// Swap the values on BE systems. FFmpeg does this too. -	SWAP<int>(p1, p2); -#endif - +int TrueMotion1Decoder::makeCdt16Entry(int p1, int p2) {  	int b = _cdt[p2]; -	int r = _cdt[p1] << 10; +	int r = _cdt[p1] << 11;  	int lo = b + r; -	return (lo + (lo << 16)) << 1; +	return lo + (lo << 16);  } -void TrueMotion1Decoder::genVectorTable15(const byte *selVectorTable) { +void TrueMotion1Decoder::genVectorTable16(const byte *selVectorTable) { +	memset(&_yPredictorTable, 0, sizeof(PredictorTableEntry) * 1024); +	memset(&_cPredictorTable, 0, sizeof(PredictorTableEntry) * 1024); +  	for (int i = 0; i < 1024; i += 4) {  		int len = *selVectorTable++ / 2;  		for (int j = 0; j < len; j++) {  			byte deltaPair = *selVectorTable++; -			_yPredictorTable[i + j] = 0xfffffffe & makeYdt15Entry(deltaPair >> 4, deltaPair & 0xf); -			_cPredictorTable[i + j] = 0xfffffffe & makeCdt15Entry(deltaPair >> 4, deltaPair & 0xf); +			_yPredictorTable[i + j].color = makeYdt16Entry(deltaPair >> 4, deltaPair & 0xf); +			_cPredictorTable[i + j].color = makeCdt16Entry(deltaPair >> 4, deltaPair & 0xf);  		} -		_yPredictorTable[i + (len - 1)] |= 1; -		_cPredictorTable[i + (len - 1)] |= 1; +		_yPredictorTable[i + (len - 1)].getNextIndex = true; +		_cPredictorTable[i + (len - 1)].getNextIndex = true;  	}  } @@ -229,7 +227,7 @@ void TrueMotion1Decoder::decodeHeader(Common::SeekableReadStream *stream) {  		error("Invalid vector table id %d", _header.vectable);  	if (_header.deltaset != _lastDeltaset || _header.vectable != _lastVectable) -		genVectorTable15(selVectorTable); +		genVectorTable16(selVectorTable);  	// set up pointers to the other key data chunks  	_mbChangeBits = _buf + _header.headerSize; @@ -259,15 +257,15 @@ do { \  } while (0) \  #define APPLY_C_PREDICTOR() \ -	predictor_pair = _cPredictorTable[index]; \ -	horizPred += (predictor_pair >> 1); \ -	if (predictor_pair & 1) { \ +	predictor_pair = _cPredictorTable[index].color; \ +	horizPred += predictor_pair; \ +	if (_cPredictorTable[index].getNextIndex) { \  		GET_NEXT_INDEX(); \  		if (!index) { \  			GET_NEXT_INDEX(); \ -			predictor_pair = _cPredictorTable[index]; \ -			horizPred += ((predictor_pair >> 1) * 5); \ -			if (predictor_pair & 1) \ +			predictor_pair = _cPredictorTable[index].color; \ +			horizPred += predictor_pair * 5; \ +			if (_cPredictorTable[index].getNextIndex) \  				GET_NEXT_INDEX(); \  			else \  				index++; \ @@ -276,15 +274,15 @@ do { \  		index++  #define APPLY_Y_PREDICTOR() \ -	predictor_pair = _yPredictorTable[index]; \ -	horizPred += (predictor_pair >> 1); \ -	if (predictor_pair & 1) { \ +	predictor_pair = _yPredictorTable[index].color; \ +	horizPred += predictor_pair; \ +	if (_yPredictorTable[index].getNextIndex) { \  		GET_NEXT_INDEX(); \  		if (!index) { \  			GET_NEXT_INDEX(); \ -			predictor_pair = _yPredictorTable[index]; \ -			horizPred += ((predictor_pair >> 1) * 5); \ -			if (predictor_pair & 1) \ +			predictor_pair = _yPredictorTable[index].color; \ +			horizPred += predictor_pair * 5; \ +			if (_yPredictorTable[index].getNextIndex) \  				GET_NEXT_INDEX(); \  			else \  				index++; \ diff --git a/graphics/video/codecs/truemotion1.h b/graphics/video/codecs/truemotion1.h index 1551916246..0e77ec3e26 100644 --- a/graphics/video/codecs/truemotion1.h +++ b/graphics/video/codecs/truemotion1.h @@ -42,8 +42,8 @@ public:  	Surface *decodeImage(Common::SeekableReadStream *stream); -	// Always return RGB555 -	PixelFormat getPixelFormat() const { return Graphics::PixelFormat(2, 5, 5, 5, 0, 10, 5, 0, 0); } +	// Always return RGB565 +	PixelFormat getPixelFormat() const { return Graphics::PixelFormat(2, 5, 6, 5, 0, 11, 5, 0, 0); }  private:  	Surface *_surface; @@ -54,11 +54,14 @@ private:  	uint16 _width, _height;  	int _flags; +	 +	struct PredictorTableEntry { +		uint32 color; +		bool getNextIndex; +	}; -	uint32 _yPredictorTable[1024]; -	uint32 _cPredictorTable[1024]; -	uint32 _fatYPredictorTable[1024]; -	uint32 _fatCPredictorTable[1024]; +	PredictorTableEntry _yPredictorTable[1024]; +	PredictorTableEntry _cPredictorTable[1024];  	int _blockType;  	int _blockWidth; @@ -92,9 +95,9 @@ private:  	void selectDeltaTables(int deltaTableIndex);  	void decodeHeader(Common::SeekableReadStream *stream);  	void decode16(); -	int makeYdt15Entry(int p1, int p2); -	int makeCdt15Entry(int p1, int p2); -	void genVectorTable15(const byte *selVectorTable); +	int makeYdt16Entry(int p1, int p2); +	int makeCdt16Entry(int p1, int p2); +	void genVectorTable16(const byte *selVectorTable);  };  } // End of namespace Graphics  | 
