[Scummvm-git-logs] scummvm master -> 99f458dafa10e96c671159b74f9cefa9b795ee34

whiterandrek whiterandrek at gmail.com
Sat Jul 21 11:17:02 CEST 2018


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:
df63dea4b6 GRAPHICS: MACMENU: added partial unicode support
99f458dafa GRAPHICS: MACMENU: added menu parser from Win32 PE executable


Commit: df63dea4b66c61a00e3fca50dd355e4d313aa9b1
    https://github.com/scummvm/scummvm/commit/df63dea4b66c61a00e3fca50dd355e4d313aa9b1
Author: Andrei Prykhodko (whiterandrek at gmail.com)
Date: 2018-07-21T12:16:54+03:00

Commit Message:
GRAPHICS: MACMENU: added partial unicode support
It misses renderSubmenu impl and accelerator rendering

Changed paths:
    graphics/macgui/macmenu.cpp
    graphics/macgui/macmenu.h


diff --git a/graphics/macgui/macmenu.cpp b/graphics/macgui/macmenu.cpp
index 6eb9689..0228798 100644
--- a/graphics/macgui/macmenu.cpp
+++ b/graphics/macgui/macmenu.cpp
@@ -58,24 +58,30 @@ enum {
 
 struct MacMenuSubItem {
 	Common::String text;
+	Common::U32String unicodeText;
+	bool unicode;
 	int action;
 	int style;
 	char shortcut;
 	bool enabled;
 	Common::Rect bbox;
 
-	MacMenuSubItem(const char *t, int a, int s = 0, char sh = 0, bool e = true) : text(t), action(a), style(s), shortcut(sh), enabled(e) {}
+	MacMenuSubItem(const char *t, int a, int s = 0, char sh = 0, bool e = true) : text(t), unicode(false), action(a), style(s), shortcut(sh), enabled(e) {}
+	MacMenuSubItem(const Common::U32String &t, int a, int s = 0, char sh = 0, bool e = true) : unicodeText(t), unicode(true), action(a), style(s), shortcut(sh), enabled(e) {}
 };
 
 typedef Common::Array<MacMenuSubItem *> SubItemArray;
 
 struct MacMenuItem {
 	Common::String name;
+	Common::U32String unicodeName;
+	bool unicode;
 	SubItemArray subitems;
 	Common::Rect bbox;
 	Common::Rect subbbox;
 
-	MacMenuItem(const char *n) : name(n) {}
+	MacMenuItem(const char *n) : name(n), unicode(false) {}
+	MacMenuItem(const Common::U32String &n) : unicodeName(n), unicode(true) {}
 };
 
 MacMenu::MacMenu(int id, const Common::Rect &bounds, MacWindowManager *wm)
@@ -183,19 +189,32 @@ int MacMenu::addMenuItem(const char *name) {
 	return _items.size() - 1;
 }
 
+int MacMenu::addMenuItem(const Common::U32String &name) {
+	MacMenuItem *i = new MacMenuItem(name);
+	_items.push_back(i);
+
+	return _items.size() - 1;
+}
+
 void MacMenu::addMenuSubItem(int id, const char *text, int action, int style, char shortcut, bool enabled) {
 	_items[id]->subitems.push_back(new MacMenuSubItem(text, action, style, shortcut, enabled));
 
 	calcMenuBounds(_items[id]);
 }
 
+void MacMenu::addMenuSubItem(int id, const Common::U32String &text, int action, int style, char shortcut, bool enabled) {
+	_items[id]->subitems.push_back(new MacMenuSubItem(text, action, style, shortcut, enabled));
+
+	calcMenuBounds(_items[id]);
+}
+
 void MacMenu::calcDimensions() {
 	// Calculate menu dimensions
 	int y = 1;
 	int x = 18;
 
 	for (uint i = 0; i < _items.size(); i++) {
-		int w = _font->getStringWidth(_items[i]->name);
+		int w = _items[i]->unicode ? _font->getStringWidth(_items[i]->unicodeName) : _font->getStringWidth(_items[i]->name);
 
 		if (_items[i]->bbox.bottom == 0) {
 			_items[i]->bbox.left = x - kMenuLeftMargin;
@@ -319,6 +338,12 @@ int MacMenu::calculateMenuWidth(MacMenuItem *menu) {
 			if (width > maxWidth) {
 				maxWidth = width;
 			}
+		} else if (!item->unicodeText.empty()) {
+			// add accelerator
+			int width = _font->getStringWidth(item->unicodeText);
+			if (width > maxWidth) {
+				maxWidth = width;
+			}
 		}
 	}
 	return maxWidth;
@@ -389,7 +414,13 @@ bool MacMenu::draw(ManagedSurface *g, bool forceRedraw) {
 				renderSubmenu(it);
 		}
 
-		_font->drawString(&_screen, it->name, it->bbox.left + kMenuLeftMargin, it->bbox.top + (_wm->_fontMan->hasBuiltInFonts() ? 2 : 1), it->bbox.width(), color);
+		if (it->unicode) {
+			_font->drawString(&_screen, it->unicodeName, it->bbox.left + kMenuLeftMargin,
+							  it->bbox.top + (_wm->_fontMan->hasBuiltInFonts() ? 2 : 1), it->bbox.width(), color);
+		} else {
+			_font->drawString(&_screen, it->name, it->bbox.left + kMenuLeftMargin,
+							  it->bbox.top + (_wm->_fontMan->hasBuiltInFonts() ? 2 : 1), it->bbox.width(), color);
+		}
 	}
 
 	g->transBlitFrom(_screen, kColorGreen);
@@ -568,9 +599,15 @@ bool MacMenu::mouseRelease(int x, int y) {
 	if (_menuActivated) {
 		_menuActivated = false;
 
-		if (_activeItem != -1 && _activeSubItem != -1 && _items[_activeItem]->subitems[_activeSubItem]->enabled)
-			(*_ccallback)(_items[_activeItem]->subitems[_activeSubItem]->action,
-					_items[_activeItem]->subitems[_activeSubItem]->text, _cdata);
+		if (_activeItem != -1 && _activeSubItem != -1 && _items[_activeItem]->subitems[_activeSubItem]->enabled) {
+			if (_items[_activeItem]->subitems[_activeSubItem]->unicode) {
+				(*_unicodeccallback)(_items[_activeItem]->subitems[_activeSubItem]->action,
+							  _items[_activeItem]->subitems[_activeSubItem]->unicodeText, _cdata);
+			} else {
+				(*_ccallback)(_items[_activeItem]->subitems[_activeSubItem]->action,
+							  _items[_activeItem]->subitems[_activeSubItem]->text, _cdata);
+			}
+		}
 
 		_activeItem = -1;
 		_activeSubItem = -1;
@@ -590,7 +627,11 @@ bool MacMenu::processMenuShortCut(byte flags, uint16 ascii) {
 		for (uint i = 0; i < _items.size(); i++)
 			for (uint j = 0; j < _items[i]->subitems.size(); j++)
 				if (_items[i]->subitems[j]->enabled && tolower(_items[i]->subitems[j]->shortcut) == ascii) {
-					(*_ccallback)(_items[i]->subitems[j]->action, _items[i]->subitems[j]->text, _cdata);
+					if (_items[i]->subitems[j]->unicode) {
+						(*_unicodeccallback)(_items[i]->subitems[j]->action, _items[i]->subitems[j]->unicodeText, _cdata);
+					} else {
+						(*_ccallback)(_items[i]->subitems[j]->action, _items[i]->subitems[j]->text, _cdata);
+					}
 					return true;
 				}
 	}
@@ -609,18 +650,43 @@ void MacMenu::enableCommand(int menunum, int action, bool state) {
 void MacMenu::enableCommand(const char *menuitem, const char *menuaction, bool state) {
 	uint menunum = 0;
 
-	while (menunum < _items.size())
+	while (menunum < _items.size()) {
+		assert(!_items[menunum]->unicode);
 		if (_items[menunum]->name.equalsIgnoreCase(menuitem))
 			break;
 		else
 			menunum++;
-
+	}
 	if (menunum == _items.size())
 		return;
 
-	for (uint i = 0; i < _items[menunum]->subitems.size(); i++)
+	for (uint i = 0; i < _items[menunum]->subitems.size(); i++) {
+		assert(!_items[menunum]->subitems[i]->unicode);
 		if (_items[menunum]->subitems[i]->text.equalsIgnoreCase(menuaction))
 			_items[menunum]->subitems[i]->enabled = state;
+	}
+
+	_contentIsDirty = true;
+}
+
+void MacMenu::enableCommand(const Common::U32String &menuitem, const Common::U32String &menuaction, bool state) {
+	uint menunum = 0;
+
+	while (menunum < _items.size()) {
+		assert(_items[menunum]->unicode);
+		if (_items[menunum]->unicodeName.equals(menuitem))
+			break;
+		else
+			menunum++;
+	}
+	if (menunum == _items.size())
+		return;
+
+	for (uint i = 0; i < _items[menunum]->subitems.size(); i++) {
+		assert(_items[menunum]->subitems[i]->unicode);
+		if (_items[menunum]->subitems[i]->unicodeText.equals(menuaction))
+			_items[menunum]->subitems[i]->enabled = state;
+	}
 
 	_contentIsDirty = true;
 }
diff --git a/graphics/macgui/macmenu.h b/graphics/macgui/macmenu.h
index c98dd1f..b9d8e01 100644
--- a/graphics/macgui/macmenu.h
+++ b/graphics/macgui/macmenu.h
@@ -25,6 +25,10 @@
 
 #include "common/str-array.h"
 
+namespace Common {
+class U32String;
+}
+
 namespace Graphics {
 
 struct MacMenuItem;
@@ -46,12 +50,15 @@ public:
 	static Common::StringArray *readMenuFromResource(Common::SeekableReadStream *res);
 
 	void setCommandsCallback(void (*callback)(int, Common::String &, void *), void *data) { _ccallback = callback; _cdata = data; }
+	void setCommandsCallback(void (*callback)(int, Common::U32String &, void *), void *data) { _unicodeccallback = callback; _cdata = data; }
 
 	void addStaticMenus(const MacMenuData *data);
 	void calcDimensions();
 
 	int addMenuItem(const char *name);
+	int addMenuItem(const Common::U32String &name);
 	void addMenuSubItem(int id, const char *text, int action, int style = 0, char shortcut = 0, bool enabled = true);
+	void addMenuSubItem(int id, const Common::U32String &text, int action, int style = 0, char shortcut = 0, bool enabled = true);
 	void createSubMenuFromString(int id, const char *string, int commandId);
 	void clearSubMenu(int id);
 
@@ -60,6 +67,7 @@ public:
 
 	void enableCommand(int menunum, int action, bool state);
 	void enableCommand(const char *menuitem, const char *menuaction, bool state);
+	void enableCommand(const Common::U32String &menuitem, const Common::U32String &menuaction, bool state);
 	void disableAllMenus();
 
 	void setActive(bool active) { _menuActivated = active; }
@@ -99,6 +107,7 @@ private:
 	int _activeSubItem;
 
 	void (*_ccallback)(int action, Common::String &text, void *data);
+	void (*_unicodeccallback)(int action, Common::U32String &text, void *data);
 	void *_cdata;
 };
 


Commit: 99f458dafa10e96c671159b74f9cefa9b795ee34
    https://github.com/scummvm/scummvm/commit/99f458dafa10e96c671159b74f9cefa9b795ee34
Author: Andrei Prykhodko (whiterandrek at gmail.com)
Date: 2018-07-21T12:16:54+03:00

Commit Message:
GRAPHICS: MACMENU: added menu parser from Win32 PE executable

Changed paths:
    graphics/macgui/macmenu.cpp
    graphics/macgui/macmenu.h


diff --git a/graphics/macgui/macmenu.cpp b/graphics/macgui/macmenu.cpp
index 0228798..c52a421 100644
--- a/graphics/macgui/macmenu.cpp
+++ b/graphics/macgui/macmenu.cpp
@@ -56,6 +56,15 @@ enum {
 	kFontStyleExtended = 64
 };
 
+enum {
+	kGrayed = 1,
+	kInactive = 2,
+	kPopUp = 16,
+	kMenuBarBreak = 32,
+	kMenuBreak = 64,
+	kEndMenu = 128,
+};
+
 struct MacMenuSubItem {
 	Common::String text;
 	Common::U32String unicodeText;
@@ -162,6 +171,52 @@ Common::StringArray *MacMenu::readMenuFromResource(Common::SeekableReadStream *r
 	return result;
 }
 
+static Common::U32String readUnicodeString(Common::SeekableReadStream *stream) {
+	Common::Array<uint32> strData;
+	uint16 wchar;
+	while ((wchar = stream->readUint16LE()) != '\0') {
+		strData.push_back(wchar);
+	}
+	return strData.empty() ? Common::U32String() : Common::U32String(strData.data(), strData.size());
+}
+
+
+MacMenu *MacMenu::createMenuFromPEexe(Common::PEResources &exe, MacWindowManager *wm) {
+	Common::SeekableReadStream *menuData = exe.getResource(Common::kPEMenu, 128);
+	if (!menuData)
+		return nullptr;
+
+	menuData->readUint16LE(); // wVersion
+	menuData->readUint16LE(); // cbHeaderSize
+
+	MacMenu *menu = wm->addMenu();
+
+	int depth = 0;
+	int curMenuItemId = 0;
+	while (depth >= 0) {
+		uint16 flags = menuData->readUint16LE();
+		if (flags & kPopUp) {
+			if (depth == 0) {
+				menu->addMenuItem(readUnicodeString(menuData));
+			} else {
+				// TODO
+				// for now skip
+				readUnicodeString(menuData);
+			}
+			if (!(flags & kEndMenu)) {
+				depth++;
+			}
+		} else {
+			menuData->readUint16LE(); // menu id
+			menu->addMenuSubItem(curMenuItemId, readUnicodeString(menuData), 0);
+			if (flags & kEndMenu) {
+				depth--;
+			}
+		}
+	}
+	return menu;
+}
+
 void MacMenu::addStaticMenus(const MacMenuData *data) {
 	MacMenuItem *about = new MacMenuItem(_wm->_fontMan->hasBuiltInFonts() ? "\xa9" : "\xf0"); // (c) Symbol as the most resembling apple
 	_items.push_back(about);
diff --git a/graphics/macgui/macmenu.h b/graphics/macgui/macmenu.h
index b9d8e01..36cd06a 100644
--- a/graphics/macgui/macmenu.h
+++ b/graphics/macgui/macmenu.h
@@ -24,6 +24,7 @@
 #define GRAPHICS_MACGUI_MACMENU_H
 
 #include "common/str-array.h"
+#include "common/winexe_pe.h"
 
 namespace Common {
 class U32String;
@@ -48,6 +49,7 @@ public:
 	~MacMenu();
 
 	static Common::StringArray *readMenuFromResource(Common::SeekableReadStream *res);
+	static MacMenu *createMenuFromPEexe(Common::PEResources &exe, MacWindowManager *wm);
 
 	void setCommandsCallback(void (*callback)(int, Common::String &, void *), void *data) { _ccallback = callback; _cdata = data; }
 	void setCommandsCallback(void (*callback)(int, Common::U32String &, void *), void *data) { _unicodeccallback = callback; _cdata = data; }





More information about the Scummvm-git-logs mailing list