aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Schickel2012-06-13 04:44:39 +0200
committerJohannes Schickel2012-06-13 04:48:34 +0200
commitcebbc11dac77d30fac3be4cc0ebdc6bc059636ef (patch)
treed303f485c89eabbb7a49ba3c1183eeb6996f2573
parentd5eb3e3c06a1f396f578b21c4a3aaff3519513a5 (diff)
downloadscummvm-rg350-cebbc11dac77d30fac3be4cc0ebdc6bc059636ef.tar.gz
scummvm-rg350-cebbc11dac77d30fac3be4cc0ebdc6bc059636ef.tar.bz2
scummvm-rg350-cebbc11dac77d30fac3be4cc0ebdc6bc059636ef.zip
GUI: Allow Surfaces with abitrary RGB pixel formats to be used in PicButtonWidget and GraphicsWidget.
Only 1Bpp aka paletted surfaces are not supported.
-rw-r--r--gui/widget.cpp79
-rw-r--r--gui/widget.h4
2 files changed, 57 insertions, 26 deletions
diff --git a/gui/widget.cpp b/gui/widget.cpp
index 657245c815..1b68e36ea8 100644
--- a/gui/widget.cpp
+++ b/gui/widget.cpp
@@ -376,7 +376,7 @@ void ButtonWidget::wantTickle(bool tickled) {
PicButtonWidget::PicButtonWidget(GuiObject *boss, int x, int y, int w, int h, const char *tooltip, uint32 cmd, uint8 hotkey)
: ButtonWidget(boss, x, y, w, h, "", tooltip, cmd, hotkey),
- _gfx(), _alpha(256), _transparency(false) {
+ _gfx(new Graphics::Surface()), _alpha(256), _transparency(false) {
setFlags(WIDGET_ENABLED/* | WIDGET_BORDER*/ | WIDGET_CLEARBG);
_type = kButtonWidget;
@@ -384,38 +384,54 @@ PicButtonWidget::PicButtonWidget(GuiObject *boss, int x, int y, int w, int h, co
PicButtonWidget::PicButtonWidget(GuiObject *boss, const Common::String &name, const char *tooltip, uint32 cmd, uint8 hotkey)
: ButtonWidget(boss, name, "", tooltip, cmd, hotkey),
- _alpha(256), _transparency(false) {
+ _gfx(new Graphics::Surface()), _alpha(256), _transparency(false) {
setFlags(WIDGET_ENABLED/* | WIDGET_BORDER*/ | WIDGET_CLEARBG);
_type = kButtonWidget;
}
PicButtonWidget::~PicButtonWidget() {
- _gfx.free();
+ _gfx->free();
+ delete _gfx;
}
void PicButtonWidget::setGfx(const Graphics::Surface *gfx) {
- _gfx.free();
+ _gfx->free();
if (!gfx || !gfx->pixels)
return;
+ if (gfx->format.bytesPerPixel == 1) {
+ warning("PicButtonWidget::setGfx got paletted surface passed");
+ return;
+ }
+
+
if (gfx->w > _w || gfx->h > _h) {
warning("PicButtonWidget has size %dx%d, but a surface with %dx%d is to be set", _w, _h, gfx->w, gfx->h);
return;
}
- // TODO: add conversion to OverlayColor
- _gfx.copyFrom(*gfx);
+ _gfx->copyFrom(*gfx);
}
void PicButtonWidget::drawWidget() {
g_gui.theme()->drawButton(Common::Rect(_x, _y, _x+_w, _y+_h), "", _state, getFlags());
- if (sizeof(OverlayColor) == _gfx.format.bytesPerPixel && _gfx.pixels) {
- const int x = _x + (_w - _gfx.w) / 2;
- const int y = _y + (_h - _gfx.h) / 2;
+ if (_gfx->pixels) {
+ // Check whether the set up surface needs to be converted to the GUI
+ // color format.
+ const Graphics::PixelFormat &requiredFormat = g_gui.theme()->getPixelFormat();
+ if (_gfx->format != requiredFormat) {
+ Graphics::Surface *converted = _gfx->convertTo(requiredFormat);
+ _gfx->free();
+ delete _gfx;
+ _gfx = converted;
+ }
+
+ const int x = _x + (_w - _gfx->w) / 2;
+ const int y = _y + (_h - _gfx->h) / 2;
- g_gui.theme()->drawSurface(Common::Rect(x, y, x + _gfx.w, y + _gfx.h), _gfx, _state, _alpha, _transparency);
+ g_gui.theme()->drawSurface(Common::Rect(x, y, x + _gfx->w, y + _gfx->h), *_gfx, _state, _alpha, _transparency);
}
}
@@ -603,34 +619,39 @@ int SliderWidget::posToValue(int pos) {
#pragma mark -
GraphicsWidget::GraphicsWidget(GuiObject *boss, int x, int y, int w, int h, const char *tooltip)
- : Widget(boss, x, y, w, h, tooltip), _gfx(), _alpha(256), _transparency(false) {
+ : Widget(boss, x, y, w, h, tooltip), _gfx(new Graphics::Surface()), _alpha(256), _transparency(false) {
setFlags(WIDGET_ENABLED | WIDGET_CLEARBG);
_type = kGraphicsWidget;
}
GraphicsWidget::GraphicsWidget(GuiObject *boss, const Common::String &name, const char *tooltip)
- : Widget(boss, name, tooltip), _gfx(), _alpha(256), _transparency(false) {
+ : Widget(boss, name, tooltip), _gfx(new Graphics::Surface()), _alpha(256), _transparency(false) {
setFlags(WIDGET_ENABLED | WIDGET_CLEARBG);
_type = kGraphicsWidget;
}
GraphicsWidget::~GraphicsWidget() {
- _gfx.free();
+ _gfx->free();
+ delete _gfx;
}
void GraphicsWidget::setGfx(const Graphics::Surface *gfx) {
- _gfx.free();
+ _gfx->free();
if (!gfx || !gfx->pixels)
return;
+ if (gfx->format.bytesPerPixel == 1) {
+ warning("GraphicsWidget::setGfx got paletted surface passed");
+ return;
+ }
+
if (gfx->w > _w || gfx->h > _h) {
warning("GraphicsWidget has size %dx%d, but a surface with %dx%d is to be set", _w, _h, gfx->w, gfx->h);
return;
}
- // TODO: add conversion to OverlayColor
- _gfx.copyFrom(*gfx);
+ _gfx->copyFrom(*gfx);
}
void GraphicsWidget::setGfx(int w, int h, int r, int g, int b) {
@@ -639,19 +660,29 @@ void GraphicsWidget::setGfx(int w, int h, int r, int g, int b) {
if (h == -1)
h = _h;
- Graphics::PixelFormat overlayFormat = g_system->getOverlayFormat();
+ const Graphics::PixelFormat &requiredFormat = g_gui.theme()->getPixelFormat();
- _gfx.free();
- _gfx.create(w, h, overlayFormat);
- _gfx.fillRect(Common::Rect(0, 0, w, h), _gfx.format.RGBToColor(r, g, b));
+ _gfx->free();
+ _gfx->create(w, h, requiredFormat);
+ _gfx->fillRect(Common::Rect(0, 0, w, h), _gfx->format.RGBToColor(r, g, b));
}
void GraphicsWidget::drawWidget() {
- if (sizeof(OverlayColor) == _gfx.format.bytesPerPixel && _gfx.pixels) {
- const int x = _x + (_w - _gfx.w) / 2;
- const int y = _y + (_h - _gfx.h) / 2;
+ if (_gfx->pixels) {
+ // Check whether the set up surface needs to be converted to the GUI
+ // color format.
+ const Graphics::PixelFormat &requiredFormat = g_gui.theme()->getPixelFormat();
+ if (_gfx->format != requiredFormat) {
+ Graphics::Surface *converted = _gfx->convertTo(requiredFormat);
+ _gfx->free();
+ delete _gfx;
+ _gfx = converted;
+ }
+
+ const int x = _x + (_w - _gfx->w) / 2;
+ const int y = _y + (_h - _gfx->h) / 2;
- g_gui.theme()->drawSurface(Common::Rect(x, y, x + _gfx.w, y + _gfx.h), _gfx, _state, _alpha, _transparency);
+ g_gui.theme()->drawSurface(Common::Rect(x, y, x + _gfx->w, y + _gfx->h), *_gfx, _state, _alpha, _transparency);
}
}
diff --git a/gui/widget.h b/gui/widget.h
index 6a6c67ced9..6de56862c3 100644
--- a/gui/widget.h
+++ b/gui/widget.h
@@ -227,7 +227,7 @@ public:
protected:
void drawWidget();
- Graphics::Surface _gfx;
+ Graphics::Surface *_gfx;
int _alpha;
bool _transparency;
};
@@ -355,7 +355,7 @@ public:
protected:
void drawWidget();
- Graphics::Surface _gfx;
+ Graphics::Surface *_gfx;
int _alpha;
bool _transparency;
};