[Scummvm-git-logs] scummvm master -> 570e33cc8ace9610f3a6115806b6c71230437eab
djsrv
dservilla at gmail.com
Thu Aug 6 22:33:33 UTC 2020
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
570e33cc8a GRAPHICS: MACGUI: Draw bitmap desktop background
Commit: 570e33cc8ace9610f3a6115806b6c71230437eab
https://github.com/scummvm/scummvm/commit/570e33cc8ace9610f3a6115806b6c71230437eab
Author: djsrv (dservilla at gmail.com)
Date: 2020-08-06T18:32:08-04:00
Commit Message:
GRAPHICS: MACGUI: Draw bitmap desktop background
Changed paths:
A devtools/create_macgui/scummvm_background.bmp
graphics/macgui/datafiles.cpp
graphics/macgui/macwindowmanager.cpp
graphics/macgui/macwindowmanager.h
diff --git a/devtools/create_macgui/scummvm_background.bmp b/devtools/create_macgui/scummvm_background.bmp
new file mode 100644
index 0000000000..636c9bed0d
Binary files /dev/null and b/devtools/create_macgui/scummvm_background.bmp differ
diff --git a/graphics/macgui/datafiles.cpp b/graphics/macgui/datafiles.cpp
index acb41dac9a..874f2ed7bc 100644
--- a/graphics/macgui/datafiles.cpp
+++ b/graphics/macgui/datafiles.cpp
@@ -106,4 +106,16 @@ Common::SeekableReadStream *MacWindowManager::getBorderFile(byte windowType, boo
return _dataBundle->createReadStreamForMember(filename);
}
+Common::SeekableReadStream *MacWindowManager::getFile(const Common::String &filename) {
+ if (!_dataBundle)
+ return NULL;
+
+ if (!_dataBundle->hasFile(filename)) {
+ warning("Missing file '%s' in data bundle", filename.c_str());
+ return NULL;
+ }
+
+ return _dataBundle->createReadStreamForMember(filename);
+}
+
} // End of namespace Graphics
diff --git a/graphics/macgui/macwindowmanager.cpp b/graphics/macgui/macwindowmanager.cpp
index b41b80551f..ba496f2c2b 100644
--- a/graphics/macgui/macwindowmanager.cpp
+++ b/graphics/macgui/macwindowmanager.cpp
@@ -34,6 +34,8 @@
#include "graphics/macgui/mactextwindow.h"
#include "graphics/macgui/macmenu.h"
+#include "image/bmp.h"
+
namespace Graphics {
static const byte palette[] = {
@@ -155,6 +157,8 @@ static void menuTimerHandler(void *refCon);
MacWindowManager::MacWindowManager(uint32 mode, MacPatterns *patterns) {
_screen = 0;
_screenCopy = nullptr;
+ _desktopBmp = nullptr;
+ _desktop = nullptr;
_lastId = 0;
_activeWindow = -1;
_needsRemoval = false;
@@ -200,6 +204,7 @@ MacWindowManager::MacWindowManager(uint32 mode, MacPatterns *patterns) {
CursorMan.showMouse(true);
loadDataBundle();
+ loadDesktop();
}
MacWindowManager::~MacWindowManager() {
@@ -212,9 +217,26 @@ MacWindowManager::~MacWindowManager() {
delete _fontMan;
delete _screenCopy;
+ delete _desktopBmp;
+ delete _desktop;
+
g_system->getTimerManager()->removeTimerProc(&menuTimerHandler);
}
+void MacWindowManager::setScreen(ManagedSurface *screen) {
+ _screen = screen;
+ delete _screenCopy;
+ _screenCopy = nullptr;
+
+ if (_desktop)
+ _desktop->free();
+ else
+ _desktop = new ManagedSurface();
+
+ _desktop->create(_screen->w, _screen->h, PixelFormat::createFormatCLUT8());
+ drawDesktop();
+}
+
void MacWindowManager::setMode(uint32 mode) {
_mode = mode;
@@ -385,14 +407,45 @@ void macDrawPixel(int x, int y, int color, void *data) {
}
}
-void MacWindowManager::drawDesktop() {
- Common::Rect r(_screen->getBounds());
+void MacWindowManager::loadDesktop() {
+ Common::SeekableReadStream *file = getFile("scummvm_background.bmp");
+ if (!file)
+ return;
+
+ Image::BitmapDecoder bmpDecoder;
+ Graphics::Surface *source;
+ _desktopBmp = new Graphics::TransparentSurface();
- MacPlotData pd(_screen, nullptr, &_patterns, kPatternCheckers, 0, 0, 1, _colorWhite);
+ bmpDecoder.loadStream(*file);
+ source = bmpDecoder.getSurface()->convertTo(_desktopBmp->getSupportedPixelFormat(), bmpDecoder.getPalette());
- Graphics::drawRoundRect(r, kDesktopArc, _colorBlack, true, macDrawPixel, &pd);
+ _desktopBmp->create(source->w, source->h, _desktopBmp->getSupportedPixelFormat());
+ _desktopBmp->copyFrom(*source);
- g_system->copyRectToScreen(_screen->getPixels(), _screen->pitch, 0, 0, _screen->w, _screen->h);
+ delete file;
+ source->free();
+ delete source;
+}
+
+void MacWindowManager::drawDesktop() {
+ if (_desktopBmp) {
+ for (uint i = 0; i < _desktop->w; ++i) {
+ for (uint j = 0; j < _desktop->h; ++j) {
+ uint32 color = *(uint32*)_desktopBmp->getBasePtr(i % _desktopBmp->w, j % _desktopBmp->h);
+ byte r, g, b;
+ _desktopBmp->format.colorToRGB(color, r, g, b);
+ if (color > 0) {
+ *((byte *)_desktop->getBasePtr(i, j)) = findBestColor(r, g, b);
+ }
+ }
+ }
+ } else {
+ Common::Rect r(_desktop->getBounds());
+
+ MacPlotData pd(_desktop, nullptr, &_patterns, kPatternCheckers, 0, 0, 1, _colorWhite);
+
+ Graphics::drawRoundRect(r, kDesktopArc, _colorBlack, true, macDrawPixel, &pd);
+ }
}
void MacWindowManager::draw() {
@@ -401,8 +454,15 @@ void MacWindowManager::draw() {
removeMarked();
if (_fullRefresh) {
- if (!(_mode & kWMModeNoDesktop))
- drawDesktop();
+ if (!(_mode & kWMModeNoDesktop)) {
+ if (_desktop->w != _screen->w || _desktop->h != _screen->h) {
+ _desktop->free();
+ _desktop->create(_screen->w, _screen->h, PixelFormat::createFormatCLUT8());
+ drawDesktop();
+ }
+ _screen->blitFrom(*_desktop, Common::Point(0, 0));
+ g_system->copyRectToScreen(_screen->getPixels(), _screen->pitch, 0, 0, _screen->w, _screen->h);
+ }
if (_redrawEngineCallback != nullptr)
_redrawEngineCallback(_engineR);
diff --git a/graphics/macgui/macwindowmanager.h b/graphics/macgui/macwindowmanager.h
index d6480eb101..c2eb5f7a9a 100644
--- a/graphics/macgui/macwindowmanager.h
+++ b/graphics/macgui/macwindowmanager.h
@@ -145,7 +145,7 @@ public:
* Note that this method should be called as soon as the WM is created.
* @param screen Surface on which the desktop will be drawn.
*/
- void setScreen(ManagedSurface *screen) { _screen = screen; delete _screenCopy; _screenCopy = nullptr; }
+ void setScreen(ManagedSurface *screen);
/**
* Create a window with the given parameters.
* Note that this method allocates the necessary memory for the window.
@@ -291,6 +291,7 @@ public:
void loadDataBundle();
BorderOffsets getBorderOffsets(byte windowType);
Common::SeekableReadStream *getBorderFile(byte windowType, bool isActive);
+ Common::SeekableReadStream *getFile(const Common::String &filename);
public:
MacFontManager *_fontMan;
@@ -308,6 +309,7 @@ public:
MacWidget *_hoveredWidget;
private:
+ void loadDesktop();
void drawDesktop();
void removeFromStack(BaseMacWindow *target);
@@ -317,6 +319,9 @@ private:
bool haveZoomBox() { return !_zoomBoxes.empty(); }
public:
+ TransparentSurface *_desktopBmp;
+ ManagedSurface *_desktop;
+
ManagedSurface *_screen;
ManagedSurface *_screenCopy;
More information about the Scummvm-git-logs
mailing list