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
|