Add AgiButtonStyle and create correct style according to render mode (Supports PC and Amiga styles).
svn-id: r28009
This commit is contained in:
parent
728fe1ff86
commit
80cdd532bc
2 changed files with 166 additions and 0 deletions
|
@ -535,6 +535,58 @@ static const GameSettings agiSettings[] = {
|
||||||
{NULL, NULL, 0, 0, NULL}
|
{NULL, NULL, 0, 0, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
AgiTextColor AgiButtonStyle::getColor(bool hasFocus, bool pressed, bool positive) const {
|
||||||
|
if (_amigaStyle)
|
||||||
|
if (positive)
|
||||||
|
if (pressed) // Positive pressed Amiga-style button
|
||||||
|
return AgiTextColor(amigaBlack, _olderAgi? amigaOrange : amigaPurple);
|
||||||
|
else // Positive unpressed Amiga-style button
|
||||||
|
return AgiTextColor(amigaWhite, amigaGreen);
|
||||||
|
else // _amigaStyle && !positive
|
||||||
|
if (pressed) // Negative pressed Amiga-style button
|
||||||
|
return AgiTextColor(amigaBlack, amigaCyan);
|
||||||
|
else // Negative unpressed Amiga-style button
|
||||||
|
return AgiTextColor(amigaWhite, amigaRed);
|
||||||
|
else // PC-style button
|
||||||
|
if (hasFocus || pressed) // A pressed or in focus PC-style button
|
||||||
|
return AgiTextColor(pcWhite, pcBlack);
|
||||||
|
else // An unpressed PC-style button without focus
|
||||||
|
return AgiTextColor(pcBlack, pcWhite);
|
||||||
|
}
|
||||||
|
|
||||||
|
AgiTextColor AgiButtonStyle::getColor(bool hasFocus, bool pressed, bool baseFgColor, bool baseBgColor) const {
|
||||||
|
return getColor(hasFocus, pressed, AgiTextColor(baseFgColor, baseBgColor));
|
||||||
|
}
|
||||||
|
|
||||||
|
AgiTextColor AgiButtonStyle::getColor(bool hasFocus, bool pressed, const AgiTextColor &baseColor) const {
|
||||||
|
if (hasFocus || pressed)
|
||||||
|
return baseColor.swap();
|
||||||
|
else
|
||||||
|
return baseColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
int AgiButtonStyle::getTextOffset(bool hasFocus, bool pressed) const {
|
||||||
|
return (pressed && !_amigaStyle) ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AgiButtonStyle::getBorder(bool hasFocus, bool pressed) const {
|
||||||
|
return _amigaStyle && !_authenticAmiga && (hasFocus || pressed);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AgiButtonStyle::setAmigaStyle(bool amigaStyle, bool olderAgi, bool authenticAmiga) {
|
||||||
|
_amigaStyle = amigaStyle;
|
||||||
|
_olderAgi = olderAgi;
|
||||||
|
_authenticAmiga = authenticAmiga;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AgiButtonStyle::setPcStyle(bool pcStyle) {
|
||||||
|
setAmigaStyle(!pcStyle);
|
||||||
|
}
|
||||||
|
|
||||||
|
AgiButtonStyle::AgiButtonStyle(Common::RenderMode renderMode) {
|
||||||
|
setAmigaStyle(renderMode == Common::kRenderAmiga);
|
||||||
|
}
|
||||||
|
|
||||||
AgiEngine::AgiEngine(OSystem *syst) : Engine(syst) {
|
AgiEngine::AgiEngine(OSystem *syst) : Engine(syst) {
|
||||||
|
|
||||||
// Setup mixer
|
// Setup mixer
|
||||||
|
@ -635,6 +687,7 @@ void AgiEngine::initialize() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_buttonStyle = AgiButtonStyle(_renderMode);
|
||||||
_console = new Console(this);
|
_console = new Console(this);
|
||||||
_gfx = new GfxMgr(this);
|
_gfx = new GfxMgr(this);
|
||||||
_sound = new SoundMgr(this, _mixer);
|
_sound = new SoundMgr(this, _mixer);
|
||||||
|
|
|
@ -318,6 +318,118 @@ struct AgiBlock {
|
||||||
uint8 *buffer; /* used for window background */
|
uint8 *buffer; /* used for window background */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** AGI text color (Background and foreground color). */
|
||||||
|
struct AgiTextColor {
|
||||||
|
/** Creates an AGI text color. Uses white text on black background by default. */
|
||||||
|
AgiTextColor(int fgColor = 0x0F, int bgColor = 0x00) : fg(fgColor), bg(bgColor) {}
|
||||||
|
|
||||||
|
/** Get an AGI text color with swapped foreground and background color. */
|
||||||
|
AgiTextColor swap() const { return AgiTextColor(bg, fg); }
|
||||||
|
|
||||||
|
int fg; ///< Foreground color (Used for text).
|
||||||
|
int bg; ///< Background color (Used for text's background).
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AGI button style (Amiga or PC).
|
||||||
|
*
|
||||||
|
* Supports positive and negative button types (Used with Amiga-style only):
|
||||||
|
* Positive buttons do what the dialog was opened for.
|
||||||
|
* Negative buttons cancel what the dialog was opened for.
|
||||||
|
* Restart-dialog example: Restart-button is positive, Cancel-button negative.
|
||||||
|
* Paused-dialog example: Continue-button is positive.
|
||||||
|
*/
|
||||||
|
struct AgiButtonStyle {
|
||||||
|
// Public constants etc
|
||||||
|
public:
|
||||||
|
static const int
|
||||||
|
// Amiga colors (Indexes into the Amiga-ish palette)
|
||||||
|
amigaBlack = 0x00, ///< Accurate, is #000000 (24-bit RGB)
|
||||||
|
amigaWhite = 0x0F, ///< Practically accurate, is close to #FFFFFF (24-bit RGB)
|
||||||
|
amigaGreen = 0x02, ///< Quite accurate, should be #008A00 (24-bit RGB)
|
||||||
|
amigaOrange = 0x0C, ///< Inaccurate, too much blue, should be #FF7500 (24-bit RGB)
|
||||||
|
amigaPurple = 0x0D, ///< Inaccurate, too much green, should be #FF00FF (24-bit RGB)
|
||||||
|
amigaRed = 0x04, ///< Quite accurate, should be #BD0000 (24-bit RGB)
|
||||||
|
amigaCyan = 0x0B, ///< Inaccurate, too much red, should be #00FFDE (24-bit RGB)
|
||||||
|
// PC colors (Indexes into the EGA-palette)
|
||||||
|
pcBlack = 0x00,
|
||||||
|
pcWhite = 0x0F;
|
||||||
|
|
||||||
|
// Public methods
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Get the color of the button with the given state and type using current style.
|
||||||
|
*
|
||||||
|
* @param hasFocus True if button has focus, false otherwise.
|
||||||
|
* @param pressed True if button is being pressed, false otherwise.
|
||||||
|
* @param positive True if button is positive, false if button is negative. Only matters for Amiga-style buttons.
|
||||||
|
*/
|
||||||
|
AgiTextColor getColor(bool hasFocus, bool pressed, bool positive = true) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the color of a button with the given base color and state ignoring current style.
|
||||||
|
* Swaps foreground and background color when the button has focus or is being pressed.
|
||||||
|
*
|
||||||
|
* @param hasFocus True if button has focus, false otherwise.
|
||||||
|
* @param pressed True if button is being pressed, false otherwise.
|
||||||
|
* @param baseFgColor Foreground color of the button when it has no focus and is not being pressed.
|
||||||
|
* @param baseBgColor Background color of the button when it has no focus and is not being pressed.
|
||||||
|
*/
|
||||||
|
AgiTextColor getColor(bool hasFocus, bool pressed, bool baseFgColor, bool baseBgColor) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the color of a button with the given base color and state ignoring current style.
|
||||||
|
* Swaps foreground and background color when the button has focus or is being pressed.
|
||||||
|
*
|
||||||
|
* @param hasFocus True if button has focus, false otherwise.
|
||||||
|
* @param pressed True if button is being pressed, false otherwise.
|
||||||
|
* @param baseColor Color of the button when it has no focus and is not being pressed.
|
||||||
|
*/
|
||||||
|
AgiTextColor getColor(bool hasFocus, bool pressed, const AgiTextColor &baseColor) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* How many pixels to offset the shown text diagonally down and to the right.
|
||||||
|
* Currently only used for pressed PC-style buttons.
|
||||||
|
*/
|
||||||
|
int getTextOffset(bool hasFocus, bool pressed) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show border around the button?
|
||||||
|
* Currently border is only used for in focus or pressed Amiga-style buttons
|
||||||
|
* when in inauthentic Amiga-style mode.
|
||||||
|
*/
|
||||||
|
bool getBorder(bool hasFocus, bool pressed) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Amiga-button style.
|
||||||
|
*
|
||||||
|
* @param amigaStyle Set Amiga-button style if true, otherwise set PC-button style.
|
||||||
|
* @param olderAgi If true then use older AGI style in Amiga-mode, otherwise use newer.
|
||||||
|
* @param authenticAmiga If true then don't use a border around buttons in Amiga-mode, otherwise use.
|
||||||
|
*/
|
||||||
|
void setAmigaStyle(bool amigaStyle = true, bool olderAgi = false, bool authenticAmiga = false);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set PC-button style.
|
||||||
|
* @param pcStyle Set PC-button style if true, otherwise set default Amiga-button style.
|
||||||
|
*/
|
||||||
|
void setPcStyle(bool pcStyle = true);
|
||||||
|
|
||||||
|
// Public constructors
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Create a button style based on the given rendering mode.
|
||||||
|
* @param renderMode If Common::kRenderAmiga then creates default Amiga-button style, otherwise PC-style.
|
||||||
|
*/
|
||||||
|
AgiButtonStyle(Common::RenderMode renderMode = Common::kRenderDefault);
|
||||||
|
|
||||||
|
// Private member variables
|
||||||
|
private:
|
||||||
|
bool _amigaStyle; ///< Use Amiga-style buttons if true, otherwise use PC-style buttons.
|
||||||
|
bool _olderAgi; ///< Use older AGI style in Amiga-style mode.
|
||||||
|
bool _authenticAmiga; ///< Don't use border around buttons in Amiga-style mode.
|
||||||
|
};
|
||||||
|
|
||||||
#define EGO_VIEW_TABLE 0
|
#define EGO_VIEW_TABLE 0
|
||||||
#define HORIZON 36
|
#define HORIZON 36
|
||||||
#define _WIDTH 160
|
#define _WIDTH 160
|
||||||
|
@ -595,6 +707,7 @@ public:
|
||||||
int _oldMode;
|
int _oldMode;
|
||||||
|
|
||||||
Menu* _menu;
|
Menu* _menu;
|
||||||
|
AgiButtonStyle _buttonStyle;
|
||||||
|
|
||||||
char _lastSentence[40];
|
char _lastSentence[40];
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue