aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Hoops2010-11-13 19:15:31 +0000
committerMatthew Hoops2010-11-13 19:15:31 +0000
commitf4af4d2366fe0c3994da5186d5d232b353fd1b25 (patch)
tree9fcee7bfc03f10ec28d5e10f141b215c802edc17
parentecaab84cb5cb90e599b147359986abaf3202fa10 (diff)
downloadscummvm-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.cpp58
-rw-r--r--graphics/video/codecs/truemotion1.h21
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