[Scummvm-cvs-logs] CVS: scummvm/graphics animation.cpp,1.1,1.2 animation.h,1.1,1.2

Max Horn fingolfin at users.sourceforge.net
Sun Mar 21 17:39:06 CET 2004


Update of /cvsroot/scummvm/scummvm/graphics
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv13283/graphics

Modified Files:
	animation.cpp animation.h 
Log Message:
move commong code into separate source file (more could be done, but it's a start)

Index: animation.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/graphics/animation.cpp,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- animation.cpp	21 Mar 2004 21:20:06 -0000	1.1
+++ animation.cpp	22 Mar 2004 01:28:44 -0000	1.2
@@ -21,3 +21,160 @@
 
 #include "common/stdafx.h"
 #include "graphics/animation.h"
+#include "common/file.h"
+#include "sound/audiostream.h"
+
+namespace Graphics {
+
+BaseAnimationState::BaseAnimationState(SoundMixer *snd, OSystem *sys, int width, int height) 
+	: _snd(snd), _sys(sys), MOVIE_WIDTH(width), MOVIE_HEIGHT(height) {
+}
+
+BaseAnimationState::~BaseAnimationState() {
+#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
+}
+
+
+
+#ifdef BACKEND_8BIT
+
+/**
+ * Build 'Best-Match' RGB lookup table
+ */
+void BaseAnimationState::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 BaseAnimationState::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;
+}
+
+#else
+
+OverlayColor *BaseAnimationState::lookup = 0;
+
+void BaseAnimationState::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 BaseAnimationState::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;
+	}
+}
+
+#endif
+
+} // End of namespace Graphics

Index: animation.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/graphics/animation.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- animation.h	21 Mar 2004 21:20:06 -0000	1.1
+++ animation.h	22 Mar 2004 01:28:44 -0000	1.2
@@ -22,6 +22,11 @@
 #ifndef GRAPHICS_ANIMATION_H
 #define GRAPHICS_ANIMATION_H
 
+#include "common/scummsys.h"
+#include "sound/mixer.h"
+
+class AudioStream;
+
 // Uncomment this if you are using libmpeg2 0.3.1.
 // #define USE_MPEG2_0_3_1
 
@@ -50,7 +55,85 @@
 
 #endif
 
+#ifdef BACKEND_8BIT
+#define SQR(x) ((x) * (x))
+#define SHIFT 3
+#else
+#define SHIFT 1
+#endif
+
+#define BITDEPTH (1 << (8 - SHIFT))
+#define ROUNDADD (1 << (SHIFT - 1))
 
+#define BUFFER_SIZE 4096
 
 
-#endif
\ No newline at end of file
+namespace Graphics {
+
+class BaseAnimationState {
+protected:
+	const int MOVIE_WIDTH;
+	const int MOVIE_HEIGHT;
+	
+	SoundMixer *_snd;
+	OSystem *_sys;
+
+	uint framenum;
+	uint frameskipped;
+	uint32 ticks;
+
+#ifdef USE_MPEG2
+	mpeg2dec_t *decoder;
+	const mpeg2_info_t *info;
+#endif
+
+	File *mpgfile;
+	File *sndfile;
+
+	byte buffer[BUFFER_SIZE];
+
+	PlayingSoundHandle bgSound;
+	AudioStream *bgSoundStream;
+
+#ifdef BACKEND_8BIT
+	int palnum;
+	int maxPalnum;
+
+	byte lookup[2][(BITDEPTH+1) * (BITDEPTH+1) * (BITDEPTH+1)];
+	byte *lut;
+	byte *lut2;
+	int lutcalcnum;
+
+	int curpal;
+	int cr;
+	int pos;
+
+	struct {
+		uint cnt;
+		uint end;
+		byte pal[4 * 256];
+	} palettes[50];
+#else
+	static OverlayColor *lookup;
+	OverlayColor *overlay;
+#endif
+
+public:
+	BaseAnimationState(SoundMixer *snd, OSystem *sys, int width, int height);
+	virtual ~BaseAnimationState();
+
+protected:
+#ifdef BACKEND_8BIT
+	void buildLookup(int p, int lines);
+	bool checkPaletteSwitch();
+	virtual void setPalette(byte *pal) = 0;
+#else
+	void buildLookup(void);
+	void plotYUV(OverlayColor *lut, int width, int height, byte *const *dat);
+#endif
+};
+
+
+} // End of namespace Graphics
+
+#endif





More information about the Scummvm-git-logs mailing list