Index: video/qt_decoder.cpp
===================================================================
--- video/qt_decoder.cpp	(revision 52484)
+++ video/qt_decoder.cpp	(working copy)
@@ -67,6 +67,8 @@
 	_numStreams = 0;
 	_fd = 0;
 	_scaledSurface = 0;
+	_scaleFactorX = 1.0f;
+	_scaleFactorY = 1.0f;
 	_dirtyPalette = false;
 	_resFork = new Common::MacResManager();
 
@@ -82,14 +84,14 @@
 	if (_videoStreamIndex < 0)
 		return 0;
 
-	return _streams[_videoStreamIndex]->width / getScaleMode();
+	return (uint16) ((float) _streams[_videoStreamIndex]->width / getScaleFactorX());
 }
 
 uint16 QuickTimeDecoder::getHeight() const {
 	if (_videoStreamIndex < 0)
 		return 0;
-
-	return _streams[_videoStreamIndex]->height / getScaleMode();
+		
+	return (uint16) ((float) _streams[_videoStreamIndex]->height / getScaleFactorY());
 }
 
 uint32 QuickTimeDecoder::getFrameCount() const {
@@ -113,13 +115,20 @@
 	return _streams[_videoStreamIndex]->codec_tag;
 }
 
-ScaleMode QuickTimeDecoder::getScaleMode() const {
+float QuickTimeDecoder::getScaleFactorX() const {
 	if (_videoStreamIndex < 0)
-		return kScaleNormal;
+		return 1.0f;
 
-	return (ScaleMode)(_scaleMode * _streams[_videoStreamIndex]->scaleMode);
+	return (_scaleFactorX * _streams[_videoStreamIndex]->scaleFactorX);
 }
 
+float QuickTimeDecoder::getScaleFactorY() const {
+	if (_videoStreamIndex < 0)
+		return 1.0f;
+
+	return (_scaleFactorY * _streams[_videoStreamIndex]->scaleFactorY);
+}
+
 uint32 QuickTimeDecoder::getFrameDuration() {
 	if (_videoStreamIndex < 0)
 		return 0;
@@ -231,14 +240,14 @@
 }
 
 Surface *QuickTimeDecoder::scaleSurface(Surface *frame) {
-	if (getScaleMode() == kScaleNormal)
+	if (getScaleFactorX() == 1 && getScaleFactorY() == 1)
 		return frame;
 
 	assert(_scaledSurface);
 
 	for (uint32 j = 0; j < _scaledSurface->h; j++)
 		for (uint32 k = 0; k < _scaledSurface->w; k++)
-			memcpy(_scaledSurface->getBasePtr(k, j), frame->getBasePtr(k * getScaleMode(), j * getScaleMode()), frame->bytesPerPixel);
+			memcpy(_scaledSurface->getBasePtr(k, j), frame->getBasePtr((int) (k * getScaleFactorX()),(int) (j * getScaleFactorY())), frame->bytesPerPixel);
 
 	return _scaledSurface;
 }
@@ -376,7 +385,7 @@
 	if (_videoStreamIndex >= 0) {
 		_videoCodec = createCodec(getCodecTag(), getBitsPerPixel());
 
-		if (getScaleMode() != kScaleNormal) {
+		if (getScaleFactorX() != 1 || getScaleFactorY() != 1) {
 			// We have to initialize the scaled surface
 			_scaledSurface = new Surface();
 			_scaledSurface->create(getWidth(), getHeight(), getPixelFormat().bytesPerPixel);
@@ -592,19 +601,13 @@
 	_fd->skip(12);
 	uint32 yMod = _fd->readUint32BE();
 	_fd->skip(16);
+	
+	_scaleFactorX = 65536.0f/(float) xMod;
+	_scaleFactorY = 65536.0f/(float) yMod;
 
-	if (xMod != yMod)
-		error("X and Y resolution modifiers differ");
+	debug(1, "readMVHD(): scaleFactorX = %f", _scaleFactorX);
+	debug(1, "readMVHD(): scaleFactorY = %f", _scaleFactorY);
 
-	if (xMod == 0x8000)
-		_scaleMode = kScaleHalf;
-	else if (xMod == 0x4000)
-		_scaleMode = kScaleQuarter;
-	else
-		_scaleMode = kScaleNormal;
-
-	debug(1, "readMVHD(): scaleMode = %d", (int)_scaleMode);
-
 	_fd->readUint32BE(); // preview time
 	_fd->readUint32BE(); // preview duration
 	_fd->readUint32BE(); // poster time
@@ -687,19 +690,13 @@
 	_fd->skip(12);
 	uint32 yMod = _fd->readUint32BE();
 	_fd->skip(16);
+	
+	st->scaleFactorX = 65536.0f/(float) xMod;
+	st->scaleFactorY = 65536.0f/(float) yMod;
+	
+	debug(1, "readTKHD(): scaleFactorX = %f", st->scaleFactorX);
+	debug(1, "readTKHD(): scaleFactorY = %f", st->scaleFactorY);
 
-	if (xMod != yMod)
-		error("X and Y resolution modifiers differ");
-
-	if (xMod == 0x8000)
-		st->scaleMode = kScaleHalf;
-	else if (xMod == 0x4000)
-		st->scaleMode = kScaleQuarter;
-	else
-		st->scaleMode = kScaleNormal;
-
-	debug(1, "readTKHD(): scaleMode = %d", (int)_scaleMode);
-
 	// these are fixed-point, 16:16
 	// uint32 tkWidth = _fd->readUint32BE() >> 16; // track width
 	// uint32 tkHeight = _fd->readUint32BE() >> 16; // track height
Index: video/qt_decoder.h
===================================================================
--- video/qt_decoder.h	(revision 52484)
+++ video/qt_decoder.h	(working copy)
@@ -50,11 +50,6 @@
 
 namespace Graphics {
 
-enum ScaleMode {
-	kScaleNormal = 1,
-	kScaleHalf = 2,
-	kScaleQuarter = 4
-};
 
 class QuickTimeDecoder : public RewindableVideoDecoder {
 public:
@@ -217,7 +212,8 @@
 		uint32 nb_frames;
 		uint32 duration;
 		uint32 start_time;
-		ScaleMode scaleMode;
+		float scaleFactorX;
+		float scaleFactorY;
 	};
 
 	const ParseTable *_parseTable;
@@ -230,7 +226,8 @@
 	MOVStreamContext *_partial;
 	uint32 _numStreams;
 	int _ni;
-	ScaleMode _scaleMode;
+	float _scaleFactorX;
+	float _scaleFactorY;
 	MOVStreamContext *_streams[20];
 	byte _palette[256 * 3];
 	bool _dirtyPalette;
@@ -260,7 +257,8 @@
 
 	Surface *_scaledSurface;
 	Surface *scaleSurface(Surface *frame);
-	ScaleMode getScaleMode() const;
+	float getScaleFactorX() const;
+	float getScaleFactorY() const;
 
 	void pauseVideoIntern(bool pause);
 
