aboutsummaryrefslogtreecommitdiff
path: root/engines/pegasus/surface.h
blob: 47e3ef538cc71b6076f6ddf1d65a259786452c7c (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
132
133
134
135
136
137
138
139
140
/* 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.
 *
 * Additional copyright for this file:
 * Copyright (C) 1995-1997 Presto Studios, Inc.
 *
 * 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.
 *
 */

#ifndef PEGASUS_SURFACE_H
#define PEGASUS_SURFACE_H

#include "common/rect.h"
#include "common/str.h"

#include "pegasus/elements.h"
#include "pegasus/types.h"

namespace Common {
	class MacResManager;
}

namespace Graphics {
	struct Surface;
}

namespace Video {
	class VideoDecoder;
}

namespace Pegasus {

// Surface bounds are always normalized.

class Surface {
public:
	Surface();
	virtual ~Surface();

	virtual void allocateSurface(const Common::Rect &);
	virtual void deallocateSurface();
	virtual void shareSurface(Surface *surface);
	bool isSurfaceValid() const { return _surface != 0; }

	Graphics::Surface *getSurface() const { return _surface; }
	void getSurfaceBounds(Common::Rect &r) { r = _bounds; }

	// None of the copyToCurrentPort* functions do any sanity checks.
	// It's up to clients to make sure that the Surface is valid.
	void copyToCurrentPort() const;
	void copyToCurrentPortTransparent() const;
	void copyToCurrentPort(const Common::Rect &) const;
	void copyToCurrentPortTransparent(const Common::Rect &) const;
	void copyToCurrentPort(const Common::Rect &, const Common::Rect &) const;
	void copyToCurrentPortTransparent(const Common::Rect &, const Common::Rect &) const;
	void copyToCurrentPortMasked(const Common::Rect &, const Common::Rect &, const Surface *) const;
	void copyToCurrentPortTransparentGlow(const Common::Rect &, const Common::Rect &) const;
	void scaleTransparentCopy(const Common::Rect &, const Common::Rect &) const;
	void scaleTransparentCopyGlow(const Common::Rect &, const Common::Rect &) const;

	virtual void getImageFromPICTFile(const Common::String &fileName);
	virtual void getImageFromPICTResource(Common::MacResManager *resFork, uint16 id);
	virtual void getImageFromMovieFrame(Video::VideoDecoder *, TimeValue);

protected:
	bool _ownsSurface;
	Graphics::Surface *_surface;
	Common::Rect _bounds;

private:
	bool getImageFromPICTStream(Common::SeekableReadStream *stream);

	uint32 getGlowColor(uint32 color) const;
	bool isTransparent(uint32 color) const;
};

class PixelImage : public Surface {
public:
	PixelImage();
	virtual ~PixelImage() {}

	void drawImage(const Common::Rect &, const Common::Rect &);

protected:
	virtual void setTransparent(bool transparent) { _transparent = transparent; }

	bool _transparent;
};

class Frame : public PixelImage {
public:
	Frame() {}
	virtual ~Frame() {}

	virtual void initFromPICTFile(const Common::String &fileName, bool transparent = false);
	virtual void initFromPICTResource(Common::MacResManager *resFork, uint16 id, bool transparent = false);
	virtual void initFromMovieFrame(Video::VideoDecoder *, TimeValue, bool transparent = false);
};

class SpriteFrame : public Frame {
friend class Sprite;
public:
	SpriteFrame() { _referenceCount = 0; }
	virtual ~SpriteFrame() {}

protected:
	uint32 _referenceCount;
};

class Picture : public DisplayElement, public Frame {
public:
	Picture(const DisplayElementID id) : DisplayElement(id) {}
	virtual ~Picture() {}

	virtual void initFromPICTFile(const Common::String &fileName, bool transparent = false);
	virtual void initFromPICTResource(Common::MacResManager *resFork, uint16 id, bool transparent = false);
	virtual void initFromMovieFrame(Video::VideoDecoder *, TimeValue, bool transparent = false);

	virtual void draw(const Common::Rect &);
};

} // End of namespace Pegasus

#endif