aboutsummaryrefslogtreecommitdiff
path: root/engines/lab/anim.h
blob: 6c4c8bed6088ffe0c6a4bde37859258e1720c7dc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/* 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.
 *
 */

/*
 * This code is based on Labyrinth of Time code with assistance of
 *
 * Copyright (c) 1993 Terra Nova Development
 * Copyright (c) 2004 The Wyrmkeep Entertainment Co.
 *
 */

#ifndef LAB_DIFF_H
#define LAB_DIFF_H

#include "common/file.h"

namespace Lab {

class LabEngine;
#define CONTINUOUS      0xFFFF

struct DIFFHeader {
	uint16 _version;    // unused
	uint16 _width;
	uint16 _height;
	char _depth;        // unused
	char _fps;
	uint32 _bufferSize; // unused
	uint16 _machine;    // unused
	uint32 _flags;
};

struct BitMap {
	uint16 _bytesPerRow;
	uint16 _rows;       // unused
	byte _flags;
	byte *_planes[16];
};

#define BITMAPF_NONE  0
#define BITMAPF_VIDEO (1<<7)

class Anim {
private:
	LabEngine *_vm;

	uint32 _header;
	uint16 _curBit;
	uint16 _numChunks;
	uint32 _waitSec;
	uint32 _waitMicros;
	uint32 _delayMicros;
	bool _continuous;
	bool _isPlaying;
	bool _isAnim;
	bool _isPal;
	bool _donePal;
	uint16 _frameNum;
	bool _playOnce;
	byte *_buffer;
	byte *_storeDiffFile;
	byte **_diffFile;
	uint32 _size;
	bool _stopPlayingEnd;
	uint16 _sampleSpeed;
	byte *_start;
	uint32 _diffWidth;
	uint32 _diffHeight;
	bool _stopSound;
	uint16 _dataBytesPerRow;

	void unDIFFByteByte(byte *dest, byte *diff);
	void unDIFFByteWord(uint16 *dest, uint16 *diff);
	void VUnDIFFByteByte(byte *Dest, byte *diff, uint16 bytesperrow);
	void VUnDIFFByteWord(uint16 *Dest, uint16 *diff, uint16 bytesperrow);
	void VUnDIFFByteLong(uint32 *Dest, uint32 *diff, uint16 bytesperrow);
	void readBlock(void *Buffer, uint32 Size, byte **File);

public:
	Anim(LabEngine *vm);

	DIFFHeader _headerdata;
	char _diffPalette[256 * 3];
	bool _isBM;          /* Just fill in the RawDIFFBM structure */
	bool _waitForEffect; /* Wait for each sound effect to finish before continuing. */
	bool _doBlack;       /* Black the screen before new picture  */
	bool _noPalChange;   /* Don't change the palette.            */
	BitMap _rawDiffBM;

	void unDiff(byte *newBuf, byte *oldBuf, byte *diffData, uint16 bytesperrow, bool isV);
	bool unDIFFMemory(byte *dest,           /* Where to Un-DIFF */
					  byte *diff,           /* The DIFFed code. */
					  uint16 headerSize,    /* Size of header (1, 2 or 4 bytes) (only supports 1 currently */
					  uint16 copySize);     /* Size of minimum copy or skip. (1, 2 or 4 bytes) */

	bool VUnDIFFMemory(byte *dest, byte *diff, uint16 headerSize, uint16 copySize, uint16 bytesPerRow);
	void runLengthDecode(byte *dest, byte *source);
	void VRunLengthDecode(byte *dest, byte *source, uint16 bytesPerRow);
	bool readDiff(byte *buffer, bool playOnce);
	void playDiff(byte *buffer);
	void diffNextFrame();
	void readSound(bool waitTillFinished, Common::File *file);
	void stopDiff();
	void stopDiffEnd();
	void stopSound();
};

} // End of namespace Lab

#endif /* LAB_DIFF_H */