[Scummvm-git-logs] scummvm master -> 1009078024bcfeb9d602af78dbc203d6ea2a0f58

sev- sev at scummvm.org
Thu Apr 15 21:47:58 UTC 2021


This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
3e84b88400 GUI: Scale EE in About dialog
1009078024 GUI: Speedup rendering in EE


Commit: 3e84b884005d4f927624f4ee0e6d14d0933f12ce
    https://github.com/scummvm/scummvm/commit/3e84b884005d4f927624f4ee0e6d14d0933f12ce
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2021-04-15T23:44:04+02:00

Commit Message:
GUI: Scale EE in About dialog

Changed paths:
    gui/about.cpp


diff --git a/gui/about.cpp b/gui/about.cpp
index 63635929db..6ae41eb3d0 100644
--- a/gui/about.cpp
+++ b/gui/about.cpp
@@ -349,6 +349,20 @@ enum { kPlComp, kPlHuman };
 
 enum { kSndPoint, kSndHit, kSndLoss };
 
+
+enum {
+	kSpL1, kSpL2, kSpL3,
+	kSpR1, kSpR2, kSpR3,
+	kSpB1, kSpB2, kSpB3, kSpB4,
+	kSp0, kSp1, kSp2, kSp3, kSp4,
+	kSp5, kSp6, kSp7, kSp8, kSp9,
+	kSpCode1,
+	kSpCode1h = kSpCode1 + 6,
+	kSpNum0 = kSpCode1h + 6,
+	kSpStar = kSpNum0 + 10,
+	kSpSpace,
+	kSpLast
+};
 class EE  {
 public:
 	EE();
@@ -392,10 +406,12 @@ private:
 
 	Graphics::AmigaFont _font;
 
-	Graphics::Surface _sp[10];
+	Graphics::Surface _sp[kSpLast];
 
 	Graphics::PixelFormat _format;
-	int _windowX, _windowY;
+	int _windowX, _windowY, _windowW, _windowH;
+	float _scale;
+	bool _inited;
 
 	uint32 _colorBlue, _colorOrange;
 
@@ -420,7 +436,6 @@ private:
 	void playSound(int d);
 
 	void genSprites();
-	void drawStatus(Common::String str, int x, uint32 color, int y = 2, int color2 = 0, int w = 184);
 };
 
 bool EEHandler::handleKeyDown(Common::KeyState &state) {
@@ -438,11 +453,25 @@ bool EEHandler::handleKeyDown(Common::KeyState &state) {
 }
 
 EE::EE() {
-	_windowX = (g_system->getOverlayWidth() > 320) ? (g_system->getOverlayWidth() - 320) / 2 : 0;
-	_windowY = (g_system->getOverlayHeight() > 200) ? (g_system->getOverlayHeight() - 200) / 2 : 0;
+	if (g_system->getOverlayWidth() < 320 || g_system->getOverlayHeight() < 200) {
+		warning("EE: Screen is too small");
+		_inited = false;
+
+		return;
+	}
+
+	// Determine scale factor
+	float scaleX = g_system->getOverlayWidth() * 0.9 / 320;
+	float scaleY = g_system->getOverlayHeight() * 0.9 / 200;
+	_scale = MAX(1.0f, MIN(scaleX, scaleY));
+
+	_windowW = 320 * _scale;
+	_windowH = 200 * _scale;
+	_windowX = (g_system->getOverlayWidth() > 320) ? (g_system->getOverlayWidth() - _windowW) / 2 : 0;
+	_windowY = (g_system->getOverlayHeight() > 200) ? (g_system->getOverlayHeight() - _windowH) / 2 : 0;
 
 	_format = g_system->getOverlayFormat();
-	_back.create(MIN<int>(g_system->getOverlayWidth(), 320), MIN<int>(g_system->getOverlayHeight(), 200), _format);
+	_back.create(_windowW, _windowH, _format);
 
 	_colorBlue   = _format.RGBToColor(5 * 16, 7 * 16, 8 * 16);
 	_colorOrange = _format.RGBToColor(15 * 16, 7 * 16, 8 * 16);
@@ -451,16 +480,21 @@ EE::EE() {
 }
 
 EE::~EE() {
+	for (int i = 0; i < kSpLast; i++)
+		_sp[i].free();
 }
 
 void EE::cls(bool update) {
-	_back.fillRect(Common::Rect(0, 0, MIN<int>(g_system->getOverlayWidth(), 320), MIN<int>(g_system->getOverlayHeight(), 200)), 0);
+	_back.fillRect(Common::Rect(0, 0, _windowW, _windowH), 0);
 
 	if (update)
-		g_system->copyRectToOverlay(_back.getPixels(), _back.pitch, _windowX, _windowY, MIN<int>(g_system->getOverlayWidth(), 320), MIN<int>(g_system->getOverlayHeight(), 200));
+		g_system->copyRectToOverlay(_back.getPixels(), _back.pitch, _windowX, _windowY, _windowW, _windowH);
 }
 
 void EE::run() {
+	if (!_inited)
+		return;
+
 	_shouldQuit = false;
 
 	genSprites();
@@ -496,15 +530,6 @@ void EE::run() {
 	}
 }
 
-enum {
-	kSpL1, kSpL2, kSpL3,
-	kSpR1, kSpR2, kSpR3,
-	kSpB1, kSpB2, kSpB3, kSpB4,
-	kSp0, kSp1, kSp2, kSp3, kSp4,
-	kSp5, kSp6, kSp7, kSp8, kSp9,
-	kSpSt
-};
-
 const int polecol[] = {0, 1, 2, 3, 3, 4, 6, 7, 9, 14};
 const int jump[] = {-4, -4, -3, -3, -3, -3, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, 0, 0,
 					0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4};
@@ -1076,52 +1101,29 @@ void EE::init() {
 	_rmode = false;
 
 	_shouldQuit = false;
-}
 
-void EE::drawStatus(Common::String str, int x, uint32 color, int y, int color2, int w) {
-	if (color2)
-		_back.fillRect(Common::Rect(x, y, x + w, y + 10), color2);
-	_font.drawString(&_back, str, x, y + 1, w, color, Graphics::kTextAlignLeft, 0, false);
+	_inited = true;
 }
 
-void EE::draw(int sn, int x, int y) {
+void EE::draw(int sn, int x1, int y1) {
+	int x = x1 * _scale;
+	int y = y1 * _scale;
 	_back.transBlitFrom(_sp[sn], Common::Point(x, y), 0);
-	g_system->copyRectToOverlay(_back.getBasePtr(x, y),
-	                           _back.pitch,
-	                           MIN<int>(_windowX + x, g_system->getOverlayWidth()),
-	                           MIN<int>(_windowY + y, g_system->getOverlayHeight()),
-	                           MIN<int>(_sp[sn].w, g_system->getOverlayWidth() - MIN<int>(_windowX + x, g_system->getOverlayWidth())),
-	                           MIN<int>(_sp[sn].h, g_system->getOverlayHeight() - MIN<int>(_windowY + y, g_system->getOverlayHeight()) ));
+	g_system->copyRectToOverlay(_back.getBasePtr(x, y), _back.pitch, _windowX + x, _windowY + y, _sp[sn].w, _sp[sn].h);
 }
 
-const char *codes =
-"Dvhgkm#Ztrsm|ffrs(#$%&'#$%&O}pes&}{1$M{tiq$%&'#$M{tiq${y5(Fsrv||hv%&'#$"
-"Hutxxxjx'~v2%N|udr%&'#Gtsw}wiw&}{1$Hutxxxjx'#$%&'(#$%W|qw$%&'(#$%&'";
-
 void EE::putshapes() {
 	int sprite;
 
 	cls(false);
 
 	if (_oCoords) {
-		g_system->copyRectToOverlay(_back.getBasePtr(_obx, _oby),
-		                            _back.pitch,
-		                            MIN<int>(_windowX + _obx, g_system->getOverlayWidth()),
-		                            MIN<int>(_windowY + _oby, g_system->getOverlayHeight()),
-		                            MIN<int>(_sp[kSpB1].w, g_system->getOverlayWidth() - MIN<int>(_windowX + _obx, g_system->getOverlayWidth())),
-		                            MIN<int>(_sp[kSpB1].h, g_system->getOverlayHeight() - MIN<int>(_windowY + _oby, g_system->getOverlayHeight()) ));
-		g_system->copyRectToOverlay(_back.getBasePtr(_olx, _oly),
-		                            _back.pitch,
-		                            MIN<int>(_windowX + _olx, g_system->getOverlayWidth()),
-		                            MIN<int>(_windowY + _oly, g_system->getOverlayHeight()),
-		                            MIN<int>(_sp[kSpL1].w, g_system->getOverlayWidth() - MIN<int>(_windowX + _olx, g_system->getOverlayWidth())),
-		                            MIN<int>(_sp[kSpL1].h, g_system->getOverlayHeight() - MIN<int>(_windowY + _oly, g_system->getOverlayHeight()) ));
-		g_system->copyRectToOverlay(_back.getBasePtr(_orx, _ory),
-		                            _back.pitch,
-		                            MIN<int>(_windowX + _orx, g_system->getOverlayWidth()),
-		                            MIN<int>(_windowY + _ory, g_system->getOverlayHeight()),
-		                            MIN<int>(_sp[kSpR1].w, g_system->getOverlayWidth() - MIN<int>(_windowX + _orx, g_system->getOverlayWidth())),
-		                            MIN<int>(_sp[kSpR1].h, g_system->getOverlayHeight() - MIN<int>(_windowY + _ory, g_system->getOverlayHeight()) ));
+		int obx = _obx * _scale, oby = _oby * _scale;
+		int olx = _olx * _scale, oly = _oly * _scale;
+		int orx = _orx * _scale, ory = _ory * _scale;
+		g_system->copyRectToOverlay(_back.getBasePtr(obx, oby), _back.pitch, _windowX + obx, _windowY + oby, _sp[kSpB1].w, _sp[kSpB1].h);
+		g_system->copyRectToOverlay(_back.getBasePtr(olx, oly), _back.pitch, _windowX + olx, _windowY + oly, _sp[kSpL1].w, _sp[kSpL1].h);
+		g_system->copyRectToOverlay(_back.getBasePtr(orx, ory), _back.pitch, _windowX + orx, _windowY + ory, _sp[kSpR1].w, _sp[kSpR1].h);
 	}
 
 	sprite = kSpB1 + (_tbx / 16) % 4;
@@ -1169,65 +1171,40 @@ void EE::putshapes() {
 
 	const int *ptr = frames;
 	for (int i = 0; i < 6; i++, ptr += 4) {
-		Common::Rect r(ptr[0], ptr[1], ptr[2], ptr[3]);
+		Common::Rect r(ptr[0] * _scale, ptr[1] * _scale, ptr[2] * _scale, ptr[3] * _scale);
 		_back.fillRect(r, (i < 5 ? color1 : color2));
-		g_system->copyRectToOverlay(_back.getBasePtr(ptr[0], ptr[1]),
-		                            _back.pitch,
-		                            MIN<int>(_windowX + ptr[0], g_system->getOverlayWidth()),
-		                            MIN<int>(_windowY + ptr[1], g_system->getOverlayHeight()),
-		                            MIN<int>(r.width(), g_system->getOverlayWidth() - MIN<int>(_windowX + ptr[0], g_system->getOverlayWidth())),
-		                            MIN<int>(r.height(), g_system->getOverlayHeight() - MIN<int>(_windowY + ptr[1], g_system->getOverlayHeight()) ));
+		g_system->copyRectToOverlay(_back.getBasePtr(r.left, r.top), _back.pitch, _windowX + r.left, _windowY + r.top, r.width(), r.height());
 	}
 
-	int startx = 32;
-
-	Common::String str = Common::String::format("%02d", _score[0]);
-	drawStatus(str, startx, _colorOrange);
-
-	startx += 16;
-
-	drawStatus((_server == 0) ? "*" : "  ", startx, _colorBlue);
-
-	startx = 264;
-
-	str = Common::String::format("%02d", _score[1]);
-	drawStatus(str, startx, _colorOrange);
-
-	startx += 16;
+	for (int i = 0; i < 2; i++) {
+		int startx = i ? 264 : 32;
 
-	drawStatus((_server == 1) ? "*" : "  ", startx, _colorBlue);
+		draw(kSpNum0 + _score[i] / 10, startx, 1);
+		startx += 8;
+		draw(kSpNum0 + _score[i] % 10, startx, 1);
+		startx += 8;
+		draw(_server == i ? kSpStar : kSpSpace, startx, 1);
+	}
 
 	for (int i = 0; i < 6; i++) {
-		char buf[100];
-		int c;
-		for (c = 0; c < 23; c++)
-			buf[c] = codes[c + 23 * i] - 3 - c % 6;
-		buf[c] = 0;
-
 		int sx = i == 0 ? 92 : 80;
 		int sy = i == 0 ? 2 : 20;
-		int c1 = i == 0 ? _colorOrange : (i - 1 == _opt) ? 0 : _colorBlue;
-		int c2 = i - 1 == _opt ? _colorBlue : 0;
-		drawStatus(buf, sx, c1, sy + i * 10, c2);
+
+		int code = i == 0 ? kSpCode1 : i - 1 == _opt ? kSpCode1h + i : kSpCode1 + i;
+		draw(code, sx, sy + i * 10);
 
 		if (_mode != kModeMenu)
 			break;
 	}
 
-	g_system->copyRectToOverlay(_back.getPixels(),
-	                            _back.pitch,
-	                            MIN<int>(_windowX, g_system->getOverlayWidth()),
-	                            MIN<int>(_windowY, g_system->getOverlayHeight()),
-	                            MIN<int>(320, g_system->getOverlayWidth() - MIN<int>(_windowX, g_system->getOverlayWidth())),
-	                            MIN<int>(12, g_system->getOverlayHeight() - MIN<int>(_windowY, g_system->getOverlayHeight()) ));
+	g_system->copyRectToOverlay(_back.getPixels(), _back.pitch, _windowX, _windowY, _windowW, 10 * _scale);
 
 	if (_mode == kModeMenu) {
-		g_system->copyRectToOverlay(_back.getBasePtr(80, 30),
-		                            _back.pitch,
-		                            MIN<int>(_windowX + 80, g_system->getOverlayWidth()),
-		                            MIN<int>(_windowY + 30, g_system->getOverlayHeight()),
-		                            MIN<int>(250, g_system->getOverlayWidth() - MIN<int>(_windowX + 80, g_system->getOverlayWidth())),
-		                            MIN<int>(5 * 10, g_system->getOverlayHeight() - MIN<int>(_windowY + 30, g_system->getOverlayHeight()) ));
+		int x = 92 * _scale;
+		int y = 20 * _scale;
+		int w = _sp[kSpCode1].w;
+		int h = _sp[kSpCode1].h * 5;
+		g_system->copyRectToOverlay(_back.getBasePtr(x, y), _back.pitch, _windowX + x, _windowY + y, w, h);
 	}
 }
 
@@ -1337,47 +1314,62 @@ static const int spcolors[10 * 3] = {
 	0, 0, 0, 12, 12, 12
 };
 
+const char *codes =
+"Dvhgkm#Ztrsm|ffrs(#$%&'#$%&O}pes&}{1$M{tiq$%&'#$M{tiq${y5(Fsrv||hv%&'#$"
+"Hutxxxjx'~v2%N|udr%&'#Gtsw}wiw&}{1$Hutxxxjx'#$%&'(#$%W|qw$%&'(#$%&'";
+
 void EE::genSprites() {
 	uint32 palette[12];
 	for (int i = 0; i < 10 * 3; i += 3)
 		palette[i / 3] = _back.format.RGBToColor(spcolors[i] * 16, spcolors[i + 1] * 16, spcolors[i + 2] * 16);
 
+	Graphics::Surface tmp;
+	int w = 25, h = 21;
+	tmp.create(w, h, g_system->getOverlayFormat());
+
 	for (int s = 0; s < 4; s++) {
-		_sp[kSpB1 + s].create(25, 21, g_system->getOverlayFormat());
 
 		int posy = 0, dy = 1;
 		if (s & 2) { posy = 20; dy = -1; }
 
-		for (int y = 0; y < 21; y++, posy += dy) {
+		for (int y = 0; y < h; y++, posy += dy) {
 			uint32 pixels = ball[y];
 
 			int posx = 0, dx = 1;
 			if (s & 1) { posx = 24; dx = -1; }
 
-			for (int x = 0; x < 25; x++, posx += dx) {
+			for (int x = 0; x < w; x++, posx += dx) {
 				int color = pixels & 1;
 
 				pixels >>= 1;
 
 				if (_back.format.bytesPerPixel == 2)
-					*((uint16 *)_sp[kSpB1 + s].getBasePtr(posx, posy)) = (uint16)palette[color + 8];
+					*((uint16 *)tmp.getBasePtr(posx, posy)) = (uint16)palette[color + 8];
 				else if (_back.format.bytesPerPixel == 4)
-					*((uint32 *)_sp[kSpB1 + s].getBasePtr(posx, posy)) = palette[color + 8];
+					*((uint32 *)tmp.getBasePtr(posx, posy)) = palette[color + 8];
 			}
 		}
+
+		Graphics::Surface *tmp2 = tmp.scale(w * _scale, h * _scale);
+		_sp[kSpB1 + s].copyFrom(*tmp2);
+		tmp2->free();
+		delete tmp2;
 	}
+	tmp.free();
 
-	for (int s = 0; s < 6; s++) {
-		_sp[kSpL1 + s].create(32, 26, g_system->getOverlayFormat());
+	w = 32;
+	h = 26;
+	tmp.create(w, h, g_system->getOverlayFormat());
 
-		for (int y = 0; y < 26; y++) {
+	for (int s = 0; s < 6; s++) {
+		for (int y = 0; y < h; y++) {
 			const uint32 *ptr = (y < 19) ? &head[y * 2] : &legs[(y - 19 + (s % 3) * 7) * 2];
 			uint32 pixels = *ptr++;
 
 			int posx = 0, dx = 1;
 			if (s > 2) { posx = 31; dx = -1; }
 
-			for (int x = 0; x < 32; x++, posx += dx) {
+			for (int x = 0; x < w; x++, posx += dx) {
 				int color = pixels & 3;
 
 				pixels >>= 2;
@@ -1386,12 +1378,64 @@ void EE::genSprites() {
 					pixels = *ptr;
 
 				if (_back.format.bytesPerPixel == 2)
-					*((uint16 *)_sp[kSpL1 + s].getBasePtr(posx, y)) = (uint16)palette[color + 4 * (s / 3)];
+					*((uint16 *)tmp.getBasePtr(posx, y)) = (uint16)palette[color + 4 * (s / 3)];
 				else if (_back.format.bytesPerPixel == 4)
-					*((uint32 *)_sp[kSpL1 + s].getBasePtr(posx, y)) = palette[color + 4 * (s / 3)];
+					*((uint32 *)tmp.getBasePtr(posx, y)) = palette[color + 4 * (s / 3)];
 			}
 		}
+
+		Graphics::Surface *tmp2 = tmp.scale(w * _scale, h * _scale);
+		_sp[kSpL1 + s].copyFrom(*tmp2);
+		tmp2->free();
+		delete tmp2;
+	}
+	tmp.free();
+
+	w = 23 * 8;
+	h = 10;
+	tmp.create(w, h, g_system->getOverlayFormat());
+	for (int hl = 0; hl < 2; hl++) {
+		for (int i = 0; i < 6; i++) {
+			tmp.fillRect(Common::Rect(0, 0, w, h), hl == 1 ? _colorBlue : 0);
+
+			char buf[100];
+			int c;
+			for (c = 0; c < 23; c++)
+				buf[c] = codes[c + 23 * i] - 3 - c % 6;
+			buf[c] = 0;
+
+			int c1 = i == 0 ? _colorOrange : hl == 1 ? 0 : _colorBlue;
+
+			_font.drawString(&tmp, buf, 0, 1, w, c1, Graphics::kTextAlignLeft, 0, false);
+
+			Graphics::Surface *tmp2 = tmp.scale(w * _scale, h * _scale, true);
+			_sp[kSpCode1 + hl * 6 + i].copyFrom(*tmp2);
+			tmp2->free();
+			delete tmp2;
+		}
+	}
+	tmp.free();
+
+	w = 8;
+	h = 10;
+	tmp.create(w, h, g_system->getOverlayFormat());
+	for (int i = 0; i < 12; i++) {
+		tmp.fillRect(Common::Rect(0, 0, w, h), 0);
+
+		char buf[2];
+		buf[0] = i == 10 ? '*' : i == 11 ? ' ' : '0' + i;
+		buf[1] = 0;
+
+		int c = i > 9 ? _colorBlue : _colorOrange;
+
+		_font.drawString(&tmp, buf, 0, 1, w, c, Graphics::kTextAlignLeft, 0, false);
+
+		Graphics::Surface *tmp2 = tmp.scale(w * _scale, h * _scale, true);
+		_sp[kSpNum0 + i].copyFrom(*tmp2);
+		tmp2->free();
+		delete tmp2;
 	}
+	tmp.free();
 }
 
 } // End of namespace GUI


Commit: 1009078024bcfeb9d602af78dbc203d6ea2a0f58
    https://github.com/scummvm/scummvm/commit/1009078024bcfeb9d602af78dbc203d6ea2a0f58
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2021-04-15T23:44:04+02:00

Commit Message:
GUI: Speedup rendering in EE

Changed paths:
    gui/about.cpp


diff --git a/gui/about.cpp b/gui/about.cpp
index 6ae41eb3d0..d30deb8177 100644
--- a/gui/about.cpp
+++ b/gui/about.cpp
@@ -27,7 +27,7 @@
 #include "common/system.h"
 #include "common/translation.h"
 #include "common/util.h"
-#include "graphics/managed_surface.h"
+#include "graphics/surface.h"
 #include "graphics/fonts/amigafont.h"
 #include "gui/about.h"
 #include "gui/gui-manager.h"
@@ -371,7 +371,7 @@ public:
 	void run();
 
 private:
-	Graphics::ManagedSurface _back;
+	Graphics::Surface _back;
 	int _hits;
 	bool _rmode; // animation after loosing
 	int _score[2];
@@ -436,6 +436,7 @@ private:
 	void playSound(int d);
 
 	void genSprites();
+	void genField();
 };
 
 bool EEHandler::handleKeyDown(Common::KeyState &state) {
@@ -1108,7 +1109,27 @@ void EE::init() {
 void EE::draw(int sn, int x1, int y1) {
 	int x = x1 * _scale;
 	int y = y1 * _scale;
-	_back.transBlitFrom(_sp[sn], Common::Point(x, y), 0);
+
+	if (_back.format.bytesPerPixel == 2) {
+		for (int y_ = 0; y_ < _sp[sn].h; y_++) {
+			uint16 *src = (uint16 *)_sp[sn].getBasePtr(0, y_);
+			uint16 *dst = (uint16 *)_back.getBasePtr(x, y + y_);
+
+			for (int x_ = 0; x_ < _sp[sn].w; x_++, dst++, src++)
+				if (*src != 0)
+					*dst = *src;
+		}
+	} else {
+		for (int y_ = 0; y_ < _sp[sn].h; y_++) {
+			uint32 *src = (uint32 *)_sp[sn].getBasePtr(0, y_);
+			uint32 *dst = (uint32 *)_back.getBasePtr(x, y + y_);
+
+			for (int x_ = 0; x_ < _sp[sn].w; x_++, dst++, src++)
+				if (*src != 0 && *src != 0xff000000 && *src != 0xff)
+					*dst = *src;
+		}
+	}
+
 	g_system->copyRectToOverlay(_back.getBasePtr(x, y), _back.pitch, _windowX + x, _windowY + y, _sp[sn].w, _sp[sn].h);
 }
 
@@ -1196,16 +1217,6 @@ void EE::putshapes() {
 		if (_mode != kModeMenu)
 			break;
 	}
-
-	g_system->copyRectToOverlay(_back.getPixels(), _back.pitch, _windowX, _windowY, _windowW, 10 * _scale);
-
-	if (_mode == kModeMenu) {
-		int x = 92 * _scale;
-		int y = 20 * _scale;
-		int w = _sp[kSpCode1].w;
-		int h = _sp[kSpCode1].h * 5;
-		g_system->copyRectToOverlay(_back.getBasePtr(x, y), _back.pitch, _windowX + x, _windowY + y, w, h);
-	}
 }
 
 void EE::doMenu(Common::Event &e) {




More information about the Scummvm-git-logs mailing list