[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