GUI: Allow Surfaces with abitrary RGB pixel formats to be used in PicButtonWidget and GraphicsWidget.
Only 1Bpp aka paletted surfaces are not supported.
This commit is contained in:
parent
d5eb3e3c06
commit
cebbc11dac
2 changed files with 57 additions and 26 deletions
|
@ -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)
|
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),
|
: 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);
|
setFlags(WIDGET_ENABLED/* | WIDGET_BORDER*/ | WIDGET_CLEARBG);
|
||||||
_type = kButtonWidget;
|
_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)
|
PicButtonWidget::PicButtonWidget(GuiObject *boss, const Common::String &name, const char *tooltip, uint32 cmd, uint8 hotkey)
|
||||||
: ButtonWidget(boss, name, "", tooltip, cmd, 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);
|
setFlags(WIDGET_ENABLED/* | WIDGET_BORDER*/ | WIDGET_CLEARBG);
|
||||||
_type = kButtonWidget;
|
_type = kButtonWidget;
|
||||||
}
|
}
|
||||||
|
|
||||||
PicButtonWidget::~PicButtonWidget() {
|
PicButtonWidget::~PicButtonWidget() {
|
||||||
_gfx.free();
|
_gfx->free();
|
||||||
|
delete _gfx;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PicButtonWidget::setGfx(const Graphics::Surface *gfx) {
|
void PicButtonWidget::setGfx(const Graphics::Surface *gfx) {
|
||||||
_gfx.free();
|
_gfx->free();
|
||||||
|
|
||||||
if (!gfx || !gfx->pixels)
|
if (!gfx || !gfx->pixels)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (gfx->format.bytesPerPixel == 1) {
|
||||||
|
warning("PicButtonWidget::setGfx got paletted surface passed");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (gfx->w > _w || gfx->h > _h) {
|
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);
|
warning("PicButtonWidget has size %dx%d, but a surface with %dx%d is to be set", _w, _h, gfx->w, gfx->h);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: add conversion to OverlayColor
|
_gfx->copyFrom(*gfx);
|
||||||
_gfx.copyFrom(*gfx);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void PicButtonWidget::drawWidget() {
|
void PicButtonWidget::drawWidget() {
|
||||||
g_gui.theme()->drawButton(Common::Rect(_x, _y, _x+_w, _y+_h), "", _state, getFlags());
|
g_gui.theme()->drawButton(Common::Rect(_x, _y, _x+_w, _y+_h), "", _state, getFlags());
|
||||||
|
|
||||||
if (sizeof(OverlayColor) == _gfx.format.bytesPerPixel && _gfx.pixels) {
|
if (_gfx->pixels) {
|
||||||
const int x = _x + (_w - _gfx.w) / 2;
|
// Check whether the set up surface needs to be converted to the GUI
|
||||||
const int y = _y + (_h - _gfx.h) / 2;
|
// 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;
|
||||||
|
}
|
||||||
|
|
||||||
g_gui.theme()->drawSurface(Common::Rect(x, y, x + _gfx.w, y + _gfx.h), _gfx, _state, _alpha, _transparency);
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -603,34 +619,39 @@ int SliderWidget::posToValue(int pos) {
|
||||||
#pragma mark -
|
#pragma mark -
|
||||||
|
|
||||||
GraphicsWidget::GraphicsWidget(GuiObject *boss, int x, int y, int w, int h, const char *tooltip)
|
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);
|
setFlags(WIDGET_ENABLED | WIDGET_CLEARBG);
|
||||||
_type = kGraphicsWidget;
|
_type = kGraphicsWidget;
|
||||||
}
|
}
|
||||||
|
|
||||||
GraphicsWidget::GraphicsWidget(GuiObject *boss, const Common::String &name, const char *tooltip)
|
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);
|
setFlags(WIDGET_ENABLED | WIDGET_CLEARBG);
|
||||||
_type = kGraphicsWidget;
|
_type = kGraphicsWidget;
|
||||||
}
|
}
|
||||||
|
|
||||||
GraphicsWidget::~GraphicsWidget() {
|
GraphicsWidget::~GraphicsWidget() {
|
||||||
_gfx.free();
|
_gfx->free();
|
||||||
|
delete _gfx;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GraphicsWidget::setGfx(const Graphics::Surface *gfx) {
|
void GraphicsWidget::setGfx(const Graphics::Surface *gfx) {
|
||||||
_gfx.free();
|
_gfx->free();
|
||||||
|
|
||||||
if (!gfx || !gfx->pixels)
|
if (!gfx || !gfx->pixels)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (gfx->format.bytesPerPixel == 1) {
|
||||||
|
warning("GraphicsWidget::setGfx got paletted surface passed");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (gfx->w > _w || gfx->h > _h) {
|
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);
|
warning("GraphicsWidget has size %dx%d, but a surface with %dx%d is to be set", _w, _h, gfx->w, gfx->h);
|
||||||
return;
|
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) {
|
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)
|
if (h == -1)
|
||||||
h = _h;
|
h = _h;
|
||||||
|
|
||||||
Graphics::PixelFormat overlayFormat = g_system->getOverlayFormat();
|
const Graphics::PixelFormat &requiredFormat = g_gui.theme()->getPixelFormat();
|
||||||
|
|
||||||
_gfx.free();
|
_gfx->free();
|
||||||
_gfx.create(w, h, overlayFormat);
|
_gfx->create(w, h, requiredFormat);
|
||||||
_gfx.fillRect(Common::Rect(0, 0, w, h), _gfx.format.RGBToColor(r, g, b));
|
_gfx->fillRect(Common::Rect(0, 0, w, h), _gfx->format.RGBToColor(r, g, b));
|
||||||
}
|
}
|
||||||
|
|
||||||
void GraphicsWidget::drawWidget() {
|
void GraphicsWidget::drawWidget() {
|
||||||
if (sizeof(OverlayColor) == _gfx.format.bytesPerPixel && _gfx.pixels) {
|
if (_gfx->pixels) {
|
||||||
const int x = _x + (_w - _gfx.w) / 2;
|
// Check whether the set up surface needs to be converted to the GUI
|
||||||
const int y = _y + (_h - _gfx.h) / 2;
|
// 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;
|
||||||
|
}
|
||||||
|
|
||||||
g_gui.theme()->drawSurface(Common::Rect(x, y, x + _gfx.w, y + _gfx.h), _gfx, _state, _alpha, _transparency);
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -227,7 +227,7 @@ public:
|
||||||
protected:
|
protected:
|
||||||
void drawWidget();
|
void drawWidget();
|
||||||
|
|
||||||
Graphics::Surface _gfx;
|
Graphics::Surface *_gfx;
|
||||||
int _alpha;
|
int _alpha;
|
||||||
bool _transparency;
|
bool _transparency;
|
||||||
};
|
};
|
||||||
|
@ -355,7 +355,7 @@ public:
|
||||||
protected:
|
protected:
|
||||||
void drawWidget();
|
void drawWidget();
|
||||||
|
|
||||||
Graphics::Surface _gfx;
|
Graphics::Surface *_gfx;
|
||||||
int _alpha;
|
int _alpha;
|
||||||
bool _transparency;
|
bool _transparency;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue