aboutsummaryrefslogtreecommitdiff
path: root/engines/dreamweb/vgafades.cpp
diff options
context:
space:
mode:
authorWillem Jan Palenstijn2013-04-18 23:35:23 +0200
committerWillem Jan Palenstijn2013-05-08 20:40:58 +0200
commit9c2341678ef4984bf92b3878295250faf980b066 (patch)
tree2fb4805e05e16b9924e80c9947e6bad723b28c4b /engines/dreamweb/vgafades.cpp
parent8172d679df5148a4a32f46074b20cb6caf91844f (diff)
parenta5f4ff36ffc386d48f2da49387a9655ce9295a4d (diff)
downloadscummvm-rg350-9c2341678ef4984bf92b3878295250faf980b066.tar.gz
scummvm-rg350-9c2341678ef4984bf92b3878295250faf980b066.tar.bz2
scummvm-rg350-9c2341678ef4984bf92b3878295250faf980b066.zip
Merge branch 'master'
Diffstat (limited to 'engines/dreamweb/vgafades.cpp')
-rw-r--r--engines/dreamweb/vgafades.cpp284
1 files changed, 284 insertions, 0 deletions
diff --git a/engines/dreamweb/vgafades.cpp b/engines/dreamweb/vgafades.cpp
new file mode 100644
index 0000000000..e8999ab18c
--- /dev/null
+++ b/engines/dreamweb/vgafades.cpp
@@ -0,0 +1,284 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "dreamweb/dreamweb.h"
+
+namespace DreamWeb {
+
+void DreamWebEngine::clearStartPal() {
+ memset(_startPal, 0, 256 * 3);
+}
+
+void DreamWebEngine::clearEndPal() {
+ memset(_endPal, 0, 256 * 3);
+}
+
+void DreamWebEngine::palToStartPal() {
+ memcpy(_startPal, _mainPal, 256 * 3);
+}
+
+void DreamWebEngine::endPalToStart() {
+ memcpy(_startPal, _endPal, 256 * 3);
+}
+
+void DreamWebEngine::startPalToEnd() {
+ memcpy(_endPal, _startPal, 256 * 3);
+}
+
+void DreamWebEngine::palToEndPal() {
+ memcpy(_endPal, _mainPal, 256 * 3);
+}
+
+void DreamWebEngine::fadeDOS() {
+ return; // FIXME later
+
+ waitForVSync();
+ //processEvents will be called from vsync
+ uint8 *dst = _startPal;
+ getPalette(dst, 0, 64);
+ for (int fade = 0; fade < 64; ++fade) {
+ for (int c = 0; c < 768; ++c) { //original sources decrement 768 values -> 256 colors
+ if (dst[c]) {
+ --dst[c];
+ }
+ }
+ setPalette(dst, 0, 64);
+ waitForVSync();
+ }
+}
+
+void DreamWebEngine::doFade() {
+ if (_fadeDirection == 0)
+ return;
+
+ processEvents();
+ uint8 *src = _startPal + 3 * _colourPos;
+ setPalette(src, _colourPos, _numToFade);
+
+ _colourPos += _numToFade;
+ if (_colourPos == 0)
+ fadeCalculation();
+}
+
+void DreamWebEngine::fadeCalculation() {
+ if (_fadeCount == 0) {
+ _fadeDirection = 0;
+ return;
+ }
+
+ uint8 *startPal = _startPal;
+ const uint8 *endPal = _endPal;
+ for (size_t i = 0; i < 256 * 3; ++i) {
+ uint8 s = startPal[i];
+ uint8 e = endPal[i];
+ if (s == e)
+ continue;
+ else if (s > e)
+ --startPal[i];
+ else {
+ if (_fadeCount <= e)
+ ++startPal[i];
+ }
+ }
+ --_fadeCount;
+}
+
+void DreamWebEngine::fadeUpYellows() {
+ palToEndPal();
+ memset(_endPal + 231 * 3, 0, 8 * 3);
+ memset(_endPal + 246 * 3, 0, 1 * 3);
+ _fadeDirection = 1;
+ _fadeCount = 63;
+ _colourPos = 0;
+ _numToFade = 128;
+ hangOn(128);
+}
+
+void DreamWebEngine::fadeUpMonFirst() {
+ palToStartPal();
+ palToEndPal();
+ memset(_startPal + 231 * 3, 0, 8 * 3);
+ memset(_startPal + 246 * 3, 0, 1 * 3);
+ _fadeDirection = 1;
+ _fadeCount = 63;
+ _colourPos = 0;
+ _numToFade = 128;
+ hangOn(64);
+ playChannel1(26);
+ hangOn(64);
+}
+
+
+void DreamWebEngine::fadeDownMon() {
+ palToStartPal();
+ palToEndPal();
+ memset(_endPal + 231 * 3, 0, 8 * 3);
+ memset(_endPal + 246 * 3, 0, 1 * 3);
+ _fadeDirection = 1;
+ _fadeCount = 63;
+ _colourPos = 0;
+ _numToFade = 128;
+ hangOn(64);
+}
+
+void DreamWebEngine::fadeUpMon() {
+ palToStartPal();
+ palToEndPal();
+ memset(_startPal + 231 * 3, 0, 8 * 3);
+ memset(_startPal + 246 * 3, 0, 1 * 3);
+ _fadeDirection = 1;
+ _fadeCount = 63;
+ _colourPos = 0;
+ _numToFade = 128;
+ hangOn(128);
+}
+
+void DreamWebEngine::initialMonCols() {
+ palToStartPal();
+ memset(_startPal + 230 * 3, 0, 9 * 3);
+ memset(_startPal + 246 * 3, 0, 1 * 3);
+ processEvents();
+ setPalette(_startPal + 230 * 3, 230, 18);
+}
+
+void DreamWebEngine::fadeScreenUp() {
+ clearStartPal();
+ palToEndPal();
+ _fadeDirection = 1;
+ _fadeCount = 63;
+ _colourPos = 0;
+ _numToFade = 128;
+}
+
+void DreamWebEngine::fadeScreenUps() {
+ clearStartPal();
+ palToEndPal();
+ _fadeDirection = 1;
+ _fadeCount = 63;
+ _colourPos = 0;
+ _numToFade = 64;
+}
+
+void DreamWebEngine::fadeScreenUpHalf() {
+ endPalToStart();
+ palToEndPal();
+ _fadeDirection = 1;
+ _fadeCount = 31;
+ _colourPos = 0;
+ _numToFade = 32;
+}
+
+void DreamWebEngine::fadeScreenDown() {
+ palToStartPal();
+ clearEndPal();
+ _fadeDirection = 1;
+ _fadeCount = 63;
+ _colourPos = 0;
+ _numToFade = 128;
+}
+
+void DreamWebEngine::fadeScreenDowns() {
+ palToStartPal();
+ clearEndPal();
+ _fadeDirection = 1;
+ _fadeCount = 63;
+ _colourPos = 0;
+ _numToFade = 64;
+}
+
+void DreamWebEngine::fadeScreenDownHalf() {
+ palToStartPal();
+ palToEndPal();
+
+ const uint8 *startPal = _startPal;
+ uint8 *endPal = _endPal;
+ for (int i = 0; i < 256 * 3; ++i) {
+ *endPal >>= 1;
+ endPal++;
+ }
+
+ memcpy(endPal + (56*3), startPal + (56*3), 3*5);
+ memcpy(endPal + (77*3), startPal + (77*3), 3*2);
+
+ _fadeDirection = 1;
+ _fadeCount = 31;
+ _colourPos = 0;
+ _numToFade = 32;
+}
+
+
+void DreamWebEngine::clearPalette() {
+ _fadeDirection = 0;
+ clearStartPal();
+ dumpCurrent();
+}
+
+// Converts palette to grey scale, summed using formula
+// .20xred + .59xGreen + .11xBlue
+void DreamWebEngine::greyscaleSum() {
+ byte *src = _mainPal;
+ byte *dst = _endPal;
+
+ for (int i = 0; i < 256; ++i) {
+ const unsigned int r = 20 * *src++;
+ const unsigned int g = 59 * *src++;
+ const unsigned int b = 11 * *src++;
+ const byte grey = (r + b + g) / 100;
+ byte tmp;
+
+ tmp = grey;
+ //if (tmp != 0) // FIXME: The assembler code has this check commented out. Bug or feature?
+ tmp += _addToRed;
+ *dst++ = tmp;
+
+ tmp = grey;
+ if (tmp != 0)
+ tmp += _addToGreen;
+ *dst++ = tmp;
+
+ tmp = grey;
+ if (tmp != 0)
+ tmp += _addToBlue;
+ *dst++ = tmp;
+ }
+}
+
+void DreamWebEngine::allPalette() {
+ memcpy(_startPal, _mainPal, 3 * 256);
+ dumpCurrent();
+}
+
+void DreamWebEngine::dumpCurrent() {
+ uint8 *pal = _startPal;
+
+ waitForVSync();
+ processEvents();
+ setPalette(pal, 0, 128);
+
+ pal += 128 * 3;
+
+ waitForVSync();
+ processEvents();
+ setPalette(pal, 128, 128);
+}
+
+} // End of namespace DreamWeb