mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-12 12:09:15 +00:00
181 lines
5.2 KiB
C++
181 lines
5.2 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/>.
|
|
*/
|
|
|
|
#ifndef STARTREK_GRAPHICS_H
|
|
#define STARTREK_GRAPHICS_H
|
|
|
|
#include "startrek/bitmap.h"
|
|
#include "startrek/font.h"
|
|
#include "startrek/startrek.h"
|
|
#include "startrek/sprite.h"
|
|
|
|
#include "common/ptr.h"
|
|
#include "common/rect.h"
|
|
#include "common/stream.h"
|
|
|
|
using Common::SharedPtr;
|
|
using Common::String;
|
|
|
|
namespace StarTrek {
|
|
|
|
class Font;
|
|
class StarTrekEngine;
|
|
|
|
|
|
const int SCREEN_WIDTH = 320;
|
|
const int SCREEN_HEIGHT = 200;
|
|
|
|
const int MAX_SPRITES = 32;
|
|
|
|
|
|
class Graphics {
|
|
public:
|
|
Graphics(StarTrekEngine *vm);
|
|
~Graphics();
|
|
|
|
void setBackgroundImage(Common::String imageName);
|
|
/**
|
|
* @param origRect The rectangle containing the original bitmap (must contain the
|
|
* whole bitmap, even if some is outside the drawable space)
|
|
* @param drawRect The clipped rectangle to draw at (must be within the drawable space)
|
|
*/
|
|
void drawBitmapToBackground(const Common::Rect &origRect, const Common::Rect &drawRect, Bitmap *bitmap);
|
|
|
|
void fillBackgroundRect(const Common::Rect &rect, byte color);
|
|
byte *getBackgroundPixels();
|
|
byte *lockScreenPixels();
|
|
void unlockScreenPixels();
|
|
|
|
void clearScreenAndPriBuffer();
|
|
/**
|
|
* Note: this doesn't flush the palette to the screen (must call "setPaletteFadeLevel")
|
|
*/
|
|
void loadPalette(const String &paletteFile);
|
|
void copyRectBetweenBitmaps(Bitmap *destBitmap, int destX, int destY, Bitmap *srcBitmap, int srcX, int srcY, int width, int height);
|
|
void fadeinScreen();
|
|
void fadeoutScreen();
|
|
/**
|
|
* This flushes the palette to the screen. fadeLevel ranges from 0-100.
|
|
*/
|
|
void setPaletteFadeLevel(byte *palData, int fadeLevel);
|
|
void incPaletteFadeLevel();
|
|
void decPaletteFadeLevel();
|
|
|
|
void loadPri(const Common::String &priFile);
|
|
void clearPri();
|
|
void setPri(byte val);
|
|
byte getPriValue(int x, int y);
|
|
|
|
Common::Point getMousePos();
|
|
/**
|
|
* Changes the mouse bitmap. The change won't take effect until drawAllSprites is
|
|
* called again.
|
|
*/
|
|
void setMouseBitmap(Common::String bitmapName);
|
|
void popMouseBitmap();
|
|
void toggleMouse(bool visible);
|
|
|
|
/**
|
|
* This function is a workaround for when the mouse position needs to be locked in a set
|
|
* position (used in the action menu). This only affects the position it is drawn at; the
|
|
* sprite's "real" position is still updated normally.
|
|
*
|
|
* This does not call updateScreen.
|
|
*/
|
|
void lockMousePosition(int16 x, int16 y);
|
|
void unlockMousePosition();
|
|
void warpMouse(int16 x, int16 y);
|
|
|
|
void drawSprite(const Sprite &sprite, ::Graphics::Surface *surface);
|
|
/**
|
|
* @param sprite The sprite to draw
|
|
* @param surface The surface to draw to
|
|
* @param rect The part of the sprite to draw (only draw the part of the sprite that
|
|
* intersects with it)
|
|
@ @param rectLeft X-offset to subtract before drawing to surface.
|
|
@ @param rectTop Y-offset to subtract before drawing to surface.
|
|
*/
|
|
void drawSprite(const Sprite &sprite, ::Graphics::Surface *surface, const Common::Rect &rect, int rectLeft = 0, int rectTop = 0);
|
|
void drawAllSprites(bool updateScreenFlag = true);
|
|
/**
|
|
* This function should only be called after "drawAllSprites" (so that sprite rects
|
|
* are updated).
|
|
*/
|
|
void drawAllSpritesInRectToSurface(const Common::Rect &rect, ::Graphics::Surface *surface);
|
|
/**
|
|
* Sets "bitmapChanged" to true on all sprites before calling drawAllSprites.
|
|
*/
|
|
void forceDrawAllSprites(bool updateScreenFlag = true);
|
|
/**
|
|
* Flushes the screen. Usually called by "drawAllSprites".
|
|
*/
|
|
void updateScreen();
|
|
/**
|
|
* Returns the sprite at the given position (ignores mouse).
|
|
*/
|
|
Sprite *getSpriteAt(int16 x, int16 y);
|
|
Sprite *getSpriteAt(Common::Point p) {
|
|
return getSpriteAt(p.x, p.y);
|
|
}
|
|
|
|
void addSprite(Sprite *sprite);
|
|
void delSprite(Sprite *sprite);
|
|
|
|
// Save/load the current state of sprites. Can only push once for now.
|
|
void pushSprites();
|
|
void popSprites();
|
|
|
|
byte *getFontGfx(char c);
|
|
|
|
void copyBackgroundScreen();
|
|
void loadEGAData(const char *egaFile);
|
|
void drawBackgroundImage(const char *filename);
|
|
|
|
public:
|
|
Font *_font;
|
|
|
|
private:
|
|
StarTrekEngine *_vm;
|
|
|
|
bool _egaMode;
|
|
byte *_egaData;
|
|
byte *_palData;
|
|
byte *_lutData;
|
|
byte _priData[SCREEN_WIDTH * SCREEN_HEIGHT / 2];
|
|
|
|
int16 _paletteFadeLevel;
|
|
|
|
Common::Rect _screenRect;
|
|
Bitmap *_backgroundImage;
|
|
|
|
Sprite *_sprites[MAX_SPRITES];
|
|
int _numSprites;
|
|
|
|
// Analagous to above, used when pushing/popping
|
|
Sprite *_pushedSprites[MAX_SPRITES];
|
|
int _pushedNumSprites;
|
|
|
|
Common::Point _lockedMousePos;
|
|
};
|
|
|
|
} // End of namespace StarTrek
|
|
|
|
#endif
|