scummvm/engines/glk/frotz/windows.h

299 lines
5.5 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 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 GLK_FROTZ_WINDOWS
#define GLK_FROTZ_WINDOWS
#include "glk/windows.h"
#include "glk/frotz/frotz_types.h"
namespace Glk {
namespace Frotz {
#include "glk/windows.h"
#include "glk/utils.h"
enum WindowProperty {
Y_POS = 0, X_POS = 1, Y_SIZE = 2, X_SIZE = 3, Y_CURSOR = 4, X_CURSOR = 5,
LEFT_MARGIN = 6, RIGHT_MARGIN = 7, NEWLINE_INTERRUPT = 8, INTERRUPT_COUNTDOWN = 9,
TEXT_STYLE = 10, COLOUR_DATA = 11, FONT_NUMBER = 12, FONT_SIZE = 13, ATTRIBUTES = 14,
LINE_COUNT = 15, TRUE_FG_COLOR = 16, TRUE_BG_COLOR = 17
};
class Windows;
/**
* Represents one of the virtual windows
*/
class Window {
friend class Windows;
/**
* Stub class for accessing window properties via the square brackets operator
*/
class PropertyAccessor {
private:
Window *_owner;
WindowProperty _prop;
public:
/**
* Constructor
*/
PropertyAccessor(Window *owner, WindowProperty prop) : _owner(owner), _prop(prop) {}
/**
* Get
*/
operator uint() const {
return _owner->getProperty(_prop);
}
/**
* Set
*/
PropertyAccessor &operator=(uint val) {
_owner->setProperty(_prop, val);
return *this;
}
};
private:
Windows *_windows;
int _index;
winid_t _win;
uint _properties[TRUE_BG_COLOR + 1];
private:
/**
* Get a property value
*/
const uint &getProperty(WindowProperty propType);
/**
* Set a property value
*/
void setProperty(WindowProperty propType, uint value);
/**
* Called when trying to reposition or resize windows. Does special handling for the lower window
*/
void checkRepositionLower();
/**
* Updates the local window properties based on an attached Glk window
*/
void update();
/**
* Creates a new Glk window to attach to the window
*/
void createGlkWindow();
/**
* Updates the current font/style
*/
void updateStyle();
/**
* Get the bounding area for the window
*/
Rect getBounds() const;
public:
int _currFont;
int _prevFont;
int _tempFont;
int _currStyle;
int _oldStyle;
int _quotes;
int _dashes;
int _spaces;
public:
/**
* Constructor
*/
Window();
/**
* Assignment operator
*/
Window &operator=(winid_t win);
/**
* Cast operator for getting a Glk window
*/
operator winid_t() const {
assert(_win);
return _win;
}
/**
* Equality operator
*/
inline bool operator==(const Window &rhs) { return this == &rhs; }
/**
* Cast operator for testing if the window has a proper Glk window attached to it
*/
operator bool() const { return _win != nullptr; }
/**
* Property accessor
*/
PropertyAccessor operator[](WindowProperty propType) { return PropertyAccessor(this, propType); }
/**
* Ensures that the underlying window is a Glk text window
*/
void ensureTextWindow();
/**
* Set the window size
*/
void setSize(const Point &newSize);
/**
* Copys a window's size to the underlying Glk one, if present
*/
void setSize();
/**
* Set the position of a window
*/
void setPosition(const Point &newPos);
/**
* Copys a window's position to the underlying Glk one, if present
*/
void setPosition();
/**
* Set the cursor position
*/
void setCursor(const Point &newPos);
/**
* Copys a window's position to the underlying Glk one, if present
*/
void setCursor();
/**
* Clear the window
*/
void clear();
/**
* Update colors for the window
*/
void updateColors();
/**
* Update colors for the window
*/
void updateColors(uint fore, uint back);
/**
* Set the font
*/
uint setFont(uint font);
/**
* Set the textstyle
*/
void setStyle(int style = -1);
/**
* Set reverse video
*/
void setReverseVideo(bool reverse);
/**
* Draw an image
*/
bool imageDraw(uint image, ImageAlign align, int val);
/**
* Draw a scaled image
*/
bool imageDrawScaled(uint image, int val1, int val2, uint width, uint height);
};
/**
* Windows manager
*/
class Windows {
private:
Window _windows[8];
public:
winid_t _background;
Window &_lower;
Window &_upper;
int _cwin;
public:
/**
* Constructor
*/
Windows();
/**
* Returns the number of allowable windows
*/
size_t size() const;
/**
* Array access
*/
Window &operator[](uint idx);
/**
* Setup the screen
*/
void setup(bool isVersion6);
/**
* Set current window
*/
void setWindow(int win);
/**
* Get the current window
*/
Window &currWin() {
return _windows[_cwin];
}
/**
* Get the current window pointer
*/
winid_t glkWin() const {
assert(_windows[_cwin]._win);
return _windows[_cwin]._win;
}
/**
* Places any text windows in front of the background in V6 games
*/
void showTextWindows();
};
} // End of namespace Frotz
} // End of namespace Glk
#endif