aboutsummaryrefslogtreecommitdiff
path: root/sword1/animation.cpp
diff options
context:
space:
mode:
authorMax Horn2004-03-22 01:28:45 +0000
committerMax Horn2004-03-22 01:28:45 +0000
commit4466a855986d08d20c6fc6296baec191e1f5e027 (patch)
treeee5437fcc265c1e8800565d9e1493818004a3f23 /sword1/animation.cpp
parenta9789acfc61a057c82c6cc42386afc9b23813c24 (diff)
downloadscummvm-rg350-4466a855986d08d20c6fc6296baec191e1f5e027.tar.gz
scummvm-rg350-4466a855986d08d20c6fc6296baec191e1f5e027.tar.bz2
scummvm-rg350-4466a855986d08d20c6fc6296baec191e1f5e027.zip
move commong code into separate source file (more could be done, but it's a start)
svn-id: r13358
Diffstat (limited to 'sword1/animation.cpp')
-rw-r--r--sword1/animation.cpp150
1 files changed, 6 insertions, 144 deletions
diff --git a/sword1/animation.cpp b/sword1/animation.cpp
index f8e5d16fd6..f1ea311b1c 100644
--- a/sword1/animation.cpp
+++ b/sword1/animation.cpp
@@ -22,31 +22,16 @@
#include "common/stdafx.h"
#include "common/file.h"
#include "sword1/animation.h"
+#include "sound/audiostream.h"
-#define MOVIE_WIDTH 640
-#define MOVIE_HEIGHT 400
-
namespace Sword1 {
AnimationState::AnimationState(Screen *scr, SoundMixer *snd, OSystem *sys)
- : _scr(scr), _snd(snd), _sys(sys) {
+ : BaseAnimationState(snd, sys, 640, 400), _scr(scr) {
}
AnimationState::~AnimationState() {
-#ifdef USE_MPEG2
- _snd->stopHandle(bgSound);
- if (decoder)
- mpeg2_close(decoder);
- delete mpgfile;
- delete sndfile;
-#ifndef BACKEND_8BIT
- _sys->hide_overlay();
- free(overlay);
-#endif
- if (bgSoundStream)
- delete bgSoundStream;
-#endif
}
bool AnimationState::init(const char *name) {
@@ -155,137 +140,11 @@ bool AnimationState::init(const char *name) {
#ifdef BACKEND_8BIT
-/**
- * Build 'Best-Match' RGB lookup table
- */
-void AnimationState::buildLookup(int p, int lines) {
- int y, cb;
- int r, g, b, ii;
-
- if (p >= maxPalnum)
- return;
-
- if (p != curpal) {
- curpal = p;
- cr = 0;
- pos = 0;
- }
-
- if (cr > BITDEPTH)
- return;
-
- for (ii = 0; ii < lines; ii++) {
- r = (-16 * 256 + (int) (256 * 1.596) * ((cr << SHIFT) - 128)) / 256;
- for (cb = 0; cb <= BITDEPTH; cb++) {
- g = (-16 * 256 - (int) (0.813 * 256) * ((cr << SHIFT) - 128) - (int) (0.391 * 256) * ((cb << SHIFT) - 128)) / 256;
- b = (-16 * 256 + (int) (2.018 * 256) * ((cb << SHIFT) - 128)) / 256;
-
- for (y = 0; y <= BITDEPTH; y++) {
- int idx, bst = 0;
- int dis = 2 * SQR(r - palettes[p].pal[0]) + 4 * SQR(g - palettes[p].pal[1]) + SQR(b - palettes[p].pal[2]);
-
- for (idx = 1; idx < 256; idx++) {
- long d2 = 2 * SQR(r - palettes[p].pal[4 * idx]) + 4 * SQR(g - palettes[p].pal[4 * idx + 1]) + SQR(b - palettes[p].pal[4 * idx + 2]);
- if (d2 < dis) {
- bst = idx;
- dis = d2;
- }
- }
- lut2[pos++] = bst;
-
- r += (1 << SHIFT);
- g += (1 << SHIFT);
- b += (1 << SHIFT);
- }
- r -= (BITDEPTH+1)*(1 << SHIFT);
- }
- cr++;
- if (cr > BITDEPTH)
- return;
- }
-}
-
-bool AnimationState::checkPaletteSwitch() {
- // if we have reached the last image with this palette, switch to new one
- if (framenum == palettes[palnum].end) {
- unsigned char *l = lut2;
- palnum++;
- setPalette(palettes[palnum].pal);
- lutcalcnum = (BITDEPTH + palettes[palnum].end - (framenum + 1) + 2) / (palettes[palnum].end - (framenum + 1) + 2);
- lut2 = lut;
- lut = l;
- return true;
- }
-
- return false;
-}
void AnimationState::setPalette(byte *pal) {
_sys->setPalette(pal, 0, 256);
}
-#else
-
-OverlayColor *AnimationState::lookup = 0;
-
-void AnimationState::buildLookup() {
- if (lookup)
- return;
-
- lookup = (OverlayColor *)calloc((BITDEPTH+1) * (BITDEPTH+1) * 256, sizeof(OverlayColor));
-
- int y, cb, cr;
- int r, g, b;
- int pos = 0;
-
- for (cr = 0; cr <= BITDEPTH; cr++) {
- for (cb = 0; cb <= BITDEPTH; cb++) {
- for (y = 0; y < 256; y++) {
- r = ((y - 16) * 256 + (int) (256 * 1.596) * ((cr << SHIFT) - 128)) / 256;
- g = ((y - 16) * 256 - (int) (0.813 * 256) * ((cr << SHIFT) - 128) - (int) (0.391 * 256) * ((cb << SHIFT) - 128)) / 256;
- b = ((y - 16) * 256 + (int) (2.018 * 256) * ((cb << SHIFT) - 128)) / 256;
-
- if (r < 0) r = 0;
- else if (r > 255) r = 255;
- if (g < 0) g = 0;
- else if (g > 255) g = 255;
- if (b < 0) b = 0;
- else if (b > 255) b = 255;
-
- lookup[pos++] = _sys->RGBToColor(r, g, b);
- }
- }
- }
-}
-
-void AnimationState::plotYUV(OverlayColor *lut, int width, int height, byte *const *dat) {
-
- OverlayColor *ptr = overlay + (MOVIE_HEIGHT - height) / 2 * MOVIE_WIDTH + (MOVIE_WIDTH - width) / 2;
-
- int x, y;
-
- int ypos = 0;
- int cpos = 0;
- int linepos = 0;
-
- for (y = 0; y < height; y += 2) {
- for (x = 0; x < width; x += 2) {
- int i = ((((dat[2][cpos] + ROUNDADD) >> SHIFT) * (BITDEPTH+1)) + ((dat[1][cpos] + ROUNDADD)>>SHIFT)) * 256;
- cpos++;
-
- ptr[linepos ] = lut[i + dat[0][ ypos ]];
- ptr[MOVIE_WIDTH + linepos++] = lut[i + dat[0][width + ypos++]];
- ptr[linepos ] = lut[i + dat[0][ ypos ]];
- ptr[MOVIE_WIDTH + linepos++] = lut[i + dat[0][width + ypos++]];
-
- }
- linepos += (2 * MOVIE_WIDTH - width);
- ypos += width;
- }
-
- _sys->copy_rect_overlay(overlay, MOVIE_WIDTH, 0, 40, MOVIE_WIDTH, MOVIE_HEIGHT);
-}
-
#endif
bool AnimationState::decodeFrame() {
@@ -344,13 +203,16 @@ bool AnimationState::decodeFrame() {
#else
- if ((bgSoundStream == NULL) || ((_snd->getChannelElapsedTime(bgSound) * 12) / 1000 < framenum + 1) || frameskipped > 10) {
+ if ((bgSoundStream == NULL) ||
+ ((_snd->getChannelElapsedTime(bgSound) * 12) / 1000 < framenum + 1) || frameskipped > 10) {
if (frameskipped > 10) {
warning("force frame %i redraw", framenum);
frameskipped = 0;
}
plotYUV(lookup, sequence_i->width, sequence_i->height, info->display_fbuf->buf);
+ _sys->copy_rect_overlay(overlay, MOVIE_WIDTH, 0, 40, MOVIE_WIDTH, MOVIE_HEIGHT);
+
if (bgSoundStream) {
while ((_snd->getChannelElapsedTime(bgSound) * 12) / 1000 < framenum)
_sys->delay_msecs(10);