aboutsummaryrefslogtreecommitdiff
path: root/engines/tsage/graphics.h
diff options
context:
space:
mode:
Diffstat (limited to 'engines/tsage/graphics.h')
-rw-r--r--engines/tsage/graphics.h349
1 files changed, 349 insertions, 0 deletions
diff --git a/engines/tsage/graphics.h b/engines/tsage/graphics.h
new file mode 100644
index 0000000000..0ad76772b3
--- /dev/null
+++ b/engines/tsage/graphics.h
@@ -0,0 +1,349 @@
+/* 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.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#ifndef RING_GRAPHICS_H
+#define RING_GRAPHICS_H
+
+#include "tsage/events.h"
+#include "tsage/saveload.h"
+#include "common/list.h"
+#include "common/rect.h"
+#include "common/system.h"
+#include "graphics/surface.h"
+
+namespace tSage {
+
+class GfxSurface;
+class Region;
+
+/**
+ * Extended Rect class with extra support methods
+ */
+class Rect : public Common::Rect, public Serialisable {
+public:
+ Rect() : Common::Rect() {};
+ Rect(int16 x1, int16 y1, int16 x2, int16 y2) : Common::Rect(x1, y1, x2, y2) {};
+
+ void set(int16 x1, int16 y1, int16 x2, int16 y2);
+ void collapse(int dx, int dy);
+ void centre(int dx, int dy);
+ void centre(const Rect &r);
+ void centre(const Common::Point &pt) { centre(pt.x, pt.y); }
+ void contain(const Rect &r);
+ void resize(const GfxSurface &surface, int xp, int yp, int percent);
+ void expandPanes();
+
+ virtual void synchronise(Serialiser &s);
+};
+
+class GfxColours {
+public:
+ uint8 foreground;
+ uint8 background;
+
+ GfxColours() : foreground(0), background(0) {};
+};
+
+class LineSlice {
+public:
+ int xs, xe;
+
+ LineSlice() { xs = 0; xe = 0; }
+ LineSlice(int xStart, int xEnd) { xs = xStart; xe = xEnd; }
+};
+
+class GfxSurface {
+private:
+ Graphics::Surface *_customSurface;
+ Graphics::Surface *_screenSurfaceP;
+ int _lockSurfaceCtr;
+ bool _screenSurface;
+
+ bool _disableUpdates;
+ Rect _bounds;
+public:
+ Common::Point _centroid;
+ int _transColour;
+public:
+ GfxSurface();
+ GfxSurface(const GfxSurface &s);
+ ~GfxSurface();
+
+ void setScreenSurface();
+ Graphics::Surface lockSurface();
+ void unlockSurface();
+ void create(int width, int height);
+ void setBounds(const Rect &bounds) { _bounds = bounds; };
+ const Rect &getBounds() const { return _bounds; };
+
+ void copyFrom(GfxSurface &src, Rect srcBounds, Rect destBounds, Region *priorityRegion = NULL);
+ void copyFrom(GfxSurface &src, Rect destBounds, Region *priorityRegion = NULL) {
+ copyFrom(src, src.getBounds(), destBounds, priorityRegion);
+ }
+ void copyFrom(GfxSurface &src, int destX = 0, int destY = 0, Region *priorityRegion = NULL) {
+ Rect tempRect = src.getBounds();
+ tempRect.moveTo(destX, destY);
+ copyFrom(src, tempRect, priorityRegion);
+ }
+ void draw(const Common::Point &pt, Rect *rect = NULL);
+ void fillRect(const Rect &bounds, int colour);
+ GfxSurface &operator=(const GfxSurface &s);
+
+ static void loadScreenSection(Graphics::Surface &dest, int xHalf, int yHalf, int xSection, int ySection);
+ static bool displayText(const Common::String &msg, const Common::Point &pt = Common::Point(160, 100));
+};
+
+enum TextAlign {ALIGN_LEFT = 0, ALIGN_CENTRE = 1, ALIGN_RIGHT = 2, ALIGN_JUSTIFIED = 3};
+
+class GfxFont {
+ friend class GfxFontBackup;
+private:
+ GfxManager *_gfxManager;
+ // Raw font details
+ const byte *_fontData;
+ int _numChars;
+ Common::Point _fontSize;
+ int _bpp;
+public:
+ // Font fields
+ Common::Point _edgeSize;
+ Common::Point _position;
+ bool _fillFlag;
+ GfxColours _colours;
+ GfxColours _colours2;
+ uint32 _fontNumber;
+ Common::Point _topLeft;
+public:
+ GfxFont();
+ virtual ~GfxFont();
+
+ void setFontNumber(uint32 fontNumber);
+ int32 getHeight() const { return _fontSize.y; }
+ int getCharWidth(char ch);
+ int getStringWidth(const char *s, int numChars);
+ int getStringWidth(const char *s);
+ int getStringFit(const char *&s, int maxWidth);
+ void getStringBounds(const char *s, Rect &bounds, int maxWidth);
+
+ void setOwner(GfxManager *owner) { _gfxManager = owner; }
+ void setPosition(int xp, int yp) { _position.x = xp; _position.y = yp; }
+ int writeChar(const char ch);
+ void writeString(const char *s);
+ void writeString(const char *s, int numChars);
+ void writeLines(const char *s, const Rect &bounds, TextAlign align);
+};
+
+class GfxFontBackup {
+private:
+ GfxSurface *_surface;
+ Common::Point _edgeSize;
+ Common::Point _position;
+ GfxColours _colours;
+ uint32 _fontNumber;
+public:
+ GfxFontBackup();
+ ~GfxFontBackup();
+};
+
+enum GFX_FLAGS {GFXFLAG_THICK_FRAME = 8};
+
+class GfxManager;
+
+class GfxElement {
+public:
+ GfxElement *_owner;
+ Rect _bounds;
+ uint16 _flags;
+ uint16 _fontNumber;
+ GfxColours _colours;
+ GfxColours _fontColours;
+ uint16 _keycode;
+public:
+ GfxElement();
+ virtual ~GfxElement() {}
+
+ void drawFrame();
+
+ // Virtual table method
+ virtual void setDefaults();
+ virtual void remove() { _owner = NULL; }
+ virtual void highlight();
+ virtual void draw() {};
+ virtual bool process(Event &event) { return false; };
+ virtual bool focusedEvent(Event &event);
+};
+
+class GfxImage : public GfxElement {
+public:
+ GfxSurface _surface;
+ int _resNum;
+ int _rlbNum;
+ int _cursorNum;
+public:
+ GfxImage();
+
+ void setDetails(int resNum, int rlbNum, int cursorNum);
+
+ virtual void setDefaults();
+ virtual void draw();
+ virtual bool process(Event &event) { return false; }
+};
+
+class GfxMessage : public GfxElement {
+public:
+ Common::String _message;
+ TextAlign _textAlign;
+ int _width;
+public:
+ GfxMessage();
+ virtual ~GfxMessage() {}
+
+ void set(const Common::String &s, int width, TextAlign textAlign);
+
+ virtual void setDefaults();
+ virtual void draw();
+};
+
+class GfxButton : public GfxElement {
+private:
+ void setFocus();
+public:
+ Common::String _message;
+public:
+ GfxButton() : GfxElement() {};
+ virtual ~GfxButton() {}
+
+ void setText(const Common::String &s) {
+ _message = s;
+ setDefaults();
+ }
+
+ // Virtual table method
+ virtual void setDefaults();
+ virtual void draw();
+ virtual bool process(Event &event);
+};
+
+class GfxManager {
+private:
+ GfxSurface &_surface;
+public:
+ GfxManager *_oldManager;
+ Common::Point _topLeft;
+ Rect _bounds;
+ Rect _pane0Rect4;
+ GfxFont _font;
+public:
+ GfxManager();
+ GfxManager(GfxSurface &s);
+ virtual ~GfxManager() {}
+
+ void setDefaults();
+ void activate();
+ void deactivate();
+
+ // Accessor methods
+ int getStringWidth(const char *s, int numChars);
+ int getStringWidth(const char *s);
+ void getStringBounds(const char *s, Rect &bounds, int maxWidth);
+
+ void setDialogPalette();
+ Graphics::Surface lockSurface() {
+ _surface.setBounds(_bounds);
+ return _surface.lockSurface();
+ }
+ void unlockSurface() { _surface.unlockSurface(); };
+ void fillArea(int xp, int yp, int colour);
+ void fillRect(const Rect &bounds, int colour);
+ void fillRect2(int xs, int ys, int width, int height, int colour);
+ void setFillFlag(bool v) { _font._fillFlag = v; }
+
+ static int getAngle(const Common::Point &p1, const Common::Point &p2);
+
+ // Virtual method table
+ virtual void xorArea(const Common::Rect &r, int colour, int fillMode) {
+ //_surface->xorArea(r, colour, fillMode);
+ }
+ virtual void draw(const Common::Rect &r, void *gfxData, int v1, GfxColours *colours) {
+ //_surface->draw(r, gfxData, v1, colours);
+ }
+ virtual void copy(const byte *src, byte *dest, int size) {
+ Common::copy(src, src + size, dest);
+ }
+ virtual void set(byte *dest, int size, byte val) {
+ Common::set_to(dest, dest + size, val);
+ }
+ void copyFrom(GfxSurface &src, Rect destBounds, Region *priorityRegion = NULL) {
+ _surface.setBounds(_bounds);
+ _surface.copyFrom(src, destBounds, priorityRegion);
+ }
+ void copyFrom(GfxSurface &src, int destX, int destY) {
+ _surface.setBounds(_bounds);
+ _surface.copyFrom(src, destX, destY);
+ g_system->updateScreen();
+ }
+ GfxSurface &getSurface() {
+ _surface.setBounds(_bounds);
+ return _surface;
+ }
+};
+
+typedef Common::List<GfxElement *> GfxElementList;
+
+class GfxDialog : public GfxElement {
+public:
+ GfxManager _gfxManager;
+ GfxElementList _elements;
+ GfxButton *_defaultButton;
+ GfxSurface *_savedArea;
+public:
+ GfxDialog();
+ virtual ~GfxDialog();
+
+ void add(GfxElement *element);
+ void addElements(GfxElement *ge, ...);
+ void setTopLeft(int xp, int yp);
+ void setCentre(int xp, int yp);
+ void frame() {
+ setDefaults();
+ _bounds.collapse(6, 6);
+ }
+ GfxButton *execute(GfxButton *defaultButton = NULL);
+
+ virtual void setDefaults();
+ virtual void remove();
+ virtual void draw();
+
+ static void setPalette();
+};
+
+GfxSurface *Surface_getArea(GfxSurface &src, const Rect &bounds);
+
+GfxSurface surfaceFromRes(const byte *imgData);
+GfxSurface surfaceFromRes(int resNum, int rlbNum, int subNum);
+
+} // End of namespace tSage
+
+#endif