163 lines
5.4 KiB
C++
163 lines
5.4 KiB
C++
/* 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 3 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, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
*/
|
|
|
|
// ScreenOverlay is a simple sprite container with no advanced functions.
|
|
// Contains an id of a sprite, which may be either owned by overlay, or shared
|
|
// to whole game similar to how other objects use sprites.
|
|
// May logically exist either on UI or room layer.
|
|
// TODO: historically overlay objects contained an actual bitmap in them.
|
|
// This was remade into having a dynamic sprite allocated exclusively for
|
|
// overlay. But sprites do not have any kind of a ref count of their own
|
|
// (unless exported into script as DynamicSprite), so we have to keep an
|
|
// overlay's flag, which tells that the sprite it references must be deleted
|
|
// on overlay's disposal. This should be improved at some point, by devising
|
|
// a better kind of a sprite's ownership mechanic.
|
|
|
|
#ifndef AGS_ENGINE_AC_SCREEN_OVERLAY_H
|
|
#define AGS_ENGINE_AC_SCREEN_OVERLAY_H
|
|
|
|
#include "common/std/memory.h"
|
|
#include "ags/shared/core/types.h"
|
|
#include "ags/shared/util/geometry.h"
|
|
|
|
namespace AGS3 {
|
|
|
|
// Forward declaration
|
|
namespace AGS {
|
|
namespace Shared {
|
|
class Bitmap;
|
|
class Stream;
|
|
} // namespace Shared
|
|
} // namespace AGS
|
|
|
|
namespace AGS {
|
|
namespace Engine {
|
|
class IDriverDependantBitmap;
|
|
} // namespace Engine
|
|
} // namespace AGS
|
|
|
|
using namespace AGS; // FIXME later
|
|
|
|
enum OverlayFlags {
|
|
kOver_AlphaChannel = 0x0001,
|
|
kOver_PositionAtRoomXY = 0x0002, // room-relative position, may be in ui
|
|
kOver_RoomLayer = 0x0004, // work in room layer (as opposed to UI)
|
|
kOver_SpriteShared = 0x0008 // reference shared sprite (as opposed to exclusive)
|
|
};
|
|
|
|
enum OverlaySvgVersion {
|
|
kOverSvgVersion_Initial = 0,
|
|
kOverSvgVersion_35028 = 1, // offset x,y
|
|
kOverSvgVersion_36008 = 2, // z, transparency
|
|
kOverSvgVersion_36025 = 3, // merged options into flags
|
|
kOverSvgVersion_36108 = 4, // don't save owned sprites (use dynamic sprites)
|
|
};
|
|
|
|
struct ScreenOverlay {
|
|
// Overlay's "type" is a merged special overlay ID and internal container index
|
|
int type = -1;
|
|
// Arbitrary creation order index, meant for resolving equal z-sorting
|
|
int creation_id = 0;
|
|
int timeout = 0;
|
|
// Note that x,y are overlay's properties, that define its position in script;
|
|
// but real drawn position is x + offsetX, y + offsetY;
|
|
int x = 0, y = 0;
|
|
// Border/padding offset for the tiled text windows
|
|
int offsetX = 0, offsetY = 0;
|
|
// Width and height to stretch the texture to
|
|
int scaleWidth = 0, scaleHeight = 0;
|
|
int bgSpeechForChar = -1;
|
|
int associatedOverlayHandle = 0; // script obj handle
|
|
int zorder = INT_MIN;
|
|
int transparency = 0;
|
|
|
|
ScreenOverlay() = default;
|
|
ScreenOverlay(ScreenOverlay &&);
|
|
~ScreenOverlay();
|
|
ScreenOverlay &operator=(ScreenOverlay &&);
|
|
|
|
// FIXME: These are private in the upstream repo,
|
|
// but Windows CI complains
|
|
ScreenOverlay(const ScreenOverlay &) = default;
|
|
ScreenOverlay &operator=(const ScreenOverlay &) = default;
|
|
|
|
bool HasAlphaChannel() const {
|
|
return (_flags & kOver_AlphaChannel) != 0;
|
|
}
|
|
bool IsSpriteShared() const {
|
|
return (_flags & kOver_SpriteShared) != 0;
|
|
}
|
|
bool IsRoomRelative() const {
|
|
return (_flags & kOver_PositionAtRoomXY) != 0;
|
|
}
|
|
bool IsRoomLayer() const {
|
|
return (_flags & kOver_RoomLayer) != 0;
|
|
}
|
|
void SetAlphaChannel(bool on) {
|
|
on ? _flags |= kOver_AlphaChannel : _flags &= ~kOver_AlphaChannel;
|
|
}
|
|
void SetRoomRelative(bool on) {
|
|
on ? _flags |= kOver_PositionAtRoomXY : _flags &= ~kOver_PositionAtRoomXY;
|
|
}
|
|
void SetRoomLayer(bool on) {
|
|
on ? _flags |= (kOver_RoomLayer | kOver_PositionAtRoomXY) :
|
|
_flags &= ~(kOver_RoomLayer | kOver_PositionAtRoomXY);
|
|
}
|
|
// Gets actual overlay's image, whether owned by overlay or by a sprite reference
|
|
Shared::Bitmap *GetImage() const;
|
|
// Get sprite reference id, or 0 if none set
|
|
int GetSpriteNum() const {
|
|
return _sprnum;
|
|
}
|
|
Size GetGraphicSize() const;
|
|
// Assigns an exclusive image to this overlay; the image will be stored as a dynamic sprite
|
|
// in a sprite cache, but owned by this overlay and therefore disposed at its disposal
|
|
void SetImage(std::unique_ptr<Shared::Bitmap> pic, bool has_alpha = false, int offx = 0, int offy = 0);
|
|
// Assigns a shared sprite to this overlay
|
|
void SetSpriteNum(int sprnum, int offx = 0, int offy = 0);
|
|
// Tells if Overlay has graphically changed recently
|
|
bool HasChanged() const {
|
|
return _hasChanged;
|
|
}
|
|
// Manually marks GUI as graphically changed
|
|
void MarkChanged() {
|
|
_hasChanged = true;
|
|
}
|
|
// Clears changed flag
|
|
void ClearChanged() {
|
|
_hasChanged = false;
|
|
}
|
|
|
|
void ReadFromSavegame(Shared::Stream *in, bool &has_bitmap, int32_t cmp_ver);
|
|
void WriteToSavegame(Shared::Stream *out) const;
|
|
|
|
private:
|
|
void ResetImage();
|
|
|
|
int _flags = 0; // OverlayFlags
|
|
int _sprnum = 0; // sprite id
|
|
bool _hasChanged = false;
|
|
};
|
|
|
|
} // namespace AGS3
|
|
|
|
#endif
|